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