| [613] | 1 | PSOTALK ;BIR/EJW - SCRIPTALK INTERFACE FROM VISTA ; 3/9/07 10:38am | 
|---|
|  | 2 | ;;7.0;OUTPATIENT PHARMACY;**135,182,211,200,249**;DEC 1997;Build 9 | 
|---|
|  | 3 | ;External reference ^PS(55 supported by DBIA 2228 | 
|---|
|  | 4 | ;External reference to ^PSDRUG supported by DBIA 221 | 
|---|
|  | 5 | ;External reference to ^PS(59.7 controlled subscription by DBIA 694 | 
|---|
|  | 6 | ;ROB SILVERMAN-HINES DEVELOPED ORIGINAL VISTA CUSTOM SOFTWARE FOR SCRIPTALK | 
|---|
|  | 7 | EN Q:'$$PAT55  ; QUIT IF NOT A SCRIPTALK ELIGIBLE PATIENT | 
|---|
|  | 8 | S PSOSTALK=1 | 
|---|
|  | 9 | N PHONE,RXNUM,RXALPHA,DATE,EDATE,RFILLS,PTNAME,SIG,SIGX,PROV,DRUG,WARN,LINE | 
|---|
|  | 10 | D GATHER,TRANS,CLEAN | 
|---|
|  | 11 | Q | 
|---|
|  | 12 | ; | 
|---|
|  | 13 | CLEAN K PHONE,RXNUM,RXALPHA,DATE,EDATE,RFILLS,PTNAME,SIG,SIGX,PROV,DRUG,WARN,VADM | 
|---|
|  | 14 | K PSOCTP,PSOCTV,XMIT,PSORCT,PSOTSSN,PSOEXPDT | 
|---|
|  | 15 | K PSOLNE,PSOLEN,PSOLINE,PSOWORD,PSOWDS,LINE | 
|---|
|  | 16 | K PSOSIG1,PSOLSIG,PSOSIG,PSOSTOP,PSOPMAP | 
|---|
|  | 17 | Q | 
|---|
|  | 18 | BARE N RX | 
|---|
|  | 19 | D CLEAN | 
|---|
|  | 20 | W ! S DIC="^PSRX(",DIC(0)="AEQM" D ^DIC K DIC Q:Y<0  S RX=+Y | 
|---|
|  | 21 | D:'$D(PSOPAR) ^PSOLSET | 
|---|
|  | 22 | I '$$PAT55 W !,"Patient not enrolled in ScripTalk program." G BAREO | 
|---|
|  | 23 | I $P(^PSRX(RX,"STA"),"^")'=0 W !,"Prescription not ACTIVE" G BAREO | 
|---|
|  | 24 | D GATHER | 
|---|
|  | 25 | W !!,"  Queuing ScripTalk label" | 
|---|
|  | 26 | D TRANS | 
|---|
|  | 27 | BAREO D CLEAN | 
|---|
|  | 28 | W !! | 
|---|
|  | 29 | G BARE | 
|---|
|  | 30 | Q | 
|---|
|  | 31 | BARI N RX | 
|---|
|  | 32 | D CLEAN | 
|---|
|  | 33 | S RX=$$READER^PSOTALK1("FO^1:12","Enter Barcode Rx#") | 
|---|
|  | 34 | Q:RX']"" | 
|---|
|  | 35 | G:RX'["-" BARIO | 
|---|
|  | 36 | S RX=$P(RX,"-",2) | 
|---|
|  | 37 | I '$D(^PSRX(RX,0)) W !,"Prescription not on file" G BARIO | 
|---|
|  | 38 | I '$$PAT55 W !,"Patient not enrolled in ScripTalk program." G BARIO | 
|---|
|  | 39 | I $P(^PSRX(RX,"STA"),"^")'=0 W !,"Prescription not ACTIVE" G BARIO | 
|---|
|  | 40 | D:'$D(PSOPAR) ^PSOLSET | 
|---|
|  | 41 | D GATHER | 
|---|
|  | 42 | W !!,"  Queuing ScripTalk label" | 
|---|
|  | 43 | D TRANS | 
|---|
|  | 44 | BARIO D CLEAN | 
|---|
|  | 45 | W !! | 
|---|
|  | 46 | G BARI | 
|---|
|  | 47 | Q | 
|---|
|  | 48 | GATHER ; | 
|---|
|  | 49 | N DFN | 
|---|
|  | 50 | S DFN=$P(^PSRX(RX,0),"^",2) | 
|---|
|  | 51 | D DEM^VADPT | 
|---|
|  | 52 | S PHONE=$$PHONE | 
|---|
|  | 53 | S RXNUM=+$$RXNUM | 
|---|
|  | 54 | S RXALPHA=$$RXALPHA | 
|---|
|  | 55 | S DATE=$$DATE | 
|---|
|  | 56 | S FILLS=$$RFILLS I $L(RFILLS)=1 S FILLS="0"_FILLS | 
|---|
|  | 57 | S PTNAME=VADM(1) D | 
|---|
|  | 58 | .N FNAM,MI | 
|---|
|  | 59 | .S FNAM=$P(PTNAME,",",2) I FNAM[" " D | 
|---|
|  | 60 | ..S MI=$P(FNAM," ",2,99) I MI[" " S MI=$P(MI," ") | 
|---|
|  | 61 | ..S FNAM=$P(FNAM," ") | 
|---|
|  | 62 | .S PTNAME=FNAM_$S($G(MI)'="":" "_MI,1:"")_" "_$P(PTNAME,",") | 
|---|
|  | 63 | .S PTNAME=$$UP^XLFSTR(PTNAME) | 
|---|
|  | 64 | .S PTNAME=$TR(PTNAME,"-"," ") | 
|---|
|  | 65 | .S PTNAME=$TR(PTNAME,".","") | 
|---|
|  | 66 | .S PTNAME=$TR(PTNAME,"'"," ") | 
|---|
|  | 67 | S SIG=$TR($$UP^XLFSTR($$SIGPOE),"[\]^_`{|}~","(/) -'( ) ") | 
|---|
|  | 68 | S SIGX=$TR($$UP^XLFSTR($$SIGPOEX),"[\]^_`{|}~","(/) -'( ) ") | 
|---|
|  | 69 | S PROV=$E($$UP^XLFSTR($$PROV),1,30) | 
|---|
|  | 70 | S DRUG=$TR($$UP^XLFSTR($$DRUG),"[\]^_`{|}~","(/) -'( ) ") | 
|---|
|  | 71 | S WARN=$$WARN | 
|---|
|  | 72 | D PSOEXP | 
|---|
|  | 73 | S LINE(1)="VAMC "_$$CITY_", "_$$STATE_"  "_$$ZIP | 
|---|
|  | 74 | S LINE(2)=$$SITE_" ("_$$CLERK_"/"_$$VRPH_") "_$$ACODE_"-"_$$EPHON_" Exp: "_PSOEXPDT | 
|---|
|  | 75 | S LINE(3)="Rx# "_$$RXNUM_"  "_$$EDATE_"  Fill "_$$FILNO_" of "_$$TFILLS | 
|---|
|  | 76 | S LINE(4)=$$EPAT_"  "_$$LAST6 | 
|---|
|  | 77 | D INST^PSOTALK1 S LINE(5)=$G(PSOLNE(1)),LINE(6)=$G(PSOLNE(2)),LINE(7)=$G(PSOLNE(3)) | 
|---|
|  | 78 | S LINE(8)=$$EPROV,LINE(10)=$$DRUG | 
|---|
|  | 79 | S LINE(9)="Qty: "_$$QTY_"  "_$$DF | 
|---|
|  | 80 | Q | 
|---|
|  | 81 | TRANS ;If printer mapping defined use it; otherwise print by division 01/19/07 | 
|---|
|  | 82 | D PCHK:'$D(PSOPMAP)  ;don't recheck for mapped printer if PSOPMAP equal 0 (not defined) or 1 (defined) | 
|---|
|  | 83 | I '$D(^PS(59.7,1,47,"B",IOS))&('$G(PSOPMAP)) S ZTIO="`"_$P($G(^PS(59,PSOSITE,"STALK")),U) | 
|---|
|  | 84 | Q:ZTIO="`" | 
|---|
|  | 85 | S ZTRTN="GO^PSOTALK",ZTSAVE("*")="",ZTDTH=$$NOW^XLFDT,ZTDESC="Scriptalk Interface Transmission" | 
|---|
|  | 86 | D ^%ZTLOAD | 
|---|
|  | 87 | Q | 
|---|
|  | 88 | PCHK ;Check for printers that are mapped to a ScripTalk printer | 
|---|
|  | 89 | N PSOLPRT,PSONIOS,PSOLBSEQ | 
|---|
|  | 90 | S ZTIO="`",PSOLPRT=$S($D(PSOLAP):PSOLAP,$G(SUSPT):PSLION,$D(ION):ION,1:"") Q:PSOLPRT=""  Q:'$D(^%ZIS(1,"B",PSOLPRT)) | 
|---|
|  | 91 | S PSONIOS="",PSOPMAP=0,PSONIOS=$O(^%ZIS(1,"B",PSOLPRT,PSONIOS)) | 
|---|
|  | 92 | I $D(^PS(59.7,1,47,"B",PSONIOS)) D | 
|---|
|  | 93 | . S PSOLBSEQ="",PSOLBSEQ=$O(^PS(59.7,1,47,"B",PSONIOS,PSOLBSEQ)) | 
|---|
|  | 94 | . S ZTIO=ZTIO_$P(^PS(59.7,1,47,PSOLBSEQ,0),"^",2),PSOPMAP=1 | 
|---|
|  | 95 | Q | 
|---|
|  | 96 | ; | 
|---|
|  | 97 | GO W !,"^XA",!,"^FO250,700^XGE:RX.GRF^FS"  ;;1.2e 4-17-02 TO MOVE GRAPHIC | 
|---|
|  | 98 | D OVERLAY,PICOTAG  ;;FOR LARGER LABELS | 
|---|
|  | 99 | W !,"^PQ1,0,1,Y",!,"^XZ"  ;;FOR LARGER LABELS | 
|---|
|  | 100 | S:$D(ZTQUEUED) ZTREQ="@" | 
|---|
|  | 101 | Q | 
|---|
|  | 102 | ; | 
|---|
|  | 103 | OVERLAY F PSOLINE=1:1:7 D DEFLINE((9+((20-PSOLINE)*28)),50,LINE(PSOLINE),PSOLINE,0) | 
|---|
|  | 104 | F PSOLINE=8:1:10 D DEFLINE((9+((19-PSOLINE)*28)),50,LINE(PSOLINE),PSOLINE,0) | 
|---|
|  | 105 | Q | 
|---|
|  | 106 | ; | 
|---|
|  | 107 | DEFLINE(XCORD,YCORD,PRTOUT,FIELDNO,OFFSET) ; | 
|---|
|  | 108 | W !,"^AFR,20,10^FO"_XCORD_","_YCORD_"^FR^CI0^FD"_PRTOUT_"^FS" | 
|---|
|  | 109 | Q | 
|---|
|  | 110 | ; | 
|---|
|  | 111 | PICOTAG S PSOCTP=1 | 
|---|
|  | 112 | S DRUG=$E(DRUG,1,39)  ;1.2c*1 TEMPORARY FIX FOR DRUG TRUNCATE AT 39 | 
|---|
|  | 113 | F XMIT=PTNAME,DRUG,SIGX,DATE,FILLS,WARN,PROV,PHONE,RXNUM,RXALPHA D XMITP | 
|---|
|  | 114 | Q | 
|---|
|  | 115 | ; | 
|---|
|  | 116 | XMITP W !,"^RX"_$S(PSOCTP<10:"0",1:"")_PSOCTP_","_XMIT_"^FS" | 
|---|
|  | 117 | S PSOCTP=PSOCTP+1 | 
|---|
|  | 118 | Q | 
|---|
|  | 119 | ID() I $$PAT55 Q "+SCRIPTALK" | 
|---|
|  | 120 | E  Q "" | 
|---|
|  | 121 | AUTO ;;v1.2c - LABEL REPRINTING FUNCTIONS 3-12-02 | 
|---|
|  | 122 | Q:$G(PSOTREP)  ;NO AUTO-PRINT DURING REGULAR NON-VOIDED LABEL REPRINT | 
|---|
|  | 123 | D PCHK | 
|---|
|  | 124 | I $P($G(^PS(59,+PSOSITE,"STALK")),U,2)="A"!($G(PSOPMAP)) D EN | 
|---|
|  | 125 | Q | 
|---|
|  | 126 | ; | 
|---|
|  | 127 | PAT55() Q +$G(^PS(55,"ASTALK",$P(^PSRX(RX,0),"^",2)))  ;IS PATIENT ENROLLED (NEW FIELD POSITION 2-12-02 RMS UPDATE v1.2b) | 
|---|
|  | 128 | PHONE() ;changes below 1.2c*1 to swap to site signed-on vs. site from Rx | 
|---|
|  | 129 | Q $E($P(^PS(59,+PSOSITE,0),"^",3),1,3)_$E($TR($P(^PS(59,+PSOSITE,0),"^",4),"-,",""),1,7) ; RX DIVISION PHONE NUMBER | 
|---|
|  | 130 | CITY() Q $P(^PS(59,+PSOSITE,0),"^",7) | 
|---|
|  | 131 | STATE() Q $P(^DIC(5,$P(^PS(59,+PSOSITE,0),"^",8),0),"^",2) | 
|---|
|  | 132 | ZIP() Q $P(^PS(59,+PSOSITE,0),"^",5) | 
|---|
|  | 133 | SITE() Q $P(^PS(59,+PSOSITE,0),"^",6) | 
|---|
|  | 134 | ACODE() Q $P(^PS(59,+PSOSITE,0),"^",3) | 
|---|
|  | 135 | EPHON() Q $P(^PS(59,+PSOSITE,0),"^",4) | 
|---|
|  | 136 | CLERK() Q $P($G(^PSRX(RX,"OR1")),"^",5) | 
|---|
|  | 137 | PSOEXP ; | 
|---|
|  | 138 | N X1,X2,X S X1=DT,X2=365 D C^%DTC S PSOEXPDT=X | 
|---|
|  | 139 | S PSOEXPDT=$E(PSOEXPDT,4,5)_"/"_$E(PSOEXPDT,6,7)_"/"_$E(PSOEXPDT,2,3) | 
|---|
|  | 140 | Q | 
|---|
|  | 141 | VRPH() Q $P($G(^PSRX(RX,2)),"^",10) | 
|---|
|  | 142 | RXNUM() Q $P(^PSRX(RX,0),"^",1) ;RETURN RX EXTERNAL NUMBER | 
|---|
|  | 143 | RXALPHA() ;RETURN RENEWAL LETTER OR SPACE CHARACTER | 
|---|
|  | 144 | N RXALPHA | 
|---|
|  | 145 | S RXALPHA=$E($P(^PSRX(RX,0),"^",1),$L($P(^PSRX(RX,0),"^",1))) | 
|---|
|  | 146 | Q $S(RXALPHA?1A:RXALPHA,1:" ") | 
|---|
|  | 147 | DATE() ;CHANGED 7-30-01 TO USE EDATE FORMAT ALSO WHEN SPEAKING | 
|---|
|  | 148 | S EDATE=$P(^PSRX(RX,3),"^") | 
|---|
|  | 149 | Q $E(EDATE,4,5)_$E(EDATE,6,7)_$E(EDATE,2,3) | 
|---|
|  | 150 | EDATE() Q $$FMTE^XLFDT($P(^PSRX(RX,3),"^"))  ; EXTERNAL DATE / LAST DISPENSED | 
|---|
|  | 151 | FILLS() Q $G(RXF)+1 ; FILL COUNT | 
|---|
|  | 152 | TFILLS() Q $P(^PSRX(RX,0),"^",9)+1 ; TOTAL FILLS | 
|---|
|  | 153 | RFILLS() ;NEW REFILLS REMAINING METHOD 9-21-00, BASED ON PTST+5^PSORXVW | 
|---|
|  | 154 | S RFILLS=$P(^PSRX(RX,0),"^",9),PSORCT=0 F  S PSORCT=$O(^PSRX(RX,1,PSORCT)) Q:'PSORCT  S RFILLS=RFILLS-1 | 
|---|
|  | 155 | Q RFILLS | 
|---|
|  | 156 | FILNO() Q $$TFILLS-$$RFILLS | 
|---|
|  | 157 | EPAT() Q $P(^DPT($P(^PSRX(RX,0),"^",2),0),"^") ; EXTERNAL PATIENT NAME | 
|---|
|  | 158 | LAST6() S PSOTSSN=$P(^DPT($P(^PSRX(RX,0),"^",2),0),"^",9)  ; LAST 6 OF SSN | 
|---|
|  | 159 | Q $E(PSOTSSN,4,5)_"-"_$E(PSOTSSN,6,9) | 
|---|
|  | 160 | SIG() ;THIS SUBROUTINE WILL BE ABANDONED IF SIGPOE WORKS v1.2c 3-13-02 | 
|---|
|  | 161 | I $L($P(^PSRX(RX,"SIG"),"^",1))=0 Q $E($$LSIG^PSOTALK1($P(^PSRX(RX,"SIG1",1,0),"^",1)),1,196) | 
|---|
|  | 162 | E  Q $E($$LSIG^PSOTALK1($P(^PSRX(RX,"SIG"),"^",1)),1,196) ; SIG -- NEEDS TO BE EXPANDED | 
|---|
|  | 163 | SIGPOE() ;v1.2c - NEW SUBROUTINE TO GIVE MESSAGE FOR LONG SIGS FOR THE HUMAN READABLE PORTION | 
|---|
|  | 164 | S PSOSIG="" | 
|---|
|  | 165 | I $P($G(^PS(55,DFN,"LAN")),"^",1) D  G SIGPOEE | 
|---|
|  | 166 | .S PSOSIG=" " ; PUT SPACE ON FRONT OF SIG (GETS STRIPPED OFF LATER) | 
|---|
|  | 167 | .D OTHL1^PSOLBL3(RX) I $O(SIG2(0))="" Q | 
|---|
|  | 168 | .N XX,X | 
|---|
|  | 169 | .;PSO*7*211;MODIFIED TO REPLACE SIG IF >138 INSTEAD OF 196 | 
|---|
|  | 170 | .S XX=0 F  S XX=$O(SIG2(XX)) Q:'XX  S X=SIG2(XX) I X'="" S PSOSIG=PSOSIG_X_" " I $L(PSOSIG)>138 D  Q | 
|---|
|  | 171 | ..S PSOSIG=" INDICACIONES MUY LARGAS. IMPRIMA UNA ETIQUETA DE VISTA VALIDA Y APLIQUELA SOBRE ESTA ETIQUETA DE SCRIPTALK EN LA BOTELLA." | 
|---|
|  | 172 | E  D  ; | 
|---|
|  | 173 | . N PSOSEQ | 
|---|
|  | 174 | . S PSOSTOP=0,PSOSIG="" | 
|---|
|  | 175 | . S PSOLSIG=" SIG IS TOO LONG. REPRINT A NON-VOIDED VISTA LABEL AND PLACE OVER THIS SCRIPTALK LABEL" | 
|---|
|  | 176 | . S PSOSEQ=0 F  S PSOSEQ=$O(^PSRX(RX,"SIG1",PSOSEQ)) Q:PSOSEQ'=+PSOSEQ!($G(PSOSTOP))  D  ; | 
|---|
|  | 177 | .. S PSOSIG1=$G(^PSRX(RX,"SIG1",PSOSEQ,0)) | 
|---|
|  | 178 | ..;PSO*7*211;MODIFIED TO REPLACE SIG IF >138 INSTEAD OF 196 | 
|---|
|  | 179 | .. I $L(PSOSIG)+$L($G(^PSRX(RX,"SIG1",PSOSEQ,0)))>138 S PSOSIG=PSOLSIG,PSOSTOP=1 Q  ; | 
|---|
|  | 180 | .. S PSOSIG=$G(PSOSIG)_" "_PSOSIG1 | 
|---|
|  | 181 | SIGPOEE Q $E(PSOSIG,2,197) | 
|---|
|  | 182 | ; | 
|---|
|  | 183 | SIGPOEX() ;v1.2c - NEW SUBROUTINE TO GIVE MESSAGE FOR LONG SIGS FOR THE READ ALOUD PORTION | 
|---|
|  | 184 | S PSOSIG="" | 
|---|
|  | 185 | I $P($G(^PS(55,DFN,"LAN")),"^",1) D  G SIGPOEEX | 
|---|
|  | 186 | .S PSOSIG=" " ; PUT SPACE ON FRONT OF SIG (GETS STRIPPED OFF LATER) | 
|---|
|  | 187 | .D OTHL1^PSOLBL3(RX) I $O(SIG2(0))="" Q | 
|---|
|  | 188 | .N XX,X | 
|---|
|  | 189 | .S XX=0 F  S XX=$O(SIG2(XX)) Q:'XX  S X=SIG2(XX) I X'="" S PSOSIG=PSOSIG_X_" " I $L(PSOSIG)>196 D  Q | 
|---|
|  | 190 | ..S PSOSIG=" LAS INSTRUCCIONES DE ESTA RECETA SON MUY LARGAS.  POR FAVOR SOLICITE A SU CUIDADOR QUE LE LEA LAS INSTRUCCIONES IMPRESAS EN EL ROTULO O COMUNIQUESE CON SU MEDICO PARA INSTRUCCIONES COMPLETAS." | 
|---|
|  | 191 | I $L($P(^PSRX(RX,"SIG"),"^",1))'=0 Q $E($$LSIG^PSOTALK1($P(^PSRX(RX,"SIG"),"^",1)),1,196) | 
|---|
|  | 192 | E  D  ; | 
|---|
|  | 193 | . N PSOSEQ | 
|---|
|  | 194 | . S PSOSTOP=0,PSOSIG="" | 
|---|
|  | 195 | . S PSOLSIG=" THE INSTRUCTIONS FOR THIS PRESCRIPTION ARE TOO LONG. PLEASE HAVE A CAREGIVER READ THE PRINTED LABEL OR CONTACT YOUR PHYSICIAN FOR COMPLETE INSTRUCTIONS." | 
|---|
|  | 196 | . S PSOSEQ=0 F  S PSOSEQ=$O(^PSRX(RX,"SIG1",PSOSEQ)) Q:PSOSEQ'=+PSOSEQ!($G(PSOSTOP))  D  ; | 
|---|
|  | 197 | .. S PSOSIG1=$G(^PSRX(RX,"SIG1",PSOSEQ,0)) | 
|---|
|  | 198 | .. I $L(PSOSIG)+$L($G(^PSRX(RX,"SIG1",PSOSEQ,0)))>196 S PSOSIG=PSOLSIG,PSOSTOP=1 Q  ; | 
|---|
|  | 199 | .. S PSOSIG=$G(PSOSIG)_" "_PSOSIG1 | 
|---|
|  | 200 | SIGPOEEX Q $E(PSOSIG,2,197) | 
|---|
|  | 201 | PROV() ;PROVIDER NAME | 
|---|
|  | 202 | K DIC,X,Y S DIC="^VA(200,",DIC(0)="M",X="`"_+$P(^PSRX(RX,0),"^",4) D ^DIC S PSOPHYS=$S(+Y:$P(Y,"^",2),1:"UNKNOWN") K DIC,X,Y | 
|---|
|  | 203 | Q $P($$NAMEFMT^XLFNAME(PSOPHYS)," MD") | 
|---|
|  | 204 | EPROV() ; | 
|---|
|  | 205 | K DIC,X,Y S DIC="^VA(200,",DIC(0)="M",X="`"_+$P(^PSRX(RX,0),"^",4) D ^DIC S PSOPHYS=$S(+Y:$P(Y,"^",2),1:"UNKNOWN") K DIC,X,Y | 
|---|
|  | 206 | Q PSOPHYS | 
|---|
|  | 207 | QTY() Q $S($G(RXP):$P(RXP,"^",4),1:$P(^PSRX(RX,0),"^",7)) | 
|---|
|  | 208 | DF() Q $P($G(^PSDRUG($P(^PSRX(RX,0),"^",6),660)),"^",8) | 
|---|
|  | 209 | DRUG() Q $$ZZ^PSOSUTL(RX) ; DRUG NAME | 
|---|
|  | 210 | WARN() N WARN,NWARN,IWARN,XWARN ; 1-28-02 UPDATE v1.2a TO ELIMINATE LOCAL CODES | 
|---|
|  | 211 | S WARN=$P(^PSDRUG($P(^PSRX(RX,0),"^",6),0),"^",8) ; WARNING LABEL CODES | 
|---|
|  | 212 | F NWARN=1:1:3 S IWARN=$P(WARN,",",NWARN) S:IWARN>20 IWARN="" S:$L(IWARN)=1 IWARN="0"_IWARN S:$L(IWARN)=0 IWARN="00" S XWARN=$G(XWARN)_IWARN | 
|---|
|  | 213 | Q XWARN | 
|---|