- LA7VIN4 ;DALOI/JMC - Process Incoming UI Msgs, continued ;Jun 14, 2022@18:38
- ;;5.2;AUTOMATED LAB INSTRUMENTS;**46,64,67,66,74,85,88,101**;Sep 27, 1994;Build 6
- ;
- ; This routine is a continuation of LA7VIN1 and is only called from there.
- ;
- ; ZEXCEPT is used to identify variables which are external to a specific TAG
- ; used in conjunction with Eclipse M-editor.
- ;
- Q
- ;
- OBR ; Process OBR segments
- N I,LA7CUP,LA7ENTRY,LA7FF1,LA7FF2,LA7I,LA7IDE,LA7INST,LA7OK,LA7PDUZ,LA7PF1,LA7PF2,LA7TRAY,LA7X,LA7Y
- ;
- ;ZEXCEPT: A,CH,CY,EM,G,LA70070,LA761,LA762,LA7624,LA76248,LA76249
- ;ZEXCEPT: LA7AA,LA7ACC,LA7AD,LA7AERR,LA7AN,LA7ARI,LA7AUTORELEASE,LA7CDT,LA7CS,LA7ECH,LA7ERR,LA7FID,LA7FS,LA7ID,LA7INTYP,LA7ISQN,LA7LWL,LA7MSATM,LA7MTYP
- ;ZEXCEPT: LA7OBR,LA7OBR25,LA7OBR26,LA7OBR29,LA7OBR32,LA7OBR33,LA7OBR34,LA7OBR49,LA7OCR,LA7ONLT,LA7OTYPE,LA7POP,LA7PRI,LA7QUIT
- ;ZEXCEPT: LA7RSDT,LA7SAC,LA7SAP,LA7SEG,LA7SFAC,LA7SID,LA7SM,LA7SOBR,LA7SPEC,LA7SPTY,LA7SS,LA7TECH,LA7UID,LAPSUBID,MI,N,SP
- ;
- ; OBR Set ID
- S LA7SOBR=$$P^LA7VHLU(.LA7SEG,2,LA7FS)
- ;
- S LA7X=$$P^LA7VHLU(.LA7SEG,19,LA7FS)
- S LA7X=$$UNESC^LA7VHLU3(LA7X,LA7FS_LA7ECH)
- S LA7624=0,LA7INST=$P(LA7X,"^") ; extracting 1st piece
- ; Look up #62.4 entry from instrument name.
- I LA7INST'="" S LA7624=+$O(^LAB(62.4,"B",LA7INST,0))
- ;
- ; If none then use sending application name to look up #62.4 entry.
- I 'LA7624 S LA7624=+$O(^LAB(62.4,"B",LA7SAP,0))
- ;
- ; Instrument name not found in xref
- I 'LA7624 D Q
- . I LA7INST="" D Q
- . . S LA7ERR=10,LA7QUIT=2
- . . D CREATE^LA7LOG(LA7ERR)
- . S LA7ERR=11,LA7QUIT=2
- . S LA7AERR=$$CREATE^LA7LOG(LA7ERR,1)
- S LA7624(0)=$G(^LAB(62.4,LA7624,0))
- S LA7ID=$P(LA7624(0),"^")_"-I-"
- ;
- S LA7LWL=+$P(LA7624(0),"^",4) ; Load/Work List
- S LA7ENTRY=$P(LA7624(0),"^",6) ;LOG,LLIST,IDENT or SEQN
- S:LA7ENTRY="" LA7ENTRY="LOG"
- ;
- ; Placer(sender)/filler order numbers
- S LA7X=$$P^LA7VHLU(.LA7SEG,3,LA7FS)
- S LA7SID=$P(LA7X,$E(LA7ECH)) F I=2:1:4 S LA7SID(I)=$P(LA7X,$E(LA7ECH),I)
- S LA7X=$$P^LA7VHLU(.LA7SEG,4,LA7FS)
- S LA7FID=$P(LA7X,$E(LA7ECH)) F I=2:1:4 S LA7FID(I)=$P(LA7X,$E(LA7ECH),I)
- ;
- ; Test order code - find order NLT code
- ; If POC interface then see if NLT is used for ordering code
- S LA7X=$$P^LA7VHLU(.LA7SEG,5,LA7FS),LA7ONLT=""
- F I=1,4 D Q:LA7ONLT'=""
- . I $P(LA7X,LA7CS,I)'?5N1"."4N Q
- . I $P(LA7X,LA7CS,I+2)="99VA64" S LA7ONLT=$P(LA7X,LA7CS,I),LA7ONLT(0)=$P(LA7X,LA7CS,I+1) Q
- . I LA7INTYP>19,LA7INTYP<30,$P(LA7X,LA7CS,I+2)="" S LA7ONLT=$P(LA7X,LA7CS,I),LA7ONLT(0)=$P(LA7X,LA7CS,I+1) Q
- ;
- ; Specimen collection date/time
- S LA7CDT=$$HL7TFM^XLFDT($P($$P^LA7VHLU(.LA7SEG,8,LA7FS),LA7CS),"L")
- ;
- ; Extract filler fields #1&2 and placer fields #1&2
- F LA7I=18:1:21 D
- . S LA7X=$$P^LA7VHLU(.LA7SEG,LA7I+1,LA7FS)
- . S LA7OBR(LA7I)=$$UNESC^LA7VHLU3(LA7X,LA7FS_LA7ECH)
- ;
- ; Pull info from placer field #2 (OBR-19)
- S LA7X=LA7OBR(19)
- S LA7TRAY=+$P(LA7X,"^",1) ;Tray
- S LA7CUP=+$P(LA7X,"^",2) ; Cup
- ; If POC interface set cup to file #62.49 ien
- I LA7INTYP>19,LA7INTYP<30 S LA7CUP=LA76249
- S LA7AA=$P(LA7X,"^",3) ; Accession Area
- S LA7AD=$P(LA7X,"^",4) ; Accession Date
- S LA7AN=$P(LA7X,"^",5) ; Accession Entry
- S LA7ACC=$P(LA7X,"^",6) ; Accession
- I LA7ACC'="" D SETID^LA7VHLU1(LA76249,LA7ID,LA7ACC,0)
- S LA7UID=$P(LA7X,"^",7) ; Unique ID
- I $L(LA7UID)<10 S LA7UID=""
- ;
- ; Sequence Number
- ; If point of care interface (20-29) then use file #62.49 ien as IDE
- S LA7IDE=$P(LA7X,LA7CS,8)
- I LA7INTYP>19,LA7INTYP<30 S LA7IDE=LA76249
- ;
- ; UID might come as Sample ID
- I LA7UID="",$L(LA7SID)>9 S LA7UID=LA7SID
- ;
- ; Try to figure out LA7AA LA7AD LA7AN by using the unique ID (UID)
- ; accession may have rolled over, use UID to get current accession info.
- I LA7UID'="" D
- . N X
- . S X=$Q(^LRO(68,"C",LA7UID)) Q:X="" ; UID not on file
- . I $QS(X,3)'=LA7UID S LA7UID="" Q ; UID not on file.
- . S LA7AA=+$QS(X,4),LA7AD=+$QS(X,5),LA7AN=+$QS(X,6)
- . D SETID^LA7VHLU1(LA76249,LA7ID,LA7UID,1)
- . D SETID^LA7VHLU1(LA76249,"",LA7UID,0)
- ;
- ; If still not known, compute from default accession date and area.
- ; Calculate accession date based on accession transform.
- I LA7AA<1!(LA7AD<1)!(LA7AN<1) D
- . N X
- . S LA7AA=+$P(LA7624(0),"^",11)
- . S X=$P($G(^LRO(68,LA7AA,0)),U,3)
- . S LA7AD=$S(X="D":DT,X="M":$E(DT,1,5)_"00",X="Y":$E(DT,1,3)_"0000",X="Q":$E(DT,1,3)_"0000"+(($E(DT,4,5)-1)\3*300+100),1:DT)
- . S LA7AN=+LA7SID
- . I LA7AN>0 D SETID^LA7VHLU1(LA76249,LA7ID,LA7AN,1)
- . I LA7SID'="" D SETID^LA7VHLU1(LA76249,LA7ID,LA7SID,0)
- ;
- ; Zeroth node of accession area.
- S LA7AA(0)=$G(^LRO(68,+LA7AA,0))
- ; Accession's subscript
- S LA7SS=$P(LA7AA(0),"^",2)
- ;
- ; Specimen action code
- S LA7SAC=$$P^LA7VHLU(.LA7SEG,12,LA7FS)
- ;
- ; Specimen(topography), collection sample, HL7 specimen source
- S (LA761,LA762,LA70070,LA7SPEC)=""
- S LA7X=$$P^LA7VHLU(.LA7SEG,16,LA7FS)
- D FLD2ARR^LA7VHLU7(.LA7X,LA7FS_LA7ECH)
- M LA7SPTY=LA7X(1)
- ;
- ; Look for HL7 Table 0070 code.
- ; If coding system blank then default to table 0070 as coding system per HL7 standard for OBR-15.
- ; If no code and not a standard code set then ignore (remove).
- F I=1,4 D
- . I $G(LA7SPTY(I))="",$G(LA7SPTY(I+2))'?1(1"99".E,1"L") K LA7SPTY(I),LA7SPTY(I+1),LA7SPTY(I+2),LA7SPTY($S(I=1:7,1:8)) Q
- . I $G(LA7SPTY(I+2))="" S LA7SPTY(I+2)="HL70070"
- . I LA7SPTY(I+2)="HL70070" S LA7SPEC=LA7SPTY(I)
- I LA7SPEC="" S LA7SPEC=$G(LA7SPTY)
- ;
- ; Retrieve related specimen/collection sample from accession
- ; Create specimen array to handle multiple AP specimens on orders.
- S I=0
- F S I=$O(^LRO(68,LA7AA,1,LA7AD,1,LA7AN,5,I)) Q:'I D
- . S X=^LRO(68,LA7AA,1,LA7AD,1,LA7AN,5,I,0)
- . I $P(X,"^") D
- . . S LA761($P(X,"^"))="" ;spec array
- . . I LA761="" S LA761=$P(X,"^")
- . I $P(X,"^",2) D
- . . S LA762($P(X,"^",2))="" ;sample array
- . . I LA762="" S LA762=$P(X,"^",2)
- ;
- ; Log error when specimen source does not match accession's specimen
- ; Ignore if specimen related to lab control file #62.3
- S LA7OK=1
- I $P($G(^LRO(68,LA7AA,1,LA7AD,1,LA7AN,0)),"^",2)'=62.3 D
- . N DIERR,LA7MSG
- . F LA7I=1,4 I $G(LA7SPTY(LA7I))'="" D Q:'LA7OK
- . . I $G(LA7SPTY(LA7I+2))="HL70070" D Q
- . . . K DIERR,LA7MSG
- . . . S LA70070=$$GET1^DIQ(61,LA761_",","LEDI HL7:HL7 ABBR",,,"LA7MSG")
- . . . I LA70070'="",LA70070'=LA7SPTY(LA7I) S LA7OK=0,LA7OK(0)="HL7 "_LA7SPTY(LA7I)
- . . I $G(LA7SPTY(LA7I+2))="SCT" D OBRSCT Q
- ;
- I 'LA7OK D
- . N LA7MSG
- . S LA7ERR=49,LA7QUIT=2,LA7MSG=LA7OK(0)
- . S LA7AERR=$$CREATE^LA7LOG(LA7ERR,1)
- ;
- ; Don't continue if flag set to skip this segment
- I LA7QUIT Q
- ;
- ; Placer's ordering provider (id^duz^last name, first name, mi [id])
- I $G(LA7POP)="" D
- . S LA7POP="",LA7X=$$P^LA7VHLU(.LA7SEG,17,LA7FS)
- . I LA7X="" Q
- . S LA7POP=$$XCNTFM^LA7VHLU9(LA7X,LA7ECH)
- . I LA7POP="^^" S LA7POP=""
- ;
- ; Results rpt/status chng - date/time
- S LA7X=$$P^LA7VHLU(.LA7SEG,23,LA7FS),LA7RSDT=""
- I LA7X'="" S LA7RSDT=$$HL7TFM^XLFDT(LA7X,"L")
- ;
- ; Result status
- S LA7OBR25=$$P^LA7VHLU(.LA7SEG,26,LA7FS)
- ;
- ; Parent result - CM data type.
- ; Save OBX-4 (sub-id) of parent result in LAPSUBID for subsequent usage by OBX/NTE's.
- S LA7OBR26=$$FIELD^LA7VHLU7(26)
- D FLD2ARR^LA7VHLU7(.LA7OBR26)
- S LAPSUBID=$G(LA7OBR26(2))
- ;
- ; Parent
- S LA7OBR29=$$FIELD^LA7VHLU7(29)
- D FLD2ARR^LA7VHLU7(.LA7OBR29)
- ;
- ; Principle Result interpreter
- S LA7OBR32=$$FIELD^LA7VHLU7(32),LA7PRI=""
- D FLD2ARR^LA7VHLU7(.LA7OBR32)
- I $G(LA7OBR32(1))'="" D
- . S LA7X=$TR(LA7OBR32(1),$E(LA7ECH,4),$E(LA7ECH))
- . S LA7PRI=$$XCNTFM^LA7VHLU9(LA7X,LA7ECH)
- . I LA7PRI="^^" S LA7PRI=""
- ;
- ; Assistant Result Interpreter
- S LA7OBR33=$$FIELD^LA7VHLU7(33),LA7ARI=""
- D FLD2ARR^LA7VHLU7(.LA7OBR33)
- I $G(LA7OBR33(1))'="" D
- . S LA7X=$TR(LA7OBR33(1),$E(LA7ECH,4),$E(LA7ECH))
- . S LA7ARI=$$XCNTFM^LA7VHLU9(LA7X,LA7ECH)
- . I LA7ARI="^^" S LA7ARI=""
- ;
- ; Technician
- S LA7OBR34=$$FIELD^LA7VHLU7(34),LA7TECH=""
- D FLD2ARR^LA7VHLU7(.LA7OBR34)
- I $G(LA7OBR34(1))'="" D
- . S LA7X=$TR(LA7OBR34(1),$E(LA7ECH,4),$E(LA7ECH))
- . S LA7TECH=$$XCNTFM^LA7VHLU9(LA7X,LA7ECH)
- . I LA7TECH="^^" S LA7TECH=""
- ;
- ; Results handling
- ; Usually IS data type however later HL7 versions use CWE data type. Attempt to handle either format.
- S LA7X=$$P^LA7VHLU(.LA7SEG,50,LA7FS)
- S LA7OBR49=$P(LA7X,LA7CS,1)
- ;
- ; Set Auto Release flag at OBR level for comments (NTE segments) before processing OBX segment, use "-.0000" in lieu of OBX.17 suffix value
- I LA7MTYP="ORU" S LA7AUTORELEASE=$$ARSTATUS^LA7VIN5(LA7OBR49,"-.0000",LA7624)
- ;
- ; Create entry in LAH for supported subscripts.
- I LA7MTYP="ORR",$G(LA7OTYPE)'="OK",LA7SS?1(1"CH",1"MI",1"SP",1"CY",1"EM") D
- . D LAGEN^LA7VIN4A
- . I $G(LA7ISQN)="" D CREATE^LA7LOG(14) Q
- . S LA7I=$O(^TMP("LA7 ORDER STATUS",$J,""),-1),LA7I=LA7I+1
- . I LA7ONLT="" S X=$$P^LA7VHLU(.LA7SEG,5,LA7FS),LA7X=$P(X,LA7CS),LA7X(0)=$P(X,LA7CS,2)
- . E S LA7X=LA7ONLT,LA7X(0)=LA7ONLT(0)
- . S X=LA7LWL_"^"_LA7ISQN_"^"_LA7X_"^"_LA7X(0)_"^"_LA76248_"^"_LA76249_"^"_LA7OTYPE_"^^"_$P($G(LA7SM),"^",2)
- . S ^TMP("LA7 ORDER STATUS",$J,LA7I)=X
- . I $G(LA7OCR)'="" S ^TMP("LA7 ORDER STATUS",$J,LA7I,"OCR")=$TR(LA7OCR,LA7CS,"^")
- . I $G(LA7MSATM)'="" S ^TMP("LA7 ORDER STATUS",$J,LA7I,"MSA")=LA7MSATM
- ;
- I LA7MTYP="ORU",LA7SS?1(1"CH",1"MI",1"SP",1"CY",1"EM") D
- . D LAGEN^LA7VIN4A
- . I $G(LA7ISQN)<1 S LA7ERR=14,LA7AERR=$$CREATE^LA7LOG(LA7ERR,1) Q
- . I LA7INTYP=10,LA7SAC?1(1"A",1"G") D
- . . S LA7I=$O(^TMP("LA7 ORDER STATUS",$J,""),-1),LA7I=LA7I+1,LA7SAC(0)=LA7I
- . . I LA7ONLT="" S X=$$P^LA7VHLU(.LA7SEG,5,LA7FS),LA7X=$P(X,LA7CS),LA7X(0)=$P(X,LA7CS,2)
- . . E S LA7X=LA7ONLT,LA7X(0)=LA7ONLT(0)
- . . S X=LA7LWL_"^"_LA7ISQN_"^"_LA7X_"^"_LA7X(0)_"^"_LA76248_"^"_LA76249_"^"_$G(LA7OTYPE)_"^"_LA7SAC_"^"_$P($G(LA7SM),"^",2)
- . . S ^TMP("LA7 ORDER STATUS",$J,LA7I)=X
- . I LA7INTYP=10,LA7OBR25?1(1"A",1"X") D
- . . S LA7I=$O(^TMP("LA7 ORDER STATUS",$J,""),-1),LA7I=LA7I+1
- . . I LA7ONLT="" S X=$$P^LA7VHLU(.LA7SEG,5,LA7FS),LA7X=$P(X,LA7CS),LA7X(0)=$P(X,LA7CS,2)
- . . E S LA7X=LA7ONLT,LA7X(0)=LA7ONLT(0)
- . . S X=LA7LWL_"^"_LA7ISQN_"^"_LA7X_"^"_LA7X(0)_"^"_LA76248_"^"_LA76249_"^"_$G(LA7OTYPE)_"^"_LA7SAC_"^"_$P($G(LA7SM),"^",2)_"^"_LA7OBR25
- . . S ^TMP("LA7 ORDER STATUS",$J,LA7I)=X
- . I LA7INTYP=10,LA7SS?1(1"MI",1"SP",1"CY",1"EM") S ^TMP("LA7-PL-NTE",$J,LA7LWL,LA7ISQN,LA7SS)=LA7SFAC
- ;
- ;LA*5.2*101: Do not require that LA7SM (shipping manifest identifier) not be null
- I LA7INTYP=10,$G(LA7UID)'="" D SMUPDT^LA7VIN4A
- Q
- ;
- ;
- OBRSCT ; check if SCT doesn't match any specimen in #68
- ;
- ;ZEXCEPT: LA761,LA76248,LA7I,LA7OK,LA7SPTY
- ;
- N LA761SCT,R61,SCTOK
- S (R61,SCTOK)=0
- F S R61=$O(LA761(R61)) Q:'R61 D
- . I $D(^LAHM(62.48,LA76248,"SCT","AD1",LA7SPTY(LA7I),R61_";LAB(61,")) S SCTOK=1 Q
- . S LA761SCT=$$IEN2SCT^LA7VHLU6(61,R61,DT,"")
- . I LA761SCT'>0 S SCTOK=1
- . I $P(LA761SCT,"^")=LA7SPTY(LA7I) S SCTOK=1
- ;
- ; If no topography found on accession with a SCT mapping that matches SCT code then flag as error.
- ; Also if SCT code in message has Lexicon exception then record as a separate error.
- I 'SCTOK D
- . N LA7SCT,LA7X,LA7Z
- . S LA7OK=0,LA7OK(0)="SCTID "_LA7SPTY(LA7I)
- . S LA7Z=$$CODE^LEXTRAN(LA7SPTY(LA7I),"SCT",DT,"LA7SCT")
- . I $P(LA7Z,"^",5) D
- . . S LA7X=$P(LA7Z,"^",6)
- . . D CREATE^LA7LOG(37)
- ;
- Q
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HLA7VIN4 11284 printed Feb 18, 2025@23:06:48 Page 2
- LA7VIN4 ;DALOI/JMC - Process Incoming UI Msgs, continued ;Jun 14, 2022@18:38
- +1 ;;5.2;AUTOMATED LAB INSTRUMENTS;**46,64,67,66,74,85,88,101**;Sep 27, 1994;Build 6
- +2 ;
- +3 ; This routine is a continuation of LA7VIN1 and is only called from there.
- +4 ;
- +5 ; ZEXCEPT is used to identify variables which are external to a specific TAG
- +6 ; used in conjunction with Eclipse M-editor.
- +7 ;
- +8 QUIT
- +9 ;
- OBR ; Process OBR segments
- +1 NEW I,LA7CUP,LA7ENTRY,LA7FF1,LA7FF2,LA7I,LA7IDE,LA7INST,LA7OK,LA7PDUZ,LA7PF1,LA7PF2,LA7TRAY,LA7X,LA7Y
- +2 ;
- +3 ;ZEXCEPT: A,CH,CY,EM,G,LA70070,LA761,LA762,LA7624,LA76248,LA76249
- +4 ;ZEXCEPT: LA7AA,LA7ACC,LA7AD,LA7AERR,LA7AN,LA7ARI,LA7AUTORELEASE,LA7CDT,LA7CS,LA7ECH,LA7ERR,LA7FID,LA7FS,LA7ID,LA7INTYP,LA7ISQN,LA7LWL,LA7MSATM,LA7MTYP
- +5 ;ZEXCEPT: LA7OBR,LA7OBR25,LA7OBR26,LA7OBR29,LA7OBR32,LA7OBR33,LA7OBR34,LA7OBR49,LA7OCR,LA7ONLT,LA7OTYPE,LA7POP,LA7PRI,LA7QUIT
- +6 ;ZEXCEPT: LA7RSDT,LA7SAC,LA7SAP,LA7SEG,LA7SFAC,LA7SID,LA7SM,LA7SOBR,LA7SPEC,LA7SPTY,LA7SS,LA7TECH,LA7UID,LAPSUBID,MI,N,SP
- +7 ;
- +8 ; OBR Set ID
- +9 SET LA7SOBR=$$P^LA7VHLU(.LA7SEG,2,LA7FS)
- +10 ;
- +11 SET LA7X=$$P^LA7VHLU(.LA7SEG,19,LA7FS)
- +12 SET LA7X=$$UNESC^LA7VHLU3(LA7X,LA7FS_LA7ECH)
- +13 ; extracting 1st piece
- SET LA7624=0
- SET LA7INST=$PIECE(LA7X,"^")
- +14 ; Look up #62.4 entry from instrument name.
- +15 IF LA7INST'=""
- SET LA7624=+$ORDER(^LAB(62.4,"B",LA7INST,0))
- +16 ;
- +17 ; If none then use sending application name to look up #62.4 entry.
- +18 IF 'LA7624
- SET LA7624=+$ORDER(^LAB(62.4,"B",LA7SAP,0))
- +19 ;
- +20 ; Instrument name not found in xref
- +21 IF 'LA7624
- Begin DoDot:1
- +22 IF LA7INST=""
- Begin DoDot:2
- +23 SET LA7ERR=10
- SET LA7QUIT=2
- +24 DO CREATE^LA7LOG(LA7ERR)
- End DoDot:2
- QUIT
- +25 SET LA7ERR=11
- SET LA7QUIT=2
- +26 SET LA7AERR=$$CREATE^LA7LOG(LA7ERR,1)
- End DoDot:1
- QUIT
- +27 SET LA7624(0)=$GET(^LAB(62.4,LA7624,0))
- +28 SET LA7ID=$PIECE(LA7624(0),"^")_"-I-"
- +29 ;
- +30 ; Load/Work List
- SET LA7LWL=+$PIECE(LA7624(0),"^",4)
- +31 ;LOG,LLIST,IDENT or SEQN
- SET LA7ENTRY=$PIECE(LA7624(0),"^",6)
- +32 if LA7ENTRY=""
- SET LA7ENTRY="LOG"
- +33 ;
- +34 ; Placer(sender)/filler order numbers
- +35 SET LA7X=$$P^LA7VHLU(.LA7SEG,3,LA7FS)
- +36 SET LA7SID=$PIECE(LA7X,$EXTRACT(LA7ECH))
- FOR I=2:1:4
- SET LA7SID(I)=$PIECE(LA7X,$EXTRACT(LA7ECH),I)
- +37 SET LA7X=$$P^LA7VHLU(.LA7SEG,4,LA7FS)
- +38 SET LA7FID=$PIECE(LA7X,$EXTRACT(LA7ECH))
- FOR I=2:1:4
- SET LA7FID(I)=$PIECE(LA7X,$EXTRACT(LA7ECH),I)
- +39 ;
- +40 ; Test order code - find order NLT code
- +41 ; If POC interface then see if NLT is used for ordering code
- +42 SET LA7X=$$P^LA7VHLU(.LA7SEG,5,LA7FS)
- SET LA7ONLT=""
- +43 FOR I=1,4
- Begin DoDot:1
- +44 IF $PIECE(LA7X,LA7CS,I)'?5N1"."4N
- QUIT
- +45 IF $PIECE(LA7X,LA7CS,I+2)="99VA64"
- SET LA7ONLT=$PIECE(LA7X,LA7CS,I)
- SET LA7ONLT(0)=$PIECE(LA7X,LA7CS,I+1)
- QUIT
- +46 IF LA7INTYP>19
- IF LA7INTYP<30
- IF $PIECE(LA7X,LA7CS,I+2)=""
- SET LA7ONLT=$PIECE(LA7X,LA7CS,I)
- SET LA7ONLT(0)=$PIECE(LA7X,LA7CS,I+1)
- QUIT
- End DoDot:1
- if LA7ONLT'=""
- QUIT
- +47 ;
- +48 ; Specimen collection date/time
- +49 SET LA7CDT=$$HL7TFM^XLFDT($PIECE($$P^LA7VHLU(.LA7SEG,8,LA7FS),LA7CS),"L")
- +50 ;
- +51 ; Extract filler fields #1&2 and placer fields #1&2
- +52 FOR LA7I=18:1:21
- Begin DoDot:1
- +53 SET LA7X=$$P^LA7VHLU(.LA7SEG,LA7I+1,LA7FS)
- +54 SET LA7OBR(LA7I)=$$UNESC^LA7VHLU3(LA7X,LA7FS_LA7ECH)
- End DoDot:1
- +55 ;
- +56 ; Pull info from placer field #2 (OBR-19)
- +57 SET LA7X=LA7OBR(19)
- +58 ;Tray
- SET LA7TRAY=+$PIECE(LA7X,"^",1)
- +59 ; Cup
- SET LA7CUP=+$PIECE(LA7X,"^",2)
- +60 ; If POC interface set cup to file #62.49 ien
- +61 IF LA7INTYP>19
- IF LA7INTYP<30
- SET LA7CUP=LA76249
- +62 ; Accession Area
- SET LA7AA=$PIECE(LA7X,"^",3)
- +63 ; Accession Date
- SET LA7AD=$PIECE(LA7X,"^",4)
- +64 ; Accession Entry
- SET LA7AN=$PIECE(LA7X,"^",5)
- +65 ; Accession
- SET LA7ACC=$PIECE(LA7X,"^",6)
- +66 IF LA7ACC'=""
- DO SETID^LA7VHLU1(LA76249,LA7ID,LA7ACC,0)
- +67 ; Unique ID
- SET LA7UID=$PIECE(LA7X,"^",7)
- +68 IF $LENGTH(LA7UID)<10
- SET LA7UID=""
- +69 ;
- +70 ; Sequence Number
- +71 ; If point of care interface (20-29) then use file #62.49 ien as IDE
- +72 SET LA7IDE=$PIECE(LA7X,LA7CS,8)
- +73 IF LA7INTYP>19
- IF LA7INTYP<30
- SET LA7IDE=LA76249
- +74 ;
- +75 ; UID might come as Sample ID
- +76 IF LA7UID=""
- IF $LENGTH(LA7SID)>9
- SET LA7UID=LA7SID
- +77 ;
- +78 ; Try to figure out LA7AA LA7AD LA7AN by using the unique ID (UID)
- +79 ; accession may have rolled over, use UID to get current accession info.
- +80 IF LA7UID'=""
- Begin DoDot:1
- +81 NEW X
- +82 ; UID not on file
- SET X=$QUERY(^LRO(68,"C",LA7UID))
- if X=""
- QUIT
- +83 ; UID not on file.
- IF $QSUBSCRIPT(X,3)'=LA7UID
- SET LA7UID=""
- QUIT
- +84 SET LA7AA=+$QSUBSCRIPT(X,4)
- SET LA7AD=+$QSUBSCRIPT(X,5)
- SET LA7AN=+$QSUBSCRIPT(X,6)
- +85 DO SETID^LA7VHLU1(LA76249,LA7ID,LA7UID,1)
- +86 DO SETID^LA7VHLU1(LA76249,"",LA7UID,0)
- End DoDot:1
- +87 ;
- +88 ; If still not known, compute from default accession date and area.
- +89 ; Calculate accession date based on accession transform.
- +90 IF LA7AA<1!(LA7AD<1)!(LA7AN<1)
- Begin DoDot:1
- +91 NEW X
- +92 SET LA7AA=+$PIECE(LA7624(0),"^",11)
- +93 SET X=$PIECE($GET(^LRO(68,LA7AA,0)),U,3)
- +94 SET LA7AD=$SELECT(X="D":DT,X="M":$EXTRACT(DT,1,5)_"00",X="Y":$EXTRACT(DT,1,3)_"0000",X="Q":$EXTRACT(DT,1,3)_"0000"+(($EXTRACT(DT,4,5)-1)\3*300+100),1:DT)
- +95 SET LA7AN=+LA7SID
- +96 IF LA7AN>0
- DO SETID^LA7VHLU1(LA76249,LA7ID,LA7AN,1)
- +97 IF LA7SID'=""
- DO SETID^LA7VHLU1(LA76249,LA7ID,LA7SID,0)
- End DoDot:1
- +98 ;
- +99 ; Zeroth node of accession area.
- +100 SET LA7AA(0)=$GET(^LRO(68,+LA7AA,0))
- +101 ; Accession's subscript
- +102 SET LA7SS=$PIECE(LA7AA(0),"^",2)
- +103 ;
- +104 ; Specimen action code
- +105 SET LA7SAC=$$P^LA7VHLU(.LA7SEG,12,LA7FS)
- +106 ;
- +107 ; Specimen(topography), collection sample, HL7 specimen source
- +108 SET (LA761,LA762,LA70070,LA7SPEC)=""
- +109 SET LA7X=$$P^LA7VHLU(.LA7SEG,16,LA7FS)
- +110 DO FLD2ARR^LA7VHLU7(.LA7X,LA7FS_LA7ECH)
- +111 MERGE LA7SPTY=LA7X(1)
- +112 ;
- +113 ; Look for HL7 Table 0070 code.
- +114 ; If coding system blank then default to table 0070 as coding system per HL7 standard for OBR-15.
- +115 ; If no code and not a standard code set then ignore (remove).
- +116 FOR I=1,4
- Begin DoDot:1
- +117 IF $GET(LA7SPTY(I))=""
- IF $GET(LA7SPTY(I+2))'?1(1"99".E,1"L")
- KILL LA7SPTY(I),LA7SPTY(I+1),LA7SPTY(I+2),LA7SPTY($SELECT(I=1:7,1:8))
- QUIT
- +118 IF $GET(LA7SPTY(I+2))=""
- SET LA7SPTY(I+2)="HL70070"
- +119 IF LA7SPTY(I+2)="HL70070"
- SET LA7SPEC=LA7SPTY(I)
- End DoDot:1
- +120 IF LA7SPEC=""
- SET LA7SPEC=$GET(LA7SPTY)
- +121 ;
- +122 ; Retrieve related specimen/collection sample from accession
- +123 ; Create specimen array to handle multiple AP specimens on orders.
- +124 SET I=0
- +125 FOR
- SET I=$ORDER(^LRO(68,LA7AA,1,LA7AD,1,LA7AN,5,I))
- if 'I
- QUIT
- Begin DoDot:1
- +126 SET X=^LRO(68,LA7AA,1,LA7AD,1,LA7AN,5,I,0)
- +127 IF $PIECE(X,"^")
- Begin DoDot:2
- +128 ;spec array
- SET LA761($PIECE(X,"^"))=""
- +129 IF LA761=""
- SET LA761=$PIECE(X,"^")
- End DoDot:2
- +130 IF $PIECE(X,"^",2)
- Begin DoDot:2
- +131 ;sample array
- SET LA762($PIECE(X,"^",2))=""
- +132 IF LA762=""
- SET LA762=$PIECE(X,"^",2)
- End DoDot:2
- End DoDot:1
- +133 ;
- +134 ; Log error when specimen source does not match accession's specimen
- +135 ; Ignore if specimen related to lab control file #62.3
- +136 SET LA7OK=1
- +137 IF $PIECE($GET(^LRO(68,LA7AA,1,LA7AD,1,LA7AN,0)),"^",2)'=62.3
- Begin DoDot:1
- +138 NEW DIERR,LA7MSG
- +139 FOR LA7I=1,4
- IF $GET(LA7SPTY(LA7I))'=""
- Begin DoDot:2
- +140 IF $GET(LA7SPTY(LA7I+2))="HL70070"
- Begin DoDot:3
- +141 KILL DIERR,LA7MSG
- +142 SET LA70070=$$GET1^DIQ(61,LA761_",","LEDI HL7:HL7 ABBR",,,"LA7MSG")
- +143 IF LA70070'=""
- IF LA70070'=LA7SPTY(LA7I)
- SET LA7OK=0
- SET LA7OK(0)="HL7 "_LA7SPTY(LA7I)
- End DoDot:3
- QUIT
- +144 IF $GET(LA7SPTY(LA7I+2))="SCT"
- DO OBRSCT
- QUIT
- End DoDot:2
- if 'LA7OK
- QUIT
- End DoDot:1
- +145 ;
- +146 IF 'LA7OK
- Begin DoDot:1
- +147 NEW LA7MSG
- +148 SET LA7ERR=49
- SET LA7QUIT=2
- SET LA7MSG=LA7OK(0)
- +149 SET LA7AERR=$$CREATE^LA7LOG(LA7ERR,1)
- End DoDot:1
- +150 ;
- +151 ; Don't continue if flag set to skip this segment
- +152 IF LA7QUIT
- QUIT
- +153 ;
- +154 ; Placer's ordering provider (id^duz^last name, first name, mi [id])
- +155 IF $GET(LA7POP)=""
- Begin DoDot:1
- +156 SET LA7POP=""
- SET LA7X=$$P^LA7VHLU(.LA7SEG,17,LA7FS)
- +157 IF LA7X=""
- QUIT
- +158 SET LA7POP=$$XCNTFM^LA7VHLU9(LA7X,LA7ECH)
- +159 IF LA7POP="^^"
- SET LA7POP=""
- End DoDot:1
- +160 ;
- +161 ; Results rpt/status chng - date/time
- +162 SET LA7X=$$P^LA7VHLU(.LA7SEG,23,LA7FS)
- SET LA7RSDT=""
- +163 IF LA7X'=""
- SET LA7RSDT=$$HL7TFM^XLFDT(LA7X,"L")
- +164 ;
- +165 ; Result status
- +166 SET LA7OBR25=$$P^LA7VHLU(.LA7SEG,26,LA7FS)
- +167 ;
- +168 ; Parent result - CM data type.
- +169 ; Save OBX-4 (sub-id) of parent result in LAPSUBID for subsequent usage by OBX/NTE's.
- +170 SET LA7OBR26=$$FIELD^LA7VHLU7(26)
- +171 DO FLD2ARR^LA7VHLU7(.LA7OBR26)
- +172 SET LAPSUBID=$GET(LA7OBR26(2))
- +173 ;
- +174 ; Parent
- +175 SET LA7OBR29=$$FIELD^LA7VHLU7(29)
- +176 DO FLD2ARR^LA7VHLU7(.LA7OBR29)
- +177 ;
- +178 ; Principle Result interpreter
- +179 SET LA7OBR32=$$FIELD^LA7VHLU7(32)
- SET LA7PRI=""
- +180 DO FLD2ARR^LA7VHLU7(.LA7OBR32)
- +181 IF $GET(LA7OBR32(1))'=""
- Begin DoDot:1
- +182 SET LA7X=$TRANSLATE(LA7OBR32(1),$EXTRACT(LA7ECH,4),$EXTRACT(LA7ECH))
- +183 SET LA7PRI=$$XCNTFM^LA7VHLU9(LA7X,LA7ECH)
- +184 IF LA7PRI="^^"
- SET LA7PRI=""
- End DoDot:1
- +185 ;
- +186 ; Assistant Result Interpreter
- +187 SET LA7OBR33=$$FIELD^LA7VHLU7(33)
- SET LA7ARI=""
- +188 DO FLD2ARR^LA7VHLU7(.LA7OBR33)
- +189 IF $GET(LA7OBR33(1))'=""
- Begin DoDot:1
- +190 SET LA7X=$TRANSLATE(LA7OBR33(1),$EXTRACT(LA7ECH,4),$EXTRACT(LA7ECH))
- +191 SET LA7ARI=$$XCNTFM^LA7VHLU9(LA7X,LA7ECH)
- +192 IF LA7ARI="^^"
- SET LA7ARI=""
- End DoDot:1
- +193 ;
- +194 ; Technician
- +195 SET LA7OBR34=$$FIELD^LA7VHLU7(34)
- SET LA7TECH=""
- +196 DO FLD2ARR^LA7VHLU7(.LA7OBR34)
- +197 IF $GET(LA7OBR34(1))'=""
- Begin DoDot:1
- +198 SET LA7X=$TRANSLATE(LA7OBR34(1),$EXTRACT(LA7ECH,4),$EXTRACT(LA7ECH))
- +199 SET LA7TECH=$$XCNTFM^LA7VHLU9(LA7X,LA7ECH)
- +200 IF LA7TECH="^^"
- SET LA7TECH=""
- End DoDot:1
- +201 ;
- +202 ; Results handling
- +203 ; Usually IS data type however later HL7 versions use CWE data type. Attempt to handle either format.
- +204 SET LA7X=$$P^LA7VHLU(.LA7SEG,50,LA7FS)
- +205 SET LA7OBR49=$PIECE(LA7X,LA7CS,1)
- +206 ;
- +207 ; Set Auto Release flag at OBR level for comments (NTE segments) before processing OBX segment, use "-.0000" in lieu of OBX.17 suffix value
- +208 IF LA7MTYP="ORU"
- SET LA7AUTORELEASE=$$ARSTATUS^LA7VIN5(LA7OBR49,"-.0000",LA7624)
- +209 ;
- +210 ; Create entry in LAH for supported subscripts.
- +211 IF LA7MTYP="ORR"
- IF $GET(LA7OTYPE)'="OK"
- IF LA7SS?1(1"CH",1"MI",1"SP",1"CY",1"EM")
- Begin DoDot:1
- +212 DO LAGEN^LA7VIN4A
- +213 IF $GET(LA7ISQN)=""
- DO CREATE^LA7LOG(14)
- QUIT
- +214 SET LA7I=$ORDER(^TMP("LA7 ORDER STATUS",$JOB,""),-1)
- SET LA7I=LA7I+1
- +215 IF LA7ONLT=""
- SET X=$$P^LA7VHLU(.LA7SEG,5,LA7FS)
- SET LA7X=$PIECE(X,LA7CS)
- SET LA7X(0)=$PIECE(X,LA7CS,2)
- +216 IF '$TEST
- SET LA7X=LA7ONLT
- SET LA7X(0)=LA7ONLT(0)
- +217 SET X=LA7LWL_"^"_LA7ISQN_"^"_LA7X_"^"_LA7X(0)_"^"_LA76248_"^"_LA76249_"^"_LA7OTYPE_"^^"_$PIECE($GET(LA7SM),"^",2)
- +218 SET ^TMP("LA7 ORDER STATUS",$JOB,LA7I)=X
- +219 IF $GET(LA7OCR)'=""
- SET ^TMP("LA7 ORDER STATUS",$JOB,LA7I,"OCR")=$TRANSLATE(LA7OCR,LA7CS,"^")
- +220 IF $GET(LA7MSATM)'=""
- SET ^TMP("LA7 ORDER STATUS",$JOB,LA7I,"MSA")=LA7MSATM
- End DoDot:1
- +221 ;
- +222 IF LA7MTYP="ORU"
- IF LA7SS?1(1"CH",1"MI",1"SP",1"CY",1"EM")
- Begin DoDot:1
- +223 DO LAGEN^LA7VIN4A
- +224 IF $GET(LA7ISQN)<1
- SET LA7ERR=14
- SET LA7AERR=$$CREATE^LA7LOG(LA7ERR,1)
- QUIT
- +225 IF LA7INTYP=10
- IF LA7SAC?1(1"A",1"G")
- Begin DoDot:2
- +226 SET LA7I=$ORDER(^TMP("LA7 ORDER STATUS",$JOB,""),-1)
- SET LA7I=LA7I+1
- SET LA7SAC(0)=LA7I
- +227 IF LA7ONLT=""
- SET X=$$P^LA7VHLU(.LA7SEG,5,LA7FS)
- SET LA7X=$PIECE(X,LA7CS)
- SET LA7X(0)=$PIECE(X,LA7CS,2)
- +228 IF '$TEST
- SET LA7X=LA7ONLT
- SET LA7X(0)=LA7ONLT(0)
- +229 SET X=LA7LWL_"^"_LA7ISQN_"^"_LA7X_"^"_LA7X(0)_"^"_LA76248_"^"_LA76249_"^"_$GET(LA7OTYPE)_"^"_LA7SAC_"^"_$PIECE($GET(LA7SM),"^",2)
- +230 SET ^TMP("LA7 ORDER STATUS",$JOB,LA7I)=X
- End DoDot:2
- +231 IF LA7INTYP=10
- IF LA7OBR25?1(1"A",1"X")
- Begin DoDot:2
- +232 SET LA7I=$ORDER(^TMP("LA7 ORDER STATUS",$JOB,""),-1)
- SET LA7I=LA7I+1
- +233 IF LA7ONLT=""
- SET X=$$P^LA7VHLU(.LA7SEG,5,LA7FS)
- SET LA7X=$PIECE(X,LA7CS)
- SET LA7X(0)=$PIECE(X,LA7CS,2)
- +234 IF '$TEST
- SET LA7X=LA7ONLT
- SET LA7X(0)=LA7ONLT(0)
- +235 SET X=LA7LWL_"^"_LA7ISQN_"^"_LA7X_"^"_LA7X(0)_"^"_LA76248_"^"_LA76249_"^"_$GET(LA7OTYPE)_"^"_LA7SAC_"^"_$PIECE($GET(LA7SM),"^",2)_"^"_LA7OBR25
- +236 SET ^TMP("LA7 ORDER STATUS",$JOB,LA7I)=X
- End DoDot:2
- +237 IF LA7INTYP=10
- IF LA7SS?1(1"MI",1"SP",1"CY",1"EM")
- SET ^TMP("LA7-PL-NTE",$JOB,LA7LWL,LA7ISQN,LA7SS)=LA7SFAC
- End DoDot:1
- +238 ;
- +239 ;LA*5.2*101: Do not require that LA7SM (shipping manifest identifier) not be null
- +240 IF LA7INTYP=10
- IF $GET(LA7UID)'=""
- DO SMUPDT^LA7VIN4A
- +241 QUIT
- +242 ;
- +243 ;
- OBRSCT ; check if SCT doesn't match any specimen in #68
- +1 ;
- +2 ;ZEXCEPT: LA761,LA76248,LA7I,LA7OK,LA7SPTY
- +3 ;
- +4 NEW LA761SCT,R61,SCTOK
- +5 SET (R61,SCTOK)=0
- +6 FOR
- SET R61=$ORDER(LA761(R61))
- if 'R61
- QUIT
- Begin DoDot:1
- +7 IF $DATA(^LAHM(62.48,LA76248,"SCT","AD1",LA7SPTY(LA7I),R61_";LAB(61,"))
- SET SCTOK=1
- QUIT
- +8 SET LA761SCT=$$IEN2SCT^LA7VHLU6(61,R61,DT,"")
- +9 IF LA761SCT'>0
- SET SCTOK=1
- +10 IF $PIECE(LA761SCT,"^")=LA7SPTY(LA7I)
- SET SCTOK=1
- End DoDot:1
- +11 ;
- +12 ; If no topography found on accession with a SCT mapping that matches SCT code then flag as error.
- +13 ; Also if SCT code in message has Lexicon exception then record as a separate error.
- +14 IF 'SCTOK
- Begin DoDot:1
- +15 NEW LA7SCT,LA7X,LA7Z
- +16 SET LA7OK=0
- SET LA7OK(0)="SCTID "_LA7SPTY(LA7I)
- +17 SET LA7Z=$$CODE^LEXTRAN(LA7SPTY(LA7I),"SCT",DT,"LA7SCT")
- +18 IF $PIECE(LA7Z,"^",5)
- Begin DoDot:2
- +19 SET LA7X=$PIECE(LA7Z,"^",6)
- +20 DO CREATE^LA7LOG(37)
- End DoDot:2
- End DoDot:1
- +21 ;
- +22 QUIT