| 1 | IBCNEDE2 ;DAOU/DAC - IIV PRE REG EXTRACT (APPTS) ;18-JUN-2002 | 
|---|
| 2 | ;;2.0;INTEGRATED BILLING;**184,271,249,345**;21-MAR-94;Build 28 | 
|---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | ;**Program Description** | 
|---|
| 6 | ;  This program finds veterans who are scheduled to be seen within a | 
|---|
| 7 | ;  specified date range. | 
|---|
| 8 | ;  Periodically check for stop request for background task | 
|---|
| 9 | ; | 
|---|
| 10 | Q   ; can't be called directly | 
|---|
| 11 | ; | 
|---|
| 12 | EN ; Loop through designated cross-references for updates | 
|---|
| 13 | ; Pre reg extract (Appointment extract) | 
|---|
| 14 | ; | 
|---|
| 15 | N TODAYSDT,FRESHDAY,SLCCRIT1,MAXCNT,CNT,ENDDT,CLNC,FRESHDT | 
|---|
| 16 | N APTDT,INREC,INSIEN,PAYER,PIEN,PAYERSTR,SYMBOL,SUPPBUFF | 
|---|
| 17 | N DFN,OK,VAIN,INS,DATA1,DATA2,ELG,PAYERID,SETSTR,SRVICEDT,ACTINS | 
|---|
| 18 | N TQIEN,IBINDT,IBOUTP,QURYFLAG,INSNAME,FOUND1,FOUND2,IBCNETOT | 
|---|
| 19 | N SID,SIDACT,SIDDATA,SCNT5,SIDARRAY,SIDCNT,IBDDI,IBINS,DISYS | 
|---|
| 20 | ; | 
|---|
| 21 | S SETSTR=$$SETTINGS^IBCNEDE7(2)     ;  Get setting for pre reg. extract | 
|---|
| 22 | I 'SETSTR Q                         ; Quit if extract is not active | 
|---|
| 23 | S SLCCRIT1=$P(SETSTR,U,2)           ; Selection Criteria #1 | 
|---|
| 24 | S MAXCNT=$P(SETSTR,U,4)             ; Max # of TQ entries to create | 
|---|
| 25 | S:MAXCNT="" MAXCNT=9999999999 | 
|---|
| 26 | S SUPPBUFF=$P(SETSTR,U,5)                   ; Suppress Buffer Flag | 
|---|
| 27 | S FRESHDAY=$P($G(^IBE(350.9,1,51)),U,1)     ; Freshness days span | 
|---|
| 28 | S CNT=0                                     ; Init. TQ entry counter | 
|---|
| 29 | S ENDDT=$$FMADD^XLFDT(DT,SLCCRIT1)   ; End of appt. date selection range | 
|---|
| 30 | S IBCNETOT=0               ; Initialize count for periodic TaskMan check | 
|---|
| 31 | K ^TMP($J,"SDAMA301"),^TMP("IBCNEDE2",$J)   ; Clean TMP globals | 
|---|
| 32 | ; | 
|---|
| 33 | S CLNC=0 ; Init. clinic | 
|---|
| 34 | ; Loop through clinics | 
|---|
| 35 | F  S CLNC=$O(^SC(CLNC)) Q:'CLNC!(CNT'<MAXCNT)  D  Q:$G(ZTSTOP) | 
|---|
| 36 | . ; | 
|---|
| 37 | . D CLINICEX Q:'OK     ; Check for clinic exclusion | 
|---|
| 38 | . ; | 
|---|
| 39 | . S ^TMP("IBCNEDE2",$J,CLNC)="" | 
|---|
| 40 | ; | 
|---|
| 41 | ; Set up variables for scheduling call and call | 
|---|
| 42 | S IBSDA("FLDS")=8 | 
|---|
| 43 | S IBSDA(1)=DT_";"_ENDDT | 
|---|
| 44 | S IBSDA(2)="^TMP(""IBCNEDE2"",$J," | 
|---|
| 45 | S IBSDA(3)="R" | 
|---|
| 46 | I $$SDAPI^SDAMA301(.IBSDA)<1 D ERRMSG G ENQ | 
|---|
| 47 | ; | 
|---|
| 48 | ; | 
|---|
| 49 | S CLNC=0 ; Init. clinic | 
|---|
| 50 | ; Loop through clinics returned | 
|---|
| 51 | F  S CLNC=$O(^TMP($J,"SDAMA301",CLNC)) Q:'CLNC  D  Q:$G(ZTSTOP)!(CNT'<MAXCNT) | 
|---|
| 52 | . ; | 
|---|
| 53 | . ; Loop through patients returned | 
|---|
| 54 | . S DFN=0 F  S DFN=$O(^TMP($J,"SDAMA301",CLNC,DFN)) Q:'DFN!(CNT'<MAXCNT)  D  Q:$G(ZTSTOP) | 
|---|
| 55 | .. ; | 
|---|
| 56 | .. S APTDT=DT           ; Check for appointment date | 
|---|
| 57 | .. ; | 
|---|
| 58 | .. ; Loop through dates in range at clinic | 
|---|
| 59 | .. F  S APTDT=$O(^TMP($J,"SDAMA301",CLNC,DFN,APTDT)) Q:('APTDT)!((APTDT\1)>ENDDT)!(CNT'<MAXCNT)  D  Q:$G(ZTSTOP) | 
|---|
| 60 | ... ; | 
|---|
| 61 | ... S SRVICEDT=APTDT\1 ;Set service date equal to appointment date | 
|---|
| 62 | ... S FRESHDT=$$FMADD^XLFDT(SRVICEDT,-FRESHDAY) | 
|---|
| 63 | ... ; | 
|---|
| 64 | ... ; Update count for periodic check | 
|---|
| 65 | ... S IBCNETOT=IBCNETOT+1 | 
|---|
| 66 | ... ; Check for request to stop background job, periodically | 
|---|
| 67 | ... I $D(ZTQUEUED),IBCNETOT#100=0,$$S^%ZTLOAD() S ZTSTOP=1 Q | 
|---|
| 68 | ... ; | 
|---|
| 69 | ... S IBSDATA=$G(^TMP($J,"SDAMA301",CLNC,DFN,APTDT)) | 
|---|
| 70 | ... S ELG=$P(IBSDATA,U,8) | 
|---|
| 71 | ... S ELG=$S(ELG'="":ELG,1:$P($G(^DPT(DFN,.36)),U,1)) | 
|---|
| 72 | ... I $P($G(^DPT(DFN,0)),U,21) Q         ; Exclude if test patient | 
|---|
| 73 | ... I $P($G(^DPT(DFN,.35)),"^",1)'="" Q  ; Exclude if patient is deceased | 
|---|
| 74 | ... ; | 
|---|
| 75 | ... D ELG Q:'OK     ; Check for eligibility exclusion | 
|---|
| 76 | ... ; D INP Q:'OK     ; No longer check for inpatient status | 
|---|
| 77 | ... ; | 
|---|
| 78 | ... K ACTINS | 
|---|
| 79 | ... D ALL^IBCNS1(DFN,"ACTINS",1) | 
|---|
| 80 | ... ; | 
|---|
| 81 | ... I '$D(ACTINS(0)) D NOACTIVE Q   ; Patient has no active ins | 
|---|
| 82 | ... ; | 
|---|
| 83 | ... S INREC=0 ; Record ien | 
|---|
| 84 | ... F  S INREC=$O(ACTINS(INREC)) Q:('INREC)!(CNT'<MAXCNT)  D | 
|---|
| 85 | ... . S INSIEN=$P($G(ACTINS(INREC,0)),U,1) ; Insurance ien | 
|---|
| 86 | ... . S INSNAME=$P($G(^DIC(36,INSIEN,0)),U) | 
|---|
| 87 | ... . ; | 
|---|
| 88 | ... . ; check for ins. to exclude (i.e. Medicare/Medicaid) | 
|---|
| 89 | ... . I $$EXCLUDE^IBCNEUT4(INSNAME) Q | 
|---|
| 90 | ... . ; | 
|---|
| 91 | ... . S PAYERSTR=$$INSERROR^IBCNEUT3("I",INSIEN) ; Get payer info | 
|---|
| 92 | ... . ; | 
|---|
| 93 | ... . S SYMBOL=+PAYERSTR ; error symbol | 
|---|
| 94 | ... . S PAYERID=$P(PAYERSTR,U,3)               ; (National ID) payer id | 
|---|
| 95 | ... . S PIEN=$P(PAYERSTR,U,2)                  ; Payer ien | 
|---|
| 96 | ... . ; | 
|---|
| 97 | ... . ; If error symbol exists, set record in insurance buffer & quit | 
|---|
| 98 | ... . I SYMBOL D  Q | 
|---|
| 99 | ... . . I 'SUPPBUFF,'$$BFEXIST^IBCNEUT5(DFN,INSNAME) D PT^IBCNEBF(DFN,INREC,SYMBOL,"",1) | 
|---|
| 100 | ... . ; | 
|---|
| 101 | ... . ; Update service date and freshness date based on payers allowed | 
|---|
| 102 | ... . ;  date range | 
|---|
| 103 | ... . D UPDDTS^IBCNEDE6(PIEN,.SRVICEDT,.FRESHDT) | 
|---|
| 104 | ... . ; | 
|---|
| 105 | ... . ; Update service dates for inquiry to be transmitted | 
|---|
| 106 | ... . D TQUPDSV^IBCNEUT5(DFN,PIEN,SRVICEDT) | 
|---|
| 107 | ... . ; | 
|---|
| 108 | ... . ; Quit before filing if outstanding entries in TQ | 
|---|
| 109 | ... . I '$$ADDTQ^IBCNEUT5(DFN,PIEN,SRVICEDT,FRESHDAY) Q | 
|---|
| 110 | ... . ; | 
|---|
| 111 | ... . S QURYFLAG="V" | 
|---|
| 112 | ... . K SIDARRAY | 
|---|
| 113 | ... . S SIDDATA=$$SIDCHK^IBCNEDE5(PIEN,DFN,,.SIDARRAY,FRESHDT) | 
|---|
| 114 | ... . S SIDACT=$P(SIDDATA,U),SIDCNT=$P(SIDDATA,U,2) | 
|---|
| 115 | ... . I SIDACT=3,'SUPPBUFF,'$$BFEXIST^IBCNEUT5(DFN,INSNAME) D PT^IBCNEBF(DFN,INREC,18,"",1) Q | 
|---|
| 116 | ... . S SCNT5=$S(SIDACT=5:1,1:0) | 
|---|
| 117 | ... . I CNT+SCNT5+SIDCNT>MAXCNT S CNT=MAXCNT Q  ;exceeds MAXCNT | 
|---|
| 118 | ... . ; | 
|---|
| 119 | ... . S SID="" | 
|---|
| 120 | ... . F  S SID=$O(SIDARRAY(SID)) Q:SID=""  D SET($P(SID,"_"),$P(SID,"_",2)) | 
|---|
| 121 | ... . I SIDACT=4!(SIDACT=5) D SET("","") | 
|---|
| 122 | ... . Q | 
|---|
| 123 | ... Q | 
|---|
| 124 | ENQ K ^TMP($J,"SDAMA301"),^TMP("IBCNEDE2",$J) | 
|---|
| 125 | Q | 
|---|
| 126 | ; | 
|---|
| 127 | CLINICEX ; Clinic exclusion | 
|---|
| 128 | S OK=1 | 
|---|
| 129 | I $D(^DG(43,1,"DGPREC","B",CLNC)) S OK=0 | 
|---|
| 130 | Q | 
|---|
| 131 | ; | 
|---|
| 132 | ELG ;  Eligibility exclusion | 
|---|
| 133 | I ELG="" S OK=0 Q | 
|---|
| 134 | I $D(^DG(43,1,"DGPREE","B",ELG)) S OK=0 Q | 
|---|
| 135 | S OK=1 | 
|---|
| 136 | Q | 
|---|
| 137 | ; | 
|---|
| 138 | INP ;  Inpatient status | 
|---|
| 139 | D INP^VADPT | 
|---|
| 140 | I $G(VAIN(1))'="" K VAIN S OK=0 Q | 
|---|
| 141 | K VAIN | 
|---|
| 142 | S OK=1 | 
|---|
| 143 | Q | 
|---|
| 144 | ; | 
|---|
| 145 | NOACTIVE ; No active insurance | 
|---|
| 146 | ; | 
|---|
| 147 | ; Call IB utility to search for patient's inactive insurance | 
|---|
| 148 | ; IBCNS passes back IBINS = 1 if active insurance was found | 
|---|
| 149 | ; IBCNS sets the array IBDD to the patient's valid insurance | 
|---|
| 150 | ; IBCNS sets the array IBDDI to the patient's invalid insurance | 
|---|
| 151 | ; | 
|---|
| 152 | N SVIBDDI | 
|---|
| 153 | K IBINS,IBDD,IBDDI | 
|---|
| 154 | S IBINDT=APTDT,IBOUTP=2,(FOUND1,FOUND2)=0 | 
|---|
| 155 | ; | 
|---|
| 156 | D ^IBCNS | 
|---|
| 157 | K IBDD           ; don't need this array | 
|---|
| 158 | I $G(IBINS)=1 Q  ; if active insurance was found quit | 
|---|
| 159 | M SVIBDDI=IBDDI | 
|---|
| 160 | ; Inactive Insurance | 
|---|
| 161 | I CNT<MAXCNT,$D(IBDDI)>0 S FOUND2=$$INAC^IBCNEDE6(.CNT,MAXCNT,.IBDDI,SRVICEDT,FRESHDAY,1) | 
|---|
| 162 | M IBDDI=SVIBDDI | 
|---|
| 163 | ; | 
|---|
| 164 | ; Most Popular Payer | 
|---|
| 165 | I CNT<MAXCNT S FOUND1=$$POP^IBCNEDE4(.CNT,MAXCNT,SRVICEDT,FRESHDAY,1,.IBDDI) | 
|---|
| 166 | ; | 
|---|
| 167 | I 'FOUND1,'FOUND2,(CNT<MAXCNT) D BLANKTQ | 
|---|
| 168 | ; | 
|---|
| 169 | K INS,IBBDI | 
|---|
| 170 | Q | 
|---|
| 171 | ; | 
|---|
| 172 | SET(SID,INR) ; Set data in TQ | 
|---|
| 173 | ; | 
|---|
| 174 | ; The hard coded '1' in the 3rd piece of DATA1 sets the Transmission | 
|---|
| 175 | ; status of file 365.1 to "Ready to Transmit" | 
|---|
| 176 | S DATA1=DFN_U_PIEN_U_1_U_""_U_SID_U_FRESHDT ; SETTQ 1st parameter | 
|---|
| 177 | ; | 
|---|
| 178 | ; The hardcoded '2' in the 1st piece of DATA2 is the value to tell | 
|---|
| 179 | ; the file 365.1 that it is the appointment extract. | 
|---|
| 180 | S DATA2=2_U_QURYFLAG_U_SRVICEDT_U_INR    ; SETTQ 2nd parameter | 
|---|
| 181 | ; | 
|---|
| 182 | S TQIEN=$$SETTQ^IBCNEDE7(DATA1,DATA2)       ; Sets in TQ | 
|---|
| 183 | I TQIEN'="" S CNT=CNT+1                    ; If filed increment count | 
|---|
| 184 | ; | 
|---|
| 185 | Q | 
|---|
| 186 | ; | 
|---|
| 187 | BLANKTQ ; no new records were created in file 365.1 for this DFN | 
|---|
| 188 | ; need to check if a blank inquiry exists (patient w/o a payer) | 
|---|
| 189 | ; if it doesn't exist create a new blank inquiry | 
|---|
| 190 | ; | 
|---|
| 191 | ; Check for at least 1 other VAMC a patient has traveled to | 
|---|
| 192 | I $$TFL^IBCNEDE6(DFN)=0 Q | 
|---|
| 193 | ; | 
|---|
| 194 | N DISYS | 
|---|
| 195 | S PIEN=$$FIND1^DIC(365.12,,"X","~NO PAYER"),SID="" | 
|---|
| 196 | ; | 
|---|
| 197 | ; Update service date and freshness date based on payer allowed | 
|---|
| 198 | ;  date range | 
|---|
| 199 | D UPDDTS^IBCNEDE6(PIEN,.SRVICEDT,.FRESHDT) | 
|---|
| 200 | ; | 
|---|
| 201 | ; Update service dates for inquiry to be transmitted - necessary here? | 
|---|
| 202 | D TQUPDSV^IBCNEUT5(DFN,PIEN,SRVICEDT) | 
|---|
| 203 | ; | 
|---|
| 204 | I '$$ADDTQ^IBCNEUT5(DFN,PIEN,SRVICEDT,FRESHDAY,1) G BLANKXT | 
|---|
| 205 | ; | 
|---|
| 206 | S QURYFLAG="I" D SET("","") | 
|---|
| 207 | S PIEN="" | 
|---|
| 208 | BLANKXT ; | 
|---|
| 209 | Q | 
|---|
| 210 | ; | 
|---|
| 211 | ERRMSG ; Send a message indicating an extract error has occured | 
|---|
| 212 | N MGRP,XMSUB,MSG,IBX,IBM | 
|---|
| 213 | ; | 
|---|
| 214 | ; Set to IB site parameter MAILGROUP | 
|---|
| 215 | S MGRP=$$MGRP^IBCNEUT5() | 
|---|
| 216 | ; | 
|---|
| 217 | S XMSUB="IIV Problem: Appointment Extract" | 
|---|
| 218 | S MSG(1)="On "_$$FMTE^XLFDT(DT)_" the Appointment Extract for IIV encountered one or more" | 
|---|
| 219 | S MSG(2)="errors while attempting to get Appointment data from the scheduling" | 
|---|
| 220 | S MSG(3)="package." | 
|---|
| 221 | S MSG(4)="" | 
|---|
| 222 | S MSG(5)="Error(s) encountered: " | 
|---|
| 223 | S MSG(6)="" | 
|---|
| 224 | S MSG(7)="  Error Code   Error Message" | 
|---|
| 225 | S MSG(8)="  ----------   -------------" | 
|---|
| 226 | S IBM=8,IBX=0 F  S IBX=$O(^TMP($J,"SDAMA301",IBX)) Q:IBX=""  S IBM=IBM+1,MSG(IBM)="  "_$$LJ^XLFSTR(IBX,13)_$G(^TMP($J,"SDAMA301",IBX)) | 
|---|
| 227 | S IBM=IBM+1,MSG(IBM)="" | 
|---|
| 228 | S IBM=IBM+1,MSG(IBM)="As a result of this error the extract was not done.  The extract" | 
|---|
| 229 | S IBM=IBM+1,MSG(IBM)="will be attempted again the next night automatically.  If you" | 
|---|
| 230 | S IBM=IBM+1,MSG(IBM)="continue to receive error messages you should contact your IRM" | 
|---|
| 231 | S IBM=IBM+1,MSG(IBM)="and possibly log a NOIS call for assistance." | 
|---|
| 232 | ; | 
|---|
| 233 | D MSG^IBCNEUT5(MGRP,XMSUB,"MSG(") | 
|---|
| 234 | ; | 
|---|
| 235 | Q | 
|---|