| 1 | PSBUTL ;BIRMINGHAM/EFC-BCMA UTILITIES ;Mar 2004 | 
|---|
| 2 | ;;3.0;BAR CODE MED ADMIN;**3,9,13,38**;Mar 2004;Build 8 | 
|---|
| 3 | ;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | ; Reference/IA | 
|---|
| 6 | ; $$PATCH & $$VERSION^XPDUTL/10141 | 
|---|
| 7 | ; File 50/221 | 
|---|
| 8 | ; File 200/10060 | 
|---|
| 9 | ; | 
|---|
| 10 | ; | 
|---|
| 11 | DIWP(X,Y,PSB,PSBARGN) ; | 
|---|
| 12 | K ^UTILITY($J,"W") | 
|---|
| 13 | S DIWL=0,DIWR=Y,DIWF="C"_Y D ^DIWP | 
|---|
| 14 | F X=0:0 S X=$O(^UTILITY($J,"W",0,X)) Q:'X  D | 
|---|
| 15 | .S Y=$O(@PSB@(""),-1)+1 | 
|---|
| 16 | .; Naked Ref ^UTILITY($J,"W",0,X) | 
|---|
| 17 | .S @PSB@(Y)=$J("",+$G(PSBARGN))_^(X,0) | 
|---|
| 18 | S @PSB@(0)=+$O(@PSB@(""),-1) | 
|---|
| 19 | K ^UTILITY($J,"W"),DIWL,DIWR,DIWF | 
|---|
| 20 | Q | 
|---|
| 21 | ; | 
|---|
| 22 | SATURDAY(X,PSBDISP) ; | 
|---|
| 23 | S X=X\1 D H^%DTC ; Convert to $H | 
|---|
| 24 | S %H=%H+(6-%Y) ;   Set it forward to Saturday | 
|---|
| 25 | D YMD^%DTC ;       Back to FM Format | 
|---|
| 26 | I $G(PSBDISP) S PSBDISP=$E(X,4,5)_"/"_$E(X,6,7)_"/"_(1700+$E(X,1,3)) D EN^DDIOL("Actual date is Saturday "_PSBDISP) | 
|---|
| 27 | Q X | 
|---|
| 28 | ; | 
|---|
| 29 | SUNDAY(X,PSBDISP) ; | 
|---|
| 30 | S X=X\1 D H^%DTC ; Convert to $H | 
|---|
| 31 | S %H=%H-%Y ;       Set it back to Sunday | 
|---|
| 32 | D YMD^%DTC ;       Back to FM Format | 
|---|
| 33 | I $G(PSBDISP) S PSBDISP=$E(X,4,5)_"/"_$E(X,6,7)_"/"_(1700+$E(X,1,3)) D EN^DDIOL("Actual date is Sunday "_PSBDISP) | 
|---|
| 34 | Q X | 
|---|
| 35 | ; | 
|---|
| 36 | CLOCK(RESULTS,X) ; Verify Client/Server Date/Times are close enough | 
|---|
| 37 | ; | 
|---|
| 38 | ; RPC: PSB SERVER CLOCK VARIANCE | 
|---|
| 39 | ; | 
|---|
| 40 | ; Description: | 
|---|
| 41 | ; Returns variance from server to client in minutes | 
|---|
| 42 | ; | 
|---|
| 43 | N PSBCLNT,PSBSRVR,PSBDIFF | 
|---|
| 44 | S %DT="RS" D ^%DT S PSBCLNT=Y | 
|---|
| 45 | D NOW^%DTC S PSBSRVR=% | 
|---|
| 46 | S PSBDIFF=$$DIFF(PSBSRVR,PSBCLNT) | 
|---|
| 47 | S X=$$GET^XPAR("DIV","PSB SERVER CLOCK VARIANCE") | 
|---|
| 48 | I PSBDIFF>X!(PSBDIFF<(X*-1)) S RESULTS(0)="-1^"_PSBDIFF | 
|---|
| 49 | E  S RESULTS(0)="1^"_PSBDIFF | 
|---|
| 50 | Q | 
|---|
| 51 | ; | 
|---|
| 52 | DIFF(X,X1) ; Difference in minutes between 2 FM dates | 
|---|
| 53 | ; Code copied from Fileman Function MINUTES | 
|---|
| 54 | S Y=$E(X1_"000",9,10)-$E(X_"000",9,10)*60+$E(X1_"00000",11,12)-$E(X_"00000",11,12),X2=X,X=$P(X,".",1)'=$P(X1,".",1) D ^%DTC:X S X=X*1440+Y | 
|---|
| 55 | Q X | 
|---|
| 56 | ; | 
|---|
| 57 | DRUGINQ ; Drug File Inquiry | 
|---|
| 58 | N PSBRET,PSBIEN,DIC,DIR,IOINORM,IOINHI | 
|---|
| 59 | S X="IOINHI;IOINORM" D ENDR^%ZISS | 
|---|
| 60 | S X=$TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") | 
|---|
| 61 | S DIC="^PSDRUG(",DIC(0)="AEQMVTN",DIC("T")="",D="B^C^VAPN^VAC^NDC^XATC",DIC("A")="Select DRUG: " | 
|---|
| 62 | ; Display active drugs and those for appl packages IV and Unit Dose | 
|---|
| 63 | S DIC("S")="I '$G(^PSDRUG(+Y,""I""))!($G(^(""I""))>DT),$P($G(^PSDRUG(+Y,2)),U,3)[""I""!($P($G(^PSDRUG(+Y,2)),U,3)[""U"")" | 
|---|
| 64 | F  W @IOF,!,"DRUG FILE INQUIRY",! D ^DIC  Q:+Y<1  D | 
|---|
| 65 | .K PSBRET | 
|---|
| 66 | .S PSBIEN=+Y_"," | 
|---|
| 67 | .D GETS^DIQ(50,PSBIEN,".01;16;25;51;215;213;101;9*","","PSBRET") | 
|---|
| 68 | .W @IOF,!,"DRUG NAME: ",IOINHI,PSBRET(50,PSBIEN,.01) | 
|---|
| 69 | .W "  (IEN: ",+PSBIEN,")",IOINORM,!,$TR($J("",IOM)," ","-"),! | 
|---|
| 70 | .F X=16,25,51,215,213,101 D | 
|---|
| 71 | ..D FIELD^DID(50,X,"","LABEL","PSBRET") | 
|---|
| 72 | ..W !,PSBRET("LABEL"),":",?30,IOINHI | 
|---|
| 73 | ..D:$L(PSBRET(50,PSBIEN,X))>49 | 
|---|
| 74 | ...F Y=1:1 Q:$L($P(PSBRET(50,PSBIEN,X)," ",1,Y))>49 | 
|---|
| 75 | ...W $P(PSBRET(50,PSBIEN,X)," ",1,Y-1),!?30 | 
|---|
| 76 | ...S PSBRET(50,PSBIEN,X)=$P(PSBRET(50,PSBIEN,X)," ",Y,250) | 
|---|
| 77 | ..W ?30,PSBRET(50,PSBIEN,X),IOINORM | 
|---|
| 78 | .W !!,"SYNONYMS:",IOINHI,!?15 | 
|---|
| 79 | .S X="" F  S X=$O(PSBRET(50.1,X)) Q:X=""  W:$X>40 !?15 W:$X>15 ?40 W PSBRET(50.1,X,.01) | 
|---|
| 80 | .W IOINORM | 
|---|
| 81 | .F  Q:$Y>(IOSL-3)  W ! | 
|---|
| 82 | .S DIR(0)="E" D ^DIR | 
|---|
| 83 | Q | 
|---|
| 84 | ; | 
|---|
| 85 | DPTSET ; Set Logic for pt-merge x-ref on patient field in file 53.79 | 
|---|
| 86 | ; | 
|---|
| 87 | ; Entered Date/Time | 
|---|
| 88 | I $P(^PSB(53.79,DA,0),U,4) S ^PSB(53.79,"AEDT",X,$P(^PSB(53.79,DA,0),U,4),DA)="" | 
|---|
| 89 | ; | 
|---|
| 90 | ; Administration Date/Time | 
|---|
| 91 | D:$P(^PSB(53.79,DA,0),U,6) | 
|---|
| 92 | .S ^PSB(53.79,"AADT",X,$P(^PSB(53.79,DA,0),U,6),DA)="" | 
|---|
| 93 | .; | 
|---|
| 94 | .; Orderable Item + Administration Date/Time | 
|---|
| 95 | .I $P(^PSB(53.79,DA,0),U,8) S ^PSB(53.79,"AOIP",X,$P(^PSB(53.79,DA,0),U,8),$P(^PSB(53.79,DA,0),U,6),DA)="" | 
|---|
| 96 | ; | 
|---|
| 97 | ; PRN's by entered date/time | 
|---|
| 98 | I $P($G(^PSB(53.79,DA,.1)),U,2)="P"&($P(^(0),U,4)) S ^PSB(53.79,"APRN",X,$P(^PSB(53.79,DA,0),U,4),DA)="" | 
|---|
| 99 | ; | 
|---|
| 100 | ; Order+Administration Date and Time | 
|---|
| 101 | I $P($G(^PSB(53.79,DA,.1)),U)]""&($P($G(^PSB(53.79,DA,.1)),U,3)) S ^PSB(53.79,"AORD",X,$P(^PSB(53.79,DA,.1),U),$P(^PSB(53.79,DA,.1),U,3),DA)="" | 
|---|
| 102 | Q | 
|---|
| 103 | ; | 
|---|
| 104 | DPTKILL ; Kill Logic for pt-merge x-ref on patient field in file 53.79 | 
|---|
| 105 | ; | 
|---|
| 106 | ; Entered Date/Time | 
|---|
| 107 | I $P(^PSB(53.79,DA,0),U,4) K ^PSB(53.79,"AEDT",X,$P(^PSB(53.79,DA,0),U,4),DA) | 
|---|
| 108 | ; | 
|---|
| 109 | ; Administration Date/Time | 
|---|
| 110 | D:$P(^PSB(53.79,DA,0),U,6) | 
|---|
| 111 | .K ^PSB(53.79,"AADT",X,$P(^PSB(53.79,DA,0),U,6),DA) | 
|---|
| 112 | .; | 
|---|
| 113 | .; Orderable Item + Administration Date/Time | 
|---|
| 114 | .I $P(^PSB(53.79,DA,0),U,8) K ^PSB(53.79,"AOIP",X,$P(^PSB(53.79,DA,0),U,8),$P(^PSB(53.79,DA,0),U,6),DA) | 
|---|
| 115 | ; | 
|---|
| 116 | ; PRN's by entered date/time | 
|---|
| 117 | I $P($G(^PSB(53.79,DA,.1)),U,2)="P"&($P(^(0),U,4)) K ^PSB(53.79,"APRN",X,$P(^PSB(53.79,DA,0),U,4),DA) | 
|---|
| 118 | ; | 
|---|
| 119 | ; Order+Administration Date and Time | 
|---|
| 120 | I $P($G(^PSB(53.79,DA,.1)),U)]""&($P($G(^PSB(53.79,DA,.1)),U,3)) K ^PSB(53.79,"AORD",X,$P(^PSB(53.79,DA,.1),U),$P(^PSB(53.79,DA,.1),U,3),DA) | 
|---|
| 121 | Q | 
|---|
| 122 | ; | 
|---|
| 123 | TIMEIN ; | 
|---|
| 124 | X ^%ZOSF("UPPERCASE") S X=Y | 
|---|
| 125 | I X="NOON" S X=.12 Q | 
|---|
| 126 | I X="MID" S X=.24 Q | 
|---|
| 127 | I (X="NOW")!(X="N") D NOW^%DTC S X=$E($P(%,".",2)_"0000",1,4) | 
|---|
| 128 | S X="T@"_X,%DT="R" D ^%DT | 
|---|
| 129 | I Y<1 K X Q | 
|---|
| 130 | S X=Y-DT | 
|---|
| 131 | Q | 
|---|
| 132 | ; | 
|---|
| 133 | TIMEOUT(X) ; | 
|---|
| 134 | N HOUR,MIN,AMPM | 
|---|
| 135 | S X=$E($P(X,".",2)_"0000",1,4) | 
|---|
| 136 | I X="2400" Q "12:00m" | 
|---|
| 137 | I X="1200" Q "12:00n" | 
|---|
| 138 | S HOUR=+$E(X,1,2),MIN=$E(X,3,4) | 
|---|
| 139 | S AMPM="a" | 
|---|
| 140 | S AMPM=$S(HOUR<12:"a",HOUR>11:"p",1:"**") | 
|---|
| 141 | S:HOUR>12 HOUR=HOUR-12 | 
|---|
| 142 | Q HOUR_":"_MIN_AMPM | 
|---|
| 143 | ; | 
|---|
| 144 | HFSOPEN(HANDLE) ; | 
|---|
| 145 | N PSBDIR,PSBFILE | 
|---|
| 146 | S PSBDIR=$$GET^XPAR("DIV","PSB HFS SCRATCH") | 
|---|
| 147 | S PSBFILE="PSB"_DUZ_".DAT" | 
|---|
| 148 | D OPEN^%ZISH(HANDLE,PSBDIR,PSBFILE,"W") Q:POP | 
|---|
| 149 | S IOM=132,IOSL=99999,IOST="P-DUMMY",IOF="""""" | 
|---|
| 150 | Q | 
|---|
| 151 | ; | 
|---|
| 152 | HFSCLOSE(HANDLE) ; | 
|---|
| 153 | N PSBDIR,PSBFILE,PSBDEL | 
|---|
| 154 | D CLOSE^%ZISH(HANDLE) | 
|---|
| 155 | K ^TMP("PSBO",$J) | 
|---|
| 156 | S PSBDIR=$$GET^XPAR("DIV","PSB HFS SCRATCH") | 
|---|
| 157 | S PSBFILE="PSB"_DUZ_".DAT",PSBDEL(PSBFILE)="" | 
|---|
| 158 | S X=$$FTG^%ZISH(PSBDIR,PSBFILE,$NAME(^TMP("PSBO",$J,2)),3) | 
|---|
| 159 | S X=$$DEL^%ZISH(PSBDIR,$NA(PSBDEL)) | 
|---|
| 160 | Q | 
|---|
| 161 | ; | 
|---|
| 162 | AUDIT(PSBREC,PSBDD,PSBFLD,PSBDATA,PSBSK) ; Med Log Audit | 
|---|
| 163 | ; used by cross references to 53.79 to track changes to fields in Med Log file | 
|---|
| 164 | ; xref AU05, AU06, AU09, AU16, AU21, AU22 pass the value 53.79 as PSBDD | 
|---|
| 165 | ; xref AU303, AU304 pass the value 53.795 as PSBDD | 
|---|
| 166 | ; xref AU603, AU604 pass the value 53.796 as PSBDD | 
|---|
| 167 | ; xref AU703, AU704 pass the value 53.797 as PSBDD | 
|---|
| 168 | ; | 
|---|
| 169 | N PSBDT,PSBTMP | 
|---|
| 170 | I '$D(PSBOLSTS) S PSBOLSTS=$P(^PSB(53.79,PSBREC,0),U,9) | 
|---|
| 171 | I '$D(PSBOLDUZ) S PSBOLDUZ=$P(^PSB(53.79,PSBREC,0),U,5) | 
|---|
| 172 | Q:$G(PSBDATA)=""!('$G(PSBAUDIT)) | 
|---|
| 173 | D NOW^%DTC S PSBDT=% | 
|---|
| 174 | S PSBDATA=$$EXTERNAL^DILFD(PSBDD,PSBFLD,"",PSBDATA)  ; PSBDD=53.79, 53.795, 53.796, or 53.797 see comment AUDIT | 
|---|
| 175 | D FIELD^DID(PSBDD,PSBFLD,"","LABEL","PSBTMP")  ; PSBDD=53.79, 53.795, 53.796, or 53.797 see comment AUDIT | 
|---|
| 176 | S:'$D(^PSB(53.79,PSBREC,.9,0)) ^(0)="^53.799^^" | 
|---|
| 177 | S Y=$O(^PSB(53.79,PSBREC,.9,""),-1)+1,X="" | 
|---|
| 178 | I PSBTMP("LABEL")["ACTION STATUS" D  Q | 
|---|
| 179 | .I PSBSK["K" S XY=Y F  S XY=$O(^PSB(53.79,PSBREC,.9,XY),-1) Q:($D(PSBGOON))!(+XY'>0)  D | 
|---|
| 180 | ..I ^PSB(53.79,PSBREC,.9,XY,0)["ACTION STATUS Set to '" D  Q | 
|---|
| 181 | ...S PSBGOON=1,PSBOLDUZ=$P(^PSB(53.79,PSBREC,.9,XY,0),U,2),X=$P(^PSB(53.79,PSBREC,.9,XY,0),"'",2) | 
|---|
| 182 | .S:$L(X)'>2 X=PSBOLSTS,X=$S(X="G":"GIVEN",X="H":"HELD",X="R":"REFUSED",X="I":"INFUSING",X="C":"COMPLETED",X="S":"STOPPED",X="N":"NOT GIVEN",X="RM":"REMOVED",X="M":"MISSING DOSE",X="":PSBOLSTS) | 
|---|
| 183 | .I PSBSK["K" S ^PSB(53.79,PSBREC,.9,Y,0)=PSBDT_U_DUZ_U_"Field: "_PSBTMP("LABEL")_" '"_PSBDATA_"' by '"_$$GET1^DIQ(200,PSBOLDUZ,"INITIAL")_"' deleted." | 
|---|
| 184 | .E  S ^PSB(53.79,PSBREC,.9,Y,0)=PSBDT_U_DUZ_U_"Field: "_PSBTMP("LABEL")_" Set to '"_PSBDATA_"' by '"_$$GET1^DIQ(200,DUZ,"INITIAL")_"'."_U_PSBDATA | 
|---|
| 185 | I PSBSK["K" S ^PSB(53.79,PSBREC,.9,Y,0)=PSBDT_U_DUZ_U_"Field: "_PSBTMP("LABEL")_" '"_PSBDATA_"' deleted." | 
|---|
| 186 | E  S ^PSB(53.79,PSBREC,.9,Y,0)=PSBDT_U_DUZ_U_"Field: "_PSBTMP("LABEL")_$S(PSBTMP("LABEL")["DISPENSE DRUG":" Added '",1:" Set to '")_PSBDATA_"'." | 
|---|
| 187 | K XY,PSBGOON | 
|---|
| 188 | Q | 
|---|
| 189 | ; | 
|---|
| 190 | CHECK(RESULTS,PSBWHAT,PSBDATA) ; Checks for KIDS Patch or Build | 
|---|
| 191 | ; Module added in Patch PSB*1.0*3 DP/TOPEKA 22-DEC-1999 11:51:22 | 
|---|
| 192 | ; PSBWHAT: B = Returns Build Version for packages by Namespace | 
|---|
| 193 | ;          P = Returns if Patch is installed | 
|---|
| 194 | ; PSBDATA: Build/Package namespace (i.e. PSB) or Patch Number | 
|---|
| 195 | ;         (i.e. PSB*1.0*1) | 
|---|
| 196 | ; | 
|---|
| 197 | S RESULTS(0)="-1^Unknown Parameter "_$G(PSBWHAT,"<PSBWHAT Undefined>") | 
|---|
| 198 | S PSBWHAT=$G(PSBWHAT),PSBDATA=$G(PSBDATA) | 
|---|
| 199 | D:PSBWHAT="B" | 
|---|
| 200 | .S X=$$VERSION^XPDUTL(PSBDATA) | 
|---|
| 201 | .S RESULTS(0)=$S(X="":"-1^Unknown Package/Build",1:"1^"_X) | 
|---|
| 202 | D:PSBWHAT="P" | 
|---|
| 203 | .S X=$$PATCH^XPDUTL(PSBDATA) | 
|---|
| 204 | .S RESULTS(0)=$S(X:"1^Patch Is Installed",1:"-1^Patch Is Not Installed") | 
|---|
| 205 | Q | 
|---|
| 206 | ; | 
|---|
| 207 | VERSION() ; [Extrinsic] | 
|---|
| 208 | ; Returns V#.# for display purposes | 
|---|
| 209 | Q "V"_$J(2,0,1) | 
|---|
| 210 | ; | 
|---|
| 211 | RESETADM ; | 
|---|
| 212 | ; | 
|---|
| 213 | ;  This Subroutine will reset a medication order's resources | 
|---|
| 214 | ;  based on Med Log New Entry or Edit Med Log activity. | 
|---|
| 215 | ; | 
|---|
| 216 | ;  No input is necessary. Environment should be setup at call. | 
|---|
| 217 | ; | 
|---|
| 218 | I '$G(PSBMMEN) S X=$S($P(PSBIEN,",",2)]"":$P(PSBIEN,",",2),1:+PSBIEN) D CLEAN^PSBVT,PSJ1^PSBVT($P(^PSB(53.79,X,0),U),$P(^PSB(53.79,X,.1),U)) D:($$IVPTAB^PSBVDLU3(PSBOTYP,PSBIVT,PSBISYR,PSBCHEMT,+$G(PSBIVPSH)))  D CLEAN^PSBVT | 
|---|
| 219 | .S X=PSBIEN,X2=X_$S(X="+1":",",1:"") Q:'$D(PSBFDA(53.79,X2,.09))  I $F("HR",PSBFDA(53.79,X2,.09))>1 S PSBFDA(53.79,X2,.26)="" | 
|---|
| 220 | I $G(PSBMMEN),PSBIEN="+1",$G(PSBONX)["V" S PSBWSID=PSBFDA(53.79,"+1,",.26) K PSBFDA(53.79,"+1,",.26),PSBFDA(53.79,"+1,",.09) | 
|---|
| 221 | I $G(PSBMMEN) I ($D(PSBWSID))&($G(Y(0))="SAVE") D | 
|---|
| 222 | .S:(PSBREC(3)="G") PSBFDAX(53.79,X,.26)=PSBWSID | 
|---|
| 223 | .S:$F("HR",PSBREC(3))>1 PSBFDAX(53.79,X,.26)="" | 
|---|
| 224 | .S X=$P(PSBIEN,"+1,",2) | 
|---|
| 225 | .D UPDATE^DIE("","PSBFDAX","X","PSBMSG") | 
|---|
| 226 | Q | 
|---|
| 227 | ; | 
|---|
| 228 | SCRNPTCH ; | 
|---|
| 229 | ; | 
|---|
| 230 | ; Maintain the "APATCH" index from SCREENMAN and Manual Med Entry. | 
|---|
| 231 | ; | 
|---|
| 232 | I Y(0)'="GIVEN" S PSBGPTCH=0 Q | 
|---|
| 233 | S PSBX=0 F  S PSBX=$O(^PSB(53.79,DA,.5,PSBX))  Q:+PSBX=0  Q:$P(^PSB(53.79,DA,.5,+PSBX,0),U,4)="PATCH" | 
|---|
| 234 | Q:+PSBX=0 | 
|---|
| 235 | S PSBGPTCH=1 | 
|---|
| 236 | Q | 
|---|
| 237 | ; | 
|---|
| 238 | GIVEPTCH ; | 
|---|
| 239 | I $D(^PSB(53.79,"AORD",DFN,PSBONX)) N PSBX S PSBX="" F  S PSBX=$O(^PSB(53.79,"AORD",DFN,PSBONX,PSBX)) Q:+PSBX=0  D:$D(^PSB(53.79,"AORD",DFN,PSBONX,PSBX,DA))  Q:'$D(PSBX) | 
|---|
| 240 | .I $D(^PSB(53.79,"AORD",DFN,PSBONX,PSBX,DA)) D | 
|---|
| 241 | ..S PSBX=$P(^PSB(53.79,DA,0),U,6) | 
|---|
| 242 | ..I PSBGPTCH S ^PSB(53.79,"APATCH",DFN,PSBX,DA)="" K PSBX,PSBGPTCH Q | 
|---|
| 243 | ..I 'PSBGPTCH K ^PSB(53.79,"APATCH",DFN,PSBX,DA),PSBX,PSBGPTCH | 
|---|
| 244 | Q | 
|---|