Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: RGMTAUDP

RGMTAUDP.m

Go to the documentation of this file.
  1. RGMTAUDP ;BIR/CML,PTD-MPI/PD AUDIT File Print of Patient Data ; 4/7/14 6:47pm
  1. ;;1.0;CLINICAL INFO RESOURCE NETWORK;**19,30,46,60,61**;30 Apr 99;Build 2
  1. ;Reference to ^DD(2 supported by IA #2695.
  1. ;Reference to ^DIA(2 and data derived from the AUDIT file (#1.1)
  1. ;supported by IA #2097 and #2602.
  1. ;Reference to ^ORD(101 supported by IA #2596
  1. ;**60 MVI_1901 (cml) made extensive changes to accommodate the audit data for multiple subfields within the PATIENT file.
  1. ;
  1. BEGIN ;
  1. S QFLG=1
  1. W @IOF
  1. W !,"This option prints a customized report of information stored in the AUDIT"
  1. W !,"file (#1.1) for fields being audited in the PATIENT file (#2). For a"
  1. W !,"specified date range, you can view all audited fields or selected fields."
  1. W !,"You can also opt to print only edits that were done by a specific user."
  1. W !!,"- If selected fields are viewed, you can choose to see data for all or"
  1. W !," selected patients."
  1. W !,"- If ALL audited fields are viewed, you must choose patients to examine."
  1. ;
  1. ASKFLD ;Ask for Data Fields
  1. I '$O(^DD(2,"AUDIT",0)) W !!,"No fields are currently being audited in the PATIENT file (#2)." G QUIT
  1. W !
  1. K DIR S DIR(0)="SAM^A:ALL;S:SELECTED;"
  1. S DIR("A")="Do you want to see (A)LL or (S)ELECTED audited fields? "
  1. S DIR("B")="A"
  1. S DIR("?",1)="Enter:"
  1. S DIR("?",2)=" ""A"" to see ALL audited fields in the PATIENT file (#2)."
  1. S DIR("?")=" ""S"" to select specific audited fields."
  1. D ^DIR G:$D(DIRUT) QUIT S ANS1=Y
  1. ;
  1. FLDLOOP ;
  1. W ! K FLD
  1. ;stuff all fields
  1. I ANS1="A" D G ASKPAT
  1. .S FLD=0 F S FLD=$O(^DD(2,"AUDIT",FLD)) Q:'FLD S FLD(2,FLD)="" ;**60 MVI_1901 (cml)
  1. .S FILE=2 F S FILE=$O(^DD(FILE)) Q:FILE>2.999 S FLD=0 F S FLD=$O(^DD(FILE,"AUDIT",FLD)) Q:'FLD S FLD(FILE,FLD)="" ;**60 MVI_1901 (cml)
  1. ;
  1. ;ask for specific fields
  1. S RGERR=0 D FLDLIST
  1. ; **60 MVI_1901 (cml)changes start here
  1. K DIR W !
  1. S DIR(0)="NAO^1:"_MAX_":0^K:'$D(FLDCNT(X)) X S RGERR=1" S DIR("A")="Select list number 1-"_MAX_": "
  1. S DIR("?")="^D FLDLIST^RGMTAUDP"
  1. F QQ=0:0 S RGERR=0 D ^DIR Q:$D(DIRUT) S SEL(+Y)=""
  1. S CNT=0 F S CNT=$O(SEL(CNT)) Q:'CNT S FILE=$O(FLDCNT(CNT,0)),FLDLP=$O(FLDCNT(CNT,FILE,0)),FLD(FILE,FLDLP)=""
  1. ; **60 MVI_1901 (cml) changes stop here
  1. ;
  1. ASKPAT ;Ask for Patient
  1. I '$O(FLD(0))!($D(DUOUT)) S QFLG=1 G QUIT
  1. I ANS1="A" S ANS2="S" G PATLOOP
  1. K DIR S DIR(0)="SAM^A:ALL;S:SELECTED;"
  1. S DIR("A")="Do you want to see audited data for (A)LL or (S)ELECTED patients? "
  1. S DIR("B")="S"
  1. S DIR("?",1)="Enter:"
  1. S DIR("?",2)=" ""A"" to see audited fields for ALL patients."
  1. S DIR("?")=" ""S"" to select specific patients(s)."
  1. W ! D ^DIR G:$D(DIRUT) QUIT S ANS2=Y
  1. PATLOOP ;
  1. W ! K PAT
  1. I ANS2="A" S PAT("ALL")="" G ASKDT
  1. ;ask for specific patient(s)
  1. F QQ=0:0 S DIC="^DPT(",DIC(0)="QEAM",DIC("A")="Select PATIENT: " D ^DIC K DIC Q:Y<0 S RGDFN=+Y D
  1. .I '$O(^DIA(2,"B",RGDFN,0)) W $C(7),!?5,"This patient has no audit data available for any date." Q
  1. .S PAT(RGDFN)=""
  1. ;
  1. ASKDT ;Ask for Date Range
  1. I '$D(PAT)!($D(DUOUT)) S QFLG=1 G QUIT
  1. W !!,"Enter date range for data to be included in report."
  1. K DIR,DIRUT,DTOUT,DUOUT S DIR(0)="DAO^:DT:EPX",DIR("A")="Beginning Date: " D ^DIR K DIR G:$D(DIRUT) QUIT
  1. S RGBDT=Y,DIR(0)="DAO^"_RGBDT_":DT:EPX",DIR("A")="Ending Date: " D ^DIR K DIR G:$D(DIRUT) QUIT S RGEDT=Y
  1. ;
  1. ASKUSER ;Ask if data is wanted only a specific user
  1. K USERSCRN
  1. W ! S DIR(0)="Y",DIR("B")="No",DIR("A")="Do you want to find only the edits made by a specific user"
  1. D ^DIR K DIR I +Y'=1 G DEV
  1. ;
  1. S DIC="^VA(200,",DIC(0)="QEAM",DIC("A")="Select USER: "
  1. D ^DIC K DIC G:+Y<0 QUIT S USERSCRN=+Y
  1. ;
  1. DEV W !!,"The right margin for this report is 80.",!!
  1. I ANS2="A" S IOP="Q" W "Because you selected ALL patients, you MUST queue this report.",!!
  1. S ZTSAVE("RGBDT")="",ZTSAVE("RGEDT")="",ZTSAVE("ANS2")="",ZTSAVE("FLD(")="",ZTSAVE("PAT(")="",%ZIS("B")=""
  1. S ZTSAVE("USERSCRN")=""
  1. D EN^XUTMDEVQ("START^RGMTAUDP","MPI/PD - Print AUDIT File Data from the PATIENT file",.ZTSAVE,.%ZIS) I 'POP Q
  1. W !,"NO DEVICE SELECTED OR REPORT PRINTED!!"
  1. S QFLG=1 G QUIT
  1. ;
  1. START ;
  1. K ^TMP("RGMTAUDP",$J),^TMP("RGMTAUDP2",$J) S U="^"
  1. S STOP=RGEDT+1
  1. I ANS2="A" D
  1. .S CNT=0
  1. .S RGDFN=0 F S RGDFN=$O(^DIA(2,"B",RGDFN)) Q:'RGDFN S CNT=CNT+1 S:'(CNT#10000) ^TMP("RGMTAUDP",$J,"@@@@","CUR DFN")=RGDFN D LOOP
  1. I ANS2="S" D
  1. .S RGDFN=0 F S RGDFN=$O(PAT(RGDFN)) Q:'RGDFN D LOOP
  1. G PRT
  1. ;
  1. LOOP ;Loop on "B" xref of the AUDIT file
  1. Q:'$D(^DPT(RGDFN,0))
  1. ;I ANS2="S" D
  1. ;. S PATNM=$P(^DPT(RGDFN,0),U)_U_RGDFN
  1. ;**61 - MVI_3413 (ckn)
  1. ;Remedy ticket 946297 - Undefined error issue
  1. S PATNM=$P(^DPT(RGDFN,0),U)_U_RGDFN
  1. I $P(PATNM,U)="" Q
  1. S IEN=0 F S IEN=$O(^DIA(2,"B",RGDFN,IEN)) Q:'IEN D
  1. .I $D(^DIA(2,IEN,0)) S IEN0=(^(0)),EDITDT=$P(IEN0,U,2) I EDITDT>RGBDT,EDITDT<STOP D
  1. ..S FLD=$P(IEN0,U,3) I $D(FLD(2,FLD)) D
  1. ...S USER=$P(IEN0,U,4)
  1. ...I $D(USERSCRN) I USER'=USERSCRN Q
  1. ...S ^TMP("RGMTAUDP",$J,PATNM,EDITDT,IEN)=""
  1. ;
  1. ;add new FOR loop to find any audit data for audited fields that are multiples - **60 MVI_1901 (cml)
  1. S DFNMULT=RGDFN_",0" F S DFNMULT=$O(^DIA(2,"B",DFNMULT)) Q:DFNMULT="" Q:$P(DFNMULT,",")'=RGDFN I $D(^DIA(2,"B",DFNMULT)) S IEN=0 F S IEN=$O(^DIA(2,"B",DFNMULT,IEN)) Q:'IEN D
  1. .I $D(^DIA(2,IEN,0)) S IEN0=(^(0)),EDITDT=$P(^(0),U,2) I EDITDT>RGBDT,EDITDT<STOP D
  1. ..S FLD=$P(IEN0,U,3),PC1=$P(FLD,","),PC2=$P(FLD,",",2),FILE=+$P($G(^DD(2,PC1,0)),"^",2) I FILE,$D(FLD(FILE,PC2)) D
  1. ...S USER=$P(IEN0,U,4)
  1. ...I $D(USERSCRN) I USER'=USERSCRN Q
  1. ...S PATNM=$P(^DPT(RGDFN,0),U)_U_RGDFN,^TMP("RGMTAUDP",$J,PATNM,EDITDT,IEN)=""
  1. ;
  1. I ANS2="S" D
  1. . I '$D(^TMP("RGMTAUDP",$J,PATNM)) S ^TMP("RGMTAUDP2",$J,"NO AUDIT",PATNM)=" has no audit data available for selected parameters."
  1. Q
  1. ;
  1. PRT ;Print report
  1. S (PG,QFLG)=0,U="^",$P(LN,"-",81)="",SITE=$P($$SITE^VASITE(),U,2)
  1. S PRGBDT=$$FMTE^XLFDT(RGBDT),PRGEDT=$$FMTE^XLFDT(RGEDT)
  1. D NOW^%DTC S HDT=$$FMTE^XLFDT($E(%,1,12))
  1. D HDR
  1. I '$D(^TMP("RGMTAUDP",$J)) W !!,"No audit data found in this date range for specified parameters." G QUIT
  1. S PATNM="@@@@" F S PATNM=$O(^TMP("RGMTAUDP",$J,PATNM)) Q:PATNM="" Q:QFLG D
  1. .D:$Y+4>IOSL HDR Q:QFLG
  1. .W !!,"==> ",$P(PATNM,U)," (DFN #",$P(PATNM,U,2),")"
  1. .S EDITDT=0 F S EDITDT=$O(^TMP("RGMTAUDP",$J,PATNM,EDITDT)) Q:QFLG Q:'EDITDT D
  1. ..S IEN=0 F S IEN=$O(^TMP("RGMTAUDP",$J,PATNM,EDITDT,IEN)) Q:QFLG Q:'IEN D
  1. ...S PRTDT=$$FMTE^XLFDT($E(EDITDT,1,12))
  1. ...S IEN0=^DIA(2,IEN,0)
  1. ... ;**60 MVI_1901 (cml) modified to pick up audit data for multiple subfields and check for bad DD references
  1. ...S FILE=2,FIELD=$P(IEN0,"^",3) I FIELD["," S FILE=+$P($G(^DD(2,$P(FIELD,","),0)),"^",2) Q:FILE="" S FIELD=$P(FIELD,",",2)
  1. ...K RGARR D FIELD^DID(FILE,FIELD,"","LABEL","RGARR")
  1. ...S FLD=$G(RGARR("LABEL")) Q:FLD=""
  1. ... ; **60 MVI_1901 (cml) changes stop here
  1. ...S USER=$P(IEN0,U,4)
  1. ...I 'USER S USER="UNKNOWN"
  1. ...I USER'="UNKNOWN" S DIC="^VA(200,",DIC(0)="MZO",X="`"_USER D ^DIC S USER=$P(Y,"^",2)
  1. ...S OLD=$G(^DIA(2,IEN,2)) I OLD']"" S OLD="<no previous value>"
  1. ...S NEW=$G(^DIA(2,IEN,3)) I NEW']"" S NEW="<no current value>"
  1. ...K OPTDA1,OPTDA2,OPTION,OPTNM I $G(^DIA(2,IEN,4.1)) D
  1. ....S OPTDA1=+$P(^DIA(2,IEN,4.1),"^")
  1. ....I OPTDA1 S DIC=19,DR=".01",DA=OPTDA1,DIQ(0)="EI",DIQ="OPTION" D EN^DIQ1 K DIC,DR,DA,DIQ S OPTION=$G(OPTION(19,OPTDA1,.01,"E"))
  1. ....S OPTDA2=$P(^DIA(2,IEN,4.1),"^",2)
  1. ....I $P(OPTDA2,";",2)="ORD(101," S DIC=101,DR=".01",DA=+OPTDA2,DIQ(0)="EI",DIQ="OPTION" D EN^DIQ1 K DIC,DR,DA,DIQ S OPTNM=$G(OPTION(101,+OPTDA2,.01,"E")) Q
  1. ....I +OPTDA2 S DIC=19,DR=".01",DA=+OPTDA2,DIQ(0)="EI",DIQ="OPTION" D EN^DIQ1 K DIC,DR,DA,DIQ S OPTNM=$G(OPTION(19,+OPTDA2,.01,"E")) Q
  1. ...D:$Y+5>IOSL HDR Q:QFLG W !!,PRTDT,?20,FLD,?51,USER,!?20,OLD," / ",NEW
  1. ...I $G(OPTION)'="" W !?3,OPTION I $G(OPTNM)'="" W "/",OPTNM
  1. I $D(^TMP("RGMTAUDP2",$J,"NO AUDIT")) D
  1. . S PATNM="@@@@",RGNAUD="" F S PATNM=$O(^TMP("RGMTAUDP2",$J,"NO AUDIT",PATNM)) Q:PATNM="" D
  1. .. Q:QFLG
  1. .. S RGNAUD=$P(^TMP("RGMTAUDP2",$J,"NO AUDIT",PATNM),U)
  1. .. W !!,"==> ",$P(PATNM,U)," (DFN #",$P(PATNM,U,2),")"_RGNAUD
  1. ;
  1. QUIT ;
  1. I $E(IOST,1,2)="C-"&('QFLG) S DIR(0)="E" D D ^DIR K DIR
  1. .S SS=22-$Y F JJ=1:1:SS W !
  1. K ^TMP("RGMTAUDP",$J),^TMP("RGMTAUDP2",$J)
  1. K %,%I,ANS1,ANS2,CNT,RGDFN,DIR,DIRUT,DTOUT,DUOUT,EDITDT,FLD,FLDLP,FLDNM,HDR,DFNMULT,FIELD,FILE,SUB,MAX,PC1,PC2,SEL ;**60 MVI_1901 (cml)
  1. K HDT,IEN,IEN0,JJ,LN,NEW,OLD,OPTDA1,OPTDA2,OPTION,OPTNM,PAT,PATNM,PG,PRGBDT,PRGEDT,PRTDT,QFLG,QQ,RGARR,RGBDT,RGNAUD
  1. K RGEDT,RGERR,SITE,SS,STOP,USER,X,Y,ZTSK
  1. D ^%ZISC S:$D(ZTQUEUED) ZTREQ="@" Q
  1. ;
  1. HDR ;HEADER
  1. I $E(IOST,1,2)="C-" S SS=22-$Y F JJ=1:1:SS W !
  1. I $E(IOST,1,2)="C-",PG>0 S DIR(0)="E" W ! D ^DIR K DIR I 'Y S QFLG=1 Q
  1. S PG=PG+1 W:$Y!($E(IOST,1,2)="C-") @IOF
  1. W !,"PATIENT AUDIT LIST at ",SITE," on ",HDT,?72,"Page: ",PG
  1. W !,"Date Range: ",PRGBDT," to ",PRGEDT
  1. W !!,"Date/Time Edited",?20,"Field Edited",?51,"Edited By",!?20,"Old Value / New Value"
  1. W !?3,"Option/Protocol",!,LN
  1. Q
  1. ;
  1. FLDLIST ;Help for Field # List
  1. K RG N DIR S QFLG=0 I RGERR W $C(7)," ??"
  1. S HDR="Select a LIST NUMBER from the audited field(s) in the PATIENT file:"
  1. W @IOF,HDR,!
  1. ;
  1. ; **60 MVI_1901 (cml)changes start here
  1. K FLD,FLDCNT
  1. S FLD=0 F S FLD=$O(^DD(2,"AUDIT",FLD)) Q:'FLD S FLD(2,FLD)=""
  1. S FILE=2 F S FILE=$O(^DD(FILE)) Q:FILE>2.999 Q:'FILE S FLD=0 F S FLD=$O(^DD(FILE,"AUDIT",FLD)) Q:'FLD S FLD(FILE,FLD)=""
  1. I '$D(FLD) W !!,"No fields are currently being audited in the Patient file." Q
  1. ; set up counter array
  1. S (CNT,FILE)=0 F S FILE=$O(FLD(FILE)) Q:'FILE S FLDLP=0 F S FLDLP=$O(FLD(FILE,FLDLP)) Q:'FLDLP S CNT=CNT+1,FLDCNT(CNT,FILE,FLDLP)=""
  1. K FLD S MAX=CNT
  1. ;
  1. S CNT=0 F S CNT=$O(FLDCNT(CNT)) Q:'CNT S FILE=0 F S FILE=$O(FLDCNT(CNT,FILE)) Q:'FILE S FLDLP=0 F S FLDLP=$O(FLDCNT(CNT,FILE,FLDLP)) Q:'FLDLP Q:QFLG D
  1. . ; **60 MVI_1901 (cml) changes stop here
  1. .I $Y+6>IOSL D Q:QFLG
  1. ..S DIR(0)="E" W ! D ^DIR K DIR I 'Y S QFLG=1 Q
  1. ..E W @IOF,HDR,!
  1. .K RGARR D FIELD^DID(FILE,FLDLP,"","LABEL","RGARR")
  1. .S FLDNM=$G(RGARR("LABEL")) Q:FLDNM=""
  1. .W !,CNT,". ",FILE,",",FLDLP,?17,FLDNM ;**60 MVI_1901 (cml)
  1. Q