PSJHLU ;BIR/RLW - UTILITIES USED IN BUILDING HL7 SEGMENTS ;4/24/12 2:52pm
 ;;5.0;INPATIENT MEDICATIONS;**1,56,72,102,134,181,267,285,317,339,364,446**;16 DEC 97;Build 1
 ;
 ; Reference to ^PS(52.6 is supported by DBIA# 1231.
 ; Reference to ^PS(52.7 is supported by DBIA# 2173.
 ; Reference to ^VA(200 is supported by DBIA 10060.
 ; Reference to ^PS(55 is supported by DBIA# 2191.
 ;
 ;*267 Change NTE|21 so it can send over the Long Wp Special Inst/
 ;     Other Prt Info fields if populated.
 ;*364 Add HAZ Handle & Haz Dispose flags to new ZZZ segment for BCBU
 ;*446 Fix infusion rate evaluation in ENI tag to determine when to add
 ;     "ml/hr". Continuous orders with rate < 1 were adding extra "ml/hr".
 ;
INIT ; set up HL7 application variables
 S PSJHLSDT="PS",PSJHINST=$P($$SITE^VASITE(),"^")
 S PSJCLEAR="K FIELD F J=0:1:LIMIT S FIELD(J)="""""
 Q
 ;
SEGMENT(LIMIT) ;
 K SEGMENT
 N SUBSEG,SEGLENGT S SUBSEG=0,SEGMENT="" F J=0:1:LIMIT D
 .I SEGMENT']"" S SEGMENT=FIELD(J) Q
 .S SEGMENT=SEGMENT_"|"_FIELD(J)
 F  S SEGLENGT=$L(SEGMENT) D  Q:$L(SEGMENT)'>246
 .I SEGLENGT'>246 S SEGMENT(SUBSEG)=SEGMENT
 .I SEGLENGT>245 S SEGMENT(SUBSEG)=$E(SEGMENT,1,245),SUBSEG=SUBSEG+1 D
 ..S SEGMENT=$E(SEGMENT,246,SEGLENGT),SEGMENT(SUBSEG)=$E(SEGMENT,1,245)
SET S PSJI=PSJI+1,^TMP("PSJHLS",$J,PSJHLSDT,PSJI)=SEGMENT(0)
 F J=1:1 Q:'$D(SEGMENT(J))  S ^TMP("PSJHLS",$J,PSJHLSDT,PSJI,J)=SEGMENT(J)
 Q
 ;
SEGMENT2 ; Retrieve text fields
 K SEGMENT S JJ=0 F  S JJ=$O(@(PSJORDER_"12,"_JJ_")")) Q:'JJ  S SEGMENT(JJ-1)=$G(@(PSJORDER_"12,"_JJ_",0)"))
 I $D(SEGMENT(0)) S SEGMENT(0)="NTE|6|L|"_$S($G(PSJBCBU):SEGMENT(0),1:$$ESC^ORHLESC(SEGMENT(0))) D
 .D SET^PSJHLU K SEGMENT,JJ
 ;build NTE 21 with Special Inst/Other Prt Info Wp fields  *267
 N QQ K ^TMP("PSJBCMA5",$J)
 D GETSIOPI^PSJBCMA5(PSJHLDFN,RXORDER,1)
 I RXORDER["V"!(RXORDER["U") I ($G(PSJORD)["P"),($P($G(^PS(53.1,+PSJORD,0)),"^",25)=RXORDER) D
 .D GETSIOPI^PSJBCMA5(PSJHLDFN,PSJORD,1)
 .N LINES,TEXT1 S LINES=($G(^TMP("PSJBCMA5",$J,PSJHLDFN,PSJORD))),TEXT1=$G(^TMP("PSJBCMA5",$J,PSJHLDFN,PSJORD,1))
 .I LINES<1!(LINES=1&(TEXT1["Instructions too long. See Order View or BCMA for full text")) Q
 .K ^TMP("PSJBCMA5",$J,PSJHLDFN,RXORDER) M ^TMP("PSJBCMA5",$J,PSJHLDFN,RXORDER)=^TMP("PSJBCMA5",$J,PSJHLDFN,PSJORD) K ^TMP("PSJBCMA5",$J,PSJHLDFN,PSJORD)
 F QQ=0:0 S QQ=$O(^TMP("PSJBCMA5",$J,PSJHLDFN,RXORDER,QQ)) Q:'QQ  D
 .I QQ=1 D  Q
 ..S SEGMENT(0)="NTE|21|L|"_$$ESC^ORHLESC(^TMP("PSJBCMA5",$J,PSJHLDFN,RXORDER,QQ))
 ..S:$G(PSJBCBU) SEGMENT(0)=SEGMENT(0)_"\.br\"
 .S SEGMENT(QQ-1)=$$ESC^ORHLESC(^TMP("PSJBCMA5",$J,PSJHLDFN,RXORDER,QQ))
 .S:$G(PSJBCBU) SEGMENT(QQ-1)=SEGMENT(QQ-1)_"\.br\"
 I $D(SEGMENT(0)) D SET^PSJHLU K SEGMENT,^TMP("PSJBCMA5",$J)
 ;*267 end
 Q
 ;
CALL(HLEVN) ; call DHCP HL7 package -or- protocol, to pass Orders
 ; HLEVN = number of segments in message
 ;*317
 N PADE,PDTYP S PADE=0,PDTYP=""
 I PSJORDER["^PS(55," D
 . I $O(XQORMSG(0))&((PSOC="DR")!(PSOC="OD")) S PADE=1,PDTYP=PSOC Q
 . I '$O(XQORMSG(0)) D
 .. N PD0,PD1 S PD0=$G(@(PSJORDER_"0)"))
 .. S PD1=$S(RXORDER["V":$P(PD0,"^",17),1:$P(PD0,"^",9)) Q:PD1=""
 .. I ",A,D,H,"[(","_$E(PD1)_",") S PADE=1,PDTYP=PSOC
 K CLERK,DDIEN,DDNUM,DOSEFORM,DOSEOR,FIELD,IVTYPE,LIMIT,NAME,NDNODE,NODE1,NODE2,PRODNAME,PROVIDER,PSGS0Y,PSJHINST,PSJHLSDT,PSJI,PSOC,PSREASON,ROOMBED,SPDIEN,SEGMENT,%   ;*364 move kill PSJORDER to later for PADE
 I $G(PSJBCBU)=1 M PSJNAME=^TMP("PSJHLS",$J,"PS") Q
 S PSJMSG="^TMP(""PSJHLS"",$J,""PS"")"
 I PADE N RXO,PDMSG S RXO=RXORDER_$S(+RXORDER=RXORDER:"U",1:"") M PDMSG=^TMP("PSJHLS",$J,"PS")  ;*317
 D MSG^XQOR("PS EVSEND OR",.PSJMSG)
 I PADE D PDORD^PSJPDCLU  ;*317
 I $G(RXORDER),$G(PSJHLDFN) N PSJSTOP S PSJSTOP=$S(RXORDER["U":$P(^PS(55,PSJHLDFN,5,+RXORDER,2),"^",4),RXORDER["V":$P(^PS(55,PSJHLDFN,"IV",+RXORDER,0),"^",3),1:"") I PSJSTOP D
 .N PSJSTATU S PSJSTATU=$S(RXORDER["U":$P(^PS(55,PSJHLDFN,5,+RXORDER,0),"^",9),RXORDER["V":$P(^PS(55,PSJHLDFN,"IV",+RXORDER,0),"^",17),1:"")
 .I ",A,H,"[(","_PSJSTATU_",") D NOW^%DTC I PSJSTOP'>% N RXON S RXON=RXORDER D EXPIR^PSJHL6
 K PSJORDER            ;*364 moved to here
 Q
 ;
IVTYPE(PSJORDER) ; check whether a back-door order is Inpatient IV or IV fluid
 I RXORDER["V",$P($G(@(PSJORDER_"0)")),"^",4)'="A" Q "I"
 I RXORDER["P" I $P($G(@(PSJORDER_"0)")),"^",4)'="F" S IVTYPE="" Q IVTYPE
 N SUB,AD,SOL,IVTYPE,NODE1 S SUB=0,IVTYPE="F"
 ;naked reference on line below refers to the full indirect reference of PSJORDER_ which is from ^PS(55,DFN,"IV",PSJORD
 F TYPE="AD","SOL" S SUB=0 F  S SUB=$O(@(PSJORDER_""""_TYPE_""""_","_SUB_")")) Q:(SUB="")!(IVTYPE="I")  S NODE1=$G(^(SUB,0)) Q:NODE1=""  D  Q:IVTYPE="I"
 .I TYPE="AD" D
 ..I '$P($G(^PS(52.6,$P(NODE1,"^"),0)),"^",13) S IVTYPE="I"
 .D:TYPE="SOL"
 ..S:'$P($G(^PS(52.7,$P(NODE1,"^"),0)),"^",13) IVTYPE="I"
 Q IVTYPE
ENI ;Calculate Frequency for IV orders
 N INFUSE
 I X?.E1L.E S INFUSE=$$ENLU^PSGMI(X) Q:(INFUSE="TITRATE")!(INFUSE="BOLUS")!($P(INFUSE," ")="INFUSE")!($P(INFUSE," ")="Infuse")
 Q:(X="TITRATE")!(X="BOLUS")!($P(X," ")="INFUSE")!($P(X," ")="Infuse")
 Q:$$INTRMT(X)
 K:$L(X)<1!($L(X)>30)!(X["""")!($A(X)=45) X I '$D(X) Q
 I X["=" D  Q   ; NOIS LOU-0501-42191
 .N X2,X1 S X1=$P(X,"="),X2=$P(X,"=",2)
 .I X1["ML/HR",(+X1=$P(X1,"ML/HR"))!(+X1=$P(X1," ML/HR")) D
 ..S X1=$TR(X1,"ML/HR","ml/hr")
 .I X2["ML/HR",(+X2=$P(X2,"ML/HR"))!(+X2=$P(X2," ML/HR")) D
 ..S X2=$TR(X2,"ML/HR","ml/hr")
 .I X1[" ml/hr",(+X1=$P(X1," ml/hr")) D
 ..S X1=$P(X1," ml/hr")_$P(X1," ml/hr",2,9999)
 .I X2[" ml/hr",(+X2=$P(X2," ml/hr")) D
 ..S X2=$P(X2," ml/hr")_$P(X2," ml/hr",2,9999)
 .I X1["ml/hr",(+X1=$P(X1,"ml/hr")) D
 ..S X1=$P(X1,"ml/hr")_$P(X1,"ml/hr",2,9999)
 .I X2["ml/hr",(+X2=$P(X2,"ml/hr")) D
 ..S X2=$P(X2,"ml/hr")_$P(X2,"ml/hr",2,9999)
 .I X2'=+X2 D
 ..I ($P(X2,"@",2,999)'=+$P(X2,"@",2,999)!(+$P(X2,"@",2,999)<0)) K X Q
 .I X1=+X1 S X1=X1_" ml/hr"
 .I X2=+X2 S X2=X2_" ml/hr"
 .S:$P(X2,"@")=+X2 $P(X2,"@")=$P(X2,"@")_" ml/hr"
 .S X=X1_"="_X2
 ;*285 - Allow for decimals with trailing zeroes
 I X'?.N.1".".N,($P($TR(X," ml/hr",""),"@",2,999)'=+$P($TR(X," ml/hr",""),"@",2,999)!(+$P(X,"@",2,999)<0)),($P(X," ml/hr")'?.N.1".".N!(+$P(X," ml/hr")<0)) Q:(X>0&($E(X)=0))  K X Q
 ; *446 - Fix infusion rate evaluation below
 ; I X=+X!(X>0&($E(X)=0)) S:$S(X'["ml/hr":0,X["@":0,1:1) X=X_" ml/hr" D SPSOL S FREQ=$S('X:0,1:SPSOL\X*60+(SPSOL#X/X*60+.5)\1) K SPSOL Q
 I (X=+X)!(X>0&($E(X)=0)) S X=$S(((X'["ml/hr")&(X'["@")):X_" ml/hr",1:X) D SPSOL S FREQ=$S('X:0,1:SPSOL\X*60+(SPSOL#X/X*60+.5)\1) K SPSOL Q
 ; *446 End
 I X[" ml/hr" D SPSOL S FREQ=$S('X:0,1:SPSOL\X*60+(SPSOL#X/X*60+.5)\1) K SPSOL Q
 S SPSOL=$P(X,"@",2) S:$P(X,"@")=+X $P(X,"@")=$P(X,"@")_" ml/hr" S FREQ=$S('SPSOL:0,1:1440/SPSOL\1) K SPSOL
 Q
SPSOL S SPSOL=+TVOLUME Q
INTRMT(X) ;
 Q:'$P(X," ") 0
 Q:$P(X," ",2)="Minutes" 1
 Q:$P(X," ",2)="Hours" 1
 Q 0
IVCAT(DFN,PSJORD,PARRAY) ; This returns the IV CATEGORY based on the IV TYPE and CHEMO TYPE (not what is already in the IV CATEGORY field)
 ;  Passed in:  PSJORDER (file root of order)
 N NODE,TYP,CHEMTYP,INTSYR,ND2P5
 S (CHEMTYP,INTSYR)=""
 S TYP=$G(P(4)),INTSYR=$G(P(5)),CHEMTYP=$G(P(23))
 I TYP="",$G(PSJORD)["V" S NODE=$G(^PS(55,DFN,"IV",+PSJORD,0)) S TYP=$P(NODE,"^",4),INTSYR=$P(NODE,"^",5),CHEMTYP=$P(NODE,"^",23)
 I TYP="",$G(PSJORD)["P" S NODE=$G(^PS(53.1,+PSJORD,8)) S TYP=$P(NODE,"^"),INTSYR=$P(NODE,"^",4),CHEMTYP=$P(NODE,"^",2)
 I TYP="" S TYP=$G(PARRAY(4)),INTSYR=$G(PARRAY(5)),CHEMTYP=$G(PARRAY(23))
 Q:$G(TYP)="" ""
 S CAT=$S(",A,H,"[(","_TYP_","):"C",TYP="C"&(",A,H,S,"[(","_CHEMTYP_",")&'INTSYR):"C",TYP="C"&(CHEMTYP="P"):"I",TYP="S"&'INTSYR:"C",TYP="P":"I",$G(INTSYR):"I",1:"")
 Q CAT
ZRX ; Perform outbound processing
 N NODE1
 S NODE1=$G(@(PSJORDER_"0)"))
 S LIMIT=6 X PSJCLEAR
 S FIELD(0)="ZRX"
 I '$G(PSJREN) N PREON,PSJREN I $G(PSJORD)["U"&($P(NODE1,"^",24)="R") S PSJREN=1
 I $G(PSJORD)["V"&($P(NODE2,"^",8)="R") S PSJREN=1
 S PREON=$S($G(PSJREN):$G(PSJORD),PSJORDER["IV":$P(NODE2,"^",5),1:$P(NODE1,"^",25))
 S FIELD(1)=$S(PREON["P":$P($G(^PS(53.1,+PREON,0)),"^",21),PREON["V":$P($G(^PS(55,PSJHLDFN,"IV",+PREON,0)),"^",21),1:$P($G(^PS(55,PSJHLDFN,5,+PREON,0)),"^",21))
 S FIELD(2)=$S(PSJORDER["IV":$G(P("NAT")),1:$G(PSJNOO))
 S FIELD(3)=$S($G(PSJREN):"R",PSJORDER["IV":$P(NODE2,"^",8),1:$P(NODE1,"^",24))
 I FIELD(3)="" I PSOC="SN" S FIELD(3)="N"
 I $D(P)>1 S FIELD(6)=$$IVCAT^PSJHLU(PSJHLDFN,RXORDER,.P)
 S NAME=$P($G(^VA(200,DUZ,0)),"^")
 S FIELD(5)=DUZ_"^"_$S($G(PSJBCBU):NAME,1:$$ESC^ORHLESC(NAME))_"^"_"99NP"
 D SEGMENT^PSJHLU(LIMIT),DISPLAY^PSJHL2
 Q
 ;
ZZZ ; BCBU ZZZ Seg, Hazardous drug flags ZZZ.4 & ZZZ.5                              *364
 N NODE1,HAZ
 S NODE1=$G(@(PSJORDER_"0)"))
 S LIMIT=5 X PSJCLEAR
 S FIELD(0)="ZZZ"
 ;Field(1-3) below, not used for BCBU reserved for PADE in PSJPDCLU
 S FIELD(1)=""
 S FIELD(2)=""
 S FIELD(3)=""
 S HAZ=$$HAZDRUG(PSJORDER)    ;get Haz flag 1 or 0 value and convert flags to HL7 Y or N values
 S FIELD(4)=$S($P(HAZ,U):"Y",1:"N")
 S FIELD(5)=$S($P(HAZ,U,2):"Y",1:"N")
 ;set fields into segment temp global
 D SEGMENT^PSJHLU(LIMIT),DISPLAY^PSJHL2
 Q
 ;
HAZDRUG(FILE) ;Get Hazardous to Handle and Hazardous to Dispose fields per this order (if any component is Haz then order is)   *364
 ; FILE = file root + Order Num from inpatient variables during workflow;  Example VAR contains: "^PS(55,DFN,5,ON," or "(PS(53.1,ON," or "^PS(55,DFN,"IV",ON,"
 ;         (build ROOT to the multiple level to find all Disp Drugs or Additives or Solution and check for any HAZ components.)
 N QQ,ROOT,NXTROOT,NXT,IFN,GL,HAZH,HAZD,HZIFN
 S (HAZH,HAZD,HZIFN)=0
 ;check IF Unit Dose Disp Drug exists this order, then get IEN and Haz flags
 F QQ=0:0 S ROOT=FILE_"1,"_QQ_")" S QQ=$O(@ROOT) Q:'QQ  D
 . S NXTROOT=FILE_"1,"_QQ_")" S NXT=$O(@NXTROOT) S GL=$E(NXTROOT,1,$L(ROOT)-1),IFN=+@(GL_",0)")
 . S:$P($$HAZ^PSSUTIL(IFN),U,1) HAZH=1,HZIFN=IFN
 . S:$P($$HAZ^PSSUTIL(IFN),U,2) HAZD=1,HZIFN=IFN
 . ;check IF IV additives exists this order, then get IEN and Haz flags
 F QQ=0:0 S ROOT=FILE_"""AD"","_QQ_")" S QQ=$O(@ROOT) Q:'QQ  D
 . S NXTROOT=FILE_"""AD"","_QQ_")" S NXT=$O(@NXTROOT) S GL=$E(NXTROOT,1,$L(ROOT)-1),IFN=+@(GL_",0)")
 . S:IFN IFN=+$P($G(^PS(52.6,IFN,0)),U,2)
 . S:$P($$HAZ^PSSUTIL(IFN),U,1) HAZH=1,HZIFN=IFN
 . S:$P($$HAZ^PSSUTIL(IFN),U,2) HAZD=1,HZIFN=IFN
 F QQ=0:0 S ROOT=FILE_"""SOL"","_QQ_")" S QQ=$O(@ROOT) Q:'QQ  D
 . S NXTROOT=FILE_"""SOL"","_QQ_")" S NXT=$O(@NXTROOT) S GL=$E(NXTROOT,1,$L(ROOT)-1),IFN=+@(GL_",0)")
 . S:IFN IFN=+$P($G(^PS(52.7,IFN,0)),U,2)
 . S:$P($$HAZ^PSSUTIL(IFN),U,1) HAZH=1,HZIFN=IFN
 . S:$P($$HAZ^PSSUTIL(IFN),U,2) HAZD=1,HZIFN=IFN
 Q HAZH_U_HAZD_U_HZIFN
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HPSJHLU   10683     printed  Sep 23, 2025@19:43:12                                                                                                                                                                                                     Page 2
PSJHLU    ;BIR/RLW - UTILITIES USED IN BUILDING HL7 SEGMENTS ;4/24/12 2:52pm
 +1       ;;5.0;INPATIENT MEDICATIONS;**1,56,72,102,134,181,267,285,317,339,364,446**;16 DEC 97;Build 1
 +2       ;
 +3       ; Reference to ^PS(52.6 is supported by DBIA# 1231.
 +4       ; Reference to ^PS(52.7 is supported by DBIA# 2173.
 +5       ; Reference to ^VA(200 is supported by DBIA 10060.
 +6       ; Reference to ^PS(55 is supported by DBIA# 2191.
 +7       ;
 +8       ;*267 Change NTE|21 so it can send over the Long Wp Special Inst/
 +9       ;     Other Prt Info fields if populated.
 +10      ;*364 Add HAZ Handle & Haz Dispose flags to new ZZZ segment for BCBU
 +11      ;*446 Fix infusion rate evaluation in ENI tag to determine when to add
 +12      ;     "ml/hr". Continuous orders with rate < 1 were adding extra "ml/hr".
 +13      ;
INIT      ; set up HL7 application variables
 +1        SET PSJHLSDT="PS"
           SET PSJHINST=$PIECE($$SITE^VASITE(),"^")
 +2        SET PSJCLEAR="K FIELD F J=0:1:LIMIT S FIELD(J)="""""
 +3        QUIT 
 +4       ;
SEGMENT(LIMIT) ;
 +1        KILL SEGMENT
 +2        NEW SUBSEG,SEGLENGT
           SET SUBSEG=0
           SET SEGMENT=""
           FOR J=0:1:LIMIT
               Begin DoDot:1
 +3                IF SEGMENT']""
                       SET SEGMENT=FIELD(J)
                       QUIT 
 +4                SET SEGMENT=SEGMENT_"|"_FIELD(J)
               End DoDot:1
 +5        FOR 
               SET SEGLENGT=$LENGTH(SEGMENT)
               Begin DoDot:1
 +6                IF SEGLENGT'>246
                       SET SEGMENT(SUBSEG)=SEGMENT
 +7                IF SEGLENGT>245
                       SET SEGMENT(SUBSEG)=$EXTRACT(SEGMENT,1,245)
                       SET SUBSEG=SUBSEG+1
                       Begin DoDot:2
 +8                        SET SEGMENT=$EXTRACT(SEGMENT,246,SEGLENGT)
                           SET SEGMENT(SUBSEG)=$EXTRACT(SEGMENT,1,245)
                       End DoDot:2
               End DoDot:1
               if $LENGTH(SEGMENT)'>246
                   QUIT 
SET        SET PSJI=PSJI+1
           SET ^TMP("PSJHLS",$JOB,PSJHLSDT,PSJI)=SEGMENT(0)
 +1        FOR J=1:1
               if '$DATA(SEGMENT(J))
                   QUIT 
               SET ^TMP("PSJHLS",$JOB,PSJHLSDT,PSJI,J)=SEGMENT(J)
 +2        QUIT 
 +3       ;
SEGMENT2  ; Retrieve text fields
 +1        KILL SEGMENT
           SET JJ=0
           FOR 
               SET JJ=$ORDER(@(PSJORDER_"12,"_JJ_")"))
               if 'JJ
                   QUIT 
               SET SEGMENT(JJ-1)=$GET(@(PSJORDER_"12,"_JJ_",0)"))
 +2        IF $DATA(SEGMENT(0))
               SET SEGMENT(0)="NTE|6|L|"_$SELECT($GET(PSJBCBU):SEGMENT(0),1:$$ESC^ORHLESC(SEGMENT(0)))
               Begin DoDot:1
 +3                DO SET^PSJHLU
                   KILL SEGMENT,JJ
               End DoDot:1
 +4       ;build NTE 21 with Special Inst/Other Prt Info Wp fields  *267
 +5        NEW QQ
           KILL ^TMP("PSJBCMA5",$JOB)
 +6        DO GETSIOPI^PSJBCMA5(PSJHLDFN,RXORDER,1)
 +7        IF RXORDER["V"!(RXORDER["U")
               IF ($GET(PSJORD)["P")
                   IF ($PIECE($GET(^PS(53.1,+PSJORD,0)),"^",25)=RXORDER)
                       Begin DoDot:1
 +8                        DO GETSIOPI^PSJBCMA5(PSJHLDFN,PSJORD,1)
 +9                        NEW LINES,TEXT1
                           SET LINES=($GET(^TMP("PSJBCMA5",$JOB,PSJHLDFN,PSJORD)))
                           SET TEXT1=$GET(^TMP("PSJBCMA5",$JOB,PSJHLDFN,PSJORD,1))
 +10                       IF LINES<1!(LINES=1&(TEXT1["Instructions too long. See Order View or BCMA for full text"))
                               QUIT 
 +11                       KILL ^TMP("PSJBCMA5",$JOB,PSJHLDFN,RXORDER)
                           MERGE ^TMP("PSJBCMA5",$JOB,PSJHLDFN,RXORDER)=^TMP("PSJBCMA5",$JOB,PSJHLDFN,PSJORD)
                           KILL ^TMP("PSJBCMA5",$JOB,PSJHLDFN,PSJORD)
                       End DoDot:1
 +12       FOR QQ=0:0
               SET QQ=$ORDER(^TMP("PSJBCMA5",$JOB,PSJHLDFN,RXORDER,QQ))
               if 'QQ
                   QUIT 
               Begin DoDot:1
 +13               IF QQ=1
                       Begin DoDot:2
 +14                       SET SEGMENT(0)="NTE|21|L|"_$$ESC^ORHLESC(^TMP("PSJBCMA5",$JOB,PSJHLDFN,RXORDER,QQ))
 +15                       if $GET(PSJBCBU)
                               SET SEGMENT(0)=SEGMENT(0)_"\.br\"
                       End DoDot:2
                       QUIT 
 +16               SET SEGMENT(QQ-1)=$$ESC^ORHLESC(^TMP("PSJBCMA5",$JOB,PSJHLDFN,RXORDER,QQ))
 +17               if $GET(PSJBCBU)
                       SET SEGMENT(QQ-1)=SEGMENT(QQ-1)_"\.br\"
               End DoDot:1
 +18       IF $DATA(SEGMENT(0))
               DO SET^PSJHLU
               KILL SEGMENT,^TMP("PSJBCMA5",$JOB)
 +19      ;*267 end
 +20       QUIT 
 +21      ;
CALL(HLEVN) ; call DHCP HL7 package -or- protocol, to pass Orders
 +1       ; HLEVN = number of segments in message
 +2       ;*317
 +3        NEW PADE,PDTYP
           SET PADE=0
           SET PDTYP=""
 +4        IF PSJORDER["^PS(55,"
               Begin DoDot:1
 +5                IF $ORDER(XQORMSG(0))&((PSOC="DR")!(PSOC="OD"))
                       SET PADE=1
                       SET PDTYP=PSOC
                       QUIT 
 +6                IF '$ORDER(XQORMSG(0))
                       Begin DoDot:2
 +7                        NEW PD0,PD1
                           SET PD0=$GET(@(PSJORDER_"0)"))
 +8                        SET PD1=$SELECT(RXORDER["V":$PIECE(PD0,"^",17),1:$PIECE(PD0,"^",9))
                           if PD1=""
                               QUIT 
 +9                        IF ",A,D,H,"[(","_$EXTRACT(PD1)_",")
                               SET PADE=1
                               SET PDTYP=PSOC
                       End DoDot:2
               End DoDot:1
 +10      ;*364 move kill PSJORDER to later for PADE
           KILL CLERK,DDIEN,DDNUM,DOSEFORM,DOSEOR,FIELD,IVTYPE,LIMIT,NAME,NDNODE,NODE1,NODE2,PRODNAME,PROVIDER,PSGS0Y,PSJHINST,PSJHLSDT,PSJI,PSOC,PSREASON,ROOMBED,SPDIEN,SEGMENT,%
 +11       IF $GET(PSJBCBU)=1
               MERGE PSJNAME=^TMP("PSJHLS",$JOB,"PS")
               QUIT 
 +12       SET PSJMSG="^TMP(""PSJHLS"",$J,""PS"")"
 +13      ;*317
           IF PADE
               NEW RXO,PDMSG
               SET RXO=RXORDER_$SELECT(+RXORDER=RXORDER:"U",1:"")
               MERGE PDMSG=^TMP("PSJHLS",$JOB,"PS")
 +14       DO MSG^XQOR("PS EVSEND OR",.PSJMSG)
 +15      ;*317
           IF PADE
               DO PDORD^PSJPDCLU
 +16       IF $GET(RXORDER)
               IF $GET(PSJHLDFN)
                   NEW PSJSTOP
                   SET PSJSTOP=$SELECT(RXORDER["U":$PIECE(^PS(55,PSJHLDFN,5,+RXORDER,2),"^",4),RXORDER["V":$PIECE(^PS(55,PSJHLDFN,"IV",+RXORDER,0),"^",3),1:"")
                   IF PSJSTOP
                       Begin DoDot:1
 +17                       NEW PSJSTATU
                           SET PSJSTATU=$SELECT(RXORDER["U":$PIECE(^PS(55,PSJHLDFN,5,+RXORDER,0),"^",9),RXORDER["V":$PIECE(^PS(55,PSJHLDFN,"IV",+RXORDER,0),"^",17),1:"")
 +18                       IF ",A,H,"[(","_PSJSTATU_",")
                               DO NOW^%DTC
                               IF PSJSTOP'>%
                                   NEW RXON
                                   SET RXON=RXORDER
                                   DO EXPIR^PSJHL6
                       End DoDot:1
 +19      ;*364 moved to here
           KILL PSJORDER
 +20       QUIT 
 +21      ;
IVTYPE(PSJORDER) ; check whether a back-door order is Inpatient IV or IV fluid
 +1        IF RXORDER["V"
               IF $PIECE($GET(@(PSJORDER_"0)")),"^",4)'="A"
                   QUIT "I"
 +2        IF RXORDER["P"
               IF $PIECE($GET(@(PSJORDER_"0)")),"^",4)'="F"
                   SET IVTYPE=""
                   QUIT IVTYPE
 +3        NEW SUB,AD,SOL,IVTYPE,NODE1
           SET SUB=0
           SET IVTYPE="F"
 +4       ;naked reference on line below refers to the full indirect reference of PSJORDER_ which is from ^PS(55,DFN,"IV",PSJORD
 +5        FOR TYPE="AD","SOL"
               SET SUB=0
               FOR 
                   SET SUB=$ORDER(@(PSJORDER_""""_TYPE_""""_","_SUB_")"))
                   if (SUB="")!(IVTYPE="I")
                       QUIT 
                   SET NODE1=$GET(^(SUB,0))
                   if NODE1=""
                       QUIT 
                   Begin DoDot:1
 +6                    IF TYPE="AD"
                           Begin DoDot:2
 +7                            IF '$PIECE($GET(^PS(52.6,$PIECE(NODE1,"^"),0)),"^",13)
                                   SET IVTYPE="I"
                           End DoDot:2
 +8                    if TYPE="SOL"
                           Begin DoDot:2
 +9                            if '$PIECE($GET(^PS(52.7,$PIECE(NODE1,"^"),0)),"^",13)
                                   SET IVTYPE="I"
                           End DoDot:2
                   End DoDot:1
                   if IVTYPE="I"
                       QUIT 
 +10       QUIT IVTYPE
ENI       ;Calculate Frequency for IV orders
 +1        NEW INFUSE
 +2        IF X?.E1L.E
               SET INFUSE=$$ENLU^PSGMI(X)
               if (INFUSE="TITRATE")!(INFUSE="BOLUS")!($PIECE(INFUSE," ")="INFUSE")!($PIECE(INFUSE," ")="Infuse")
                   QUIT 
 +3        if (X="TITRATE")!(X="BOLUS")!($PIECE(X," ")="INFUSE")!($PIECE(X," ")="Infuse")
               QUIT 
 +4        if $$INTRMT(X)
               QUIT 
 +5        if $LENGTH(X)<1!($LENGTH(X)>30)!(X["""")!($ASCII(X)=45)
               KILL X
           IF '$DATA(X)
               QUIT 
 +6       ; NOIS LOU-0501-42191
           IF X["="
               Begin DoDot:1
 +7                NEW X2,X1
                   SET X1=$PIECE(X,"=")
                   SET X2=$PIECE(X,"=",2)
 +8                IF X1["ML/HR"
                       IF (+X1=$PIECE(X1,"ML/HR"))!(+X1=$PIECE(X1," ML/HR"))
                           Begin DoDot:2
 +9                            SET X1=$TRANSLATE(X1,"ML/HR","ml/hr")
                           End DoDot:2
 +10               IF X2["ML/HR"
                       IF (+X2=$PIECE(X2,"ML/HR"))!(+X2=$PIECE(X2," ML/HR"))
                           Begin DoDot:2
 +11                           SET X2=$TRANSLATE(X2,"ML/HR","ml/hr")
                           End DoDot:2
 +12               IF X1[" ml/hr"
                       IF (+X1=$PIECE(X1," ml/hr"))
                           Begin DoDot:2
 +13                           SET X1=$PIECE(X1," ml/hr")_$PIECE(X1," ml/hr",2,9999)
                           End DoDot:2
 +14               IF X2[" ml/hr"
                       IF (+X2=$PIECE(X2," ml/hr"))
                           Begin DoDot:2
 +15                           SET X2=$PIECE(X2," ml/hr")_$PIECE(X2," ml/hr",2,9999)
                           End DoDot:2
 +16               IF X1["ml/hr"
                       IF (+X1=$PIECE(X1,"ml/hr"))
                           Begin DoDot:2
 +17                           SET X1=$PIECE(X1,"ml/hr")_$PIECE(X1,"ml/hr",2,9999)
                           End DoDot:2
 +18               IF X2["ml/hr"
                       IF (+X2=$PIECE(X2,"ml/hr"))
                           Begin DoDot:2
 +19                           SET X2=$PIECE(X2,"ml/hr")_$PIECE(X2,"ml/hr",2,9999)
                           End DoDot:2
 +20               IF X2'=+X2
                       Begin DoDot:2
 +21                       IF ($PIECE(X2,"@",2,999)'=+$PIECE(X2,"@",2,999)!(+$PIECE(X2,"@",2,999)<0))
                               KILL X
                               QUIT 
                       End DoDot:2
 +22               IF X1=+X1
                       SET X1=X1_" ml/hr"
 +23               IF X2=+X2
                       SET X2=X2_" ml/hr"
 +24               if $PIECE(X2,"@")=+X2
                       SET $PIECE(X2,"@")=$PIECE(X2,"@")_" ml/hr"
 +25               SET X=X1_"="_X2
               End DoDot:1
               QUIT 
 +26      ;*285 - Allow for decimals with trailing zeroes
 +27       IF X'?.N.1".".N
               IF ($PIECE($TRANSLATE(X," ml/hr",""),"@",2,999)'=+$PIECE($TRANSLATE(X," ml/hr",""),"@",2,999)!(+$PIECE(X,"@",2,999)<0))
                   IF ($PIECE(X," ml/hr")'?.N.1".".N!(+$PIECE(X," ml/hr")<0))
                       if (X>0&($EXTRACT(X)=0))
                           QUIT 
                       KILL X
                       QUIT 
 +28      ; *446 - Fix infusion rate evaluation below
 +29      ; I X=+X!(X>0&($E(X)=0)) S:$S(X'["ml/hr":0,X["@":0,1:1) X=X_" ml/hr" D SPSOL S FREQ=$S('X:0,1:SPSOL\X*60+(SPSOL#X/X*60+.5)\1) K SPSOL Q
 +30       IF (X=+X)!(X>0&($EXTRACT(X)=0))
               SET X=$SELECT(((X'["ml/hr")&(X'["@")):X_" ml/hr",1:X)
               DO SPSOL
               SET FREQ=$SELECT('X:0,1:SPSOL\X*60+(SPSOL#X/X*60+.5)\1)
               KILL SPSOL
               QUIT 
 +31      ; *446 End
 +32       IF X[" ml/hr"
               DO SPSOL
               SET FREQ=$SELECT('X:0,1:SPSOL\X*60+(SPSOL#X/X*60+.5)\1)
               KILL SPSOL
               QUIT 
 +33       SET SPSOL=$PIECE(X,"@",2)
           if $PIECE(X,"@")=+X
               SET $PIECE(X,"@")=$PIECE(X,"@")_" ml/hr"
           SET FREQ=$SELECT('SPSOL:0,1:1440/SPSOL\1)
           KILL SPSOL
 +34       QUIT 
SPSOL      SET SPSOL=+TVOLUME
           QUIT 
INTRMT(X) ;
 +1        if '$PIECE(X," ")
               QUIT 0
 +2        if $PIECE(X," ",2)="Minutes"
               QUIT 1
 +3        if $PIECE(X," ",2)="Hours"
               QUIT 1
 +4        QUIT 0
IVCAT(DFN,PSJORD,PARRAY) ; This returns the IV CATEGORY based on the IV TYPE and CHEMO TYPE (not what is already in the IV CATEGORY field)
 +1       ;  Passed in:  PSJORDER (file root of order)
 +2        NEW NODE,TYP,CHEMTYP,INTSYR,ND2P5
 +3        SET (CHEMTYP,INTSYR)=""
 +4        SET TYP=$GET(P(4))
           SET INTSYR=$GET(P(5))
           SET CHEMTYP=$GET(P(23))
 +5        IF TYP=""
               IF $GET(PSJORD)["V"
                   SET NODE=$GET(^PS(55,DFN,"IV",+PSJORD,0))
                   SET TYP=$PIECE(NODE,"^",4)
                   SET INTSYR=$PIECE(NODE,"^",5)
                   SET CHEMTYP=$PIECE(NODE,"^",23)
 +6        IF TYP=""
               IF $GET(PSJORD)["P"
                   SET NODE=$GET(^PS(53.1,+PSJORD,8))
                   SET TYP=$PIECE(NODE,"^")
                   SET INTSYR=$PIECE(NODE,"^",4)
                   SET CHEMTYP=$PIECE(NODE,"^",2)
 +7        IF TYP=""
               SET TYP=$GET(PARRAY(4))
               SET INTSYR=$GET(PARRAY(5))
               SET CHEMTYP=$GET(PARRAY(23))
 +8        if $GET(TYP)=""
               QUIT ""
 +9        SET CAT=$SELECT(",A,H,"[(","_TYP_","):"C",TYP="C"&(",A,H,S,"[(","_CHEMTYP_",")&'INTSYR):"C",TYP="C"&(CHEMTYP="P"):"I",TYP="S"&'INTSYR:"C",TYP="P":"I",$GET(INTSYR):"I",1:"")
 +10       QUIT CAT
ZRX       ; Perform outbound processing
 +1        NEW NODE1
 +2        SET NODE1=$GET(@(PSJORDER_"0)"))
 +3        SET LIMIT=6
           XECUTE PSJCLEAR
 +4        SET FIELD(0)="ZRX"
 +5        IF '$GET(PSJREN)
               NEW PREON,PSJREN
               IF $GET(PSJORD)["U"&($PIECE(NODE1,"^",24)="R")
                   SET PSJREN=1
 +6        IF $GET(PSJORD)["V"&($PIECE(NODE2,"^",8)="R")
               SET PSJREN=1
 +7        SET PREON=$SELECT($GET(PSJREN):$GET(PSJORD),PSJORDER["IV":$PIECE(NODE2,"^",5),1:$PIECE(NODE1,"^",25))
 +8        SET FIELD(1)=$SELECT(PREON["P":$PIECE($GET(^PS(53.1,+PREON,0)),"^",21),PREON["V":$PIECE($GET(^PS(55,PSJHLDFN,"IV",+PREON,0)),"^",21),1:$PIECE($GET(^PS(55,PSJHLDFN,5,+PREON,0)),"^",21))
 +9        SET FIELD(2)=$SELECT(PSJORDER["IV":$GET(P("NAT")),1:$GET(PSJNOO))
 +10       SET FIELD(3)=$SELECT($GET(PSJREN):"R",PSJORDER["IV":$PIECE(NODE2,"^",8),1:$PIECE(NODE1,"^",24))
 +11       IF FIELD(3)=""
               IF PSOC="SN"
                   SET FIELD(3)="N"
 +12       IF $DATA(P)>1
               SET FIELD(6)=$$IVCAT^PSJHLU(PSJHLDFN,RXORDER,.P)
 +13       SET NAME=$PIECE($GET(^VA(200,DUZ,0)),"^")
 +14       SET FIELD(5)=DUZ_"^"_$SELECT($GET(PSJBCBU):NAME,1:$$ESC^ORHLESC(NAME))_"^"_"99NP"
 +15       DO SEGMENT^PSJHLU(LIMIT)
           DO DISPLAY^PSJHL2
 +16       QUIT 
 +17      ;
ZZZ       ; BCBU ZZZ Seg, Hazardous drug flags ZZZ.4 & ZZZ.5                              *364
 +1        NEW NODE1,HAZ
 +2        SET NODE1=$GET(@(PSJORDER_"0)"))
 +3        SET LIMIT=5
           XECUTE PSJCLEAR
 +4        SET FIELD(0)="ZZZ"
 +5       ;Field(1-3) below, not used for BCBU reserved for PADE in PSJPDCLU
 +6        SET FIELD(1)=""
 +7        SET FIELD(2)=""
 +8        SET FIELD(3)=""
 +9       ;get Haz flag 1 or 0 value and convert flags to HL7 Y or N values
           SET HAZ=$$HAZDRUG(PSJORDER)
 +10       SET FIELD(4)=$SELECT($PIECE(HAZ,U):"Y",1:"N")
 +11       SET FIELD(5)=$SELECT($PIECE(HAZ,U,2):"Y",1:"N")
 +12      ;set fields into segment temp global
 +13       DO SEGMENT^PSJHLU(LIMIT)
           DO DISPLAY^PSJHL2
 +14       QUIT 
 +15      ;
HAZDRUG(FILE) ;Get Hazardous to Handle and Hazardous to Dispose fields per this order (if any component is Haz then order is)   *364
 +1       ; FILE = file root + Order Num from inpatient variables during workflow;  Example VAR contains: "^PS(55,DFN,5,ON," or "(PS(53.1,ON," or "^PS(55,DFN,"IV",ON,"
 +2       ;         (build ROOT to the multiple level to find all Disp Drugs or Additives or Solution and check for any HAZ components.)
 +3        NEW QQ,ROOT,NXTROOT,NXT,IFN,GL,HAZH,HAZD,HZIFN
 +4        SET (HAZH,HAZD,HZIFN)=0
 +5       ;check IF Unit Dose Disp Drug exists this order, then get IEN and Haz flags
 +6        FOR QQ=0:0
               SET ROOT=FILE_"1,"_QQ_")"
               SET QQ=$ORDER(@ROOT)
               if 'QQ
                   QUIT 
               Begin DoDot:1
 +7                SET NXTROOT=FILE_"1,"_QQ_")"
                   SET NXT=$ORDER(@NXTROOT)
                   SET GL=$EXTRACT(NXTROOT,1,$LENGTH(ROOT)-1)
                   SET IFN=+@(GL_",0)")
 +8                if $PIECE($$HAZ^PSSUTIL(IFN),U,1)
                       SET HAZH=1
                       SET HZIFN=IFN
 +9                if $PIECE($$HAZ^PSSUTIL(IFN),U,2)
                       SET HAZD=1
                       SET HZIFN=IFN
 +10      ;check IF IV additives exists this order, then get IEN and Haz flags
               End DoDot:1
 +11       FOR QQ=0:0
               SET ROOT=FILE_"""AD"","_QQ_")"
               SET QQ=$ORDER(@ROOT)
               if 'QQ
                   QUIT 
               Begin DoDot:1
 +12               SET NXTROOT=FILE_"""AD"","_QQ_")"
                   SET NXT=$ORDER(@NXTROOT)
                   SET GL=$EXTRACT(NXTROOT,1,$LENGTH(ROOT)-1)
                   SET IFN=+@(GL_",0)")
 +13               if IFN
                       SET IFN=+$PIECE($GET(^PS(52.6,IFN,0)),U,2)
 +14               if $PIECE($$HAZ^PSSUTIL(IFN),U,1)
                       SET HAZH=1
                       SET HZIFN=IFN
 +15               if $PIECE($$HAZ^PSSUTIL(IFN),U,2)
                       SET HAZD=1
                       SET HZIFN=IFN
               End DoDot:1
 +16       FOR QQ=0:0
               SET ROOT=FILE_"""SOL"","_QQ_")"
               SET QQ=$ORDER(@ROOT)
               if 'QQ
                   QUIT 
               Begin DoDot:1
 +17               SET NXTROOT=FILE_"""SOL"","_QQ_")"
                   SET NXT=$ORDER(@NXTROOT)
                   SET GL=$EXTRACT(NXTROOT,1,$LENGTH(ROOT)-1)
                   SET IFN=+@(GL_",0)")
 +18               if IFN
                       SET IFN=+$PIECE($GET(^PS(52.7,IFN,0)),U,2)
 +19               if $PIECE($$HAZ^PSSUTIL(IFN),U,1)
                       SET HAZH=1
                       SET HZIFN=IFN
 +20               if $PIECE($$HAZ^PSSUTIL(IFN),U,2)
                       SET HAZD=1
                       SET HZIFN=IFN
               End DoDot:1
 +21       QUIT HAZH_U_HAZD_U_HZIFN