- DG714 ;ALB/GAH - Deceased Patient Means Test Cleanup ; 18-SEP-2006 15:41
- ;;5.3;Registration;**714**;14-AUG-2006;Build 5
- ;
- ; This program will loop through all veterans on the system that
- ; have means tests. For those people that are deceased, their last
- ; means test will be deleted if it has a status of REQUIRED.
- ;
- ; ^XTMP("DG714",0,0)=DELRECS^DFNLST^STATUS^STARTTM^ENDTIME^TOTRECS
- ; where DELRECS = Number of patients that had means tests deleted
- ; DFNLST = Last record number examined
- ; STATUS = RUNNING - Job is still processing
- ; COMPLETED - Job processed all records
- ; STOPPED - Job was stopped before completion
- ; STARTTM = Date/Time when job was started in FM format
- ; ENDTIME = Date/Time when job stopped or completed in FM format
- ; TOTRECS = Total number of record examined
- ;
- ; ^XTMP("DG714",1,"TASK")=ZTSK
- ; where ZTSK = Taskman task number
- ;
- ; ^XTMP("DG714",1,"STOP")=ZTSTOP
- ; where ZTSTOP = 1 to stop the job
- ;
- ; ^XTMP("DG714","TEST")=""
- ; This node is set to send mail to a test account during testing
- ; It will not be set in production
- ;
- ; Must be run from line tag
- Q
- ;
- START ;Start process
- N NAMSPC,TASK,U
- S U="^"
- S NAMSPC=$$NAMSPC
- S TASK=$P($G(^XTMP(NAMSPC,1,"TASK")),U,3)
- Q:TASK&$$ACTIVE(TASK) ; Quit if already running
- D QUEUE($$QTIME)
- Q
- QUEUE(ZTDTH) ; Queue the process
- N NAMSPC,ZTRTN,ZTDESC,ZTIO,ZTSK
- S NAMSPC=$$NAMSPC
- S ZTRTN="QUE^"_NAMSPC
- S ZTDESC=NAMSPC_" - Remove REQUIRED MT for deceased patients"
- S ZTIO=""
- D ^%ZTLOAD
- K ^XTMP(NAMSPC,1,"TASK")
- I '$D(ZTSK) S ^XTMP(NAMSPC,1,"TASK")="Unable to queue post-install process."
- I $D(ZTSK) S ^XTMP(NAMSPC,1,"TASK")=$G(ZTSK)
- D HOME^%ZIS
- Q
- QTIME() ; Get the run time for queuing
- N %,%H,%I,X
- D NOW^%DTC
- Q $P(%,".")_"."_$E($P(%,".",2),1,4)
- ;
- TEST(START,END,PROCESS) ;Entry point for testing
- ; There is a range given so no need for the old data in ^XTMP
- K ^XTMP($$NAMSPC,0)
- S START=+START
- ; START is the first record to be processed so prime it for $O
- I START'=0 S START=$O(^DGMT(408.31,"AID",1,START),-1)
- I END'="" S END=$O(^DGMT(408.31,"AID",1,END))
- S TESTING=1
- D QUE
- Q
- QUE ;
- N ZTSTOP,X,U,NAMSPC,COMPLETE
- S U="^"
- S NAMSPC=$$NAMSPC
- I '$D(TESTING) N TESTING S TESTING=0
- S X=$$SETUPX(90)
- S X=$G(^XTMP(NAMSPC,0,0))
- S $P(X,U,3)="RUNNING"
- S $P(X,U,4)=$$NOW^XLFDT
- S ^XTMP(NAMSPC,0,0)=X
- ;
- S ZTSTOP=$$CLEAN(TESTING)
- S X=$G(^XTMP(NAMSPC,0,0))
- S $P(X,U,3)=$S(ZTSTOP:"STOPPED",1:"COMPLETED")
- S $P(X,U,5)=$$NOW^XLFDT
- S ^XTMP(NAMSPC,0,0)=X
- D MAIL($P(X,U,4),$P(X,U,5),$P(X,U),$P(X,U,6),'ZTSTOP)
- K TESTING,^XTMP(NAMSPC,1)
- L -^XTMP(NAMSPC)
- Q
- SETUPX(EXPDAYS) ;
- ; requires EXPDAYS - number of days to keep XTMP around
- N BEGTIME,PURGDT,NAMSPC,U
- S U="^"
- S NAMSPC=$$NAMSPC
- S BEGTIME=$$NOW^XLFDT()
- S PURGDT=$$FMADD^XLFDT(BEGTIME,EXPDAYS)
- S ^XTMP(NAMSPC,0)=PURGDT_U_BEGTIME
- S $P(^XTMP(NAMSPC,0),U,3)="MEANS TEST DATE OF DEATH CLEANUP"
- Q 1
- STOP() ;returns stop flag
- N ZTSTOP,U,X,NAMSPC
- S U="^"
- S NAMSPC=$$NAMSPC
- S ZTSTOP=0
- ; Check to see if the job is set to stop either manually
- ; or through Taskman
- I $$S^%ZTLOAD!$G(^XTMP(NAMSPC,1,"STOP")) D
- . K ^XTMP(NAMSPC,1,"STOP")
- . S ZTSTOP=1
- Q ZTSTOP
- ACTIVE(ZTSK) ;check if job is running, stopped, or complete
- N NAMSPC,STAT,Y
- S NAMSPC=$$NAMSPC
- S ZTSK=+$G(^XTMP(NAMSPC,1,"TASK"))
- D STAT^%ZTLOAD
- S Y=ZTSK(1)
- I Y=0 S STAT=-1
- I ",1,2,4,"[(","_Y_",") S STAT=1
- I ",3,5,"[(","_Y_",") S STAT=0
- ; If the job is not active but the status is running, change status to
- ; STOPPED
- I $P($G(^XTMP(NAMSPC,0,0)),U,3)="RUNNING",STAT'>0 S $P(^XTMP(NAMSPC,0,0),U,3)="STOPPED"
- Q STAT
- ;
- NAMSPC() ;
- Q $T(+0)
- CLEAN(TESTING) ; Loop through veterans to compare data
- N CRF,DATA,DFN,DGMTI,NAMSPC,DELRECS,HIT,REC11,REC12,REC132,STARTTM,STATUS,TOTRECS,U,ZTSTOP
- S NAMSPC=$$NAMSPC
- S U="^"
- S (DELRECS,ZTSTOP)=0
- S STARTTM=$$NOW^XLFDT
- S DATA=^XTMP(NAMSPC,0,0)
- I 'TESTING S END="",DFN=0
- I TESTING S DFN=START ;If testing, get range
- N STOP
- S STOP=0
- K ^XTMP(NAMSPC,"TEST","AUDIT")
- ;
- ; Loop through the means test cross reference
- F TOTRECS=0:1 S DFN=$O(^DGMT(408.31,"AID",1,DFN)) D Q:ZTSTOP!STOP
- . I DFN=END!(DFN'?1.N.1(1"."1.N)) S STOP=1 Q
- . ; Keep track of the last DFN processes
- . S $P(^XTMP(NAMSPC,0,0),U,2)=DFN
- . ; Check that there is a date of death and that the last means test
- . ; has a status of REQUIRED
- . S $P(^XTMP(NAMSPC,0,0),U,2)=DFN
- . S HIT=0
- . F Q:'$$OK2DEL^DGMTDELS(DFN,.DGMTI) D
- . . S HIT=1
- . . ; Save the audit info if testing
- . . I TESTING S ^XTMP(NAMSPC,"TEST","AUDIT",DFN)=DGMTI
- . . ; Delete the means test
- . . D:'TESTING!(TESTING&$G(PROCESS)) DELMT^DGMTDELS(DGMTI)
- . ; Check to see if the job has been signalled to stop
- . I TOTRECS,TOTRECS#1000=0 S ZTSTOP=$$STOP
- . S:HIT DELRECS=DELRECS+1 ;increment new record counter if means test deleted
- ;
- I TESTING S ^XTMP(NAMSPC,"TEST","TOT")="PROCESSED:"_TOTRECS_" DELETED:"_DELRECS
- ; Do some recordkeeping
- S DATA=^XTMP(NAMSPC,0,0)
- S $P(DATA,U,1)=DELRECS
- S $P(DATA,U,4)=STARTTM
- S $P(DATA,U,6)=TOTRECS
- S ^XTMP(NAMSPC,0,0)=DATA
- Q ZTSTOP
- MAIL(STARTTM,ENDTIME,DELRECS,TOTRECS,COMPLETE) ; Send mail message
- N XMDUZ,XMY,XMSUB,XMTEXT
- S NAMSPC=$$NAMSPC
- S U="^"
- ; Set FROM duz
- S XMDUZ=.5
- ; Send completion message to developer
- S XMY(DUZ)=""
- S XMSUB="DG MEANS TEST DATE OF DEATH CLEANUP"
- I COMPLETE D
- . S ^TMP(NAMSPC,$J,"MSG",0)=6
- . S ^TMP(NAMSPC,$J,"MSG",1)=" Means Test Date of Death Cleanup"
- . S ^TMP(NAMSPC,$J,"MSG",2)=""
- . S ^TMP(NAMSPC,$J,"MSG",3)=" Started at: "_$TR($$FMTE^XLFDT(STARTTM,2),"@"," ")
- . S ^TMP(NAMSPC,$J,"MSG",4)=" Completed at: "_$TR($$FMTE^XLFDT(ENDTIME,2),"@"," ")
- . S ^TMP(NAMSPC,$J,"MSG",5)="Records Examined: "_TOTRECS
- . S ^TMP(NAMSPC,$J,"MSG",6)=" Records Deleted: "_DELRECS
- . S XMTEXT="^TMP(NAMSPC,$J,""MSG"","
- I 'COMPLETE D
- . S ^TMP(NAMSPC,$J,"MSG",0)=8
- . S ^TMP(NAMSPC,$J,"MSG",1)=" Means Test Date of Death Cleanup"
- . S ^TMP(NAMSPC,$J,"MSG",2)=" ***Processing not complete***"
- . S ^TMP(NAMSPC,$J,"MSG",3)=""
- . S ^TMP(NAMSPC,$J,"MSG",4)=" Started at: "_$TR($$FMTE^XLFDT(STARTTM,2),"@"," ")
- . S ^TMP(NAMSPC,$J,"MSG",5)=" Stopped at: "_$TR($$FMTE^XLFDT(ENDTIME,2),"@"," ")
- . S ^TMP(NAMSPC,$J,"MSG",6)=" Records Examined: "_TOTRECS
- . S ^TMP(NAMSPC,$J,"MSG",7)=" Records Deleted: "_DELRECS
- . S ^TMP(NAMSPC,$J,"MSG",8)="Last Record Processed: "_$P($G(^XTMP(NAMSPC,0,0)),U,2)
- . S XMTEXT="^TMP(NAMSPC,$J,""MSG"","
- D ^XMD
- K ^TMP(NAMSPC)
- Q
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HDG714 6746 printed Feb 19, 2025@00:06:43 Page 2
- DG714 ;ALB/GAH - Deceased Patient Means Test Cleanup ; 18-SEP-2006 15:41
- +1 ;;5.3;Registration;**714**;14-AUG-2006;Build 5
- +2 ;
- +3 ; This program will loop through all veterans on the system that
- +4 ; have means tests. For those people that are deceased, their last
- +5 ; means test will be deleted if it has a status of REQUIRED.
- +6 ;
- +7 ; ^XTMP("DG714",0,0)=DELRECS^DFNLST^STATUS^STARTTM^ENDTIME^TOTRECS
- +8 ; where DELRECS = Number of patients that had means tests deleted
- +9 ; DFNLST = Last record number examined
- +10 ; STATUS = RUNNING - Job is still processing
- +11 ; COMPLETED - Job processed all records
- +12 ; STOPPED - Job was stopped before completion
- +13 ; STARTTM = Date/Time when job was started in FM format
- +14 ; ENDTIME = Date/Time when job stopped or completed in FM format
- +15 ; TOTRECS = Total number of record examined
- +16 ;
- +17 ; ^XTMP("DG714",1,"TASK")=ZTSK
- +18 ; where ZTSK = Taskman task number
- +19 ;
- +20 ; ^XTMP("DG714",1,"STOP")=ZTSTOP
- +21 ; where ZTSTOP = 1 to stop the job
- +22 ;
- +23 ; ^XTMP("DG714","TEST")=""
- +24 ; This node is set to send mail to a test account during testing
- +25 ; It will not be set in production
- +26 ;
- +27 ; Must be run from line tag
- +28 QUIT
- +29 ;
- START ;Start process
- +1 NEW NAMSPC,TASK,U
- +2 SET U="^"
- +3 SET NAMSPC=$$NAMSPC
- +4 SET TASK=$PIECE($GET(^XTMP(NAMSPC,1,"TASK")),U,3)
- +5 ; Quit if already running
- if TASK&$$ACTIVE(TASK)
- QUIT
- +6 DO QUEUE($$QTIME)
- +7 QUIT
- QUEUE(ZTDTH) ; Queue the process
- +1 NEW NAMSPC,ZTRTN,ZTDESC,ZTIO,ZTSK
- +2 SET NAMSPC=$$NAMSPC
- +3 SET ZTRTN="QUE^"_NAMSPC
- +4 SET ZTDESC=NAMSPC_" - Remove REQUIRED MT for deceased patients"
- +5 SET ZTIO=""
- +6 DO ^%ZTLOAD
- +7 KILL ^XTMP(NAMSPC,1,"TASK")
- +8 IF '$DATA(ZTSK)
- SET ^XTMP(NAMSPC,1,"TASK")="Unable to queue post-install process."
- +9 IF $DATA(ZTSK)
- SET ^XTMP(NAMSPC,1,"TASK")=$GET(ZTSK)
- +10 DO HOME^%ZIS
- +11 QUIT
- QTIME() ; Get the run time for queuing
- +1 NEW %,%H,%I,X
- +2 DO NOW^%DTC
- +3 QUIT $PIECE(%,".")_"."_$EXTRACT($PIECE(%,".",2),1,4)
- +4 ;
- TEST(START,END,PROCESS) ;Entry point for testing
- +1 ; There is a range given so no need for the old data in ^XTMP
- +2 KILL ^XTMP($$NAMSPC,0)
- +3 SET START=+START
- +4 ; START is the first record to be processed so prime it for $O
- +5 IF START'=0
- SET START=$ORDER(^DGMT(408.31,"AID",1,START),-1)
- +6 IF END'=""
- SET END=$ORDER(^DGMT(408.31,"AID",1,END))
- +7 SET TESTING=1
- +8 DO QUE
- +9 QUIT
- QUE ;
- +1 NEW ZTSTOP,X,U,NAMSPC,COMPLETE
- +2 SET U="^"
- +3 SET NAMSPC=$$NAMSPC
- +4 IF '$DATA(TESTING)
- NEW TESTING
- SET TESTING=0
- +5 SET X=$$SETUPX(90)
- +6 SET X=$GET(^XTMP(NAMSPC,0,0))
- +7 SET $PIECE(X,U,3)="RUNNING"
- +8 SET $PIECE(X,U,4)=$$NOW^XLFDT
- +9 SET ^XTMP(NAMSPC,0,0)=X
- +10 ;
- +11 SET ZTSTOP=$$CLEAN(TESTING)
- +12 SET X=$GET(^XTMP(NAMSPC,0,0))
- +13 SET $PIECE(X,U,3)=$SELECT(ZTSTOP:"STOPPED",1:"COMPLETED")
- +14 SET $PIECE(X,U,5)=$$NOW^XLFDT
- +15 SET ^XTMP(NAMSPC,0,0)=X
- +16 DO MAIL($PIECE(X,U,4),$PIECE(X,U,5),$PIECE(X,U),$PIECE(X,U,6),'ZTSTOP)
- +17 KILL TESTING,^XTMP(NAMSPC,1)
- +18 LOCK -^XTMP(NAMSPC)
- +19 QUIT
- SETUPX(EXPDAYS) ;
- +1 ; requires EXPDAYS - number of days to keep XTMP around
- +2 NEW BEGTIME,PURGDT,NAMSPC,U
- +3 SET U="^"
- +4 SET NAMSPC=$$NAMSPC
- +5 SET BEGTIME=$$NOW^XLFDT()
- +6 SET PURGDT=$$FMADD^XLFDT(BEGTIME,EXPDAYS)
- +7 SET ^XTMP(NAMSPC,0)=PURGDT_U_BEGTIME
- +8 SET $PIECE(^XTMP(NAMSPC,0),U,3)="MEANS TEST DATE OF DEATH CLEANUP"
- +9 QUIT 1
- STOP() ;returns stop flag
- +1 NEW ZTSTOP,U,X,NAMSPC
- +2 SET U="^"
- +3 SET NAMSPC=$$NAMSPC
- +4 SET ZTSTOP=0
- +5 ; Check to see if the job is set to stop either manually
- +6 ; or through Taskman
- +7 IF $$S^%ZTLOAD!$G(^XTMP(NAMSPC,1,"STOP"))
- Begin DoDot:1
- +8 KILL ^XTMP(NAMSPC,1,"STOP")
- +9 SET ZTSTOP=1
- End DoDot:1
- +10 QUIT ZTSTOP
- ACTIVE(ZTSK) ;check if job is running, stopped, or complete
- +1 NEW NAMSPC,STAT,Y
- +2 SET NAMSPC=$$NAMSPC
- +3 SET ZTSK=+$GET(^XTMP(NAMSPC,1,"TASK"))
- +4 DO STAT^%ZTLOAD
- +5 SET Y=ZTSK(1)
- +6 IF Y=0
- SET STAT=-1
- +7 IF ",1,2,4,"[(","_Y_",")
- SET STAT=1
- +8 IF ",3,5,"[(","_Y_",")
- SET STAT=0
- +9 ; If the job is not active but the status is running, change status to
- +10 ; STOPPED
- +11 IF $PIECE($GET(^XTMP(NAMSPC,0,0)),U,3)="RUNNING"
- IF STAT'>0
- SET $PIECE(^XTMP(NAMSPC,0,0),U,3)="STOPPED"
- +12 QUIT STAT
- +13 ;
- NAMSPC() ;
- +1 QUIT $TEXT(+0)
- CLEAN(TESTING) ; Loop through veterans to compare data
- +1 NEW CRF,DATA,DFN,DGMTI,NAMSPC,DELRECS,HIT,REC11,REC12,REC132,STARTTM,STATUS,TOTRECS,U,ZTSTOP
- +2 SET NAMSPC=$$NAMSPC
- +3 SET U="^"
- +4 SET (DELRECS,ZTSTOP)=0
- +5 SET STARTTM=$$NOW^XLFDT
- +6 SET DATA=^XTMP(NAMSPC,0,0)
- +7 IF 'TESTING
- SET END=""
- SET DFN=0
- +8 ;If testing, get range
- IF TESTING
- SET DFN=START
- +9 NEW STOP
- +10 SET STOP=0
- +11 KILL ^XTMP(NAMSPC,"TEST","AUDIT")
- +12 ;
- +13 ; Loop through the means test cross reference
- +14 FOR TOTRECS=0:1
- SET DFN=$ORDER(^DGMT(408.31,"AID",1,DFN))
- Begin DoDot:1
- +15 IF DFN=END!(DFN'?1.N.1(1"."1.N))
- SET STOP=1
- QUIT
- +16 ; Keep track of the last DFN processes
- +17 SET $PIECE(^XTMP(NAMSPC,0,0),U,2)=DFN
- +18 ; Check that there is a date of death and that the last means test
- +19 ; has a status of REQUIRED
- +20 SET $PIECE(^XTMP(NAMSPC,0,0),U,2)=DFN
- +21 SET HIT=0
- +22 FOR
- if '$$OK2DEL^DGMTDELS(DFN,.DGMTI)
- QUIT
- Begin DoDot:2
- +23 SET HIT=1
- +24 ; Save the audit info if testing
- +25 IF TESTING
- SET ^XTMP(NAMSPC,"TEST","AUDIT",DFN)=DGMTI
- +26 ; Delete the means test
- +27 if 'TESTING!(TESTING&$GET(PROCESS))
- DO DELMT^DGMTDELS(DGMTI)
- End DoDot:2
- +28 ; Check to see if the job has been signalled to stop
- +29 IF TOTRECS
- IF TOTRECS#1000=0
- SET ZTSTOP=$$STOP
- +30 ;increment new record counter if means test deleted
- if HIT
- SET DELRECS=DELRECS+1
- End DoDot:1
- if ZTSTOP!STOP
- QUIT
- +31 ;
- +32 IF TESTING
- SET ^XTMP(NAMSPC,"TEST","TOT")="PROCESSED:"_TOTRECS_" DELETED:"_DELRECS
- +33 ; Do some recordkeeping
- +34 SET DATA=^XTMP(NAMSPC,0,0)
- +35 SET $PIECE(DATA,U,1)=DELRECS
- +36 SET $PIECE(DATA,U,4)=STARTTM
- +37 SET $PIECE(DATA,U,6)=TOTRECS
- +38 SET ^XTMP(NAMSPC,0,0)=DATA
- +39 QUIT ZTSTOP
- MAIL(STARTTM,ENDTIME,DELRECS,TOTRECS,COMPLETE) ; Send mail message
- +1 NEW XMDUZ,XMY,XMSUB,XMTEXT
- +2 SET NAMSPC=$$NAMSPC
- +3 SET U="^"
- +4 ; Set FROM duz
- +5 SET XMDUZ=.5
- +6 ; Send completion message to developer
- +7 SET XMY(DUZ)=""
- +8 SET XMSUB="DG MEANS TEST DATE OF DEATH CLEANUP"
- +9 IF COMPLETE
- Begin DoDot:1
- +10 SET ^TMP(NAMSPC,$JOB,"MSG",0)=6
- +11 SET ^TMP(NAMSPC,$JOB,"MSG",1)=" Means Test Date of Death Cleanup"
- +12 SET ^TMP(NAMSPC,$JOB,"MSG",2)=""
- +13 SET ^TMP(NAMSPC,$JOB,"MSG",3)=" Started at: "_$TRANSLATE($$FMTE^XLFDT(STARTTM,2),"@"," ")
- +14 SET ^TMP(NAMSPC,$JOB,"MSG",4)=" Completed at: "_$TRANSLATE($$FMTE^XLFDT(ENDTIME,2),"@"," ")
- +15 SET ^TMP(NAMSPC,$JOB,"MSG",5)="Records Examined: "_TOTRECS
- +16 SET ^TMP(NAMSPC,$JOB,"MSG",6)=" Records Deleted: "_DELRECS
- +17 SET XMTEXT="^TMP(NAMSPC,$J,""MSG"","
- End DoDot:1
- +18 IF 'COMPLETE
- Begin DoDot:1
- +19 SET ^TMP(NAMSPC,$JOB,"MSG",0)=8
- +20 SET ^TMP(NAMSPC,$JOB,"MSG",1)=" Means Test Date of Death Cleanup"
- +21 SET ^TMP(NAMSPC,$JOB,"MSG",2)=" ***Processing not complete***"
- +22 SET ^TMP(NAMSPC,$JOB,"MSG",3)=""
- +23 SET ^TMP(NAMSPC,$JOB,"MSG",4)=" Started at: "_$TRANSLATE($$FMTE^XLFDT(STARTTM,2),"@"," ")
- +24 SET ^TMP(NAMSPC,$JOB,"MSG",5)=" Stopped at: "_$TRANSLATE($$FMTE^XLFDT(ENDTIME,2),"@"," ")
- +25 SET ^TMP(NAMSPC,$JOB,"MSG",6)=" Records Examined: "_TOTRECS
- +26 SET ^TMP(NAMSPC,$JOB,"MSG",7)=" Records Deleted: "_DELRECS
- +27 SET ^TMP(NAMSPC,$JOB,"MSG",8)="Last Record Processed: "_$PIECE($GET(^XTMP(NAMSPC,0,0)),U,2)
- +28 SET XMTEXT="^TMP(NAMSPC,$J,""MSG"","
- End DoDot:1
- +29 DO ^XMD
- +30 KILL ^TMP(NAMSPC)
- +31 QUIT