LA7UIO1 ;DALOI/JMC - Process Download Message for an entry in 62.48 ;12/11/15  16:39
 ;;5.2;AUTOMATED LAB INSTRUMENTS;**66,74,88**;Sep 27, 1994;Build 10
 ;
 ; Reference to PROTOCOL file (#101) supported by ICR #872
 ;
 Q
 ;
BUILD ; Build one accession into an HL7 message
 ;
 N GBL,HL,I,LA760,LA761,LA7CDT,LA7CMT,LA7CS,LA7ERR,LA7FAC,LA7FS,LA7ECH,LA7HLP,LA7I,LA7ID,LA7LINK,LA7NVAF,LA7OBRSN,LA7PIDSN,LA7SCMT,LA7SID,LA7SPEC,LA7SUB,LA7X,LA7Y
 S GBL="^TMP(""HLS"","_$J_")"
 ;
 I '$D(ZTQUEUED),$G(LRLL) W:$X+5>IOM !,$S($G(LRTYPE):"Cup",1:"Seq"),": " W LA76822,", "
 ;
 S LA7CNT=0
 F I=0,.1,.2,.3,3 S LA76802(I)=$G(^LRO(68,LA768,1,LA76801,1,LA76802,I))
 S LA7X=LA76802(3)
 ; Draw time
 S LA7CDT=+LA7X
 ;
 ; Specimen comment if any, strip "~"
 S LA7SCMT=$TR($P(LA7X,"^",6),"~")
 ;
 ; Specimen
 S LA761=+$G(^LRO(68,LA768,1,LA76801,1,LA76802,5,1,0))
 ; Accession/unique ID - Long (UID) or short (accession #) sample ID
 S LA7ACC=$P(LA76802(.2),"^"),LA7UID=$P(LA76802(.3),"^"),LA7X=$G(^LRO(68,LA768,.4))
 I $P(LA7X,"^",2)="S" S LA7SID=$$RJ^XLFSTR(LA76802,+$P(LA7X,"^",3),"0")
 E  S LA7SID=LA7UID
 ;
 ; Start message
 D INIT Q:$G(HL)
 ;
 ; Setup links and subscriber array for HL7 message generation
 S LA76248(0)=$G(^LAHM(62.48,LA76248,0)),LA7Y=$P(LA76248(0),"^")
 I $E(LA7Y,1,5)'="LA7UI"!($P(LA76248(0),"^",9)'=1) Q
 ;
 ; Check if interface has been updagraded to HL7 v2.5.1 otherwise use v2.2 protocol
 S LA7SUB="LA7UI ORM-O01 SUBS"
 S X=$O(^ORD(101,"B",LA7SUB,0))
 I X<1 S LA7SUB="LA7UI ORM-O01 SUBS 2.2"
 ;
 S LA7LINK=LA7SUB_"^"_LA7Y
 S LA7FAC=$P($$SITE^VASITE(DT),"^",3)
 S LA7HLP("SUBSCRIBER")="^^"_LA7FAC_"^"_LA7Y_"^"
 ; Following line used when debugging
 ;S $P(LA7HLP("SUBSCRIBER"),"^",8)="1-1-2"
 ;
 ; Build segments PID, PV1, and ORC/OBR segment for each test to be sent
 D PID,PV1
 S (LA7I,LA7OBRSN)=0
 F  S LA7I=$O(LA7ACC(LA7I)) Q:'LA7I  D ORC,OBR
 ; Build entry in MESSAGE QUEUE file 62.49
 D SENDMSG
 L -^LAHM(62.49,LA76249)
 D KVAR^LRX
 Q
 ;
 ;
INIT ; Create/initialize HL message
 ;
 N LA7EVENT,X
 ;
 K @GBL
 S (LA76249,LA7NVAF,LA7PIDSN)=0
 ;
 ; Check if interface has been updagraded to HL7 v2.5.1 otherwise use v2.2 protocol
 S LA7EVENT="LA7UI ORM-O01 EVENT"
 S X=$O(^ORD(101,"B",LA7EVENT,0))
 I X<1 S LA7EVENT="LA7UI ORM-O01 EVENT 2.2"
 D STARTMSG^LA7VHLU(LA7EVENT,.LA76249)
 ;
 S LA7ID=$P(LRAUTO,"^",1)_"-O-"_LA7UID
 ;
 K ^TMP("LA7-ID",$J)
 D SETID^LA7VHLU1(LA76249,"",LA7ID,1)
 D SETID^LA7VHLU1(LA76249,"",LA7UID,0)
 D SETID^LA7VHLU1(LA76249,"",LA7ACC,0)
 S LA7CS=$E(LA7ECH,1)
 I $G(HL) S LA7ERR=28 D UPDT6249^LA7VORM1
 Q
 ;
 ;
PID ; Build PID segment
 N LA7DATA,LA7FLAG,NAME,PID
 S LRDFN=+LA7ACC0,LRDPF=$P(^LR(LRDFN,0),"^",2),DFN=$P(^(0),"^",3)
 D DEM^LRX
 ;
 S PID(0)="PID"
 S PID(1)=1
 S PID(3)=$$M11^HLFNC(LRDFN)
 ;
 ; Pass patient and referral files through name standardization.
 ; Don't pass lab control and other file's "paient" names thru name standardization as it affects name order.
 I LRDPF?1(1"2",1"67",1"200") S NAME("FILE")=LRDPF,NAME("FIELD")=.01,NAME("IENS")=DFN,LA7FLAG="S"
 E  S NAME("FAMILY")=$P(PNM,","),NAME("GIVEN")=$P(PNM,",",2),LA7FLAG=""
 S PID(5)=$$HLNAME^XLFNAME(.NAME,LA7FLAG,LA7CS)
 ;
 ; Date of birth
 I DOB S PID(7)=$$FMTHL7^XLFDT(DOB)
 S PID(8)=$S(SEX'="":SEX,1:"U")
 ;
 ; Race
 D RACE
 ;
 ; Patient's SSN
 I SSN'="" S PID(19)=SSN
 ;
 D BUILDSEG^LA7VHLU(.PID,.LA7DATA,LA7FS)
 D FILESEG^LA7VHLU(GBL,.LA7DATA)
 D FILE6249^LA7VHLU(LA76249,.LA7DATA)
 D SETID^LA7VHLU1(LA76249,"",PNM,0)
 Q
 ;
 ;
PV1 ; Build PV1 segment
 N LA7PV1,LA7X
 D PV1^LA7VPID(LRDFN,.LA7PV1,LA7FS,LA7ECH)
 ; If not inpatient use patient location from Accession
 I $P(LA7PV1(0),LA7FS,3)'="I" S LA7X=$P($G(LA76802(0)),"^",7) S LA7X=$$CHKDATA^LA7VHLU3(LA7X,LA7FS_LA7ECH) S $P(LA7PV1(0),LA7FS,4)=LA7X
 ;
 D FILESEG^LA7VHLU(GBL,.LA7PV1)
 D FILE6249^LA7VHLU(LA76249,.LA7PV1)
 Q
 ;
 ;
ORC ; Build ORC segment
 N LA7DATA,ORC
 S ORC(0)="ORC"
 S ORC(1)="NW"
 ;
 ; Placer/filler order number - sample ID
 S ORC(2)=$$ORC2^LA7VORC(LA7SID,LA7FS,LA7ECH)
 S ORC(3)=$$ORC3^LA7VORC(LA7SID,LA7FS,LA7ECH)
 ;
 ; Order/draw time - if no order date/time then try draw time
 I $P(LA76802(0),"^",4) S ORC(9)=$$ORC9^LA7VORC($P(LA76802(0),"^",4))
 I '$P(LA76802(0),"^",4),$P(LA76802(3),"^") S ORC(9)=$$ORC9^LA7VORC($P(LA76802(3),"^"))
 ;
 ; Provider
 S LA7X=$$FNDOLOC^LA7VHLU2(LA7UID)
 S ORC(12)=$$ORC12^LA7VORC($P(LA76802(0),"^",8),$P(LA7X,"^",3),LA7FS,LA7ECH,2)
 ; Provider Callback Number ;**88
 S ORC(14)=$$ORC14^LA7VORC($P(LA76802(0),"^",8),DT,LA7FS,LA7ECH)
 D BUILDSEG^LA7VHLU(.ORC,.LA7DATA,LA7FS)
 D FILESEG^LA7VHLU(GBL,.LA7DATA)
 D FILE6249^LA7VHLU(LA76249,.LA7DATA)
 Q
 ;
 ;
OBR ; Build OBR segment
 N LA764,LA7ALT,LA7CADR,LA7NLT,LA7TCMT
 K OBR
 ;
 S LA760=+LA7ACC(LA7I)
 S LA764=+$P($G(^LAB(60,LA760,64)),"^")
 S LA7NLT=$P($G(^LAM(LA764,0)),"^",2)
 S LA7TMP=$G(^TMP("LA7",$J,LA7INST,LA7I))
 Q:'LA7TMP
 ;
 S LA7CODE=$P(LA7TMP,"^",6),LA7DATA=$P(LA7TMP,"^",7)
 S OBR(0)="OBR"
 S OBR(1)=$$OBR1^LA7VOBR(.LA7OBRSN)
 ; Placer/filler order number - sample ID
 S OBR(2)=$$OBR2^LA7VOBR(LA7SID,LA7FS,LA7ECH)
 S OBR(3)=$$OBR3^LA7VOBR(LA7SID,LA7FS,LA7ECH)
 ; Test order code
 S LA7ALT=LA7CODE_"^"_$$GET1^DIQ(60,LA760_",",.01)_"^"_"99001"
 S OBR(4)=$$OBR4^LA7VOBR(LA7NLT,LA760,LA7ALT,LA7FS,LA7ECH)
 ; Draw time.
 I $G(LA7CDT) S OBR(7)=$$OBR7^LA7VOBR(LA7CDT)
 ; Infection warning.
 S OBR(12)=$$OBR12^LA7VOBR(LRDFN,LA7FS,LA7ECH)
 ;
 ; Specimen comment
 ; If no specimen comment
 ;  then check order for test comments on test
 ;   or parent test if panel exploded
 I LA7SCMT'="" S OBR(13)=$$OBR13^LA7VOBR(LA7SCMT,LA7FS,LA7ECH)
 I LA7SCMT="" D
 . S LA7TCMT=$$TESTCMT(LA768,LA76801,LA76802,LA760)
 . I LA7TCMT="" D
 . . N LA760P
 . . S LA760P=$P(LA7ACC(LA7I),"^",3)
 . . I LA760P>0,LA760'=LA760P S LA7TCMT=$$TESTCMT(LA768,LA76801,LA76802,LA760P)
 . I LA7TCMT'="" S OBR(13)=$$OBR13^LA7VOBR(LA7TCMT,LA7FS,LA7ECH)
 ;
 ; Lab Arrival Time
 S OBR(14)=$$OBR14^LA7VOBR($P(LA76802(3),"^",3))
 ; HL7 code from Topography
 S LA7X=$S(LRDPF=62.3:"^^^CONTROL",1:"")
 S OBR(15)=$$OBR15^LA7VOBR(LA761,"",LA7X,LA7FS,LA7ECH)
 ; Ordering provider
 S LA7X=$$FNDOLOC^LA7VHLU2(LA7UID)
 S OBR(16)=$$ORC12^LA7VORC($P(LA76802(0),"^",8),$P(LA7X,"^",3),LA7FS,LA7ECH,2)
 ; Provider Callback Number ;**88
 S OBR(17)=$$ORC14^LA7VORC($P(LA76802(0),"^",8),DT,LA7FS,LA7ECH)
 ; Placer's field #1 - instrument name^card address
 K LA7X
 S LA7X(1)=$P(LRAUTO,"^")
 S LA7CADR=$P($G(^LAB(62.4,LRINST,9)),U,9)
 I LA7CADR'="" S LA7X(2)=LA7CADR
 S OBR(18)=$$OBR18^LA7VOBR(.LA7X,LA7FS,LA7ECH)
 ; Placer's field #2 - tray^cup^lraa^lrad^lran^lracc^lruid
 K LA7X
 ; No tray/cup if don't send tray/cup flag.
 I $G(LRFORCE) S:LA76821 LA7X(1)=LA76821 S:LA76822 LA7X(2)=LA76822
 S LA7X(3)=LA768,LA7X(4)=LA76801,LA7X(5)=LA76802,LA7X(6)=LA7ACC,LA7X(7)=LA7UID
 S OBR(19)=$$OBR19^LA7VOBR(.LA7X,LA7FS,LA7ECH)
 ;
 ; Test urgency
 S OBR(27)=$$OBR27^LA7VOBR("","",+$P(LA7ACC(LA7I),"^",2),LA7FS,LA7ECH)
 ;
 K LA7DATA
 D BUILDSEG^LA7VHLU(.OBR,.LA7DATA,LA7FS)
 D FILESEG^LA7VHLU(GBL,.LA7DATA)
 D FILE6249^LA7VHLU(LA76249,.LA7DATA)
 Q
 ;
 ;
SENDMSG ; Send the HL7 message.
 N HLL,HLP
 S HLL("LINKS",1)=LA7LINK
 I $D(LA7HLP) M HLP=LA7HLP
 D GEN^LA7VHLU,UPDT6249^LA7VORM1
 Q
 ;
 ;
TESTCMT(LA768,LA76801,LA76802,LA760) ; Check and build order test comments
 ;
 ; Call with LA768 = IEN of accesseion area
 ;         LA76801 = FM accession date
 ;         LA76802 = accession number
 ;           LA760 = IEN of file #60 test
 ;
 ; Returns  LA7CMT = comments in a single string (truncated to 300 characters per HL7 standard)
 ;
 N LA7CMT,LA7I,LA7QUIT,LA7X,LA7Y,LRIEN,LRODT,LRSN
 ;
 S LA7CMT="",LRIEN=0
 S LA7Y=$G(^LRO(68,LA768,1,LA76801,1,LA76802,0))
 S LRODT=+$P(LA7Y,"^",4),LRSN=+$P(LA7Y,"^",5)
 I LRODT>0,LRSN>0 S LRIEN=$O(^LRO(69,LRODT,1,LRSN,2,"B",LA760,0))
 ;
 I LRIEN D
 . S (LA7I,LA7QUIT)=0,LA7X=""
 . F  S LA7I=$O(^LRO(69,LRODT,1,LRSN,2,LRIEN,1,LA7I)) Q:LA7I<1  D  Q:LA7QUIT
 . . S LA7X=$G(^LRO(69,LRODT,1,LRSN,2,LRIEN,1,LA7I,0))
 . . I $E(LA7X,1,10)="~For Test:" Q
 . . I LA7X'="" S LA7X=$TR(LA7X,"~","")
 . . I LA7CMT'="" S LA7X=" "_LA7X
 . . S LA7CMT=LA7CMT_LA7X
 . . I $L(LA7CMT)>300 S LA7CMT=$E(LA7CMT,1,300),LA7QUIT=1
 ;
 Q LA7CMT
 ;
 ;
RACE ; Build RACE field in PID segment
 ;
 N CNT,IEN,LA7X,LA7Y,RACE,RACENUM,X,Y
 ;
 S PID(10)=""
 ;
 ; if from PATIENT file (#2) then check RACE array (VADM(12).
 I LRDPF=2,$G(VADM(12)) D  Q
 . ; Loop through all races (CNT is repetition location)
 . S RACENUM=0
 . F CNT=1:1 S RACENUM=+$O(VADM(12,RACENUM)) Q:'RACENUM  D
 . . ; Fabricate race value -> RACE-METHOD
 . . S RACE=$$PTR2CODE^DGUTL4(+VADM(12,RACENUM),1,2)
 . . S X=$$PTR2CODE^DGUTL4(+$G(VADM(12,RACENUM,1)),3,2)
 . . S:X="" X="UNK"
 . . S RACE=RACE_"-"_X
 . . ; First triplet
 . . S LA7Y(10,CNT,1)=RACE
 . . S LA7Y(10,CNT,2)=$P(VADM(12,RACENUM),"^",2)
 . . S LA7Y(10,CNT,3)="HL70005"
 . . ; Second triplet
 . . S X=$$PTR2CODE^DGUTL4(+VADM(12,RACENUM),1,3)
 . . S LA7Y(10,CNT,4)=X
 . . S LA7Y(10,CNT,5)=$P(VADM(12,RACENUM),"^",2)
 . . S LA7Y(10,CNT,6)="CDC"
 . S IEN=0
 . F  S IEN=$O(LA7Y(10,IEN)) Q:IEN=""  D
 . . S LA7X=""
 . . F CNT=1:1:6 I LA7Y(10,IEN,CNT)'="" S $P(LA7X,$E(LA7ECH,1),CNT)=LA7Y(10,IEN,CNT)
 . . I LA7X="" Q
 . . I PID(10)'="" S PID(10)=PID(10)_$E(LA7ECH,2)
 . . S PID(10)=PID(10)_LA7X
 ;
 ; if from REFERRAL PATIENT file (#67) then check RACE field.
 I LRDPF=67 D  Q
 . S LA7X=$$GET1^DIQ(67,DFN_",",.06,"I")
 . I LA7X<1 Q
 . S PID(10)=$$PTR2CODE^DGUTL4(LA7X,1,2)
 . S $P(PID(10),$E(LA7ECH,1),2)=$$PTR2TEXT^DGUTL4(LA7X,1)
 . S $P(PID(10),$E(LA7ECH,1),3)="HL70005"
 ;
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HLA7UIO1   9710     printed  Sep 23, 2025@19:15:54                                                                                                                                                                                                     Page 2
LA7UIO1   ;DALOI/JMC - Process Download Message for an entry in 62.48 ;12/11/15  16:39
 +1       ;;5.2;AUTOMATED LAB INSTRUMENTS;**66,74,88**;Sep 27, 1994;Build 10
 +2       ;
 +3       ; Reference to PROTOCOL file (#101) supported by ICR #872
 +4       ;
 +5        QUIT 
 +6       ;
BUILD     ; Build one accession into an HL7 message
 +1       ;
 +2        NEW GBL,HL,I,LA760,LA761,LA7CDT,LA7CMT,LA7CS,LA7ERR,LA7FAC,LA7FS,LA7ECH,LA7HLP,LA7I,LA7ID,LA7LINK,LA7NVAF,LA7OBRSN,LA7PIDSN,LA7SCMT,LA7SID,LA7SPEC,LA7SUB,LA7X,LA7Y
 +3        SET GBL="^TMP(""HLS"","_$JOB_")"
 +4       ;
 +5        IF '$DATA(ZTQUEUED)
               IF $GET(LRLL)
                   if $X+5>IOM
                       WRITE !,$SELECT($GET(LRTYPE):"Cup",1:"Seq"),": "
                   WRITE LA76822,", "
 +6       ;
 +7        SET LA7CNT=0
 +8        FOR I=0,.1,.2,.3,3
               SET LA76802(I)=$GET(^LRO(68,LA768,1,LA76801,1,LA76802,I))
 +9        SET LA7X=LA76802(3)
 +10      ; Draw time
 +11       SET LA7CDT=+LA7X
 +12      ;
 +13      ; Specimen comment if any, strip "~"
 +14       SET LA7SCMT=$TRANSLATE($PIECE(LA7X,"^",6),"~")
 +15      ;
 +16      ; Specimen
 +17       SET LA761=+$GET(^LRO(68,LA768,1,LA76801,1,LA76802,5,1,0))
 +18      ; Accession/unique ID - Long (UID) or short (accession #) sample ID
 +19       SET LA7ACC=$PIECE(LA76802(.2),"^")
           SET LA7UID=$PIECE(LA76802(.3),"^")
           SET LA7X=$GET(^LRO(68,LA768,.4))
 +20       IF $PIECE(LA7X,"^",2)="S"
               SET LA7SID=$$RJ^XLFSTR(LA76802,+$PIECE(LA7X,"^",3),"0")
 +21      IF '$TEST
               SET LA7SID=LA7UID
 +22      ;
 +23      ; Start message
 +24       DO INIT
           if $GET(HL)
               QUIT 
 +25      ;
 +26      ; Setup links and subscriber array for HL7 message generation
 +27       SET LA76248(0)=$GET(^LAHM(62.48,LA76248,0))
           SET LA7Y=$PIECE(LA76248(0),"^")
 +28       IF $EXTRACT(LA7Y,1,5)'="LA7UI"!($PIECE(LA76248(0),"^",9)'=1)
               QUIT 
 +29      ;
 +30      ; Check if interface has been updagraded to HL7 v2.5.1 otherwise use v2.2 protocol
 +31       SET LA7SUB="LA7UI ORM-O01 SUBS"
 +32       SET X=$ORDER(^ORD(101,"B",LA7SUB,0))
 +33       IF X<1
               SET LA7SUB="LA7UI ORM-O01 SUBS 2.2"
 +34      ;
 +35       SET LA7LINK=LA7SUB_"^"_LA7Y
 +36       SET LA7FAC=$PIECE($$SITE^VASITE(DT),"^",3)
 +37       SET LA7HLP("SUBSCRIBER")="^^"_LA7FAC_"^"_LA7Y_"^"
 +38      ; Following line used when debugging
 +39      ;S $P(LA7HLP("SUBSCRIBER"),"^",8)="1-1-2"
 +40      ;
 +41      ; Build segments PID, PV1, and ORC/OBR segment for each test to be sent
 +42       DO PID
           DO PV1
 +43       SET (LA7I,LA7OBRSN)=0
 +44       FOR 
               SET LA7I=$ORDER(LA7ACC(LA7I))
               if 'LA7I
                   QUIT 
               DO ORC
               DO OBR
 +45      ; Build entry in MESSAGE QUEUE file 62.49
 +46       DO SENDMSG
 +47       LOCK -^LAHM(62.49,LA76249)
 +48       DO KVAR^LRX
 +49       QUIT 
 +50      ;
 +51      ;
INIT      ; Create/initialize HL message
 +1       ;
 +2        NEW LA7EVENT,X
 +3       ;
 +4        KILL @GBL
 +5        SET (LA76249,LA7NVAF,LA7PIDSN)=0
 +6       ;
 +7       ; Check if interface has been updagraded to HL7 v2.5.1 otherwise use v2.2 protocol
 +8        SET LA7EVENT="LA7UI ORM-O01 EVENT"
 +9        SET X=$ORDER(^ORD(101,"B",LA7EVENT,0))
 +10       IF X<1
               SET LA7EVENT="LA7UI ORM-O01 EVENT 2.2"
 +11       DO STARTMSG^LA7VHLU(LA7EVENT,.LA76249)
 +12      ;
 +13       SET LA7ID=$PIECE(LRAUTO,"^",1)_"-O-"_LA7UID
 +14      ;
 +15       KILL ^TMP("LA7-ID",$JOB)
 +16       DO SETID^LA7VHLU1(LA76249,"",LA7ID,1)
 +17       DO SETID^LA7VHLU1(LA76249,"",LA7UID,0)
 +18       DO SETID^LA7VHLU1(LA76249,"",LA7ACC,0)
 +19       SET LA7CS=$EXTRACT(LA7ECH,1)
 +20       IF $GET(HL)
               SET LA7ERR=28
               DO UPDT6249^LA7VORM1
 +21       QUIT 
 +22      ;
 +23      ;
PID       ; Build PID segment
 +1        NEW LA7DATA,LA7FLAG,NAME,PID
 +2        SET LRDFN=+LA7ACC0
           SET LRDPF=$PIECE(^LR(LRDFN,0),"^",2)
           SET DFN=$PIECE(^(0),"^",3)
 +3        DO DEM^LRX
 +4       ;
 +5        SET PID(0)="PID"
 +6        SET PID(1)=1
 +7        SET PID(3)=$$M11^HLFNC(LRDFN)
 +8       ;
 +9       ; Pass patient and referral files through name standardization.
 +10      ; Don't pass lab control and other file's "paient" names thru name standardization as it affects name order.
 +11       IF LRDPF?1(1"2",1"67",1"200")
               SET NAME("FILE")=LRDPF
               SET NAME("FIELD")=.01
               SET NAME("IENS")=DFN
               SET LA7FLAG="S"
 +12      IF '$TEST
               SET NAME("FAMILY")=$PIECE(PNM,",")
               SET NAME("GIVEN")=$PIECE(PNM,",",2)
               SET LA7FLAG=""
 +13       SET PID(5)=$$HLNAME^XLFNAME(.NAME,LA7FLAG,LA7CS)
 +14      ;
 +15      ; Date of birth
 +16       IF DOB
               SET PID(7)=$$FMTHL7^XLFDT(DOB)
 +17       SET PID(8)=$SELECT(SEX'="":SEX,1:"U")
 +18      ;
 +19      ; Race
 +20       DO RACE
 +21      ;
 +22      ; Patient's SSN
 +23       IF SSN'=""
               SET PID(19)=SSN
 +24      ;
 +25       DO BUILDSEG^LA7VHLU(.PID,.LA7DATA,LA7FS)
 +26       DO FILESEG^LA7VHLU(GBL,.LA7DATA)
 +27       DO FILE6249^LA7VHLU(LA76249,.LA7DATA)
 +28       DO SETID^LA7VHLU1(LA76249,"",PNM,0)
 +29       QUIT 
 +30      ;
 +31      ;
PV1       ; Build PV1 segment
 +1        NEW LA7PV1,LA7X
 +2        DO PV1^LA7VPID(LRDFN,.LA7PV1,LA7FS,LA7ECH)
 +3       ; If not inpatient use patient location from Accession
 +4        IF $PIECE(LA7PV1(0),LA7FS,3)'="I"
               SET LA7X=$PIECE($GET(LA76802(0)),"^",7)
               SET LA7X=$$CHKDATA^LA7VHLU3(LA7X,LA7FS_LA7ECH)
               SET $PIECE(LA7PV1(0),LA7FS,4)=LA7X
 +5       ;
 +6        DO FILESEG^LA7VHLU(GBL,.LA7PV1)
 +7        DO FILE6249^LA7VHLU(LA76249,.LA7PV1)
 +8        QUIT 
 +9       ;
 +10      ;
ORC       ; Build ORC segment
 +1        NEW LA7DATA,ORC
 +2        SET ORC(0)="ORC"
 +3        SET ORC(1)="NW"
 +4       ;
 +5       ; Placer/filler order number - sample ID
 +6        SET ORC(2)=$$ORC2^LA7VORC(LA7SID,LA7FS,LA7ECH)
 +7        SET ORC(3)=$$ORC3^LA7VORC(LA7SID,LA7FS,LA7ECH)
 +8       ;
 +9       ; Order/draw time - if no order date/time then try draw time
 +10       IF $PIECE(LA76802(0),"^",4)
               SET ORC(9)=$$ORC9^LA7VORC($PIECE(LA76802(0),"^",4))
 +11       IF '$PIECE(LA76802(0),"^",4)
               IF $PIECE(LA76802(3),"^")
                   SET ORC(9)=$$ORC9^LA7VORC($PIECE(LA76802(3),"^"))
 +12      ;
 +13      ; Provider
 +14       SET LA7X=$$FNDOLOC^LA7VHLU2(LA7UID)
 +15       SET ORC(12)=$$ORC12^LA7VORC($PIECE(LA76802(0),"^",8),$PIECE(LA7X,"^",3),LA7FS,LA7ECH,2)
 +16      ; Provider Callback Number ;**88
 +17       SET ORC(14)=$$ORC14^LA7VORC($PIECE(LA76802(0),"^",8),DT,LA7FS,LA7ECH)
 +18       DO BUILDSEG^LA7VHLU(.ORC,.LA7DATA,LA7FS)
 +19       DO FILESEG^LA7VHLU(GBL,.LA7DATA)
 +20       DO FILE6249^LA7VHLU(LA76249,.LA7DATA)
 +21       QUIT 
 +22      ;
 +23      ;
OBR       ; Build OBR segment
 +1        NEW LA764,LA7ALT,LA7CADR,LA7NLT,LA7TCMT
 +2        KILL OBR
 +3       ;
 +4        SET LA760=+LA7ACC(LA7I)
 +5        SET LA764=+$PIECE($GET(^LAB(60,LA760,64)),"^")
 +6        SET LA7NLT=$PIECE($GET(^LAM(LA764,0)),"^",2)
 +7        SET LA7TMP=$GET(^TMP("LA7",$JOB,LA7INST,LA7I))
 +8        if 'LA7TMP
               QUIT 
 +9       ;
 +10       SET LA7CODE=$PIECE(LA7TMP,"^",6)
           SET LA7DATA=$PIECE(LA7TMP,"^",7)
 +11       SET OBR(0)="OBR"
 +12       SET OBR(1)=$$OBR1^LA7VOBR(.LA7OBRSN)
 +13      ; Placer/filler order number - sample ID
 +14       SET OBR(2)=$$OBR2^LA7VOBR(LA7SID,LA7FS,LA7ECH)
 +15       SET OBR(3)=$$OBR3^LA7VOBR(LA7SID,LA7FS,LA7ECH)
 +16      ; Test order code
 +17       SET LA7ALT=LA7CODE_"^"_$$GET1^DIQ(60,LA760_",",.01)_"^"_"99001"
 +18       SET OBR(4)=$$OBR4^LA7VOBR(LA7NLT,LA760,LA7ALT,LA7FS,LA7ECH)
 +19      ; Draw time.
 +20       IF $GET(LA7CDT)
               SET OBR(7)=$$OBR7^LA7VOBR(LA7CDT)
 +21      ; Infection warning.
 +22       SET OBR(12)=$$OBR12^LA7VOBR(LRDFN,LA7FS,LA7ECH)
 +23      ;
 +24      ; Specimen comment
 +25      ; If no specimen comment
 +26      ;  then check order for test comments on test
 +27      ;   or parent test if panel exploded
 +28       IF LA7SCMT'=""
               SET OBR(13)=$$OBR13^LA7VOBR(LA7SCMT,LA7FS,LA7ECH)
 +29       IF LA7SCMT=""
               Begin DoDot:1
 +30               SET LA7TCMT=$$TESTCMT(LA768,LA76801,LA76802,LA760)
 +31               IF LA7TCMT=""
                       Begin DoDot:2
 +32                       NEW LA760P
 +33                       SET LA760P=$PIECE(LA7ACC(LA7I),"^",3)
 +34                       IF LA760P>0
                               IF LA760'=LA760P
                                   SET LA7TCMT=$$TESTCMT(LA768,LA76801,LA76802,LA760P)
                       End DoDot:2
 +35               IF LA7TCMT'=""
                       SET OBR(13)=$$OBR13^LA7VOBR(LA7TCMT,LA7FS,LA7ECH)
               End DoDot:1
 +36      ;
 +37      ; Lab Arrival Time
 +38       SET OBR(14)=$$OBR14^LA7VOBR($PIECE(LA76802(3),"^",3))
 +39      ; HL7 code from Topography
 +40       SET LA7X=$SELECT(LRDPF=62.3:"^^^CONTROL",1:"")
 +41       SET OBR(15)=$$OBR15^LA7VOBR(LA761,"",LA7X,LA7FS,LA7ECH)
 +42      ; Ordering provider
 +43       SET LA7X=$$FNDOLOC^LA7VHLU2(LA7UID)
 +44       SET OBR(16)=$$ORC12^LA7VORC($PIECE(LA76802(0),"^",8),$PIECE(LA7X,"^",3),LA7FS,LA7ECH,2)
 +45      ; Provider Callback Number ;**88
 +46       SET OBR(17)=$$ORC14^LA7VORC($PIECE(LA76802(0),"^",8),DT,LA7FS,LA7ECH)
 +47      ; Placer's field #1 - instrument name^card address
 +48       KILL LA7X
 +49       SET LA7X(1)=$PIECE(LRAUTO,"^")
 +50       SET LA7CADR=$PIECE($GET(^LAB(62.4,LRINST,9)),U,9)
 +51       IF LA7CADR'=""
               SET LA7X(2)=LA7CADR
 +52       SET OBR(18)=$$OBR18^LA7VOBR(.LA7X,LA7FS,LA7ECH)
 +53      ; Placer's field #2 - tray^cup^lraa^lrad^lran^lracc^lruid
 +54       KILL LA7X
 +55      ; No tray/cup if don't send tray/cup flag.
 +56       IF $GET(LRFORCE)
               if LA76821
                   SET LA7X(1)=LA76821
               if LA76822
                   SET LA7X(2)=LA76822
 +57       SET LA7X(3)=LA768
           SET LA7X(4)=LA76801
           SET LA7X(5)=LA76802
           SET LA7X(6)=LA7ACC
           SET LA7X(7)=LA7UID
 +58       SET OBR(19)=$$OBR19^LA7VOBR(.LA7X,LA7FS,LA7ECH)
 +59      ;
 +60      ; Test urgency
 +61       SET OBR(27)=$$OBR27^LA7VOBR("","",+$PIECE(LA7ACC(LA7I),"^",2),LA7FS,LA7ECH)
 +62      ;
 +63       KILL LA7DATA
 +64       DO BUILDSEG^LA7VHLU(.OBR,.LA7DATA,LA7FS)
 +65       DO FILESEG^LA7VHLU(GBL,.LA7DATA)
 +66       DO FILE6249^LA7VHLU(LA76249,.LA7DATA)
 +67       QUIT 
 +68      ;
 +69      ;
SENDMSG   ; Send the HL7 message.
 +1        NEW HLL,HLP
 +2        SET HLL("LINKS",1)=LA7LINK
 +3        IF $DATA(LA7HLP)
               MERGE HLP=LA7HLP
 +4        DO GEN^LA7VHLU
           DO UPDT6249^LA7VORM1
 +5        QUIT 
 +6       ;
 +7       ;
TESTCMT(LA768,LA76801,LA76802,LA760) ; Check and build order test comments
 +1       ;
 +2       ; Call with LA768 = IEN of accesseion area
 +3       ;         LA76801 = FM accession date
 +4       ;         LA76802 = accession number
 +5       ;           LA760 = IEN of file #60 test
 +6       ;
 +7       ; Returns  LA7CMT = comments in a single string (truncated to 300 characters per HL7 standard)
 +8       ;
 +9        NEW LA7CMT,LA7I,LA7QUIT,LA7X,LA7Y,LRIEN,LRODT,LRSN
 +10      ;
 +11       SET LA7CMT=""
           SET LRIEN=0
 +12       SET LA7Y=$GET(^LRO(68,LA768,1,LA76801,1,LA76802,0))
 +13       SET LRODT=+$PIECE(LA7Y,"^",4)
           SET LRSN=+$PIECE(LA7Y,"^",5)
 +14       IF LRODT>0
               IF LRSN>0
                   SET LRIEN=$ORDER(^LRO(69,LRODT,1,LRSN,2,"B",LA760,0))
 +15      ;
 +16       IF LRIEN
               Begin DoDot:1
 +17               SET (LA7I,LA7QUIT)=0
                   SET LA7X=""
 +18               FOR 
                       SET LA7I=$ORDER(^LRO(69,LRODT,1,LRSN,2,LRIEN,1,LA7I))
                       if LA7I<1
                           QUIT 
                       Begin DoDot:2
 +19                       SET LA7X=$GET(^LRO(69,LRODT,1,LRSN,2,LRIEN,1,LA7I,0))
 +20                       IF $EXTRACT(LA7X,1,10)="~For Test:"
                               QUIT 
 +21                       IF LA7X'=""
                               SET LA7X=$TRANSLATE(LA7X,"~","")
 +22                       IF LA7CMT'=""
                               SET LA7X=" "_LA7X
 +23                       SET LA7CMT=LA7CMT_LA7X
 +24                       IF $LENGTH(LA7CMT)>300
                               SET LA7CMT=$EXTRACT(LA7CMT,1,300)
                               SET LA7QUIT=1
                       End DoDot:2
                       if LA7QUIT
                           QUIT 
               End DoDot:1
 +25      ;
 +26       QUIT LA7CMT
 +27      ;
 +28      ;
RACE      ; Build RACE field in PID segment
 +1       ;
 +2        NEW CNT,IEN,LA7X,LA7Y,RACE,RACENUM,X,Y
 +3       ;
 +4        SET PID(10)=""
 +5       ;
 +6       ; if from PATIENT file (#2) then check RACE array (VADM(12).
 +7        IF LRDPF=2
               IF $GET(VADM(12))
                   Begin DoDot:1
 +8       ; Loop through all races (CNT is repetition location)
 +9                    SET RACENUM=0
 +10                   FOR CNT=1:1
                           SET RACENUM=+$ORDER(VADM(12,RACENUM))
                           if 'RACENUM
                               QUIT 
                           Begin DoDot:2
 +11      ; Fabricate race value -> RACE-METHOD
 +12                           SET RACE=$$PTR2CODE^DGUTL4(+VADM(12,RACENUM),1,2)
 +13                           SET X=$$PTR2CODE^DGUTL4(+$GET(VADM(12,RACENUM,1)),3,2)
 +14                           if X=""
                                   SET X="UNK"
 +15                           SET RACE=RACE_"-"_X
 +16      ; First triplet
 +17                           SET LA7Y(10,CNT,1)=RACE
 +18                           SET LA7Y(10,CNT,2)=$PIECE(VADM(12,RACENUM),"^",2)
 +19                           SET LA7Y(10,CNT,3)="HL70005"
 +20      ; Second triplet
 +21                           SET X=$$PTR2CODE^DGUTL4(+VADM(12,RACENUM),1,3)
 +22                           SET LA7Y(10,CNT,4)=X
 +23                           SET LA7Y(10,CNT,5)=$PIECE(VADM(12,RACENUM),"^",2)
 +24                           SET LA7Y(10,CNT,6)="CDC"
                           End DoDot:2
 +25                   SET IEN=0
 +26                   FOR 
                           SET IEN=$ORDER(LA7Y(10,IEN))
                           if IEN=""
                               QUIT 
                           Begin DoDot:2
 +27                           SET LA7X=""
 +28                           FOR CNT=1:1:6
                                   IF LA7Y(10,IEN,CNT)'=""
                                       SET $PIECE(LA7X,$EXTRACT(LA7ECH,1),CNT)=LA7Y(10,IEN,CNT)
 +29                           IF LA7X=""
                                   QUIT 
 +30                           IF PID(10)'=""
                                   SET PID(10)=PID(10)_$EXTRACT(LA7ECH,2)
 +31                           SET PID(10)=PID(10)_LA7X
                           End DoDot:2
                   End DoDot:1
                   QUIT 
 +32      ;
 +33      ; if from REFERRAL PATIENT file (#67) then check RACE field.
 +34       IF LRDPF=67
               Begin DoDot:1
 +35               SET LA7X=$$GET1^DIQ(67,DFN_",",.06,"I")
 +36               IF LA7X<1
                       QUIT 
 +37               SET PID(10)=$$PTR2CODE^DGUTL4(LA7X,1,2)
 +38               SET $PIECE(PID(10),$EXTRACT(LA7ECH,1),2)=$$PTR2TEXT^DGUTL4(LA7X,1)
 +39               SET $PIECE(PID(10),$EXTRACT(LA7ECH,1),3)="HL70005"
               End DoDot:1
               QUIT 
 +40      ;
 +41       QUIT