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