OCXOZ10 ;SLC/RJS,CLA - Order Check Scan ;OCT 30,2024 at 12:49
;;3.0;ORDER ENTRY/RESULTS REPORTING;**32,221,243**;Dec 17,1997;Build 242
;; ;;ORDER CHECK EXPERT version 1.01 released OCT 29,1998
;
; ***************************************************************
; ** Warning: This routine is automatically generated by the **
; ** Rule Compiler (^OCXOCMP) and ANY changes to this routine **
; ** will be lost the next time the rule compiler executes. **
; ***************************************************************
;
Q
;
R71R1A ; Verify all Event/Elements of Rule #71 'OPIOID MEDICATIONS' Relation #1 'OPIOID MED ORDER AND DUP OPIOID MEDS'
; Called from EL138+5^OCXOZ0H, and EL139+5^OCXOZ0H.
;
Q:$G(OCXOERR)
;
; Local Extrinsic Functions
; MCE138( ----------> Verify Event/Element: 'DUP OPIOID MEDS'
; MCE139( ----------> Verify Event/Element: 'OPIOID MED ORDER'
;
Q:$G(^OCXS(860.2,71,"INACT"))
;
I $$MCE139 D
.I $$MCE138 D R71R1B
Q
;
R71R1B ; Send Order Check, Notication messages and/or Execute code for Rule #71 'OPIOID MEDICATIONS' Relation #1 'OPIOID MED ORDER AND DUP OPIOID MEDS'
; Called from R71R1A+12.
;
Q:$G(OCXOERR)
;
; Local Extrinsic Functions
; GETDATA( ---------> GET DATA FROM THE ACTIVE DATA FILE
;
Q:$D(OCXRULE("R71R1B"))
;
N OCXNMSG,OCXCMSG,OCXPORD,OCXFORD,OCXDATA,OCXNUM,OCXDUZ,OCXQUIT,OCXLOGS,OCXLOGD
I ($G(OCXOSRC)="CPRS ORDER PRESCAN") S OCXCMSG=(+OCXPSD)_"^33^^Duplicate opioid medications: "_$$GETDATA(DFN,"138^139",158) I 1
E S OCXCMSG="Duplicate opioid medications: "_$$GETDATA(DFN,"138^139",158)
S OCXNMSG=""
;
Q:$G(OCXOERR)
;
; Send Order Check Message
;
S OCXOCMSG($O(OCXOCMSG(999999),-1)+1)=OCXCMSG
Q
;
R72R1A ; Verify all Event/Elements of Rule #72 'AUTO DCED CONTROLLED SUBSTANCE ORDERS' Relation #1 'PHARM DCED AND PHARM HASH MISMATCH'
; Called from EL142+5^OCXOZ0H, and EL143+5^OCXOZ0H.
;
Q:$G(OCXOERR)
;
; Local Extrinsic Functions
; MCE142( ----------> Verify Event/Element: 'HL7 PHARMACY DCED ORDER'
; MCE143( ----------> Verify Event/Element: 'HL7 PHARMACY HASH MISMATCH'
;
Q:$G(^OCXS(860.2,72,"INACT"))
;
I $$MCE142 D
.I $$MCE143 D R72R1B
Q
;
R72R1B ; Send Order Check, Notication messages and/or Execute code for Rule #72 'AUTO DCED CONTROLLED SUBSTANCE ORDERS' Relation #1 'PHARM DCED AND PHARM HASH MISMATCH'
; Called from R72R1A+12.
;
Q:$G(OCXOERR)
;
; Local Extrinsic Functions
; NEWRULE( ---------> NEW RULE MESSAGE
;
Q:$D(OCXRULE("R72R1B"))
;
N OCXNMSG,OCXCMSG,OCXPORD,OCXFORD,OCXDATA,OCXNUM,OCXDUZ,OCXQUIT,OCXLOGS,OCXLOGD
S OCXCMSG=""
S OCXNMSG="Med order(s) DCed. Resubmit or contact Pharmacy."
;
Q:$G(OCXOERR)
;
; Send Notification
;
S (OCXDUZ,OCXDATA)="",OCXNUM=0
I ($G(OCXOSRC)="GENERIC HL7 MESSAGE ARRAY") D
.S OCXDATA=$G(^TMP("OCXSWAP",$J,"OCXODATA","ORC",2))_"|"_$G(^TMP("OCXSWAP",$J,"OCXODATA","ORC",3))
.S OCXDATA=$TR(OCXDATA,"^","@"),OCXNUM=+OCXDATA
I ($G(OCXOSRC)="CPRS ORDER PROTOCOL") D
.I $P($G(OCXORD),U,3) S OCXDUZ(+$P(OCXORD,U,3))=""
.S OCXNUM=+$P(OCXORD,U,2)
S:($G(OCXOSRC)="CPRS ORDER PRESCAN") OCXNUM=+$P(OCXPSD,"|",5)
S OCXRULE("R72R1B")=""
I $$NEWRULE(DFN,OCXNUM,72,1,74,OCXNMSG) D I 1
.D:($G(OCXTRACE)<5) EN^ORB3(74,DFN,OCXNUM,.OCXDUZ,OCXNMSG,.OCXDATA)
Q
;
R72R2A ; Verify all Event/Elements of Rule #72 'AUTO DCED CONTROLLED SUBSTANCE ORDERS' Relation #2 'PHARM DCED AND DEA CERT REVOKED'
; Called from EL142+6^OCXOZ0H, and EL141+5^OCXOZ0H.
;
Q:$G(OCXOERR)
;
; Local Extrinsic Functions
; MCE141( ----------> Verify Event/Element: 'HL7 DEA CERT REVOKED'
; MCE142( ----------> Verify Event/Element: 'HL7 PHARMACY DCED ORDER'
;
Q:$G(^OCXS(860.2,72,"INACT"))
;
I $$MCE142 D
.I $$MCE141 D R72R2B^OCXOZ11
Q
;
CKSUM(STR) ; Compiler Function: GENERATE STRING CHECKSUM
;
N CKSUM,PTR,ASC S CKSUM=0
S STR=$TR(STR,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
F PTR=$L(STR):-1:1 S ASC=$A(STR,PTR)-42 I (ASC>0),(ASC<51) S CKSUM=CKSUM*2+ASC
Q +CKSUM
;
GETDATA(DFN,OCXL,OCXDFI) ; This Local Extrinsic Function returns runtime data
;
N OCXE,VAL,PC S VAL=""
F PC=1:1:$L(OCXL,U) S OCXE=$P(OCXL,U,PC) I OCXE S VAL=$G(^TMP("OCXCHK",$J,DFN,OCXE,OCXDFI)) Q:$L(VAL)
Q VAL
;
MCE138() ; Verify Event/Element: DUP OPIOID MEDS
;
; OCXDF(158) -> DUPLICATE OPIOID MEDICATIONS TEXT data field
; OCXDF(157) -> DUPLICATE OPIOID MEDICATIONS FLAG data field
; OCXDF(37) -> PATIENT IEN data field
;
N OCXRES
S OCXDF(37)=$G(DFN) I $L(OCXDF(37)) S OCXRES(138,37)=OCXDF(37)
Q:'(OCXDF(37)) 0 I $D(^TMP("OCXCHK",$J,OCXDF(37),138)) Q $G(^TMP("OCXCHK",$J,OCXDF(37),138))
S OCXRES(138)=0,OCXDF(157)=$P($$OPIOID(OCXDF(37)),"^",1) I $L(OCXDF(157)) S OCXRES(138,157)=OCXDF(157) I (OCXDF(157))
E Q 0
S OCXDF(158)=$P($$OPIOID(OCXDF(37)),"^",2),OCXRES(138)=11 M ^TMP("OCXCHK",$J,OCXDF(37),138)=OCXRES(138)
Q +OCXRES(138)
;
MCE139() ; Verify Event/Element: OPIOID MED ORDER
;
; OCXDF(37) -> PATIENT IEN data field
;
N OCXRES
S OCXDF(37)=$G(DFN) I $L(OCXDF(37)) S OCXRES(139,37)=OCXDF(37)
Q:'(OCXDF(37)) 0 I $D(^TMP("OCXCHK",$J,OCXDF(37),139)) Q $G(^TMP("OCXCHK",$J,OCXDF(37),139))
Q 0
;
MCE141() ; Verify Event/Element: HL7 DEA CERT REVOKED
;
;
N OCXRES
I $L(OCXDF(37)) S OCXRES(141,37)=OCXDF(37)
Q:'(OCXDF(37)) 0 I $D(^TMP("OCXCHK",$J,OCXDF(37),141)) Q $G(^TMP("OCXCHK",$J,OCXDF(37),141))
Q 0
;
MCE142() ; Verify Event/Element: HL7 PHARMACY DCED ORDER
;
;
N OCXRES
I $L(OCXDF(37)) S OCXRES(142,37)=OCXDF(37)
Q:'(OCXDF(37)) 0 I $D(^TMP("OCXCHK",$J,OCXDF(37),142)) Q $G(^TMP("OCXCHK",$J,OCXDF(37),142))
Q 0
;
MCE143() ; Verify Event/Element: HL7 PHARMACY HASH MISMATCH
;
;
N OCXRES
I $L(OCXDF(37)) S OCXRES(143,37)=OCXDF(37)
Q:'(OCXDF(37)) 0 I $D(^TMP("OCXCHK",$J,OCXDF(37),143)) Q $G(^TMP("OCXCHK",$J,OCXDF(37),143))
Q 0
;
NEWRULE(OCXDFN,OCXORD,OCXRUL,OCXREL,OCXNOTF,OCXMESS) ; Has this rule already been triggered for this order number
;
;
Q:'$G(OCXDFN) 0 Q:'$G(OCXRUL) 0
Q:'$G(OCXREL) 0 Q:'$G(OCXNOTF) 0 Q:'$L($G(OCXMESS)) 0
S OCXORD=+$G(OCXORD),OCXDFN=+OCXDFN
;
N OCXNDX,OCXDATA,OCXDFI,OCXELE,OCXGR,OCXTIME,OCXCKSUM,OCXTSP,OCXTSPL
;
S OCXTIME=(+$H)
S OCXCKSUM=$$CKSUM(OCXMESS)
;
S OCXTSP=($H*86400)+$P($H,",",2)
S OCXTSPL=($G(^OCXD(860.7,"AT",OCXTIME,OCXDFN,OCXRUL,+OCXORD,OCXCKSUM))+$G(OCXTSPI,300))
;
Q:(OCXTSPL>OCXTSP) 0
;
K OCXDATA
S OCXDATA(OCXDFN,0)=OCXDFN
S OCXDATA("B",OCXDFN,OCXDFN)=""
S OCXDATA("AT",OCXTIME,OCXDFN,OCXRUL,+OCXORD,OCXCKSUM)=OCXTSP
;
S OCXGR="^OCXD(860.7"
D SETAP(OCXGR_")",0,.OCXDATA,OCXDFN)
;
K OCXDATA
S OCXDATA(OCXRUL,0)=OCXRUL_U_(OCXTIME)_U_(+OCXORD)
S OCXDATA(OCXRUL,"M")=OCXMESS
S OCXDATA("B",OCXRUL,OCXRUL)=""
S OCXGR=OCXGR_","_OCXDFN_",1"
D SETAP(OCXGR_")","860.71P",.OCXDATA,OCXRUL)
;
K OCXDATA
S OCXDATA(OCXREL,0)=OCXREL
S OCXDATA("B",OCXREL,OCXREL)=""
S OCXGR=OCXGR_","_OCXRUL_",1"
D SETAP(OCXGR_")","860.712",.OCXDATA,OCXREL)
;
S OCXELE=0 F S OCXELE=$O(^OCXS(860.2,OCXRUL,"C","C",OCXELE)) Q:'OCXELE D
.;
.N OCXGR1
.S OCXGR1=OCXGR_","_OCXREL_",1"
.K OCXDATA
.S OCXDATA(OCXELE,0)=OCXELE
.S OCXDATA(OCXELE,"TIME")=OCXTIME
.S OCXDATA(OCXELE,"LOG")=$G(OCXOLOG)
.S OCXDATA("B",OCXELE,OCXELE)=""
.K ^OCXD(860.7,OCXDFN,1,OCXRUL,1,OCXREL,1,OCXELE)
.D SETAP(OCXGR1_")","860.7122P",.OCXDATA,OCXELE)
.;
.S OCXDFI=0 F S OCXDFI=$O(^TMP("OCXCHK",$J,OCXDFN,OCXELE,OCXDFI)) Q:'OCXDFI D
..N OCXGR2
..S OCXGR2=OCXGR1_","_OCXELE_",1"
..K OCXDATA
..S OCXDATA(OCXDFI,0)=OCXDFI
..S OCXDATA(OCXDFI,"VAL")=^TMP("OCXCHK",$J,OCXDFN,OCXELE,OCXDFI)
..S OCXDATA("B",OCXDFI,OCXDFI)=""
..D SETAP(OCXGR2_")","860.71223P",.OCXDATA,OCXDFI)
;
Q 1
;
SETAP(ROOT,DD,DATA,DA) ; Set Rule Event data
M @ROOT=DATA
I +$G(DD) S @ROOT@(0)="^"_($G(DD))_"^"_($P($G(@ROOT@(0)),U,3)+1)_"^"_$G(DA)
I '$G(DD) S $P(@ROOT@(0),U,3,4)=($P($G(@ROOT@(0)),U,3)+1)_"^"_$G(DA)
;
Q
;
;
OPIOID(ORPT) ;determine if pat is receiving opioid med
; rtn 1^opioid drug 1, opioid drug 2, opioid drug3, ...
N ORDG,ORTN,ORNUM,ORDI,ORDCLAS,ORDERS,ORTEXT,DUP,DUPI,DUPJ,DUPLEN
S ORDG=0,ORTN=0,DUPI=0,DUPLEN=20
K ^TMP("ORR",$J)
S ORDG=$O(^ORD(100.98,"B","RX",ORDG))
D EN^ORQ1(ORPT_";DPT(",ORDG,2,"","","",0,0)
N J,HOR,SEQ,X S J=1,HOR=0,SEQ=0
S HOR=$O(^TMP("ORR",$J,HOR)) Q:+HOR<1 ORTN
F S SEQ=$O(^TMP("ORR",$J,HOR,SEQ)) Q:+SEQ<1 D
.S X=^TMP("ORR",$J,HOR,SEQ)
.S ORNUM=+$P(X,";")
.Q:ORNUM=+$G(ORIFN) ;quit if dup med order # = current order #
.S ORDI=$$VALUE^ORCSAVE2(ORNUM,"DRUG")
.I +$G(ORDI)>0 D
..S ORDCLAS=$P(^PSDRUG(ORDI,0),U,2) ;va drug class
..I ($G(ORDCLAS)="CN101")!($G(ORDCLAS)="CN102") D ;opioid classes
...S ORTEXT=$$FULLTEXT^ORQOR1(ORNUM)
...S ORTEXT=$P(ORTEXT,U)_" ["_$P(ORTEXT,U,2)_"]"
...S DUPI=DUPI+1,DUP(DUPI)=" ["_DUPI_"] "_ORTEXT
...S ORTN=1
I DUPI>0 D
.;S DUPLEN=$P(215/DUPI,".")
.S DUPLEN=500
.F DUPJ=1:1:DUPI D
..I DUPJ=1 S ORDERS=$E(DUP(DUPJ),1,DUPLEN)
..E S ORDERS=ORDERS_", "_$E(DUP(DUPJ),1,DUPLEN)
K ^TMP("ORR",$J)
Q ORTN_U_$G(ORDERS)
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HOCXOZ10 9172 printed Nov 22, 2024@17:36:20 Page 2
OCXOZ10 ;SLC/RJS,CLA - Order Check Scan ;OCT 30,2024 at 12:49
+1 ;;3.0;ORDER ENTRY/RESULTS REPORTING;**32,221,243**;Dec 17,1997;Build 242
+2 ;; ;;ORDER CHECK EXPERT version 1.01 released OCT 29,1998
+3 ;
+4 ; ***************************************************************
+5 ; ** Warning: This routine is automatically generated by the **
+6 ; ** Rule Compiler (^OCXOCMP) and ANY changes to this routine **
+7 ; ** will be lost the next time the rule compiler executes. **
+8 ; ***************************************************************
+9 ;
+10 QUIT
+11 ;
R71R1A ; Verify all Event/Elements of Rule #71 'OPIOID MEDICATIONS' Relation #1 'OPIOID MED ORDER AND DUP OPIOID MEDS'
+1 ; Called from EL138+5^OCXOZ0H, and EL139+5^OCXOZ0H.
+2 ;
+3 if $GET(OCXOERR)
QUIT
+4 ;
+5 ; Local Extrinsic Functions
+6 ; MCE138( ----------> Verify Event/Element: 'DUP OPIOID MEDS'
+7 ; MCE139( ----------> Verify Event/Element: 'OPIOID MED ORDER'
+8 ;
+9 if $GET(^OCXS(860.2,71,"INACT"))
QUIT
+10 ;
+11 IF $$MCE139
Begin DoDot:1
+12 IF $$MCE138
DO R71R1B
End DoDot:1
+13 QUIT
+14 ;
R71R1B ; Send Order Check, Notication messages and/or Execute code for Rule #71 'OPIOID MEDICATIONS' Relation #1 'OPIOID MED ORDER AND DUP OPIOID MEDS'
+1 ; Called from R71R1A+12.
+2 ;
+3 if $GET(OCXOERR)
QUIT
+4 ;
+5 ; Local Extrinsic Functions
+6 ; GETDATA( ---------> GET DATA FROM THE ACTIVE DATA FILE
+7 ;
+8 if $DATA(OCXRULE("R71R1B"))
QUIT
+9 ;
+10 NEW OCXNMSG,OCXCMSG,OCXPORD,OCXFORD,OCXDATA,OCXNUM,OCXDUZ,OCXQUIT,OCXLOGS,OCXLOGD
+11 IF ($GET(OCXOSRC)="CPRS ORDER PRESCAN")
SET OCXCMSG=(+OCXPSD)_"^33^^Duplicate opioid medications: "_$$GETDATA(DFN,"138^139",158)
IF 1
+12 IF '$TEST
SET OCXCMSG="Duplicate opioid medications: "_$$GETDATA(DFN,"138^139",158)
+13 SET OCXNMSG=""
+14 ;
+15 if $GET(OCXOERR)
QUIT
+16 ;
+17 ; Send Order Check Message
+18 ;
+19 SET OCXOCMSG($ORDER(OCXOCMSG(999999),-1)+1)=OCXCMSG
+20 QUIT
+21 ;
R72R1A ; Verify all Event/Elements of Rule #72 'AUTO DCED CONTROLLED SUBSTANCE ORDERS' Relation #1 'PHARM DCED AND PHARM HASH MISMATCH'
+1 ; Called from EL142+5^OCXOZ0H, and EL143+5^OCXOZ0H.
+2 ;
+3 if $GET(OCXOERR)
QUIT
+4 ;
+5 ; Local Extrinsic Functions
+6 ; MCE142( ----------> Verify Event/Element: 'HL7 PHARMACY DCED ORDER'
+7 ; MCE143( ----------> Verify Event/Element: 'HL7 PHARMACY HASH MISMATCH'
+8 ;
+9 if $GET(^OCXS(860.2,72,"INACT"))
QUIT
+10 ;
+11 IF $$MCE142
Begin DoDot:1
+12 IF $$MCE143
DO R72R1B
End DoDot:1
+13 QUIT
+14 ;
R72R1B ; Send Order Check, Notication messages and/or Execute code for Rule #72 'AUTO DCED CONTROLLED SUBSTANCE ORDERS' Relation #1 'PHARM DCED AND PHARM HASH MISMATCH'
+1 ; Called from R72R1A+12.
+2 ;
+3 if $GET(OCXOERR)
QUIT
+4 ;
+5 ; Local Extrinsic Functions
+6 ; NEWRULE( ---------> NEW RULE MESSAGE
+7 ;
+8 if $DATA(OCXRULE("R72R1B"))
QUIT
+9 ;
+10 NEW OCXNMSG,OCXCMSG,OCXPORD,OCXFORD,OCXDATA,OCXNUM,OCXDUZ,OCXQUIT,OCXLOGS,OCXLOGD
+11 SET OCXCMSG=""
+12 SET OCXNMSG="Med order(s) DCed. Resubmit or contact Pharmacy."
+13 ;
+14 if $GET(OCXOERR)
QUIT
+15 ;
+16 ; Send Notification
+17 ;
+18 SET (OCXDUZ,OCXDATA)=""
SET OCXNUM=0
+19 IF ($GET(OCXOSRC)="GENERIC HL7 MESSAGE ARRAY")
Begin DoDot:1
+20 SET OCXDATA=$GET(^TMP("OCXSWAP",$JOB,"OCXODATA","ORC",2))_"|"_$GET(^TMP("OCXSWAP",$JOB,"OCXODATA","ORC",3))
+21 SET OCXDATA=$TRANSLATE(OCXDATA,"^","@")
SET OCXNUM=+OCXDATA
End DoDot:1
+22 IF ($GET(OCXOSRC)="CPRS ORDER PROTOCOL")
Begin DoDot:1
+23 IF $PIECE($GET(OCXORD),U,3)
SET OCXDUZ(+$PIECE(OCXORD,U,3))=""
+24 SET OCXNUM=+$PIECE(OCXORD,U,2)
End DoDot:1
+25 if ($GET(OCXOSRC)="CPRS ORDER PRESCAN")
SET OCXNUM=+$PIECE(OCXPSD,"|",5)
+26 SET OCXRULE("R72R1B")=""
+27 IF $$NEWRULE(DFN,OCXNUM,72,1,74,OCXNMSG)
Begin DoDot:1
+28 if ($GET(OCXTRACE)<5)
DO EN^ORB3(74,DFN,OCXNUM,.OCXDUZ,OCXNMSG,.OCXDATA)
End DoDot:1
IF 1
+29 QUIT
+30 ;
R72R2A ; Verify all Event/Elements of Rule #72 'AUTO DCED CONTROLLED SUBSTANCE ORDERS' Relation #2 'PHARM DCED AND DEA CERT REVOKED'
+1 ; Called from EL142+6^OCXOZ0H, and EL141+5^OCXOZ0H.
+2 ;
+3 if $GET(OCXOERR)
QUIT
+4 ;
+5 ; Local Extrinsic Functions
+6 ; MCE141( ----------> Verify Event/Element: 'HL7 DEA CERT REVOKED'
+7 ; MCE142( ----------> Verify Event/Element: 'HL7 PHARMACY DCED ORDER'
+8 ;
+9 if $GET(^OCXS(860.2,72,"INACT"))
QUIT
+10 ;
+11 IF $$MCE142
Begin DoDot:1
+12 IF $$MCE141
DO R72R2B^OCXOZ11
End DoDot:1
+13 QUIT
+14 ;
CKSUM(STR) ; Compiler Function: GENERATE STRING CHECKSUM
+1 ;
+2 NEW CKSUM,PTR,ASC
SET CKSUM=0
+3 SET STR=$TRANSLATE(STR,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
+4 FOR PTR=$LENGTH(STR):-1:1
SET ASC=$ASCII(STR,PTR)-42
IF (ASC>0)
IF (ASC<51)
SET CKSUM=CKSUM*2+ASC
+5 QUIT +CKSUM
+6 ;
GETDATA(DFN,OCXL,OCXDFI) ; This Local Extrinsic Function returns runtime data
+1 ;
+2 NEW OCXE,VAL,PC
SET VAL=""
+3 FOR PC=1:1:$LENGTH(OCXL,U)
SET OCXE=$PIECE(OCXL,U,PC)
IF OCXE
SET VAL=$GET(^TMP("OCXCHK",$JOB,DFN,OCXE,OCXDFI))
if $LENGTH(VAL)
QUIT
+4 QUIT VAL
+5 ;
MCE138() ; Verify Event/Element: DUP OPIOID MEDS
+1 ;
+2 ; OCXDF(158) -> DUPLICATE OPIOID MEDICATIONS TEXT data field
+3 ; OCXDF(157) -> DUPLICATE OPIOID MEDICATIONS FLAG data field
+4 ; OCXDF(37) -> PATIENT IEN data field
+5 ;
+6 NEW OCXRES
+7 SET OCXDF(37)=$GET(DFN)
IF $LENGTH(OCXDF(37))
SET OCXRES(138,37)=OCXDF(37)
+8 if '(OCXDF(37))
QUIT 0
IF $DATA(^TMP("OCXCHK",$JOB,OCXDF(37),138))
QUIT $GET(^TMP("OCXCHK",$JOB,OCXDF(37),138))
+9 SET OCXRES(138)=0
SET OCXDF(157)=$PIECE($$OPIOID(OCXDF(37)),"^",1)
IF $LENGTH(OCXDF(157))
SET OCXRES(138,157)=OCXDF(157)
IF (OCXDF(157))
+10 IF '$TEST
QUIT 0
+11 SET OCXDF(158)=$PIECE($$OPIOID(OCXDF(37)),"^",2)
SET OCXRES(138)=11
MERGE ^TMP("OCXCHK",$JOB,OCXDF(37),138)=OCXRES(138)
+12 QUIT +OCXRES(138)
+13 ;
MCE139() ; Verify Event/Element: OPIOID MED ORDER
+1 ;
+2 ; OCXDF(37) -> PATIENT IEN data field
+3 ;
+4 NEW OCXRES
+5 SET OCXDF(37)=$GET(DFN)
IF $LENGTH(OCXDF(37))
SET OCXRES(139,37)=OCXDF(37)
+6 if '(OCXDF(37))
QUIT 0
IF $DATA(^TMP("OCXCHK",$JOB,OCXDF(37),139))
QUIT $GET(^TMP("OCXCHK",$JOB,OCXDF(37),139))
+7 QUIT 0
+8 ;
MCE141() ; Verify Event/Element: HL7 DEA CERT REVOKED
+1 ;
+2 ;
+3 NEW OCXRES
+4 IF $LENGTH(OCXDF(37))
SET OCXRES(141,37)=OCXDF(37)
+5 if '(OCXDF(37))
QUIT 0
IF $DATA(^TMP("OCXCHK",$JOB,OCXDF(37),141))
QUIT $GET(^TMP("OCXCHK",$JOB,OCXDF(37),141))
+6 QUIT 0
+7 ;
MCE142() ; Verify Event/Element: HL7 PHARMACY DCED ORDER
+1 ;
+2 ;
+3 NEW OCXRES
+4 IF $LENGTH(OCXDF(37))
SET OCXRES(142,37)=OCXDF(37)
+5 if '(OCXDF(37))
QUIT 0
IF $DATA(^TMP("OCXCHK",$JOB,OCXDF(37),142))
QUIT $GET(^TMP("OCXCHK",$JOB,OCXDF(37),142))
+6 QUIT 0
+7 ;
MCE143() ; Verify Event/Element: HL7 PHARMACY HASH MISMATCH
+1 ;
+2 ;
+3 NEW OCXRES
+4 IF $LENGTH(OCXDF(37))
SET OCXRES(143,37)=OCXDF(37)
+5 if '(OCXDF(37))
QUIT 0
IF $DATA(^TMP("OCXCHK",$JOB,OCXDF(37),143))
QUIT $GET(^TMP("OCXCHK",$JOB,OCXDF(37),143))
+6 QUIT 0
+7 ;
NEWRULE(OCXDFN,OCXORD,OCXRUL,OCXREL,OCXNOTF,OCXMESS) ; Has this rule already been triggered for this order number
+1 ;
+2 ;
+3 if '$GET(OCXDFN)
QUIT 0
if '$GET(OCXRUL)
QUIT 0
+4 if '$GET(OCXREL)
QUIT 0
if '$GET(OCXNOTF)
QUIT 0
if '$LENGTH($GET(OCXMESS))
QUIT 0
+5 SET OCXORD=+$GET(OCXORD)
SET OCXDFN=+OCXDFN
+6 ;
+7 NEW OCXNDX,OCXDATA,OCXDFI,OCXELE,OCXGR,OCXTIME,OCXCKSUM,OCXTSP,OCXTSPL
+8 ;
+9 SET OCXTIME=(+$HOROLOG)
+10 SET OCXCKSUM=$$CKSUM(OCXMESS)
+11 ;
+12 SET OCXTSP=($HOROLOG*86400)+$PIECE($HOROLOG,",",2)
+13 SET OCXTSPL=($GET(^OCXD(860.7,"AT",OCXTIME,OCXDFN,OCXRUL,+OCXORD,OCXCKSUM))+$GET(OCXTSPI,300))
+14 ;
+15 if (OCXTSPL>OCXTSP)
QUIT 0
+16 ;
+17 KILL OCXDATA
+18 SET OCXDATA(OCXDFN,0)=OCXDFN
+19 SET OCXDATA("B",OCXDFN,OCXDFN)=""
+20 SET OCXDATA("AT",OCXTIME,OCXDFN,OCXRUL,+OCXORD,OCXCKSUM)=OCXTSP
+21 ;
+22 SET OCXGR="^OCXD(860.7"
+23 DO SETAP(OCXGR_")",0,.OCXDATA,OCXDFN)
+24 ;
+25 KILL OCXDATA
+26 SET OCXDATA(OCXRUL,0)=OCXRUL_U_(OCXTIME)_U_(+OCXORD)
+27 SET OCXDATA(OCXRUL,"M")=OCXMESS
+28 SET OCXDATA("B",OCXRUL,OCXRUL)=""
+29 SET OCXGR=OCXGR_","_OCXDFN_",1"
+30 DO SETAP(OCXGR_")","860.71P",.OCXDATA,OCXRUL)
+31 ;
+32 KILL OCXDATA
+33 SET OCXDATA(OCXREL,0)=OCXREL
+34 SET OCXDATA("B",OCXREL,OCXREL)=""
+35 SET OCXGR=OCXGR_","_OCXRUL_",1"
+36 DO SETAP(OCXGR_")","860.712",.OCXDATA,OCXREL)
+37 ;
+38 SET OCXELE=0
FOR
SET OCXELE=$ORDER(^OCXS(860.2,OCXRUL,"C","C",OCXELE))
if 'OCXELE
QUIT
Begin DoDot:1
+39 ;
+40 NEW OCXGR1
+41 SET OCXGR1=OCXGR_","_OCXREL_",1"
+42 KILL OCXDATA
+43 SET OCXDATA(OCXELE,0)=OCXELE
+44 SET OCXDATA(OCXELE,"TIME")=OCXTIME
+45 SET OCXDATA(OCXELE,"LOG")=$GET(OCXOLOG)
+46 SET OCXDATA("B",OCXELE,OCXELE)=""
+47 KILL ^OCXD(860.7,OCXDFN,1,OCXRUL,1,OCXREL,1,OCXELE)
+48 DO SETAP(OCXGR1_")","860.7122P",.OCXDATA,OCXELE)
+49 ;
+50 SET OCXDFI=0
FOR
SET OCXDFI=$ORDER(^TMP("OCXCHK",$JOB,OCXDFN,OCXELE,OCXDFI))
if 'OCXDFI
QUIT
Begin DoDot:2
+51 NEW OCXGR2
+52 SET OCXGR2=OCXGR1_","_OCXELE_",1"
+53 KILL OCXDATA
+54 SET OCXDATA(OCXDFI,0)=OCXDFI
+55 SET OCXDATA(OCXDFI,"VAL")=^TMP("OCXCHK",$JOB,OCXDFN,OCXELE,OCXDFI)
+56 SET OCXDATA("B",OCXDFI,OCXDFI)=""
+57 DO SETAP(OCXGR2_")","860.71223P",.OCXDATA,OCXDFI)
End DoDot:2
End DoDot:1
+58 ;
+59 QUIT 1
+60 ;
SETAP(ROOT,DD,DATA,DA) ; Set Rule Event data
+1 MERGE @ROOT=DATA
+2 IF +$GET(DD)
SET @ROOT@(0)="^"_($GET(DD))_"^"_($PIECE($GET(@ROOT@(0)),U,3)+1)_"^"_$GET(DA)
+3 IF '$GET(DD)
SET $PIECE(@ROOT@(0),U,3,4)=($PIECE($GET(@ROOT@(0)),U,3)+1)_"^"_$GET(DA)
+4 ;
+5 QUIT
+6 ;
+7 ;
OPIOID(ORPT) ;determine if pat is receiving opioid med
+1 ; rtn 1^opioid drug 1, opioid drug 2, opioid drug3, ...
+2 NEW ORDG,ORTN,ORNUM,ORDI,ORDCLAS,ORDERS,ORTEXT,DUP,DUPI,DUPJ,DUPLEN
+3 SET ORDG=0
SET ORTN=0
SET DUPI=0
SET DUPLEN=20
+4 KILL ^TMP("ORR",$JOB)
+5 SET ORDG=$ORDER(^ORD(100.98,"B","RX",ORDG))
+6 DO EN^ORQ1(ORPT_";DPT(",ORDG,2,"","","",0,0)
+7 NEW J,HOR,SEQ,X
SET J=1
SET HOR=0
SET SEQ=0
+8 SET HOR=$ORDER(^TMP("ORR",$JOB,HOR))
if +HOR<1
QUIT ORTN
+9 FOR
SET SEQ=$ORDER(^TMP("ORR",$JOB,HOR,SEQ))
if +SEQ<1
QUIT
Begin DoDot:1
+10 SET X=^TMP("ORR",$JOB,HOR,SEQ)
+11 SET ORNUM=+$PIECE(X,";")
+12 ;quit if dup med order # = current order #
if ORNUM=+$GET(ORIFN)
QUIT
+13 SET ORDI=$$VALUE^ORCSAVE2(ORNUM,"DRUG")
+14 IF +$GET(ORDI)>0
Begin DoDot:2
+15 ;va drug class
SET ORDCLAS=$PIECE(^PSDRUG(ORDI,0),U,2)
+16 ;opioid classes
IF ($GET(ORDCLAS)="CN101")!($GET(ORDCLAS)="CN102")
Begin DoDot:3
+17 SET ORTEXT=$$FULLTEXT^ORQOR1(ORNUM)
+18 SET ORTEXT=$PIECE(ORTEXT,U)_" ["_$PIECE(ORTEXT,U,2)_"]"
+19 SET DUPI=DUPI+1
SET DUP(DUPI)=" ["_DUPI_"] "_ORTEXT
+20 SET ORTN=1
End DoDot:3
End DoDot:2
End DoDot:1
+21 IF DUPI>0
Begin DoDot:1
+22 ;S DUPLEN=$P(215/DUPI,".")
+23 SET DUPLEN=500
+24 FOR DUPJ=1:1:DUPI
Begin DoDot:2
+25 IF DUPJ=1
SET ORDERS=$EXTRACT(DUP(DUPJ),1,DUPLEN)
+26 IF '$TEST
SET ORDERS=ORDERS_", "_$EXTRACT(DUP(DUPJ),1,DUPLEN)
End DoDot:2
End DoDot:1
+27 KILL ^TMP("ORR",$JOB)
+28 QUIT ORTN_U_$GET(ORDERS)
+29 ;