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