PSJUTL1 ;BIR/MLM-MISC. INPATIENT UTILITIES ;29 Jul 98 / 4:29 PM
 ;;5.0;INPATIENT MEDICATIONS;**15,50,58,260**;16 DEC 97;Build 94
 ;
 ; Reference to ^PSSLOCK is supported by DBIA# 2789.
 ; Reference to ^PS(55 is supported by DBIA# 2191.
 ; Reference to ^PS(50.7 is supported by DBIA# 2180.
 ; Reference to ^PS(52.6 is supported by DBIA# 1231.
 ; Reference to ^PS(52.7 is supported by DBIA# 2173.
 ; Reference to ^PS(59.7 is supported by DBIA# 2181.
 ; Reference to ^PSDRUG is supported by DBIA# 2192.
 ; Reference to ^XPD(9.7 is supported by DBIA# 2197.
 ; Reference to ^PSSDIUTL is supported by DBIA# 5737.
 ;
CONVERT(DFN,TYPE) ;
 ; Convert existing UD orders to new format. Only run once/patient, and
 ; only converts orders with a stop date<(5.0 Install date-365)
 ;  DFN = Patient IEN
 ; TYPE = Background or Interactive mode
 ;
 S TYPE=TYPE&($E($G(IOST))="C")
 ;I '$D(^PS(55,DFN,0))!($P($G(^PS(55,DFN,5.1)),U,11)=1) Q
 ;I $S($P($G(^PS(55,DFN,5.1)),U,11)=1:1,$O(^PS(55,DFN,"IV",0)):0,$O(^PS(55,DFN,5,0)):0,1:'$O(^PS(53.1,"C",DFN,0))) Q
 I $P($G(^PS(55,DFN,5.1)),U,11)=1 Q
 N ADS,ADS1,DDRG,ND,ON,ON1,PSGDT,PSJOI,STAT,STPDT,STS,X,XX,X1,X2
 ;I '$D(^PS(55,DFN,0)) D
 ;I '$D(^PS(55,DFN,0))&(($O(^PS(55,DFN,"IV",0)))!($O(^PS(55,DFN,5,0)))!($O(^PS(53.1,"C",DFN,0)))) D
 I '$D(^PS(55,DFN,0))&($D(^PS(55,DFN))!($O(^PS(53.1,"C",DFN,0)))) D
 .N X,Y,DA,DIK S ^PS(55,DFN,0)=DFN K DIK S DA=DFN,DIK="^PS(55,",DIK(1)=.01 D EN^DIK
 ;I TYPE W !!,"Converting old orders for ",$P($G(^DPT(DFN,0)),U)," to new format."
 S X1=$P($G(^PS(59.7,1,20)),U,2),X2=-365 I 'X1 D NOW^%DTC S X1=$P(%,".")
 D C^%DTC S PSGDT=X
 ;Convert and Backfill orders in 53.1.
 F STAT="D","DE","N","P","U" S STS=$O(^PS(53.1,"AS",STAT)) F ON=0:0 S ON=$O(^PS(53.1,"AS",STAT,DFN,ON)) Q:'ON  I '$G(^PS(53.1,ON,.2)) D
 .S PSJOI="",ND=$G(^PS(53.1,+ON,.1)),DDRG=+$G(^PS(53.1,ON,1,+$O(^PS(53.1,ON,1,0)),0)) S:DDRG PSJOI=+$G(^PSDRUG(DDRG,2))
 .I 'PSJOI F DDRG=0:0 S DDRG=$O(^PSDRUG("AP",+ND,DDRG)) Q:'DDRG!PSJOI  S PSJOI=+$G(^PSDRUG(DDRG,2)) D
 .; convert pending UD orders that have "I" in 4th piece for TYPE
 .I STAT="P",($P($G(^PS(53.1,ON,0)),"^",4)="I"),(PSJOI) S $P(^PS(53.1,ON,0),"^",4)=$$CNV2(PSJOI)
 .I PSJOI S ^PS(53.1,ON,.2)=PSJOI_U_$P(ND,U,2) W:TYPE "."
 .I PSJOI!($P($G(^PS(53.1,+ON,0)),U,4)="F") D EN1^PSJHL2(DFN,"ZC",ON_"P")
 .; convert order location codes for ^PS(53.1
 .K PSJXX S PSJXX=$G(^PS(53.1,ON,0)) I $L(PSJXX) S $P(PSJXX,"^",25,26)=$$CNV($P(PSJXX,"^",25))_"^"_$$CNV($P(PSJXX,"^",26)) S ^(0)=PSJXX K PSJXX
 ;Convert and Backfill UD orders.
 F STPDT=PSGDT:0 S STPDT=$O(^PS(55,DFN,5,"AUS",STPDT)) Q:'STPDT  F ON=0:0 S ON=$O(^PS(55,DFN,5,"AUS",STPDT,ON)) Q:'ON  I '$G(^PS(55,DFN,5,ON,.2)) D
 .S PSJOI="",ND=$G(^PS(55,DFN,5,+ON,.1)),DDRG=$O(^PS(55,DFN,5,ON,1,0)),XX=+$G(^PS(55,DFN,5,ON,1,+DDRG,0)) S:XX PSJOI=+$G(^PSDRUG(XX,2))
 .I 'PSJOI F DDRG=0:0 S DDRG=$O(^PSDRUG("AP",+ND,DDRG)) Q:'DDRG!PSJOI  S PSJOI=+$G(^PSDRUG(DDRG,2))
 .I PSJOI S ^PS(55,DFN,5,ON,.2)=PSJOI_U_$P(ND,U,2) W:TYPE "." D EN1^PSJHL2(DFN,"ZC",ON_"U")
 .; convert order location codes for Unit Dose orders
 .K PSJXX S PSJXX=$G(^PS(55,DFN,5,ON,0)) I $L(PSJXX) S $P(PSJXX,"^",25,26)=$$CNV($P(PSJXX,"^",25))_"^"_$$CNV($P(PSJXX,"^",26)) S ^(0)=PSJXX K PSJXX
 ;Convert and Backfill IV orders.
 F STPDT=PSGDT:0 S STPDT=$O(^PS(55,DFN,"IV","AIS",STPDT)) Q:'STPDT  F ON=0:0 S ON=$O(^PS(55,DFN,"IV","AIS",STPDT,ON)) Q:'ON  I '$G(^PS(55,DFN,"IV",ON,.2)) D
 .S PSJOI="",ND=$G(^PS(55,DFN,"IV",ON,6)) F ADS="AD","SOL" I 'PSJOI F ON1=0:0 S ON1=$O(^PS(55,DFN,"IV",ON,ADS,ON1))  Q:'ON1!PSJOI  S XX=+$G(^PS(55,DFN,"IV",ON,ADS,ON1,0)) D
 ..S:XX PSJOI=$S(ADS="AD":$P($G(^PS(52.6,XX,0)),U,11),1:$P($G(^PS(52.7,XX,0)),U,11)) I PSJOI  S ^PS(55,DFN,"IV",ON,.2)=PSJOI_U_$P(ND,U,2,3) W:TYPE "."
 .S PSJ200=$P($G(^PS(55,DFN,"IV",ON,2)),U,3) Q:PSJ200=""
 .S X=$O(^VA(200,"B",PSJ200,0)),XX=$O(^VA(200,"B",PSJ200,X))
 .I 'X!XX S ^XTMP("PSJ NEW PERSON",PSJ200,DFN,ON)="" Q
 .S $P(^PS(55,DFN,"IV",ON,2),U,11)=X
 .D EN1^PSJHL2(DFN,"ZC",ON_"V")
 .; convert order location codes for IVs
 .K PSJXX S PSJXX=$G(^PS(55,DFN,"IV",ON,2)) I $L(PSJXX) S $P(PSJXX,"^",5,6)=$$CNV($P(PSJXX,"^",5))_"^"_$$CNV($P(PSJXX,"^",6)) S ^(2)=PSJXX K PSJXX
 ;Delete Unreleased entries after converting.
 F ON=0:0 S ON=$O(^PS(53.1,"AS","U",DFN,ON)) Q:'ON  I $G(^PS(53.1,ON,.2)) S DIK="^PS(53.1,",DA=ON D ^DIK K DIK
 S:$D(^PS(55,DFN,0)) $P(^PS(55,DFN,5.1),U,11)=1
 Q
 ;
NFWS(DFN,ON,PSJPWD)       ; Determine if order is NF or WS
 ;Input: DFN - Patient IEN
 ;        ON - Order #_Order Code
 ;    PSJPWD - IEN of patient's ward
 ; Where Order Code IDs order location ("P":53.1; "U":55.06,1:55.01)
 ;Output: NF flag^WS flag^Self Med^Hosp Supplied Self Med
 N ND
 Q:$S(ON["U":0,1:ON'["P") ""
 ;S PSJPWD="",X=$P($G(^DPT(DFN,.1)),U) I X]"" S PSJPWD=$O(^DIC(42,"B",X,0))
 S PSJ="",PSJREF=$S(ON["P":"^PS(53.1,",1:"^PS(55,"_DFN_",5,")_+ON_","
 F PSJDD=0:0 S PSJDD=$O(@(PSJREF_"1,"_PSJDD_")")) Q:'PSJDD  S ND=$G(^(PSJDD,0)) D CHKDD
 S $P(PSJ,U,3,4)=$P($G(@(PSJREF_"0)")),U,5,6)
 Q PSJ
 ;
CHKDD ; Determine if dispense drug is NF or WS
 ;
 S:$P($G(^PSDRUG(+ND,0)),U,9) $P(PSJ,U)=1
 S:$$WSCHK^PSJO(PSJPWD,+ND) $P(PSJ,U,2)=1
 Q
FIND ;
 F DFN=0:0 S DFN=$O(^PS(55,DFN)) Q:'DFN  D
 .I $O(^PS(55,DFN,5,0))!$O(^PS(55,DFN,"IV",0)) D
 ..I '$P($G(^PS(55,DFN,5.1)),U,11) W !,DFN
 Q
 ;
CNV(PSJM)          ; converts order location codes to just 'U' 'P' and 'V'
 I PSJM="" Q PSJM
 I PSJM["V" Q PSJM
 I PSJM["A"!(PSJM["O") Q ($E(PSJM,1,$L(+PSJM))_"U")
 I PSJM["N"!(PSJM["P") Q ($E(PSJM,1,$L(+PSJM))_"P")
 Q PSJM
CNV2(IEN507)          ; converts pending orders with 3rd piece set to "I"
 ;            is the orderable item marked for IV ?
 I $P($G(^PS(50.7,IEN507,0)),"^",3)=1 Q "I"
 E  Q "U"
 Q
CNIV(DFN)    ;Converts OI on active and pending IV orders for POE
 ;for all patients or a selected patient
 NEW ON,PSGDT,STPDT,START,PSJX
 I $G(DFN) D  Q:PSJX>1
 . S PSJX=$P($G(^PS(55,DFN,5.1)),U,11)
 . Q:PSJX=3
 . I PSJX=2 D MARKIV^PSJUTL3(DFN) Q
 ;I '$D(^XTMP("PSSCONA")),'$D(^XTMP("PSSCONS")) Q
 D NOW^%DTC S START=%
 S X1=DT_".0001",X2=-365
 D C^%DTC S PSGDT=X
 I $G(DFN) D CNIV1(DFN),MARKIV^PSJUTL3(DFN) Q
 NEW DFN
 F DFN=0:0 S DFN=$O(^PS(55,DFN)) Q:'DFN  D CNIV1(DFN),MARKIV^PSJUTL3(DFN)
 D ENIVUD^PSJ0050
 D SEND
 Q
CNIV1(DFN)   ;
 ;I $P($G(^PS(55,DFN,5.1)),U,11)=2 Q
 Q:'$$L^PSSLOCK(DFN,0)
 S $P(^PS(55,DFN,5.1),U,11)=2
 I '$D(^XTMP("PSSCONA")),'$D(^XTMP("PSSCONS")) D UL^PSSLOCK(DFN) Q
 F STPDT=PSGDT:0 S STPDT=$O(^PS(55,DFN,"IV","AIS",STPDT)) Q:'STPDT  D
 . F ON=0:0 S ON=$O(^PS(55,DFN,"IV","AIS",STPDT,ON)) Q:'ON  D IVCHK
 F ON=0:0 S ON=$O(^PS(53.1,"AS","P",DFN,ON)) Q:'ON  D PENDING
 D UL^PSSLOCK(DFN)
 Q
IVCHK ;Match AD/SOL against Xtmp
 NEW PSJAD,PSJCNR,PSJOI,PSJSOL,PSJXAD,PSJXNOI,PSJXSOL
 S PSJOI=+$G(^PS(55,DFN,"IV",ON,.2)) Q:'+PSJOI
 ;
 ;Set local array for AD/SOL from the order
 F PSJAD=0:0 S PSJAD=$O(^PS(55,DFN,"IV",ON,"AD",PSJAD)) Q:'PSJAD  D
 . I $G(^PS(55,DFN,"IV",ON,"AD",PSJAD,0)) S PSJAD(+^(0))=""
 F PSJSOL=0:0 S PSJSOL=$O(^PS(55,DFN,"IV",ON,"SOL",PSJSOL)) Q:'PSJSOL  D
 . I $G(^PS(55,DFN,"IV",ON,"SOL",PSJSOL,0)) S PSJSOL(+^(0))=""
 D MATCH,UPD(ON_"V")
 Q
 ;
MATCH ;If AD/SOL from XTMP matches to AD/SOL within the order, set new OI array
 K PSJXNOI
 F PSJXAD=0:0 S PSJXAD=$O(^XTMP("PSSCONA",+PSJOI,PSJXAD)) Q:'PSJXAD  D
 . I $D(PSJAD(PSJXAD)) S PSJXNOI(+^XTMP("PSSCONA",+PSJOI,PSJXAD))=""
 F PSJXSOL=0:0 S PSJXSOL=$O(^XTMP("PSSCONS",+PSJOI,PSJXSOL)) Q:'PSJXSOL  D
 . I $D(PSJSOL(PSJXSOL)) S PSJXNOI(+^XTMP("PSSCONS",+PSJOI,PSJXSOL))=""
 Q
 ;
UPD(ON) ;Loop thru the new OI array
 NEW PSJCNT S PSJCNT=0
 F X=0:0 S X=$O(PSJXNOI(X)) Q:'X  S PSJCNT=PSJCNT+1
 I PSJCNT=1 D
 . S PSJXNOI=$O(PSJXNOI(0))
 . I +PSJOI=PSJXNOI Q
 . S X=$P($G(^PS(50.7,PSJXNOI,0)),U,4)
 . I X]"",(X'>DT) Q
 . ;/W !,"DFN: ",DFN," ON: ",ON," NEW OI: ",PSJXNOI
 . S:ON["V" $P(^PS(55,DFN,"IV",+ON,.2),U,1)=+PSJXNOI
 . S:ON["P" $P(^PS(53.1,+ON,.2),U,1)=+PSJXNOI
 . D EN1^PSJHL2(DFN,"ZC",ON)
 . D EN^PSJ0050(DFN,+ON,+PSJOI,PSJXNOI)
 Q
PENDING ;Converting Pending IV order with Ad/Sol
 NEW PSJAD,PSJOI,PSJSOL,PSJXNOI
 S X=$P($G(^PS(53.1,ON,0)),U,4) I $S(X="I":0,X="F":0,1:1) Q
 S PSJOI=+$G(^PS(53.1,ON,.2)) Q:'+PSJOI
 ;
 ;If pending has no AD/SOL, and on 1 new OI matched to old OI then update.
 I '$D(^PS(53.1,ON,"AD")),'$D(^PS(53.1,ON,"SOL")) D  Q
 . F X=0:0 S X=$O(^XTMP("PSSCONA",PSJOI,X)) Q:'X  S PSJXNOI(+^(X))=""
 . F X=0:0 S X=$O(^XTMP("PSSCONS",PSJOI,X)) Q:'X  S PSJXNOI(+^(X))=""
 . D UPD(ON_"P")
 ;
 ;Loop thru the pending AD/SOL
 F PSJAD=0:0 S PSJAD=$O(^PS(53.1,ON,"AD",PSJAD)) Q:'PSJAD  D
 . I $G(^PS(53.1,ON,"AD",PSJAD,0)) S PSJAD(+^(0))=""
 F PSJSOL=0:0 S PSJSOL=$O(^PS(55,ON,"SOL",PSJSOL)) Q:'PSJSOL  D
 . I $G(^PS(53.1,ON,"SOL",PSJSOL,0)) S PSJSOL(+^(0))=""
 D MATCH,UPD(ON_"P")
 Q
SEND ;Send mail message
 NEW DIFROM,XMDUZ,XMSUB,XMTEXT,XMY,STOP,LINE
 D NOW^%DTC S STOP=%
 S LINE(1)="The conversion was first started:  "_$$FMTE^XLFDT(START)
 S LINE(2)="It ran to completion:              "_$$FMTE^XLFDT(STOP)
 S XMSUB="Inpatient Meds IV conversion",XMTEXT="LINE("
 S XMDUZ="Inpatient Meds POE"
 S XMY(+DUZ)="" D ^XMD
 Q
PSSDGCK ;Run Drug Check Util
 D ^PSSDIUTL
 Q
INSTLDT() ;Return the date PSJ*5*58 was first installed
 NEW DIC,X,Y
 S X=$O(^XPD(9.7,"B","PSJ*5.0*58",0))
 Q:'+X ""
 S DIC="^XPD(9.7,",DIC(0)="NZ" D ^DIC
 Q $P($G(Y(0)),U,3)
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HPSJUTL1   9392     printed  Sep 23, 2025@19:45:19                                                                                                                                                                                                     Page 2
PSJUTL1   ;BIR/MLM-MISC. INPATIENT UTILITIES ;29 Jul 98 / 4:29 PM
 +1       ;;5.0;INPATIENT MEDICATIONS;**15,50,58,260**;16 DEC 97;Build 94
 +2       ;
 +3       ; Reference to ^PSSLOCK is supported by DBIA# 2789.
 +4       ; Reference to ^PS(55 is supported by DBIA# 2191.
 +5       ; Reference to ^PS(50.7 is supported by DBIA# 2180.
 +6       ; Reference to ^PS(52.6 is supported by DBIA# 1231.
 +7       ; Reference to ^PS(52.7 is supported by DBIA# 2173.
 +8       ; Reference to ^PS(59.7 is supported by DBIA# 2181.
 +9       ; Reference to ^PSDRUG is supported by DBIA# 2192.
 +10      ; Reference to ^XPD(9.7 is supported by DBIA# 2197.
 +11      ; Reference to ^PSSDIUTL is supported by DBIA# 5737.
 +12      ;
CONVERT(DFN,TYPE) ;
 +1       ; Convert existing UD orders to new format. Only run once/patient, and
 +2       ; only converts orders with a stop date<(5.0 Install date-365)
 +3       ;  DFN = Patient IEN
 +4       ; TYPE = Background or Interactive mode
 +5       ;
 +6        SET TYPE=TYPE&($EXTRACT($GET(IOST))="C")
 +7       ;I '$D(^PS(55,DFN,0))!($P($G(^PS(55,DFN,5.1)),U,11)=1) Q
 +8       ;I $S($P($G(^PS(55,DFN,5.1)),U,11)=1:1,$O(^PS(55,DFN,"IV",0)):0,$O(^PS(55,DFN,5,0)):0,1:'$O(^PS(53.1,"C",DFN,0))) Q
 +9        IF $PIECE($GET(^PS(55,DFN,5.1)),U,11)=1
               QUIT 
 +10       NEW ADS,ADS1,DDRG,ND,ON,ON1,PSGDT,PSJOI,STAT,STPDT,STS,X,XX,X1,X2
 +11      ;I '$D(^PS(55,DFN,0)) D
 +12      ;I '$D(^PS(55,DFN,0))&(($O(^PS(55,DFN,"IV",0)))!($O(^PS(55,DFN,5,0)))!($O(^PS(53.1,"C",DFN,0)))) D
 +13       IF '$DATA(^PS(55,DFN,0))&($DATA(^PS(55,DFN))!($ORDER(^PS(53.1,"C",DFN,0))))
               Begin DoDot:1
 +14               NEW X,Y,DA,DIK
                   SET ^PS(55,DFN,0)=DFN
                   KILL DIK
                   SET DA=DFN
                   SET DIK="^PS(55,"
                   SET DIK(1)=.01
                   DO EN^DIK
               End DoDot:1
 +15      ;I TYPE W !!,"Converting old orders for ",$P($G(^DPT(DFN,0)),U)," to new format."
 +16       SET X1=$PIECE($GET(^PS(59.7,1,20)),U,2)
           SET X2=-365
           IF 'X1
               DO NOW^%DTC
               SET X1=$PIECE(%,".")
 +17       DO C^%DTC
           SET PSGDT=X
 +18      ;Convert and Backfill orders in 53.1.
 +19       FOR STAT="D","DE","N","P","U"
               SET STS=$ORDER(^PS(53.1,"AS",STAT))
               FOR ON=0:0
                   SET ON=$ORDER(^PS(53.1,"AS",STAT,DFN,ON))
                   if 'ON
                       QUIT 
                   IF '$GET(^PS(53.1,ON,.2))
                       Begin DoDot:1
 +20                       SET PSJOI=""
                           SET ND=$GET(^PS(53.1,+ON,.1))
                           SET DDRG=+$GET(^PS(53.1,ON,1,+$ORDER(^PS(53.1,ON,1,0)),0))
                           if DDRG
                               SET PSJOI=+$GET(^PSDRUG(DDRG,2))
 +21                       IF 'PSJOI
                               FOR DDRG=0:0
                                   SET DDRG=$ORDER(^PSDRUG("AP",+ND,DDRG))
                                   if 'DDRG!PSJOI
                                       QUIT 
                                   SET PSJOI=+$GET(^PSDRUG(DDRG,2))
                                   Begin DoDot:2
                                   End DoDot:2
 +22      ; convert pending UD orders that have "I" in 4th piece for TYPE
 +23                       IF STAT="P"
                               IF ($PIECE($GET(^PS(53.1,ON,0)),"^",4)="I")
                                   IF (PSJOI)
                                       SET $PIECE(^PS(53.1,ON,0),"^",4)=$$CNV2(PSJOI)
 +24                       IF PSJOI
                               SET ^PS(53.1,ON,.2)=PSJOI_U_$PIECE(ND,U,2)
                               if TYPE
                                   WRITE "."
 +25                       IF PSJOI!($PIECE($GET(^PS(53.1,+ON,0)),U,4)="F")
                               DO EN1^PSJHL2(DFN,"ZC",ON_"P")
 +26      ; convert order location codes for ^PS(53.1
 +27                       KILL PSJXX
                           SET PSJXX=$GET(^PS(53.1,ON,0))
                           IF $LENGTH(PSJXX)
                               SET $PIECE(PSJXX,"^",25,26)=$$CNV($PIECE(PSJXX,"^",25))_"^"_$$CNV($PIECE(PSJXX,"^",26))
                               SET ^(0)=PSJXX
                               KILL PSJXX
                       End DoDot:1
 +28      ;Convert and Backfill UD orders.
 +29       FOR STPDT=PSGDT:0
               SET STPDT=$ORDER(^PS(55,DFN,5,"AUS",STPDT))
               if 'STPDT
                   QUIT 
               FOR ON=0:0
                   SET ON=$ORDER(^PS(55,DFN,5,"AUS",STPDT,ON))
                   if 'ON
                       QUIT 
                   IF '$GET(^PS(55,DFN,5,ON,.2))
                       Begin DoDot:1
 +30                       SET PSJOI=""
                           SET ND=$GET(^PS(55,DFN,5,+ON,.1))
                           SET DDRG=$ORDER(^PS(55,DFN,5,ON,1,0))
                           SET XX=+$GET(^PS(55,DFN,5,ON,1,+DDRG,0))
                           if XX
                               SET PSJOI=+$GET(^PSDRUG(XX,2))
 +31                       IF 'PSJOI
                               FOR DDRG=0:0
                                   SET DDRG=$ORDER(^PSDRUG("AP",+ND,DDRG))
                                   if 'DDRG!PSJOI
                                       QUIT 
                                   SET PSJOI=+$GET(^PSDRUG(DDRG,2))
 +32                       IF PSJOI
                               SET ^PS(55,DFN,5,ON,.2)=PSJOI_U_$PIECE(ND,U,2)
                               if TYPE
                                   WRITE "."
                               DO EN1^PSJHL2(DFN,"ZC",ON_"U")
 +33      ; convert order location codes for Unit Dose orders
 +34                       KILL PSJXX
                           SET PSJXX=$GET(^PS(55,DFN,5,ON,0))
                           IF $LENGTH(PSJXX)
                               SET $PIECE(PSJXX,"^",25,26)=$$CNV($PIECE(PSJXX,"^",25))_"^"_$$CNV($PIECE(PSJXX,"^",26))
                               SET ^(0)=PSJXX
                               KILL PSJXX
                       End DoDot:1
 +35      ;Convert and Backfill IV orders.
 +36       FOR STPDT=PSGDT:0
               SET STPDT=$ORDER(^PS(55,DFN,"IV","AIS",STPDT))
               if 'STPDT
                   QUIT 
               FOR ON=0:0
                   SET ON=$ORDER(^PS(55,DFN,"IV","AIS",STPDT,ON))
                   if 'ON
                       QUIT 
                   IF '$GET(^PS(55,DFN,"IV",ON,.2))
                       Begin DoDot:1
 +37                       SET PSJOI=""
                           SET ND=$GET(^PS(55,DFN,"IV",ON,6))
                           FOR ADS="AD","SOL"
                               IF 'PSJOI
                                   FOR ON1=0:0
                                       SET ON1=$ORDER(^PS(55,DFN,"IV",ON,ADS,ON1))
                                       if 'ON1!PSJOI
                                           QUIT 
                                       SET XX=+$GET(^PS(55,DFN,"IV",ON,ADS,ON1,0))
                                       Begin DoDot:2
 +38                                       if XX
                                               SET PSJOI=$SELECT(ADS="AD":$PIECE($GET(^PS(52.6,XX,0)),U,11),1:$PIECE($GET(^PS(52.7,XX,0)),U,11))
                                           IF PSJOI
                                               SET ^PS(55,DFN,"IV",ON,.2)=PSJOI_U_$PIECE(ND,U,2,3)
                                               if TYPE
                                                   WRITE "."
                                       End DoDot:2
 +39                       SET PSJ200=$PIECE($GET(^PS(55,DFN,"IV",ON,2)),U,3)
                           if PSJ200=""
                               QUIT 
 +40                       SET X=$ORDER(^VA(200,"B",PSJ200,0))
                           SET XX=$ORDER(^VA(200,"B",PSJ200,X))
 +41                       IF 'X!XX
                               SET ^XTMP("PSJ NEW PERSON",PSJ200,DFN,ON)=""
                               QUIT 
 +42                       SET $PIECE(^PS(55,DFN,"IV",ON,2),U,11)=X
 +43                       DO EN1^PSJHL2(DFN,"ZC",ON_"V")
 +44      ; convert order location codes for IVs
 +45                       KILL PSJXX
                           SET PSJXX=$GET(^PS(55,DFN,"IV",ON,2))
                           IF $LENGTH(PSJXX)
                               SET $PIECE(PSJXX,"^",5,6)=$$CNV($PIECE(PSJXX,"^",5))_"^"_$$CNV($PIECE(PSJXX,"^",6))
                               SET ^(2)=PSJXX
                               KILL PSJXX
                       End DoDot:1
 +46      ;Delete Unreleased entries after converting.
 +47       FOR ON=0:0
               SET ON=$ORDER(^PS(53.1,"AS","U",DFN,ON))
               if 'ON
                   QUIT 
               IF $GET(^PS(53.1,ON,.2))
                   SET DIK="^PS(53.1,"
                   SET DA=ON
                   DO ^DIK
                   KILL DIK
 +48       if $DATA(^PS(55,DFN,0))
               SET $PIECE(^PS(55,DFN,5.1),U,11)=1
 +49       QUIT 
 +50      ;
NFWS(DFN,ON,PSJPWD) ; Determine if order is NF or WS
 +1       ;Input: DFN - Patient IEN
 +2       ;        ON - Order #_Order Code
 +3       ;    PSJPWD - IEN of patient's ward
 +4       ; Where Order Code IDs order location ("P":53.1; "U":55.06,1:55.01)
 +5       ;Output: NF flag^WS flag^Self Med^Hosp Supplied Self Med
 +6        NEW ND
 +7        if $SELECT(ON["U"
               QUIT ""
 +8       ;S PSJPWD="",X=$P($G(^DPT(DFN,.1)),U) I X]"" S PSJPWD=$O(^DIC(42,"B",X,0))
 +9        SET PSJ=""
           SET PSJREF=$SELECT(ON["P":"^PS(53.1,",1:"^PS(55,"_DFN_",5,")_+ON_","
 +10       FOR PSJDD=0:0
               SET PSJDD=$ORDER(@(PSJREF_"1,"_PSJDD_")"))
               if 'PSJDD
                   QUIT 
               SET ND=$GET(^(PSJDD,0))
               DO CHKDD
 +11       SET $PIECE(PSJ,U,3,4)=$PIECE($GET(@(PSJREF_"0)")),U,5,6)
 +12       QUIT PSJ
 +13      ;
CHKDD     ; Determine if dispense drug is NF or WS
 +1       ;
 +2        if $PIECE($GET(^PSDRUG(+ND,0)),U,9)
               SET $PIECE(PSJ,U)=1
 +3        if $$WSCHK^PSJO(PSJPWD,+ND)
               SET $PIECE(PSJ,U,2)=1
 +4        QUIT 
FIND      ;
 +1        FOR DFN=0:0
               SET DFN=$ORDER(^PS(55,DFN))
               if 'DFN
                   QUIT 
               Begin DoDot:1
 +2                IF $ORDER(^PS(55,DFN,5,0))!$ORDER(^PS(55,DFN,"IV",0))
                       Begin DoDot:2
 +3                        IF '$PIECE($GET(^PS(55,DFN,5.1)),U,11)
                               WRITE !,DFN
                       End DoDot:2
               End DoDot:1
 +4        QUIT 
 +5       ;
CNV(PSJM) ; converts order location codes to just 'U' 'P' and 'V'
 +1        IF PSJM=""
               QUIT PSJM
 +2        IF PSJM["V"
               QUIT PSJM
 +3        IF PSJM["A"!(PSJM["O")
               QUIT ($EXTRACT(PSJM,1,$LENGTH(+PSJM))_"U")
 +4        IF PSJM["N"!(PSJM["P")
               QUIT ($EXTRACT(PSJM,1,$LENGTH(+PSJM))_"P")
 +5        QUIT PSJM
CNV2(IEN507) ; converts pending orders with 3rd piece set to "I"
 +1       ;            is the orderable item marked for IV ?
 +2        IF $PIECE($GET(^PS(50.7,IEN507,0)),"^",3)=1
               QUIT "I"
 +3       IF '$TEST
               QUIT "U"
 +4        QUIT 
CNIV(DFN) ;Converts OI on active and pending IV orders for POE
 +1       ;for all patients or a selected patient
 +2        NEW ON,PSGDT,STPDT,START,PSJX
 +3        IF $GET(DFN)
               Begin DoDot:1
 +4                SET PSJX=$PIECE($GET(^PS(55,DFN,5.1)),U,11)
 +5                if PSJX=3
                       QUIT 
 +6                IF PSJX=2
                       DO MARKIV^PSJUTL3(DFN)
                       QUIT 
               End DoDot:1
               if PSJX>1
                   QUIT 
 +7       ;I '$D(^XTMP("PSSCONA")),'$D(^XTMP("PSSCONS")) Q
 +8        DO NOW^%DTC
           SET START=%
 +9        SET X1=DT_".0001"
           SET X2=-365
 +10       DO C^%DTC
           SET PSGDT=X
 +11       IF $GET(DFN)
               DO CNIV1(DFN)
               DO MARKIV^PSJUTL3(DFN)
               QUIT 
 +12       NEW DFN
 +13       FOR DFN=0:0
               SET DFN=$ORDER(^PS(55,DFN))
               if 'DFN
                   QUIT 
               DO CNIV1(DFN)
               DO MARKIV^PSJUTL3(DFN)
 +14       DO ENIVUD^PSJ0050
 +15       DO SEND
 +16       QUIT 
CNIV1(DFN) ;
 +1       ;I $P($G(^PS(55,DFN,5.1)),U,11)=2 Q
 +2        if '$$L^PSSLOCK(DFN,0)
               QUIT 
 +3        SET $PIECE(^PS(55,DFN,5.1),U,11)=2
 +4        IF '$DATA(^XTMP("PSSCONA"))
               IF '$DATA(^XTMP("PSSCONS"))
                   DO UL^PSSLOCK(DFN)
                   QUIT 
 +5        FOR STPDT=PSGDT:0
               SET STPDT=$ORDER(^PS(55,DFN,"IV","AIS",STPDT))
               if 'STPDT
                   QUIT 
               Begin DoDot:1
 +6                FOR ON=0:0
                       SET ON=$ORDER(^PS(55,DFN,"IV","AIS",STPDT,ON))
                       if 'ON
                           QUIT 
                       DO IVCHK
               End DoDot:1
 +7        FOR ON=0:0
               SET ON=$ORDER(^PS(53.1,"AS","P",DFN,ON))
               if 'ON
                   QUIT 
               DO PENDING
 +8        DO UL^PSSLOCK(DFN)
 +9        QUIT 
IVCHK     ;Match AD/SOL against Xtmp
 +1        NEW PSJAD,PSJCNR,PSJOI,PSJSOL,PSJXAD,PSJXNOI,PSJXSOL
 +2        SET PSJOI=+$GET(^PS(55,DFN,"IV",ON,.2))
           if '+PSJOI
               QUIT 
 +3       ;
 +4       ;Set local array for AD/SOL from the order
 +5        FOR PSJAD=0:0
               SET PSJAD=$ORDER(^PS(55,DFN,"IV",ON,"AD",PSJAD))
               if 'PSJAD
                   QUIT 
               Begin DoDot:1
 +6                IF $GET(^PS(55,DFN,"IV",ON,"AD",PSJAD,0))
                       SET PSJAD(+^(0))=""
               End DoDot:1
 +7        FOR PSJSOL=0:0
               SET PSJSOL=$ORDER(^PS(55,DFN,"IV",ON,"SOL",PSJSOL))
               if 'PSJSOL
                   QUIT 
               Begin DoDot:1
 +8                IF $GET(^PS(55,DFN,"IV",ON,"SOL",PSJSOL,0))
                       SET PSJSOL(+^(0))=""
               End DoDot:1
 +9        DO MATCH
           DO UPD(ON_"V")
 +10       QUIT 
 +11      ;
MATCH     ;If AD/SOL from XTMP matches to AD/SOL within the order, set new OI array
 +1        KILL PSJXNOI
 +2        FOR PSJXAD=0:0
               SET PSJXAD=$ORDER(^XTMP("PSSCONA",+PSJOI,PSJXAD))
               if 'PSJXAD
                   QUIT 
               Begin DoDot:1
 +3                IF $DATA(PSJAD(PSJXAD))
                       SET PSJXNOI(+^XTMP("PSSCONA",+PSJOI,PSJXAD))=""
               End DoDot:1
 +4        FOR PSJXSOL=0:0
               SET PSJXSOL=$ORDER(^XTMP("PSSCONS",+PSJOI,PSJXSOL))
               if 'PSJXSOL
                   QUIT 
               Begin DoDot:1
 +5                IF $DATA(PSJSOL(PSJXSOL))
                       SET PSJXNOI(+^XTMP("PSSCONS",+PSJOI,PSJXSOL))=""
               End DoDot:1
 +6        QUIT 
 +7       ;
UPD(ON)   ;Loop thru the new OI array
 +1        NEW PSJCNT
           SET PSJCNT=0
 +2        FOR X=0:0
               SET X=$ORDER(PSJXNOI(X))
               if 'X
                   QUIT 
               SET PSJCNT=PSJCNT+1
 +3        IF PSJCNT=1
               Begin DoDot:1
 +4                SET PSJXNOI=$ORDER(PSJXNOI(0))
 +5                IF +PSJOI=PSJXNOI
                       QUIT 
 +6                SET X=$PIECE($GET(^PS(50.7,PSJXNOI,0)),U,4)
 +7                IF X]""
                       IF (X'>DT)
                           QUIT 
 +8       ;/W !,"DFN: ",DFN," ON: ",ON," NEW OI: ",PSJXNOI
 +9                if ON["V"
                       SET $PIECE(^PS(55,DFN,"IV",+ON,.2),U,1)=+PSJXNOI
 +10               if ON["P"
                       SET $PIECE(^PS(53.1,+ON,.2),U,1)=+PSJXNOI
 +11               DO EN1^PSJHL2(DFN,"ZC",ON)
 +12               DO EN^PSJ0050(DFN,+ON,+PSJOI,PSJXNOI)
               End DoDot:1
 +13       QUIT 
PENDING   ;Converting Pending IV order with Ad/Sol
 +1        NEW PSJAD,PSJOI,PSJSOL,PSJXNOI
 +2        SET X=$PIECE($GET(^PS(53.1,ON,0)),U,4)
           IF $SELECT(X="I":0,X="F":0,1:1)
               QUIT 
 +3        SET PSJOI=+$GET(^PS(53.1,ON,.2))
           if '+PSJOI
               QUIT 
 +4       ;
 +5       ;If pending has no AD/SOL, and on 1 new OI matched to old OI then update.
 +6        IF '$DATA(^PS(53.1,ON,"AD"))
               IF '$DATA(^PS(53.1,ON,"SOL"))
                   Begin DoDot:1
 +7                    FOR X=0:0
                           SET X=$ORDER(^XTMP("PSSCONA",PSJOI,X))
                           if 'X
                               QUIT 
                           SET PSJXNOI(+^(X))=""
 +8                    FOR X=0:0
                           SET X=$ORDER(^XTMP("PSSCONS",PSJOI,X))
                           if 'X
                               QUIT 
                           SET PSJXNOI(+^(X))=""
 +9                    DO UPD(ON_"P")
                   End DoDot:1
                   QUIT 
 +10      ;
 +11      ;Loop thru the pending AD/SOL
 +12       FOR PSJAD=0:0
               SET PSJAD=$ORDER(^PS(53.1,ON,"AD",PSJAD))
               if 'PSJAD
                   QUIT 
               Begin DoDot:1
 +13               IF $GET(^PS(53.1,ON,"AD",PSJAD,0))
                       SET PSJAD(+^(0))=""
               End DoDot:1
 +14       FOR PSJSOL=0:0
               SET PSJSOL=$ORDER(^PS(55,ON,"SOL",PSJSOL))
               if 'PSJSOL
                   QUIT 
               Begin DoDot:1
 +15               IF $GET(^PS(53.1,ON,"SOL",PSJSOL,0))
                       SET PSJSOL(+^(0))=""
               End DoDot:1
 +16       DO MATCH
           DO UPD(ON_"P")
 +17       QUIT 
SEND      ;Send mail message
 +1        NEW DIFROM,XMDUZ,XMSUB,XMTEXT,XMY,STOP,LINE
 +2        DO NOW^%DTC
           SET STOP=%
 +3        SET LINE(1)="The conversion was first started:  "_$$FMTE^XLFDT(START)
 +4        SET LINE(2)="It ran to completion:              "_$$FMTE^XLFDT(STOP)
 +5        SET XMSUB="Inpatient Meds IV conversion"
           SET XMTEXT="LINE("
 +6        SET XMDUZ="Inpatient Meds POE"
 +7        SET XMY(+DUZ)=""
           DO ^XMD
 +8        QUIT 
PSSDGCK   ;Run Drug Check Util
 +1        DO ^PSSDIUTL
 +2        QUIT 
INSTLDT() ;Return the date PSJ*5*58 was first installed
 +1        NEW DIC,X,Y
 +2        SET X=$ORDER(^XPD(9.7,"B","PSJ*5.0*58",0))
 +3        if '+X
               QUIT ""
 +4        SET DIC="^XPD(9.7,"
           SET DIC(0)="NZ"
           DO ^DIC
 +5        QUIT $PIECE($GET(Y(0)),U,3)