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