ORDOTP ; SLC/MAE - Opioid Treatment Components ; Dec 16, 2024@13:29:17
;;3.0;ORDER ENTRY/RESULTS REPORTING;**618**;;Build 14
;
; Reference to ^DPT in ICR# 10035
; Reference to %DTC in ICR# 10000
; Reference to %ZIS in ICR# 10086
; Reference to %ZISC in ICR# 10089
; Reference to %ZISH in ICR# 2320
; Reference to ^DIC in ICR# 10006
; Reference to D^DIQ in ICR# 10004
; Reference to ^DIR in ICR# 10026
; Reference to ^XLFDT in ICR# 10103
; Reference to ^XLFSTR in ICR# 10104
;
EN(ROOT,DFN,ID,ALPHA,OMEGA,DTRANGE,REMOTE,ORMAX,ORFHIE) ;OTP REPORT
N DSPAMT,DSPAMTCHG,DSPBY,DSPDATE,DSPDOW,DSPDIFF,DSPDTTM,DSPEND,DSPFMDATE,DSPFMDAY,DSPHOW,DSPIEN
N DSPINI,DSPINT,DSPINTDT,DSPLINE,DSPREC,DSPROWS,DSPTIME,DSPMED,DSPWEEK,DSPWKCOL,DSPWKCTR
N FRSTDSPDT,HDR,LASTDSPDT,LEGEND,M,MEDDATE,NODSPCTR,NUMWEEKS,PTIEN,PTNAME,X
I $L($G(DTRANGE)),'$G(ALPHA) S ALPHA=$$FMADD^XLFDT(DT,-DTRANGE),OMEGA=$$NOW^XLFDT
Q:'$G(ALPHA) Q:'$G(OMEGA)
;
I $G(OTPVFLG)="" D
.N IOM,IOSL,IOST,IOF
.D HFSOPEN("RPC") I POP S ^TMP("OR OTP",$J,1)="ERROR: UNABLE TO ACCESS HFS DIRECTORY "_$$DEFDIR^%ZISH(),^TMP("OR OTP",$J,2)="PLEASE CHECK DIRECTORY WRITE PRIVILEGES." Q
.U IO
.D GETDATA
.D PRTDATA
.D HFSCLOSE("RPC")
.S ROOT=$NA(^TMP("OR OTP",$J))
I $G(OTPVFLG)=1 D
.U IO
.D GETDATA
.D PRTDATA
.D ^%ZISC
.K OTPSTOP
.K ^TMP("OR OTP",$J)
;
Q
;
GETDATA ;Retrieve OTP Dispense data
K ^TMP("OR OTP",$J,"WEEKS"),^TMP("OR OTP",$J,"OTPREC")
I '$D(^ORD(101.22,"B",DFN)) D HDR W !," **** NO PATIENT DATA FOUND ***" Q
S PTIEN=$O(^ORD(101.22,"B",DFN,""))
S PTNAME=$P(^DPT(DFN,0),U)
S FRSTDSPDT=$O(^ORD(101.22,PTIEN,1,"B",""))
S LASTDSPDT=$O(^ORD(101.22,PTIEN,1,"B",""),-1)
D WEEKS
Q:'$D(^TMP("OR OTP",$J,"WEEKS"))
S MEDDATE="" F S MEDDATE=$O(^ORD(101.22,PTIEN,1,"B",MEDDATE)) Q:MEDDATE="" D
.Q:MEDDATE<ALPHA
.Q:MEDDATE>OMEGA
.S DSPIEN="" F S DSPIEN=$O(^ORD(101.22,PTIEN,1,"B",MEDDATE,DSPIEN)) Q:DSPIEN="" D
..S DSPREC=^ORD(101.22,PTIEN,1,DSPIEN,0)
..S DSPBY=$P(DSPREC,U,4)
..S DSPINI=$P(DSPREC,U,5)
..S DSPHOW=$S($P(DSPREC,U,6)="C":"In Clinic",$P(DSPREC,U,6)="H":"Take Home")
..S DSPMED=$P(DSPREC,U,2) I DSPMED[" " S DSPMED=$E($P(DSPMED," ",1),1,4)_" "_$E($P(DSPMED," ",2),1,3)_" "
..S DSPAMT=$P(DSPREC,U,7) I $G(DSPAMTCHG)="" S DSPAMTCHG=DSPAMT
..I DSPAMTCHG'=DSPAMT S DSPAMTCHG=DSPAMT,DSPAMT=DSPAMT_" **"
..S DSPDATE=$P($P(DSPREC,U,3),".",1)
..S DSPTIME=$P($P(DSPREC,U,3),".",2)_"0000",DSPTIME=$E(DSPTIME,1,2)_":"_$E(DSPTIME,3,4)
..S DSPINTDT=$P(DSPREC,U,8)
..S DSPINT=$P(DSPREC,U,9)
..S DSPWKCOL=$P(^TMP("OR OTP",$J,"WEEKS","DATE",MEDDATE),U)
..I DSPHOW="In Clinic" D
...S ^TMP("OR OTP",$J,"OTPREC",MEDDATE,DSPWKCOL)=$G(^TMP("OR OTP",$J,"OTPREC",MEDDATE,DSPWKCOL))_U_DSPHOW_U_DSPTIME_" "_DSPINI_" "_U_DSPMED_U_DSPAMT_$$REPEAT^XLFSTR(" ",9-$L(DSPAMT))
..I DSPHOW="Take Home" D
...S ^TMP("OR OTP",$J,"OTPREC",MEDDATE,DSPWKCOL)=$G(^TMP("OR OTP",$J,"OTPREC",MEDDATE,DSPWKCOL))_U_DSPHOW_U_" "_U_" "_U_" "
..I $G(DSPBY)'="" I '$D(LEGEND(DSPBY)) S LEGEND(DSPBY)=DSPINI
;
Q
;
PRTDATA ;Print OTP Dispense data
I '$D(^ORD(101.22,"B",DFN)) Q
D HDR
I '$D(^TMP("OR OTP",$J,"WEEKS")) W !," **** NO OTP MEDICATION DISPENSE DATA FOUND ***",! Q
S DSPWEEK="" F S DSPWEEK=$O(^TMP("OR OTP",$J,"WEEKS","COL",DSPWEEK)) Q:DSPWEEK="" D
.S NODSPCTR=0,DSPWKCTR=0
.W !,$TR($J("-",26)," ","-")_" MEDICATION TO BE TAKEN ON: "_$TR($J("-",25)," ","-")
.W !,"| | | | | | | |"
.W !,"|" F X=1:1:7 W $S('$D(^TMP("OR OTP",$J,"WEEKS","COL",DSPWEEK,X)):" ",1:$P(^TMP("OR OTP",$J,"WEEKS","COL",DSPWEEK,X),U,2))_$S(X=7:" |",1:"|")
.W !,"| | | | | | | |"
.W !,$TR($J("",79)," ","-"),!
.S DSPWKCTR=$O(^TMP("OR OTP",$J,"WEEKS","COL",DSPWEEK,""),-1) F X=1:1:DSPWKCTR S DSPFMDAY=$P($G(^TMP("OR OTP",$J,"WEEKS","COL",DSPWEEK,X)),U,1) Q:DSPFMDAY="" D
..I '$D(^TMP("OR OTP",$J,"OTPREC",DSPFMDAY,X)) S NODSPCTR=$G(NODSPCTR)+1
.I NODSPCTR=DSPWKCTR W !," **** NO OTP MEDICATION DISPENSE DATA FOUND ***",! Q
.S DSPROWS=""
.F X=1:1:DSPWKCTR D ;GET NUMBER OF ROWS
..S DSPFMDAY=$P(^TMP("OR OTP",$J,"WEEKS","COL",DSPWEEK,X),"^",1)
..Q:'$D(^TMP("OR OTP",$J,"OTPREC",DSPFMDAY,X))
..S DSPROWS=$S($L(^TMP("OR OTP",$J,"OTPREC",DSPFMDAY,X),"^")-1>DSPROWS:$L(^TMP("OR OTP",$J,"OTPREC",DSPFMDAY,X),"^")-1,1:DSPROWS)
.F M=1:1:DSPROWS D
..S DSPLINE=""
..F X=1:1:7 Q:'$D(^TMP("OR OTP",$J,"WEEKS","COL",DSPWEEK)) D
...S DSPFMDAY=$P($G(^TMP("OR OTP",$J,"WEEKS","COL",DSPWEEK,X)),U,1)
...S DSPFMDATE=$P($G(^TMP("OR OTP",$J,"WEEKS","COL",DSPWEEK,X)),U,2)
...I DSPFMDAY="" S DSPLINE=DSPLINE_"| "_$S(X=7:" |",1:"") Q
...S DSPLINE=DSPLINE_$S($P($G(^TMP("OR OTP",$J,"OTPREC",DSPFMDAY,X)),U,M+1)="":"| ",1:"|"_$P(^TMP("OR OTP",$J,"OTPREC",DSPFMDAY,X),U,M+1)_" ")_$S(X=7:" |",1:"")
..W DSPLINE,!
..I M#4=0,(M'=DSPROWS) W "| | | | | | | |",!
.W $TR($J("",79)," ","-"),!
;
D LEGEND
;
Q
;
HDR ;OTP Report Header
W "OTP MEDICATION DISPENSE REPORT for "_$$FMTE^XLFDT(ALPHA)_" to "_$$FMTE^XLFDT(OMEGA)
D NOW^%DTC S Y=+$E(%,1,12) D D^DIQ
W !,?80-$L("Run Date: "_Y),"Run Date: "_Y
S HDR("PAGE")=$G(HDR("PAGE"))+1
W !,?80-$L("Page: "_HDR("PAGE")),"Page: "_HDR("PAGE")
W !,$TR($J("",80)," ","="),!
Q
;
WEEKS ;Build Weeks Header
S DSPDIFF=$$FMDIFF^XLFDT(OMEGA,ALPHA,1)
S DSPEND=$$FMADD^XLFDT(ALPHA,DSPDIFF)
S MEDDATE=$S(ALPHA<FRSTDSPDT:FRSTDSPDT,1:ALPHA)
F D Q:X>DSPEND
.S X=MEDDATE D H^%DTC S DSPWEEK=%H
.F DSPDOW=1:1:7 D
..S %H=DSPWEEK+DSPDOW-1 D YMD^%DTC
..Q:X>OMEGA!(X>LASTDSPDT)
..S ^TMP("OR OTP",$J,"WEEKS","COL",DSPWEEK,DSPDOW)=X_U_$E(X,4,5)_"/"_$E(X,6,7)_"/"_(1700+$E(X,1,3))
..S ^TMP("OR OTP",$J,"WEEKS","DATE",X)=DSPDOW_U_DSPWEEK
.S %H=DSPWEEK+7 D YMD^%DTC S MEDDATE=X
.S NUMWEEKS=$G(NUMWEEKS)+1
Q
;
LEGEND ;Legend
W !!," ** LEGEND **"
W !,$TR($J("",80)," ","=")
W !!,"Initial - Name Legend"
S DSPBY="" F S DSPBY=$O(LEGEND(DSPBY)) Q:DSPBY="" W !,LEGEND(DSPBY)_" - "_DSPBY
W !!,"BLANK SPACE - shows that no dispense information was received via the interface."
W !,"This can indicate the patient was a no-show for their appointment, no medication"
W !,"was prescribed/dispensed, or that the interface failed to send the data."
w !!,"** - Asterisks indicate that Dispense Amount may have changed within the week."
W !,$TR($J("",80)," ","=")
Q
;
HFSOPEN(HANDLE) ;open HFS
N OTPDIR,OTPFILE
S OTPDIR=$$DEFDIR^%ZISH()
S OTPFILE="ORDOTP"_DUZ_".DAT"
D OPEN^%ZISH(HANDLE,OTPDIR,OTPFILE,"W") Q:POP
S IOM=132,IOSL=99999,IOST="P-DUMMY",IOF=""""""
Q
;
HFSCLOSE(HANDLE) ;close HFS
N OTPDIR,OTPFILE,OTPDEL
D CLOSE^%ZISH(HANDLE)
K ^TMP("OR OTP",$J,1)
S OTPDIR=$$DEFDIR^%ZISH()
S OTPFILE="ORDOTP"_DUZ_".DAT",OTPDEL(OTPFILE)=""
S X=$$FTG^%ZISH(OTPDIR,OTPFILE,$NA(^TMP("OR OTP",$J,1)),3)
S X=$$DEL^%ZISH(OTPDIR,$NA(OTPDEL))
Q
;
ASK ;VistA hook for OTP Dispense Report
N PTIEN,VOTPBDT,VOTPEDT,ID,OTPVFLG
S (PTIEN,X)="",DIC(0)="AEQMZ"
S DIC("A")="Select PATIENT: "
S DIC="^DPT(" D ^DIC K DIC I $E(X)="^" Q
I Y="-1" G ASK
I Y>0 S PTIEN=+Y
;
ASKDT ;
S VOTPBDT=+$$READ("DA^::E","Enter START Date: ","T-7","Enter a start date for the report")
Q:'VOTPBDT
S VOTPEDT=+$$READ("DA^::E"," Enter END Date: ","T","Enter an INCLUSIVE end date for the report")
Q:'VOTPEDT
I $L(VOTPEDT,".")=1 S VOTPEDT=VOTPEDT_".2359"
I VOTPBDT>VOTPEDT W !,"END DATE must be more recent than the START DATE" S (VOTPBDT,VOTPEDT)="" G ASKDT
;
Q:$$SELDEV()
S OTPVFLG=1
S ID="OR_OTP:ORRP OTP DISPENSE~;;24;10"
D EN(.ROOT,PTIEN,ID,VOTPBDT,VOTPEDT,"","","","")
Q
;
READ(TYPE,PROMPT,DEFAULT,HELP,SCREEN) ; Calls reader, returns response
N DIR,X,Y
S DIR(0)=TYPE
I $D(SCREEN) S DIR("S")=SCREEN
I $G(PROMPT)]"" S DIR("A")=PROMPT
I $G(DEFAULT)]"" S DIR("B")=DEFAULT
I $D(HELP) S DIR("?")=HELP
D ^DIR
I Y]"",($L($G(Y),U)'=2) S Y=Y_U_$G(Y(0),Y)
Q Y
;
SELDEV() ;*** Ask for device type for report to output to ***
K IOP,%ZIS,POP,IO("Q")
S %ZIS("A")="Select output device: ",%ZIS("B")="",%ZIS="Q"
D ^%ZIS S OTPSTOP=$S(POP:1,1:0) I POP W !,"** No device selected or Report printed **" D EXIT
Q $G(OTPSTOP)
;
EXIT ;
K %,%H,%I,%ZIS,ZTDESC,ZTDTH,ZTIO,ZTSAVE,ZTRTN
W:$E(IOST,1,2)="C-"&($Y) @IOF
S:$D(ZTQUEUED) ZTREQ="@"
S IOP="HOME" D ^%ZISC
K ZTQUEUED,ZTREQ
Q
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HORDOTP 8555 printed Aug 26, 2025@22:46:01 Page 2
ORDOTP ; SLC/MAE - Opioid Treatment Components ; Dec 16, 2024@13:29:17
+1 ;;3.0;ORDER ENTRY/RESULTS REPORTING;**618**;;Build 14
+2 ;
+3 ; Reference to ^DPT in ICR# 10035
+4 ; Reference to %DTC in ICR# 10000
+5 ; Reference to %ZIS in ICR# 10086
+6 ; Reference to %ZISC in ICR# 10089
+7 ; Reference to %ZISH in ICR# 2320
+8 ; Reference to ^DIC in ICR# 10006
+9 ; Reference to D^DIQ in ICR# 10004
+10 ; Reference to ^DIR in ICR# 10026
+11 ; Reference to ^XLFDT in ICR# 10103
+12 ; Reference to ^XLFSTR in ICR# 10104
+13 ;
EN(ROOT,DFN,ID,ALPHA,OMEGA,DTRANGE,REMOTE,ORMAX,ORFHIE) ;OTP REPORT
+1 NEW DSPAMT,DSPAMTCHG,DSPBY,DSPDATE,DSPDOW,DSPDIFF,DSPDTTM,DSPEND,DSPFMDATE,DSPFMDAY,DSPHOW,DSPIEN
+2 NEW DSPINI,DSPINT,DSPINTDT,DSPLINE,DSPREC,DSPROWS,DSPTIME,DSPMED,DSPWEEK,DSPWKCOL,DSPWKCTR
+3 NEW FRSTDSPDT,HDR,LASTDSPDT,LEGEND,M,MEDDATE,NODSPCTR,NUMWEEKS,PTIEN,PTNAME,X
+4 IF $LENGTH($GET(DTRANGE))
IF '$GET(ALPHA)
SET ALPHA=$$FMADD^XLFDT(DT,-DTRANGE)
SET OMEGA=$$NOW^XLFDT
+5 if '$GET(ALPHA)
QUIT
if '$GET(OMEGA)
QUIT
+6 ;
+7 IF $GET(OTPVFLG)=""
Begin DoDot:1
+8 NEW IOM,IOSL,IOST,IOF
+9 DO HFSOPEN("RPC")
IF POP
SET ^TMP("OR OTP",$JOB,1)="ERROR: UNABLE TO ACCESS HFS DIRECTORY "_$$DEFDIR^%ZISH()
SET ^TMP("OR OTP",$JOB,2)="PLEASE CHECK DIRECTORY WRITE PRIVILEGES."
QUIT
+10 USE IO
+11 DO GETDATA
+12 DO PRTDATA
+13 DO HFSCLOSE("RPC")
+14 SET ROOT=$NAME(^TMP("OR OTP",$JOB))
End DoDot:1
+15 IF $GET(OTPVFLG)=1
Begin DoDot:1
+16 USE IO
+17 DO GETDATA
+18 DO PRTDATA
+19 DO ^%ZISC
+20 KILL OTPSTOP
+21 KILL ^TMP("OR OTP",$JOB)
End DoDot:1
+22 ;
+23 QUIT
+24 ;
GETDATA ;Retrieve OTP Dispense data
+1 KILL ^TMP("OR OTP",$JOB,"WEEKS"),^TMP("OR OTP",$JOB,"OTPREC")
+2 IF '$DATA(^ORD(101.22,"B",DFN))
DO HDR
WRITE !," **** NO PATIENT DATA FOUND ***"
QUIT
+3 SET PTIEN=$ORDER(^ORD(101.22,"B",DFN,""))
+4 SET PTNAME=$PIECE(^DPT(DFN,0),U)
+5 SET FRSTDSPDT=$ORDER(^ORD(101.22,PTIEN,1,"B",""))
+6 SET LASTDSPDT=$ORDER(^ORD(101.22,PTIEN,1,"B",""),-1)
+7 DO WEEKS
+8 if '$DATA(^TMP("OR OTP",$JOB,"WEEKS"))
QUIT
+9 SET MEDDATE=""
FOR
SET MEDDATE=$ORDER(^ORD(101.22,PTIEN,1,"B",MEDDATE))
if MEDDATE=""
QUIT
Begin DoDot:1
+10 if MEDDATE<ALPHA
QUIT
+11 if MEDDATE>OMEGA
QUIT
+12 SET DSPIEN=""
FOR
SET DSPIEN=$ORDER(^ORD(101.22,PTIEN,1,"B",MEDDATE,DSPIEN))
if DSPIEN=""
QUIT
Begin DoDot:2
+13 SET DSPREC=^ORD(101.22,PTIEN,1,DSPIEN,0)
+14 SET DSPBY=$PIECE(DSPREC,U,4)
+15 SET DSPINI=$PIECE(DSPREC,U,5)
+16 SET DSPHOW=$SELECT($PIECE(DSPREC,U,6)="C":"In Clinic",$PIECE(DSPREC,U,6)="H":"Take Home")
+17 SET DSPMED=$PIECE(DSPREC,U,2)
IF DSPMED[" "
SET DSPMED=$EXTRACT($PIECE(DSPMED," ",1),1,4)_" "_$EXTRACT($PIECE(DSPMED," ",2),1,3)_" "
+18 SET DSPAMT=$PIECE(DSPREC,U,7)
IF $GET(DSPAMTCHG)=""
SET DSPAMTCHG=DSPAMT
+19 IF DSPAMTCHG'=DSPAMT
SET DSPAMTCHG=DSPAMT
SET DSPAMT=DSPAMT_" **"
+20 SET DSPDATE=$PIECE($PIECE(DSPREC,U,3),".",1)
+21 SET DSPTIME=$PIECE($PIECE(DSPREC,U,3),".",2)_"0000"
SET DSPTIME=$EXTRACT(DSPTIME,1,2)_":"_$EXTRACT(DSPTIME,3,4)
+22 SET DSPINTDT=$PIECE(DSPREC,U,8)
+23 SET DSPINT=$PIECE(DSPREC,U,9)
+24 SET DSPWKCOL=$PIECE(^TMP("OR OTP",$JOB,"WEEKS","DATE",MEDDATE),U)
+25 IF DSPHOW="In Clinic"
Begin DoDot:3
+26 SET ^TMP("OR OTP",$JOB,"OTPREC",MEDDATE,DSPWKCOL)=$GET(^TMP("OR OTP",$JOB,"OTPREC",MEDDATE,DSPWKCOL))_U_DSPHOW_U_DSPTIME_" "_DSPINI_" "_U_DSPMED_U_DSPAMT_$$REPEAT^XLFSTR(" ",9-$LENGTH(DSPAMT))
End DoDot:3
+27 IF DSPHOW="Take Home"
Begin DoDot:3
+28 SET ^TMP("OR OTP",$JOB,"OTPREC",MEDDATE,DSPWKCOL)=$GET(^TMP("OR OTP",$JOB,"OTPREC",MEDDATE,DSPWKCOL))_U_DSPHOW_U_" "_U_" "_U_" "
End DoDot:3
+29 IF $GET(DSPBY)'=""
IF '$DATA(LEGEND(DSPBY))
SET LEGEND(DSPBY)=DSPINI
End DoDot:2
End DoDot:1
+30 ;
+31 QUIT
+32 ;
PRTDATA ;Print OTP Dispense data
+1 IF '$DATA(^ORD(101.22,"B",DFN))
QUIT
+2 DO HDR
+3 IF '$DATA(^TMP("OR OTP",$JOB,"WEEKS"))
WRITE !," **** NO OTP MEDICATION DISPENSE DATA FOUND ***",!
QUIT
+4 SET DSPWEEK=""
FOR
SET DSPWEEK=$ORDER(^TMP("OR OTP",$JOB,"WEEKS","COL",DSPWEEK))
if DSPWEEK=""
QUIT
Begin DoDot:1
+5 SET NODSPCTR=0
SET DSPWKCTR=0
+6 WRITE !,$TRANSLATE($JUSTIFY("-",26)," ","-")_" MEDICATION TO BE TAKEN ON: "_$TRANSLATE($JUSTIFY("-",25)," ","-")
+7 WRITE !,"| | | | | | | |"
+8 WRITE !,"|"
FOR X=1:1:7
WRITE $SELECT('$DATA(^TMP("OR OTP",$JOB,"WEEKS","COL",DSPWEEK,X)):" ",1:$PIECE(^TMP("OR OTP",$JOB,"WEEKS","COL",DSPWEEK,X),U,2))_$SELECT(X=7:" |",1:"|")
+9 WRITE !,"| | | | | | | |"
+10 WRITE !,$TRANSLATE($JUSTIFY("",79)," ","-"),!
+11 SET DSPWKCTR=$ORDER(^TMP("OR OTP",$JOB,"WEEKS","COL",DSPWEEK,""),-1)
FOR X=1:1:DSPWKCTR
SET DSPFMDAY=$PIECE($GET(^TMP("OR OTP",$JOB,"WEEKS","COL",DSPWEEK,X)),U,1)
if DSPFMDAY=""
QUIT
Begin DoDot:2
+12 IF '$DATA(^TMP("OR OTP",$JOB,"OTPREC",DSPFMDAY,X))
SET NODSPCTR=$GET(NODSPCTR)+1
End DoDot:2
+13 IF NODSPCTR=DSPWKCTR
WRITE !," **** NO OTP MEDICATION DISPENSE DATA FOUND ***",!
QUIT
+14 SET DSPROWS=""
+15 ;GET NUMBER OF ROWS
FOR X=1:1:DSPWKCTR
Begin DoDot:2
+16 SET DSPFMDAY=$PIECE(^TMP("OR OTP",$JOB,"WEEKS","COL",DSPWEEK,X),"^",1)
+17 if '$DATA(^TMP("OR OTP",$JOB,"OTPREC",DSPFMDAY,X))
QUIT
+18 SET DSPROWS=$SELECT($LENGTH(^TMP("OR OTP",$JOB,"OTPREC",DSPFMDAY,X),"^")-1>DSPROWS:$LENGTH(^TMP("OR OTP",$JOB,"OTPREC",DSPFMDAY,X),"^")-1,1:DSPROWS)
End DoDot:2
+19 FOR M=1:1:DSPROWS
Begin DoDot:2
+20 SET DSPLINE=""
+21 FOR X=1:1:7
if '$DATA(^TMP("OR OTP",$JOB,"WEEKS","COL",DSPWEEK))
QUIT
Begin DoDot:3
+22 SET DSPFMDAY=$PIECE($GET(^TMP("OR OTP",$JOB,"WEEKS","COL",DSPWEEK,X)),U,1)
+23 SET DSPFMDATE=$PIECE($GET(^TMP("OR OTP",$JOB,"WEEKS","COL",DSPWEEK,X)),U,2)
+24 IF DSPFMDAY=""
SET DSPLINE=DSPLINE_"| "_$SELECT(X=7:" |",1:"")
QUIT
+25 SET DSPLINE=DSPLINE_$SELECT($PIECE($GET(^TMP("OR OTP",$JOB,"OTPREC",DSPFMDAY,X)),U,M+1)="":"| ",1:"|"_$PIECE(^TMP("OR OTP",$JOB,"OTPREC",DSPFMDAY,X),U,M+1)_" ")_$SELECT(X=7:" |",1:"")
End DoDot:3
+26 WRITE DSPLINE,!
+27 IF M#4=0
IF (M'=DSPROWS)
WRITE "| | | | | | | |",!
End DoDot:2
+28 WRITE $TRANSLATE($JUSTIFY("",79)," ","-"),!
End DoDot:1
+29 ;
+30 DO LEGEND
+31 ;
+32 QUIT
+33 ;
HDR ;OTP Report Header
+1 WRITE "OTP MEDICATION DISPENSE REPORT for "_$$FMTE^XLFDT(ALPHA)_" to "_$$FMTE^XLFDT(OMEGA)
+2 DO NOW^%DTC
SET Y=+$EXTRACT(%,1,12)
DO D^DIQ
+3 WRITE !,?80-$LENGTH("Run Date: "_Y),"Run Date: "_Y
+4 SET HDR("PAGE")=$GET(HDR("PAGE"))+1
+5 WRITE !,?80-$LENGTH("Page: "_HDR("PAGE")),"Page: "_HDR("PAGE")
+6 WRITE !,$TRANSLATE($JUSTIFY("",80)," ","="),!
+7 QUIT
+8 ;
WEEKS ;Build Weeks Header
+1 SET DSPDIFF=$$FMDIFF^XLFDT(OMEGA,ALPHA,1)
+2 SET DSPEND=$$FMADD^XLFDT(ALPHA,DSPDIFF)
+3 SET MEDDATE=$SELECT(ALPHA<FRSTDSPDT:FRSTDSPDT,1:ALPHA)
+4 FOR
Begin DoDot:1
+5 SET X=MEDDATE
DO H^%DTC
SET DSPWEEK=%H
+6 FOR DSPDOW=1:1:7
Begin DoDot:2
+7 SET %H=DSPWEEK+DSPDOW-1
DO YMD^%DTC
+8 if X>OMEGA!(X>LASTDSPDT)
QUIT
+9 SET ^TMP("OR OTP",$JOB,"WEEKS","COL",DSPWEEK,DSPDOW)=X_U_$EXTRACT(X,4,5)_"/"_$EXTRACT(X,6,7)_"/"_(1700+$EXTRACT(X,1,3))
+10 SET ^TMP("OR OTP",$JOB,"WEEKS","DATE",X)=DSPDOW_U_DSPWEEK
End DoDot:2
+11 SET %H=DSPWEEK+7
DO YMD^%DTC
SET MEDDATE=X
+12 SET NUMWEEKS=$GET(NUMWEEKS)+1
End DoDot:1
if X>DSPEND
QUIT
+13 QUIT
+14 ;
LEGEND ;Legend
+1 WRITE !!," ** LEGEND **"
+2 WRITE !,$TRANSLATE($JUSTIFY("",80)," ","=")
+3 WRITE !!,"Initial - Name Legend"
+4 SET DSPBY=""
FOR
SET DSPBY=$ORDER(LEGEND(DSPBY))
if DSPBY=""
QUIT
WRITE !,LEGEND(DSPBY)_" - "_DSPBY
+5 WRITE !!,"BLANK SPACE - shows that no dispense information was received via the interface."
+6 WRITE !,"This can indicate the patient was a no-show for their appointment, no medication"
+7 WRITE !,"was prescribed/dispensed, or that the interface failed to send the data."
+8 WRITE !!,"** - Asterisks indicate that Dispense Amount may have changed within the week."
+9 WRITE !,$TRANSLATE($JUSTIFY("",80)," ","=")
+10 QUIT
+11 ;
HFSOPEN(HANDLE) ;open HFS
+1 NEW OTPDIR,OTPFILE
+2 SET OTPDIR=$$DEFDIR^%ZISH()
+3 SET OTPFILE="ORDOTP"_DUZ_".DAT"
+4 DO OPEN^%ZISH(HANDLE,OTPDIR,OTPFILE,"W")
if POP
QUIT
+5 SET IOM=132
SET IOSL=99999
SET IOST="P-DUMMY"
SET IOF=""""""
+6 QUIT
+7 ;
HFSCLOSE(HANDLE) ;close HFS
+1 NEW OTPDIR,OTPFILE,OTPDEL
+2 DO CLOSE^%ZISH(HANDLE)
+3 KILL ^TMP("OR OTP",$JOB,1)
+4 SET OTPDIR=$$DEFDIR^%ZISH()
+5 SET OTPFILE="ORDOTP"_DUZ_".DAT"
SET OTPDEL(OTPFILE)=""
+6 SET X=$$FTG^%ZISH(OTPDIR,OTPFILE,$NAME(^TMP("OR OTP",$JOB,1)),3)
+7 SET X=$$DEL^%ZISH(OTPDIR,$NAME(OTPDEL))
+8 QUIT
+9 ;
ASK ;VistA hook for OTP Dispense Report
+1 NEW PTIEN,VOTPBDT,VOTPEDT,ID,OTPVFLG
+2 SET (PTIEN,X)=""
SET DIC(0)="AEQMZ"
+3 SET DIC("A")="Select PATIENT: "
+4 SET DIC="^DPT("
DO ^DIC
KILL DIC
IF $EXTRACT(X)="^"
QUIT
+5 IF Y="-1"
GOTO ASK
+6 IF Y>0
SET PTIEN=+Y
+7 ;
ASKDT ;
+1 SET VOTPBDT=+$$READ("DA^::E","Enter START Date: ","T-7","Enter a start date for the report")
+2 if 'VOTPBDT
QUIT
+3 SET VOTPEDT=+$$READ("DA^::E"," Enter END Date: ","T","Enter an INCLUSIVE end date for the report")
+4 if 'VOTPEDT
QUIT
+5 IF $LENGTH(VOTPEDT,".")=1
SET VOTPEDT=VOTPEDT_".2359"
+6 IF VOTPBDT>VOTPEDT
WRITE !,"END DATE must be more recent than the START DATE"
SET (VOTPBDT,VOTPEDT)=""
GOTO ASKDT
+7 ;
+8 if $$SELDEV()
QUIT
+9 SET OTPVFLG=1
+10 SET ID="OR_OTP:ORRP OTP DISPENSE~;;24;10"
+11 DO EN(.ROOT,PTIEN,ID,VOTPBDT,VOTPEDT,"","","","")
+12 QUIT
+13 ;
READ(TYPE,PROMPT,DEFAULT,HELP,SCREEN) ; Calls reader, returns response
+1 NEW DIR,X,Y
+2 SET DIR(0)=TYPE
+3 IF $DATA(SCREEN)
SET DIR("S")=SCREEN
+4 IF $GET(PROMPT)]""
SET DIR("A")=PROMPT
+5 IF $GET(DEFAULT)]""
SET DIR("B")=DEFAULT
+6 IF $DATA(HELP)
SET DIR("?")=HELP
+7 DO ^DIR
+8 IF Y]""
IF ($LENGTH($GET(Y),U)'=2)
SET Y=Y_U_$GET(Y(0),Y)
+9 QUIT Y
+10 ;
SELDEV() ;*** Ask for device type for report to output to ***
+1 KILL IOP,%ZIS,POP,IO("Q")
+2 SET %ZIS("A")="Select output device: "
SET %ZIS("B")=""
SET %ZIS="Q"
+3 DO ^%ZIS
SET OTPSTOP=$SELECT(POP:1,1:0)
IF POP
WRITE !,"** No device selected or Report printed **"
DO EXIT
+4 QUIT $GET(OTPSTOP)
+5 ;
EXIT ;
+1 KILL %,%H,%I,%ZIS,ZTDESC,ZTDTH,ZTIO,ZTSAVE,ZTRTN
+2 if $EXTRACT(IOST,1,2)="C-"&($Y)
WRITE @IOF
+3 if $DATA(ZTQUEUED)
SET ZTREQ="@"
+4 SET IOP="HOME"
DO ^%ZISC
+5 KILL ZTQUEUED,ZTREQ
+6 QUIT
+7 ;