HDISDOCL ;BPFO/DTG - COLLECT LABORTORY ITEMS FOR SDO LIST; Apr 07, 2018@12:42
 ;;1.0;HEALTH DATA & INFORMATICS;**22**;Feb 22, 2005;Build 26
 ;
 ; ICR's:
 ; 6901 - HDI READ LABORATORY SERVICE LABORATORY TEST FILE (#60)
 ; 6902 - HDI READ MASTER LABORATORY TEST FILE (#66.3)
 ;
 Q
 ;
 ;bump tmp counter
BTMP() ;
 N F
 S F=$G(@TMP@(0)),F=F+1,@TMP@(0)=F
 Q F
 ;
LEN ; lab entry point
 ;
 ; LAB TEST IEN, TEST NAME .01, TEST INACTIVE DATE 133, TEST INACTIVE STATUS 132, TEST TYPE 3,
 ; PANEL 200 SUB MULTIPLE, LOCATION DATA NAME #5,13, SITE/SPECIMEN 100, SITE/SPECIMEN IEN, R/S NAME .01,
 ; RESULT/SPECIMEN 33, R/S STATUS 32, MLTF PTR 30
 ; 66.3
 ; IEN, NAME .01, STATUS, LOINC CODE .04, ALT TEST NAME .02
 ;
 N DA,DR,DIR,I,D,B,DIQ,DIC,ORDNM,ORIEN,ORIDT,ORST,PLIEN,PLNAME,PLPN,LT,LG,LB,LC,LRUN,LRIEN,LRNAME,LRMLIDT
 N LRTYPE,LRDAT,LRDAP,LRSTAT,LRIDT,LRSPEC,LRSPN,LRSUN,LRSST,LRSIDT,LRMLTF,LRMLNM,LRMLAN,LRMLLON,LTMP,LRMLSTAT
 N LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET,L60,LPRI,LE,LF,PNLNN
 N LTCNT,BA,LRAA,AA,AR,AB,ABC
 ; initialize vars to avoid undef
 S (DA,DR,DIR,I,D,B,DIQ,DIC,ORDNM,ORIEN,ORIDT,ORST,PLIEN,PLNAME,PLPN,LT,LG,LB,LC,LRUN,LRIEN,LRNAME,LRMLIDT)=""
 S (LRTYPE,LRDAT,LRDAP,LRSTAT,LRIDT,LRSPEC,LRSPN,LRSUN,LRSST,LRSIDT,LRMLTF,LRMLNM,LRMLAN,LRMLLON,LRMLSTAT)=""
 S (LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET,L60,LPRI,LE,LF)=""
 ; get info from 101.43
 ;
 S L60=$$ORDI^HDISDOC(LAM),LPRI=L60
 ;
 S (PLIEN,DA)=L60,PLPN="NO",LT="",LTMP="^TMP(""HDILAB1"",$J)" K @LTMP K DD
 ; check if 60 IEN
 I 'L60 D  G LQUIT
 . S (PLIEN,PLNAME,PLPN)=""
 . S (LRIEN,LRNAME,LRTYPE,LRDAT,LRDAP,LRIDT,LRSTAT)=""
 . S (LRSPEC,LRSPN,LRSUN,LRSIDT,LRSST)=""
 . S (LRMLTF,LRMLNM,LRMLAN,LRMLIDT,LRMLSTAT,LRMLLON,LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET)=""
 . D LH60P,LB60P,LH60T,LB60T,LH6001,LB6001,LH663,LB663,LT663,LT6001,LT60T
 . S HDIERAR=HDIERAR_$S(HDIERAR'="":",",1:"")_8
 . I $G(HDIERR)'="" S D=$G(@HDIERR@(0)),D=D+1,@HDIERR@(0)=D,@HDIERR@(D)="Orderable Item File Does Not Have a Lab File Number Associated. "_LAM_":"_ORDNM
 ;
 S A=$$GET1^DIQ(60,L60_",",.01) I A="" D  G LQUIT
 . S (PLIEN,PLNAME,PLPN)=""
 . S (LRIEN,LRNAME,LRTYPE,LRDAT,LRDAP,LRIDT,LRSTAT)=""
 . S (LRSPEC,LRSPN,LRSUN,LRSIDT,LRSST)=""
 . S (LRMLTF,LRMLNM,LRMLAN,LRMLIDT,LRMLSTAT,LRMLLON,LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET)=""
 . D LH60P,LB60P,LH60T,LB60T,LH6001,LB6001,LH663,LB663,LT663,LT6001,LT60T
 . S HDIERAR=HDIERAR_$S(HDIERAR'="":",",1:"")_9
 . I $G(HDIERR)'="" S D=$G(@HDIERR@(0)),D=D+1,@HDIERR@(0)=D,@HDIERR@(D)="Orderable Item Lab Pointer Not Found in Lab File. "_LAM_":"_ORDNM_":"_L60
 ;
 ;build array
 ; first determine if panel
 K BA D LIST^DIC(60.02,","_L60_",","@;.01I","",,,,,,,"BA")
 S A=$O(BA("DILIST","ID",0)) I A S PLPN="YES"
 K PNLNN,BA
 D PNLCK(PLIEN),GETLAB(PLIEN)
 S PLNAME=$$CHKCHAR($G(LC(.01,"E")))
 I $G(HDICNT)'="" D  ;<
 . S L=@HDICNT,K=$P(L,U,5),K=K+1,$P(L,U,5)=K
 . I PLPN="YES" S K=$P(L,U,6),K=K+1,$P(L,U,6)=K
 . S @HDICNT=L
 D LH60P,LB60P
 ; go through the test array
 S (LRIEN,LRNAME,LRTYPE,LRDAT,LRDAP,LRSTAT,LRIDT,LRSPEC,LRSPN,LRSUN,LRSST,LRSIDT,LRMLTF,LRMLNM,LRMLAN,LRMLSTAT)=""
 S LRMLLON="N/F",(LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET)=""
 S A=$O(@LTMP@(0)) I 'A D  G LQUIT
 . S (LRIEN,LRNAME,LRTYPE,LRDAT,LRDAP,LRIDT,LRSTAT)=""
 . S (LRSPEC,LRSPN,LRSUN,LRSIDT,LRSST)=""
 . S (LRMLTF,LRMLNM,LRMLAN,LRMLIDT,LRMLSTAT,LRMLLON,LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET)=""
 . D LH60T,LB60T,LH6001,LB6001,LH663,LB663,LT663,LT6001,LT60T
 ;
 S LRUN=0
LRT S LRUN=$O(@LTMP@(LRUN)) I 'LRUN G LQUIT
 D GETLAB(LRUN) S LRIEN=LRUN,LRNAME=$$CHKCHAR($G(LC(.01,"E"))),LRTYPE=$G(LC(3,"E"))
 S LRDAT=$G(LC(5,"I")),LRDAP=$G(LC(13,"I"))
 S A=$G(LC(132,"I")),LRSTAT=$S(A="Y":1,1:0),A=$G(LC(133,"I")),LRIDT="" I A S LRIDT=$$FMTE^XLFDT(A,5)
 I $G(HDICNT)'="" D  ;<
 . S L=@HDICNT,K=$P(L,U,7),K=K+1,$P(L,U,7)=K
 . I LRIDT'="" S K=$P(L,U,8),K=K+1,$P(L,U,8)=K
 . S @HDICNT=L
 . ; collect unique tests for count
 . S @TMPCT@("T",LRUN)=""
 D LH60T,LB60T
 ; check specimens
 S (LRSPEC,LRSPN,LRSUN,LRSST,LRSIDT,LRMLTF,LRMLNM,LRMLAN,LRMLSTAT,LRMLIDT)=""
 S LRMLLON="N/F"
 ; S A=$$GET1^DIQ(60,L60_",",.01) I A="" D  G LRT
 K AA D LIST^DIC(60.01,","_LRUN_",","@;.001I","Q",,,,,,,"AA")
 S A=0,A=$O(AA("DILIST",2,A)) I 'A D  G LRT
 . S (LRSPEC,LRSPN,LRSUN,LRSIDT,LRSST)=""
 . S (LRMLTF,LRMLNM,LRMLAN,LRMLIDT,LRMLSTAT,LRMLLON,LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET)=""
 . D LH6001,LB6001,LH663,LB663,LT663,LT6001,LT60T
 ;
 S LRSPEC=0
 K LRAA S A=0 F  S A=$O(AA("DILIST",2,A)) Q:'A  S LRAA($G(AA("DILIST",2,A)))=""
LRS ;S LRSPEC=$O(^LAB(60,LRUN,1,LRSPEC)) I 'LRSPEC D LT60T G LRT
 S LRSPEC=$O(LRAA(LRSPEC)) I 'LRSPEC D LT60T G LRT
 D GETSPEC(LRUN,LRSPEC)
 S LRSPN=$$CHKCHAR($G(LE(.01,"E"))),LRSUN=$G(LE(6,"E")),B=$G(LE(32,"I")),LRSST=$S(B="Y":1,1:"0")
 S B=$G(LE(33,"I")),LRSIDT="" I B S LRSIDT=$$FMTE^XLFDT(B,5)
 S LRMLTF=$G(LE(30,"I"))
 I $G(HDICNT)'="" D  ;<
 . S L=@HDICNT,K=$P(L,U,9),K=K+1,$P(L,U,9)=K
 . I LRSIDT'="" S K=$P(L,U,10),K=K+1,$P(L,U,10)=K
 . S @HDICNT=L
 D LH6001,LB6001
 I LRMLTF D  ;<
 . D GETMLTF(LRMLTF)
 . S LRMLNM=$$CHKCHAR($G(LF(.01,"E"))),LRMLAN=$$CHKCHAR($G(LF(.02,"E"))),LRMLLON=$G(LF(.04,"I")) S:LRMLLON="" LRMLLON="N/F"
 . S LRMLCOM=$$CHKCHAR($G(LF(.05,"E"))),LRMLPROP=$$CHKCHAR($G(LF(.06,"E"))),LRMLTIM=$$CHKCHAR($G(LF(.07,"E")))
 . S LRMLSPEC=$$CHKCHAR($G(LF(.08,"E"))),LRMLSCAL=$$CHKCHAR($G(LF(.09,"E"))),LRMLMET=$$CHKCHAR($G(LF(1,"E")))
 . ; get status
 . N DA,AA,LXH,A,B,C S DA=LRMLTF D LIST^DIC(66.399,","_DA_",","@;.01IE;.02IE","",,,,,,,"AA")
 . K LXH M LXH=AA("DILIST","ID") K AA
 . S A=$O(LXH(99999999),-1),B=$G(LXH(A,.02,"E")),C=$G(LXH(A,.01,"I"))
 . S LRMLSTAT=0,LRMLIDT="" S LRMLSTAT=$S(B="INACTIVE":1,1:0) I LRMLSTAT S LRMLIDT=$$FMTE^XLFDT($P(C,".",1),5)
 . I $G(HDICNT)'="" D  ;<
 . . S L=@HDICNT,K=$P(L,U,11),K=K+1,$P(L,U,11)=K
 . . I LRMLIDT'="" S K=$P(L,U,12),K=K+1,$P(L,U,12)=K
 . . S @HDICNT=L
 . . ; get unique mltf items
 . . S @TMPCT@("M",LRMLTF)=""
 I 'LRMLTF S (LRMLTF,LRMLNM,LRMLAN,LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET,LRMLIDT,LRMLSTAT,LRMLLON)=""
 D LH663,LB663,LT663,LT6001
 G LRS
 ;
LQUIT ; quit back
 D LT60P,OT10143^HDISDOC
 K @LTMP
 K DA,DR,DIR,I,D,B,DIQ,DIC,ORDNM,ORIEN,ORIDT,ORST,PLIEN,PLNAME,PLPN,LT,LG,LB,LC,LRUN,LRIEN,LRNAME
 K LRTYPE,LRDAT,LRDAP,LRSTAT,LRIDT,LRSPEC,LRSPN,LRSUN,LRSST,LRSIDT,LRMLTF,LRMLNM,LRMLAN,LRMLLON,LTMP
 K LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET,L60,LPRI,LE,LF,PNLNN
 K LTCNT,BA,LRAA,AA,AR,AB,ABC
 Q
 ;
PNLCK(LT) ; check for panel
 N A,B,C,D,AA,AR,BA,BR S A=0
 Q:'LT
 S PNLNN(LT)=1
 K AA D LIST^DIC(60.02,","_LT_",","@;.01I","",,,,,,,"AA")
 K AR M AR=AA("DILIST","ID") K AA
 S A=$O(AR(A)) I 'A S @LTMP@(LT)="" Q
 S A=0 F  S A=$O(AR(A)) Q:'A  D  ;<
 . S C=$G(AR(A,.01)) Q:'C
 . ; only have the test once for cycle of primary item
 . I $G(PNLNN(C))=1 Q
 . S PNLNN(C)=1
 . K BA D LIST^DIC(60.02,","_C_",","@;.01I","",,,,,,,"BA")
 . S B=$O(BA("DILIST","ID",0)) I B D PNLCK(C)
 . S @LTMP@(C)=""
 Q
 ;
CHKCHAR(A) ; check for ctrl chars, <, >, &, /
 N B,C,I,L,M,N
 I A="" Q A
 S B="" F I=1:1:$L(A) S C=$E(A,I) D  S L=C
 . S M=$E(A,(I+1))
 . I $A(C)<32!($A(C)>126) Q  ; skip set
 . I C="&" S N="'AND'",B=B_N Q
 . I C="<" S N="'LESS THAN'",B=B_N Q
 . I C=">" S N="'GREATER THAN'",B=B_N Q
 . ;I C="/" S N="'FORWARD SLASH'",B=B_N Q
 . S B=B_C
 Q B
 ;
GETLAB(LG) ; get lab test info
 N A,B,C,D,DA,DR,DIQ
 Q:'LG
 S DA=LG,DIQ="LB",DIQ(0)="IE",DIC=60,DR=".01;3;5;13;133;132" K ^UTILITY("DIQ1",$J) D EN^DIQ1 K ^UTILITY("DIQ1",$J)
 K LC M LC=LB(60,DA) K LB
 ;
GETSPEC(LG,LS) ; get lab test specimen info
 N A,B,C,D,DA,DR,DIQ
 S DIQ="LB",DIQ(0)="IE",DIC=60,DR=100,DA=+LG K LB,^UTILITY("DIQ1",$J)
 S DR(60.01)=".01;6;30;32;33",DA(60.01)=LS
 D EN^DIQ1 K ^UTILITY("DIQ1",$J)
 K LE M LE=LB("60.01",LS) K LB
 Q
 ;
GETMLTF(LM) ; get mltf info from file 66.3
 N A,B,C,D,DA,DR,DIQ
 Q:'LM
 S DA=LM,DIQ="LB",DIQ(0)="IE",DIC=66.3,DR=".01;.02;.04;.05;.06;.07;.08;.09;1" K ^UTILITY("DIQ1",$J) D EN^DIQ1 K ^UTILITY("DIQ1",$J)
 K LF M LF=LB(66.3,DA) K LB
 Q
 ;
LH60P ; header for primary item
 S D=$$BTMP,@TMP@(D)="<Lab_Primary_Order_Item>"
 Q
 ;
LT60P ; trailer for primary item
 S D=$$BTMP,@TMP@(D)="</Lab_Primary_Order_Item>"
 Q
 ;
LB60P ; body for primary item
 S D=$$BTMP,@TMP@(D)="<Lab_Primary_Test_IEN>"_PLIEN_"</Lab_Primary_Test_IEN>"
 S D=$$BTMP,@TMP@(D)="<Lab_Primary_Test_Name>"_PLNAME_"</Lab_Primary_Test_Name>"
 S D=$$BTMP,@TMP@(D)="<Lab_Primary_Test_Panel>"_PLPN_"</Lab_Primary_Test_Panel>"
 Q
 ;
LH60T ; test header for file 60
 S D=$$BTMP,@TMP@(D)="<Laboratory_Test_Item>"
 Q
 ;
LT60T ; test trailer for file 60
 S D=$$BTMP,@TMP@(D)="</Laboratory_Test_Item>"
 Q
 ;
LB60T ; test body for file 60
 S D=$$BTMP,@TMP@(D)="<Lab_Test_IEN>"_LRIEN_"</Lab_Test_IEN>"
 S D=$$BTMP,@TMP@(D)="<Lab_Test_Name>"_LRNAME_"</Lab_Test_Name>"
 S D=$$BTMP,@TMP@(D)="<Lab_Test_Type>"_LRTYPE_"</Lab_Test_Type>"
 S D=$$BTMP,@TMP@(D)="<Lab_Test_Data_Location>"_LRDAT_"</Lab_Test_Data_Location>"
 S D=$$BTMP,@TMP@(D)="<Lab_Test_Data_Loc_Physical>"_LRDAP_"</Lab_Test_Data_Loc_Physical>"
 S D=$$BTMP,@TMP@(D)="<Lab_Test_Inactive_Date>"_LRIDT_"</Lab_Test_Inactive_Date>"
 S D=$$BTMP,@TMP@(D)="<Lab_Test_Status>"_LRSTAT_"</Lab_Test_Status>"
 Q
 ;
LH6001 ; test specimen header for file 60.01
 S D=$$BTMP,@TMP@(D)="<Lab_Test_Specimen>"
 Q
 ;
LT6001 ; test specimen trailer for file 60.01
 S D=$$BTMP,@TMP@(D)="</Lab_Test_Specimen>"
 Q
 ;
LB6001 ; test spceimen body for file 60.01
 S D=$$BTMP,@TMP@(D)="<Lab_Test_Specimen_IEN>"_LRSPEC_"</Lab_Test_Specimen_IEN>"
 S D=$$BTMP,@TMP@(D)="<Lab_Test_Specimen_Name>"_LRSPN_"</Lab_Test_Specimen_Name>"
 S D=$$BTMP,@TMP@(D)="<Lab_Test_Specimen_Units>"_LRSUN_"</Lab_Test_Specimen_Units>"
 S D=$$BTMP,@TMP@(D)="<Lab_Test_Specimen_Inactive_Date>"_LRSIDT_"</Lab_Test_Specimen_Inactive_Date>"
 S D=$$BTMP,@TMP@(D)="<Lab_Test_Specimen_Status>"_LRSST_"</Lab_Test_Specimen_Status>"
 Q
 ;
LH663 ; header for mltf 66.3
 S D=$$BTMP,@TMP@(D)="<Master_Lab_Test_Item>"
 Q
 ;
LT663 ;trailer for mltf 66.3
 S D=$$BTMP,@TMP@(D)="</Master_Lab_Test_Item>"
 Q
 ;
LB663 ; body for mltf 66.3
 S D=$$BTMP,@TMP@(D)="<Master_Lab_Test_IEN>"_LRMLTF_"</Master_Lab_Test_IEN>"
 S D=$$BTMP,@TMP@(D)="<Master_Lab_Test_Name>"_LRMLNM_"</Master_Lab_Test_Name>"
 S D=$$BTMP,@TMP@(D)="<Master_Lab_Test_Alternate_Name>"_LRMLAN_"</Master_Lab_Test_Alternate_Name>"
 S D=$$BTMP,@TMP@(D)="<Master_Lab_Test_Inactive_Date>"_LRMLIDT_"</Master_Lab_Test_Inactive_Date>"
 S D=$$BTMP,@TMP@(D)="<Master_Lab_Test_Status>"_LRMLSTAT_"</Master_Lab_Test_Status>"
 S D=$$BTMP,@TMP@(D)="<Master_Lab_Test_LOINC_Code>"_LRMLLON_"</Master_Lab_Test_LOINC_Code>"
 S D=$$BTMP,@TMP@(D)="<Master_Lab_Test_Component>"_LRMLCOM_"</Master_Lab_Test_Component>"
 S D=$$BTMP,@TMP@(D)="<Master_Lab_Test_Property>"_LRMLPROP_"</Master_Lab_Test_Property>"
 S D=$$BTMP,@TMP@(D)="<Master_Lab_Test_Time_Aspect>"_LRMLTIM_"</Master_Lab_Test_Time_Aspect>"
 S D=$$BTMP,@TMP@(D)="<Master_Lab_Test_Specimen>"_LRMLSPEC_"</Master_Lab_Test_Specimen>"
 S D=$$BTMP,@TMP@(D)="<Master_Lab_Test_Scale>"_LRMLSCAL_"</Master_Lab_Test_Scale>"
 S D=$$BTMP,@TMP@(D)="<Master_Lab_Test_Method>"_LRMLMET_"</Master_Lab_Test_Method>"
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HHDISDOCL   11330     printed  Sep 23, 2025@19:32:36                                                                                                                                                                                                   Page 2
HDISDOCL  ;BPFO/DTG - COLLECT LABORTORY ITEMS FOR SDO LIST; Apr 07, 2018@12:42
 +1       ;;1.0;HEALTH DATA & INFORMATICS;**22**;Feb 22, 2005;Build 26
 +2       ;
 +3       ; ICR's:
 +4       ; 6901 - HDI READ LABORATORY SERVICE LABORATORY TEST FILE (#60)
 +5       ; 6902 - HDI READ MASTER LABORATORY TEST FILE (#66.3)
 +6       ;
 +7        QUIT 
 +8       ;
 +9       ;bump tmp counter
BTMP()    ;
 +1        NEW F
 +2        SET F=$GET(@TMP@(0))
           SET F=F+1
           SET @TMP@(0)=F
 +3        QUIT F
 +4       ;
LEN       ; lab entry point
 +1       ;
 +2       ; LAB TEST IEN, TEST NAME .01, TEST INACTIVE DATE 133, TEST INACTIVE STATUS 132, TEST TYPE 3,
 +3       ; PANEL 200 SUB MULTIPLE, LOCATION DATA NAME #5,13, SITE/SPECIMEN 100, SITE/SPECIMEN IEN, R/S NAME .01,
 +4       ; RESULT/SPECIMEN 33, R/S STATUS 32, MLTF PTR 30
 +5       ; 66.3
 +6       ; IEN, NAME .01, STATUS, LOINC CODE .04, ALT TEST NAME .02
 +7       ;
 +8        NEW DA,DR,DIR,I,D,B,DIQ,DIC,ORDNM,ORIEN,ORIDT,ORST,PLIEN,PLNAME,PLPN,LT,LG,LB,LC,LRUN,LRIEN,LRNAME,LRMLIDT
 +9        NEW LRTYPE,LRDAT,LRDAP,LRSTAT,LRIDT,LRSPEC,LRSPN,LRSUN,LRSST,LRSIDT,LRMLTF,LRMLNM,LRMLAN,LRMLLON,LTMP,LRMLSTAT
 +10       NEW LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET,L60,LPRI,LE,LF,PNLNN
 +11       NEW LTCNT,BA,LRAA,AA,AR,AB,ABC
 +12      ; initialize vars to avoid undef
 +13       SET (DA,DR,DIR,I,D,B,DIQ,DIC,ORDNM,ORIEN,ORIDT,ORST,PLIEN,PLNAME,PLPN,LT,LG,LB,LC,LRUN,LRIEN,LRNAME,LRMLIDT)=""
 +14       SET (LRTYPE,LRDAT,LRDAP,LRSTAT,LRIDT,LRSPEC,LRSPN,LRSUN,LRSST,LRSIDT,LRMLTF,LRMLNM,LRMLAN,LRMLLON,LRMLSTAT)=""
 +15       SET (LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET,L60,LPRI,LE,LF)=""
 +16      ; get info from 101.43
 +17      ;
 +18       SET L60=$$ORDI^HDISDOC(LAM)
           SET LPRI=L60
 +19      ;
 +20       SET (PLIEN,DA)=L60
           SET PLPN="NO"
           SET LT=""
           SET LTMP="^TMP(""HDILAB1"",$J)"
           KILL @LTMP
           KILL DD
 +21      ; check if 60 IEN
 +22       IF 'L60
               Begin DoDot:1
 +23               SET (PLIEN,PLNAME,PLPN)=""
 +24               SET (LRIEN,LRNAME,LRTYPE,LRDAT,LRDAP,LRIDT,LRSTAT)=""
 +25               SET (LRSPEC,LRSPN,LRSUN,LRSIDT,LRSST)=""
 +26               SET (LRMLTF,LRMLNM,LRMLAN,LRMLIDT,LRMLSTAT,LRMLLON,LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET)=""
 +27               DO LH60P
                   DO LB60P
                   DO LH60T
                   DO LB60T
                   DO LH6001
                   DO LB6001
                   DO LH663
                   DO LB663
                   DO LT663
                   DO LT6001
                   DO LT60T
 +28               SET HDIERAR=HDIERAR_$SELECT(HDIERAR'="":",",1:"")_8
 +29               IF $GET(HDIERR)'=""
                       SET D=$GET(@HDIERR@(0))
                       SET D=D+1
                       SET @HDIERR@(0)=D
                       SET @HDIERR@(D)="Orderable Item File Does Not Have a Lab File Number Associated. "_LAM_":"_ORDNM
               End DoDot:1
               GOTO LQUIT
 +30      ;
 +31       SET A=$$GET1^DIQ(60,L60_",",.01)
           IF A=""
               Begin DoDot:1
 +32               SET (PLIEN,PLNAME,PLPN)=""
 +33               SET (LRIEN,LRNAME,LRTYPE,LRDAT,LRDAP,LRIDT,LRSTAT)=""
 +34               SET (LRSPEC,LRSPN,LRSUN,LRSIDT,LRSST)=""
 +35               SET (LRMLTF,LRMLNM,LRMLAN,LRMLIDT,LRMLSTAT,LRMLLON,LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET)=""
 +36               DO LH60P
                   DO LB60P
                   DO LH60T
                   DO LB60T
                   DO LH6001
                   DO LB6001
                   DO LH663
                   DO LB663
                   DO LT663
                   DO LT6001
                   DO LT60T
 +37               SET HDIERAR=HDIERAR_$SELECT(HDIERAR'="":",",1:"")_9
 +38               IF $GET(HDIERR)'=""
                       SET D=$GET(@HDIERR@(0))
                       SET D=D+1
                       SET @HDIERR@(0)=D
                       SET @HDIERR@(D)="Orderable Item Lab Pointer Not Found in Lab File. "_LAM_":"_ORDNM_":"_L60
               End DoDot:1
               GOTO LQUIT
 +39      ;
 +40      ;build array
 +41      ; first determine if panel
 +42       KILL BA
           DO LIST^DIC(60.02,","_L60_",","@;.01I","",,,,,,,"BA")
 +43       SET A=$ORDER(BA("DILIST","ID",0))
           IF A
               SET PLPN="YES"
 +44       KILL PNLNN,BA
 +45       DO PNLCK(PLIEN)
           DO GETLAB(PLIEN)
 +46       SET PLNAME=$$CHKCHAR($GET(LC(.01,"E")))
 +47      ;<
           IF $GET(HDICNT)'=""
               Begin DoDot:1
 +48               SET L=@HDICNT
                   SET K=$PIECE(L,U,5)
                   SET K=K+1
                   SET $PIECE(L,U,5)=K
 +49               IF PLPN="YES"
                       SET K=$PIECE(L,U,6)
                       SET K=K+1
                       SET $PIECE(L,U,6)=K
 +50               SET @HDICNT=L
               End DoDot:1
 +51       DO LH60P
           DO LB60P
 +52      ; go through the test array
 +53       SET (LRIEN,LRNAME,LRTYPE,LRDAT,LRDAP,LRSTAT,LRIDT,LRSPEC,LRSPN,LRSUN,LRSST,LRSIDT,LRMLTF,LRMLNM,LRMLAN,LRMLSTAT)=""
 +54       SET LRMLLON="N/F"
           SET (LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET)=""
 +55       SET A=$ORDER(@LTMP@(0))
           IF 'A
               Begin DoDot:1
 +56               SET (LRIEN,LRNAME,LRTYPE,LRDAT,LRDAP,LRIDT,LRSTAT)=""
 +57               SET (LRSPEC,LRSPN,LRSUN,LRSIDT,LRSST)=""
 +58               SET (LRMLTF,LRMLNM,LRMLAN,LRMLIDT,LRMLSTAT,LRMLLON,LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET)=""
 +59               DO LH60T
                   DO LB60T
                   DO LH6001
                   DO LB6001
                   DO LH663
                   DO LB663
                   DO LT663
                   DO LT6001
                   DO LT60T
               End DoDot:1
               GOTO LQUIT
 +60      ;
 +61       SET LRUN=0
LRT        SET LRUN=$ORDER(@LTMP@(LRUN))
           IF 'LRUN
               GOTO LQUIT
 +1        DO GETLAB(LRUN)
           SET LRIEN=LRUN
           SET LRNAME=$$CHKCHAR($GET(LC(.01,"E")))
           SET LRTYPE=$GET(LC(3,"E"))
 +2        SET LRDAT=$GET(LC(5,"I"))
           SET LRDAP=$GET(LC(13,"I"))
 +3        SET A=$GET(LC(132,"I"))
           SET LRSTAT=$SELECT(A="Y":1,1:0)
           SET A=$GET(LC(133,"I"))
           SET LRIDT=""
           IF A
               SET LRIDT=$$FMTE^XLFDT(A,5)
 +4       ;<
           IF $GET(HDICNT)'=""
               Begin DoDot:1
 +5                SET L=@HDICNT
                   SET K=$PIECE(L,U,7)
                   SET K=K+1
                   SET $PIECE(L,U,7)=K
 +6                IF LRIDT'=""
                       SET K=$PIECE(L,U,8)
                       SET K=K+1
                       SET $PIECE(L,U,8)=K
 +7                SET @HDICNT=L
 +8       ; collect unique tests for count
 +9                SET @TMPCT@("T",LRUN)=""
               End DoDot:1
 +10       DO LH60T
           DO LB60T
 +11      ; check specimens
 +12       SET (LRSPEC,LRSPN,LRSUN,LRSST,LRSIDT,LRMLTF,LRMLNM,LRMLAN,LRMLSTAT,LRMLIDT)=""
 +13       SET LRMLLON="N/F"
 +14      ; S A=$$GET1^DIQ(60,L60_",",.01) I A="" D  G LRT
 +15       KILL AA
           DO LIST^DIC(60.01,","_LRUN_",","@;.001I","Q",,,,,,,"AA")
 +16       SET A=0
           SET A=$ORDER(AA("DILIST",2,A))
           IF 'A
               Begin DoDot:1
 +17               SET (LRSPEC,LRSPN,LRSUN,LRSIDT,LRSST)=""
 +18               SET (LRMLTF,LRMLNM,LRMLAN,LRMLIDT,LRMLSTAT,LRMLLON,LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET)=""
 +19               DO LH6001
                   DO LB6001
                   DO LH663
                   DO LB663
                   DO LT663
                   DO LT6001
                   DO LT60T
               End DoDot:1
               GOTO LRT
 +20      ;
 +21       SET LRSPEC=0
 +22       KILL LRAA
           SET A=0
           FOR 
               SET A=$ORDER(AA("DILIST",2,A))
               if 'A
                   QUIT 
               SET LRAA($GET(AA("DILIST",2,A)))=""
LRS       ;S LRSPEC=$O(^LAB(60,LRUN,1,LRSPEC)) I 'LRSPEC D LT60T G LRT
 +1        SET LRSPEC=$ORDER(LRAA(LRSPEC))
           IF 'LRSPEC
               DO LT60T
               GOTO LRT
 +2        DO GETSPEC(LRUN,LRSPEC)
 +3        SET LRSPN=$$CHKCHAR($GET(LE(.01,"E")))
           SET LRSUN=$GET(LE(6,"E"))
           SET B=$GET(LE(32,"I"))
           SET LRSST=$SELECT(B="Y":1,1:"0")
 +4        SET B=$GET(LE(33,"I"))
           SET LRSIDT=""
           IF B
               SET LRSIDT=$$FMTE^XLFDT(B,5)
 +5        SET LRMLTF=$GET(LE(30,"I"))
 +6       ;<
           IF $GET(HDICNT)'=""
               Begin DoDot:1
 +7                SET L=@HDICNT
                   SET K=$PIECE(L,U,9)
                   SET K=K+1
                   SET $PIECE(L,U,9)=K
 +8                IF LRSIDT'=""
                       SET K=$PIECE(L,U,10)
                       SET K=K+1
                       SET $PIECE(L,U,10)=K
 +9                SET @HDICNT=L
               End DoDot:1
 +10       DO LH6001
           DO LB6001
 +11      ;<
           IF LRMLTF
               Begin DoDot:1
 +12               DO GETMLTF(LRMLTF)
 +13               SET LRMLNM=$$CHKCHAR($GET(LF(.01,"E")))
                   SET LRMLAN=$$CHKCHAR($GET(LF(.02,"E")))
                   SET LRMLLON=$GET(LF(.04,"I"))
                   if LRMLLON=""
                       SET LRMLLON="N/F"
 +14               SET LRMLCOM=$$CHKCHAR($GET(LF(.05,"E")))
                   SET LRMLPROP=$$CHKCHAR($GET(LF(.06,"E")))
                   SET LRMLTIM=$$CHKCHAR($GET(LF(.07,"E")))
 +15               SET LRMLSPEC=$$CHKCHAR($GET(LF(.08,"E")))
                   SET LRMLSCAL=$$CHKCHAR($GET(LF(.09,"E")))
                   SET LRMLMET=$$CHKCHAR($GET(LF(1,"E")))
 +16      ; get status
 +17               NEW DA,AA,LXH,A,B,C
                   SET DA=LRMLTF
                   DO LIST^DIC(66.399,","_DA_",","@;.01IE;.02IE","",,,,,,,"AA")
 +18               KILL LXH
                   MERGE LXH=AA("DILIST","ID")
                   KILL AA
 +19               SET A=$ORDER(LXH(99999999),-1)
                   SET B=$GET(LXH(A,.02,"E"))
                   SET C=$GET(LXH(A,.01,"I"))
 +20               SET LRMLSTAT=0
                   SET LRMLIDT=""
                   SET LRMLSTAT=$SELECT(B="INACTIVE":1,1:0)
                   IF LRMLSTAT
                       SET LRMLIDT=$$FMTE^XLFDT($PIECE(C,".",1),5)
 +21      ;<
                   IF $GET(HDICNT)'=""
                       Begin DoDot:2
 +22                       SET L=@HDICNT
                           SET K=$PIECE(L,U,11)
                           SET K=K+1
                           SET $PIECE(L,U,11)=K
 +23                       IF LRMLIDT'=""
                               SET K=$PIECE(L,U,12)
                               SET K=K+1
                               SET $PIECE(L,U,12)=K
 +24                       SET @HDICNT=L
 +25      ; get unique mltf items
 +26                       SET @TMPCT@("M",LRMLTF)=""
                       End DoDot:2
               End DoDot:1
 +27       IF 'LRMLTF
               SET (LRMLTF,LRMLNM,LRMLAN,LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET,LRMLIDT,LRMLSTAT,LRMLLON)=""
 +28       DO LH663
           DO LB663
           DO LT663
           DO LT6001
 +29       GOTO LRS
 +30      ;
LQUIT     ; quit back
 +1        DO LT60P
           DO OT10143^HDISDOC
 +2        KILL @LTMP
 +3        KILL DA,DR,DIR,I,D,B,DIQ,DIC,ORDNM,ORIEN,ORIDT,ORST,PLIEN,PLNAME,PLPN,LT,LG,LB,LC,LRUN,LRIEN,LRNAME
 +4        KILL LRTYPE,LRDAT,LRDAP,LRSTAT,LRIDT,LRSPEC,LRSPN,LRSUN,LRSST,LRSIDT,LRMLTF,LRMLNM,LRMLAN,LRMLLON,LTMP
 +5        KILL LRMLCOM,LRMLPROP,LRMLTIM,LRMLSPEC,LRMLSCAL,LRMLMET,L60,LPRI,LE,LF,PNLNN
 +6        KILL LTCNT,BA,LRAA,AA,AR,AB,ABC
 +7        QUIT 
 +8       ;
PNLCK(LT) ; check for panel
 +1        NEW A,B,C,D,AA,AR,BA,BR
           SET A=0
 +2        if 'LT
               QUIT 
 +3        SET PNLNN(LT)=1
 +4        KILL AA
           DO LIST^DIC(60.02,","_LT_",","@;.01I","",,,,,,,"AA")
 +5        KILL AR
           MERGE AR=AA("DILIST","ID")
           KILL AA
 +6        SET A=$ORDER(AR(A))
           IF 'A
               SET @LTMP@(LT)=""
               QUIT 
 +7       ;<
           SET A=0
           FOR 
               SET A=$ORDER(AR(A))
               if 'A
                   QUIT 
               Begin DoDot:1
 +8                SET C=$GET(AR(A,.01))
                   if 'C
                       QUIT 
 +9       ; only have the test once for cycle of primary item
 +10               IF $GET(PNLNN(C))=1
                       QUIT 
 +11               SET PNLNN(C)=1
 +12               KILL BA
                   DO LIST^DIC(60.02,","_C_",","@;.01I","",,,,,,,"BA")
 +13               SET B=$ORDER(BA("DILIST","ID",0))
                   IF B
                       DO PNLCK(C)
 +14               SET @LTMP@(C)=""
               End DoDot:1
 +15       QUIT 
 +16      ;
CHKCHAR(A) ; check for ctrl chars, <, >, &, /
 +1        NEW B,C,I,L,M,N
 +2        IF A=""
               QUIT A
 +3        SET B=""
           FOR I=1:1:$LENGTH(A)
               SET C=$EXTRACT(A,I)
               Begin DoDot:1
 +4                SET M=$EXTRACT(A,(I+1))
 +5       ; skip set
                   IF $ASCII(C)<32!($ASCII(C)>126)
                       QUIT 
 +6                IF C="&"
                       SET N="'AND'"
                       SET B=B_N
                       QUIT 
 +7                IF C="<"
                       SET N="'LESS THAN'"
                       SET B=B_N
                       QUIT 
 +8                IF C=">"
                       SET N="'GREATER THAN'"
                       SET B=B_N
                       QUIT 
 +9       ;I C="/" S N="'FORWARD SLASH'",B=B_N Q
 +10               SET B=B_C
               End DoDot:1
               SET L=C
 +11       QUIT B
 +12      ;
GETLAB(LG) ; get lab test info
 +1        NEW A,B,C,D,DA,DR,DIQ
 +2        if 'LG
               QUIT 
 +3        SET DA=LG
           SET DIQ="LB"
           SET DIQ(0)="IE"
           SET DIC=60
           SET DR=".01;3;5;13;133;132"
           KILL ^UTILITY("DIQ1",$JOB)
           DO EN^DIQ1
           KILL ^UTILITY("DIQ1",$JOB)
 +4        KILL LC
           MERGE LC=LB(60,DA)
           KILL LB
 +5       ;
GETSPEC(LG,LS) ; get lab test specimen info
 +1        NEW A,B,C,D,DA,DR,DIQ
 +2        SET DIQ="LB"
           SET DIQ(0)="IE"
           SET DIC=60
           SET DR=100
           SET DA=+LG
           KILL LB,^UTILITY("DIQ1",$JOB)
 +3        SET DR(60.01)=".01;6;30;32;33"
           SET DA(60.01)=LS
 +4        DO EN^DIQ1
           KILL ^UTILITY("DIQ1",$JOB)
 +5        KILL LE
           MERGE LE=LB("60.01",LS)
           KILL LB
 +6        QUIT 
 +7       ;
GETMLTF(LM) ; get mltf info from file 66.3
 +1        NEW A,B,C,D,DA,DR,DIQ
 +2        if 'LM
               QUIT 
 +3        SET DA=LM
           SET DIQ="LB"
           SET DIQ(0)="IE"
           SET DIC=66.3
           SET DR=".01;.02;.04;.05;.06;.07;.08;.09;1"
           KILL ^UTILITY("DIQ1",$JOB)
           DO EN^DIQ1
           KILL ^UTILITY("DIQ1",$JOB)
 +4        KILL LF
           MERGE LF=LB(66.3,DA)
           KILL LB
 +5        QUIT 
 +6       ;
LH60P     ; header for primary item
 +1        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Primary_Order_Item>"
 +2        QUIT 
 +3       ;
LT60P     ; trailer for primary item
 +1        SET D=$$BTMP
           SET @TMP@(D)="</Lab_Primary_Order_Item>"
 +2        QUIT 
 +3       ;
LB60P     ; body for primary item
 +1        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Primary_Test_IEN>"_PLIEN_"</Lab_Primary_Test_IEN>"
 +2        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Primary_Test_Name>"_PLNAME_"</Lab_Primary_Test_Name>"
 +3        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Primary_Test_Panel>"_PLPN_"</Lab_Primary_Test_Panel>"
 +4        QUIT 
 +5       ;
LH60T     ; test header for file 60
 +1        SET D=$$BTMP
           SET @TMP@(D)="<Laboratory_Test_Item>"
 +2        QUIT 
 +3       ;
LT60T     ; test trailer for file 60
 +1        SET D=$$BTMP
           SET @TMP@(D)="</Laboratory_Test_Item>"
 +2        QUIT 
 +3       ;
LB60T     ; test body for file 60
 +1        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Test_IEN>"_LRIEN_"</Lab_Test_IEN>"
 +2        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Test_Name>"_LRNAME_"</Lab_Test_Name>"
 +3        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Test_Type>"_LRTYPE_"</Lab_Test_Type>"
 +4        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Test_Data_Location>"_LRDAT_"</Lab_Test_Data_Location>"
 +5        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Test_Data_Loc_Physical>"_LRDAP_"</Lab_Test_Data_Loc_Physical>"
 +6        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Test_Inactive_Date>"_LRIDT_"</Lab_Test_Inactive_Date>"
 +7        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Test_Status>"_LRSTAT_"</Lab_Test_Status>"
 +8        QUIT 
 +9       ;
LH6001    ; test specimen header for file 60.01
 +1        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Test_Specimen>"
 +2        QUIT 
 +3       ;
LT6001    ; test specimen trailer for file 60.01
 +1        SET D=$$BTMP
           SET @TMP@(D)="</Lab_Test_Specimen>"
 +2        QUIT 
 +3       ;
LB6001    ; test spceimen body for file 60.01
 +1        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Test_Specimen_IEN>"_LRSPEC_"</Lab_Test_Specimen_IEN>"
 +2        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Test_Specimen_Name>"_LRSPN_"</Lab_Test_Specimen_Name>"
 +3        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Test_Specimen_Units>"_LRSUN_"</Lab_Test_Specimen_Units>"
 +4        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Test_Specimen_Inactive_Date>"_LRSIDT_"</Lab_Test_Specimen_Inactive_Date>"
 +5        SET D=$$BTMP
           SET @TMP@(D)="<Lab_Test_Specimen_Status>"_LRSST_"</Lab_Test_Specimen_Status>"
 +6        QUIT 
 +7       ;
LH663     ; header for mltf 66.3
 +1        SET D=$$BTMP
           SET @TMP@(D)="<Master_Lab_Test_Item>"
 +2        QUIT 
 +3       ;
LT663     ;trailer for mltf 66.3
 +1        SET D=$$BTMP
           SET @TMP@(D)="</Master_Lab_Test_Item>"
 +2        QUIT 
 +3       ;
LB663     ; body for mltf 66.3
 +1        SET D=$$BTMP
           SET @TMP@(D)="<Master_Lab_Test_IEN>"_LRMLTF_"</Master_Lab_Test_IEN>"
 +2        SET D=$$BTMP
           SET @TMP@(D)="<Master_Lab_Test_Name>"_LRMLNM_"</Master_Lab_Test_Name>"
 +3        SET D=$$BTMP
           SET @TMP@(D)="<Master_Lab_Test_Alternate_Name>"_LRMLAN_"</Master_Lab_Test_Alternate_Name>"
 +4        SET D=$$BTMP
           SET @TMP@(D)="<Master_Lab_Test_Inactive_Date>"_LRMLIDT_"</Master_Lab_Test_Inactive_Date>"
 +5        SET D=$$BTMP
           SET @TMP@(D)="<Master_Lab_Test_Status>"_LRMLSTAT_"</Master_Lab_Test_Status>"
 +6        SET D=$$BTMP
           SET @TMP@(D)="<Master_Lab_Test_LOINC_Code>"_LRMLLON_"</Master_Lab_Test_LOINC_Code>"
 +7        SET D=$$BTMP
           SET @TMP@(D)="<Master_Lab_Test_Component>"_LRMLCOM_"</Master_Lab_Test_Component>"
 +8        SET D=$$BTMP
           SET @TMP@(D)="<Master_Lab_Test_Property>"_LRMLPROP_"</Master_Lab_Test_Property>"
 +9        SET D=$$BTMP
           SET @TMP@(D)="<Master_Lab_Test_Time_Aspect>"_LRMLTIM_"</Master_Lab_Test_Time_Aspect>"
 +10       SET D=$$BTMP
           SET @TMP@(D)="<Master_Lab_Test_Specimen>"_LRMLSPEC_"</Master_Lab_Test_Specimen>"
 +11       SET D=$$BTMP
           SET @TMP@(D)="<Master_Lab_Test_Scale>"_LRMLSCAL_"</Master_Lab_Test_Scale>"
 +12       SET D=$$BTMP
           SET @TMP@(D)="<Master_Lab_Test_Method>"_LRMLMET_"</Master_Lab_Test_Method>"
 +13       QUIT