| [613] | 1 | PSBOPM ;BIRMINGHAM/BSR-BCMA OIT HISTORY ;Mar 2004 | 
|---|
|  | 2 | ;;3.0;BAR CODE MED ADMIN;**3,9,13,17**;Mar 2004;Build 1 | 
|---|
|  | 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
|  | 4 | ; | 
|---|
|  | 5 | ; Reference/IA | 
|---|
|  | 6 | ; File 50.7/2880 | 
|---|
|  | 7 | ; File 52.6/436 | 
|---|
|  | 8 | ; File 52.7/437 | 
|---|
|  | 9 | ; File 200/10060 | 
|---|
|  | 10 | ; EN^PSJBCMA1/2829 | 
|---|
|  | 11 | ; | 
|---|
|  | 12 | EN ; | 
|---|
|  | 13 | N PSBHDR,DFN | 
|---|
|  | 14 | S PSBGBL="^TMP(""PSBO"",$J,""B"")" | 
|---|
|  | 15 | F  S PSBGBL=$Q(@PSBGBL) Q:PSBGBL=""  Q:$QS(PSBGBL,2)'=$J  Q:$QS(PSBGBL,1)'["PSBO"  D | 
|---|
|  | 16 | .S DFN=$QS(PSBGBL,5) | 
|---|
|  | 17 | I '$G(DFN) W !,("Error: No Patient IEN")  Q | 
|---|
|  | 18 | S PSBSTRT=$P(PSBRPT(.1),U,6)+$P(PSBRPT(.1),U,7) | 
|---|
|  | 19 | S PSBSTOP=$P(PSBRPT(.1),U,8)+$P(PSBRPT(.1),U,9) | 
|---|
|  | 20 | S PSBCOM=$P(PSBRPT(.2),"^",8)   ;COMMENT FLAG 1 MEANS YES | 
|---|
|  | 21 | I PSBSTRT="0" D | 
|---|
|  | 22 | .D NOW^%DTC S PSBSTOP=% | 
|---|
|  | 23 | .S X1=((PSBSTOP)\1) S X2=-$$GET^XPAR("ALL","PSB MED HIST DAYS BACK") | 
|---|
|  | 24 | .S:X2'<0 X2=-30 D C^%DTC  S PSBSTRT=X | 
|---|
|  | 25 | .S PSBCOM=$$GET^XPAR("ALL","PSB RPT INCL COMMENTS") | 
|---|
|  | 26 | D OUT(DFN,PSBSTRT,PSBSTOP,PSBORDNM) | 
|---|
|  | 27 | Q | 
|---|
|  | 28 | ; | 
|---|
|  | 29 | OUT(DFN,PSBSTRT,PSBSTOP,PSBORDNM)        ; | 
|---|
|  | 30 | D CLEANALL ;CLEAN UP VARIABLES AND TMP ARRAY | 
|---|
|  | 31 | ; | 
|---|
|  | 32 | ;IF PSBORDNM DOESN'T CONTAIN A "U" OR A "V", SKIP THE ORDER LOOKUP | 
|---|
|  | 33 | S PSBOR=1 | 
|---|
|  | 34 | I PSBORDNM'["U",PSBORDNM'["V" D | 
|---|
|  | 35 | .S:'$$GETORD^PSBOPM1(.PSBORDNM) PSBOR=0 | 
|---|
|  | 36 | .I 'PSBOR&(PSBORDNM]"") S TMP("PSBOIS",$J,PSBORDNM)="" | 
|---|
|  | 37 | I PSBOR D | 
|---|
|  | 38 | .D GETORDN | 
|---|
|  | 39 | .D GETOIS | 
|---|
|  | 40 | D GETADSO ;  GET ALL ADDITIVES AND SOLUTIONS | 
|---|
|  | 41 | D FINDIENS^PSBOPM1 ; FIND EVERY MED LOG ENTRIES THAT SHOULD BE ON THE RPT | 
|---|
|  | 42 | D PREOUT ;   WRITE DATA TO GLOBAL | 
|---|
|  | 43 | D WRITEOT ; | 
|---|
|  | 44 | D CLEANSUM ; CLEAN UP AND LEAVE LIST OF IENS FOR THE REPORT. | 
|---|
|  | 45 | Q | 
|---|
|  | 46 | ; | 
|---|
|  | 47 | GETORDN ; | 
|---|
|  | 48 | K ^TMP("PSJ1",$J) | 
|---|
|  | 49 | D EN^PSJBCMA1(DFN,PSBORDNM,1) | 
|---|
|  | 50 | Q | 
|---|
|  | 51 | ; | 
|---|
|  | 52 | GETOIS  ; LOAD PSBOIS(#) WITH ALL OF THE ORDERABLE ITEMS | 
|---|
|  | 53 | I PSBORDNM["U" D | 
|---|
|  | 54 | .;GET UNIT DOSE ORDERS | 
|---|
|  | 55 | .S PSBOI=$P(^TMP("PSJ1",$J,2),"^") | 
|---|
|  | 56 | .S PSBOI=$S(PSBOI["U":$TR(PSBOI,"U",""),PSBOI["V":$TR(PSBOI,"V",""),1:PSBOI) | 
|---|
|  | 57 | .S TMP("PSBOIS",$J,PSBOI)="" | 
|---|
|  | 58 | ; | 
|---|
|  | 59 | ;IV ORDERS NEED TO USE THE ADDITIVE AND SOLUTION NUMBER TO BACK | 
|---|
|  | 60 | ;TRACK TO THE OI ASSOCIATED WITH IT | 
|---|
|  | 61 | I PSBORDNM["V" D | 
|---|
|  | 62 | .;GET ADDITIVES OFF THE ORDER | 
|---|
|  | 63 | .I $G(^TMP("PSJ1",$J,850,0))  D | 
|---|
|  | 64 | ..S XXX="" F  S XXX=$O(^TMP("PSJ1",$J,850,XXX)) Q:XXX=""  D | 
|---|
|  | 65 | ...S XXY="" F  S XXY=$O(^TMP("PSJ1",$J,850,XXX,XXY)) Q:XXY=""  D | 
|---|
|  | 66 | ....S PSBADD=$P(^TMP("PSJ1",$J,850,XXX,XXY),"^") | 
|---|
|  | 67 | ....;CONVERT ADDITIVE TO ORDERABLE ITEM AND ADD TO LIST | 
|---|
|  | 68 | ....S TMP("PSBOIS",$J,$$OFROMA(PSBADD))="" | 
|---|
|  | 69 | .;   GET SOLUTIONS OFF THE ORDER | 
|---|
|  | 70 | .I $G(^TMP("PSJ1",$J,950,0))  D | 
|---|
|  | 71 | ..S XXX="" F  S XXX=$O(^TMP("PSJ1",$J,950,XXX)) Q:XXX=""  D | 
|---|
|  | 72 | ...S XXY="" F  S XXY=$O(^TMP("PSJ1",$J,950,XXX,XXY)) Q:XXY=""  D | 
|---|
|  | 73 | ....S PSBSOL=$P(^TMP("PSJ1",$J,950,XXX,XXY),"^") | 
|---|
|  | 74 | ....; | 
|---|
|  | 75 | ....;CONVERT SOLUTIOIN TO ORDERABLE ITEM AND ADD TO LIST | 
|---|
|  | 76 | ....S TMP("PSBOIS",$J,$$OFROMS(PSBSOL))="" | 
|---|
|  | 77 | Q | 
|---|
|  | 78 | ; | 
|---|
|  | 79 | OFROMA(PSBADD) ;GET ORDERABLE ITEM FROM AN ADDITIVE | 
|---|
|  | 80 | Q $$GET1^DIQ(52.6,PSBADD_",",15,"I") | 
|---|
|  | 81 | ; | 
|---|
|  | 82 | OFROMS(PSBSOL) ; GET ORDERABLE ITEM FROM A SOLUTION | 
|---|
|  | 83 | Q $$GET1^DIQ(52.7,PSBSOL_",",9,"I") | 
|---|
|  | 84 | ; | 
|---|
|  | 85 | GETADSO ; GET ALL ADDITIVES FOR ALL ORDERABLE ITEMS | 
|---|
|  | 86 | K PSBAOUT,PSBSOUT | 
|---|
|  | 87 | S XA="" F  S XA=$O(TMP("PSBOIS",$J,XA)) Q:XA=""  D | 
|---|
|  | 88 | .D LIST^DIC(52.6,"","@;15I","QPI","","","","AOI","","","PSBAOUT") | 
|---|
|  | 89 | .S XB=0 F  S XB=$O(PSBAOUT("DILIST",XB)) Q:XB=""  D | 
|---|
|  | 90 | ..I $P(PSBAOUT("DILIST",XB,0),"^",2)=XA D | 
|---|
|  | 91 | ...S TMP("PSBADDS",$J,$P(PSBAOUT("DILIST",XB,0),"^",1))="" | 
|---|
|  | 92 | K PSBAOUT | 
|---|
|  | 93 | ; GET ALL SOLUTIONS FOR ALL ORDERABLE ITEMS | 
|---|
|  | 94 | S XA="" F  S XA=$O(TMP("PSBOIS",$J,XA)) Q:XA=""  D | 
|---|
|  | 95 | .D LIST^DIC(52.7,"","@;9I","QPI","","","","AOI","","","PSBSOUT") | 
|---|
|  | 96 | .S XB=0 F  S XB=$O(PSBSOUT("DILIST",XB)) Q:XB=""  D | 
|---|
|  | 97 | ..I $P(PSBSOUT("DILIST",XB,0),"^",2)=XA D | 
|---|
|  | 98 | ...S TMP("PSBSOLS",$J,$P(PSBSOUT("DILIST",XB,0),"^",1))="" | 
|---|
|  | 99 | K PSBSOUT | 
|---|
|  | 100 | Q | 
|---|
|  | 101 | ; | 
|---|
|  | 102 | PREOUT ; | 
|---|
|  | 103 | N TYP | 
|---|
|  | 104 | F TYP="UD","ADD","SOL"  D | 
|---|
|  | 105 | .Q:'$D(TMP("PSBIENS",$J,TYP)) | 
|---|
|  | 106 | .K PSBUNK S XDT="" F  S XDT=$O(TMP("PSBIENS",$J,TYP,XDT),-1) Q:XDT=""  S I="",I=$O(TMP("PSBIENS",$J,TYP,XDT,I)) D | 
|---|
|  | 107 | ..I TYP="UD" Q:$D(TMP("PSBIENS",$J,"ADD",XDT,I))  Q:$D(TMP("PSBIENS",$J,"SOL",XDT,I)) | 
|---|
|  | 108 | ..S PSBIEN=I | 
|---|
|  | 109 | ..S PSBIENS=PSBIEN_"," | 
|---|
|  | 110 | ..D OUTPUT(TYP) | 
|---|
|  | 111 | Q | 
|---|
|  | 112 | ; | 
|---|
|  | 113 | OUTPUT(TYP) ; | 
|---|
|  | 114 | S PSBSPC=$J("",80) | 
|---|
|  | 115 | S W=$E($$GET1^DIQ(53.79,PSBIENS,.02)_PSBSPC,1,20)_" " | 
|---|
|  | 116 | S W=W_$S($P(^PSB(53.79,PSBIEN,0),U,9)="":"?? ",1:$E($P(^PSB(53.79,PSBIEN,0),U,9)_"  ",1,2)_" ") | 
|---|
|  | 117 | S:$P(^PSB(53.79,PSBIEN,0),U,9)="" PSBUNK=1 | 
|---|
|  | 118 | S W=W_$E($P($G(^PSB(53.79,PSBIEN,.1)),U,2)_PSBSPC,1,2)_"  " | 
|---|
|  | 119 | S W=W_$E($E($$GET1^DIQ(53.79,PSBIENS,.06),1,18)_PSBSPC,1,21)_" " | 
|---|
|  | 120 | S W=W_$E($$GET1^DIQ(53.79,PSBIENS,"ACTION BY:INITIAL")_PSBSPC,1,10)_" " | 
|---|
|  | 121 | S W=W_$$GET1^DIQ(53.79,PSBIENS,.16) | 
|---|
|  | 122 | D ADD(W,TYP) | 
|---|
|  | 123 | F PSBNODE=.5,.6,.7 D | 
|---|
|  | 124 | .S PSBDD=$S(PSBNODE=.5:53.795,PSBNODE=.6:53.796,1:53.797) | 
|---|
|  | 125 | .F PSBY=0:0 S PSBY=$O(^PSB(53.79,PSBIEN,PSBNODE,PSBY)) Q:'PSBY  D | 
|---|
|  | 126 | ..D WRAPMEDS($$GET1^DIQ(PSBDD,PSBY_","_PSBIENS,.01),$$GET1^DIQ(PSBDD,PSBY_","_PSBIENS,.03),$$GET1^DIQ(PSBDD,PSBY_","_PSBIENS,.04),TYP) | 
|---|
|  | 127 | I PSBCOM=1  D COMNTS   ;GETS COMMENTS | 
|---|
|  | 128 | D ADD("",TYP) | 
|---|
|  | 129 | Q | 
|---|
|  | 130 | ; | 
|---|
|  | 131 | COMNTS  ; | 
|---|
|  | 132 | N Z,CNT | 
|---|
|  | 133 | S Z="",CNT=0 | 
|---|
|  | 134 | I $D(^PSB(53.79,PSBIEN,.3,0)) D | 
|---|
|  | 135 | .D ADD("",TYP) | 
|---|
|  | 136 | .D ADD($J("",44)_"Comments: "_$$MAKELINE("-",78),TYP) | 
|---|
|  | 137 | .S XT="" F  S XT=$O(^PSB(53.79,PSBIEN,.3,XT)) Q:XT=""  I XT'=0  D | 
|---|
|  | 138 | ..D:CNT=1 ADD("",TYP) | 
|---|
|  | 139 | ..S Y=$P(^PSB(53.79,PSBIEN,.3,XT,0),"^",3) D DD^%DT S XBR=Y | 
|---|
|  | 140 | ..S Z=XBR_"   "_$P(^VA(200,$P(^PSB(53.79,PSBIEN,.3,XT,0),"^",2),0),"^",2) | 
|---|
|  | 141 | ..D WRAP($P(^PSB(53.79,PSBIEN,.3,XT,0),"^",1),Z,PSBIEN) | 
|---|
|  | 142 | ..S CNT=1 | 
|---|
|  | 143 | .D ADD($J("",54)_$$MAKELINE("-",78),TYP) | 
|---|
|  | 144 | Q | 
|---|
|  | 145 | ; | 
|---|
|  | 146 | WRAP(SIZE,ZP,BRIEN)         ; | 
|---|
|  | 147 | D ADD($J("",55)_ZP,TYP) | 
|---|
|  | 148 | D ADD($J("",55)_$E(SIZE,1,75),TYP) | 
|---|
|  | 149 | I $L(SIZE)>75 D ADD($J("",55)_$E(SIZE,76,150),TYP) | 
|---|
|  | 150 | Q | 
|---|
|  | 151 | ; | 
|---|
|  | 152 | HEADA ; | 
|---|
|  | 153 | W ! | 
|---|
|  | 154 | W "Location",?21,"St Sch Administration Date",?50,"By",?61,"Injection Site",?96,"Units",?112,"Units of" | 
|---|
|  | 155 | W !,?55,"Medication & Dosage",?96,"GIVEN",?112,"Administration" | 
|---|
|  | 156 | W ! | 
|---|
|  | 157 | W $$MAKELINE("-",132) | 
|---|
|  | 158 | Q | 
|---|
|  | 159 | ; | 
|---|
|  | 160 | ADD(XE,TYP)  ; | 
|---|
|  | 161 | S ^TMP("PSB",$J,TYP,$O(^TMP("PSB",$J,TYP,""),-1)+1)=XE | 
|---|
|  | 162 | Q | 
|---|
|  | 163 | ; | 
|---|
|  | 164 | WRAPMEDS(MED,UG,UOA,TYP)  ; | 
|---|
|  | 165 | ;MED IS NOT WRAPPED: MAX LENGTH IN PSDRUG/52.6/52.7 IS 40 | 
|---|
|  | 166 | ;UG/UOA MAX AT 30/40 AND WILL BE WRAPPED AT 15 EACH | 
|---|
|  | 167 | ;THIS WILL CREATE UPTO 3 LINES | 
|---|
|  | 168 | S MED=$E(MED_$J("",40),1,40) | 
|---|
|  | 169 | N UGWRAP | 
|---|
|  | 170 | S (CNTX,UOA1,UOA16,UOA31)="" | 
|---|
|  | 171 | I +$G(UG)?1"."1.N S UG=0_+UG | 
|---|
|  | 172 | F CNT=1:15:45  D | 
|---|
|  | 173 | .D PARSE(UOA,CNT) | 
|---|
|  | 174 | .S UGWRAP=$E(UG,CNT,(CNT+14)) | 
|---|
|  | 175 | .I CNT=1 D ADD($J("",55)_MED_" "_$$PAD(UGWRAP,15)_" "_$$PAD(UOA1,15),TYP) | 
|---|
|  | 176 | .I (CNT>1),($L(UGWRAP)>0!$L(@("UOA"_CNT))>0) D ADD($J("",96)_$$PAD(UGWRAP,15)_" "_$$PAD(@("UOA"_CNT),15),TYP) | 
|---|
|  | 177 | Q | 
|---|
|  | 178 | ; | 
|---|
|  | 179 | PAD(X,CNT) ; | 
|---|
|  | 180 | Q $E(X_$J("",CNT),1,CNT) | 
|---|
|  | 181 | WRITEOT ; | 
|---|
|  | 182 | N TPE | 
|---|
|  | 183 | S Y=$P(PSBSTRT,".",1)  D D^DIQ  S PSTRTA=Y | 
|---|
|  | 184 | S Y=$P(PSBSTOP,".",1)  D D^DIQ  S PSTP=Y | 
|---|
|  | 185 | S PSBHDR(1)="MEDICATION HISTORY for "_PSTRTA_"  to  "_PSTP | 
|---|
|  | 186 | I '$D(TMP("PSBIENS",$J)) D ADD("<<<< NO HISTORY FOUND FOR THIS TIME .FRAME >>>>","UD") | 
|---|
|  | 187 | S TPE="" F  S TPE=$O(^TMP("PSB",$J,TPE)) Q:TPE=""  D | 
|---|
|  | 188 | .D MEDS(TPE) | 
|---|
|  | 189 | .D PT^PSBOHDR(DFN,.PSBHDR),HEADA | 
|---|
|  | 190 | .S EX="" F  S EX=$O(^TMP("PSB",$J,TPE,EX)) Q:EX=""  D | 
|---|
|  | 191 | ..I $Y>(IOSL-5) D | 
|---|
|  | 192 | ...W $$PTFTR^PSBOHDR() | 
|---|
|  | 193 | ...D PT^PSBOHDR(DFN,.PSBHDR),HEADA | 
|---|
|  | 194 | ..W !,$G(^TMP("PSB",$J,TPE,EX)) | 
|---|
|  | 195 | W $$PTFTR^PSBOHDR() | 
|---|
|  | 196 | Q | 
|---|
|  | 197 | ; | 
|---|
|  | 198 | FTR() ; | 
|---|
|  | 199 | I (IOSL<100) F  Q:$Y>(IOSL-10)  W ! | 
|---|
|  | 200 | W !,$TR($J("",IOM)," ","=") | 
|---|
|  | 201 | S X="Ward: "_PSBHDR("WARD")_"  Room-Bed: "_PSBHDR("ROOM") | 
|---|
|  | 202 | W !,PSBHDR("NAME"),?(IOM-11\2),PSBHDR("SSN"),?(IOM-$L(X)),X | 
|---|
|  | 203 | Q "" | 
|---|
|  | 204 | ; | 
|---|
|  | 205 | MEDS(TYP) ; | 
|---|
|  | 206 | N MED,XA,XB,DPTR,DRG,FLE,SBSC | 
|---|
|  | 207 | S MED="",XB=3,DRG="" | 
|---|
|  | 208 | S PSBHDR(3)="MEDICATIONS SEARCH LIST:" | 
|---|
|  | 209 | S XA="" F  S XA=$O(TMP("PSBOIS",$J,XA)) Q:XA=""  D | 
|---|
|  | 210 | .S MED=$$GET1^DIQ(50.7,XA,.01) | 
|---|
|  | 211 | .I $L(PSBHDR(XB)_" "_MED)>IOM D | 
|---|
|  | 212 | ..S XB=XB+1,PSBHDR(XB)="                         "_MED | 
|---|
|  | 213 | .E  S PSBHDR(XB)=PSBHDR(XB)_$S($L(PSBHDR(XB))<26:" ",1:"; ")_MED | 
|---|
|  | 214 | S XA=999 F  S XA=$O(PSBHDR(XA),-1) Q:XA=XB  K PSBHDR(XA) | 
|---|
|  | 215 | I TYP'="" D | 
|---|
|  | 216 | .I TYP["UD" S TYP="UNIT DOSE",SBSC="PSBOIS",FLE=50.7 | 
|---|
|  | 217 | .I TYP["AD" S TYP="ADDITIVE",SBSC="PSBADDS",FLE=52.6 | 
|---|
|  | 218 | .I TYP["SO" S TYP="SOLUTION",SBSC="PSBSOLS",FLE=52.7 | 
|---|
|  | 219 | .S DPTR="" F  S DPTR=$O(TMP(SBSC,$J,DPTR)) Q:DPTR=""  I TMP(SBSC,$J,DPTR) D | 
|---|
|  | 220 | ..S DRG=$$GET1^DIQ(FLE,DPTR,.01) | 
|---|
|  | 221 | ..S PSBHDR($O(PSBHDR(999),-1)+1)=$S(TYP="UNIT DOSE":"",1:"SEARCH FOR "_TYP_": "_DRG) | 
|---|
|  | 222 | .K TMP(SBSC,$J) | 
|---|
|  | 223 | Q | 
|---|
|  | 224 | ; | 
|---|
|  | 225 | CLEANALL        ; KILL ALL TMP LEVELS USED VARIABLES | 
|---|
|  | 226 | K ^TMP("PSB",$J),^TMP("PSJ1",$J),TMP("PSBOIS",$J),TMP("PSBADDS",$J),TMP("PSBSOLS",$J),TMP("PSBIENS",$J),TMP("ARY",$J),DRG,DPTR,PSBOR,FLE,SBSC,TPE | 
|---|
|  | 227 | Q | 
|---|
|  | 228 | ; | 
|---|
|  | 229 | CLEANSUM        ; KILLL ALL BUT THE "PSBIENS" LEVEL | 
|---|
|  | 230 | K ^TMP("PSB",$J),^TMP("PSJ1",$J),TMP("PSBIENS",$J),TMP("PSBOIS",$J),TMP("PSBADDS",$J),TMP("PSBSOLS",$J) | 
|---|
|  | 231 | Q | 
|---|
|  | 232 | MAKELINE(X,CNT) ;LINE OF WHAT'S PASSED IN CNT TIMES | 
|---|
|  | 233 | N Y,Z | 
|---|
|  | 234 | S Y="" | 
|---|
|  | 235 | F Z=1:1:CNT S Y=Y_X | 
|---|
|  | 236 | Q Y | 
|---|
|  | 237 | ; | 
|---|
|  | 238 | PARSE(X,CNT) ;Split text for wrapping. | 
|---|
|  | 239 | S CNTX="UOA"_CNT,@CNTX=@CNTX_$E(X,CNT,(CNT+14)),UOAX="" | 
|---|
|  | 240 | F  S:$F(@CNTX,", ",+UOAX)>0 UOAX=$F(@CNTX,", ",+UOAX)  Q:'$F(@CNTX,", ",+UOAX) | 
|---|
|  | 241 | I UOAX<1 F  S:$F(@CNTX," ",+UOAX)>0 UOAX=$F(@CNTX," ",+UOAX)  Q:'$F(@CNTX," ",+UOAX) | 
|---|
|  | 242 | I UOAX>1,(($L(UOA)-(CNT+14))>0) S CNTXX=$E(@CNTX,1,UOAX-1),@("UOA"_(CNT+15))=$E(@CNTX,UOAX,UOAX+14),@CNTX=CNTXX | 
|---|
|  | 243 | Q | 
|---|
|  | 244 | ; | 
|---|