1 | IBCNEDEP ;DAOU/ALA - Process Transaction Records ;17-JUN-2002
|
---|
2 | ;;2.0;INTEGRATED BILLING;**184,271,300**;21-MAR-94
|
---|
3 | ;;Per VHA Directive 10-93-142, this routine should not be modified.
|
---|
4 | ;
|
---|
5 | ; This program finds records needing HL7 msg creation
|
---|
6 | ; Periodically check for stop request for background task
|
---|
7 | ;
|
---|
8 | ; Variables
|
---|
9 | ; RETR = # retries allowed
|
---|
10 | ; HLMAX = Maximum # of HL7 msgs
|
---|
11 | ; MGRP = Msg Mailgroup
|
---|
12 | ; FAIL = # of days before failure
|
---|
13 | ; FMSG = Failure Mailman flag
|
---|
14 | ; TMSG = Timeout Mailman flag
|
---|
15 | ; FLDT = Failure date
|
---|
16 | ; FUTDT = Future transmission date
|
---|
17 | ; DFN = Patient IEN
|
---|
18 | ; PAYR = Payer IEN
|
---|
19 | ; DTCRT = Date Created
|
---|
20 | ; BUFF = Buffer File IEN
|
---|
21 | ; NRETR = # of retries accomplished
|
---|
22 | ; IHCNT = Count of successful HL7 msgs
|
---|
23 | ; QUERY = Type of msg
|
---|
24 | ; EXT = Which extract produced record
|
---|
25 | ; SRVDT = Service Date
|
---|
26 | ; IRIEN = Insurance Record IEN
|
---|
27 | ; NTRAN = # of transmissions accomplished
|
---|
28 | ; OVRIDE = Override Flag
|
---|
29 | ; BNDL = Bundle Verification Flag
|
---|
30 | ;
|
---|
31 | EN ; Entry point
|
---|
32 | ;
|
---|
33 | ; Start processing of data
|
---|
34 | K ^TMP("HLS",$J),^TMP("IBQUERY",$J)
|
---|
35 | ; Initialize count for periodic TaskMan check
|
---|
36 | S IBCNETOT=0
|
---|
37 | ;
|
---|
38 | ; Get IB Site Parameters
|
---|
39 | S IBCNEP=$G(^IBE(350.9,1,51))
|
---|
40 | S RETR=+$P(IBCNEP,U,6),HLMAX=$P(IBCNEP,U,15),BNDL=$P(IBCNEP,U,23)
|
---|
41 | S:HLMAX="" HLMAX=99999999
|
---|
42 | S MGRP=$$MGRP^IBCNEUT5()
|
---|
43 | S FAIL=$P(IBCNEP,U,5),TMSG=$P(IBCNEP,U,7),FMSG=$P(IBCNEP,U,20)
|
---|
44 | S FLDT=$$FMADD^XLFDT(DT,-FAIL)
|
---|
45 | ; Statuses
|
---|
46 | ; 1 = Ready To Transmit
|
---|
47 | ; 2 = Transmitted
|
---|
48 | ; 4 = Hold
|
---|
49 | ; 6 = Retry
|
---|
50 | ;
|
---|
51 | HLD ; Go through the 'Hold' statuses, see if ready to be 'retried'
|
---|
52 | S IEN=""
|
---|
53 | F S IEN=$O(^IBCN(365.1,"AC",4,IEN)) Q:IEN="" D Q:$G(ZTSTOP)
|
---|
54 | . ; Update count for periodic check
|
---|
55 | . S IBCNETOT=IBCNETOT+1
|
---|
56 | . ; Check for request to stop background job, periodically
|
---|
57 | . I $D(ZTQUEUED),IBCNETOT#100=0,$$S^%ZTLOAD() S ZTSTOP=1 Q
|
---|
58 | . ;
|
---|
59 | . S FUTDT=$P($G(^IBCN(365.1,IEN,0)),U,9)
|
---|
60 | . ;
|
---|
61 | . ; If the future date is today, set status to 'Retry',
|
---|
62 | . ; DON'T clear future transmission date. (Need date to see if this is the first
|
---|
63 | . ; time that the payer asked us to resubmit this inquiry.)
|
---|
64 | . I FUTDT'>DT D SST^IBCNEUT2(IEN,6) ;D
|
---|
65 | . ;. NEW DA,DIE,DR
|
---|
66 | . ;. S DA=IEN,DIE="^IBCN(365.1,",DR=".09///@" D ^DIE
|
---|
67 | ;
|
---|
68 | ; Exit based on stop request
|
---|
69 | I $G(ZTSTOP) G EXIT
|
---|
70 | ;
|
---|
71 | TMT ; If the status is 'Transmitted' - is this a 'Retry' or
|
---|
72 | ; 'Comm Failure'
|
---|
73 | S IEN=""
|
---|
74 | F S IEN=$O(^IBCN(365.1,"AC",2,IEN)) Q:IEN="" D Q:$G(ZTSTOP)
|
---|
75 | . ; Update count for periodic check
|
---|
76 | . S IBCNETOT=IBCNETOT+1
|
---|
77 | . ; Check for request to stop background job, periodically
|
---|
78 | . I $D(ZTQUEUED),IBCNETOT#100=0,$$S^%ZTLOAD() S ZTSTOP=1 Q
|
---|
79 | . ;
|
---|
80 | . NEW TDATA,DTCRT,BUFF,DFN,PAYR,XMSUB,VERID
|
---|
81 | . S TDATA=$G(^IBCN(365.1,IEN,0))
|
---|
82 | . S DFN=$P(TDATA,U,2),PAYR=$P(TDATA,U,3)
|
---|
83 | . S DTCRT=$P(TDATA,U,6)\1,BUFF=$P(TDATA,U,5)
|
---|
84 | . S VERID=$P(TDATA,U,11)
|
---|
85 | . ;
|
---|
86 | . ; Check against the Failure Date
|
---|
87 | . I DTCRT>FLDT Q
|
---|
88 | . ;
|
---|
89 | . ; If retries are defined
|
---|
90 | . I RETR>0 D Q
|
---|
91 | .. ;
|
---|
92 | .. ; Send timeout mail msg
|
---|
93 | .. I PAYR'=$$FIND1^DIC(365.12,"","X","~NO PAYER") D TMRR^IBCNEDEQ
|
---|
94 | .. D SST^IBCNEUT2(IEN,6)
|
---|
95 | . ;
|
---|
96 | . ; If no retries defined, set to fail
|
---|
97 | . D SST^IBCNEUT2(IEN,5)
|
---|
98 | . ;
|
---|
99 | . ; For msg in the Response file set the status to
|
---|
100 | . ; 'Comm Failure'
|
---|
101 | . D RSTA^IBCNEUT7(IEN)
|
---|
102 | . ;
|
---|
103 | . ; Set Buffer symbol to 'B12' (Comm Failure)
|
---|
104 | . I BUFF'="" D BUFF^IBCNEUT2(BUFF,15)
|
---|
105 | . ;
|
---|
106 | . I PAYR=$$FIND1^DIC(365.12,"","X","~NO PAYER") Q
|
---|
107 | . ;
|
---|
108 | . ; Issue comm fail MailMan msg only for ver'ns
|
---|
109 | . I VERID="V" D CERR^IBCNEDEQ
|
---|
110 | ;
|
---|
111 | ; Exit for stop request
|
---|
112 | I $G(ZTSTOP) G EXIT
|
---|
113 | ;
|
---|
114 | RET ; If status is 'Retry'
|
---|
115 | S IEN=""
|
---|
116 | F S IEN=$O(^IBCN(365.1,"AC",6,IEN)) Q:IEN="" D Q:$G(ZTSTOP)
|
---|
117 | . ; Update count for periodic check
|
---|
118 | . S IBCNETOT=IBCNETOT+1
|
---|
119 | . ; Check for request to stop background job, periodically
|
---|
120 | . I $D(ZTQUEUED),IBCNETOT#100=0,$$S^%ZTLOAD() S ZTSTOP=1 Q
|
---|
121 | . ;
|
---|
122 | . NEW TDATA,NRETR,PAYR,BUFF,DFN,MSG,RIEN,HIEN,XMSUB,VERID
|
---|
123 | . S TDATA=$G(^IBCN(365.1,IEN,0))
|
---|
124 | . S NRETR=$P(TDATA,U,8),PAYR=$P(TDATA,U,3)
|
---|
125 | . S BUFF=$P(TDATA,U,5),DFN=$P(TDATA,U,2)
|
---|
126 | . S VERID=$P(TDATA,U,11)
|
---|
127 | . S NRETR=NRETR+1
|
---|
128 | . ;
|
---|
129 | . ; If retries are finished, set to fail
|
---|
130 | . I NRETR>RETR D Q
|
---|
131 | .. D SST^IBCNEUT2(IEN,5)
|
---|
132 | .. ;
|
---|
133 | .. ; Set Buffer symbol to 'B12' (Comm Failure)
|
---|
134 | .. I BUFF'="" D BUFF^IBCNEUT2(BUFF,15)
|
---|
135 | .. ;
|
---|
136 | .. ; For msg in the Response file set the status to
|
---|
137 | .. ; 'Comm Failure'
|
---|
138 | .. D RSTA^IBCNEUT7(IEN)
|
---|
139 | .. I PAYR=$$FIND1^DIC(365.12,"","X","~NO PAYER") Q
|
---|
140 | .. ;
|
---|
141 | .. I VERID="V" D CERE^IBCNEDEQ
|
---|
142 | . ; If generating retry, set IIV status to comm failure (5) for
|
---|
143 | . ; remaining related responses
|
---|
144 | . D RSTA^IBCNEUT7(IEN)
|
---|
145 | ;
|
---|
146 | ; Exit for stop request
|
---|
147 | I $G(ZTSTOP) G EXIT
|
---|
148 | ;
|
---|
149 | FIN ; Prioritize requests for statuses 'Retry' and 'Ready to Transmit'
|
---|
150 | ;
|
---|
151 | ; Separate inquiries into verifications, identifications,
|
---|
152 | ; and "fishes" - VNUM = Priority of output
|
---|
153 | F STA=1,6 S IEN="" D
|
---|
154 | . F S IEN=$O(^IBCN(365.1,"AC",STA,IEN)) Q:IEN="" D
|
---|
155 | .. S IBDATA=$G(^IBCN(365.1,IEN,0)) Q:IBDATA=""
|
---|
156 | .. S QUERY=$P(IBDATA,U,11),DFN=$P(IBDATA,U,2),OVRIDE=$P(IBDATA,U,14)
|
---|
157 | .. S PAYR=$P(IBDATA,U,3)
|
---|
158 | .. I QUERY="V" S VNUM=3
|
---|
159 | .. I QUERY'="V" D
|
---|
160 | ... I PAYR=$$FIND1^DIC(365.12,,"X","~NO PAYER") S VNUM=5 Q
|
---|
161 | ... S VNUM=4
|
---|
162 | .. I OVRIDE'="" D
|
---|
163 | ... I PAYR=$$FIND1^DIC(365.12,,"X","~NO PAYER") S VNUM=2 Q
|
---|
164 | ... S VNUM=1
|
---|
165 | .. S ^TMP("IBQUERY",$J,VNUM,DFN,IEN)=""
|
---|
166 | ;
|
---|
167 | LP ; Loop through priorities, process as either verifications
|
---|
168 | ; or identifications
|
---|
169 | S VNUM="",IHCNT=0
|
---|
170 | F S VNUM=$O(^TMP("IBQUERY",$J,VNUM)) Q:VNUM="" D Q:IHCNT=HLMAX!$G(ZTSTOP)!$G(QFL)=1
|
---|
171 | . I VNUM=1!(VNUM=3) D VER Q
|
---|
172 | . D ID
|
---|
173 | ;
|
---|
174 | EXIT ; Finish
|
---|
175 | K BUFF,CNT,D,D0,DA,DFN,DI,DIC,DIE,DISYS,DQ,DR,DTCRT,EXT,FAIL,FLDT,FUTDT
|
---|
176 | K FRDT,FMSG,GT1,HCT,HIEN,HL,HLCDOM,HLCINS,HLCS,HLCSTCP,HLDOM,HLECH,%I,%H
|
---|
177 | K HLEID,HLFS,HLHDR,HLINST,HLIP,HLN,HLPARAM,HLPROD,HLQ,HLRESLT,XMSUB
|
---|
178 | K HLSAN,HLTYPE,HLX,IBCNEP,IBCNHLP,IEN,IN1,IRIEN,MDTM,MGRP,MSGID,TOT
|
---|
179 | K NRETR,NTRAN,OVRIDE,PAYR,PID,QFL,QUERY,RETR,RSIEN,SRVDT,STA,TRANSR,X
|
---|
180 | K ZMID,IHCNT,HLMAX,^TMP("IBQUERY",$J),Y,DOD,DGREL,TMSG,RSTYPE,OMSGID,QFL
|
---|
181 | K IBCNETOT,HLP,SUBID,VNUM,BNDL,IBDATA
|
---|
182 | Q
|
---|
183 | ;
|
---|
184 | VER ; Initialize HL7 variables protocol for Verifications
|
---|
185 | S IBCNHLP="IBCNE IIV RQV OUT"
|
---|
186 | D INIT^IBCNEHLO
|
---|
187 | ;
|
---|
188 | S DFN=""
|
---|
189 | F S DFN=$O(^TMP("IBQUERY",$J,VNUM,DFN)) Q:DFN="" D Q:IHCNT=HLMAX!$G(ZTSTOP)
|
---|
190 | . ;
|
---|
191 | . ; If the INQUIRE SECONDARY INSURANCES flag is 'yes',
|
---|
192 | . ; bundle verifications together, send a continuation pointer
|
---|
193 | . I VNUM=3,BNDL D Q:QFL
|
---|
194 | .. S TOT=0,IEN="",QFL=0
|
---|
195 | .. F S IEN=$O(^TMP("IBQUERY",$J,VNUM,DFN,IEN)) Q:IEN="" S TOT=TOT+1
|
---|
196 | .. ;
|
---|
197 | .. ; If the total # of "bundled" verifications is
|
---|
198 | .. ; greater than the maximum # of HL7 allowed, quit
|
---|
199 | .. I (TOT+IHCNT)>HLMAX S QFL=1 Q
|
---|
200 | . ;
|
---|
201 | . S IEN="",OMSGID="",QFL=0,CNT=0
|
---|
202 | . F S IEN=$O(^TMP("IBQUERY",$J,VNUM,DFN,IEN)) Q:IEN="" D Q:IHCNT=HLMAX!$G(ZTSTOP)
|
---|
203 | .. ; Update count for periodic check
|
---|
204 | .. S IBCNETOT=IBCNETOT+1
|
---|
205 | .. ; Check for request to stop background job, periodically
|
---|
206 | .. I $D(ZTQUEUED),IBCNETOT#100=0,$$S^%ZTLOAD() S ZTSTOP=1 Q
|
---|
207 | .. ;
|
---|
208 | .. D PROC I PID="" Q
|
---|
209 | .. ;
|
---|
210 | .. I BNDL S HLP("CONTPTR")=$G(OMSGID)
|
---|
211 | .. ; D GENERATE^HLMA(HLEID,"GM",1,.HLRESLT,"",.HLP)
|
---|
212 | .. D GENERATE^HLMA(IBCNHLP,"GM",1,.HLRESLT,"",.HLP)
|
---|
213 | .. K ^TMP("HLS",$J),HLP
|
---|
214 | .. ;
|
---|
215 | .. ; If not successful
|
---|
216 | .. I $P(HLRESLT,U,2)]"" D HLER^IBCNEDEQ Q
|
---|
217 | .. ; If successful
|
---|
218 | .. D SCC^IBCNEDEQ
|
---|
219 | .. I BNDL D
|
---|
220 | ... I CNT=1 S OMSGID=MSGID
|
---|
221 | ;
|
---|
222 | K HL,IN1,GT1,PID,DFN,^TMP($J,"HLS")
|
---|
223 | ;
|
---|
224 | ; Exit based on stop request
|
---|
225 | I $G(ZTSTOP) Q
|
---|
226 | ;
|
---|
227 | ; If the # of HL7 msgs generate equals the
|
---|
228 | ; maximum # of HL7 msgs allowed, quit
|
---|
229 | I IHCNT=HLMAX Q
|
---|
230 | ;
|
---|
231 | Q
|
---|
232 | ;
|
---|
233 | ID ; Send Identification Msgs
|
---|
234 | ;
|
---|
235 | ; Initialize the HL7 variables based on the HL7 protocol
|
---|
236 | S IBCNHLP="IBCNE IIV RQI OUT"
|
---|
237 | D INIT^IBCNEHLO
|
---|
238 | ;
|
---|
239 | S DFN=""
|
---|
240 | F S DFN=$O(^TMP("IBQUERY",$J,VNUM,DFN)) Q:DFN="" D Q:IHCNT=HLMAX!$G(ZTSTOP)!QFL
|
---|
241 | . ; Update count for periodic check
|
---|
242 | . S IBCNETOT=IBCNETOT+1
|
---|
243 | . ; Check for request to stop background job, periodically
|
---|
244 | . I $D(ZTQUEUED),IBCNETOT#100=0,$$S^%ZTLOAD() S ZTSTOP=1 Q
|
---|
245 | . ;
|
---|
246 | . S TOT=0,IEN="",CNT=0,OMSGID="",QFL=0
|
---|
247 | . ;
|
---|
248 | . ; Get the total # of identification msgs for a patient
|
---|
249 | . F S IEN=$O(^TMP("IBQUERY",$J,VNUM,DFN,IEN)) Q:IEN="" S TOT=TOT+1
|
---|
250 | . ;
|
---|
251 | . ; If the total # of identification msgs for this
|
---|
252 | . ; patient is greater than the maximum # of allowed
|
---|
253 | . ; HL7 msgs, stop processing until the next night
|
---|
254 | . I (TOT+IHCNT)>HLMAX S QFL=1 Q
|
---|
255 | . ;
|
---|
256 | . ; For each identification transaction generate an HL7 msg
|
---|
257 | . F S IEN=$O(^TMP("IBQUERY",$J,VNUM,DFN,IEN)) Q:IEN="" D Q:IHCNT=HLMAX
|
---|
258 | .. D PROC
|
---|
259 | .. ;
|
---|
260 | .. I VNUM=4 S HLP("CONTPTR")=$G(OMSGID)
|
---|
261 | .. ; D GENERATE^HLMA(HLEID,"GM",1,.HLRESLT,"",.HLP)
|
---|
262 | .. D GENERATE^HLMA(IBCNHLP,"GM",1,.HLRESLT,"",.HLP)
|
---|
263 | .. K ^TMP("HLS",$J),HLP
|
---|
264 | .. ;
|
---|
265 | .. ; If not successful
|
---|
266 | .. I $P(HLRESLT,U,2)]"" D HLER^IBCNEDEQ Q
|
---|
267 | .. ;
|
---|
268 | .. ; If successful
|
---|
269 | .. D SCC^IBCNEDEQ
|
---|
270 | .. I VNUM=4 D
|
---|
271 | ... I CNT=1 S OMSGID=MSGID
|
---|
272 | ;
|
---|
273 | Q
|
---|
274 | ;
|
---|
275 | PROC ; Process TQ record
|
---|
276 | S TRANSR=$G(^IBCN(365.1,IEN,0))
|
---|
277 | S DFN=$P(TRANSR,U,2),PAYR=$P(TRANSR,U,3),BUFF=$P(TRANSR,U,5)
|
---|
278 | S QUERY=$P(TRANSR,U,11),EXT=$P(TRANSR,U,10),SRVDT=$P(TRANSR,U,12)
|
---|
279 | S IRIEN=$P(TRANSR,U,13),HCT=0,NTRAN=$P(TRANSR,U,7),NRETR=$P(TRANSR,U,8)
|
---|
280 | S SUBID=$P(TRANSR,U,16),OVRIDE=$P(TRANSR,U,14),STA=$P(TRANSR,U,4)
|
---|
281 | S FRDT=$P(TRANSR,U,17)
|
---|
282 | ;
|
---|
283 | ; Build the HL7 msg
|
---|
284 | S HCT=HCT+1,^TMP("HLS",$J,HCT)="PRD|NA"
|
---|
285 | D PID^IBCNEHLQ I PID=""!(PID?."*") Q
|
---|
286 | S HCT=HCT+1,^TMP("HLS",$J,HCT)=$TR(PID,"*","")
|
---|
287 | D GT1^IBCNEHLQ I GT1'="",GT1'?."*" S HCT=HCT+1,^TMP("HLS",$J,HCT)=$TR(GT1,"*","")
|
---|
288 | D IN1^IBCNEHLQ I IN1'="",IN1'?."*" D
|
---|
289 | . S HCT=HCT+1
|
---|
290 | . I VNUM=1 S ^TMP("HLS",$J,HCT)=$TR(IN1,"*","") Q
|
---|
291 | . I VNUM=2,'BNDL S ^TMP("HLS",$J,HCT)=$TR(IN1,"*","") Q
|
---|
292 | . S CNT=CNT+1
|
---|
293 | . S $P(IN1,HLFS,22)=TOT,$P(IN1,HLFS,21)=CNT
|
---|
294 | . S ^TMP("HLS",$J,HCT)=$TR(IN1,"*","")
|
---|
295 | Q
|
---|