| 1 | PSOUTLA1 ;BHAM ISC/RTR-Pharmacy utility program cont. ;5/22/07 10:01am | 
|---|
| 2 | ;;7.0;OUTPATIENT PHARMACY;**35,186,218,259,206**;DEC 1997;Build 39 | 
|---|
| 3 | ;External reference to File ^PS(55 supported by DBIA 2228 | 
|---|
| 4 | ;External reference to File ^PSDRUG supported by DBIA 221 | 
|---|
| 5 | ;External reference to File ^PS(59.7 supported by DBIA 694 | 
|---|
| 6 | ;External reference to File ^PS(51 supported by DBIA 2224 | 
|---|
| 7 | ; | 
|---|
| 8 | ;*186 - add DEACHK function | 
|---|
| 9 | ;*218 - add REFIP function | 
|---|
| 10 | ;*259 - reverse *218 delete restriction only warn of deleting | 
|---|
| 11 | ;       also add del of last refill only | 
|---|
| 12 | ; | 
|---|
| 13 | EN1 ;Formats condensed, back door sig in BSIG array | 
|---|
| 14 | ;pass in  1) Internal Rx from 52 | 
|---|
| 15 | ;         2) max length of BSIG array | 
|---|
| 16 | ;Returned, still condensed, in BSIG array, when looping through, check for array=null, if so, juist don't print it | 
|---|
| 17 | EN2(PSOBINTR,PSOBLGTH) ; | 
|---|
| 18 | K BSIG | 
|---|
| 19 | N BBSIG,BVAR,BVAR1,III,CNT,NNN,BLIM | 
|---|
| 20 | S BBSIG=$P($G(^PSRX(PSOBINTR,"SIG")),"^") Q:BBSIG=""!($P($G(^("SIG")),"^",2)) | 
|---|
| 21 | S (BVAR,BVAR1)="",III=1 | 
|---|
| 22 | S CNT=0 F NNN=1:1:$L(BBSIG) I $E(BBSIG,NNN)=" "!($L(BBSIG)=NNN) S CNT=CNT+1 D  I $L(BVAR)>PSOBLGTH S BSIG(III)=BLIM_" ",III=III+1,BVAR=BVAR1 | 
|---|
| 23 | .S BVAR1=$P(BBSIG," ",(CNT)) | 
|---|
| 24 | .S BLIM=BVAR | 
|---|
| 25 | .S BVAR=$S(BVAR="":BVAR1,1:BVAR_" "_BVAR1) | 
|---|
| 26 | I $G(BVAR)'="" S BSIG(III)=BVAR | 
|---|
| 27 | I $G(BSIG(1))=""!($G(BSIG(1))=" ") S BSIG(1)=$G(BSIG(2)) K BSIG(2) | 
|---|
| 28 | Q | 
|---|
| 29 | ; | 
|---|
| 30 | EN3(PSOBINTR,PSOBLGTH) ; | 
|---|
| 31 | ;Pass in to EN3 the internal Rx number from 52, and the length of | 
|---|
| 32 | ;the array you want. Returns expanded Sig, or warning from PSOHELP | 
|---|
| 33 | ;concantenated with the condensed Sig in the BSIG array | 
|---|
| 34 | ;BACK DOOR ONLY | 
|---|
| 35 | K BSIG,X N BBSIG,BVAR,BVAR1,III,CNT,NNN,BLIM,Y,SIG,Z0,Z1,BBWARN | 
|---|
| 36 | S BBSIG=$P($G(^PSRX(PSOBINTR,"SIG")),"^") Q:BBSIG=""!($P($G(^("SIG")),"^",2)) | 
|---|
| 37 | S (SIG,X)=BBSIG | 
|---|
| 38 | I $E(BBSIG)=" " S BBWARN="Leading spaces are not allowed in the SIG!" G START | 
|---|
| 39 | S SIG="" Q:$L(X)<1  F Z0=1:1:$L(X," ") G:Z0="" START S Z1=$P(X," ",Z0) D  G:'$D(X) START | 
|---|
| 40 | .I $L(Z1)>32 S BBWARN="MAX OF 32 CHARACTERS ALLOWED BETWEEN SPACES!" K X Q | 
|---|
| 41 | .D:$D(X)&($G(Z1)]"")  S SIG=SIG_" "_Z1 | 
|---|
| 42 | ..S Y=$O(^PS(51,"B",Z1,0)) Q:'Y!($P($G(^PS(51,+Y,0)),"^",4)>1)  S Z1=$P(^PS(51,Y,0),"^",2) Q:'$D(^(9))  S Y=$P(X," ",Z0-1),Y=$E(Y,$L(Y)) S:Y>1 Z1=^(9) | 
|---|
| 43 | START ; | 
|---|
| 44 | S BBSIG=$S($G(BBWARN)="":SIG,1:BBWARN_"  "_BBSIG) | 
|---|
| 45 | S (BVAR,BVAR1)="",III=1 | 
|---|
| 46 | S CNT=0 F NNN=1:1:$L(BBSIG) I $E(BBSIG,NNN)=" "!($L(BBSIG)=NNN) S CNT=CNT+1 D  I $L(BVAR)>PSOBLGTH S BSIG(III)=BLIM_" ",III=III+1,BVAR=BVAR1 | 
|---|
| 47 | .S BVAR1=$P(BBSIG," ",(CNT)) | 
|---|
| 48 | .S BLIM=BVAR | 
|---|
| 49 | .S BVAR=$S(BVAR="":BVAR1,1:BVAR_" "_BVAR1) | 
|---|
| 50 | I $G(BVAR)'="" S BSIG(III)=BVAR | 
|---|
| 51 | I $G(BSIG(1))=""!($G(BSIG(1))=" ") S BSIG(1)=$G(BSIG(2)) K BSIG(2) | 
|---|
| 52 | Q | 
|---|
| 53 | PATCH ;Allow sites to backfill more than what was done at install | 
|---|
| 54 | N PSOBACKL,PSOBACKI,PSOBACKS,PSOBACKB,PSOBACKD,PSOBACKA | 
|---|
| 55 | S PSOBACKL=$O(^PS(59.7,0)),PSOBACKI=$E($P($G(^PS(59.7,+$G(PSOBACKL),49.99)),"^",7),1,7) | 
|---|
| 56 | I '$G(PSOBACKI) S PSOBACKI=$P($G(^PS(59.7,+$G(PSOBACKL),49.99)),"^",4) | 
|---|
| 57 | I $G(PSOBACKI) S Y=PSOBACKI D DD^%DT S PSOBACKS=Y S X1=PSOBACKI,X2=-120 D C^%DTC S (Y,PSOBACKB)=X D DD^%DT S PSOBACKD=Y | 
|---|
| 58 | I $G(PSOBACKD)'="" W !!,"Your CPRS/Outpatient installation date is "_$G(PSOBACKS)_","_" which",!,"means we have already backfilled all active prescriptions and all",!,"prescriptions canceled or expired after "_$G(PSOBACKD)_"." | 
|---|
| 59 | I  W !!,"If you want to backfill orders that were canceled or expired prior to this",!,"date of "_$G(PSOBACKD)_", enter an earlier date and those orders",!,"will be backfilled to CPRS.",! | 
|---|
| 60 | I $G(PSOBACKD)="" W !!,"We cannot determine the date of the CPRS/Outpatient installation.",! | 
|---|
| 61 | W !,"If you choose to backfill more orders to CPRS by utilizing this option,",!,"we remind you that disk storage can be significantly affected, depending on",!,"how many orders are backfilled.",! | 
|---|
| 62 | K DIR S DIR(0)="Y",DIR("B")="N",DIR("A")="Do you want to backfill more prescriptions",DIR("?")="Enter Yes to backfill prescriptions canceled or expired before "_$G(PSOBACKD) D ^DIR K DIR I Y'=1 W ! G PATCHQ | 
|---|
| 63 | W ! S %DT="AEPX",%DT("A")="Enter Date to begin backfill: " S:$G(PSOBACKB) %DT(0)=-PSOBACKB D ^%DT G:Y<0!($D(DTOUT)) PATCHQ S PSOBACKA=$E(Y,1,7) | 
|---|
| 64 | W ! K ZTDTH S ZTSAVE("PSOBACKB")="",ZTSAVE("PSOBACKA")="",ZTRTN="PATCHR^PSOUTLA1",ZTDESC="BACKFILL PRSCRIPTIONS TO CPRS",ZTIO="" D ^%ZTLOAD W ! G PATCHQ | 
|---|
| 65 | PATCHR ;Begin task | 
|---|
| 66 | N PSOPAL,PSOLPD,PSOLPRX | 
|---|
| 67 | S PSOBACKA=PSOBACKA-.01 | 
|---|
| 68 | I '$G(PSOBACKB) S PSOBACKB=DT | 
|---|
| 69 | F PSOPAL=0:0 S PSOPAL=$O(^PS(55,PSOPAL)) Q:'PSOPAL  F PSOLPD=PSOBACKA:0 S PSOLPD=$O(^PS(55,PSOPAL,"P","A",PSOLPD)) Q:'PSOLPD!(PSOLPD>PSOBACKB)  F PSOLPRX=0:0 S PSOLPRX=$O(^PS(55,PSOPAL,"P","A",PSOLPD,PSOLPRX)) Q:'PSOLPRX  D | 
|---|
| 70 | .I $P($G(^PSRX(PSOLPRX,0)),"^")=""!('$P($G(^(0)),"^",2))!('$P($G(^(0)),"^",6)) Q | 
|---|
| 71 | .I $P($G(^PSRX(PSOLPRX,"OR1")),"^",2) Q | 
|---|
| 72 | .I '$P($G(^PSRX(PSOLPRX,0)),"^",19) D | 
|---|
| 73 | ..I $P($G(^PSRX(PSOLPRX,"OR1")),"^")="",+$G(^PSDRUG(+$P($G(^PSRX(PSOLPRX,0)),"^",6),2)) S $P(^PSRX(PSOLPRX,"OR1"),"^")=+$G(^PSDRUG(+$P($G(^PSRX(PSOLPRX,0)),"^",6),2)) | 
|---|
| 74 | ..I $P($G(^PSRX(PSOLPRX,0)),"^",10)'="",$G(^PSRX(PSOLPRX,"SIG"))']"",'$O(^PSRX(PSOLPRX,"SIG1",0)) S ^PSRX(PSOLPRX,"SIG")=$P($G(^PSRX(PSOLPRX,0)),"^",10)_"^"_0 S $P(^PSRX(PSOLPRX,0),"^",10)="" | 
|---|
| 75 | ..I $P($G(^PSRX(PSOLPRX,"STA")),"^")="",$P($G(^PSRX(PSOLPRX,0)),"^",15)'="" S $P(^PSRX(PSOLPRX,"STA"),"^")=$P($G(^PSRX(PSOLPRX,0)),"^",15) S $P(^PSRX(PSOLPRX,0),"^",15)="" | 
|---|
| 76 | ..S $P(^PSRX(PSOLPRX,0),"^",19)=1 | 
|---|
| 77 | .S PSOLPSTA=$P($G(^PSRX(PSOLPRX,"STA")),"^") Q:PSOLPSTA=""!(PSOLPSTA=13)!(PSOLPSTA=10) | 
|---|
| 78 | .D EN^PSOHLSN1(PSOLPRX,"ZC","") | 
|---|
| 79 | .I PSOLPSTA'="",PSOLPSTA<10 D | 
|---|
| 80 | ..I +$P($G(^PSRX(PSOLPRX,2)),"^",6),+$P($G(^(2)),"^",6)<DT S $P(^PSRX(PSOLPRX,"STA"),"^")=11,PSOLPSTA=11 | 
|---|
| 81 | .S PSOLPSTX=$S(PSOLPSTA=3:"OH",PSOLPSTA=16:"OH",PSOLPSTA=12:"OD",PSOLPSTA=15:"OD",PSOLPSTA=14:"OD",1:"SC"),PSOLPSTZ=$S(PSOLPSTA=0:"CM",PSOLPSTA=1:"IP",PSOLPSTA=4:"IP",PSOLPSTA=5:"ZS",PSOLPSTA=11:"ZE",1:"") | 
|---|
| 82 | .D EN^PSOHLSN1(PSOLPRX,PSOLPSTX,PSOLPSTZ,"") | 
|---|
| 83 | S:$D(ZTQUEUED) ZTREQ="@" | 
|---|
| 84 | PATCHQ Q | 
|---|
| 85 | ; | 
|---|
| 86 | ;PSO*186 | 
|---|
| 87 | DEACHK(PSIRXN,PSDEA,PSDAYS,PCLOZ,PSOCS,PSMAXRF) ;Apply DEA restrictions | 
|---|
| 88 | ; | 
|---|
| 89 | ; If no refills allowed indicate that and set Max refills to number | 
|---|
| 90 | ; of fills thus far, or if new order, then num of refills will not be | 
|---|
| 91 | ; found and Max refills will be 0. | 
|---|
| 92 | ; | 
|---|
| 93 | ;  Function returns: 1 = no refills allowed | 
|---|
| 94 | ;                    0 = ok to refill | 
|---|
| 95 | ;  Input Variables: PSIRXN = internal RX number or "*"=(new order) | 
|---|
| 96 | ;                   PSDEA  = DEA special handling for drug ordered | 
|---|
| 97 | ;                   PSDAYS = Days supply ordered | 
|---|
| 98 | ;                   PCLOZ  = Clozapine patient? (Optional) | 
|---|
| 99 | ; Output Variables: PSOCS  = Controlled sub flag  (Optional) | 
|---|
| 100 | ;                   PSMAXRF= Max Refill allowed by DEA restriction | 
|---|
| 101 | ;                                                 (Optional) | 
|---|
| 102 | ; | 
|---|
| 103 | S PSIRXN=+$G(PSIRXN),PSDEA=$G(PSDEA),PSDAYS=+$G(PSDAYS) | 
|---|
| 104 | S PSOCS=+$G(PSOCS),PSMAXRF=+$G(PSMAXRF),PCLOZ=$G(PCLOZ) | 
|---|
| 105 | ; | 
|---|
| 106 | ;if clozapine patient (passed in 0 or 1),  set max refills and quit | 
|---|
| 107 | I PCLOZ=0 S PSMAXRF=0 Q 1 | 
|---|
| 108 | I PCLOZ=1 S PSMAXRF=1 Q 0 | 
|---|
| 109 | ; | 
|---|
| 110 | ;no refills if PSDEA = 'A' & not 'B' or 'F', | 
|---|
| 111 | I (PSDEA["A")&(PSDEA'["B")!(PSDEA["F")!(PSDEA[1)!(PSDEA[2) D  Q 1 | 
|---|
| 112 | . S PSMAXRF=$$NUMFILLS(PSIRXN) | 
|---|
| 113 | ; | 
|---|
| 114 | N QQ | 
|---|
| 115 | F QQ=1:1 Q:$E(PSDEA,QQ)=""  I $E(+PSDEA,QQ)>1,$E(+PSDEA,QQ)<6 D | 
|---|
| 116 | . S PSOCS=1 | 
|---|
| 117 | . S:$E(+PSDEA,QQ)=2 $P(PSOCS,"^",2)=1 | 
|---|
| 118 | ; | 
|---|
| 119 | ;no refills allowed on sched 2 | 
|---|
| 120 | I $P(PSOCS,"^",2)=1 S PSMAXRF=$$NUMFILLS(PSIRXN) Q 1 | 
|---|
| 121 | ; | 
|---|
| 122 | ;set max refill for controlled substance & other based on days supply | 
|---|
| 123 | S PSDAYS=+$G(PSDAYS) | 
|---|
| 124 | I PSOCS D | 
|---|
| 125 | . S PSMAXRF=$S(PSDAYS<60:5,PSDAYS'<60&(PSDAYS'>89):2,PSDAYS=90:1,1:0) | 
|---|
| 126 | E  D | 
|---|
| 127 | . S PSMAXRF=$S(PSDAYS<60:11,PSDAYS'<60&(PSDAYS'>89):5,PSDAYS=90:3,1:0) | 
|---|
| 128 | ; | 
|---|
| 129 | ;get number of fills if applies & compare to Max refills | 
|---|
| 130 | N PNFILLS S PNFILLS=$$NUMFILLS(PSIRXN) | 
|---|
| 131 | I PNFILLS'<PSMAXRF S PSMAXRF=PNFILLS Q 1 | 
|---|
| 132 | ; | 
|---|
| 133 | Q 0 | 
|---|
| 134 | ; | 
|---|
| 135 | NUMFILLS(PSIRXN) ;Return number of fills thus far, or 0 if doesn't apply | 
|---|
| 136 | ; function returns: if   Active drug, then number of refills thus far | 
|---|
| 137 | ;                   else return 0 for does not apply | 
|---|
| 138 | ;  Input Variables: PSIRXN = internal RX number (Optional) | 
|---|
| 139 | Q:'$G(PSIRXN) 0 | 
|---|
| 140 | N RFN,RFNC | 
|---|
| 141 | S (RFN,RFNC)=0 | 
|---|
| 142 | F  S RFN=$O(^PSRX(PSIRXN,1,RFN)) Q:'RFN  S RFNC=RFNC+1 | 
|---|
| 143 | Q RFNC | 
|---|
| 144 | ; | 
|---|
| 145 | REFIP(RXI,RFIL,TYP) ;Check if refill is Not Released and In Process and | 
|---|
| 146 | ;           pending Auto Release by an external dispense machine. | 
|---|
| 147 | ; Input: RXI = internal Prescription no. | 
|---|
| 148 | ;        RFIL= refill number | 
|---|
| 149 | ;        TYP ="R"-refill or "P"-partial | 
|---|
| 150 | ; Returns 1 = In Process      (Not OK to delete) | 
|---|
| 151 | ;         0 = Not In Process  (OK to delete) | 
|---|
| 152 | ; | 
|---|
| 153 | ;assumes a refill is Not In Process by the external dispense machine | 
|---|
| 154 | ;unless it finds a record in this file and is marked to the contrary | 
|---|
| 155 | ; | 
|---|
| 156 | N PSIEN,IP,FOUND,EXDATA,EXDIV | 
|---|
| 157 | S (IP,FOUND)=0,PSIEN="" | 
|---|
| 158 | ;find first specified refill processing backwards, in case dupes | 
|---|
| 159 | F  S PSIEN=$O(^PS(52.51,"B",RXI,PSIEN),-1) Q:PSIEN=""  D  Q:FOUND | 
|---|
| 160 | . S EXDATA=^PS(52.51,PSIEN,0) | 
|---|
| 161 | . I $P(EXDATA,"^",9)=RFIL D | 
|---|
| 162 | . . S EXDIV=$P(EXDATA,"^",11) | 
|---|
| 163 | . . Q:'$P($G(^PS(59,EXDIV,"DISP")),"^",2)     ;quit, not auto release | 
|---|
| 164 | . . S FOUND=1 | 
|---|
| 165 | . I FOUND,$P(^PS(52.51,PSIEN,0),"^",10)'=2 S IP=1 | 
|---|
| 166 | Q IP | 
|---|
| 167 | ; | 
|---|
| 168 | WARN1 ;partial del checks    *259 | 
|---|
| 169 | N PSR,PSOL | 
|---|
| 170 | S PSR=0 F  S PSR=$O(^PSRX(DA(1),"P",PSR)) Q:'PSR  S PSOL=PSR | 
|---|
| 171 | I DA=PSOL,$P(^PSRX(DA(1),"P",DA,0),"^",19) D  Q | 
|---|
| 172 | .D EN^DDIOL("Partial Released! Use the 'Return to Stock' option!","","$C(7),!!"),EN^DDIOL(" ","","!") | 
|---|
| 173 | ; | 
|---|
| 174 | ;Warn of In Process, Only delete if answered Yes         ;*259 | 
|---|
| 175 | I $$REFIP^PSOUTLA1(DA(1),DA,"P") D  I 'Y Q               ;reset $T | 
|---|
| 176 | . D EN^DDIOL("** Partial refill has previously been sent to the External Dispense Machine","","!!,?2") | 
|---|
| 177 | . D EN^DDIOL("** for filling and is still Pending Processing","","$C(7),!,?2") | 
|---|
| 178 | . D EN^DDIOL("","","!") | 
|---|
| 179 | . K DIR | 
|---|
| 180 | . S DIR("A")="Do you want to continue? " | 
|---|
| 181 | . S DIR("B")="Y" | 
|---|
| 182 | . S DIR(0)="YA^^" | 
|---|
| 183 | . S DIR("?")="Enter Y for Yes or N for No." | 
|---|
| 184 | . D ^DIR | 
|---|
| 185 | . K DIR | 
|---|
| 186 | Q | 
|---|