| 1 | IBCNEUT3 ;DAOU/AM - IIV MISC. UTILITIES ;12-JUN-2002
 | 
|---|
| 2 |  ;;2.0;INTEGRATED BILLING;**184,252,271**;21-MAR-94
 | 
|---|
| 3 |  ;;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  ; The purpose of the INSERROR utility is to identify a legitimate
 | 
|---|
| 6 |  ; Insurance Company name, returning the associated Payer IEN and
 | 
|---|
| 7 |  ; National ID.  This extrinsic function can receive either Insurance or
 | 
|---|
| 8 |  ; Buffer data, identified as TYPE I or B, respectively.
 | 
|---|
| 9 |  ;
 | 
|---|
| 10 |  ; The former is the simpler case.  The IEN, in this case the Insurance
 | 
|---|
| 11 |  ; IEN, is validated using the following criteria (some of which is
 | 
|---|
| 12 |  ; validated in routine IBCNEUT4) :
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 |  ; [1] Does it have a National ID?
 | 
|---|
| 15 |  ; [2] Does the National ID have IIV defined?
 | 
|---|
| 16 |  ; [3] Is the Payer active (i.e. the deactivated flag is turned off)
 | 
|---|
| 17 |  ; [4] Is the national connection enabled?
 | 
|---|
| 18 |  ; [5] Is the National ID blocked by VISTA?
 | 
|---|
| 19 |  ;
 | 
|---|
| 20 |  ; If all 5 criteria are met, the Payer IEN and National ID are
 | 
|---|
| 21 |  ; returned.  If not, an error is generated and returned in ARRAY with
 | 
|---|
| 22 |  ; information specific to the type of problem encountered.
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 |  ; If the TYPE passed is B for Buffer, the IEN is the Buffer IEN.
 | 
|---|
| 25 |  ; The Insurance Company name is retrieved from the Buffer file and
 | 
|---|
| 26 |  ; leading and trailing spaces are stripped.  This value is compared to
 | 
|---|
| 27 |  ; the entries in the "B" cross reference of the Insurance Company file
 | 
|---|
| 28 |  ; (whose values have also been stripped of leading and trailing spaces).
 | 
|---|
| 29 |  ; If a match (or several matches) is found,and a unique National ID is
 | 
|---|
| 30 |  ; identified, confirm the 5 set of insurance validation criteria and
 | 
|---|
| 31 |  ; process as above.
 | 
|---|
| 32 |  ;
 | 
|---|
| 33 |  ; If no match in the Insurance Company could be made, check the Auto
 | 
|---|
| 34 |  ; Match file.  If a unique IEN is identified, confirm the 5 set of
 | 
|---|
| 35 |  ; criteria stated above and process in kind.
 | 
|---|
| 36 |  ;
 | 
|---|
| 37 |  ; If no match could be established in both the Insurance Company and the
 | 
|---|
| 38 |  ; Auto Match files, check the insurance company synonym file (stripping 
 | 
|---|
| 39 |  ; off leading and trailing spaces) while preserving case sensitivity.
 | 
|---|
| 40 |  ; If a unique Insurance Company could be identified, confirm the 5 set
 | 
|---|
| 41 |  ; of validation criteria and process as above. 
 | 
|---|
| 42 |  ;
 | 
|---|
| 43 |  ; 
 | 
|---|
| 44 |  ; Can't be called from the top
 | 
|---|
| 45 |  Q
 | 
|---|
| 46 |  ;
 | 
|---|
| 47 |  ;
 | 
|---|
| 48 | INSERROR(TYPE,IEN,ERRFLG,ARRAY) ;
 | 
|---|
| 49 |  ; Formal parameters:
 | 
|---|
| 50 |  ;  TYPE:   Type of IEN passed in the second parameter.
 | 
|---|
| 51 |  ;          Either "B" for "Buffer" or "I" for "Insurance".
 | 
|---|
| 52 |  ;          Mandatory, passed by value.
 | 
|---|
| 53 |  ;  IEN:    IEN to perform a lookup for. Mandatory, passed by value.
 | 
|---|
| 54 |  ;  ERRFLG: Error flag. "" or 0 if no extended error information is
 | 
|---|
| 55 |  ;          requested, 1 if extended error information is requested.
 | 
|---|
| 56 |  ;          Optional (the default is 0), passed by value.
 | 
