| 1 | PSOQMCAL        ; SEA/HAM3 PMI - PHARMACY MEDICATION INSTRUCTION ; 30 Nov 2007  7:55 AM | 
|---|
| 2 | ;;7.0;OUTPATIENT PHARMACY;**294**;DEC 1997;Build 13 | 
|---|
| 3 | ; | 
|---|
| 4 | ;Reference to CKP^GMTSUP supported by DBIA 4231 | 
|---|
| 5 | ;Reference to COVER^ORWPS supported by DBIA 4954 | 
|---|
| 6 | ;Credit to Herb Morriss and Al Hernandez for the original design | 
|---|
| 7 | ;Puget Sound Health Care System, Seattle WA | 
|---|
| 8 | EN      N PSOQPEND,DAYSEP,DRUGHDR1,DRUGHDR2,DRUGSEP,INSTSEP1,INSTSEP2,INSTSEP3 | 
|---|
| 9 | N EMPTYLN,PRETYPE,SUPTYPE,ADDR,AL,ALFLAG,ARLDASH | 
|---|
| 10 | N ARLDATE,ARLDFN,ARLDOB,ARLNAME,ARLSITE,ARLSN | 
|---|
| 11 | N BLANKLN,BLNKLN,DRUG1,FOOD,GMRAL,IDRUG,ISIG,ITYPE | 
|---|
| 12 | N NVA,NONE,PAGE,PGWIDTH,PGLENGTH,PHONE | 
|---|
| 13 | N RXIEN,SIGCNT,SIGPOS,XPOS1,XPOS2,XPOS3,XPOS4 | 
|---|
| 14 | N FN,HP,IA,RPTDATE,TYPE,WP,ST,SUPCNT,SUPDRUG,X,X1,X2,ADDRFL | 
|---|
| 15 | N DIWF,DIWL,DIWR,INSTSEP1,INSTSEP2,INSTSEP3,DRUGHDR1,DRUGHDR2,DRUGSEP | 
|---|
| 16 | S PGWIDTH=IOM-5,PGLENGTH=IOSL-9 | 
|---|
| 17 | Q:PGWIDTH<48  ;ensure that the IOM variable is wide enough | 
|---|
| 18 | S RPTDATE=$$FMTE^XLFDT($$NOW^XLFDT,"1D") | 
|---|
| 19 | S XPOS1=(PGWIDTH-26)\2  ;title | 
|---|
| 20 | S XPOS2=PGWIDTH-6       ;page number | 
|---|
| 21 | S XPOS3=(PGWIDTH-29)\2  ;site | 
|---|
| 22 | S XPOS4=(PGWIDTH-53)\2  ;refill info | 
|---|
| 23 | S BLANKLN="",$P(BLNKLN," ",PGWIDTH)=" " | 
|---|
| 24 | S EMPTYLN="!,""|"_$E(BLNKLN,1,PGWIDTH-2)_"|""" | 
|---|
| 25 | S DAYSEP="|       |       |       |       |" | 
|---|
| 26 | S DRUGHDR1="|                 |MORNING| NOON  |EVENING|BEDTIME|       COMMENTS" | 
|---|
| 27 | S DRUGHDR1=DRUGHDR1_$E(BLNKLN,$L(DRUGHDR1),PGWIDTH-2)_"|" | 
|---|
| 28 | S DRUGHDR2="|                 "_DAYSEP | 
|---|
| 29 | S DRUGHDR2=DRUGHDR2_$E(BLNKLN,$L(DRUGHDR2),PGWIDTH-2)_"|" | 
|---|
| 30 | S $P(DRUGSEP,"~",PGWIDTH-2)="~" | 
|---|
| 31 | S DRUGSEP="|"_DRUGSEP_"|" | 
|---|
| 32 | S $P(INSTSEP1,"-",PGWIDTH-2)="-" | 
|---|
| 33 | S INSTSEP1="|"_INSTSEP1_"|" | 
|---|
| 34 | S INSTSEP2="| UNITS PER DOSE: "_DAYSEP | 
|---|
| 35 | S INSTSEP2=INSTSEP2_$E(BLNKLN,$L(INSTSEP2),PGWIDTH-2)_"|" | 
|---|
| 36 | S INSTSEP3="|                 "_DAYSEP | 
|---|
| 37 | S INSTSEP3=INSTSEP3_$E(BLNKLN,$L(INSTSEP3),PGWIDTH-2)_"|" | 
|---|
| 38 | S X1=DT,X2=-45 D C^%DTC S ARLDATE=X | 
|---|
| 39 | 1       ;Patient | 
|---|
| 40 | S ARLDFN="" | 
|---|
| 41 | F IA=1:1 S ARLDFN=$P(ARLPAT,";",IA) Q:ARLDFN=""  D | 
|---|
| 42 | . S PAGE=1 | 
|---|
| 43 | . D HD,SHOW(ARLDFN) | 
|---|
| 44 | Q | 
|---|
| 45 | SHOW(PTIEN)     ; | 
|---|
| 46 | N LIST,NVA | 
|---|
| 47 | D COVER^ORWPS(.LIST,PTIEN) | 
|---|
| 48 | D GETOPORD(.LIST) | 
|---|
| 49 | D GETRXDAT(.LIST) | 
|---|
| 50 | S SUPTYPE=0,PRETYPE="D" | 
|---|
| 51 | S ITYPE="@" | 
|---|
| 52 | F  S ITYPE=$O(LIST(ITYPE)) Q:ITYPE]"ZZZ"  Q:ITYPE=""  D | 
|---|
| 53 | . I PRETYPE'=ITYPE D | 
|---|
| 54 | . . W !,DRUGSEP | 
|---|
| 55 | . . W @EMPTYLN | 
|---|
| 56 | . . W !,"|","SUPPLY ITEMS:"_$E(BLNKLN,14,PGWIDTH-2)_"|" | 
|---|
| 57 | . . S PRETYPE=ITYPE | 
|---|
| 58 | . . I (ITYPE="S")&(SUPTYPE=0) D | 
|---|
| 59 | . . . S SUPTYPE=1,SUPCNT=0,SUPDRUG="" | 
|---|
| 60 | . . . F  S SUPDRUG=$O(LIST(ITYPE,SUPDRUG)) Q:SUPDRUG=""  D | 
|---|
| 61 | . . . . S SUPCNT=SUPCNT+1 | 
|---|
| 62 | . . . I $Y>(PGLENGTH-SUPCNT) W !,DRUGSEP,@IOF D HD3 | 
|---|
| 63 | . S IDRUG="" | 
|---|
| 64 | . F  S IDRUG=$O(LIST(ITYPE,IDRUG)) Q:IDRUG=""  D | 
|---|
| 65 | . . I 'SUPTYPE D | 
|---|
| 66 | . . S SIGCNT=0,SIGPOS="" | 
|---|
| 67 | . . F  S SIGPOS=$O(LIST(ITYPE,IDRUG,SIGPOS)) Q:SIGPOS=""  D | 
|---|
| 68 | . . . S SIGCNT=SIGCNT+1 | 
|---|
| 69 | . . I $Y>(PGLENGTH-SIGCNT) W !,DRUGSEP,@IOF D HD3 | 
|---|
| 70 | . . W:'SUPTYPE !,DRUGSEP,@EMPTYLN | 
|---|
| 71 | . . W !,"|",IDRUG_$E(BLNKLN,$L(IDRUG),PGWIDTH-3)_"|" | 
|---|
| 72 | . . Q:SUPTYPE | 
|---|
| 73 | . . S ISIG=0 | 
|---|
| 74 | . . F  S ISIG=$O(LIST(ITYPE,IDRUG,ISIG)) Q:ISIG<1  D | 
|---|
| 75 | . . . W !,"|     ",LIST(ITYPE,IDRUG,ISIG),$E(BLNKLN,$L(LIST(ITYPE,IDRUG,ISIG)),PGWIDTH-8),"|" | 
|---|
| 76 | . . W !,INSTSEP1,!,INSTSEP2 W:'$G(PSOQHS) !,INSTSEP3 | 
|---|
| 77 | NVA     ;NVA MEDS ADDED 5/6/05 | 
|---|
| 78 | I $D(NVA) D | 
|---|
| 79 | . N NVACNT,NVADRUG | 
|---|
| 80 | . W !,DRUGSEP | 
|---|
| 81 | . W @EMPTYLN | 
|---|
| 82 | . W !,"|","NON-VA Medications:"_$E(BLNKLN,20,PGWIDTH-2)_"|" | 
|---|
| 83 | . W @EMPTYLN | 
|---|
| 84 | . S NVACNT=0 | 
|---|
| 85 | . S NVADRUG="" | 
|---|
| 86 | . F  S NVADRUG=$O(NVA(NVADRUG)) Q:NVADRUG=""  D | 
|---|
| 87 | . . S NVACNT=NVACNT+1 | 
|---|
| 88 | . . I $Y>(PGLENGTH-NVACNT) W !,DRUGSEP,@IOF D HD3 | 
|---|
| 89 | . . W !,"|",NVADRUG_$E(BLNKLN,$L(NVADRUG),PGWIDTH-3)_"|" | 
|---|
| 90 | K NVACNT,NVADRUG | 
|---|
| 91 | W !,INSTSEP1 | 
|---|
| 92 | D | 
|---|
| 93 | . Q:'$G(PSOQPEND) | 
|---|
| 94 | . W !!,"Any medication items listed as ""pending"" are those that have just been" D PGE Q:$D(GMTSQIT) | 
|---|
| 95 | . W !,"written by your provider(s).  These medication orders will be reviewed" D PGE Q:$D(GMTSQIT) | 
|---|
| 96 | . W !,"by your pharmacist, prior to the prescription(s) being dispensed.  When" D PGE Q:$D(GMTSQIT) | 
|---|
| 97 | . W !,"you receive your new prescription(s), by mail or from the pharmacy window," D PGE Q:$D(GMTSQIT) | 
|---|
| 98 | . W !,"be sure to follow the instructions on the prescription label.  If you" D PGE Q:$D(GMTSQIT) | 
|---|
| 99 | . W !,"have any question about your medication, please call your provider or " D PGE Q:$D(GMTSQIT) | 
|---|
| 100 | . W !,"your pharmacist." D PGE Q:$D(GMTSQIT) | 
|---|
| 101 | Q | 
|---|
| 102 | PGE     D:$G(PSOQHS) CKP^GMTSUP | 
|---|
| 103 | Q | 
|---|
| 104 | GETOPORD(ORDLIST)       ; | 
|---|
| 105 | N LISTIEN,KILLORD | 
|---|
| 106 | S LISTIEN=0 | 
|---|
| 107 | F  S LISTIEN=$O(ORDLIST(LISTIEN)) Q:LISTIEN<1  D | 
|---|
| 108 | . S KILLORD=$$IPORD(ORDLIST(LISTIEN)) | 
|---|
| 109 | . I 'KILLORD S KILLORD=$$CKSTATUS(ORDLIST(LISTIEN)) D | 
|---|
| 110 | . K:KILLORD ORDLIST(LISTIEN) | 
|---|
| 111 | Q | 
|---|
| 112 | IPORD(LISTNODE) ; | 
|---|
| 113 | N RETURN,PKG | 
|---|
| 114 | S RETURN=0 | 
|---|
| 115 | S PKG=$P($P(LISTNODE,"^",1),";",2) | 
|---|
| 116 | I "UI"[PKG S RETURN=1 | 
|---|
| 117 | I $P(LISTNODE,"^",1)["N;" D | 
|---|
| 118 | . S:$P(LISTNODE,"^",4)="ACTIVE" NVA($P(LISTNODE,"^",2),+LISTNODE)=LISTNODE | 
|---|
| 119 | . S RETURN=1 | 
|---|
| 120 | Q RETURN | 
|---|
| 121 | CKSTATUS(LISTNODE)      ; | 
|---|
| 122 | N RETURN,RXIEN | 
|---|
| 123 | S RETURN=0 ; ASSUME ACTIVE AND NOT PASS MED | 
|---|
| 124 | S:$P(LISTNODE,"^",4)["DISCONTINUED" RETURN=1 | 
|---|
| 125 | S:$P(LISTNODE,"^",4)["EXPIRED" RETURN=1 | 
|---|
| 126 | Q RETURN | 
|---|
| 127 | GETRXDAT(RXS)   ; | 
|---|
| 128 | N RXSIEN,DRUGNAME,FSIG,RXTYPE | 
|---|
| 129 | S RXSIEN=0 | 
|---|
| 130 | F  S RXSIEN=$O(RXS(RXSIEN)) Q:RXSIEN<1  D | 
|---|
| 131 | . I $P(RXS(RXSIEN),";")["P" D GETPEND(RXSIEN) S PSOQPEND=1 Q  ;-> | 
|---|
| 132 | . S RXIEN=+RXS(RXSIEN) | 
|---|
| 133 | . S DRUGNAME=$$ZZ^PSOSUTL(RXIEN) | 
|---|
| 134 | . D FSIG^PSOUTLA("R",RXIEN,PGWIDTH-8) | 
|---|
| 135 | . S RXTYPE=$$GETTYPE(RXIEN) | 
|---|
| 136 | . M RXS(RXTYPE,DRUGNAME)=FSIG | 
|---|
| 137 | . N PSOQSUB | 
|---|
| 138 | . S PSOQSUB=$O(RXS(RXTYPE,DRUGNAME,":"),-1)+1 | 
|---|
| 139 | . S RXS(RXTYPE,DRUGNAME,PSOQSUB)=$$REFILLS^PSOQ0076(RXIEN)_" refill(s) remaining prior to "_$$FMTE^XLFDT($$EXPDATE^PSOQ0076(RXIEN)) | 
|---|
| 140 | Q | 
|---|
| 141 | GETPEND(RXSIEN) ;RMS/HINES 8-16-07 ADD PENDING RX'S | 
|---|
| 142 | N PSOQPDN,PSOQDIND,PSOQOIND,PSOQ100,PSOQSIND,PSOQSCT,PSOQRAW,SUB | 
|---|
| 143 | S PSOQ100=$P(RXS(RXSIEN),U,3) Q:'+PSOQ100 | 
|---|
| 144 | S PSOQOIND=$O(^OR(100,PSOQ100,4.5,"ID","ORDERABLE",0)) Q:'+PSOQOIND | 
|---|
| 145 | S PSOQPDN=$P($G(^ORD(101.43,+$G(^OR(100,PSOQ100,4.5,PSOQOIND,1)),0)),U) | 
|---|
| 146 | S PSOQDIND=$O(^OR(100,PSOQ100,4.5,"ID","DRUG",0)) D | 
|---|
| 147 | . Q:'+PSOQDIND | 
|---|
| 148 | . S PSOQPDN=$P($G(^PSDRUG(+$G(^OR(100,PSOQ100,4.5,PSOQDIND,1)),0)),U) | 
|---|
| 149 | S PSOQSIND=$O(^OR(100,PSOQ100,8,":"),-1) Q:'+PSOQSIND | 
|---|
| 150 | F PSOQSCT=2:1:$O(^OR(100,PSOQ100,8,PSOQSIND,.1,":"),-1) D | 
|---|
| 151 | . S PSOQRAW=$G(^OR(100,PSOQ100,8,PSOQSIND,.1,PSOQSCT,0)) | 
|---|
| 152 | . N WORDS,COUNT,LINE,NEXTWORD | 
|---|
| 153 | . S WORDS=$L(PSOQRAW," "),SUB=$G(SUB,0)+1 | 
|---|
| 154 | . F COUNT=1:1:WORDS D | 
|---|
| 155 | .. S NEXTWORD=$P(PSOQRAW," ",COUNT) | 
|---|
| 156 | .. Q:NEXTWORD="" | 
|---|
| 157 | .. S LINE=$G(LINE)_NEXTWORD_" " | 
|---|
| 158 | .. I $L($G(LINE))>65&(COUNT'=WORDS) K LINE S SUB=SUB+1 | 
|---|
| 159 | .. S RXS("D","**PENDING**"_PSOQPDN,SUB)=$G(RXS("D","**PENDING**"_PSOQPDN,SUB))_NEXTWORD_" " | 
|---|
| 160 | Q | 
|---|
| 161 | GETTYPE(IEN52)  ; | 
|---|
| 162 | N RETURN,CLASS | 
|---|
| 163 | S RETURN="D" | 
|---|
| 164 | S CLASS=$$GETCLASS(IEN52) | 
|---|
| 165 | S:$E(CLASS,1,1)="X" RETURN="S" | 
|---|
| 166 | S:$E(CLASS,1,2)="DX" RETURN="S" | 
|---|
| 167 | Q RETURN | 
|---|
| 168 | GETCLASS(IENRX) ; | 
|---|
| 169 | N RETURN,NODE0RX,IENDRUG,NODE0DRG,NODEND50,IENCLASS,NODE0CLS,VACLASS | 
|---|
| 170 | S RETURN="" | 
|---|
| 171 | S NODE0RX=$G(^PSRX(IENRX,0)) | 
|---|
| 172 | S IENDRUG=$P(NODE0RX,"^",6) | 
|---|
| 173 | Q:+IENDRUG=0 RETURN | 
|---|
| 174 | S NODE0DRG=$G(^PSDRUG(IENDRUG,0)) | 
|---|
| 175 | S NODEND50=$G(^PSDRUG(IENDRUG,"ND")) | 
|---|
| 176 | S IENCLASS=$P(NODEND50,"^",6) | 
|---|
| 177 | Q:+IENCLASS=0 RETURN | 
|---|
| 178 | S NODE0CLS=$G(^PS(50.605,IENCLASS,0)) | 
|---|
| 179 | S VACLASS=$P(NODE0CLS,"^",1) | 
|---|
| 180 | S RETURN=VACLASS | 
|---|
| 181 | Q RETURN | 
|---|
| 182 | HD      ; | 
|---|
| 183 | S FN=ARLDFN | 
|---|
| 184 | S ARLNAME=$E($P(^DPT(ARLDFN,0),"^",1),1,28) | 
|---|
| 185 | S ARLSN=$P(^(0),"^",9),ARLDOB=$P(^(0),"^",3) | 
|---|
| 186 | S PHONE=$S($D(^DPT(ARLDFN,.13)):^(.13),1:"") | 
|---|
| 187 | S HP=$P(PHONE,"^",1),WP=$P(PHONE,"^",2) | 
|---|
| 188 | S ADDR=$S($D(^DPT(ARLDFN,.11)):^(.11),1:"") | 
|---|
| 189 | I $D(^DPT(ARLDFN,.121)),$P(^(.121),"^",9)="Y" D | 
|---|
| 190 | . S X=$S($P(^(.121),"^",8):$P(^(.121),"^",8),1:9999999) | 
|---|
| 191 | . I DT'<$P(^(.121),"^",7),DT'>X D | 
|---|
| 192 | . . S ADDR=^(.121) | 
|---|
| 193 | . . S ADDRFL="(temporary)" | 
|---|
| 194 | . . S HP=$P(ADDR,"^",10) | 
|---|
| 195 | S ST=$S($D(^DIC(5,+$P(ADDR,"^",5),0)):$P(^(0),"^",2),1:"UNKNOWN") | 
|---|
| 196 | S ADDR(4)=$P(ADDR,"^",4)_", "_ST_"  "_$P(ADDR,"^",6) | 
|---|
| 197 | S ADDR(3)=$P(ADDR,"^",3),ADDR(2)=$P(ADDR,"^",2),ADDR(1)=$P(ADDR,"^",1) | 
|---|
| 198 | I ADDR(2)']"" D | 
|---|
| 199 | . S ADDR(2)=ADDR(3) | 
|---|
| 200 | . S ADDR(3)="" | 
|---|
| 201 | HD1     ; Header for 1st page | 
|---|
| 202 | S ARLSITE=^PS(59,PSOSITE,0) | 
|---|
| 203 | D PGE Q:$D(GMTSQIT) | 
|---|
| 204 | W !,"Date: ",RPTDATE,?XPOS1,"PATIENT MEDICATION INFORMATION" | 
|---|
| 205 | I $D(PAGE) D | 
|---|
| 206 | . W ?XPOS2,"Page: ",PAGE | 
|---|
| 207 | . S PAGE=PAGE+1 | 
|---|
| 208 | W !,?XPOS4,"PRINTED BY THE VA MEDICAL CENTER AT: "_$P($G(^DIC(4,+$G(^PS(59,PSOSITE,"INI")),0)),U,1) | 
|---|
| 209 | W !,?XPOS4,"FOR PRESCRIPTION REFILLS CALL ("_$P(ARLSITE,U,3)_") "_$P(ARLSITE,U,4) | 
|---|
| 210 | HD2     W !!,"Name: ",$E(ARLNAME,1,40)," - ",$E(ARLSN,6,9) | 
|---|
| 211 | W ?30," PHARMACY - ",$P(ARLSITE,"^",7)," DIVISION (",$P(ARLSITE,"^",3),"-",$P(ARLSITE,"^",4),")",! | 
|---|
| 212 | W !,INSTSEP1,!,DRUGHDR1 ;!,DRUGHDR2 | 
|---|
| 213 | Q | 
|---|
| 214 | HD3     ;Header for subsequent pages | 
|---|
| 215 | W !,"Date: ",RPTDATE,?XPOS1,"PATIENT MEDICATION INFORMATION" | 
|---|
| 216 | I $D(PAGE) W ?XPOS2,"Page: ",PAGE S PAGE=PAGE+1 | 
|---|
| 217 | W !,?XPOS4,"PRINTED BY THE VA MEDICAL CENTER AT: "_$P($G(^DIC(4,+$G(^PS(59,PSOSITE,"INI")),0)),U,1) | 
|---|
| 218 | W !,?XPOS4,"FOR PRESCRIPTION REFILLS CALL ("_$P(ARLSITE,U,3)_") "_$P(ARLSITE,U,4),! | 
|---|
| 219 | W !?1,"Name: ",$E(ARLNAME,1,40)," - ",$E(ARLSN,6,9) | 
|---|
| 220 | W ?30," PHARMACY - ",$P(ARLSITE,"^",7)," DIVISION (",$P(ARLSITE,"^",3),"-",$P(ARLSITE,"^",4),")",! | 
|---|
| 221 | W !,INSTSEP1 | 
|---|
| 222 | W:$G(SUPCNT)&'$G(NVACNT) !,"|","SUPPLY ITEMS:"_$E(BLNKLN,14,PGWIDTH-2)_"|",@EMPTYLN | 
|---|
| 223 | W:$G(NVACNT) @EMPTYLN,!,"|","NON-VA Medications:"_$E(BLNKLN,20,PGWIDTH-2)_"|",@EMPTYLN | 
|---|
| 224 | W:'$G(NVACNT)&'$G(SUPCNT) !,DRUGHDR1 | 
|---|
| 225 | Q | 
|---|
| 226 | RE      ;Allergies | 
|---|
| 227 | S ARLDASH="",$P(ARLDASH,"=",$E(BLNKLN,1,PGWIDTH-10))=ARLDASH W !,ARLDASH,!! | 
|---|
| 228 | S NONE="NO INFORMATION (COMPLETE SECTION BELOW)",ALFLAG=0 D ALL | 
|---|
| 229 | W "REACTIONS/ALLERGIES currently on file : ",$S($D(GMRAL):"",1:NONE) Q:'$D(GMRAL) | 
|---|
| 230 | S X=DRUG1_FOOD,DIWL=5,DIWR=PGWIDTH-5,DIWF="W" D ^DIWP,^DIWW | 
|---|
| 231 | Q | 
|---|
| 232 | ALL     ;Gets allergy info | 
|---|
| 233 | K GMRA,GMRAL | 
|---|
| 234 | N IFN,DATA,VER,ARLEND | 
|---|
| 235 | S ARLEND=0,DFN=ARLDFN,GMRA="0^0^011" D ^GMRADPT S (DRUG1,FOOD)="" | 
|---|
| 236 | I $D(GMRAL),GMRAL=0 S DRUG1="NO KNOWN ALLERGIES" | 
|---|
| 237 | I $D(GMRAL),GMRAL=1 S IFN="" F  S IFN=$O(GMRAL(IFN)) Q:IFN=""!(ARLEND)  S DATA=GMRAL(IFN),AL=$P(DATA,U,2),TYPE=$P(DATA,U,3),VER=$S($P(DATA,U,4)=1:"V",1:"NV") D | 
|---|
| 238 | .I $L(DRUG1)>300 S DRUG1="TOO MANY TO LIST",ARLEND=1 | 
|---|
| 239 | .S:TYPE="D" DRUG1=AL_" ("_VER_"),"_DRUG1 | 
|---|
| 240 | .S:TYPE="F" FOOD="Food Allergies on File" | 
|---|
| 241 | Q | 
|---|