PSOCLO1 ;BHAM ISC/SAB, HEC/hrubovcak - Clozapine Rx lockout logic ;24 Feb 2020 14:00:01
;;7.0;OUTPATIENT PHARMACY;**1,23,37,222,457,574,612,621,613**;DEC 1997;Build 10
; YSCLTST2 - DBIA 4556
;Reference to ^YSCL(603.01 - DBIA 2697
;MH package will authorize dispensing of the Clozapine drugs
K ANQDATA,ANQX,ANQNO,FLG,PSONEW("SAND"),^TMP($J,"PSO"),^TMP($J,"CLOZFLG",DFN)
N %,ANQ,ANQD,ANQJ,ANQRE,CLOZFLG,D,DIR,DIRUT,DTOUT,DUOUT,J,PSCLZREG,PSMSGTXT,PSOYS,PSTYPE,X,Y
; START NCC REMEDIATION
W !!,"Now doing Clozapine Order checks. Please wait...",!
I XQY0["PSO" S PSTYPE=0,PSMSGTXT="prescription" K PSOSAND
I XQY0["PSJ" S PSTYPE=1,PSMSGTXT="order"
;
; PSO*7.0*574 ; set PSODFN if coming from IP OE
I '($G(PSODFN)>0) S:$G(DFN) PSODFN=DFN Q:'($G(PSODFN)>0) ; must have DFN
;Begin: JCH - PSO*7*612
N PSOYSIEN S PSOYSIEN=$$GETREGYS^PSOCLUTL(PSODFN)
S D=$P($G(^YSCL(603.01,+$G(PSOYSIEN),0)),U,3),CLOZPAT=$S(D="M":2,D="B":1,1:0)
;End: JCH - PSO*7*612
I $D(PSONEW),$G(PSONEW("IRXN")) D EXPDT(.PSONEW,.CLOZPT) ; expiration date for new order
I $D(PSORXED),$G(PSORXED("IRXN")) D EXPDT(.PSORXED,.CLOZPT) ; determine expiration date for edited order
S CLOZFLG=0 ; Used to force start/stop dates to four days only
; ^PS(55,D0,SAND)= (#53) CLOZAPINE REGISTRATION NUMBER [1F] ^ (#54) CLOZAPINE STATUS [2S]
S PSCLZREG=$$GET1^DIQ(55,DFN,53),PSCLZREG("status")=$$GET1^DIQ(55,DFN,54,"I")
D LABRSLT^PSOCLOU(DFN,.PSOYS,.CLOZPAT) ; get lab tests
I PSCLZREG=""!(PSCLZREG("status")="D") D D NOREG Q:'CLOZFLG S PSCLZREG=$$GET1^DIQ(55,DFN,53)
. W !!,"*** This patient has no clozapine registration number ***",!
I PSCLZREG?1U6N S ^TMP($J,"CLOZFLG",DFN)=1
;
S PSLAST7="" ; ** NCC REMEDIATION ** 457/RTW
S PSOYS=$$CL^YSCLTST2(DFN)
;
I PSCLZREG("status")="A",PSCLZREG?2U5N,PSOYS("rANC")="",PSOYS("rWBC")="" G OV1
G:+PSOYS<0 END
S CLOZPAT=$P(PSOYS,U,7),CLOZPAT=$S(CLOZPAT="M":2,CLOZPAT="B":1,1:0)
G:+PSOYS=0 OV1
I +PSOYS=1 D
.I '$G(CLOZFLG),$G(^TMP($J,"CLOZFLG",DFN)) S CLOZFLG=1 ;Q ; JCH - PSO*7*613 Remove Quit
.D DSP
; Begin: JCH - PSO*7*612 - Kill ^XTMP's if patient has Active NCCC registration and valid labs
I PSOYS("rWBC")>0,PSOYS("rANC")>1499,'$G(CLOZFLG) D:'$G(PSTYPE) GDOSE D Q
.I PSCLZREG("status")="A",PSCLZREG?2U5N K ^XTMP("PSO4D-"_DFN) K ^XTMP("PSJ4D-"_DFN)
; End - PSO*7*612
I $G(ANQRE)'=7,$$OVERRIDE^YSCLTST2(DFN) S ANQRE=7,ANQX=0 W !!,"Permission to dispense clozapine has been authorized by NCCC",!
I $G(CLOZFLG),+PSOYS=1 S ANQRE=8
S X=$S(CLOZPAT=2:84,CLOZPAT=1:42,1:21)
D CL1^YSCLTST2(DFN,X)
;/RBN-RJS Begin modification for override bypass
I $D(^TMP($J,"PSO")) D:'$G(CLOZFLG) DSP D CHECK ;AJF - added check for CLOZFLG PSO*574
I $P(ANQ(1),U,2)>1499,+$G(PSTYPE),'+$G(ANQRE) Q ;/RJS Emergency override
I $P(ANQ(1),U,2)>1499,'$G(PSTYPE),'+$G(ANQRE) D DOSE Q ;/RJS Emergency override
E D OVRD
;/RBN-RJS End modification for override bypass
Q
;
OV1 ;
I $$OVERRIDE^YSCLTST2(DFN) S ANQRE=7,ANQX=0 W !!,"Permission to dispense clozapine has been authorized by NCCC",!
S X=$S(CLOZPAT=2:84,CLOZPAT=1:42,1:21)
D CL1^YSCLTST2(DFN,X)
S:$P(PSOYS,U,6)="" $P(PSOYS,U,6)=DT
I $G(ANQRE)'=7 D DSP,CHECK
I $G(ANQRE)=8!($G(ANQRE)=7) D OVRD Q
; patient is ACTIVE, has no labs, regular registration #
I 'PSOYS("rWBC"),'PSOYS("rANC"),PSCLZREG("status")="A",PSCLZREG?2U5N D Q
. D PKEYCHK Q:$G(ANQX) ; doesn't hold key
. D:PSTYPE=1 MSG10^PSOCLUTL ; inpt
. D:PSTYPE=0 MSG9^PSOCLUTL ; outpt
. S ANQRE=9 D OVRD ; PRESCRIBER APPROVED 4 DAY SUPPLY
;
I PSOYS("rWBC"),PSOYS("rANC")<1000,PSOYS("rANC")>0 D MSG4^PSOCLUTL,MSG3^PSOCLUTL,MH,QU Q
I $D(PSCLZREG),'PSOYS("rWBC"),'PSOYS("rANC") D MSG4^PSOCLUTL,MSG3^PSOCLUTL,MH,QU Q
I PSTYPE=0 D ; outpatient
. I PSOYS("rWBC"),'PSOYS("rANC") D MSG9^PSOCLUTL,PKEYCHK,OVRD Q ; WBC, no ANC
. I PSOYS("rWBC"),'PSOYS("rANC") D MSG9^PSOCLUTL,PKEYCHK,OVRD Q ; No labs
;
I PSTYPE=1 D ; inpatient
. I PSOYS("rWBC"),'PSOYS("rANC") D MSG10^PSOCLUTL,OVRD Q ; WBC, no ANC
. I 'PSOYS("rWBC"),'PSOYS("rANC") D MSG10^PSOCLUTL,PKEYCHK,OVRD Q ; No labs
;
I 'PSOYS("rWBC"),PSOYS("rANC") D MSG1^PSOCLUTL Q ; ANC, no WBC
Q
CHECK ;
S:'$$HASKEY(DUZ) ANQX=0
I $G(ANQRE)'=7,$G(ANQRE)'=8 S ANQRE=$S('PSOYS("rANC"):9,PSOYS("rANC")<1000:9,'PSOYS("rWBC"):9,PSOYS("rANC")<1500:10,PSLAST7["Y":9,1:0)
I '$P(PSOYS,U,6) S $P(PSOYS,U,6)=$$NOW^XLFDT
S (ANQD,ANQD(1))=9999999-$P(PSOYS,U,6)
S ANQ(1)=PSOYS("rWBC")_U_PSOYS("rANC") D
.Q:'$D(^TMP($J,"PSO"))
.F ANQJ=2:1:4 S ANQD=$O(^TMP($J,"PSO",ANQD)) Q:'ANQD S ANQ(ANQJ)=^(ANQD),ANQD(ANQJ)=ANQD
S ANQD=$O(ANQ(""),-1)
I $D(PSCLZREG),PSCLZREG=""!(PSCLZREG?1U6N),PSOYS("rANC")'>1499 D Q ; temporary reg # not enough
. W !,"Emergency overrides for non-registered clozapine patients require",!,"ANC levels greater than or equal to 1500",!
. S ANQX=1
I ANQD<2 W !,"*** No previous results to display ***",! Q
S ANQ=$S($P(ANQ(1),U)!$P(ANQ(1),U,2):ANQD,1:ANQD-1)
W !,"*** Last "_$S(ANQ=4:"Four ",ANQ=3:"Three ",ANQ=2:"Two ",1:"")_"WBC and NEUTROPHILS ABSOLUTE (ANC) results ***",!
W !,$J("WBC ANC",49),!
F ANQJ=ANQD:-1:1 S ANQD=9999999-ANQD(ANQJ)_"0000" D
. I $L($P($G(ANQ(ANQJ)),U))!$L($P($G(ANQ(ANQJ)),U,2)) D
.. W $$FMTE^XLFDT(ANQD,"5Z") W:ANQD["." "@",$E(ANQD,9,10),":",$E(ANQD,11,12)
.. W ?29,"Results: "_$J($P(ANQ(ANQJ),U),4)_" ",$J($P(ANQ(ANQJ),U,2),4),!
Q
;
OVRD ;
Q:$G(ANQX)
N PSREASON
I ANQRE,'$$HASKEY(DUZ) D D QU G EXIT
. S ANQX=1 W !!,"You Are Not Authorized to Override! See Clozapine Manager with PSOLOCKCLOZ key."
;
I $L($G(PSOYS)) D:PSOYS("rANC")<1000 ; severe neutropenia
. W !,"Test ANC labs daily until levels stabilize to ANC greater than or equal to 1000.",!
I ANQRE W !,"Override reason: "_$$OVRDTXT^PSOCLOU(ANQRE),! D
. I ANQRE=7 D Q
.. S PSREASON=$$OVRDTXT^PSOCLOU(ANQRE)
.. D OVPRMPT Q:$G(ANQX)
.. D OVRD2 Q:$G(ANQX)
.. D OVRREA
. I ANQRE=5 D Q
.. N DIR S DIR("A")="ANC levels are Critically low. Do you want to Cancel the order",DIR(0)="Y",DIR("B")="N"
.. D ^DIR I Y=0 D MSG6^PSOCLUTL Q
.. I Y(0)="YES"!($D(DTOUT))!($D(DUOUT))!($D(DIROUT)) S ANQX=1 K Q
. I $G(ANQRE)=8 D Q
.. S ANQX=0 D OVPRMPT Q:$G(ANQX)
.. D OVRD2 Q:$G(ANQX)
.. D OVRREA Q:$G(ANQX)
.. D CRXTMPI(DFN,PSOYS)
. ;/RBN Begin modifications for new special override condition for inpatient
. I ANQRE=9,PSTYPE=0 D Q
.. D OVPRMPT Q:$G(ANQX)
.. N DIR,DIRUT S DIR(0)="S^1:Weather Related Conditions;2:Mail Order Delay;3:Inpatient Going On Leave"
.. S DIR("A")="Prescriber's reason for Special Condition Override " D ^DIR I $D(DIRUT) S ANQX=1 Q
.. S PSREASON=Y(0)_": ",^TMP($J,"CLOZFLG",DFN)=1
.. D OVRD2 Q:$G(ANQX)
.. D OVRREA Q:$G(ANQX)
.. S PSREMARK=PSREASON_PSREMARK
.. D CRXTMP(DFN,PSOYS)
. I ANQRE=9,PSTYPE=1 D Q
.. D OVPRMPT Q:$G(ANQX)
.. S PSREASON="IP Order Override with Outside Lab Results: ",^TMP($J,"CLOZFLG",DFN)=1
.. W !,$P(PSREASON,":"),!
.. D OVRREA Q:$G(ANQX)
.. D OVRD2 Q:$G(ANQX)
.. S PSREMARK=PSREASON_PSREMARK
.. D CRXTMPI(DFN,PSOYS)
. I ANQRE=10 D
.. W !,"Test ANC Results 3x weekly until ANC stabilize to greater than or equal to 1500",!
.. D OVPRMPT Q:$G(ANQX)
.. D OVRD2 Q:$G(ANQX)
.. D OVRREA
;
I $G(ANQX) D EXIT Q
;
S PSPROVID="UNKNOWN"
I $D(ND0) S PSPROVID=$P(ND0,U,2),PSJORN=$P(ND0,U,21),PSJORDER("PSJORN")=PSJORN
I $D(ORO) S PSPROVID=$P(ORO,U,4),PSJORN=$P(ORO,U),PSJORDER("PSJORN")=PSJORN
I '$G(PSPROVID),$G(PSTYPE),$G(PSGOEPR) S PSPROVID=+$G(PSGOEPR)
I $D(DUPRX0) S PSPROVID=$P(DUPRX0,U,4)
S:ANQRE SANQX=0,PSCLPAT=DFN,ANQDATA=DUZ_U_PSPROVID_U_ANQRE_U_PSREMARK_U_PSSPHARM_U_PSCLPAT_U_$G(PSJORN)
;
GDOSE ; ask daily dose
I $G(PSTYPE) Q ; not for inpatient
N IENX,PSOCD,PSRXDOS
D ; retrieve DOSAGE ORDERED fields
. ; get parent IEN for new or edited Rx
. N FLD,IRXNTMP S IENX=$S($G(PSORXED("IRXN")):PSORXED("IRXN"),$G(PSONEW("IRXN")):PSONEW("IRXN"),1:0)
. S PSRXDOS("CLOZDOSE301")=$$GET1^DIQ(52,IENX,301) ; (#301) CLOZAPINE DOSAGE (MG/DAY) [1N]
. S IRXNTMP="1,"_IENX F FLD=.01,1:1:9 S PSRXDOS(FLD)=$$GET1^DIQ(52.0113,IRXNTMP,FLD)
;
DOSE ;
K DIR S DIR(0)="N^12.5:3000:1",DIR("A")="CLOZAPINE dosage (mg/day)? "
I '(PSRXDOS(.01)<12.5),'(PSRXDOS(.01)>900) S DIR("B")=PSRXDOS(.01) ; default only for standard dose
D ^DIR K DIR G EXIT:$D(DIRUT)!$D(DTOUT)
S PSOCD=X
;
I PSOCD#25=0,PSOCD'<12.5,PSOCD<900 G EXIT
I PSOCD#12.5 S DIR(0)="Y",DIR("B")="NO",DIR("A")=PSOCD_" is an unusual dose. Are you sure" D ^DIR K DIR G EXIT:$D(DIRUT) I 'Y G DOSE
I PSOCD>900 S DIR(0)="Y",DIR("A")="Recommended maximum daily dose is 900. Are you sure" D ^DIR K DIR G EXIT:$D(DIRUT) I 'Y G DOSE
;
EXIT ;
K ^TMP($J,"PSO")
S:$D(DIRUT) ANQX=1
I $G(ANQX) W !!,"No "_PSMSGTXT_" entered!" H 2 Q
;
D LABRSLT^PSOCLOU(DFN,.PSOYS,.CLOZPAT) ; if added to files #55 or #603.01 lab results may be available
S (PSONEW("SAND"),PSOSAND)=PSOCD_U_PSOYS("rWBC")_U_($P($P(PSOYS,U,6),"."))_U_PSOYS("rANC")
N NDAYS S NDAYS=$S($G(ANQRE)=9!(PSCLZREG?1U6N):4,CLOZPAT=2:28,CLOZPAT=1:14,1:7)
I $G(PSONEW("DAYS SUPPLY"))>NDAYS D
. S PSONEW("DAYS SUPPLY")=NDAYS,$P(PSONEW("RX0"),U,8)=NDAYS
. ; No DURATION set if 4 DAY SUPPLY
. S:$G(NDAYS)'=4 PSONEW("DURATION",1)=NDAYS
. N PSOIENX S PSOIENX="1,"_$G(PSORXIEN)
. S PSONEW("SCHEDULE",1)=$$GET1^DIQ(52.0113,PSOIENX,7)
. S PSONEW("DOSE ORDERED",1)=$$GET1^DIQ(52.0113,PSOIENX,1)
. D QTYCHK(.PSONEW,NDAYS)
; if Rx edited, then update it
I $D(PSORXED) D EXPDT(.PSORXED,.CLOZPT) ; in case of edits
;
Q
;
OVPRMPT ; ask user to override
N DIR
S DIR("A")="Do you want to override and issue this "_PSMSGTXT,DIR(0)="Y",DIR("B")="N" D ^DIR
I 'Y!($D(DIROUT)!($D(DTOUT))) S ANQX=1
Q
;
PKEYCHK ; does user have PSOLOCKCLOZ key
I '$D(PSGSTAT)!($G(PSGSTAT)="PENDING") D
. Q:$$HASKEY(DUZ) ; has security key
. S ANQX=1 W !,"You Are Not Authorized to Override! See Clozapine Manager with PSOLOCKCLOZ key."
Q
;
MH ;
W !!,"Also make sure that the LAB test, ANC is set up correctly in the"
W !,"Mental Health package using the CLOZAPINE MULTI TEST LINK option.",!
Q
DSP ; subroutine: NCC remediation PSO*7.0*457
I 'PSOYS("rWBC"),'PSOYS("rANC") Q
N DIR,Y S Y=$P($$FMTE^XLFDT($P(PSOYS,U,6)),"@")
W !,"*** Most recent WBC and "_$P(PSOYS,U,5)_" (ANC) results ***"
W !," performed on "_Y_" are: "
W !!," "_$P(PSOYS,U,3)_": "_PSOYS("rWBC")
W !," ANC: "_PSOYS("rANC"),!
S DIR(0)="EA",DIR("A")="Type <Enter> to continue: " D ^DIR W !
;
Q
DIR ;
W !! K DIR S DIR(0)="E",DIR("A")="Press Return to Continue" D ^DIR K DIR,DTOUT,DUOUT,DIRUT
Q
;
END ;
D MSG5^PSOCLUTL
QU ; no med prescribed
S ANQX=1 D DIR
Q
;
NOREG ; Register a new/discontinued non-registered cloz patient
;
N %,I,MSG,MSGNUM,NOW,PSCLZREG,PSO1,PSO2,PSO4,PSONAME,PTINFO,STAT,TMP,X,XMSUB,XMTEXT,Y
; Check for authorization key
I '$$HASKEY(DUZ) D Q
. S ANQX=1 W !,"You Are Not Authorized to Override! See Clozapine Manager with PSOLOCKCLOZ key." W:PSTYPE=1 !!,"No order entered!"
;
W !,"Do you want to register this patient with a temporary local"
W !," authorization number in the Clozapine registry? Y/N "
S %=2 D YN^DICN I %'=1 S ANQX=1 W !,"Patient Not Registered",! Q
W !
S (PSO1,TMP("DFN"))=DFN
S PSO2=$$FINDNEXT^PSOCLOU
I PSO2=-1 D S ANQX=1 Q
. W !!,"All emergency registration numbers have been used."
. W !,"Emergency registration may no longer be done at this site",!!
. W !,"Patient Not Registered",!
CONT S TMP("PSO2")=PSO2
S PSONAME=$$GET1^DIQ(2,PSO1,.01)
S PSCLOZ=1,DFN=TMP("DFN")
S PSO2=TMP("PSO2") ; used in NUMBER1^PSOCLUTL
; Check if registration in file #55 failed or was terminated
S PTINFO("surname")=$P(PSONAME,","),PTINFO("firstNm")=$P($P(PSONAME,",",2)," ")
S PTINFO("ssn")=$$GET1^DIQ(2,PSO1,.09),PTINFO("last4")=$E(PTINFO("ssn"),6,9),ANQX=1
D NUMBER1^PSOCLUTL
Q:$G(ANQX)
S PSCLZREG=TMP("PSO2") D ; delete entries in file 603.01 for this patient
. N DA,DIK
. S DIK="^YSCL(603.01,",DA="" F S DA=$O(^YSCL(603.01,"C",DFN,DA)) Q:DA="" D ^DIK
S MSG(1)=PSCLZREG_","_PTINFO("surname")_","_PTINFO("firstNm")_","_PTINFO("last4")
S XMTEXT="MSG(",XMSUB="ADD"
N YSPROD S YSPROD=$$GET1^DIQ(8989.3,1,501,"I") D
. I YSPROD S XMY("G.RUCLDEM@FO-DALLAS.DOMAIN.EXT")="" Q ; production account
. S XMY("G.CLOZAPINE ROLL-UP")="" ; test account
D ^XMD
S DFN=TMP("DFN")
I '$G(XMMG) S MSGNUM=$G(XMZ)
E W !!,"Failed to connect with the NCCC." S PSOFL=1 Q
; use the server logic for sending a message to populate 55 and 603.01
S PSCLOZ=1,^TMP($J,"CLOZFLG",DFN)=1,XMRG=MSG(1),XMFROM=DUZ,XQDATE=$$NOW^XLFDT
D ^YSCLSERV
D XTMPZRO^PSOCLOU
S:PSCLZREG?1U6N $P(^XTMP("PSJ CLOZ",0),U,4)=PSCLZREG ; save only temp registration #
S ^XTMP("PSJ CLOZ",DFN)=DT_U_PSCLZREG_U_"A"
S ^XTMP("PSJ CLOZ","B",PSCLZREG,DFN)=$$FMADD^XLFDT($$NOW^XLFDT,4) ; four days from now
S ^XTMP("PSJ CLOZ","C",DFN,PSCLZREG)=""
S ANQX=0,CLOZFLG=1
D LABRSLT^PSOCLOU(DFN,.PSOYS,.CLOZPAT) ; lab results may now be available
;
QUIT ;
Q
;
OVRD2 ;
S PSSPHARM="" ; clozapine team member IEN
D OVRDTMBR^PSOCLOU
S:'PSSPHARM ANQX=1 ; no team member selected, exit
Q
;
OVRREA ; Override reason when order is NCCC Approved
S ANQX=0
I $G(ANQRE)>6 D
. N DIR,DTOUT,DUOUT,DIRUT,DIROUT
. S DIR(0)="F^5:200"
. S DIR("A")="REASON FOR OVERRIDE Remarks"
. I $G(ANQRE)=9 S DIR("A")="Remarks: "_$P(PSREASON,":")
. S DIR("?")="Response is 5 to 200 characters."
. D ^DIR
. I $G(DTOUT)!$G(DUOUT)!$G(DIRUT)!$G(DIROUT) S ANQX=1 Q
. S PSREMARK=Y
Q
;
CHK4REG(PSCLDFN) ; See if patient already has a clozapine registration number
N PSCLRSLT
S PSCLRSLT=$O(^XTMP("PSJ CLOZ","C",PSCLDFN,""))
Q PSCLRSLT
;
CHK4DFN(PSCLRGNO) ; See if this Clozapine registration is assigned
N PSCLRSLT
S PSCLRSLT=$O(^XTMP("PSJ CLOZ","B",PSCLRGNO,""))
Q PSCLRSLT
;
CHK4EXP(PSCLRGNO,PSCLDFN) ; Check for registration expiration
; returns zero if expired, 1 if not
N PSCLRSLT,PSCLZDAT
S PSCLRSLT=1
I $D(^XTMP("PSJ CLOZ","B",PSCLRGNO,PSCLDFN)) D
. S PSCLZDAT=$G(^XTMP("PSJ CLOZ","B",PSCLRGNO,PSCLDFN)) Q:'(DT>PSCLZDAT) ; not expired
. S PSCLRSLT=0 S:PSCLZDAT>0 $P(^XTMP("PSJ CLOZ",PSCLDFN),U,3)="D"
;
Q PSCLRSLT
;
CRXTMP(DFN,PSOYS) ; create XTMP entry for 4 day supply tracking
I $G(DFN) D CRXTMP^PSOCLUTL(DFN,PSOYS)
Q
CRXTMPI(DFN,PSOYS) ; create XTMP entry for 4 day supply tracking
I $G(DFN) D CRXTMPI^PSOCLUTL(DFN,PSOYS)
Q
;
HASKEY(USRNUM) ; Boolean function, does USRNUM hold the PSOLOCKCLOZ security key?
I '$G(USRNUM)>0 S USRNUM=DUZ ; default to current user
Q $S($D(^XUSEC("PSOLOCKCLOZ",USRNUM)):1,1:0)
;
EXPDT(PSORXARY,CLOZPT) ; PSORXARY,CLOZPAT passed by ref., determine expiration date (for Clozapine only)
; PSORXARY can be a new Rx (PSONEW) or an edited Rx (PSORXED and PSODIR)
Q:'($G(PSORXARY("IRXN"))>0) ; must have IEN
; Check for updates to DAYS SUPPLY, ISSUE DATE and QUANTITY
N D,DYS2EXPR,PSRXFMDT,PSCLUPDT,NUMREFS
S PSCLUPDT("change")=0
S:$G(PSORXARY("DAYS SUPPLY")) PSCLUPDT("change")=1
S:$G(PSORXARY("FLD",1)) PSCLUPDT("change")=1
S:$G(PSORXARY("QTY")) PSCLUPDT("change")=1
I $D(PSORXARY("N# REF")) D
. S NUMREFS=+$G(PSORXARY("N# REF"))
E D
. S NUMREFS=+$P($G(PSORXARY("RX0")),U,9)
Q:'PSCLUPDT("change") ; no changes, exit
S DYS2EXPR=0 ; days to expire
S PSRXFMDT(1)=0 ; field #1
D ; determine ISSUE DATE
. S PSRXFMDT(1)=$G(PSORXARY("FLD",1)) ; field may have been edited
. Q:PSRXFMDT(1)?7N ; date found
. S PSRXFMDT(1)=$$GET1^DIQ(52,PSORXARY("IRXN")_",",1,"I") ; (#1) ISSUE DATE [13D]
. Q:PSRXFMDT(1)
. S PSRXFMDT(1)=DT ; last resort
;
D ; determine days to expire
. S D=$G(PSORXARY("DAYS SUPPLY")) S:D>0 DYS2EXPR=D*(NUMREFS+1)
. I D,$G(PSORXARY("DAYS SUPPLY OLD")) S PSCLUPDT(8)=PSORXARY("DAYS SUPPLY")
. Q:DYS2EXPR
. S D=$P($G(PSORXARY("RX0")),U,8) I D>0 S DYS2EXPR=D*(NUMREFS+1) Q
. S DYS2EXPR=$S(CLOZPAT=2:28,CLOZPAT=1:14,1:7) ; default
; value for FM call
S PSRXFMDT("expires")=$$FMADD^XLFDT(PSRXFMDT(1),DYS2EXPR)
S PSCLUPDT(26)=PSRXFMDT("expires") ; (#26) EXPIRATION DATE [6D]
S PSORXARY("CLOZ EDIT")=PSCLUPDT(26)
I $G(PSORXARY("DAYS SUPPLY")) D
. D QTYCHK(.PSORXARY,PSORXARY("DAYS SUPPLY"))
. ; only if quantity changed
. I $G(PSORXARY("QTY")) S PSCLUPDT(7)=PSORXARY("QTY") ; (#7) QTY [7N]
;
; update PSORXARY("FLD") nodes to include any edits
; QTY (#7), DAYS SUPPLY (#8), EXPIRATION DATE (#26)
F D=7,8,26 I $G(PSCLUPDT(D)) S PSORXARY("FLD",D)=PSCLUPDT(D)
I $G(PSCLUPDT(8)) S $P(PSORXARY("RX0"),U,8)=PSCLUPDT(8) ; (#8) DAYS SUPPLY [8N]
I $G(PSCLUPDT(26)) S $P(PSORXARY("RX2"),U,6)=PSCLUPDT(26) ; (#26) EXPIRATION DATE [6D]
;
Q
;
QTYCHK(PSORXARY,NUMDAYS) ; check/adjust quantity, PSORXARY passed by ref., NUMDAYS is # of days
Q:'($G(NUMDAYS)>0) ; required
D QTYCHK^PSOCLUTL(.PSORXARY,NUMDAYS)
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HPSOCLO1 16924 printed Oct 16, 2024@18:26:04 Page 2
PSOCLO1 ;BHAM ISC/SAB, HEC/hrubovcak - Clozapine Rx lockout logic ;24 Feb 2020 14:00:01
+1 ;;7.0;OUTPATIENT PHARMACY;**1,23,37,222,457,574,612,621,613**;DEC 1997;Build 10
+2 ; YSCLTST2 - DBIA 4556
+3 ;Reference to ^YSCL(603.01 - DBIA 2697
+4 ;MH package will authorize dispensing of the Clozapine drugs
+5 KILL ANQDATA,ANQX,ANQNO,FLG,PSONEW("SAND"),^TMP($JOB,"PSO"),^TMP($JOB,"CLOZFLG",DFN)
+6 NEW %,ANQ,ANQD,ANQJ,ANQRE,CLOZFLG,D,DIR,DIRUT,DTOUT,DUOUT,J,PSCLZREG,PSMSGTXT,PSOYS,PSTYPE,X,Y
+7 ; START NCC REMEDIATION
+8 WRITE !!,"Now doing Clozapine Order checks. Please wait...",!
+9 IF XQY0["PSO"
SET PSTYPE=0
SET PSMSGTXT="prescription"
KILL PSOSAND
+10 IF XQY0["PSJ"
SET PSTYPE=1
SET PSMSGTXT="order"
+11 ;
+12 ; PSO*7.0*574 ; set PSODFN if coming from IP OE
+13 ; must have DFN
IF '($GET(PSODFN)>0)
if $GET(DFN)
SET PSODFN=DFN
if '($GET(PSODFN)>0)
QUIT
+14 ;Begin: JCH - PSO*7*612
+15 NEW PSOYSIEN
SET PSOYSIEN=$$GETREGYS^PSOCLUTL(PSODFN)
+16 SET D=$PIECE($GET(^YSCL(603.01,+$GET(PSOYSIEN),0)),U,3)
SET CLOZPAT=$SELECT(D="M":2,D="B":1,1:0)
+17 ;End: JCH - PSO*7*612
+18 ; expiration date for new order
IF $DATA(PSONEW)
IF $GET(PSONEW("IRXN"))
DO EXPDT(.PSONEW,.CLOZPT)
+19 ; determine expiration date for edited order
IF $DATA(PSORXED)
IF $GET(PSORXED("IRXN"))
DO EXPDT(.PSORXED,.CLOZPT)
+20 ; Used to force start/stop dates to four days only
SET CLOZFLG=0
+21 ; ^PS(55,D0,SAND)= (#53) CLOZAPINE REGISTRATION NUMBER [1F] ^ (#54) CLOZAPINE STATUS [2S]
+22 SET PSCLZREG=$$GET1^DIQ(55,DFN,53)
SET PSCLZREG("status")=$$GET1^DIQ(55,DFN,54,"I")
+23 ; get lab tests
DO LABRSLT^PSOCLOU(DFN,.PSOYS,.CLOZPAT)
+24 IF PSCLZREG=""!(PSCLZREG("status")="D")
Begin DoDot:1
+25 WRITE !!,"*** This patient has no clozapine registration number ***",!
End DoDot:1
DO NOREG
if 'CLOZFLG
QUIT
SET PSCLZREG=$$GET1^DIQ(55,DFN,53)
+26 IF PSCLZREG?1U6N
SET ^TMP($JOB,"CLOZFLG",DFN)=1
+27 ;
+28 ; ** NCC REMEDIATION ** 457/RTW
SET PSLAST7=""
+29 SET PSOYS=$$CL^YSCLTST2(DFN)
+30 ;
+31 IF PSCLZREG("status")="A"
IF PSCLZREG?2U5N
IF PSOYS("rANC")=""
IF PSOYS("rWBC")=""
GOTO OV1
+32 if +PSOYS<0
GOTO END
+33 SET CLOZPAT=$PIECE(PSOYS,U,7)
SET CLOZPAT=$SELECT(CLOZPAT="M":2,CLOZPAT="B":1,1:0)
+34 if +PSOYS=0
GOTO OV1
+35 IF +PSOYS=1
Begin DoDot:1
+36 ;Q ; JCH - PSO*7*613 Remove Quit
IF '$GET(CLOZFLG)
IF $GET(^TMP($JOB,"CLOZFLG",DFN))
SET CLOZFLG=1
+37 DO DSP
End DoDot:1
+38 ; Begin: JCH - PSO*7*612 - Kill ^XTMP's if patient has Active NCCC registration and valid labs
+39 IF PSOYS("rWBC")>0
IF PSOYS("rANC")>1499
IF '$GET(CLOZFLG)
if '$GET(PSTYPE)
DO GDOSE
Begin DoDot:1
+40 IF PSCLZREG("status")="A"
IF PSCLZREG?2U5N
KILL ^XTMP("PSO4D-"_DFN)
KILL ^XTMP("PSJ4D-"_DFN)
End DoDot:1
QUIT
+41 ; End - PSO*7*612
+42 IF $GET(ANQRE)'=7
IF $$OVERRIDE^YSCLTST2(DFN)
SET ANQRE=7
SET ANQX=0
WRITE !!,"Permission to dispense clozapine has been authorized by NCCC",!
+43 IF $GET(CLOZFLG)
IF +PSOYS=1
SET ANQRE=8
+44 SET X=$SELECT(CLOZPAT=2:84,CLOZPAT=1:42,1:21)
+45 DO CL1^YSCLTST2(DFN,X)
+46 ;/RBN-RJS Begin modification for override bypass
+47 ;AJF - added check for CLOZFLG PSO*574
IF $DATA(^TMP($JOB,"PSO"))
if '$GET(CLOZFLG)
DO DSP
DO CHECK
+48 ;/RJS Emergency override
IF $PIECE(ANQ(1),U,2)>1499
IF +$GET(PSTYPE)
IF '+$GET(ANQRE)
QUIT
+49 ;/RJS Emergency override
IF $PIECE(ANQ(1),U,2)>1499
IF '$GET(PSTYPE)
IF '+$GET(ANQRE)
DO DOSE
QUIT
+50 IF '$TEST
DO OVRD
+51 ;/RBN-RJS End modification for override bypass
+52 QUIT
+53 ;
OV1 ;
+1 IF $$OVERRIDE^YSCLTST2(DFN)
SET ANQRE=7
SET ANQX=0
WRITE !!,"Permission to dispense clozapine has been authorized by NCCC",!
+2 SET X=$SELECT(CLOZPAT=2:84,CLOZPAT=1:42,1:21)
+3 DO CL1^YSCLTST2(DFN,X)
+4 if $PIECE(PSOYS,U,6)=""
SET $PIECE(PSOYS,U,6)=DT
+5 IF $GET(ANQRE)'=7
DO DSP
DO CHECK
+6 IF $GET(ANQRE)=8!($GET(ANQRE)=7)
DO OVRD
QUIT
+7 ; patient is ACTIVE, has no labs, regular registration #
+8 IF 'PSOYS("rWBC")
IF 'PSOYS("rANC")
IF PSCLZREG("status")="A"
IF PSCLZREG?2U5N
Begin DoDot:1
+9 ; doesn't hold key
DO PKEYCHK
if $GET(ANQX)
QUIT
+10 ; inpt
if PSTYPE=1
DO MSG10^PSOCLUTL
+11 ; outpt
if PSTYPE=0
DO MSG9^PSOCLUTL
+12 ; PRESCRIBER APPROVED 4 DAY SUPPLY
SET ANQRE=9
DO OVRD
End DoDot:1
QUIT
+13 ;
+14 IF PSOYS("rWBC")
IF PSOYS("rANC")<1000
IF PSOYS("rANC")>0
DO MSG4^PSOCLUTL
DO MSG3^PSOCLUTL
DO MH
DO QU
QUIT
+15 IF $DATA(PSCLZREG)
IF 'PSOYS("rWBC")
IF 'PSOYS("rANC")
DO MSG4^PSOCLUTL
DO MSG3^PSOCLUTL
DO MH
DO QU
QUIT
+16 ; outpatient
IF PSTYPE=0
Begin DoDot:1
+17 ; WBC, no ANC
IF PSOYS("rWBC")
IF 'PSOYS("rANC")
DO MSG9^PSOCLUTL
DO PKEYCHK
DO OVRD
QUIT
+18 ; No labs
IF PSOYS("rWBC")
IF 'PSOYS("rANC")
DO MSG9^PSOCLUTL
DO PKEYCHK
DO OVRD
QUIT
End DoDot:1
+19 ;
+20 ; inpatient
IF PSTYPE=1
Begin DoDot:1
+21 ; WBC, no ANC
IF PSOYS("rWBC")
IF 'PSOYS("rANC")
DO MSG10^PSOCLUTL
DO OVRD
QUIT
+22 ; No labs
IF 'PSOYS("rWBC")
IF 'PSOYS("rANC")
DO MSG10^PSOCLUTL
DO PKEYCHK
DO OVRD
QUIT
End DoDot:1
+23 ;
+24 ; ANC, no WBC
IF 'PSOYS("rWBC")
IF PSOYS("rANC")
DO MSG1^PSOCLUTL
QUIT
+25 QUIT
CHECK ;
+1 if '$$HASKEY(DUZ)
SET ANQX=0
+2 IF $GET(ANQRE)'=7
IF $GET(ANQRE)'=8
SET ANQRE=$SELECT('PSOYS("rANC"):9,PSOYS("rANC")<1000:9,'PSOYS("rWBC"):9,PSOYS("rANC")<1500:10,PSLAST7["Y":9,1:0)
+3 IF '$PIECE(PSOYS,U,6)
SET $PIECE(PSOYS,U,6)=$$NOW^XLFDT
+4 SET (ANQD,ANQD(1))=9999999-$PIECE(PSOYS,U,6)
+5 SET ANQ(1)=PSOYS("rWBC")_U_PSOYS("rANC")
Begin DoDot:1
+6 if '$DATA(^TMP($JOB,"PSO"))
QUIT
+7 FOR ANQJ=2:1:4
SET ANQD=$ORDER(^TMP($JOB,"PSO",ANQD))
if 'ANQD
QUIT
SET ANQ(ANQJ)=^(ANQD)
SET ANQD(ANQJ)=ANQD
End DoDot:1
+8 SET ANQD=$ORDER(ANQ(""),-1)
+9 ; temporary reg # not enough
IF $DATA(PSCLZREG)
IF PSCLZREG=""!(PSCLZREG?1U6N)
IF PSOYS("rANC")'>1499
Begin DoDot:1
+10 WRITE !,"Emergency overrides for non-registered clozapine patients require",!,"ANC levels greater than or equal to 1500",!
+11 SET ANQX=1
End DoDot:1
QUIT
+12 IF ANQD<2
WRITE !,"*** No previous results to display ***",!
QUIT
+13 SET ANQ=$SELECT($PIECE(ANQ(1),U)!$PIECE(ANQ(1),U,2):ANQD,1:ANQD-1)
+14 WRITE !,"*** Last "_$SELECT(ANQ=4:"Four ",ANQ=3:"Three ",ANQ=2:"Two ",1:"")_"WBC and NEUTROPHILS ABSOLUTE (ANC) results ***",!
+15 WRITE !,$JUSTIFY("WBC ANC",49),!
+16 FOR ANQJ=ANQD:-1:1
SET ANQD=9999999-ANQD(ANQJ)_"0000"
Begin DoDot:1
+17 IF $LENGTH($PIECE($GET(ANQ(ANQJ)),U))!$LENGTH($PIECE($GET(ANQ(ANQJ)),U,2))
Begin DoDot:2
+18 WRITE $$FMTE^XLFDT(ANQD,"5Z")
if ANQD["."
WRITE "@",$EXTRACT(ANQD,9,10),":",$EXTRACT(ANQD,11,12)
+19 WRITE ?29,"Results: "_$JUSTIFY($PIECE(ANQ(ANQJ),U),4)_" ",$JUSTIFY($PIECE(ANQ(ANQJ),U,2),4),!
End DoDot:2
End DoDot:1
+20 QUIT
+21 ;
OVRD ;
+1 if $GET(ANQX)
QUIT
+2 NEW PSREASON
+3 IF ANQRE
IF '$$HASKEY(DUZ)
Begin DoDot:1
+4 SET ANQX=1
WRITE !!,"You Are Not Authorized to Override! See Clozapine Manager with PSOLOCKCLOZ key."
End DoDot:1
DO QU
GOTO EXIT
+5 ;
+6 ; severe neutropenia
IF $LENGTH($GET(PSOYS))
if PSOYS("rANC")<1000
Begin DoDot:1
+7 WRITE !,"Test ANC labs daily until levels stabilize to ANC greater than or equal to 1000.",!
End DoDot:1
+8 IF ANQRE
WRITE !,"Override reason: "_$$OVRDTXT^PSOCLOU(ANQRE),!
Begin DoDot:1
+9 IF ANQRE=7
Begin DoDot:2
+10 SET PSREASON=$$OVRDTXT^PSOCLOU(ANQRE)
+11 DO OVPRMPT
if $GET(ANQX)
QUIT
+12 DO OVRD2
if $GET(ANQX)
QUIT
+13 DO OVRREA
End DoDot:2
QUIT
+14 IF ANQRE=5
Begin DoDot:2
+15 NEW DIR
SET DIR("A")="ANC levels are Critically low. Do you want to Cancel the order"
SET DIR(0)="Y"
SET DIR("B")="N"
+16 DO ^DIR
IF Y=0
DO MSG6^PSOCLUTL
QUIT
+17 IF Y(0)="YES"!($DATA(DTOUT))!($DATA(DUOUT))!($DATA(DIROUT))
SET ANQX=1
KILL Q
End DoDot:2
QUIT
+18 IF $GET(ANQRE)=8
Begin DoDot:2
+19 SET ANQX=0
DO OVPRMPT
if $GET(ANQX)
QUIT
+20 DO OVRD2
if $GET(ANQX)
QUIT
+21 DO OVRREA
if $GET(ANQX)
QUIT
+22 DO CRXTMPI(DFN,PSOYS)
End DoDot:2
QUIT
+23 ;/RBN Begin modifications for new special override condition for inpatient
+24 IF ANQRE=9
IF PSTYPE=0
Begin DoDot:2
+25 DO OVPRMPT
if $GET(ANQX)
QUIT
+26 NEW DIR,DIRUT
SET DIR(0)="S^1:Weather Related Conditions;2:Mail Order Delay;3:Inpatient Going On Leave"
+27 SET DIR("A")="Prescriber's reason for Special Condition Override "
DO ^DIR
IF $DATA(DIRUT)
SET ANQX=1
QUIT
+28 SET PSREASON=Y(0)_": "
SET ^TMP($JOB,"CLOZFLG",DFN)=1
+29 DO OVRD2
if $GET(ANQX)
QUIT
+30 DO OVRREA
if $GET(ANQX)
QUIT
+31 SET PSREMARK=PSREASON_PSREMARK
+32 DO CRXTMP(DFN,PSOYS)
End DoDot:2
QUIT
+33 IF ANQRE=9
IF PSTYPE=1
Begin DoDot:2
+34 DO OVPRMPT
if $GET(ANQX)
QUIT
+35 SET PSREASON="IP Order Override with Outside Lab Results: "
SET ^TMP($JOB,"CLOZFLG",DFN)=1
+36 WRITE !,$PIECE(PSREASON,":"),!
+37 DO OVRREA
if $GET(ANQX)
QUIT
+38 DO OVRD2
if $GET(ANQX)
QUIT
+39 SET PSREMARK=PSREASON_PSREMARK
+40 DO CRXTMPI(DFN,PSOYS)
End DoDot:2
QUIT
+41 IF ANQRE=10
Begin DoDot:2
+42 WRITE !,"Test ANC Results 3x weekly until ANC stabilize to greater than or equal to 1500",!
+43 DO OVPRMPT
if $GET(ANQX)
QUIT
+44 DO OVRD2
if $GET(ANQX)
QUIT
+45 DO OVRREA
End DoDot:2
End DoDot:1
+46 ;
+47 IF $GET(ANQX)
DO EXIT
QUIT
+48 ;
+49 SET PSPROVID="UNKNOWN"
+50 IF $DATA(ND0)
SET PSPROVID=$PIECE(ND0,U,2)
SET PSJORN=$PIECE(ND0,U,21)
SET PSJORDER("PSJORN")=PSJORN
+51 IF $DATA(ORO)
SET PSPROVID=$PIECE(ORO,U,4)
SET PSJORN=$PIECE(ORO,U)
SET PSJORDER("PSJORN")=PSJORN
+52 IF '$GET(PSPROVID)
IF $GET(PSTYPE)
IF $GET(PSGOEPR)
SET PSPROVID=+$GET(PSGOEPR)
+53 IF $DATA(DUPRX0)
SET PSPROVID=$PIECE(DUPRX0,U,4)
+54 if ANQRE
SET SANQX=0
SET PSCLPAT=DFN
SET ANQDATA=DUZ_U_PSPROVID_U_ANQRE_U_PSREMARK_U_PSSPHARM_U_PSCLPAT_U_$GET(PSJORN)
+55 ;
GDOSE ; ask daily dose
+1 ; not for inpatient
IF $GET(PSTYPE)
QUIT
+2 NEW IENX,PSOCD,PSRXDOS
+3 ; retrieve DOSAGE ORDERED fields
Begin DoDot:1
+4 ; get parent IEN for new or edited Rx
+5 NEW FLD,IRXNTMP
SET IENX=$SELECT($GET(PSORXED("IRXN")):PSORXED("IRXN"),$GET(PSONEW("IRXN")):PSONEW("IRXN"),1:0)
+6 ; (#301) CLOZAPINE DOSAGE (MG/DAY) [1N]
SET PSRXDOS("CLOZDOSE301")=$$GET1^DIQ(52,IENX,301)
+7 SET IRXNTMP="1,"_IENX
FOR FLD=.01,1:1:9
SET PSRXDOS(FLD)=$$GET1^DIQ(52.0113,IRXNTMP,FLD)
End DoDot:1
+8 ;
DOSE ;
+1 KILL DIR
SET DIR(0)="N^12.5:3000:1"
SET DIR("A")="CLOZAPINE dosage (mg/day)? "
+2 ; default only for standard dose
IF '(PSRXDOS(.01)<12.5)
IF '(PSRXDOS(.01)>900)
SET DIR("B")=PSRXDOS(.01)
+3 DO ^DIR
KILL DIR
if $DATA(DIRUT)!$DATA(DTOUT)
GOTO EXIT
+4 SET PSOCD=X
+5 ;
+6 IF PSOCD#25=0
IF PSOCD'<12.5
IF PSOCD<900
GOTO EXIT
+7 IF PSOCD#12.5
SET DIR(0)="Y"
SET DIR("B")="NO"
SET DIR("A")=PSOCD_" is an unusual dose. Are you sure"
DO ^DIR
KILL DIR
if $DATA(DIRUT)
GOTO EXIT
IF 'Y
GOTO DOSE
+8 IF PSOCD>900
SET DIR(0)="Y"
SET DIR("A")="Recommended maximum daily dose is 900. Are you sure"
DO ^DIR
KILL DIR
if $DATA(DIRUT)
GOTO EXIT
IF 'Y
GOTO DOSE
+9 ;
EXIT ;
+1 KILL ^TMP($JOB,"PSO")
+2 if $DATA(DIRUT)
SET ANQX=1
+3 IF $GET(ANQX)
WRITE !!,"No "_PSMSGTXT_" entered!"
HANG 2
QUIT
+4 ;
+5 ; if added to files #55 or #603.01 lab results may be available
DO LABRSLT^PSOCLOU(DFN,.PSOYS,.CLOZPAT)
+6 SET (PSONEW("SAND"),PSOSAND)=PSOCD_U_PSOYS("rWBC")_U_($PIECE($PIECE(PSOYS,U,6),"."))_U_PSOYS("rANC")
+7 NEW NDAYS
SET NDAYS=$SELECT($GET(ANQRE)=9!(PSCLZREG?1U6N):4,CLOZPAT=2:28,CLOZPAT=1:14,1:7)
+8 IF $GET(PSONEW("DAYS SUPPLY"))>NDAYS
Begin DoDot:1
+9 SET PSONEW("DAYS SUPPLY")=NDAYS
SET $PIECE(PSONEW("RX0"),U,8)=NDAYS
+10 ; No DURATION set if 4 DAY SUPPLY
+11 if $GET(NDAYS)'=4
SET PSONEW("DURATION",1)=NDAYS
+12 NEW PSOIENX
SET PSOIENX="1,"_$GET(PSORXIEN)
+13 SET PSONEW("SCHEDULE",1)=$$GET1^DIQ(52.0113,PSOIENX,7)
+14 SET PSONEW("DOSE ORDERED",1)=$$GET1^DIQ(52.0113,PSOIENX,1)
+15 DO QTYCHK(.PSONEW,NDAYS)
End DoDot:1
+16 ; if Rx edited, then update it
+17 ; in case of edits
IF $DATA(PSORXED)
DO EXPDT(.PSORXED,.CLOZPT)
+18 ;
+19 QUIT
+20 ;
OVPRMPT ; ask user to override
+1 NEW DIR
+2 SET DIR("A")="Do you want to override and issue this "_PSMSGTXT
SET DIR(0)="Y"
SET DIR("B")="N"
DO ^DIR
+3 IF 'Y!($DATA(DIROUT)!($DATA(DTOUT)))
SET ANQX=1
+4 QUIT
+5 ;
PKEYCHK ; does user have PSOLOCKCLOZ key
+1 IF '$DATA(PSGSTAT)!($GET(PSGSTAT)="PENDING")
Begin DoDot:1
+2 ; has security key
if $$HASKEY(DUZ)
QUIT
+3 SET ANQX=1
WRITE !,"You Are Not Authorized to Override! See Clozapine Manager with PSOLOCKCLOZ key."
End DoDot:1
+4 QUIT
+5 ;
MH ;
+1 WRITE !!,"Also make sure that the LAB test, ANC is set up correctly in the"
+2 WRITE !,"Mental Health package using the CLOZAPINE MULTI TEST LINK option.",!
+3 QUIT
DSP ; subroutine: NCC remediation PSO*7.0*457
+1 IF 'PSOYS("rWBC")
IF 'PSOYS("rANC")
QUIT
+2 NEW DIR,Y
SET Y=$PIECE($$FMTE^XLFDT($PIECE(PSOYS,U,6)),"@")
+3 WRITE !,"*** Most recent WBC and "_$PIECE(PSOYS,U,5)_" (ANC) results ***"
+4 WRITE !," performed on "_Y_" are: "
+5 WRITE !!," "_$PIECE(PSOYS,U,3)_": "_PSOYS("rWBC")
+6 WRITE !," ANC: "_PSOYS("rANC"),!
+7 SET DIR(0)="EA"
SET DIR("A")="Type <Enter> to continue: "
DO ^DIR
WRITE !
+8 ;
+9 QUIT
DIR ;
+1 WRITE !!
KILL DIR
SET DIR(0)="E"
SET DIR("A")="Press Return to Continue"
DO ^DIR
KILL DIR,DTOUT,DUOUT,DIRUT
+2 QUIT
+3 ;
END ;
+1 DO MSG5^PSOCLUTL
QU ; no med prescribed
+1 SET ANQX=1
DO DIR
+2 QUIT
+3 ;
NOREG ; Register a new/discontinued non-registered cloz patient
+1 ;
+2 NEW %,I,MSG,MSGNUM,NOW,PSCLZREG,PSO1,PSO2,PSO4,PSONAME,PTINFO,STAT,TMP,X,XMSUB,XMTEXT,Y
+3 ; Check for authorization key
+4 IF '$$HASKEY(DUZ)
Begin DoDot:1
+5 SET ANQX=1
WRITE !,"You Are Not Authorized to Override! See Clozapine Manager with PSOLOCKCLOZ key."
if PSTYPE=1
WRITE !!,"No order entered!"
End DoDot:1
QUIT
+6 ;
+7 WRITE !,"Do you want to register this patient with a temporary local"
+8 WRITE !," authorization number in the Clozapine registry? Y/N "
+9 SET %=2
DO YN^DICN
IF %'=1
SET ANQX=1
WRITE !,"Patient Not Registered",!
QUIT
+10 WRITE !
+11 SET (PSO1,TMP("DFN"))=DFN
+12 SET PSO2=$$FINDNEXT^PSOCLOU
+13 IF PSO2=-1
Begin DoDot:1
+14 WRITE !!,"All emergency registration numbers have been used."
+15 WRITE !,"Emergency registration may no longer be done at this site",!!
+16 WRITE !,"Patient Not Registered",!
End DoDot:1
SET ANQX=1
QUIT
CONT SET TMP("PSO2")=PSO2
+1 SET PSONAME=$$GET1^DIQ(2,PSO1,.01)
+2 SET PSCLOZ=1
SET DFN=TMP("DFN")
+3 ; used in NUMBER1^PSOCLUTL
SET PSO2=TMP("PSO2")
+4 ; Check if registration in file #55 failed or was terminated
+5 SET PTINFO("surname")=$PIECE(PSONAME,",")
SET PTINFO("firstNm")=$PIECE($PIECE(PSONAME,",",2)," ")
+6 SET PTINFO("ssn")=$$GET1^DIQ(2,PSO1,.09)
SET PTINFO("last4")=$EXTRACT(PTINFO("ssn"),6,9)
SET ANQX=1
+7 DO NUMBER1^PSOCLUTL
+8 if $GET(ANQX)
QUIT
+9 ; delete entries in file 603.01 for this patient
SET PSCLZREG=TMP("PSO2")
Begin DoDot:1
+10 NEW DA,DIK
+11 SET DIK="^YSCL(603.01,"
SET DA=""
FOR
SET DA=$ORDER(^YSCL(603.01,"C",DFN,DA))
if DA=""
QUIT
DO ^DIK
End DoDot:1
+12 SET MSG(1)=PSCLZREG_","_PTINFO("surname")_","_PTINFO("firstNm")_","_PTINFO("last4")
+13 SET XMTEXT="MSG("
SET XMSUB="ADD"
+14 NEW YSPROD
SET YSPROD=$$GET1^DIQ(8989.3,1,501,"I")
Begin DoDot:1
+15 ; production account
IF YSPROD
SET XMY("G.RUCLDEM@FO-DALLAS.DOMAIN.EXT")=""
QUIT
+16 ; test account
SET XMY("G.CLOZAPINE ROLL-UP")=""
End DoDot:1
+17 DO ^XMD
+18 SET DFN=TMP("DFN")
+19 IF '$GET(XMMG)
SET MSGNUM=$GET(XMZ)
+20 IF '$TEST
WRITE !!,"Failed to connect with the NCCC."
SET PSOFL=1
QUIT
+21 ; use the server logic for sending a message to populate 55 and 603.01
+22 SET PSCLOZ=1
SET ^TMP($JOB,"CLOZFLG",DFN)=1
SET XMRG=MSG(1)
SET XMFROM=DUZ
SET XQDATE=$$NOW^XLFDT
+23 DO ^YSCLSERV
+24 DO XTMPZRO^PSOCLOU
+25 ; save only temp registration #
if PSCLZREG?1U6N
SET $PIECE(^XTMP("PSJ CLOZ",0),U,4)=PSCLZREG
+26 SET ^XTMP("PSJ CLOZ",DFN)=DT_U_PSCLZREG_U_"A"
+27 ; four days from now
SET ^XTMP("PSJ CLOZ","B",PSCLZREG,DFN)=$$FMADD^XLFDT($$NOW^XLFDT,4)
+28 SET ^XTMP("PSJ CLOZ","C",DFN,PSCLZREG)=""
+29 SET ANQX=0
SET CLOZFLG=1
+30 ; lab results may now be available
DO LABRSLT^PSOCLOU(DFN,.PSOYS,.CLOZPAT)
+31 ;
QUIT ;
+1 QUIT
+2 ;
OVRD2 ;
+1 ; clozapine team member IEN
SET PSSPHARM=""
+2 DO OVRDTMBR^PSOCLOU
+3 ; no team member selected, exit
if 'PSSPHARM
SET ANQX=1
+4 QUIT
+5 ;
OVRREA ; Override reason when order is NCCC Approved
+1 SET ANQX=0
+2 IF $GET(ANQRE)>6
Begin DoDot:1
+3 NEW DIR,DTOUT,DUOUT,DIRUT,DIROUT
+4 SET DIR(0)="F^5:200"
+5 SET DIR("A")="REASON FOR OVERRIDE Remarks"
+6 IF $GET(ANQRE)=9
SET DIR("A")="Remarks: "_$PIECE(PSREASON,":")
+7 SET DIR("?")="Response is 5 to 200 characters."
+8 DO ^DIR
+9 IF $GET(DTOUT)!$GET(DUOUT)!$GET(DIRUT)!$GET(DIROUT)
SET ANQX=1
QUIT
+10 SET PSREMARK=Y
End DoDot:1
+11 QUIT
+12 ;
CHK4REG(PSCLDFN) ; See if patient already has a clozapine registration number
+1 NEW PSCLRSLT
+2 SET PSCLRSLT=$ORDER(^XTMP("PSJ CLOZ","C",PSCLDFN,""))
+3 QUIT PSCLRSLT
+4 ;
CHK4DFN(PSCLRGNO) ; See if this Clozapine registration is assigned
+1 NEW PSCLRSLT
+2 SET PSCLRSLT=$ORDER(^XTMP("PSJ CLOZ","B",PSCLRGNO,""))
+3 QUIT PSCLRSLT
+4 ;
CHK4EXP(PSCLRGNO,PSCLDFN) ; Check for registration expiration
+1 ; returns zero if expired, 1 if not
+2 NEW PSCLRSLT,PSCLZDAT
+3 SET PSCLRSLT=1
+4 IF $DATA(^XTMP("PSJ CLOZ","B",PSCLRGNO,PSCLDFN))
Begin DoDot:1
+5 ; not expired
SET PSCLZDAT=$GET(^XTMP("PSJ CLOZ","B",PSCLRGNO,PSCLDFN))
if '(DT>PSCLZDAT)
QUIT
+6 SET PSCLRSLT=0
if PSCLZDAT>0
SET $PIECE(^XTMP("PSJ CLOZ",PSCLDFN),U,3)="D"
End DoDot:1
+7 ;
+8 QUIT PSCLRSLT
+9 ;
CRXTMP(DFN,PSOYS) ; create XTMP entry for 4 day supply tracking
+1 IF $GET(DFN)
DO CRXTMP^PSOCLUTL(DFN,PSOYS)
+2 QUIT
CRXTMPI(DFN,PSOYS) ; create XTMP entry for 4 day supply tracking
+1 IF $GET(DFN)
DO CRXTMPI^PSOCLUTL(DFN,PSOYS)
+2 QUIT
+3 ;
HASKEY(USRNUM) ; Boolean function, does USRNUM hold the PSOLOCKCLOZ security key?
+1 ; default to current user
IF '$GET(USRNUM)>0
SET USRNUM=DUZ
+2 QUIT $SELECT($DATA(^XUSEC("PSOLOCKCLOZ",USRNUM)):1,1:0)
+3 ;
EXPDT(PSORXARY,CLOZPT) ; PSORXARY,CLOZPAT passed by ref., determine expiration date (for Clozapine only)
+1 ; PSORXARY can be a new Rx (PSONEW) or an edited Rx (PSORXED and PSODIR)
+2 ; must have IEN
if '($GET(PSORXARY("IRXN"))>0)
QUIT
+3 ; Check for updates to DAYS SUPPLY, ISSUE DATE and QUANTITY
+4 NEW D,DYS2EXPR,PSRXFMDT,PSCLUPDT,NUMREFS
+5 SET PSCLUPDT("change")=0
+6 if $GET(PSORXARY("DAYS SUPPLY"))
SET PSCLUPDT("change")=1
+7 if $GET(PSORXARY("FLD",1))
SET PSCLUPDT("change")=1
+8 if $GET(PSORXARY("QTY"))
SET PSCLUPDT("change")=1
+9 IF $DATA(PSORXARY("N# REF"))
Begin DoDot:1
+10 SET NUMREFS=+$GET(PSORXARY("N# REF"))
End DoDot:1
+11 IF '$TEST
Begin DoDot:1
+12 SET NUMREFS=+$PIECE($GET(PSORXARY("RX0")),U,9)
End DoDot:1
+13 ; no changes, exit
if 'PSCLUPDT("change")
QUIT
+14 ; days to expire
SET DYS2EXPR=0
+15 ; field #1
SET PSRXFMDT(1)=0
+16 ; determine ISSUE DATE
Begin DoDot:1
+17 ; field may have been edited
SET PSRXFMDT(1)=$GET(PSORXARY("FLD",1))
+18 ; date found
if PSRXFMDT(1)?7N
QUIT
+19 ; (#1) ISSUE DATE [13D]
SET PSRXFMDT(1)=$$GET1^DIQ(52,PSORXARY("IRXN")_",",1,"I")
+20 if PSRXFMDT(1)
QUIT
+21 ; last resort
SET PSRXFMDT(1)=DT
End DoDot:1
+22 ;
+23 ; determine days to expire
Begin DoDot:1
+24 SET D=$GET(PSORXARY("DAYS SUPPLY"))
if D>0
SET DYS2EXPR=D*(NUMREFS+1)
+25 IF D
IF $GET(PSORXARY("DAYS SUPPLY OLD"))
SET PSCLUPDT(8)=PSORXARY("DAYS SUPPLY")
+26 if DYS2EXPR
QUIT
+27 SET D=$PIECE($GET(PSORXARY("RX0")),U,8)
IF D>0
SET DYS2EXPR=D*(NUMREFS+1)
QUIT
+28 ; default
SET DYS2EXPR=$SELECT(CLOZPAT=2:28,CLOZPAT=1:14,1:7)
End DoDot:1
+29 ; value for FM call
+30 SET PSRXFMDT("expires")=$$FMADD^XLFDT(PSRXFMDT(1),DYS2EXPR)
+31 ; (#26) EXPIRATION DATE [6D]
SET PSCLUPDT(26)=PSRXFMDT("expires")
+32 SET PSORXARY("CLOZ EDIT")=PSCLUPDT(26)
+33 IF $GET(PSORXARY("DAYS SUPPLY"))
Begin DoDot:1
+34 DO QTYCHK(.PSORXARY,PSORXARY("DAYS SUPPLY"))
+35 ; only if quantity changed
+36 ; (#7) QTY [7N]
IF $GET(PSORXARY("QTY"))
SET PSCLUPDT(7)=PSORXARY("QTY")
End DoDot:1
+37 ;
+38 ; update PSORXARY("FLD") nodes to include any edits
+39 ; QTY (#7), DAYS SUPPLY (#8), EXPIRATION DATE (#26)
+40 FOR D=7,8,26
IF $GET(PSCLUPDT(D))
SET PSORXARY("FLD",D)=PSCLUPDT(D)
+41 ; (#8) DAYS SUPPLY [8N]
IF $GET(PSCLUPDT(8))
SET $PIECE(PSORXARY("RX0"),U,8)=PSCLUPDT(8)
+42 ; (#26) EXPIRATION DATE [6D]
IF $GET(PSCLUPDT(26))
SET $PIECE(PSORXARY("RX2"),U,6)=PSCLUPDT(26)
+43 ;
+44 QUIT
+45 ;
QTYCHK(PSORXARY,NUMDAYS) ; check/adjust quantity, PSORXARY passed by ref., NUMDAYS is # of days
+1 ; required
if '($GET(NUMDAYS)>0)
QUIT
+2 DO QTYCHK^PSOCLUTL(.PSORXARY,NUMDAYS)
+3 QUIT