|---|
| 57 |  ;  ARRAY:  Array of error messages returned by the function.
 | 
|---|
| 58 |  ;          Optional, passed by reference. Whatever is passed in will be
 | 
|---|
| 59 |  ;          KILLed by the function. The structure of the return array is
 | 
|---|
| 60 |  ;          as follows:
 | 
|---|
| 61 |  ;          ARRAY         # of error messages passed back
 | 
|---|
| 62 |  ;          ARRAY(error#) Data for this error number, including error
 | 
|---|
| 63 |  ;          number 1 present in the value returned by the function.
 | 
|---|
| 64 |  ;                [1]   IEN of the error code in the symbol file
 | 
|---|
| 65 |  ;                [2]   # of lines in the error message text
 | 
|---|
| 66 |  ;          ARRAY(error #,line #) - One line of error message text
 | 
|---|
| 67 |  ;                                  up to 70 characters long
 | 
|---|
| 68 |  ;
 | 
|---|
| 69 |  ;          Returned value consists of the following "^"-delimited pcs:
 | 
|---|
| 70 |  ;           [1]   The IEN of the IIV SYMBOL File (#365.15) entry for
 | 
|---|
| 71 |  ;                 the first error condition encountered by the function.
 | 
|---|
| 72 |  ;                 This is only present if a valid Payer was not found.
 | 
|---|
| 73 |  ;           [2]   Payer IEN if a Payer was found, "" otherwise
 | 
|---|
| 74 |  ;           [3]   National ID if a Payer was found
 | 
|---|
| 75 |  ;
 | 
|---|
| 76 |  ; Initialize all variables used in this program
 | 
|---|
| 77 |  N INSIEN,INSNAME,NAMEARR,PAYID,PAYIEN,SYMIEN
 | 
|---|
| 78 |  ; Initialize return variables
 | 
|---|
| 79 |  S (PAYID,PAYIEN,SYMIEN)=""
 | 
|---|
| 80 |  ; If the calling program didn't pass the Extended Error flag, init it
 | 
|---|
| 81 |  S ERRFLG=+$G(ERRFLG)
 | 
|---|
| 82 |  ; Initialize array of extended error info to be returned
 | 
|---|
| 83 |  K ARRAY
 | 
|---|
| 84 |  ; Validate input parameters
 | 
|---|
| 85 |  I $G(TYPE)'="B",$G(TYPE)'="I" S SYMIEN=$$ERROR^IBCNEUT8("B9","IEN type "_$G(TYPE)_" passed to the insurance match algorithm is neither 'B' nor 'I'.") G EXIT
 | 
|---|
| 86 |  I $G(IEN)="" S SYMIEN=$$ERROR^IBCNEUT8("B9","IEN is not passed to the insurance match algorithm.") G EXIT
 | 
|---|
| 87 |  I TYPE="B",'$D(^IBA(355.33,IEN)) S SYMIEN=$$ERROR^IBCNEUT8("B9","Invalid Buffer IEN "_IEN_" has been passed to the insurance match algorithm.") G EXIT
 | 
|---|
| 88 |  I TYPE="I",'$D(^DIC(36,IEN)) S SYMIEN=$$ERROR^IBCNEUT8("B9","Invalid Insurance Company IEN "_IEN_" has been passed to the insurance match algorithm.") G EXIT
 | 
|---|
| 89 |  ;
 | 
|---|
| 90 |  ; If the IEN is an Insurance Company IEN, validate it
 | 
|---|
| 91 |  I TYPE="I" D  G EXIT
 | 
|---|
| 92 |  . N TMP
 | 
|---|
| 93 |  . ; Check to see if ins co is ACTIVE
 | 
|---|
| 94 |  . S TMP=$$ACTIVE^IBCNEUT4(IEN)
 | 
|---|
| 95 |  . I 'TMP S SYMIEN=$$ERROR^IBCNEUT8("B10","Insurance Company "_$P(TMP,U,2)_" is not active.") Q
 | 
|---|
| 96 |  . D VALID^IBCNEUT4(IEN,.PAYIEN,.PAYID,.SYMIEN)
 | 
|---|
| 97 |  ;
 | 
|---|
| 98 |  ; Retrieve the ins co name from the Ins Buffer
 | 
|---|
| 99 |  S INSNAME=$$TRIM^XLFSTR($P($G(^IBA(355.33,IEN,20)),U,1))
 | 
|---|
| 100 |  I INSNAME="" S SYMIEN=$$ERROR^IBCNEUT8("B13") G EXIT
 | 
|---|
| 101 |  ; Retrieve all ins co IENs matching this ins co name
 | 
|---|
| 102 |  D INSIEN^IBCNEUT8(INSNAME,.INSIEN)
 | 
|---|
| 103 |  ; 
 | 
|---|
| 104 |  ; If one or more ins. co. name matches found, retrieve Payer info
 | 
|---|
| 105 |  I $D(INSIEN) D  G EXIT
 | 
|---|
| 106 |  . ; If there is one INSIEN - make sure it is ACTIVE
 | 
|---|
| 107 |  . I $O(INSIEN(""))=$O(INSIEN(""),-1),'$$ACTIVE^IBCNEUT4($O(INSIEN(""))) S SYMIEN=$$ERROR^IBCNEUT8("B10","Insurance company "_INSNAME_" is not active.") Q
 | 
|---|
| 108 |  . ; Find National IDs for these ins co IENs
 | 
|---|
| 109 |  . D FINDPAY^IBCNEUT8(.INSIEN,.PAYID)
 | 
|---|
| 110 |  . ; There were Multiple INSIENs - if none exist ALL were INACTIVE
 | 
|---|
| 111 |  . I '$D(INSIEN) S SYMIEN=$$ERROR^IBCNEUT8("B10","All insurance companies named "_INSNAME_" are not active.") Q
 | 
|---|
| 112 |  . ; Quit with an error if no Payer is found for these ins cos
 | 
|---|
| 113 |  . I $O(PAYID(""))="" S SYMIEN=$$ERROR^IBCNEUT8("B4","Insurance company "_INSNAME_" is not linked to a Payer.") Q
 | 
|---|
| 114 |  . ; Quit with an error if more than one Payer found
 | 
|---|
| 115 |  . I $O(PAYID(""))'=$O(PAYID(""),-1) S SYMIEN=$$ERROR^IBCNEUT8("B3","There are multiple Insurance companies named "_INSNAME_" in the Insurance Company file that are linked to more than one Payer",.PAYID),PAYID="" Q
 | 
|---|
| 116 |  . ; Validate the found unique Payer
 | 
|---|
| 117 |  . D VALID^IBCNEUT4(PAYID($O(PAYID(""))),.PAYIEN,.PAYID,.SYMIEN)
 | 
|---|
| 118 |  ;
 | 
|---|
| 119 |  ; If no exact ins co name match was found, check AutoMatch file
 | 
|---|
| 120 |  ; No need to filter out inactives as the AMLOOK will handle it
 | 
|---|
| 121 |  I $$AMLOOK^IBCNEUT1(INSNAME,1,.NAMEARR) D  I $D(INSIEN) G EXIT
 | 
|---|
| 122 |  . N NAME
 | 
|---|
| 123 |  . ; Based on the array of ins cos returned by the AutoMatch
 | 
|---|
| 124 |  . ; build an array of ins co IENs that they point to
 | 
|---|
| 125 |  . S NAME="" F  S NAME=$O(NAMEARR(NAME)) Q:NAME=""  D INSIEN^IBCNEUT8($$TRIM^XLFSTR(NAME),.INSIEN)
 | 
|---|
| 126 |  . ; If nothing found in the Insurance Co x-ref, quit w/o validation
 | 
|---|
| 127 |  . I '$D(INSIEN) Q
 | 
|---|
| 128 |  . ; Check if there is more than one ins co IEN that matches
 | 
|---|
| 129 |  . ; the entered name, in which case exit with an error
 | 
|---|
| 130 |  . I $O(INSIEN(""))'=$O(INSIEN(""),-1) S SYMIEN=$$ERROR^IBCNEUT8("B2","Insurance company name "_INSNAME_" in the Insurance Buffer matched more than one insurance company in the Auto Match file",.NAMEARR) Q
 | 
|---|
| 131 |  . ; Validate the found unique ins co IEN
 | 
|---|
| 132 |  . D VALID^IBCNEUT4($O(INSIEN("")),.PAYIEN,.PAYID,.SYMIEN)
 | 
|---|
| 133 |  ;
 | 
|---|
| 134 |  ;  If the first two lookups failed, check the Ins Co Synonym file:
 | 
|---|
| 135 |  ; Retrieve all ins co IENs that match in the Synonym file
 | 
|---|
| 136 |  ;M INSIEN=^DIC(36,"C",INSNAME)
 | 
|---|
| 137 |  N %X,%Y
 | 
|---|
| 138 |  S %X="^DIC(36,""C"",INSNAME,"
 | 
|---|
| 139 |  S %Y="INSIEN("
 | 
|---|
| 140 |  I $D(^DIC(36,"C",INSNAME))#10=1 S INSIEN=^DIC(36,"C",INSNAME)
 | 
|---|
| 141 |  D %XY^%RCR K %X,%Y
 | 
|---|
| 142 |  ;
 | 
|---|
| 143 |  ; If nothing found in the Synonym file, error out
 | 
|---|
| 144 |  I '$D(INSIEN) S SYMIEN=$$ERROR^IBCNEUT8("B1","Insurance company "_INSNAME_" could not be matched to a valid entry in the Insurance Company file.") G EXIT
 | 
|---|
| 145 |  ; Loop thru the ins co IENs that matched in the Synonym file
 | 
|---|
| 146 |  S INSIEN=0 F  S INSIEN=$O(INSIEN(INSIEN)) Q:'INSIEN  D
 | 
|---|
| 147 |  . N NAME
 | 
|---|
| 148 |  . ; Retrieve the ins co name for this IEN
 | 
|---|
| 149 |  . S NAME=$$TRIM^XLFSTR($P($G(^DIC(36,INSIEN,0)),U,1))
 | 
|---|
| 150 |  . I NAME'="" S NAMEARR(NAME)=""
 | 
|---|
| 151 |  ;
 | 
|---|
| 152 |  ; If more than one ins co name was found, error out
 | 
|---|
| 153 |  I $O(NAMEARR(""))'=$O(NAMEARR(""),-1) D  G EXIT
 | 
|---|
| 154 |  . S SYMIEN=$$ERROR^IBCNEUT8("B2","Insurance company name "_INSNAME_" in the Insurance Buffer matched more than one insurance company name in the Synonym cross-reference of the Insurance Company file",.NAMEARR)
 | 
|---|
| 155 |  ;
 | 
|---|
| 156 |  ; If there is one INSIEN - make sure it is ACTIVE
 | 
|---|
| 157 |  I $O(INSIEN(""))=$O(INSIEN(""),-1),'$$ACTIVE^IBCNEUT4($O(INSIEN(""))) S SYMIEN=$$ERROR^IBCNEUT8("B10","Insurance company "_INSNAME_" is not active.") G EXIT
 | 
|---|
| 158 |  ; Find Payers for these ins co IENs
 | 
|---|
| 159 |  D FINDPAY^IBCNEUT8(.INSIEN,.PAYID)
 | 
|---|
| 160 |  ;
 | 
|---|
| 161 |  ; There were Multiple INSIENs - if none exist ALL were INACTIVE
 | 
|---|
| 162 |  I '$D(INSIEN) S SYMIEN=$$ERROR^IBCNEUT8("B10","All insurance companies named "_INSNAME_" are not active."),PAYID="" G EXIT
 | 
|---|
| 163 |  ; If no Payer was found, error out
 | 
|---|
| 164 |  I $O(PAYID(""))="" S SYMIEN=$$ERROR^IBCNEUT8("B4","Insurance company "_$O(NAMEARR(""))_" is not linked to a Payer.") G EXIT
 | 
|---|
| 165 |  ; If multiple Payers were found, error out
 | 
|---|
| 166 |  I $O(PAYID(""))'=$O(PAYID(""),-1) S SYMIEN=$$ERROR^IBCNEUT8("B3","Insurance company "_$O(NAMEARR(""))_" is linked to more than one Payer",.PAYID),PAYID="" G EXIT
 | 
|---|
| 167 |  ; Validate the found unique Payer
 | 
|---|
| 168 |  D VALID^IBCNEUT4(PAYID($O(PAYID(""))),.PAYIEN,.PAYID,.SYMIEN)
 | 
|---|
| 169 |  ;
 | 
|---|
| 170 | EXIT ; Main function exit point
 | 
|---|
| 171 |  Q SYMIEN_U_PAYIEN_U_PAYID
 | 
|---|
| 172 |  ;
 | 
|---|