| 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 |  ;
 | 
|---|