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