| 1 | PSJUTL1 ;BIR/MLM-MISC. INPATIENT UTILITIES ;29 Jul 98 / 4:29 PM
 | 
|---|
| 2 |  ;;5.0; INPATIENT MEDICATIONS ;**15,50,58**;16 DEC 97
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ; Reference to ^PSSLOCK is supported by DBIA# 2789.
 | 
|---|
| 5 |  ; Reference to ^PS(55 is supported by DBIA# 2191.
 | 
|---|
| 6 |  ; Reference to ^PS(50.7 is supported by DBIA# 2180.
 | 
|---|
| 7 |  ; Reference to ^PS(52.6 is supported by DBIA# 1231.
 | 
|---|
| 8 |  ; Reference to ^PS(52.7 is supported by DBIA# 2173.
 | 
|---|
| 9 |  ; Reference to ^PS(59.7 is supported by DBIA# 2181.
 | 
|---|
| 10 |  ; Reference to ^PSDRUG is supported by DBIA# 2192.
 | 
|---|
| 11 |  ; Reference to ^XPD(9.7 is supported by DBIA# 2197.
 | 
|---|
| 12 |  ;
 | 
|---|
| 13 | CONVERT(DFN,TYPE) ;
 | 
|---|
| 14 |  ; Convert existing UD orders to new format. Only run once/patient, and
 | 
|---|
| 15 |  ; only converts orders with a stop date<(5.0 Install date-365)
 | 
|---|
| 16 |  ;  DFN = Patient IEN
 | 
|---|
| 17 |  ; TYPE = Background or Interactive mode
 | 
|---|
| 18 |  ;
 | 
|---|
| 19 |  S TYPE=TYPE&($E($G(IOST))="C")
 | 
|---|
| 20 |  ;I '$D(^PS(55,DFN,0))!($P($G(^PS(55,DFN,5.1)),U,11)=1) Q
 | 
|---|
| 21 |  ;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
 | 
|---|
| 22 |  I $P($G(^PS(55,DFN,5.1)),U,11)=1 Q
 | 
|---|
| 23 |  N ADS,ADS1,DDRG,ND,ON,ON1,PSGDT,PSJOI,STAT,STPDT,STS,X,XX,X1,X2
 | 
|---|
| 24 |  ;I '$D(^PS(55,DFN,0)) D
 | 
|---|
| 25 |  ;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
 | 
|---|
| 26 |  I '$D(^PS(55,DFN,0))&($D(^PS(55,DFN))!($O(^PS(53.1,"C",DFN,0)))) D
 | 
|---|
| 27 |  .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
 | 
|---|
| 28 |  ;I TYPE W !!,"Converting old orders for ",$P($G(^DPT(DFN,0)),U)," to new format."
 | 
|---|
| 29 |  S X1=$P($G(^PS(59.7,1,20)),U,2),X2=-365 I 'X1 D NOW^%DTC S X1=$P(%,".")
 | 
|---|
| 30 |  D C^%DTC S PSGDT=X
 | 
|---|
| 31 |  ;Convert and Backfill orders in 53.1.
 | 
|---|
| 32 |  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
 | 
|---|
| 33 |  .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))
 | 
|---|
| 34 |  .I 'PSJOI F DDRG=0:0 S DDRG=$O(^PSDRUG("AP",+ND,DDRG)) Q:'DDRG!PSJOI  S PSJOI=+$G(^PSDRUG(DDRG,2)) D
 | 
|---|
| 35 |  .; convert pending UD orders that have "I" in 4th piece for TYPE
 | 
|---|
| 36 |  .I STAT="P",($P($G(^PS(53.1,ON,0)),"^",4)="I"),(PSJOI) S $P(^PS(53.1,ON,0),"^",4)=$$CNV2(PSJOI)
 | 
|---|
| 37 |  .I PSJOI S ^PS(53.1,ON,.2)=PSJOI_U_$P(ND,U,2) W:TYPE "."
 | 
|---|
| 38 |  .I PSJOI!($P($G(^PS(53.1,+ON,0)),U,4)="F") D EN1^PSJHL2(DFN,"ZC",ON_"P")
 | 
|---|
| 39 |  .; convert order location codes for ^PS(53.1
 | 
|---|
| 40 |  .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
 | 
|---|
| 41 |  ;Convert and Backfill UD orders.
 | 
|---|
| 42 |  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
 | 
|---|
| 43 |  .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))
 | 
|---|
| 44 |  .I 'PSJOI F DDRG=0:0 S DDRG=$O(^PSDRUG("AP",+ND,DDRG)) Q:'DDRG!PSJOI  S PSJOI=+$G(^PSDRUG(DDRG,2))
 | 
|---|
| 45 |  .I PSJOI S ^PS(55,DFN,5,ON,.2)=PSJOI_U_$P(ND,U,2) W:TYPE "." D EN1^PSJHL2(DFN,"ZC",ON_"U")
 | 
|---|
| 46 |  .; convert order location codes for Unit Dose orders
 | 
|---|
| 47 |  .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
 | 
|---|
| 48 |  ;Convert and Backfill IV orders.
 | 
|---|
| 49 |  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
 | 
|---|
| 50 |  .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
 | 
|---|
| 51 |  ..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 "."
 | 
|---|
| 52 |  .S PSJ200=$P($G(^PS(55,DFN,"IV",ON,2)),U,3) Q:PSJ200=""
 | 
|---|
| 53 |  .S X=$O(^VA(200,"B",PSJ200,0)),XX=$O(^VA(200,"B",PSJ200,X))
 | 
|---|
| 54 |  .I 'X!XX S ^XTMP("PSJ NEW PERSON",PSJ200,DFN,ON)="" Q
 | 
|---|
| 55 |  .S $P(^PS(55,DFN,"IV",ON,2),U,11)=X
 | 
|---|
| 56 |  .D EN1^PSJHL2(DFN,"ZC",ON_"V")
 | 
|---|
| 57 |  .; convert order location codes for IVs
 | 
|---|
| 58 |  .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
 | 
|---|
| 59 |  ;Delete Unreleased entries after converting.
 | 
|---|
| 60 |  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
 | 
|---|
| 61 |  S:$D(^PS(55,DFN,0)) $P(^PS(55,DFN,5.1),U,11)=1
 | 
|---|
| 62 |  Q
 | 
|---|
| 63 |  ;
 | 
|---|
| 64 | NFWS(DFN,ON,PSJPWD)       ; Determine if order is NF or WS
 | 
|---|
| 65 |  ;Input: DFN - Patient IEN
 | 
|---|
| 66 |  ;        ON - Order #_Order Code
 | 
|---|
| 67 |  ;    PSJPWD - IEN of patient's ward
 | 
|---|
| 68 |  ; Where Order Code IDs order location ("P":53.1; "U":55.06,1:55.01)
 | 
|---|
| 69 |  ;Output: NF flag^WS flag^Self Med^Hosp Supplied Self Med
 | 
|---|
| 70 |  N ND
 | 
|---|
| 71 |  Q:$S(ON["U":0,1:ON'["P") ""
 | 
|---|
| 72 |  ;S PSJPWD="",X=$P($G(^DPT(DFN,.1)),U) I X]"" S PSJPWD=$O(^DIC(42,"B",X,0))
 | 
|---|
| 73 |  S PSJ="",PSJREF=$S(ON["P":"^PS(53.1,",1:"^PS(55,"_DFN_",5,")_+ON_","
 | 
|---|
| 74 |  F PSJDD=0:0 S PSJDD=$O(@(PSJREF_"1,"_PSJDD_")")) Q:'PSJDD  S ND=$G(^(PSJDD,0)) D CHKDD
 | 
|---|
| 75 |  S $P(PSJ,U,3,4)=$P($G(@(PSJREF_"0)")),U,5,6)
 | 
|---|
| 76 |  Q PSJ
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 | CHKDD ; Determine if dispense drug is NF or WS
 | 
|---|
| 79 |  ;
 | 
|---|
| 80 |  S:$P($G(^PSDRUG(+ND,0)),U,9) $P(PSJ,U)=1
 | 
|---|
| 81 |  S:$$WSCHK^PSJO(PSJPWD,+ND) $P(PSJ,U,2)=1
 | 
|---|
| 82 |  Q
 | 
|---|
| 83 | FIND ;
 | 
|---|
| 84 |  F DFN=0:0 S DFN=$O(^PS(55,DFN)) Q:'DFN  D
 | 
|---|
| 85 |  .I $O(^PS(55,DFN,5,0))!$O(^PS(55,DFN,"IV",0)) D
 | 
|---|
| 86 |  ..I '$P($G(^PS(55,DFN,5.1)),U,11) W !,DFN
 | 
|---|
| 87 |  Q
 | 
|---|
| 88 |  ;
 | 
|---|
| 89 | CNV(PSJM)          ; converts order location codes to just 'U' 'P' and 'V'
 | 
|---|
| 90 |  I PSJM="" Q PSJM
 | 
|---|
| 91 |  I PSJM["V" Q PSJM
 | 
|---|
| 92 |  I PSJM["A"!(PSJM["O") Q ($E(PSJM,1,$L(+PSJM))_"U")
 | 
|---|
| 93 |  I PSJM["N"!(PSJM["P") Q ($E(PSJM,1,$L(+PSJM))_"P")
 | 
|---|
| 94 |  Q PSJM
 | 
|---|
| 95 | CNV2(IEN507)          ; converts pending orders with 3rd piece set to "I"
 | 
|---|
| 96 |  ;            is the orderable item marked for IV ?
 | 
|---|
| 97 |  I $P($G(^PS(50.7,IEN507,0)),"^",3)=1 Q "I"
 | 
|---|
| 98 |  E  Q "U"
 | 
|---|
| 99 |  Q
 | 
|---|
| 100 | CNIV(DFN)    ;Converts OI on active and pending IV orders for POE
 | 
|---|
| 101 |  ;for all patients or a selected patient
 | 
|---|
| 102 |  NEW ON,PSGDT,STPDT,START,PSJX
 | 
|---|
| 103 |  I $G(DFN) D  Q:PSJX>1
 | 
|---|
| 104 |  . S PSJX=$P($G(^PS(55,DFN,5.1)),U,11)
 | 
|---|
| 105 |  . Q:PSJX=3
 | 
|---|
| 106 |  . I PSJX=2 D MARKIV^PSJUTL3(DFN) Q
 | 
|---|
| 107 |  ;I '$D(^XTMP("PSSCONA")),'$D(^XTMP("PSSCONS")) Q
 | 
|---|
| 108 |  D NOW^%DTC S START=%
 | 
|---|
| 109 |  S X1=DT_".0001",X2=-365
 | 
|---|
| 110 |  D C^%DTC S PSGDT=X
 | 
|---|
| 111 |  I $G(DFN) D CNIV1(DFN),MARKIV^PSJUTL3(DFN) Q
 | 
|---|
| 112 |  NEW DFN
 | 
|---|
| 113 |  F DFN=0:0 S DFN=$O(^PS(55,DFN)) Q:'DFN  D CNIV1(DFN),MARKIV^PSJUTL3(DFN)
 | 
|---|
| 114 |  D ENIVUD^PSJ0050
 | 
|---|
| 115 |  D SEND
 | 
|---|
| 116 |  Q
 | 
|---|
| 117 | CNIV1(DFN)   ;
 | 
|---|
| 118 |  ;I $P($G(^PS(55,DFN,5.1)),U,11)=2 Q
 | 
|---|
| 119 |  Q:'$$L^PSSLOCK(DFN,0)
 | 
|---|
| 120 |  S $P(^PS(55,DFN,5.1),U,11)=2
 | 
|---|
| 121 |  I '$D(^XTMP("PSSCONA")),'$D(^XTMP("PSSCONS")) D UL^PSSLOCK(DFN) Q
 | 
|---|
| 122 |  F STPDT=PSGDT:0 S STPDT=$O(^PS(55,DFN,"IV","AIS",STPDT)) Q:'STPDT  D
 | 
|---|
| 123 |  . F ON=0:0 S ON=$O(^PS(55,DFN,"IV","AIS",STPDT,ON)) Q:'ON  D IVCHK
 | 
|---|
| 124 |  F ON=0:0 S ON=$O(^PS(53.1,"AS","P",DFN,ON)) Q:'ON  D PENDING
 | 
|---|
| 125 |  D UL^PSSLOCK(DFN)
 | 
|---|
| 126 |  Q
 | 
|---|
| 127 | IVCHK ;Match AD/SOL against Xtmp
 | 
|---|
| 128 |  NEW PSJAD,PSJCNR,PSJOI,PSJSOL,PSJXAD,PSJXNOI,PSJXSOL
 | 
|---|
| 129 |  S PSJOI=+$G(^PS(55,DFN,"IV",ON,.2)) Q:'+PSJOI
 | 
|---|
| 130 |  ;
 | 
|---|
| 131 |  ;Set local array for AD/SOL from the order
 | 
|---|
| 132 |  F PSJAD=0:0 S PSJAD=$O(^PS(55,DFN,"IV",ON,"AD",PSJAD)) Q:'PSJAD  D
 | 
|---|
| 133 |  . I $G(^PS(55,DFN,"IV",ON,"AD",PSJAD,0)) S PSJAD(+^(0))=""
 | 
|---|
| 134 |  F PSJSOL=0:0 S PSJSOL=$O(^PS(55,DFN,"IV",ON,"SOL",PSJSOL)) Q:'PSJSOL  D
 | 
|---|
| 135 |  . I $G(^PS(55,DFN,"IV",ON,"SOL",PSJSOL,0)) S PSJSOL(+^(0))=""
 | 
|---|
| 136 |  D MATCH,UPD(ON_"V")
 | 
|---|
| 137 |  Q
 | 
|---|
| 138 |  ;
 | 
|---|
| 139 | MATCH ;If AD/SOL from XTMP matches to AD/SOL within the order, set new OI array
 | 
|---|
| 140 |  K PSJXNOI
 | 
|---|
| 141 |  F PSJXAD=0:0 S PSJXAD=$O(^XTMP("PSSCONA",+PSJOI,PSJXAD)) Q:'PSJXAD  D
 | 
|---|
| 142 |  . I $D(PSJAD(PSJXAD)) S PSJXNOI(+^XTMP("PSSCONA",+PSJOI,PSJXAD))=""
 | 
|---|
| 143 |  F PSJXSOL=0:0 S PSJXSOL=$O(^XTMP("PSSCONS",+PSJOI,PSJXSOL)) Q:'PSJXSOL  D
 | 
|---|
| 144 |  . I $D(PSJSOL(PSJXSOL)) S PSJXNOI(+^XTMP("PSSCONS",+PSJOI,PSJXSOL))=""
 | 
|---|
| 145 |  Q
 | 
|---|
| 146 |  ;
 | 
|---|
| 147 | UPD(ON) ;Loop thru the new OI array
 | 
|---|
| 148 |  NEW PSJCNT S PSJCNT=0
 | 
|---|
| 149 |  F X=0:0 S X=$O(PSJXNOI(X)) Q:'X  S PSJCNT=PSJCNT+1
 | 
|---|
| 150 |  I PSJCNT=1 D
 | 
|---|
| 151 |  . S PSJXNOI=$O(PSJXNOI(0))
 | 
|---|
| 152 |  . I +PSJOI=PSJXNOI Q
 | 
|---|
| 153 |  . S X=$P($G(^PS(50.7,PSJXNOI,0)),U,4)
 | 
|---|
| 154 |  . I X]"",(X'>DT) Q
 | 
|---|
| 155 |  . ;/W !,"DFN: ",DFN," ON: ",ON," NEW OI: ",PSJXNOI
 | 
|---|
| 156 |  . S:ON["V" $P(^PS(55,DFN,"IV",+ON,.2),U,1)=+PSJXNOI
 | 
|---|
| 157 |  . S:ON["P" $P(^PS(53.1,+ON,.2),U,1)=+PSJXNOI
 | 
|---|
| 158 |  . D EN1^PSJHL2(DFN,"ZC",ON)
 | 
|---|
| 159 |  . D EN^PSJ0050(DFN,+ON,+PSJOI,PSJXNOI)
 | 
|---|
| 160 |  Q
 | 
|---|
| 161 | PENDING ;Converting Pending IV order with Ad/Sol
 | 
|---|
| 162 |  NEW PSJAD,PSJOI,PSJSOL,PSJXNOI
 | 
|---|
| 163 |  S X=$P($G(^PS(53.1,ON,0)),U,4) I $S(X="I":0,X="F":0,1:1) Q
 | 
|---|
| 164 |  S PSJOI=+$G(^PS(53.1,ON,.2)) Q:'+PSJOI
 | 
|---|
| 165 |  ;
 | 
|---|
| 166 |  ;If pending has no AD/SOL, and on 1 new OI matched to old OI then update.
 | 
|---|
| 167 |  I '$D(^PS(53.1,ON,"AD")),'$D(^PS(53.1,ON,"SOL")) D  Q
 | 
|---|
| 168 |  . F X=0:0 S X=$O(^XTMP("PSSCONA",PSJOI,X)) Q:'X  S PSJXNOI(+^(X))=""
 | 
|---|
| 169 |  . F X=0:0 S X=$O(^XTMP("PSSCONS",PSJOI,X)) Q:'X  S PSJXNOI(+^(X))=""
 | 
|---|
| 170 |  . D UPD(ON_"P")
 | 
|---|
| 171 |  ;
 | 
|---|
| 172 |  ;Loop thru the pending AD/SOL
 | 
|---|
| 173 |  F PSJAD=0:0 S PSJAD=$O(^PS(53.1,ON,"AD",PSJAD)) Q:'PSJAD  D
 | 
|---|
| 174 |  . I $G(^PS(53.1,ON,"AD",PSJAD,0)) S PSJAD(+^(0))=""
 | 
|---|
| 175 |  F PSJSOL=0:0 S PSJSOL=$O(^PS(55,ON,"SOL",PSJSOL)) Q:'PSJSOL  D
 | 
|---|
| 176 |  . I $G(^PS(53.1,ON,"SOL",PSJSOL,0)) S PSJSOL(+^(0))=""
 | 
|---|
| 177 |  D MATCH,UPD(ON_"P")
 | 
|---|
| 178 |  Q
 | 
|---|
| 179 | SEND ;Send mail message
 | 
|---|
| 180 |  NEW DIFROM,XMDUZ,XMSUB,XMTEXT,XMY,STOP,LINE
 | 
|---|
| 181 |  D NOW^%DTC S STOP=%
 | 
|---|
| 182 |  S LINE(1)="The conversion was first started:  "_$$FMTE^XLFDT(START)
 | 
|---|
| 183 |  S LINE(2)="It ran to completion:              "_$$FMTE^XLFDT(STOP)
 | 
|---|
| 184 |  S XMSUB="Inpatient Meds IV conversion",XMTEXT="LINE("
 | 
|---|
| 185 |  S XMDUZ="Inpatient Meds POE"
 | 
|---|
| 186 |  S XMY(+DUZ)="" D ^XMD
 | 
|---|
| 187 |  Q
 | 
|---|
| 188 | INSTLDT() ;Return the date PSJ*5*58 was first installed
 | 
|---|
| 189 |  NEW DIC,X,Y
 | 
|---|
| 190 |  S X=$O(^XPD(9.7,"B","PSJ*5.0*58",0))
 | 
|---|
| 191 |  Q:'+X ""
 | 
|---|
| 192 |  S DIC="^XPD(9.7,",DIC(0)="NZ" D ^DIC
 | 
|---|
| 193 |  Q $P($G(Y(0)),U,3)
 | 
|---|