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
|
---|