| 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
|
---|