| [613] | 1 | IBCNEUT4 ;DAOU/ESG - eIV MISC. UTILITIES ;17-JUN-2002 | 
|---|
|  | 2 | ;;2.0;INTEGRATED BILLING;**184,271,345**;21-MAR-94;Build 28 | 
|---|
|  | 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
|  | 4 | ; | 
|---|
|  | 5 | ; Can't be called from the top | 
|---|
|  | 6 | Q | 
|---|
|  | 7 | ; | 
|---|
|  | 8 | ; | 
|---|
|  | 9 | ACTIVE(INSDA) ; Is this insurance company currently active?  1:yes or 0:no | 
|---|
|  | 10 | ; Insurance company name returned in the second piece. | 
|---|
|  | 11 | ; Input:  INSDA - insurance company ien | 
|---|
|  | 12 | NEW ACTFLG,INSDATA | 
|---|
|  | 13 | S ACTFLG=0                                  ; default inactive | 
|---|
|  | 14 | I '$G(INSDA) G ACTIVEX                      ; bad data passed in | 
|---|
|  | 15 | S INSDATA=$G(^DIC(36,INSDA,0))              ; zero node of File 36 | 
|---|
|  | 16 | I INSDATA="" G ACTIVEX                      ; bad record | 
|---|
|  | 17 | I $P(INSDATA,U,5) G ACTIVEX                 ; INACTIVE flag is true | 
|---|
|  | 18 | I $P($G(^DIC(36,INSDA,5)),U,1) G ACTIVEX    ; SCHEDULED FOR DELETION flag is true | 
|---|
|  | 19 | S ACTFLG=1                                  ; Otherwise, its active | 
|---|
|  | 20 | ACTIVEX ; | 
|---|
|  | 21 | Q ACTFLG_U_$P($G(^DIC(36,+$G(INSDA),0)),U,1) | 
|---|
|  | 22 | ; | 
|---|
|  | 23 | ; | 
|---|
|  | 24 | EXCLUDE(NAME) ; This function determines if we should exclude the insurance | 
|---|
|  | 25 | ; company based on the name. | 
|---|
|  | 26 | ; This function returns 1 if we should exclude the insurance company. | 
|---|
|  | 27 | ; This function returns 0 if we should not exclude it (i.e. include it) | 
|---|
|  | 28 | ; | 
|---|
|  | 29 | ; Initialize flag; default to not exclude it | 
|---|
|  | 30 | NEW EXCL | 
|---|
|  | 31 | S EXCL=0 | 
|---|
|  | 32 | ; | 
|---|
|  | 33 | ; Screen out bad data | 
|---|
|  | 34 | I $G(NAME)="" S EXCL=1 G EXCLUDX | 
|---|
|  | 35 | ; | 
|---|
|  | 36 | ; Screen out MEDICAID or MEDICARE ins co names | 
|---|
|  | 37 | I NAME["MEDICAID"!(NAME["MEDICARE") S EXCL=1 G EXCLUDX | 
|---|
|  | 38 | EXCLUDX ; | 
|---|
|  | 39 | Q EXCL | 
|---|
|  | 40 | ; | 
|---|
|  | 41 | ; | 
|---|
|  | 42 | CLEAR(DA,EDITED,FORCE) ; This procedure will clear the eIV status field from an | 
|---|
|  | 43 | ; Insurance Buffer entry (pass in the internal entry number of the | 
|---|
|  | 44 | ; buffer entry).  If the FORCE variable is not passed then the eIV | 
|---|
|  | 45 | ; status will only be cleared if the existing status is an error status | 
|---|
|  | 46 | ; | 
|---|
|  | 47 | ; Parameters | 
|---|
|  | 48 | ;        DA - required input parameter; buffer ien | 
|---|
|  | 49 | ;    EDITED - optional output parameter; this will tell you if the | 
|---|
|  | 50 | ;             buffer symbol was cleared | 
|---|
|  | 51 | ;     FORCE - optional input parameter; if this is set to 1 then the | 
|---|
|  | 52 | ;             eIV status field will be cleared regardless of the | 
|---|
|  | 53 | ;             current status | 
|---|
|  | 54 | NEW DIE,DR,D,D0,DI,DIC,DISYS,DQ,X,% | 
|---|
|  | 55 | I '$G(DA) G CLEARX | 
|---|
|  | 56 | I '$D(FORCE) S FORCE=0 | 
|---|
|  | 57 | I 'FORCE,$$SYMBOL^IBCNBLL(DA)'="!" G CLEARX | 
|---|
|  | 58 | S DIE=355.33,DR=".12///@" | 
|---|
|  | 59 | D ^DIE | 
|---|
|  | 60 | S EDITED=1 | 
|---|
|  | 61 | CLEARX ; | 
|---|
|  | 62 | Q | 
|---|
|  | 63 | ; | 
|---|
|  | 64 | ; | 
|---|
|  | 65 | INFO(IBBUFDA) ; Return original and current buffer data | 
|---|
|  | 66 | ; This procedure will retrieve the following data from the buffer and | 
|---|
|  | 67 | ; from the transmission queue file.  The buffer holds the current data | 
|---|
|  | 68 | ; and the TQ file holds the original buffer data. | 
|---|
|  | 69 | ; Input | 
|---|
|  | 70 | ;    IBBUFDA - buffer internal entry number | 
|---|
|  | 71 | ; Output | 
|---|
|  | 72 | ;    a pieced string as follows | 
|---|
|  | 73 | ;    [1]  Has this buffer entry been transmitted? 1/0 | 
|---|
|  | 74 | ;    [2]  Current buffer source of information (external) | 
|---|
|  | 75 | ;    [3]  Current buffer source of information (internal) | 
|---|
|  | 76 | ;    [4]  Current buffer insurance company name | 
|---|
|  | 77 | ;    [5]  Current buffer group number | 
|---|
|  | 78 | ;    [6]  Current buffer group name | 
|---|
|  | 79 | ;    [7]  Current buffer subscriber ID | 
|---|
|  | 80 | ;    [8]  Original buffer insurance company name | 
|---|
|  | 81 | ;    [9]  Original buffer group number | 
|---|
|  | 82 | ;   [10]  Original buffer group name | 
|---|
|  | 83 | ;   [11]  Original buffer subscriber ID | 
|---|
|  | 84 | ; | 
|---|
|  | 85 | NEW IB0,IB20,IB40,IB60,DATA,RESPIEN,FOUND,TQIEN,TQDATA,TQDATA1,DISYS | 
|---|
|  | 86 | S DATA="" | 
|---|
|  | 87 | I '$G(IBBUFDA) G INFOX | 
|---|
|  | 88 | I '$D(^IBA(355.33,IBBUFDA)) G INFOX | 
|---|
|  | 89 | S IB0=$G(^IBA(355.33,IBBUFDA,0)) | 
|---|
|  | 90 | S IB20=$G(^IBA(355.33,IBBUFDA,20)) | 
|---|
|  | 91 | S IB40=$G(^IBA(355.33,IBBUFDA,40)) | 
|---|
|  | 92 | S IB60=$G(^IBA(355.33,IBBUFDA,60)) | 
|---|
|  | 93 | S $P(DATA,U,1)=0    ; default to not been transmitted | 
|---|
|  | 94 | S $P(DATA,U,2)=$$EXTERNAL^DILFD(355.33,.03,"",$P(IB0,U,3))  ; source | 
|---|
|  | 95 | S $P(DATA,U,3)=$P(IB0,U,3)     ; internal source | 
|---|
|  | 96 | S $P(DATA,U,4)=$P(IB20,U,1)    ; insurance company name | 
|---|
|  | 97 | S $P(DATA,U,5)=$P(IB40,U,3)    ; group number | 
|---|
|  | 98 | S $P(DATA,U,6)=$P(IB40,U,2)    ; group name | 
|---|
|  | 99 | S $P(DATA,U,7)=$P(IB60,U,4)    ; subscriber id | 
|---|
|  | 100 | ; | 
|---|
|  | 101 | ; Look at the response file and the transmission queue file.  Since | 
|---|
|  | 102 | ; we're trying to get the original data look at the oldest data first. | 
|---|
|  | 103 | S RESPIEN=0,FOUND=0 | 
|---|
|  | 104 | F  S RESPIEN=$O(^IBCN(365,"AF",IBBUFDA,RESPIEN)) Q:'RESPIEN  D  Q:FOUND | 
|---|
|  | 105 | . S TQIEN=$P($G(^IBCN(365,RESPIEN,0)),U,5) | 
|---|
|  | 106 | . I 'TQIEN Q | 
|---|
|  | 107 | . S TQDATA=$G(^IBCN(365.1,TQIEN,0)) | 
|---|
|  | 108 | . S TQDATA1=$G(^IBCN(365.1,TQIEN,1)) | 
|---|
|  | 109 | . I TQDATA="" Q | 
|---|
|  | 110 | . S $P(DATA,U,8)=$P(TQDATA1,U,2)    ; insurance company name | 
|---|
|  | 111 | . S $P(DATA,U,9)=$P(TQDATA1,U,3)    ; group number | 
|---|
|  | 112 | . S $P(DATA,U,10)=$P(TQDATA1,U,4)    ; group name | 
|---|
|  | 113 | . S $P(DATA,U,11)=$P(TQDATA1,U,5)    ; subscriber id | 
|---|
|  | 114 | . S FOUND=1                          ; Stop once we have some data | 
|---|
|  | 115 | . Q | 
|---|
|  | 116 | ; | 
|---|
|  | 117 | I FOUND S $P(DATA,U,1)=1 | 
|---|
|  | 118 | INFOX ; | 
|---|
|  | 119 | Q DATA | 
|---|
|  | 120 | ; | 
|---|
|  | 121 | ; | 
|---|
|  | 122 | VALID(INSIEN,PAYIEN,PAYID,SYMIEN) ; Validate an Ins Co IEN | 
|---|
|  | 123 | ; Input parameter: INSIEN - Ins co IEN, passed by value | 
|---|
|  | 124 | ; Output parameters: PAYIEN, PAYID, SYMIEN, passed by reference | 
|---|
|  | 125 | N APPDATA,APPIEN,INSNAME | 
|---|
|  | 126 | ; Retrieve the Ins Co name | 
|---|
|  | 127 | S INSNAME=$P($G(^DIC(36,INSIEN,0)),U,1) | 
|---|
|  | 128 | I INSNAME="" S SYMIEN=$$ERROR^IBCNEUT8("B9","Insurance company IEN "_INSIEN_" doesn't have a name on file.") G VALIDX | 
|---|
|  | 129 | ; Screen out MEDICAID or MEDICARE ins co names | 
|---|
|  | 130 | I $$EXCLUDE(INSNAME) S SYMIEN=$$ERROR^IBCNEUT8("B11","Insurance company "_INSNAME_" contains MEDICAID or MEDICARE in the name.  Electronic inquiries cannot be made to this insurance company.") G VALIDX | 
|---|
|  | 131 | ; Retrieve the Payer IEN associated with this ins co | 
|---|
|  | 132 | S PAYIEN=$P($G(^DIC(36,INSIEN,3)),U,10) | 
|---|
|  | 133 | I PAYIEN="" S SYMIEN=$$ERROR^IBCNEUT8("B4","Insurance company "_INSNAME_" is not linked to a Payer.") G VALIDX | 
|---|
|  | 134 | D VALPYR(INSNAME) ; Payer val'n | 
|---|
|  | 135 | VALIDX ; | 
|---|
|  | 136 | Q | 
|---|
|  | 137 | ; | 
|---|
|  | 138 | PAYER(PAYIEN) ; | 
|---|
|  | 139 | ; Entry pt for Most Pop Payer (called by POP^IBCNEDE4) | 
|---|
|  | 140 | N SYMIEN,PAYID | 
|---|
|  | 141 | N APPDATA,APPIEN ; Set within tag VALPYR these variables are never | 
|---|
|  | 142 | ;                  killed. Using tag VALID's method of NEWing variables | 
|---|
|  | 143 | ;                  first will allow them to be killed appropriately. | 
|---|
|  | 144 | N ARRAY ; This is an array that is set by ERROR^IBCNEUT8 but never | 
|---|
|  | 145 | ;         killed.  When there is a most popular payer that is not | 
|---|
|  | 146 | ;         eligible for inquiries, ARRAY would continue to grow. | 
|---|
|  | 147 | S (SYMIEN,PAYID)="" | 
|---|
|  | 148 | D VALPYR("") | 
|---|
|  | 149 | Q SYMIEN_U_PAYID | 
|---|
|  | 150 | ; | 
|---|
|  | 151 | VALPYR(INSNM) ; | 
|---|
|  | 152 | ; Payer Val'n - note: PAYIEN (payer IEN) must be set | 
|---|
|  | 153 | ; If INSNM="" val'n is for Most Pop Payer | 
|---|
|  | 154 | N PAYNM | 
|---|
|  | 155 | ; | 
|---|
|  | 156 | S INSNM=$G(INSNM) ; Init variable if not passed | 
|---|
|  | 157 | ; Retrieve the National ID(Payer ID) for this Payer IEN | 
|---|
|  | 158 | S PAYID=$P($G(^IBE(365.12,PAYIEN,0)),U,2) | 
|---|
|  | 159 | I PAYID="" S SYMIEN=$$ERROR^IBCNEUT8("B9","Payer IEN "_PAYIEN_" does not have a Payer.") Q | 
|---|
|  | 160 | ; Retrieve payer name | 
|---|
|  | 161 | S PAYNM=$P($G(^IBE(365.12,PAYIEN,0)),U,1) | 
|---|
|  | 162 | ; Retrieve the IEN of the eIV Application | 
|---|
|  | 163 | S APPIEN=$$PYRAPP^IBCNEUT5("IIV",PAYIEN) | 
|---|
|  | 164 | I APPIEN="" S SYMIEN=$$ERROR^IBCNEUT8("B9","The eIV Payer Application has not been created for this site.") Q | 
|---|
|  | 165 | ; Verify the existence of the application for this Payer | 
|---|
|  | 166 | I '$D(^IBE(365.12,PAYIEN,1,APPIEN)) S SYMIEN=$$ERROR^IBCNEUT8("B7","Insurance company "_INSNM_" is linked to Payer "_PAYNM_" which is not set up to accept electronic insurance eligibility requests.") Q | 
|---|
|  | 167 | ; Retrieve the eIV-specific application data for this Payer | 
|---|
|  | 168 | S APPDATA=$G(^IBE(365.12,PAYIEN,1,APPIEN,0)) | 
|---|
|  | 169 | ; Check if the Payer doesn't have either an active national or an | 
|---|
|  | 170 | ; active local connection and return one or, if applicable, BOTH errors | 
|---|
|  | 171 | I '$P(APPDATA,U,3) S SYMIEN=$$ERROR^IBCNEUT8("B6","Insurance company "_INSNM_" is linked to Payer "_PAYNM_" which is not locally active for eIV.") | 
|---|
|  | 172 | I '$P(APPDATA,U,2) S SYMIEN=$$ERROR^IBCNEUT8("B5","Insurance company "_INSNM_" is linked to Payer "_PAYNM_" which is not nationally active for eIV.") | 
|---|
|  | 173 | ; Check if the Payer has been deactivated, if so report it | 
|---|
|  | 174 | I $P(APPDATA,U,11) S SYMIEN=$$ERROR^IBCNEUT8("B14","Insurance company "_INSNM_" is linked to Payer "_PAYNM_" which has been deactivated as of "_$$FMTE^XLFDT($P(APPDATA,U,12),"5Z")_".") | 
|---|
|  | 175 | Q | 
|---|
|  | 176 | ; | 
|---|
|  | 177 | MULTNAME(TEXT,LIST) ; Function to return an error message with a list of multiple names | 
|---|
|  | 178 | ; Input parameters: | 
|---|
|  | 179 | ;  TEXT - Error text to display | 
|---|
|  | 180 | ;  LIST - List of items, can be either a list of ins co | 
|---|
|  | 181 | ;         names or National ID names | 
|---|
|  | 182 | ; Output parameter: Function value - Formatted list of items in 1 string | 
|---|
|  | 183 | N COLIST,I,NAME,TOOLONG | 
|---|
|  | 184 | S NAME="",COLIST=TEXT,TOOLONG=0 | 
|---|
|  | 185 | F I=1:1 S NAME=$O(LIST(NAME)) Q:NAME=""  D  Q:TOOLONG | 
|---|
|  | 186 | . ; Add this name to the list of found names | 
|---|
|  | 187 | . I I=1 S COLIST=COLIST_": "_NAME | 
|---|
|  | 188 | . E  S COLIST=COLIST_", "_NAME | 
|---|
|  | 189 | . ; check if the list of items may cause a MAXSTRING error | 
|---|
|  | 190 | . I $L(COLIST)<450 Q | 
|---|
|  | 191 | . S COLIST=COLIST_" (Too many items to display)",TOOLONG=1 | 
|---|
|  | 192 | ; | 
|---|
|  | 193 | Q COLIST_"." | 
|---|
|  | 194 | ; | 
|---|