| 1 | IBCNEDE4 ;DAOU/ALA - NO INSURANCE DATA EXTRACT ;24-JUN-2002 | 
|---|
| 2 | ;;2.0;INTEGRATED BILLING;**184,271**;21-MAR-94 | 
|---|
| 3 | ;;Per VHA Directive 10-93-142, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | ;**Program Description** | 
|---|
| 6 | ;  This program finds veterans who have been seen within a | 
|---|
| 7 | ;  specified date range but who have no active or no | 
|---|
| 8 | ;  insurance records | 
|---|
| 9 | ;  Periodically check for stop request for background task | 
|---|
| 10 | ; | 
|---|
| 11 | Q   ;can't call directly | 
|---|
| 12 | ; | 
|---|
| 13 | EN ; | 
|---|
| 14 | NEW TMPCNT,IEN,TQIEN,DATA1,DATA2,EACTIVE,XDAYS,YDAYS,MAXCNT,IBBDT,IBEDT | 
|---|
| 15 | NEW IBD,IBPM,IBPMD,IBQUERY,IBCNCNT,SRVICEDT,IBINS,IBDD,IBDDI,DFN | 
|---|
| 16 | NEW IBOUTP,PTN,PAYER,FOUND1,FOUND2,DFN,DISYS,TDT,IBCNETOT,FRESH,FRESHDT | 
|---|
| 17 | NEW DGPMDT,AUPNDT | 
|---|
| 18 | ; | 
|---|
| 19 | S IBCNCNT=0 | 
|---|
| 20 | ; Initialize count for periodic TaskMan check | 
|---|
| 21 | S IBCNETOT=0 | 
|---|
| 22 | ; | 
|---|
| 23 | ;  Get Extract parameters | 
|---|
| 24 | S EACTIVE=$$SETTINGS^IBCNEDE7(4) | 
|---|
| 25 | I 'EACTIVE Q                   ; quit if not active | 
|---|
| 26 | S XDAYS=$P(EACTIVE,U,2) | 
|---|
| 27 | S YDAYS=$P(EACTIVE,U,3) | 
|---|
| 28 | S MAXCNT=$P(EACTIVE,U,4) | 
|---|
| 29 | S:MAXCNT="" MAXCNT=9999999999 | 
|---|
| 30 | ; | 
|---|
| 31 | ;  Check for Date Last Treated and get DFN's | 
|---|
| 32 | S IBBDT=$$FMADD^XLFDT(DT,-XDAYS),IBEDT=DT | 
|---|
| 33 | ; | 
|---|
| 34 | ; * Main Control | 
|---|
| 35 | ; | 
|---|
| 36 | S IBD=IBBDT-.0001 | 
|---|
| 37 | K ^TMP("IBCNEDE4",$J,"PTS") | 
|---|
| 38 | F II=1:1 D  Q:(IBD="")!(IBD\1>IBEDT)!(IBCNCNT'<MAXCNT)!($G(ZTSTOP)) | 
|---|
| 39 | . S DGPMDT=$O(^DGPM("ATT3",IBD)),AUPNDT=$O(^AUPNVSIT("B",IBD)) | 
|---|
| 40 | . I (AUPNDT="")!((DGPMDT\1)<(AUPNDT\1)) S IBD=DGPMDT | 
|---|
| 41 | . I (DGPMDT="")!((DGPMDT\1)>(AUPNDT\1)) S IBD=AUPNDT | 
|---|
| 42 | . I (IBD\1>IBEDT)!(IBD="") Q | 
|---|
| 43 | . ; | 
|---|
| 44 | . K ^TMP("IBJDI51",$J) | 
|---|
| 45 | . D INP(IBD)    ; sets up ^TMP("IBJDI51",$J) | 
|---|
| 46 | . I $G(ZTSTOP) Q | 
|---|
| 47 | . D OUTP(IBD) | 
|---|
| 48 | . I $G(ZTSTOP) Q | 
|---|
| 49 | . D REST(IBBDT-.0001,IBEDT) | 
|---|
| 50 | . D PROCESS | 
|---|
| 51 | . I $G(ZTSTOP) Q | 
|---|
| 52 | . S IBD=($$FMADD^XLFDT(IBD,+1))-.0001 | 
|---|
| 53 | ; | 
|---|
| 54 | EXIT ; | 
|---|
| 55 | K VINS,^TMP("IBJDI51",$J),^TMP("IBCNEDE4",$J,"PTS")   ; clean up | 
|---|
| 56 | ; | 
|---|
| 57 | Q | 
|---|
| 58 | ; * end of routine processing | 
|---|
| 59 | ;============================ | 
|---|
| 60 | ; | 
|---|
| 61 | INP(DATE) ;  Find inpatients for that date (we want most recent encounter) | 
|---|
| 62 | NEW IBD,IBPM,IBPMD,DFN | 
|---|
| 63 | S IBD=DATE-.0001 | 
|---|
| 64 | F  S IBD=$O(^DGPM("ATT3",IBD)) Q:(IBD="")!(IBD\1>DATE)  D  Q:$G(ZTSTOP) | 
|---|
| 65 | . S IBPM=0 F  S IBPM=$O(^DGPM("ATT3",IBD,IBPM)) Q:IBPM=""  D  Q:$G(ZTSTOP) | 
|---|
| 66 | .. ; Update count for periodic check | 
|---|
| 67 | .. S IBCNETOT=IBCNETOT+1 | 
|---|
| 68 | .. ; Check for request to stop background job, periodically | 
|---|
| 69 | .. I $D(ZTQUEUED),IBCNETOT#100=0,$$S^%ZTLOAD() S ZTSTOP=1 Q | 
|---|
| 70 | .. ; | 
|---|
| 71 | .. S IBPMD=$G(^DGPM(IBPM,0)) Q:'IBPMD | 
|---|
| 72 | .. S DFN=+$P(IBPMD,U,3) Q:'DFN | 
|---|
| 73 | .. I $P($G(^DPT(DFN,0)),U,21) Q         ; Exclude if test patient | 
|---|
| 74 | .. Q:$D(^TMP("IBCNEDE4",$J,"PTS",DFN,"INP"))      ; already processed | 
|---|
| 75 | .. S ^TMP("IBCNEDE4",$J,"PTS",DFN,"INP",IBD)="" | 
|---|
| 76 | .. D PROC^IBJDI5(DFN,"*",IBD) | 
|---|
| 77 | Q | 
|---|
| 78 | ; | 
|---|
| 79 | OUTP(DATE) ; Find outpatients treated for this date (most recent encounter) | 
|---|
| 80 | NEW IBD,IEN,DFN | 
|---|
| 81 | S IBD=DATE-.000001 | 
|---|
| 82 | F  S IBD=$O(^AUPNVSIT("B",IBD)) Q:(IBD="")!(IBD\1>DATE)  D  Q:$G(ZTSTOP) | 
|---|
| 83 | . S IEN="" | 
|---|
| 84 | . F  S IEN=$O(^AUPNVSIT("B",IBD,IEN)) Q:IEN=""  D  Q:$G(ZTSTOP) | 
|---|
| 85 | .. ; Update count for periodic check | 
|---|
| 86 | .. S IBCNETOT=IBCNETOT+1 | 
|---|
| 87 | .. ; Check for request to stop background job, periodically | 
|---|
| 88 | .. I $D(ZTQUEUED),IBCNETOT#100=0,$$S^%ZTLOAD() S ZTSTOP=1 Q | 
|---|
| 89 | .. ; | 
|---|
| 90 | .. S DFN=$P($G(^AUPNVSIT(IEN,0)),U,5) | 
|---|
| 91 | .. Q:DFN="" | 
|---|
| 92 | .. I $P($G(^DPT(DFN,0)),U,21) Q         ; Exclude if test patient | 
|---|
| 93 | .. Q:$D(^TMP("IBCNEDE4",$J,"PTS",DFN,"OUTP"))    ; already processed | 
|---|
| 94 | .. S ^TMP("IBCNEDE4",$J,"PTS",DFN,"OUTP",IBD)="" | 
|---|
| 95 | .. ; Capture the most recent (last) encounter date | 
|---|
| 96 | .. I $G(^TMP("IBJDI51",$J,DFN))<(IBD\1) D PROC^IBJDI5(DFN,"",IBD) | 
|---|
| 97 | Q | 
|---|
| 98 | ; | 
|---|
| 99 | REST(STARTDT,ENDDT) ; Check for a more recent encounter (inpat. or outpat.) | 
|---|
| 100 | ; | 
|---|
| 101 | NEW IBPM,IBPMD,IBD,DFN | 
|---|
| 102 | S DFN=0 | 
|---|
| 103 | F  S DFN=$O(^TMP("IBJDI51",$J,DFN)) Q:DFN=""  D | 
|---|
| 104 | . ; | 
|---|
| 105 | . ; inpatients | 
|---|
| 106 | . S IBPM=0 F  S IBPM=$O(^DGPM("C",DFN,IBPM)) Q:IBPM=""  D | 
|---|
| 107 | .. S IBPMD=$G(^DGPM(IBPM,0)) Q:'IBPMD | 
|---|
| 108 | .. S IBD=$P(IBPMD,U,1) I ((IBD\1)<STARTDT)!((IBD\1)>ENDDT) Q | 
|---|
| 109 | .. Q:$D(^TMP("IBJDI51",$J,"PTS",DFN,"INP",IBD))  ;already checked | 
|---|
| 110 | .. S ^TMP("IBJDI51",$J,"PTS",DFN,"INP",IBD)="" | 
|---|
| 111 | .. ; Capture the most recent (last) encounter date | 
|---|
| 112 | .. I $G(^TMP("IBJDI51",$J,DFN))<(IBD\1) D PROC^IBJDI5(DFN,"*",IBD) | 
|---|
| 113 | . ; | 
|---|
| 114 | . ; outpatients | 
|---|
| 115 | . S IBD="" F  S IBD=$O(^AUPNVSIT("AA",DFN,IBD)) Q:IBD=""  D | 
|---|
| 116 | .. I ((IBD\1)<STARTDT)!((IBD\1)>ENDDT) Q | 
|---|
| 117 | .. Q:$D(^TMP("IBJDI51",$J,"PTS",DFN,"OUTP",IBD))  ;already checked | 
|---|
| 118 | .. S ^TMP("IBJDI51",$J,"PTS",DFN,"OUTP",IBD)="" | 
|---|
| 119 | .. ; Capture the most recent (last) encounter date | 
|---|
| 120 | .. I $G(^TMP("IBJDI51",$J,DFN))<(IBD\1) D PROC^IBJDI5(DFN,"",IBD) | 
|---|
| 121 | ; | 
|---|
| 122 | Q | 
|---|
| 123 | ; | 
|---|
| 124 | PROCESS ;  Check selection criteria for each person with | 
|---|
| 125 | ;  a visit in the last defined time frame (e.g. 6 months) | 
|---|
| 126 | N SVIBDDI | 
|---|
| 127 | S DFN=0 F  S DFN=$O(^TMP("IBJDI51",$J,DFN)) Q:'DFN  D  Q:IBCNCNT'<MAXCNT!$G(ZTSTOP) | 
|---|
| 128 | . ; | 
|---|
| 129 | . ; Update count for periodic check | 
|---|
| 130 | . S IBCNETOT=IBCNETOT+1 | 
|---|
| 131 | . ; Check for request to stop background job, periodically | 
|---|
| 132 | . I $D(ZTQUEUED),IBCNETOT#100=0,$$S^%ZTLOAD() S ZTSTOP=1 Q | 
|---|
| 133 | . ; | 
|---|
| 134 | . S SRVICEDT=$P(^TMP("IBJDI51",$J,DFN),U) | 
|---|
| 135 | . S FRESHDT=$$FMADD^XLFDT(SRVICEDT,YDAYS) | 
|---|
| 136 | . ; | 
|---|
| 137 | . ; Call IB utility to search for patient's inactive insurance | 
|---|
| 138 | . ; IBCNS passes back IBINS = 1 if active insurance was found | 
|---|
| 139 | . ; IBCNS sets the array IBDD to the patient's valid insurance | 
|---|
| 140 | . ; IBCNS sets the array IBDDI to the patient's invalid insurance | 
|---|
| 141 | . ; | 
|---|
| 142 | . K IBINS,IBDD,IBDDI,SVIBDDI | 
|---|
| 143 | . S IBOUTP=2 | 
|---|
| 144 | . D ^IBCNS | 
|---|
| 145 | . K IBDD           ; don't need this array | 
|---|
| 146 | . I $G(IBINS)=1 Q  ; if active insurance was found quit | 
|---|
| 147 | . M SVIBDDI=IBDDI | 
|---|
| 148 | . ; | 
|---|
| 149 | . S (FOUND1,FOUND2)=0 | 
|---|
| 150 | . ; | 
|---|
| 151 | . ; Returned all inactive insurances in IBDDI array | 
|---|
| 152 | . I $D(IBDDI)>0,(IBCNCNT<MAXCNT) S FOUND2=$$INAC^IBCNEDE6(.IBCNCNT,MAXCNT,.IBDDI,SRVICEDT,YDAYS) | 
|---|
| 153 | . M IBDDI=SVIBDDI | 
|---|
| 154 | . ; | 
|---|
| 155 | . ;  If no inactive insurances, work the popular insurances | 
|---|
| 156 | . I IBCNCNT<MAXCNT S FOUND1=$$POP(.IBCNCNT,MAXCNT,SRVICEDT,YDAYS,,.IBDDI) | 
|---|
| 157 | . ; | 
|---|
| 158 | . I 'FOUND1,'FOUND2,(IBCNCNT<MAXCNT) D BLANKTQ^IBCNEDE6(SRVICEDT,FRESHDT,YDAYS,.IBCNCNT) | 
|---|
| 159 | K ^TMP("IBJDI51",$J),IBDD,IBDDI,IBINS | 
|---|
| 160 | Q | 
|---|
| 161 | ; | 
|---|
| 162 | POP(IBCNCNT,MAXCNT,SRVICEDT,FDAYS,APPTFLG,IBDDI) ; Get Popular Insurances | 
|---|
| 163 | ; FDAYS (Fresh Days value) | 
|---|
| 164 | ; APPTFLG - Appt extract flag ONLY set from IBCNEDE2 - optional 0/1 | 
|---|
| 165 | ; | 
|---|
| 166 | NEW PDATA,POPFL,PNUM,PCNT,II,RESULT,PAYER,PAYERID | 
|---|
| 167 | NEW DATA1,DATA2,TQIEN,FOUND,SIDARRAY,SID,SIDACT,SIDCNT | 
|---|
| 168 | NEW FRESHDT,INACT,SKIPPAY | 
|---|
| 169 | ; | 
|---|
| 170 | ; Need FOUND to avoid the creation of a no payer inquiry the day after | 
|---|
| 171 | ; the original inquiry for pre-reg (appt) extract and no insurance | 
|---|
| 172 | ; extract was created. | 
|---|
| 173 | S FOUND=0 ; set flag to 1 if potential inquiry was found | 
|---|
| 174 | ; | 
|---|
| 175 | S APPTFLG=$G(APPTFLG) | 
|---|
| 176 | S PDATA=$G(^IBE(350.9,1,51)) | 
|---|
| 177 | S POPFL=$P(PDATA,U,9),PNUM=$P(PDATA,U,10) | 
|---|
| 178 | S INACT=$P(PDATA,U,8)   ; get inactive flag from site parameters | 
|---|
| 179 | ; | 
|---|
| 180 | ;  If the search for popular insurances is 'No', quit | 
|---|
| 181 | I 'POPFL G POPX | 
|---|
| 182 | ; | 
|---|
| 183 | ; If the site does not check inactive insurances and the patient | 
|---|
| 184 | ; has inactive insurances, set up the array of payers to skip. | 
|---|
| 185 | ; This will be used to screen the patient's inactive payers from being | 
|---|
| 186 | ; included with the most popular payers. | 
|---|
| 187 | I 'INACT,$D(IBDDI) D | 
|---|
| 188 | . N INCP,INSPAYID | 
|---|
| 189 | . S INCP="" F  S INCP=$O(IBDDI(INCP)) Q:'INCP  D | 
|---|
| 190 | .. S RESULT=$$INSERROR^IBCNEUT3("I",INCP) | 
|---|
| 191 | .. Q:$P(RESULT,U)'="" | 
|---|
| 192 | .. S INSPAYID=$P(RESULT,U,3) | 
|---|
| 193 | .. I INSPAYID="" Q | 
|---|
| 194 | .. S SKIPPAY(INSPAYID)="" | 
|---|
| 195 | ; | 
|---|
| 196 | S FRESHDT=$$FMADD^XLFDT(SRVICEDT,-FDAYS) | 
|---|
| 197 | ; | 
|---|
| 198 | ;  If no list of popular insurances, quit | 
|---|
| 199 | I $O(^IBE(350.9,1,51.18,0))="" G POPX | 
|---|
| 200 | S II=0 F PCNT=1:1:PNUM S II=$O(^IBE(350.9,1,51.18,II)) Q:'II  D  Q:IBCNCNT'<MAXCNT | 
|---|
| 201 | . S PAYER=$P(^IBE(350.9,1,51.18,II,0),U,1) | 
|---|
| 202 | . ; | 
|---|
| 203 | . S RESULT=$$PAYER^IBCNEUT4(PAYER) | 
|---|
| 204 | . I $P(RESULT,U)'="" Q   ; quit if error, don't record in ins. buffer | 
|---|
| 205 | . ; PAYERID = National ID | 
|---|
| 206 | . S PAYERID=$P(RESULT,U,2) | 
|---|
| 207 | . I PAYERID="" Q | 
|---|
| 208 | . ; | 
|---|
| 209 | . I $D(SKIPPAY(PAYERID)) Q  ; quit if it was determined that this payer be skipped | 
|---|
| 210 | . ; | 
|---|
| 211 | . S FOUND=1  ; potential inquiry | 
|---|
| 212 | . ; | 
|---|
| 213 | . ; Update service date and freshness date based on payer allowed | 
|---|
| 214 | . ;  date range | 
|---|
| 215 | . D UPDDTS^IBCNEDE6(PAYER,.SRVICEDT,.FRESHDT) | 
|---|
| 216 | . ; | 
|---|
| 217 | . ; DAOU/BHS - Update service dates for inquiries to be transmitted | 
|---|
| 218 | . D TQUPDSV^IBCNEUT5(DFN,PAYER,SRVICEDT) | 
|---|
| 219 | . ; | 
|---|
| 220 | . ;check for outstanding/current entries in File 356.1 | 
|---|
| 221 | . ; Freshness check - are we allowed to add this entry to the TQ file | 
|---|
| 222 | . I '$$ADDTQ^IBCNEUT5(DFN,PAYER,SRVICEDT,FDAYS) Q | 
|---|
| 223 | . ; | 
|---|
| 224 | . ; Call function to set IIV TRANSMISSION QUEUE file #365.1 | 
|---|
| 225 | . ; | 
|---|
| 226 | . K SIDARRAY | 
|---|
| 227 | . S SIDACT=$$SIDCHK2^IBCNEDE5(DFN,PAYER,.SIDARRAY,FRESHDT) | 
|---|
| 228 | . S SIDCNT=$P(SIDACT,U,2),SIDACT=$P(SIDACT,U) | 
|---|
| 229 | . ;  Add to TQ to compensate for TQ w/ blank Sub ID | 
|---|
| 230 | . I SIDACT'<5,(SIDACT'>8) S SIDCNT=SIDCNT+1 | 
|---|
| 231 | . I IBCNCNT+SIDCNT>MAXCNT S IBCNCNT=MAXCNT Q     ; see if TQ entries will exceed MAXCNT | 
|---|
| 232 | . S SID="" | 
|---|
| 233 | . F  S SID=$O(SIDARRAY(SID)) Q:SID=""  D POPSET($P(SID,"_"),$P(SID,"_",2)) | 
|---|
| 234 | . ; | 
|---|
| 235 | . ; Create TQ entry w/ blank Sub ID | 
|---|
| 236 | . I SIDACT=5!(SIDACT=6)!(SIDACT=7)!(SIDACT=8) S SID="" D POPSET("","") ;D POPSET() | 
|---|
| 237 | POPX ; POP exit point | 
|---|
| 238 | Q FOUND | 
|---|
| 239 | ; | 
|---|
| 240 | POPSET(SID,INREC) ; | 
|---|
| 241 | N FRESH | 
|---|
| 242 | ; The hard coded '1' in the 3rd piece of DATA1 sets the Transmission | 
|---|
| 243 | ; status of file 365.1 to "Ready to Transmit" | 
|---|
| 244 | S FRESH=$$FMADD^XLFDT(SRVICEDT,-FDAYS) | 
|---|
| 245 | S DATA1=DFN_U_PAYER_U_1_U_""_U_SID_U_FRESH | 
|---|
| 246 | ; | 
|---|
| 247 | ; The hardcoded 1st piece of DATA2 tells file 365.1 which extract | 
|---|
| 248 | ; it is. | 
|---|
| 249 | I APPTFLG S DATA2=2  ; appt extract IBCNEDE2 | 
|---|
| 250 | I 'APPTFLG S DATA2=4 ; no ins extract IBCNEDE4 | 
|---|
| 251 | S DATA2=DATA2_U_"I"_U_SRVICEDT_U_$G(INREC) | 
|---|
| 252 | ; | 
|---|
| 253 | S TQIEN=$$SETTQ^IBCNEDE7(DATA1,DATA2) | 
|---|
| 254 | I TQIEN'="" S IBCNCNT=IBCNCNT+1 | 
|---|
| 255 | ; | 
|---|
| 256 | Q | 
|---|
| 257 | ; | 
|---|