[613] | 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
|
---|