| 1 | ORKPS ; slc/CLA - Order checking support procedures for medications ;12/15/97 [8/10/05 3:20pm]
 | 
|---|
| 2 |  ;;3.0;ORDER ENTRY/RESULTS REPORTING;**6,32,74,94,123,141,190,232**;Dec 17, 1997;Build 19
 | 
|---|
| 3 |  Q
 | 
|---|
| 4 | CHECK(YY,DFN,MED,OI,ORKDG) ; return drug order checks
 | 
|---|
| 5 |  ;YY:    returned array of data
 | 
|---|
| 6 |  ;DFN:   patient id
 | 
|---|
| 7 |  ;MED:   drug ien [file #50]
 | 
|---|
| 8 |  ;OI:    orderable item ien [file #101.43
 | 
|---|
| 9 |  ;ORKDG: display group (should be PSI, PSIV, PSO or PSH)
 | 
|---|
| 10 |  ; returned info: varies for ^TMP($J x-ref - refer to listings below
 | 
|---|
| 11 |  K ^TMP($J,"DI"),^TMP($J,"DD"),^TMP($J,"DC")
 | 
|---|
| 12 |  N ORDFN S ORDFN=DFN
 | 
|---|
| 13 |  D EN^PSOORDRG(DFN,MED)
 | 
|---|
| 14 |  D PROCESS^ORKPS1(OI,ORDFN,ORKDG)
 | 
|---|
| 15 |  K ^TMP($J,"DI"),^TMP($J,"DD"),^TMP($J,"DC")
 | 
|---|
| 16 |  Q
 | 
|---|
| 17 | CHKSESS(YY,DFN,MED,OI,ORKPDATA,ORKDG) ; return drug order checks for session
 | 
|---|
| 18 |  N ORKDGI,ORKDRUG,ORKDRUGA,ORKORN,HOR,SEQ,CNT,CNTX,ORKOI
 | 
|---|
| 19 |  N ORKFLG,ORSESS,ORPSPKG,ORPSA,ORKDD,ORSNUM,ORNUM,DUPX,DUPORN
 | 
|---|
| 20 |  N ORDFN S ORDFN=DFN
 | 
|---|
| 21 |  S ORKFLG=0
 | 
|---|
| 22 |  S ORNUM=$P(ORKA,"|",5)
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 |  ;get other session med orders:
 | 
|---|
| 25 |  I $D(^TMP("ORKA",$J)) D
 | 
|---|
| 26 |  .S CNT=^TMP("ORKA",$J) F CNTX=1:1:CNT D
 | 
|---|
| 27 |  ..S ORSESS=$G(^TMP("ORKA",$J,CNTX))
 | 
|---|
| 28 |  ..Q:'$L(ORSESS)
 | 
|---|
| 29 |  ..S ORPSPKG=$P(ORSESS,"|",2)
 | 
|---|
| 30 |  ..Q:'$L(ORPSPKG)
 | 
|---|
| 31 |  ..Q:$E(ORPSPKG,1,2)'="PS"
 | 
|---|
| 32 |  ..S ORSNUM=$P(ORSESS,"|",5)
 | 
|---|
| 33 |  ..S ORKOI=$P(ORSESS,"|")
 | 
|---|
| 34 |  ..;quit if same order/oi:
 | 
|---|
| 35 |  ..Q:((+$G(ORNUM)=+$G(ORSNUM))&(+$G(OI)=+$G(ORKOI)))
 | 
|---|
| 36 |  ..S:ORPSPKG="PSJ" ORPSPKG="PSI"
 | 
|---|
| 37 |  ..S ORKDRUG=$P($P(ORSESS,"|",3),U,4)
 | 
|---|
| 38 |  ..;
 | 
|---|
| 39 |  ..;if no disp drug selected get disp drug(s) from OI:
 | 
|---|
| 40 |  ..I +$G(ORKDRUG)<1,$L(ORKOI) D
 | 
|---|
| 41 |  ...I "IOH"[$E(ORPSPKG,3) D OI2DD(.ORPSA,ORKOI,$E(ORPSPKG,3)) D
 | 
|---|
| 42 |  ....S ORKDD=0 F  S ORKDD=$O(ORPSA(ORKDD)) Q:'ORKDD  D
 | 
|---|
| 43 |  .....S ORKDRUG=+ORKDD
 | 
|---|
| 44 |  .....S:+$G(ORKDRUG)>0 ORKDRUGA(ORKDRUG_";"_ORPSPKG_";"_ORSNUM)=ORSNUM
 | 
|---|
| 45 |  ...K ORPSA  ;need to clean out between calls to OI2DD
 | 
|---|
| 46 |  ..;
 | 
|---|
| 47 |  ..Q:+$G(ORKDRUG)<1
 | 
|---|
| 48 |  ..;if dispense drug selected add to array:
 | 
|---|
| 49 |  ..S ORKDRUGA(ORKDRUG_";"_ORPSPKG_";"_ORSNUM)=ORSNUM
 | 
|---|
| 50 |  ;
 | 
|---|
| 51 |  ;get unsigned medication orders:
 | 
|---|
| 52 |  S HOR=0,SEQ=0
 | 
|---|
| 53 |  S HOR=$O(^TMP("ORR",$J,HOR)) I +$G(HOR)>0 D
 | 
|---|
| 54 |  .F  S SEQ=$O(^TMP("ORR",$J,HOR,SEQ)) Q:+SEQ<1  D
 | 
|---|
| 55 |  ..S ORKORN=+$P(^TMP("ORR",$J,HOR,SEQ),U),DUPORN=0
 | 
|---|
| 56 |  ..Q:+$G(ORKORN)<1
 | 
|---|
| 57 |  ..Q:+ORKORN=+ORNUM
 | 
|---|
| 58 |  ..Q:$P(^OR(100,+ORKORN,8,$P(^OR(100,+ORKORN,8,0),U,3),0),U,2)="DC"
 | 
|---|
| 59 |  ..Q:$P(^ORD(100.01,$P(^OR(100,+ORKORN,3),U,3),0),U)="DISCONTINUED"
 | 
|---|
| 60 |  ..S ORKDRUG=$$VALUE^ORCSAVE2(+ORKORN,"DRUG") ;get disp drug for order
 | 
|---|
| 61 |  ..;only process vs. unsigned med order if disp drug is assoc w/order:
 | 
|---|
| 62 |  ..Q:+$G(ORKDRUG)<1
 | 
|---|
| 63 |  ..S ORPSPKG=$$DGRX^ORQOR2(+ORKORN)
 | 
|---|
| 64 |  ..S ORPSPKG=$S(ORPSPKG="UNIT DOSE MEDICATIONS":"PSI",ORPSPKG="OUTPATIENT MEDICATIONS":"PSO",ORPSPKG="IV MEDICATIONS":"PSIV",ORPSPKG="NON-VA MEDICATIONS":"PSH",1:"")
 | 
|---|
| 65 |  ..S DUPX="" F  S DUPX=$O(ORKDRUGA(DUPX)) Q:'DUPX!(DUPORN=1)  D
 | 
|---|
| 66 |  ...S:ORKORN=ORKDRUGA(DUPX) DUPORN=1
 | 
|---|
| 67 |  ..Q:DUPORN=1  ;quit if already processed drug order
 | 
|---|
| 68 |  ..S ORKDRUGA(+ORKDRUG_";"_ORPSPKG_";"_ORKORN)=ORKORN
 | 
|---|
| 69 |  ;
 | 
|---|
| 70 |  K ^TMP($J,"DI"),^TMP($J,"DD"),^TMP($J,"DC")
 | 
|---|
| 71 |  I $D(ORKDRUGA) D DRGCHK^PSOORDRG(DFN,MED,.ORKDRUGA)
 | 
|---|
| 72 |  ;I '$D(ORKDRUGA) D EN^PSOORDRG(DFN,MED)
 | 
|---|
| 73 |  D PROCESS^ORKPS1(OI,ORDFN,ORKDG)
 | 
|---|
| 74 |  K ^TMP($J,"DI"),^TMP($J,"DD"),^TMP($J,"DC")
 | 
|---|
| 75 |  Q
 | 
|---|
| 76 | TAKEMED(ORKDFN,ORKMED) ;extrinsic function returns med orderable item if any
 | 
|---|
| 77 |  ;active med patient is taking contains any piece of ORKMED
 | 
|---|
| 78 |  ;ORKDFN   patient DFN
 | 
|---|
| 79 |  ;ORKMED   meds to check vs. active med list in format MED1^MED2^MED3...
 | 
|---|
| 80 |  Q:'$L($G(ORKDFN)) "0^Patient not identified."
 | 
|---|
| 81 |  Q:'$L($G(ORKMED)) "0^Medication not identified."
 | 
|---|
| 82 |  N ORKARX,ORKY,ORI,ORJ,ORCNT,ORKMEDP,ORKRSLT
 | 
|---|
| 83 |  D LIST^ORQQPS(.ORKY,ORKDFN,"","")
 | 
|---|
| 84 |  Q:$P(ORKY(1),U)="" "0^No active meds found."
 | 
|---|
| 85 |  S ORKRSLT="0^No matching meds found."
 | 
|---|
| 86 |  S ORCNT=$L(ORKMED,U)
 | 
|---|
| 87 |  S ORI=0 F  S ORI=$O(ORKY(ORI)) Q:ORI<1  D
 | 
|---|
| 88 |  .S ORKARX=$P(ORKY(ORI),U,2)
 | 
|---|
| 89 |  .F ORJ=1:1:ORCNT S ORKMEDP=$P(ORKMED,U,ORJ) D
 | 
|---|
| 90 |  ..I $L(ORKMEDP),(ORKARX[ORKMEDP) S ORKRSLT="1^"_ORKARX
 | 
|---|
| 91 |  Q ORKRSLT
 | 
|---|
| 92 | SOLUT(OI) ;extrinsic function returns 1 (true) if the orderable item is
 | 
|---|
| 93 |  ; a solution (IV Base)
 | 
|---|
| 94 |  Q:+$G(OI)<1 ""
 | 
|---|
| 95 |  N OITEXT
 | 
|---|
| 96 |  S OITEXT=$G(^ORD(101.43,OI,0))
 | 
|---|
| 97 |  Q:'$L(OITEXT) ""
 | 
|---|
| 98 |  S OITEXT=$P(OITEXT,U)
 | 
|---|
| 99 |  Q:$D(^ORD(101.43,"S.IVB RX",OITEXT)) 1
 | 
|---|
| 100 |  Q ""
 | 
|---|
| 101 | POLYRX(DFN) ;extrins funct rtns 1 if patient exceeds polypharmacy, 0 if not
 | 
|---|
| 102 |  N ORSLT,ORENT,ORLOC,ORPAR,ORMEDS
 | 
|---|
| 103 |  S ORSLT=0
 | 
|---|
| 104 |  Q:'$L(DFN) ORSLT
 | 
|---|
| 105 |  S VA200="" D OERR^VADPT
 | 
|---|
| 106 |  S ORLOC=+$G(^DIC(42,+VAIN(4),44))
 | 
|---|
| 107 |  K VA200,VAIN
 | 
|---|
| 108 |  S ORENT=+$G(ORLOC)_";SC(^DIV^SYS^PKG"
 | 
|---|
| 109 |  S ORPAR=$$GET^XPAR(ORENT,"ORK POLYPHARMACY",1,"I")
 | 
|---|
| 110 |  S ORMEDS=$$NUMRX(DFN)
 | 
|---|
| 111 |  I $G(ORMEDS)>$G(ORPAR) S ORSLT=1
 | 
|---|
| 112 |  Q ORSLT
 | 
|---|
| 113 | GLCREAT(DFN) ;extrinsic function returns patient's (DFN) most recent serum
 | 
|---|
| 114 |  ; creatinine within # of days from parameter ORK GLUCOPHAGE CREATININE
 | 
|---|
| 115 |  ; results format: test id^result units flag ref range collect d/t^result
 | 
|---|
| 116 |  ; used by order check GLUCOPHAGE-LAB RESULTS
 | 
|---|
| 117 |  N ORLOC,ORPAR,ORDAYS
 | 
|---|
| 118 |  N BDT,CDT,ORY,ORX,ORZ,TEST,ORI,ORJ,CREARSLT,LABFILE,SPECFILE,SPECIMEN
 | 
|---|
| 119 |  Q:'$L(DFN) "0^"
 | 
|---|
| 120 |  S ORDAYS=$$GCDAYS(DFN)
 | 
|---|
| 121 |  Q:'$L(ORDAYS) "0^"
 | 
|---|
| 122 |  D NOW^%DTC
 | 
|---|
| 123 |  S BDT=$$FMADD^XLFDT(%,"-"_ORDAYS,"","","")
 | 
|---|
| 124 |  K %
 | 
|---|
| 125 |  Q:'$L($G(BDT)) "0^"
 | 
|---|
| 126 |  S LABFILE=$$TERMLKUP^ORB31(.ORY,"SERUM CREATININE")
 | 
|---|
| 127 |  Q:'$D(ORY) "0^" ;no link between SERUM CREATININE and local lab test
 | 
|---|
| 128 |  Q:$G(LABFILE)'=60 "0^"
 | 
|---|
| 129 |  S SPECFILE=$$TERMLKUP^ORB31(.ORX,"SERUM SPECIMEN")
 | 
|---|
| 130 |  Q:'$D(ORX) "0^" ;no link between SERUM SPECIMEN and local specimen
 | 
|---|
| 131 |  Q:$G(SPECFILE)'=61 "0^"
 | 
|---|
| 132 |  F ORI=1:1:ORY I +$G(CREARSLT)<1 D
 | 
|---|
| 133 |  .S TEST=$P(ORY(ORI),U)
 | 
|---|
| 134 |  .Q:+$G(TEST)<1
 | 
|---|
| 135 |  .F ORJ=1:1:ORX I +$G(CREARSLT)<1 D
 | 
|---|
| 136 |  ..S SPECIMEN=$P(ORX(ORJ),U)
 | 
|---|
| 137 |  ..Q:+$G(SPECIMEN)<1
 | 
|---|
| 138 |  ..S ORZ=$$LOCL^ORQQLR1(DFN,TEST,SPECIMEN)
 | 
|---|
| 139 |  ..Q:'$L($G(ORZ))
 | 
|---|
| 140 |  ..S CDT=$P(ORZ,U,7)
 | 
|---|
| 141 |  ..I CDT'<BDT S CREARSLT=1
 | 
|---|
| 142 |  Q:+$G(CREARSLT)<1 "0^"
 | 
|---|
| 143 |  Q $P(ORZ,U)_U_$P(ORZ,U,3)_" "_$P(ORZ,U,4)_" "_$P(ORZ,U,5)_" ("_$P(ORZ,U,6)_")  "_$$FMTE^XLFDT(CDT,"2P")_U_$P(ORZ,U,3)
 | 
|---|
| 144 | GCDAYS(DFN) ;extrinsic function to return number of days to look for 
 | 
|---|
| 145 |  ; glucophage serum creatinine result
 | 
|---|
| 146 |  Q:'$L(DFN) ""
 | 
|---|
| 147 |  N ORLOC,ORENT,ORDAYS
 | 
|---|
| 148 |  ;get patient's location flag (INPATIENT ONLY - outpt locations cannot be
 | 
|---|
| 149 |  ;reliably determined, and many simultaneous outpt locations can occur):
 | 
|---|
| 150 |  S VA200="" D OERR^VADPT
 | 
|---|
| 151 |  S ORLOC=+$G(^DIC(42,+VAIN(4),44))
 | 
|---|
| 152 |  K VA200,VAIN
 | 
|---|
| 153 |  S ORENT=+$G(ORLOC)_";SC(^DIV^SYS^PKG"
 | 
|---|
| 154 |  S ORDAYS=$$GET^XPAR(ORENT,"ORK GLUCOPHAGE CREATININE",1,"I")
 | 
|---|
| 155 |  Q:$L(ORDAYS) ORDAYS
 | 
|---|
| 156 |  Q ""
 | 
|---|
| 157 | SUPPLY(OI) ;extrinsic function returns 1 (true) if the orderable item is
 | 
|---|
| 158 |  ; a supply
 | 
|---|
| 159 |  Q:+$G(OI)<1 ""
 | 
|---|
| 160 |  N OITEXT
 | 
|---|
| 161 |  S OITEXT=$G(^ORD(101.43,OI,0))
 | 
|---|
| 162 |  Q:'$L(OITEXT) ""
 | 
|---|
| 163 |  S OITEXT=$P(OITEXT,U)
 | 
|---|
| 164 |  Q:$D(^ORD(101.43,"S.SPLY",OITEXT)) 1
 | 
|---|
| 165 |  Q ""
 | 
|---|
| 166 | NUMRX(DFN) ;extrinsic funct returns number of active meds patient is taking
 | 
|---|
| 167 |  N NUMRX,ORPTYPE,ORX,ORY,ORS,ORNUM,ORPRENEW
 | 
|---|
| 168 |  S NUMRX=0
 | 
|---|
| 169 |  Q:+$G(DFN)<1 NUMRX
 | 
|---|
| 170 |  ;
 | 
|---|
| 171 |  ;check to determine if inpatient or outpatient:
 | 
|---|
| 172 |  D ADM^VADPT2
 | 
|---|
| 173 |  S ORPTYPE=$S(+$G(VADMVT)>0:"I",1:"O")
 | 
|---|
| 174 |  ;
 | 
|---|
| 175 |  K ^TMP("PS",$J)
 | 
|---|
| 176 |  D OCL^PSOORRL(DFN,"","")  ;if no date range, returns active meds for pt
 | 
|---|
| 177 |  N X
 | 
|---|
| 178 |  S X=0
 | 
|---|
| 179 |  F  S X=$O(^TMP("PS",$J,X)) Q:X<1  D
 | 
|---|
| 180 |  .S ORX=$G(^TMP("PS",$J,X,0))
 | 
|---|
| 181 |  .S ORY=$P(ORX,U)
 | 
|---|
| 182 |  .S ORNUM=$P(ORX,U,8) ;order entry order number
 | 
|---|
| 183 |  .S ORS=$P(ORX,U,9) ;medication status from pharmacy
 | 
|---|
| 184 |  .S ORPRENEW=$P(ORX,U,14)  ;pending renewal flag (1: pending renewal)
 | 
|---|
| 185 |  .Q:+ORX<1
 | 
|---|
| 186 |  .Q:$P(ORY,";",2)'=ORPTYPE  ;quit if med is not pt type (inpt/outpt)
 | 
|---|
| 187 |  .;quit if status is a non-active type:
 | 
|---|
| 188 |  .Q:$G(ORS)="EXPIRED"
 | 
|---|
| 189 |  .Q:$G(ORS)["DISCONTINUE"
 | 
|---|
| 190 |  .Q:$G(ORS)="DELETED"
 | 
|---|
| 191 |  .Q:+$G(ORPRENEW)>0
 | 
|---|
| 192 |  .Q:$$SUPPLY($$OI^ORQOR2(ORNUM))=1  ;quit if a supply
 | 
|---|
| 193 |  .S NUMRX=NUMRX+1
 | 
|---|
| 194 |  K ^TMP("PS",$J)
 | 
|---|
| 195 |  Q NUMRX
 | 
|---|
| 196 | OI2DD(ORPSA,OROI,ORPSPKG)       ;rtn dispense drugs for a PS OI
 | 
|---|
| 197 |  N PSOI
 | 
|---|
| 198 |  Q:'$D(^ORD(101.43,OROI,0))
 | 
|---|
| 199 |  S PSOI=$P($P(^ORD(101.43,OROI,0),U,2),";")
 | 
|---|
| 200 |  Q:+$G(PSOI)<1
 | 
|---|
| 201 |  S:ORPSPKG="H" ORPSPKG="X"  ;if non-va med need to pass api "X"
 | 
|---|
| 202 |  D DRG^PSSUTIL1(.ORPSA,PSOI,ORPSPKG)
 | 
|---|
| 203 |  Q
 | 
|---|