LA7UTIL ;DALISC/JRR - Utilities for Messenger
 ;;5.2;AUTOMATED LAB INSTRUMENTS;**17,42**;Sep 27, 1994
CPT(X) N LA7,LA7CNT,Y
 K ^TMP("LA",$J) S LA7CNT=0
 F LA7=0:0 S LA7=$O(^LAB(64.4,LA7)) Q:'LA7  D
 . I ^LAB(64.4,LA7,0)[X S LA7CNT=LA7CNT+1 S ^TMP("LA",$J,LA7CNT)=LA7
 . ;KAT  ADDED FULL GLOBAL REFERENCE ^LAB(64.4,LA7,0) VS ^(LA7,0)
 I '$O(^TMP("LA",$J,0)) W "  ???" K X,LA7,^TMP("LA",$J) QUIT
 S X=""
 F LA7=0:0 S LA7=$O(^TMP("LA",$J,LA7)) Q:'LA7  D  Q:X!(LA7="")
 . S LA7(0)=^LAB(64.4,^TMP("LA",$J,LA7),0)
 . W !,?5,$J("("_LA7_") ",6),$P(LA7(0),"^"),?22,$TR($P(LA7(0),"^",2,99),"^","   ")
 . I (LA7#10=0)!('$O(^TMP("LA",$J,LA7))) D
 . . K DIR S DIR(0)="NOA^0:"_LA7,DIR("A")="Select [1-"_LA7_"]: "
 . . D ^DIR
 . . I X!$D(DUOUT)!$D(DTOUT) S LA7=""
 I X S X=$P(^LAB(64.4,^TMP("LA",$J,X),0),"^")
 I 'X K X
 K DIR,DTOUT,DUOUT,^TMP("LA",$J)
 QUIT
 ;
BU2 N J,S1,T,X
 S (J,S1)=0,(T,X)=LA7
 D TREE
 QUIT
TREE I '$D(^LAB(60,X,0)) Q  ;BAD LRTEST NUMBER;
 I $P(^LAB(60,X,0),U,5)]"",$D(^TMP("LA7TREE",$J,X,X)) S ^TMP("LA7TREE",$J,T,X)=^TMP("LA7TREE",$J,X,X)
 ;KAT ADDED FULL GLOBAL REFERENCE ^LAB(60,X,0) VS $P(^(0),U,5)
 Q:'$D(^LAB(60,X,2,0))  Q:$O(^(0))<1  ;NOT A PANEL
 S S1=S1+1,S1(S1)=X,J1(S1)=J
 F J=0:0 S J=$O(^LAB(60,S1(S1),2,J)) Q:J<1  S X=^(J,0) D TREE
 S J=J1(S1),X=S1(S1),S1=S1-1
 Q
UNWIND(LA760) ;unwind one panel, calls itself recursively to unwind all
 ;panels within other panels.  Returns all atomic tests in ^TMP global.
 ;Calling routine is responsible for killing ^TMP("LA7TREE" before and
 ;after the call.
 Q:$G(LA7TREEN)>999  ;recursive panel, caught in loop
 Q:'$D(^LAB(60,LA760,0))
 S ^TMP("LA7TREE",$J,LA760)=""
 S LA7TREEN=$G(LA7TREEN)+1
 Q:'$D(^LAB(60,LA760,2,0))  Q:$O(^(0))<1
 N I,II
 F I=0:0 S I=$O(^LAB(60,LA760,2,I)) Q:'I  D
 .  S II=+$G(^LAB(60,LA760,2,I,0)) I II D UNWIND(II)
 QUIT
PRETTY(LA76249) ;Store an HL7 message text in pretty print format, stored in 
 ;^TMP("LA7PRETTY",$J,.  Required variable is LA76249 = pointer to 
 ;^LAHM(62.49), passed as parameter.
 ;
 K ^TMP("LA7PRETTY",$J)
 Q:'$D(^LAHM(62.49,LA76249,0))
 Q:'$D(^LAHM(62.49,LA76249,150,1,0))
 N LA7,LA7624,LA7FS,LA7INST,X,Y,Z,%
 S LA7=$P(^LAHM(62.49,LA76249,0),"^",2)
 S LA7FS=$E($G(^LAHM(62.49,LA76249,150,1,0)),4)
 S:LA7FS="" ^TMP("LA7PRETTY",$J,2)="<Bad Message Header>"
 Q:LA7FS=""
 G:LA7="O" PRETOUT
 G:LA7="I" PRETIN
 QUIT
PRETIN S ^TMP("LA7PRETTY",$J,1)="Result received from "
 S LA7INST=$P(^LAHM(62.49,LA76249,0),"^",6)
 I LA7INST="" D
 . F LA7=0:0 S LA7=$O(^LAHM(62.49,LA76240,150,LA7)) Q:LA7=""  D
 . . S Z=$G(^LAHM(62.49,LA76249,150,LA7,0))
 . . Q:Z=""!($E(Z,1,3)'="OBR")
 . . S LA7INST=$P(Z,LA7FS,19)
 S ^LAHM(62.49,LA76240,150,1)=^TMP("LA7PRETTY",$J,1)_LA7INST
 ;KAT ADDED ^LAHM(62.49,LA76240,150,LA7 VS ^(1)
 S Y=$P(^LAHM(62.49,LA76249,0),"^",5)
 D DD^%DT
 S ^LAHM(62.49,LA76249,1)=^TMP("LA7PRETTY",$J,1)_",  "_Y
 ;KAT ADDED ^LAHM(62.49,LA76249 VS ^(1)
 S LA7624=$O(^LAB(62.4,"B",LA7INST,0))
 F LA7=0:0 S LA7=$O(^LAHM(62.49,LA76249,150,LA7)) Q:LA7=""  D
 . S X=$G(^LAHM(62.49,LA76249,150,LA7,0))
 . Q:(X="")!($E(X,1,3)'="PID")  ;find PID segment for SSN
 . S Y=+$P(X,LA7FS,4) ;get ssn
 . S Z=Y
 . S Y=+$O(^DPT("SSN",Y,0)) ;get dfn
 . S ^TMP("LA7PRETTY",$J,2)="Patient: "_$P($G(^DPT(Y,0)),"^")_"   SSN: "_Z
 Q
PRETOUT ;
 ;
LOG ;Print the error log which is stored in ^XTMP.  Errors are logged
 ;only if the Debug Log field is turned on in 62.48
 N LA7,LA76249,LA7DT,LA7TM,LA7TXT,LA7XTMP
 D DT^DICRW
 S LA7XTMP="LA7"_DT
 I '$O(^XTMP(LA7XTMP,0)) W !!,?5,"Nothing logged for Today!"
 K DIR
 S DIR("A")="Look at log for what date? "
 S DIR("B")="TODAY"
 S DIR("?")="^D HELP^%DTC"
 S DIR(0)="DA^:DT:EX"
 D ^DIR
 Q:$D(DIRUT)
 S LA7XTMP="LA7"_Y
 I '$O(^XTMP(LA7XTMP,0)) D  G LOG
 . W !!,?5,"Nothing logged for " X ^DD("DD") W Y
 S LA7TM=""
 F  S LA7TM=$O(^XTMP(LA7XTMP,LA7TM),-1) Q:LA7TM=0  D  Q:LA7QUIT
 . S LA7QUIT=0
 . I $Y>(IOSL-3) D  W @IOF Q:LA7QUIT
 . . I "Pp"'[$E(IOST) K DIR S DIR(0)="E" D ^DIR I 'Y S LA7QUIT=1 Q
 . S LA7=$E(LA7XTMP,4,10)
 . W:$X !! W $E(LA7,4,5),"/",$E(LA7,6,7)
 . W "@",$E(LA7TM,1,4)_$E("0000",$L($E(LA7TM,1,4)),3)," "
 . W $P(^XTMP(LA7XTMP,LA7TM),"^",2)," " S X=$P($P(^(LA7TM),"^",3),":")
 . F LA7=1:1:$L(X," ") S Y=$P(X," ",LA7) W:($L(Y)+$X+1)>IOM ! W " ",Y
 Q
 ;
CADT(LA7AA) ; Calculate current accession date based on accession area transform
 ; Call with LA7AA = ien of accession area
 N LA7AD,X
 S DT=$$DT^XLFDT
 S X=$P($G(^LRO(68,+$G(LA7AA),0)),"^",3) ; Accession transform
 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) ; Calculate date
 Q LA7AD
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HLA7UTIL   4680     printed  Sep 23, 2025@19:15:55                                                                                                                                                                                                     Page 2
LA7UTIL   ;DALISC/JRR - Utilities for Messenger
 +1       ;;5.2;AUTOMATED LAB INSTRUMENTS;**17,42**;Sep 27, 1994
CPT(X)     NEW LA7,LA7CNT,Y
 +1        KILL ^TMP("LA",$JOB)
           SET LA7CNT=0
 +2        FOR LA7=0:0
               SET LA7=$ORDER(^LAB(64.4,LA7))
               if 'LA7
                   QUIT 
               Begin DoDot:1
 +3                IF ^LAB(64.4,LA7,0)[X
                       SET LA7CNT=LA7CNT+1
                       SET ^TMP("LA",$JOB,LA7CNT)=LA7
 +4       ;KAT  ADDED FULL GLOBAL REFERENCE ^LAB(64.4,LA7,0) VS ^(LA7,0)
               End DoDot:1
 +5        IF '$ORDER(^TMP("LA",$JOB,0))
               WRITE "  ???"
               KILL X,LA7,^TMP("LA",$JOB)
               QUIT 
 +6        SET X=""
 +7        FOR LA7=0:0
               SET LA7=$ORDER(^TMP("LA",$JOB,LA7))
               if 'LA7
                   QUIT 
               Begin DoDot:1
 +8                SET LA7(0)=^LAB(64.4,^TMP("LA",$JOB,LA7),0)
 +9                WRITE !,?5,$JUSTIFY("("_LA7_") ",6),$PIECE(LA7(0),"^"),?22,$TRANSLATE($PIECE(LA7(0),"^",2,99),"^","   ")
 +10               IF (LA7#10=0)!('$ORDER(^TMP("LA",$JOB,LA7)))
                       Begin DoDot:2
 +11                       KILL DIR
                           SET DIR(0)="NOA^0:"_LA7
                           SET DIR("A")="Select [1-"_LA7_"]: "
 +12                       DO ^DIR
 +13                       IF X!$DATA(DUOUT)!$DATA(DTOUT)
                               SET LA7=""
                       End DoDot:2
               End DoDot:1
               if X!(LA7="")
                   QUIT 
 +14       IF X
               SET X=$PIECE(^LAB(64.4,^TMP("LA",$JOB,X),0),"^")
 +15       IF 'X
               KILL X
 +16       KILL DIR,DTOUT,DUOUT,^TMP("LA",$JOB)
 +17       QUIT 
 +18      ;
BU2        NEW J,S1,T,X
 +1        SET (J,S1)=0
           SET (T,X)=LA7
 +2        DO TREE
 +3        QUIT 
TREE      ;BAD LRTEST NUMBER;
           IF '$DATA(^LAB(60,X,0))
               QUIT 
 +1        IF $PIECE(^LAB(60,X,0),U,5)]""
               IF $DATA(^TMP("LA7TREE",$JOB,X,X))
                   SET ^TMP("LA7TREE",$JOB,T,X)=^TMP("LA7TREE",$JOB,X,X)
 +2       ;KAT ADDED FULL GLOBAL REFERENCE ^LAB(60,X,0) VS $P(^(0),U,5)
 +3       ;NOT A PANEL
           if '$DATA(^LAB(60,X,2,0))
               QUIT 
           if $ORDER(^(0))<1
               QUIT 
 +4        SET S1=S1+1
           SET S1(S1)=X
           SET J1(S1)=J
 +5        FOR J=0:0
               SET J=$ORDER(^LAB(60,S1(S1),2,J))
               if J<1
                   QUIT 
               SET X=^(J,0)
               DO TREE
 +6        SET J=J1(S1)
           SET X=S1(S1)
           SET S1=S1-1
 +7        QUIT 
UNWIND(LA760) ;unwind one panel, calls itself recursively to unwind all
 +1       ;panels within other panels.  Returns all atomic tests in ^TMP global.
 +2       ;Calling routine is responsible for killing ^TMP("LA7TREE" before and
 +3       ;after the call.
 +4       ;recursive panel, caught in loop
           if $GET(LA7TREEN)>999
               QUIT 
 +5        if '$DATA(^LAB(60,LA760,0))
               QUIT 
 +6        SET ^TMP("LA7TREE",$JOB,LA760)=""
 +7        SET LA7TREEN=$GET(LA7TREEN)+1
 +8        if '$DATA(^LAB(60,LA760,2,0))
               QUIT 
           if $ORDER(^(0))<1
               QUIT 
 +9        NEW I,II
 +10       FOR I=0:0
               SET I=$ORDER(^LAB(60,LA760,2,I))
               if 'I
                   QUIT 
               Begin DoDot:1
 +11               SET II=+$GET(^LAB(60,LA760,2,I,0))
                   IF II
                       DO UNWIND(II)
               End DoDot:1
 +12       QUIT 
PRETTY(LA76249) ;Store an HL7 message text in pretty print format, stored in 
 +1       ;^TMP("LA7PRETTY",$J,.  Required variable is LA76249 = pointer to 
 +2       ;^LAHM(62.49), passed as parameter.
 +3       ;
 +4        KILL ^TMP("LA7PRETTY",$JOB)
 +5        if '$DATA(^LAHM(62.49,LA76249,0))
               QUIT 
 +6        if '$DATA(^LAHM(62.49,LA76249,150,1,0))
               QUIT 
 +7        NEW LA7,LA7624,LA7FS,LA7INST,X,Y,Z,%
 +8        SET LA7=$PIECE(^LAHM(62.49,LA76249,0),"^",2)
 +9        SET LA7FS=$EXTRACT($GET(^LAHM(62.49,LA76249,150,1,0)),4)
 +10       if LA7FS=""
               SET ^TMP("LA7PRETTY",$JOB,2)="<Bad Message Header>"
 +11       if LA7FS=""
               QUIT 
 +12       if LA7="O"
               GOTO PRETOUT
 +13       if LA7="I"
               GOTO PRETIN
 +14       QUIT 
PRETIN     SET ^TMP("LA7PRETTY",$JOB,1)="Result received from "
 +1        SET LA7INST=$PIECE(^LAHM(62.49,LA76249,0),"^",6)
 +2        IF LA7INST=""
               Begin DoDot:1
 +3                FOR LA7=0:0
                       SET LA7=$ORDER(^LAHM(62.49,LA76240,150,LA7))
                       if LA7=""
                           QUIT 
                       Begin DoDot:2
 +4                        SET Z=$GET(^LAHM(62.49,LA76249,150,LA7,0))
 +5                        if Z=""!($EXTRACT(Z,1,3)'="OBR")
                               QUIT 
 +6                        SET LA7INST=$PIECE(Z,LA7FS,19)
                       End DoDot:2
               End DoDot:1
 +7        SET ^LAHM(62.49,LA76240,150,1)=^TMP("LA7PRETTY",$JOB,1)_LA7INST
 +8       ;KAT ADDED ^LAHM(62.49,LA76240,150,LA7 VS ^(1)
 +9        SET Y=$PIECE(^LAHM(62.49,LA76249,0),"^",5)
 +10       DO DD^%DT
 +11       SET ^LAHM(62.49,LA76249,1)=^TMP("LA7PRETTY",$JOB,1)_",  "_Y
 +12      ;KAT ADDED ^LAHM(62.49,LA76249 VS ^(1)
 +13       SET LA7624=$ORDER(^LAB(62.4,"B",LA7INST,0))
 +14       FOR LA7=0:0
               SET LA7=$ORDER(^LAHM(62.49,LA76249,150,LA7))
               if LA7=""
                   QUIT 
               Begin DoDot:1
 +15               SET X=$GET(^LAHM(62.49,LA76249,150,LA7,0))
 +16      ;find PID segment for SSN
                   if (X="")!($EXTRACT(X,1,3)'="PID")
                       QUIT 
 +17      ;get ssn
                   SET Y=+$PIECE(X,LA7FS,4)
 +18               SET Z=Y
 +19      ;get dfn
                   SET Y=+$ORDER(^DPT("SSN",Y,0))
 +20               SET ^TMP("LA7PRETTY",$JOB,2)="Patient: "_$PIECE($GET(^DPT(Y,0)),"^")_"   SSN: "_Z
               End DoDot:1
 +21       QUIT 
PRETOUT   ;
 +1       ;
LOG       ;Print the error log which is stored in ^XTMP.  Errors are logged
 +1       ;only if the Debug Log field is turned on in 62.48
 +2        NEW LA7,LA76249,LA7DT,LA7TM,LA7TXT,LA7XTMP
 +3        DO DT^DICRW
 +4        SET LA7XTMP="LA7"_DT
 +5        IF '$ORDER(^XTMP(LA7XTMP,0))
               WRITE !!,?5,"Nothing logged for Today!"
 +6        KILL DIR
 +7        SET DIR("A")="Look at log for what date? "
 +8        SET DIR("B")="TODAY"
 +9        SET DIR("?")="^D HELP^%DTC"
 +10       SET DIR(0)="DA^:DT:EX"
 +11       DO ^DIR
 +12       if $DATA(DIRUT)
               QUIT 
 +13       SET LA7XTMP="LA7"_Y
 +14       IF '$ORDER(^XTMP(LA7XTMP,0))
               Begin DoDot:1
 +15               WRITE !!,?5,"Nothing logged for "
                   XECUTE ^DD("DD")
                   WRITE Y
               End DoDot:1
               GOTO LOG
 +16       SET LA7TM=""
 +17       FOR 
               SET LA7TM=$ORDER(^XTMP(LA7XTMP,LA7TM),-1)
               if LA7TM=0
                   QUIT 
               Begin DoDot:1
 +18               SET LA7QUIT=0
 +19               IF $Y>(IOSL-3)
                       Begin DoDot:2
 +20                       IF "Pp"'[$EXTRACT(IOST)
                               KILL DIR
                               SET DIR(0)="E"
                               DO ^DIR
                               IF 'Y
                                   SET LA7QUIT=1
                                   QUIT 
                       End DoDot:2
                       WRITE @IOF
                       if LA7QUIT
                           QUIT 
 +21               SET LA7=$EXTRACT(LA7XTMP,4,10)
 +22               if $X
                       WRITE !!
                   WRITE $EXTRACT(LA7,4,5),"/",$EXTRACT(LA7,6,7)
 +23               WRITE "@",$EXTRACT(LA7TM,1,4)_$EXTRACT("0000",$LENGTH($EXTRACT(LA7TM,1,4)),3)," "
 +24               WRITE $PIECE(^XTMP(LA7XTMP,LA7TM),"^",2)," "
                   SET X=$PIECE($PIECE(^(LA7TM),"^",3),":")
 +25               FOR LA7=1:1:$LENGTH(X," ")
                       SET Y=$PIECE(X," ",LA7)
                       if ($LENGTH(Y)+$X+1)>IOM
                           WRITE !
                       WRITE " ",Y
               End DoDot:1
               if LA7QUIT
                   QUIT 
 +26       QUIT 
 +27      ;
CADT(LA7AA) ; Calculate current accession date based on accession area transform
 +1       ; Call with LA7AA = ien of accession area
 +2        NEW LA7AD,X
 +3        SET DT=$$DT^XLFDT
 +4       ; Accession transform
           SET X=$PIECE($GET(^LRO(68,+$GET(LA7AA),0)),"^",3)
 +5       ; Calculate date
           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)
 +6        QUIT LA7AD