| 1 | IBCNEKIT ;DAOU/ESG - PURGE IIV DATA FILES ;11-JUL-2002 | 
|---|
| 2 | ;;2.0;INTEGRATED BILLING;**184,271,316**;21-MAR-94 | 
|---|
| 3 | ;;Per VHA Directive 10-93-142, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | ; This routine handles the purging of the IIV data stored in the | 
|---|
| 6 | ; IIV Transmission Queue file (#365.1) and in the IIV Response file (#365). | 
|---|
| 7 | ; User can pick a date range for the purge.  Data created within 6 months | 
|---|
| 8 | ; cannot be purged.  The actual global kills are done by a background | 
|---|
| 9 | ; task after hours (8:00pm). | 
|---|
| 10 | ; | 
|---|
| 11 | EN ; | 
|---|
| 12 | NEW STOP,BEGDT,ENDDT,STATLIST | 
|---|
| 13 | D INIT I STOP G EXIT       ; initialize/calculate default dates | 
|---|
| 14 | D BEGDT I STOP G EXIT      ; user interface for beginning date | 
|---|
| 15 | D ENDDT I STOP G EXIT      ; user interface for ending date | 
|---|
| 16 | D CONFIRM I STOP G EXIT    ; confirmation message/final check | 
|---|
| 17 | D QUEUE                    ; queuing process | 
|---|
| 18 | EXIT ; | 
|---|
| 19 | Q | 
|---|
| 20 | ; | 
|---|
| 21 | PURGE ; This procedure is queued to run in the background and does the | 
|---|
| 22 | ; actual purging.  Variables available from the TaskMan call are: | 
|---|
| 23 | ; | 
|---|
| 24 | ; STATLIST = list of statuses that are OK to purge | 
|---|
| 25 | ;    BEGDT = beginning date for purging | 
|---|
| 26 | ;    ENDDT = ending date for purging | 
|---|
| 27 | ; | 
|---|
| 28 | N NOW,CACHE | 
|---|
| 29 | S NOW=$$NOW^XLFDT | 
|---|
| 30 | ; | 
|---|
| 31 | ; Check to see if O/C is Cache, if so then cache specific journal code can be used to | 
|---|
| 32 | ; enable/disable/enable journaling | 
|---|
| 33 | S CACHE=0 | 
|---|
| 34 | I $P(^%ZOSF("OS"),U)="OpenM-NT" S CACHE=1 | 
|---|
| 35 | ; | 
|---|
| 36 | ; Retain ^XTMP for seven days | 
|---|
| 37 | I '$D(^XTMP("IBCNEKIT")) S ^XTMP("IBCNEKIT",0)=U_NOW_U_"Journaling status" | 
|---|
| 38 | S $P(^XTMP("IBCNEKIT",0),U)=$$FMADD^XLFDT(NOW,7) | 
|---|
| 39 | ; | 
|---|
| 40 | I 'CACHE D | 
|---|
| 41 | . S ^XTMP("IBCNEKIT",NOW,"STEP 1: NO ACTION")="An O/S conflict prevents journaling from disabling." | 
|---|
| 42 | E  D | 
|---|
| 43 | . ; Set error trap and disable journaling for this one process | 
|---|
| 44 | . NEW $ETRAP,$ESTACK,STATUS | 
|---|
| 45 | . S $ETRAP="D TRAP^IBCNEKIT" | 
|---|
| 46 | . S STATUS=$$CURRENT^%NOJRN | 
|---|
| 47 | . S STATUS=$S(STATUS=1:"Enabled",1:"Disabled") | 
|---|
| 48 | . S ^XTMP("IBCNEKIT",NOW,"STEP 1: START")="Journaling for this process is "_STATUS_U_$$NOW^XLFDT | 
|---|
| 49 | . ; | 
|---|
| 50 | . D DISABLE^%NOJRN | 
|---|
| 51 | . S STATUS=$$CURRENT^%NOJRN | 
|---|
| 52 | . S STATUS=$S(STATUS=1:"Enabled",1:"Disabled") | 
|---|
| 53 | . S ^XTMP("IBCNEKIT",NOW,"STEP 2: DISABLE")="Journaling for this process is "_STATUS_U_$$NOW^XLFDT | 
|---|
| 54 | ; | 
|---|
| 55 | ; | 
|---|
| 56 | ; First loop through the IIV Transmission Queue file and delete all | 
|---|
| 57 | ; records in the date range whose status is in the list | 
|---|
| 58 | ; | 
|---|
| 59 | NEW DATE,TQIEN,TQS,HLIEN,DIK,DA,CNT | 
|---|
| 60 | S DATE=$O(^IBCN(365.1,"AE",BEGDT),-1),CNT=0 | 
|---|
| 61 | F  S DATE=$O(^IBCN(365.1,"AE",DATE)) Q:'DATE!($P(DATE,".",1)>ENDDT)!$G(ZTSTOP)  S TQIEN=0 F  S TQIEN=$O(^IBCN(365.1,"AE",DATE,TQIEN)) Q:'TQIEN  D  Q:$G(ZTSTOP) | 
|---|
| 62 | . S CNT=CNT+1 | 
|---|
| 63 | . I $D(ZTQUEUED),CNT#100=0,$$S^%ZTLOAD() S ZTSTOP=1 Q | 
|---|
| 64 | . S TQS=$P($G(^IBCN(365.1,TQIEN,0)),U,4)    ; trans queue status | 
|---|
| 65 | . I '$F(STATLIST,","_TQS_",") Q             ; must be in the list | 
|---|
| 66 | . ; | 
|---|
| 67 | . ; loop through the HL7 messages multiple and kill any response | 
|---|
| 68 | . ; records that are found for this transmission queue entry | 
|---|
| 69 | . S HLIEN=0,DIK="^IBCN(365," | 
|---|
| 70 | . F  S HLIEN=$O(^IBCN(365.1,TQIEN,2,HLIEN)) Q:'HLIEN  D | 
|---|
| 71 | .. S DA=$P($G(^IBCN(365.1,TQIEN,2,HLIEN,0)),U,3) I DA D ^DIK | 
|---|
| 72 | .. Q | 
|---|
| 73 | . ; | 
|---|
| 74 | . ; now we can kill the transmission queue entry itself | 
|---|
| 75 | . S DA=TQIEN,DIK="^IBCN(365.1," D ^DIK | 
|---|
| 76 | . Q | 
|---|
| 77 | ; | 
|---|
| 78 | ; Check for a stop request | 
|---|
| 79 | I $G(ZTSTOP) G PURGEX | 
|---|
| 80 | ; | 
|---|
| 81 | ; Now we must loop through the IIV Response file itself to purge any | 
|---|
| 82 | ; response records that do not have a corresponding transmission | 
|---|
| 83 | ; queue entry.  These are the unsolicited responses.  The status of | 
|---|
| 84 | ; these responses is always 'response received' so we don't need to | 
|---|
| 85 | ; check the status. For this loop, start from the very beginning of | 
|---|
| 86 | ; the file. | 
|---|
| 87 | ; | 
|---|
| 88 | S DATE="",DIK="^IBCN(365,",CNT=0 | 
|---|
| 89 | F  S DATE=$O(^IBCN(365,"AE",DATE)) Q:'DATE!($P(DATE,".",1)>ENDDT)!$G(ZTSTOP)  S DA=0 F  S DA=$O(^IBCN(365,"AE",DATE,DA)) Q:'DA  D  Q:$G(ZTSTOP) | 
|---|
| 90 | . S CNT=CNT+1 | 
|---|
| 91 | . I $D(ZTQUEUED),CNT#100=0,$$S^%ZTLOAD() S ZTSTOP=1 Q | 
|---|
| 92 | . ; | 
|---|
| 93 | . ; If there is a pointer to the transmission queue file, then we | 
|---|
| 94 | . ; should get out of this loop because the purpose of this section | 
|---|
| 95 | . ; is to purge those responses with no link to the transmission | 
|---|
| 96 | . ; queue file. | 
|---|
| 97 | . ; | 
|---|
| 98 | . I $P($G(^IBCN(365,DA,0)),U,5) Q | 
|---|
| 99 | . D ^DIK | 
|---|
| 100 | . Q | 
|---|
| 101 | PURGEX ; | 
|---|
| 102 | ; Turn journaling back on | 
|---|
| 103 | I CACHE D | 
|---|
| 104 | . D ENABLE^%NOJRN | 
|---|
| 105 | . S STATUS=$$CURRENT^%NOJRN | 
|---|
| 106 | . S STATUS=$S(STATUS=1:"Enabled",1:"Disabled") | 
|---|
| 107 | . S ^XTMP("IBCNEKIT",NOW,"STEP 3: COMPLETED")="Journaling for this process is "_STATUS_U_$$NOW^XLFDT | 
|---|
| 108 | ; Tell TaskManager to delete the task's record | 
|---|
| 109 | I $D(ZTQUEUED) S ZTREQ="@" | 
|---|
| 110 | Q | 
|---|
| 111 | ; | 
|---|
| 112 | TRAP ; | 
|---|
| 113 | ; Error trap code for Purge^IBCNEKIT that was called by TaskMan | 
|---|
| 114 | ; Re-Enable journaling before quitting this routine | 
|---|
| 115 | ; | 
|---|
| 116 | D ENABLE^%NOJRN | 
|---|
| 117 | S STATUS=$$CURRENT^%NOJRN | 
|---|
| 118 | S STATUS=$S(STATUS=1:"Enabled",1:"Disabled") | 
|---|
| 119 | S ^XTMP("IBCNEKIT",NOW,"STEP 3: ABORTED")="Journaling for this process is "_STATUS_U_$$NOW^XLFDT | 
|---|
| 120 | D ^%ZTER | 
|---|
| 121 | D UNWIND^%ZTER | 
|---|
| 122 | Q | 
|---|
| 123 | ; | 
|---|
| 124 | INIT ; This procedure calculates the default beginning and ending dates | 
|---|
| 125 | ; and displays screen messages about this option to the user. | 
|---|
| 126 | ; | 
|---|
| 127 | NEW DATE,FOUND,TQIEN,TQS,RPIEN,RPS | 
|---|
| 128 | NEW DIR,X,Y,DTOUT,DUOUT,DIRUT,DIROUT | 
|---|
| 129 | ; | 
|---|
| 130 | S STOP=0 | 
|---|
| 131 | ; | 
|---|
| 132 | ; This is the list of statuses that are OK to purge | 
|---|
| 133 | ;   3=Response Received | 
|---|
| 134 | ;   5=Communication Failure | 
|---|
| 135 | ;   7=Cancelled | 
|---|
| 136 | S STATLIST=",3,5,7," | 
|---|
| 137 | ; | 
|---|
| 138 | ; Try to find a beginning date in the IIV Transmission Queue file | 
|---|
| 139 | S DATE="",FOUND=0,BEGDT=DT | 
|---|
| 140 | F  S DATE=$O(^IBCN(365.1,"AE",DATE)) Q:'DATE!FOUND  S TQIEN=0 F  S TQIEN=$O(^IBCN(365.1,"AE",DATE,TQIEN)) Q:'TQIEN  D  Q:FOUND | 
|---|
| 141 | . S TQS=$P($G(^IBCN(365.1,TQIEN,0)),U,4)    ; status | 
|---|
| 142 | . I '$F(STATLIST,","_TQS_",") Q | 
|---|
| 143 | . S FOUND=1 | 
|---|
| 144 | . S BEGDT=$P(DATE,".",1) | 
|---|
| 145 | . Q | 
|---|
| 146 | ; | 
|---|
| 147 | ; If not successful, try to find a beginning date in the IIV Response file. | 
|---|
| 148 | I 'FOUND D | 
|---|
| 149 | . S DATE="" | 
|---|
| 150 | . F  S DATE=$O(^IBCN(365,"AE",DATE)) Q:'DATE!FOUND  S RPIEN=0 F  S RPIEN=$O(^IBCN(365,"AE",DATE,RPIEN)) Q:'RPIEN  D  Q:FOUND | 
|---|
| 151 | .. S RPS=$P($G(^IBCN(365,RPIEN,0)),U,6)    ; status | 
|---|
| 152 | .. I '$F(STATLIST,","_RPS_",") Q | 
|---|
| 153 | .. S FOUND=1 | 
|---|
| 154 | .. S BEGDT=$P(DATE,".",1) | 
|---|
| 155 | .. Q | 
|---|
| 156 | . Q | 
|---|
| 157 | ; | 
|---|
| 158 | ; default end date, Today minus 182 days (approx 6 months) | 
|---|
| 159 | S ENDDT=$$FMADD^XLFDT(DT,-182) | 
|---|
| 160 | ; | 
|---|
| 161 | I 'FOUND!(BEGDT>ENDDT) D  S STOP=1 G INITX | 
|---|
| 162 | . W !!?5,"Purging of IIV data is not possible at this time." | 
|---|
| 163 | . I 'FOUND W !?5,"There are no entries in the file that are eligible to be",!?5,"purged or there is no data in the file." | 
|---|
| 164 | . E  W !?5,"The oldest date in the file is ",$$FMTE^XLFDT(BEGDT,"5Z"),".",!?5,"Data cannot be purged unless it is at least 6 months old." | 
|---|
| 165 | . W ! S DIR(0)="E" D ^DIR K DIR | 
|---|
| 166 | . Q | 
|---|
| 167 | ; | 
|---|
| 168 | ; At this point, we know that there are some entries eligible for | 
|---|
| 169 | ; purging.  Display a message to the user about this option. | 
|---|
| 170 | W @IOF | 
|---|
| 171 | W !?3,"Purge Electronic Insurance Identification and Verification (IIV) Data Files" | 
|---|
| 172 | W !!!," This option will allow you to purge data from the IIV Response File (#365)" | 
|---|
| 173 | W !," and the IIV Transmission Queue File (#365.1).  The data must be at least six" | 
|---|
| 174 | W !," months old before it can be purged.  Only insurance transactions that have a" | 
|---|
| 175 | W !," transmission status of ""Response Received"", ""Communication Failure"", or" | 
|---|
| 176 | W !," ""Cancelled"" may be purged.  You will be allowed to select a date range for" | 
|---|
| 177 | W !," this purging.  The default beginning date will be the date of the oldest" | 
|---|
| 178 | W !," eligible record in the system.  The default ending date will be six months" | 
|---|
| 179 | W !," ago from today's date.  You may modify this default date range.  However, you" | 
|---|
| 180 | W !," may not select an ending date that is more recent than six months ago." | 
|---|
| 181 | W !! | 
|---|
| 182 | INITX ; | 
|---|
| 183 | Q | 
|---|
| 184 | ; | 
|---|
| 185 | BEGDT ; This procedure captures the beginning date from the user. | 
|---|
| 186 | NEW DIR,X,Y,DTOUT,DUOUT,DIRUT,DIROUT | 
|---|
| 187 | S DIR(0)="DOA^"_BEGDT_":"_ENDDT_":AEX" | 
|---|
| 188 | S DIR("A")="Enter the purge begin date: " | 
|---|
| 189 | S DIR("B")=$$FMTE^XLFDT(BEGDT,"5Z") | 
|---|
| 190 | S DIR("?")="This response must be a date between "_$$FMTE^XLFDT(BEGDT,"5Z")_" and "_$$FMTE^XLFDT(ENDDT,"5Z")_"." | 
|---|
| 191 | D ^DIR K DIR | 
|---|
| 192 | I $D(DIRUT)!'Y S STOP=1 G BEGDTX | 
|---|
| 193 | S BEGDT=Y | 
|---|
| 194 | BEGDTX ; | 
|---|
| 195 | Q | 
|---|
| 196 | ; | 
|---|
| 197 | ENDDT ; This procedure captures the ending date from the user. | 
|---|
| 198 | NEW DIR,X,Y,DTOUT,DUOUT,DIRUT,DIROUT | 
|---|
| 199 | W ! | 
|---|
| 200 | S DIR(0)="DOA^"_BEGDT_":"_ENDDT_":AEX" | 
|---|
| 201 | S DIR("A")="  Enter the purge end date: " | 
|---|
| 202 | S DIR("B")=$$FMTE^XLFDT(ENDDT,"5Z") | 
|---|
| 203 | S DIR("?")="This response must be a date between "_$$FMTE^XLFDT(BEGDT,"5Z")_" and "_$$FMTE^XLFDT(ENDDT,"5Z")_"." | 
|---|
| 204 | D ^DIR K DIR | 
|---|
| 205 | I $D(DIRUT)!'Y S STOP=1 G ENDDTX | 
|---|
| 206 | S ENDDT=Y | 
|---|
| 207 | ENDDTX ; | 
|---|
| 208 | Q | 
|---|
| 209 | ; | 
|---|
| 210 | CONFIRM ; This procedure displays a confirmation message to the user and | 
|---|
| 211 | ; asks if it is OK to proceed with the purge. | 
|---|
| 212 | NEW DIR,X,Y,DTOUT,DUOUT,DIRUT,DIROUT | 
|---|
| 213 | W !!!," You want to purge all IIV data created between " | 
|---|
| 214 | W $$FMTE^XLFDT(BEGDT,"5Z")," and ",$$FMTE^XLFDT(ENDDT,"5Z"),"." | 
|---|
| 215 | W ! | 
|---|
| 216 | S DIR(0)="YO",DIR("A")=" OK to continue" | 
|---|
| 217 | S DIR("B")="NO" | 
|---|
| 218 | D ^DIR K DIR | 
|---|
| 219 | I 'Y S STOP=1 | 
|---|
| 220 | CONFX ; | 
|---|
| 221 | Q | 
|---|
| 222 | ; | 
|---|
| 223 | QUEUE ; This procedure queues the purge process for later at night. | 
|---|
| 224 | ; The concept for queuing the purge came from the insurance buffer | 
|---|
| 225 | ; purge routine, IBCNBPG.  That purge process is also hard-coded to | 
|---|
| 226 | ; be run at 8:00 PM just like this one is. | 
|---|
| 227 | ; | 
|---|
| 228 | NEW ZTRTN,ZTDESC,ZTDTH,ZTIO,ZTUCI,ZTCPU,ZTPRI,ZTSAVE,ZTKIL,ZTSYNC,ZTSK | 
|---|
| 229 | NEW DIR,X,Y,DTOUT,DUOUT,DIRUT,DIROUT | 
|---|
| 230 | S ZTRTN="PURGE^IBCNEKIT"     ; TaskMan task entry point | 
|---|
| 231 | S ZTDESC="Purge IIV Data"    ; Task description | 
|---|
| 232 | S ZTDTH=DT_".20"             ; start it at 8:00 PM tonight | 
|---|
| 233 | S ZTIO="" | 
|---|
| 234 | S ZTSAVE("BEGDT")="" | 
|---|
| 235 | S ZTSAVE("ENDDT")="" | 
|---|
| 236 | S ZTSAVE("STATLIST")="" | 
|---|
| 237 | D ^%ZTLOAD | 
|---|
| 238 | I $G(ZTSK) W !!," Task# ",ZTSK," has been scheduled to purge the IIV data tonight at 8:00 PM." | 
|---|
| 239 | E  W !!," TaskManager could not schedule this task.",!," Contact IRM for technical assistance." | 
|---|
| 240 | W ! S DIR(0)="E" D ^DIR K DIR | 
|---|
| 241 | QUEUEX ; | 
|---|
| 242 | Q | 
|---|