DBA Data[Home] [Help]

PACKAGE BODY: APPS.HZ_MATCH_RULE_3

Source


1 PACKAGE BODY HZ_MATCH_RULE_3 AS
2 /*=======================================================================+
3  |  Copyright (c) 1999 Oracle Corporation Redwood Shores, California, USA|
4  |                          All rights reserved.                         |
5  +=======================================================================+
6  | NAME
7  |      HZ_MATCH_RULE_3
8  |
9  | DESCRIPTION
10  |
11  | Compiled by the HZ Match Rule Compiler
12  | -- Do Not Modify --
13  |
14  | PUBLIC PROCEDURES
15  |    find_parties
16  |    get_matching_party_sites
17  |    get_matching_contacts
18  |    get_matching_contact_points
19  |    get_score_details
20  |    
21  | HISTORY
22  |      30-MAR-2009 Generated by HZ Match Rule Compiler
23  |
24  *=======================================================================*/
25 
26 -- ==========================================================================================
27 -- ============MATCH RULE COMPILER GENERATED CODE FOR DUP IDENTIFICATION MATCH RULES ========
28 -- ==========================================================================================
29 
30   TYPE vlisttype IS TABLE of VARCHAR2(255) INDEX BY BINARY_INTEGER ;
31   call_order vlisttype;
32   call_max_score HZ_PARTY_SEARCH.IDList;
33   call_type vlisttype;
34   g_party_stage_rec  HZ_PARTY_STAGE.party_stage_rec_type;
35   g_party_site_stage_list  HZ_PARTY_STAGE.party_site_stage_list;
36   g_contact_stage_list  HZ_PARTY_STAGE.contact_stage_list;
37   g_contact_pt_stage_list  HZ_PARTY_STAGE.contact_pt_stage_list;
38   g_mappings  HZ_PARTY_SEARCH.IDList;
39   g_max_id NUMBER:=2000000000;
40   g_other_party_level_attribs BOOLEAN;
41 
42   g_debug_count                        NUMBER := 0;
43   g_score_until_thresh BOOLEAN:=false;
44  
45   g_thres_score NUMBER:=1000;
46   g_ps_den_only BOOLEAN;
47   g_index_owner VARCHAR2(255);
48   distinct_search_cpt_types NUMBER ; 
49 
50 PROCEDURE output_long_strings(input_str VARCHAR2 DEFAULT NULL)
51 IS
52      remainder_str VARCHAR2(4000);
53      current_pos NUMBER ;
54      temp VARCHAR2(300) ;
55 BEGIN
56      remainder_str := input_str ;
57      current_pos := 1 ;
58    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
59      WHILE remainder_str IS NOT NULL
60      LOOP
61      temp := substr(remainder_str, 1 , 255 );
62       hz_utility_v2pub.debug(p_message=>'  '||temp,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
63      current_pos := current_pos + 255 ;
64      remainder_str := substr(input_str,current_pos );
65      END LOOP ;
66     END IF;
67 END ;
68 FUNCTION check_estimate_hits (
69   p_entity VARCHAR2,
70   p_contains_str VARCHAR2) RETURN NUMBER IS
71   
72   ustatus VARCHAR2(255);
73   dstatus VARCHAR2(255);
74   l_bool BOOLEAN;
75   l_hits NUMBER := 0;
76 BEGIN
77   IF g_index_owner IS NULL THEN
78     l_bool := fnd_installation.GET_APP_INFO('AR',ustatus,dstatus,g_index_owner);
79   END IF;
80   IF p_entity='PARTY' THEN
81 
82     l_hits :=  CTX_QUERY.count_hits(
83         g_index_owner||'.'||'HZ_STAGE_PARTIES_T1',p_contains_str, false);
84   ELSIF p_entity='PARTY_SITES' THEN
85     l_hits :=  CTX_QUERY.count_hits(
86         g_index_owner||'.'||'HZ_STAGE_PARTY_SITES_T1',p_contains_str, false);
87   ELSIF p_entity='CONTACTS' THEN
88     l_hits :=  CTX_QUERY.count_hits(
89         g_index_owner||'.'||'HZ_STAGE_CONTACT_T1',p_contains_str, false);
90   ELSIF p_entity='CONTACT_POINTS' THEN
91     l_hits :=  CTX_QUERY.count_hits(
92         g_index_owner||'.'||'HZ_STAGE_CPT_T1',p_contains_str, false);
93   END IF;
94   RETURN floor(l_hits/2) ;
95   
96 
97   exception
98     when others then
99       if (instrb(SQLERRM,'DRG-51030')>0) then 
100         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_WILDCARD_ERR');
101         FND_MSG_PUB.ADD;
102         RAISE FND_API.G_EXC_ERROR;
103       elsif (instrb(SQLERRM,'DRG-50943')>0) then 
104         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_SEARCH_ERROR');
105         FND_MSG_PUB.ADD;
106         RAISE FND_API.G_EXC_ERROR;
107       else 
108         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
109       end if;
110 END;
111 
112 
113 FUNCTION get_adjusted_restrict_sql (p_restrict_sql VARCHAR2)
114 RETURN VARCHAR2
115 IS
116 p_person_restrict_sql VARCHAR2(32767);
117 p_restrict1_sql VARCHAR2(32767);
118 p_final_restrict_sql VARCHAR2(32767);
119 BEGIN
120    p_final_restrict_sql := p_restrict_sql ; 
121    IF p_restrict_sql IS NOT NULL
122    THEN
123      IF instrb(p_restrict_sql, 'STAGE.') > 0
124      THEN
125         p_restrict1_sql := replace( p_restrict_sql, 'STAGE.', 'stage1.');
126      ELSIF instrb(p_restrict_sql, 'stage.') > 0
127      THEN
128            p_restrict1_sql := replace( p_restrict_sql, 'stage.', 'stage1.');
129      END IF;
130     p_person_restrict_sql := 'exists ( SELECT 1 from HZ_ORG_CONTACTS oc, hz_relationships r' 
131                                || ' where oc.org_contact_id = stage.org_contact_id and' 
132                                || ' r.relationship_id = oc.party_relationship_id' 
133                                || ' and r.subject_type = ''PERSON'' AND r.object_type = ''ORGANIZATION'' ' 
134                                || ' and exists ( SELECT 1 FROM HZ_PARTIES stage1 where stage1.party_id = r.subject_id' 
135                                || ' and ' || p_restrict1_sql || ' ) )' ; 
136 p_final_restrict_sql := '((stage.org_contact_id is null and ' || p_restrict_sql || ') or (stage.org_contact_id is not null and ' 
137                            || p_person_restrict_sql ||  ' ))'; 
138  END IF;
139  return p_final_restrict_sql ;
140 END;
141   FUNCTION map_id (in_id NUMBER) RETURN NUMBER IS
142     l_newidx NUMBER;
143   BEGIN 
144    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
145       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
146       hz_utility_v2pub.debug(p_message=>'calling the function map_id',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
147     END IF;
148    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
149       hz_utility_v2pub.debug(p_message=>'argument in_id =  '||in_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
150     END IF;
151     IF in_id<g_max_id THEN 
152       RETURN in_id;
153     ELSE
154       FOR I in 1..g_mappings.COUNT LOOP
155         IF in_id = g_mappings(I) THEN
156           RETURN (g_max_id+I);
157         END IF;
158       END LOOP;
159       l_newidx := g_mappings.COUNT+1;
160       g_mappings(l_newidx) := in_id;
161       RETURN (g_max_id+l_newidx);
162     END IF;
163   END;
164   FUNCTION GET_PARTY_SCORE 
165        (
166        p_table_TX44 VARCHAR2
167   ) RETURN NUMBER IS
168     total NUMBER := 0;
169   BEGIN
170    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
171       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
172       hz_utility_v2pub.debug(p_message=>'calling the function get_party_score',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
173     END IF;
174     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
175       hz_utility_v2pub.debug(p_message=>'GET_PARTY_SCORE   ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
176     END IF;
177     IF g_score_until_thresh AND (total)>=g_thres_score THEN
178    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
179       hz_utility_v2pub.debug(p_message=>'get_party_score returned total =  '||total,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
180     END IF;
181       RETURN total;
182     END IF;
183     IF HZ_DQM_SEARCH_UTIL.is_match(g_party_stage_rec.TX44, p_table_TX44,49) THEN
184       total := total+20;
185       IF g_score_until_thresh AND (total)>=g_thres_score THEN 
186    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
187       hz_utility_v2pub.debug(p_message=>'get_party_score returned total =  '||total,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
188     END IF;
189         RETURN total;
190       END IF;
191     END IF;
192     RETURN total;
193   END;
194   FUNCTION GET_PARTY_SITES_SCORE (
195        x_matchidx OUT NUMBER
196   ) RETURN NUMBER IS
197     maxscore NUMBER := 0;
198     l_current_score NUMBER := 0;
199   BEGIN
200     x_matchidx := 0;
201     IF g_score_until_thresh AND (l_current_score)>=g_thres_score THEN
202        RETURN l_current_score;
203     END IF;
204     FOR J IN 1..g_party_site_stage_list.COUNT LOOP
205       l_current_score := 0;
206       IF maxscore<l_current_score THEN
207         maxscore:=l_current_score;
208         x_matchidx:=J;
209       END IF;
210     END LOOP;
211     RETURN maxscore;
212   END;
213   FUNCTION GET_CONTACTS_SCORE (
214        x_matchidx OUT NUMBER
215   ) RETURN NUMBER IS
216     maxscore NUMBER := 0;
217     l_current_score NUMBER := 0;
218   BEGIN
219     x_matchidx := 0;
220     IF g_score_until_thresh AND (l_current_score)>=g_thres_score THEN
221        RETURN l_current_score;
222     END IF;
223     FOR J IN 1..g_contact_stage_list.COUNT LOOP
224       l_current_score := 0;
225       IF maxscore<l_current_score THEN
226         maxscore:=l_current_score;
227         x_matchidx:=J;
228       END IF;
229     END LOOP;
230     RETURN maxscore;
231   END;
232   FUNCTION GET_CONTACT_POINTS_SCORE (
233        x_matchidx OUT NUMBER
234       ,p_table_TX1 VARCHAR2
235       ,p_table_TX6 VARCHAR2
236       ,p_table_TX5 VARCHAR2
237   ) RETURN NUMBER IS
238     maxscore NUMBER := 0;
239     l_current_score NUMBER := 0;
240   BEGIN
241     x_matchidx := 0;
242     IF g_score_until_thresh AND (l_current_score)>=g_thres_score THEN
243        RETURN l_current_score;
244     END IF;
245     FOR J IN 1..g_contact_pt_stage_list.COUNT LOOP
246       l_current_score := 0;
247       IF HZ_DQM_SEARCH_UTIL.is_match(g_contact_pt_stage_list(J).TX1, p_table_TX1,(50000*(J-1)+110)) THEN
248         l_current_score:=l_current_score+ 20;
249         IF g_score_until_thresh AND (l_current_score)>=g_thres_score THEN
250           x_matchidx:=J;
251           RETURN l_current_score;
252         END IF;
253       END IF;
254       IF HZ_DQM_SEARCH_UTIL.is_match(g_contact_pt_stage_list(J).TX5, p_table_TX5,(50000*(J-1)+114)) THEN
255         l_current_score:=l_current_score+ 20;
256         IF g_score_until_thresh AND (l_current_score)>=g_thres_score THEN
257           x_matchidx:=J;
258           RETURN l_current_score;
259         END IF;
260       ELSIF -- l_current_score<15 AND 
261           HZ_DQM_SEARCH_UTIL.is_match(g_contact_pt_stage_list(J).TX6, p_table_TX6,(50000*(J-1)+115)) THEN
262         l_current_score:=l_current_score+ 15;
263         IF g_score_until_thresh AND (l_current_score)>=g_thres_score THEN
264           x_matchidx:=J;
265           RETURN l_current_score;
266         END IF;
267       END IF;
268       IF maxscore<l_current_score THEN
269         maxscore:=l_current_score;
270         x_matchidx:=J;
271       END IF;
272     END LOOP;
273     RETURN maxscore;
274   END;
275   FUNCTION get_attrib_val(
276       p_record_id 	NUMBER
277      ,p_entity 	VARCHAR2
278      ,p_attribute 	VARCHAR2
279   ) RETURN VARCHAR2 IS
280   l_matched_value VARCHAR2(2000);
281   l_party_type VARCHAR2(255);
282   BEGIN
283   IF p_entity = 'PARTY' THEN
284   IF p_attribute = 'TAX_REFERENCE' THEN
285 
286       SELECT party_type INTO l_party_type 
287       FROM HZ_PARTIES
288       WHERE party_id = p_record_id;
289       IF l_party_type = 'ORGANIZATION' THEN
290         SELECT TAX_REFERENCE INTO l_matched_value 
291         FROM HZ_ORGANIZATION_PROFILES
292         WHERE party_id = p_record_id 
293         and effective_end_date is null
294         and rownum = 1;
295       ELSIF l_party_type = 'PERSON' THEN
296         SELECT TAX_REFERENCE INTO l_matched_value 
297         FROM HZ_PERSON_PROFILES
298         WHERE party_id = p_record_id 
299         and effective_end_date is null 
300         and rownum = 1;
301       END IF;
302       RETURN l_matched_value;
303     END IF;
304     NULL;
305   END IF;
306   IF p_entity = 'PARTY_SITES' THEN
307     NULL;
308   END IF;
309   IF p_entity = 'CONTACTS' THEN
310     NULL;
311   END IF;
312   IF p_entity = 'CONTACT_POINTS' THEN
313   IF p_attribute = 'FLEX_FORMAT_PHONE_NUMBER' THEN
314      l_matched_value := HZ_PARTY_ACQUIRE.get_phone_number (p_record_id, p_entity,'FLEX_FORMAT_PHONE_NUMBER','Y');
315       RETURN l_matched_value;
316     END IF;
317   IF p_attribute = 'EMAIL_ADDRESS' THEN
318      BEGIN
319        SELECT EMAIL_ADDRESS INTO l_matched_value 
320        FROM HZ_CONTACT_POINTS 
321        WHERE contact_point_id = p_record_id and rownum=1;
322      EXCEPTION
323        WHEN NO_DATA_FOUND THEN
324          l_matched_value := 'Err';
325      END;
326       RETURN l_matched_value;
327     END IF;
328     NULL;
329   END IF;
330 END;
331   PROCEDURE INSERT_PARTY_SCORE (
332        p_party_id IN  NUMBER
333        ,p_record_id IN  NUMBER
334        ,p_search_ctx_id IN  NUMBER
335        ,p_search_rec IN HZ_PARTY_SEARCH.party_search_rec_type
336        ,p_stage_rec IN HZ_PARTY_STAGE.party_stage_rec_type
337       ,p_table_TX44 VARCHAR2
338         ,p_idx IN NUMBER) IS
339     l_current_score NUMBER:=0;
340     l_score NUMBER;
341     l_attrib_value VARCHAR2(2000);
342   BEGIN
343    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
344       hz_utility_v2pub.debug(p_message=>'Inside Calling Procedure - INSERT_PARTY_SCORE',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
345     END IF;
346      l_score :=0;
347       IF HZ_DQM_SEARCH_UTIL.is_match(p_stage_rec.TX44, p_table_TX44,(50000*(p_idx-1)+49)) THEN
348       l_score :=20;
349    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
350       hz_utility_v2pub.debug(p_message=>'l_score is -  '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
351     END IF;
352       END IF;
353       IF l_score>0 THEN
354    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
355       hz_utility_v2pub.debug(p_message=>'l_score > 0',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
356     END IF;
357       l_attrib_value := get_attrib_val(p_record_id,'PARTY','TAX_REFERENCE');
358    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
359       hz_utility_v2pub.debug(p_message=>'Inserting into HZ_PARTY_SCORE_DTLS_GT ...',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
360     END IF;
361       INSERT INTO HZ_PARTY_SCORE_DTLS_GT (PARTY_ID, RECORD_ID, SEARCH_CONTEXT_ID,
362                 ATTRIBUTE,ENTITY,ENTERED_VALUE, MATCHED_VALUE, ASSIGNED_SCORE)
363       VALUES (
364            p_party_id,p_record_id,p_search_ctx_id,'TAX_REFERENCE',
365            'PARTY', p_search_rec.TAX_REFERENCE,
366            l_attrib_value,l_score);
367    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
368       hz_utility_v2pub.debug(p_message=>'Inserting into HZ_PARTY_SCORE_DTLS_GT ... Done',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
369     END IF;
370       END IF;
371     NULL;
372   END;
373   PROCEDURE INSERT_PARTY_SITES_SCORE (
374        p_party_id IN  NUMBER
375        ,p_record_id IN  NUMBER
376        ,p_search_ctx_id IN  NUMBER
377        ,p_search_rec IN HZ_PARTY_SEARCH.party_site_search_rec_type
378        ,p_stage_rec IN HZ_PARTY_STAGE.party_site_stage_rec_type
379         ,p_idx IN NUMBER) IS
380     l_current_score NUMBER:=0;
381     l_score NUMBER;
382     l_attrib_value VARCHAR2(2000);
383   BEGIN
384    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
385       hz_utility_v2pub.debug(p_message=>'Inside Calling Procedure - INSERT_PARTY_SITES_SCORE',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
386     END IF;
387     NULL;
388   END;
389   PROCEDURE INSERT_CONTACTS_SCORE (
390        p_party_id IN  NUMBER
391        ,p_record_id IN  NUMBER
392        ,p_search_ctx_id IN  NUMBER
393        ,p_search_rec IN HZ_PARTY_SEARCH.contact_search_rec_type
394        ,p_stage_rec IN HZ_PARTY_STAGE.contact_stage_rec_type
395         ,p_idx IN NUMBER) IS
396     l_current_score NUMBER:=0;
397     l_score NUMBER;
398     l_attrib_value VARCHAR2(2000);
399   BEGIN
400    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
401       hz_utility_v2pub.debug(p_message=>'Inside Calling Procedure - INSERT_CONTACTS_SCORE',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
402     END IF;
403     NULL;
404   END;
405   PROCEDURE INSERT_CONTACT_POINTS_SCORE (
406        p_party_id IN  NUMBER
407        ,p_record_id IN  NUMBER
408        ,p_search_ctx_id IN  NUMBER
409        ,p_search_rec IN HZ_PARTY_SEARCH.contact_point_search_rec_type
410        ,p_stage_rec IN HZ_PARTY_STAGE.contact_pt_stage_rec_type
411       ,p_table_TX1 VARCHAR2
412       ,p_table_TX6 VARCHAR2
413       ,p_table_TX5 VARCHAR2
414         ,p_idx IN NUMBER) IS
415     l_current_score NUMBER:=0;
416     l_score NUMBER;
417     l_attrib_value VARCHAR2(2000);
418   BEGIN
419    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
420       hz_utility_v2pub.debug(p_message=>'Inside Calling Procedure - INSERT_CONTACT_POINTS_SCORE',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
421     END IF;
422      l_score :=0;
423       IF HZ_DQM_SEARCH_UTIL.is_match(p_stage_rec.TX1, p_table_TX1,(50000*(p_idx-1)+110)) THEN
424       l_score :=20;
425    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
426       hz_utility_v2pub.debug(p_message=>'l_score is -  '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
427     END IF;
428       END IF;
429       IF l_score>0 THEN
430    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
431       hz_utility_v2pub.debug(p_message=>'l_score > 0',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
432     END IF;
433       l_attrib_value := get_attrib_val(p_record_id,'CONTACT_POINTS','FLEX_FORMAT_PHONE_NUMBER');
434    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
435       hz_utility_v2pub.debug(p_message=>'Inserting into HZ_PARTY_SCORE_DTLS_GT ...',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
436     END IF;
437       INSERT INTO HZ_PARTY_SCORE_DTLS_GT (PARTY_ID, RECORD_ID, SEARCH_CONTEXT_ID,
438                 ATTRIBUTE,ENTITY,ENTERED_VALUE, MATCHED_VALUE, ASSIGNED_SCORE)
439       VALUES (
440            p_party_id,p_record_id,p_search_ctx_id,'FLEX_FORMAT_PHONE_NUMBER',
441            'CONTACT_POINTS', p_search_rec.FLEX_FORMAT_PHONE_NUMBER,
442            l_attrib_value,l_score);
443    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
444       hz_utility_v2pub.debug(p_message=>'Inserting into HZ_PARTY_SCORE_DTLS_GT ... Done',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
445     END IF;
446       END IF;
447      l_score :=0;
448       IF HZ_DQM_SEARCH_UTIL.is_match(p_stage_rec.TX5, p_table_TX5,(50000*(p_idx-1)+114)) THEN
449       l_score :=20;
450    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
451       hz_utility_v2pub.debug(p_message=>'l_score is -  '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
452     END IF;
453       ELSIF l_current_score<15 AND 
454           HZ_DQM_SEARCH_UTIL.is_match(p_stage_rec.TX6, p_table_TX6,(50000*(p_idx-1)+115)) THEN
455       l_score :=15;
456    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
457       hz_utility_v2pub.debug(p_message=>'l_score is -  '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
458     END IF;
459       END IF;
460       IF l_score>0 THEN
461    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
462       hz_utility_v2pub.debug(p_message=>'l_score > 0',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
463     END IF;
464       l_attrib_value := get_attrib_val(p_record_id,'CONTACT_POINTS','EMAIL_ADDRESS');
465    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
466       hz_utility_v2pub.debug(p_message=>'Inserting into HZ_PARTY_SCORE_DTLS_GT ...',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
467     END IF;
468       INSERT INTO HZ_PARTY_SCORE_DTLS_GT (PARTY_ID, RECORD_ID, SEARCH_CONTEXT_ID,
469                 ATTRIBUTE,ENTITY,ENTERED_VALUE, MATCHED_VALUE, ASSIGNED_SCORE)
470       VALUES (
471            p_party_id,p_record_id,p_search_ctx_id,'EMAIL_ADDRESS',
472            'CONTACT_POINTS', p_search_rec.EMAIL_ADDRESS,
473            l_attrib_value,l_score);
474    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
475       hz_utility_v2pub.debug(p_message=>'Inserting into HZ_PARTY_SCORE_DTLS_GT ... Done',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
476     END IF;
477       END IF;
478     NULL;
479   END;
480 
481 /************************************************
482   This procedure populates global cond record
483   for the PARTY Entity 
484 ************************************************/
485 
486 PROCEDURE POP_PARTY_COND_REC(
487     p_search_rec IN HZ_PARTY_SEARCH.party_search_rec_type 
488   ) IS 
489 BEGIN
490 NULL ;
491 EXCEPTION
492   WHEN OTHERS THEN
493     FND_MESSAGE.SET_NAME('AR', 'HZ_TRANSFORM_PROC_ERROR');
494     FND_MESSAGE.SET_TOKEN('PROC' , 'POP_PARTY_COND_REC');
495     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
496     FND_MSG_PUB.ADD;
497     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
498 END;
499 
500 
501 /************************************************
502   This procedure populates global cond record
503   for the PARTY_SITES Entity 
504 ************************************************/
505 
506 PROCEDURE POP_PARTY_SITES_COND_REC(
507     p_search_list IN HZ_PARTY_SEARCH.party_site_list 
508   ) IS 
509 BEGIN
510 NULL ;
511 EXCEPTION
512   WHEN OTHERS THEN
513     FND_MESSAGE.SET_NAME('AR', 'HZ_TRANSFORM_PROC_ERROR');
514     FND_MESSAGE.SET_TOKEN('PROC' , 'POP_PARTY_SITES_COND_REC');
515     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
516     FND_MSG_PUB.ADD;
517     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
518 END;
519 
520 
521 /************************************************
522   This procedure populates global cond record
523   for the CONTACTS Entity 
524 ************************************************/
525 
526 PROCEDURE POP_CONTACTS_COND_REC(
527     p_search_list IN HZ_PARTY_SEARCH.contact_list 
528   ) IS 
529 BEGIN
530 NULL ;
531 EXCEPTION
532   WHEN OTHERS THEN
533     FND_MESSAGE.SET_NAME('AR', 'HZ_TRANSFORM_PROC_ERROR');
534     FND_MESSAGE.SET_TOKEN('PROC' , 'POP_CONTACTS_COND_REC');
535     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
536     FND_MSG_PUB.ADD;
537     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
538 END;
539 
540 
541 /************************************************
542   This procedure populates global cond record
543   for the CONTACT_POINTS Entity 
544 ************************************************/
545 
546 PROCEDURE POP_CONTACT_POINTS_COND_REC(
547     p_search_list IN HZ_PARTY_SEARCH.contact_point_list 
548   ) IS 
549 BEGIN
550 NULL ;
551 EXCEPTION
552   WHEN OTHERS THEN
553     FND_MESSAGE.SET_NAME('AR', 'HZ_TRANSFORM_PROC_ERROR');
554     FND_MESSAGE.SET_TOKEN('PROC' , 'POP_CONTACT_POINTS_COND_REC');
555     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
556     FND_MSG_PUB.ADD;
557     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
558 END;
559 
560   PROCEDURE init_score_context (
561       p_party_search_rec      IN      HZ_PARTY_SEARCH.party_search_rec_type:=
562                                   HZ_PARTY_SEARCH.G_MISS_PARTY_SEARCH_REC,
563       p_party_site_list       IN      HZ_PARTY_SEARCH.party_site_list:=
564                                   HZ_PARTY_SEARCH.G_MISS_PARTY_SITE_LIST,
565       p_contact_list          IN      HZ_PARTY_SEARCH.contact_list:= 
566                                   HZ_PARTY_SEARCH.G_MISS_CONTACT_LIST,
567       p_contact_point_list    IN      HZ_PARTY_SEARCH.contact_point_list:=
568                                   HZ_PARTY_SEARCH.G_MISS_CONTACT_POINT_LIST
569   ) IS
570    l_dummy NUMBER;
571   BEGIN
572    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
573       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
574       hz_utility_v2pub.debug(p_message=>'calling the procedure init_score_context',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
575     END IF;
576    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
577       hz_utility_v2pub.debug(p_message=>'In init_score_context calling the Map procedures',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
578     END IF;
579     -- Transform search criteria
580     HZ_TRANS_PKG.clear_globals;
581     MAP_PARTY_REC(FALSE,p_party_search_rec, l_dummy, g_party_stage_rec);
582     MAP_PARTY_SITE_REC(FALSE,p_party_site_list, l_dummy, g_party_site_stage_list);
583     MAP_CONTACT_REC(FALSE,p_contact_list, l_dummy, g_contact_stage_list);
584     MAP_CONTACT_POINT_REC(FALSE,p_contact_point_list, l_dummy, g_contact_pt_stage_list);
585 
586   END;
587   FUNCTION init_search(
588       p_party_search_rec      IN      HZ_PARTY_SEARCH.party_search_rec_type:=
589                                   HZ_PARTY_SEARCH.G_MISS_PARTY_SEARCH_REC,
590       p_party_site_list       IN      HZ_PARTY_SEARCH.party_site_list:=
591                                   HZ_PARTY_SEARCH.G_MISS_PARTY_SITE_LIST,
592       p_contact_list          IN      HZ_PARTY_SEARCH.contact_list:= 
593                                   HZ_PARTY_SEARCH.G_MISS_CONTACT_LIST,
594       p_contact_point_list    IN      HZ_PARTY_SEARCH.contact_point_list:=
595                                   HZ_PARTY_SEARCH.G_MISS_CONTACT_POINT_LIST,
596       p_match_type            IN  VARCHAR2,
597       x_party_max_score       OUT NUMBER,
598       x_ps_max_score       OUT NUMBER,
599       x_contact_max_score       OUT NUMBER,
600       x_cpt_max_score       OUT NUMBER
601   ) RETURN NUMBER IS 
602   l_entered_max_score NUMBER:=0;
603   l_ps_entered_max_score NUMBER:=0;
604   l_ct_entered_max_score NUMBER:=0;
605   l_cpt_entered_max_score NUMBER:=0;
606   vlist vlisttype;
607   maxscore HZ_PARTY_SEARCH.IDList;
608   l_name VARCHAR2(200);
609   l_idx NUMBER; 
610   l_num NUMBER; 
611   total NUMBER; 
612   threshold NUMBER; 
613   BEGIN
614    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
615       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
616       hz_utility_v2pub.debug(p_message=>'calling the function init_search',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
617     END IF;
618     IF NOT check_prim_cond (p_party_search_rec,
619                             p_party_site_list,
620                             p_contact_list,
621                             p_contact_point_list) THEN
622       FND_MESSAGE.SET_NAME('AR', 'HZ_NO_PRIMARY_COND');
623       FND_MSG_PUB.ADD;
624       RAISE FND_API.G_EXC_ERROR;
625     END IF;
626    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
627       hz_utility_v2pub.debug(p_message=>'In init_search calling util package set_score',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
628     END IF;
629     HZ_DQM_SEARCH_UTIL.set_score;
630     g_mappings.DELETE;
631     g_party_site_stage_list.DELETE;
632     g_contact_stage_list.DELETE;
633     g_contact_pt_stage_list.DELETE;
634     call_order.DELETE;
635     call_max_score.DELETE;
636     HZ_DQM_SEARCH_UTIL.new_search;
637     HZ_TRANS_PKG.set_party_type(p_party_search_rec.PARTY_TYPE);
638     HZ_DQM_SEARCH_UTIL.set_num_eval(0);
639 
640    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
641       hz_utility_v2pub.debug(p_message=>'In init_search calling the Map procedures',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
642     END IF;
643     -- Transform search criteria
644 POP_PARTY_COND_REC(p_party_search_rec);
645 
646 POP_PARTY_SITES_COND_REC(p_party_site_list);
647 
648 POP_CONTACTS_COND_REC(p_contact_list);
649 
650 POP_CONTACT_POINTS_COND_REC(p_contact_point_list);
651 
652     MAP_PARTY_REC(TRUE,p_party_search_rec, l_entered_max_score, g_party_stage_rec);
653     MAP_PARTY_SITE_REC(TRUE,p_party_site_list, l_ps_entered_max_score, g_party_site_stage_list);
654     MAP_CONTACT_REC(TRUE,p_contact_list, l_ct_entered_max_score, g_contact_stage_list);
655     MAP_CONTACT_POINT_REC(TRUE,p_contact_point_list, l_cpt_entered_max_score, g_contact_pt_stage_list);
656 
657       
658    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
659       hz_utility_v2pub.debug(p_message=>'In init_search determining call order of entities',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
660     END IF;
661     l_idx := l_entered_max_score+1;
662     vlist (l_idx) := 'PARTY';
663     maxscore (l_idx) := l_entered_max_score;
664     l_idx := l_ps_entered_max_score+1;
665     WHILE vlist.EXISTS(l_idx) LOOP
666       l_idx := l_idx+1;
667     END LOOP;
668     vlist (l_idx) := 'PARTY_SITE';
669     maxscore (l_idx) := l_ps_entered_max_score;
670 
671     l_idx := l_ct_entered_max_score+1;
672     WHILE vlist.EXISTS(l_idx) LOOP
673       l_idx := l_idx+1;
674     END LOOP;
675     vlist (l_idx) := 'CONTACT';
676     maxscore (l_idx) := l_ct_entered_max_score;
677 
678     l_idx := l_cpt_entered_max_score+1;
679     WHILE vlist.EXISTS(l_idx) LOOP
680       l_idx := l_idx+1;
681     END LOOP;
682     vlist (l_idx) := 'CONTACT_POINT';
683     maxscore (l_idx) := l_cpt_entered_max_score;
684 
685     l_num := 1;
686     l_idx := vlist.LAST;
687    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
688       hz_utility_v2pub.debug(p_message=>'Call order is the following',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
689     END IF;
690     WHILE l_idx IS NOT NULL LOOP
691       call_order(l_num) := vlist(l_idx);
692       call_max_score(l_num) := maxscore(l_idx);
693    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
694       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
695     END IF;
696    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
697       hz_utility_v2pub.debug(p_message=>'l_num =  '||l_num,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
698       hz_utility_v2pub.debug(p_message=>'entity =  '||vlist(l_idx),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
699       hz_utility_v2pub.debug(p_message=>'call_max_score for entity =  '||maxscore(l_idx),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
700     END IF;
701       l_idx := vlist.PRIOR(l_idx);
702       l_num := l_num+1;
703     END LOOP;  
704    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
705       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
706     END IF;
707     call_order(5):='NONE';
708    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
709       hz_utility_v2pub.debug(p_message=>'In init_search determining call type of entities',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
710     END IF;
711     IF p_match_type = ' OR ' THEN
712    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
713       hz_utility_v2pub.debug(p_message=>'This is an OR Match Rule',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
714     END IF;
715       threshold := 15;
716    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
717       hz_utility_v2pub.debug(p_message=>'This is a Duplicate Identification Match Rule',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
718     END IF;
719    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
720       hz_utility_v2pub.debug(p_message=>'Threshold defined in Match Rule is  '||threshold,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
721     END IF;
722       l_idx := vlist.FIRST;
723       total := 0;
724       l_num := 4;
725       WHILE l_idx IS NOT NULL LOOP
726         total := total+maxscore(l_idx);
727         IF total<threshold THEN
728           call_type(l_num) := 'AND';
729         ELSE
730           call_type(l_num) := 'OR';
731         END IF;
732         l_idx := vlist.NEXT(l_idx);
733         l_num := l_num-1;
734       END LOOP;
735     ELSE
736       call_type(1) := 'OR';
737       call_type(2) := 'AND';
738       call_type(3) := 'AND';
739       call_type(4) := 'AND';
740     END IF;
741    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
742       hz_utility_v2pub.debug(p_message=>'Call types are the following',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
743     END IF;
744    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
745       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
746     END IF;
747    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
748       hz_utility_v2pub.debug(p_message=>'call type 1 =  '||call_type(1),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
749       hz_utility_v2pub.debug(p_message=>'call type 2 =  '||call_type(2),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
750       hz_utility_v2pub.debug(p_message=>'call type 3 =  '||call_type(3),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
751       hz_utility_v2pub.debug(p_message=>'call type 4 =  '||call_type(4),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
752     END IF;
753    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
754       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
755     END IF;
756     x_party_max_score := l_entered_max_score;
757     x_ps_max_score := l_ps_entered_max_score;
758     x_contact_max_score := l_ct_entered_max_score;
759     x_cpt_max_score := l_cpt_entered_max_score;
760    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
761       hz_utility_v2pub.debug(p_message=>'init_search returned with the following max scores at each level',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
762     END IF;
763    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
764       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
765     END IF;
766    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
767       hz_utility_v2pub.debug(p_message=>'entered party max score =  '||l_entered_max_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
768       hz_utility_v2pub.debug(p_message=>'entered paty site max score =  '||l_ps_entered_max_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
769       hz_utility_v2pub.debug(p_message=>'entered contact max score =  '||l_ct_entered_max_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
770       hz_utility_v2pub.debug(p_message=>'entered contact point max score =  '||l_cpt_entered_max_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
771     END IF;
772    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
773       hz_utility_v2pub.debug(p_message=>'entered total score =  '||(l_entered_max_score+l_ps_entered_max_score+l_ct_entered_max_score+l_cpt_entered_max_score),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
774     END IF;
775    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
776       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
777     END IF;
778     RETURN (l_entered_max_score+l_ps_entered_max_score+l_ct_entered_max_score+l_cpt_entered_max_score);
779   END;
780   FUNCTION INIT_PARTY_QUERY(p_match_str VARCHAR2, 
781               p_denorm_str VARCHAR2,
782               p_party_max_score NUMBER,
783               p_denorm_max_score NUMBER,
784               p_non_denorm_max_score NUMBER,
785               p_threshold NUMBER) RETURN VARCHAR2 IS
786     l_party_contains_str VARCHAR2(32000); 
787     l_party_filter VARCHAR2(1) := null;
788     l_prim_temp VARCHAR2(4000);
789     l_denorm_str VARCHAR2(4000);
790   BEGIN
791    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
792       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
793       hz_utility_v2pub.debug(p_message=>'calling the function init_party_query',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
794     END IF;
795    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
796       hz_utility_v2pub.debug(p_message=>'passed in p_match_str is  '||p_match_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
797     END IF;
798    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
799       hz_utility_v2pub.debug(p_message=>'passed in p_denorm_str is  '||p_denorm_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
800     END IF;
801    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
802       hz_utility_v2pub.debug(p_message=>'passed in p_denorm_max_score is  '||p_denorm_max_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
803     END IF;
804    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
805       hz_utility_v2pub.debug(p_message=>'passed in p_non_denorm_max_score is  '||p_non_denorm_max_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
806     END IF;
807    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
808       hz_utility_v2pub.debug(p_message=>'passed in p_threshold is  '||p_threshold,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
809     END IF;
810     IF p_party_max_score<=p_threshold OR p_match_str=' AND ' THEN
811       l_denorm_str := NULL;
812    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
813       hz_utility_v2pub.debug(p_message=>'calculated denorm string l_denorm_str is  '||l_denorm_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
814     END IF;
815     ELSE
816       l_denorm_str := p_denorm_str;
817    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
818       hz_utility_v2pub.debug(p_message=>'calculated denorm string l_denorm_str is  '||l_denorm_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
819     END IF;
820     END IF;
821 
822     -- Setup query string for TAX_REFERENCE
823     l_prim_temp := null;
824     HZ_DQM_SEARCH_UTIL.add_transformation( -- EXACT SPECIAL
825           g_party_stage_rec.TX44,'A18',l_prim_temp);
826 
827   IF l_denorm_str IS NOT NULL THEN
828     IF (p_non_denorm_max_score+20)>=p_threshold THEN
829       l_denorm_str := NULL;
830       HZ_DQM_SEARCH_UTIL.add_attribute(l_prim_temp, p_match_str, l_party_contains_str);
831     ELSIF (p_non_denorm_max_score+p_denorm_max_score+20)>=p_threshold THEN
832       HZ_DQM_SEARCH_UTIL.add_attribute_with_denorm(l_prim_temp, p_match_str, l_denorm_str, l_party_contains_str);
833       l_denorm_str := NULL;
834     END IF;
835   ELSE
836     HZ_DQM_SEARCH_UTIL.add_attribute(l_prim_temp, p_match_str, l_party_contains_str);
837   END IF;
838     IF lengthb(l_party_contains_str) > 4000 THEN
839       FND_MESSAGE.SET_NAME('AR', 'HZ_SEARCH_CRIT_LARGE_ERROR');
840       FND_MESSAGE.SET_TOKEN('ENTITY','PARTY');
841       FND_MSG_PUB.ADD;
842       RAISE FND_API.G_EXC_ERROR;
843     END IF;
844     IF (p_match_str = ' AND ' OR p_party_max_score<p_threshold) AND l_party_contains_str IS NOT NULL AND p_denorm_str IS NOT NULL THEN
845    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
846       hz_utility_v2pub.debug(p_message=>'party contains string returned by init_search is an AND between these strings ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
847     END IF;
848    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
849       hz_utility_v2pub.debug(p_message=>'l_party_contains_str =  '||l_party_contains_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
850     END IF;
851    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
852       hz_utility_v2pub.debug(p_message=>'p_denorm_str =  '||p_denorm_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
853     END IF;
854       RETURN '('||l_party_contains_str||') AND ('||p_denorm_str||')';
855     ELSE
856    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
857       hz_utility_v2pub.debug(p_message=>'party contains string returned by init_search is ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
858       hz_utility_v2pub.debug(p_message=>'l_party_contains_str',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
859     END IF;
860       RETURN l_party_contains_str;
861     END IF;
862   END;
863   FUNCTION INIT_PARTY_SITES_QUERY(p_match_str VARCHAR2, x_denorm_str OUT VARCHAR2) RETURN VARCHAR2 IS
864     l_contains_str VARCHAR2(32000); 
865     l_contains_str_temp VARCHAR2(32000); 
866     l_den_contains_str VARCHAR2(32000); 
867     l_den_contains_str_temp VARCHAR2(32000); 
868     l_filter_str VARCHAR2(4000) := null;
869     l_prim_temp VARCHAR2(4000) := null;
870     l_prim_temp_den VARCHAR2(4000) := null;
871   BEGIN
872     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
873       hz_utility_v2pub.debug(p_message=>'INIT_PARTY_SITES_QUERY  ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
874     END IF;
875     x_denorm_str := NULL;
876     RETURN NULL;
877   END;
878 
879   FUNCTION INIT_CONTACTS_QUERY(p_match_str VARCHAR2, x_denorm_str OUT VARCHAR2) RETURN VARCHAR2 IS
880     l_contains_str VARCHAR2(32000); 
881     l_contains_str_temp VARCHAR2(32000); 
882     l_den_contains_str VARCHAR2(32000); 
883     l_den_contains_str_temp VARCHAR2(32000); 
884     l_filter_str VARCHAR2(4000) := null;
885     l_prim_temp VARCHAR2(4000) := null;
886     l_prim_temp_den VARCHAR2(4000) := null;
887   BEGIN
888     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
889       hz_utility_v2pub.debug(p_message=>'INIT_CONTACTS_QUERY  ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
890     END IF;
891     x_denorm_str := NULL;
892     RETURN NULL;
893   END;
894 
895   FUNCTION INIT_CONTACT_POINTS_QUERY(p_match_str VARCHAR2, x_denorm_str OUT VARCHAR2) RETURN VARCHAR2 IS
896     l_contains_str VARCHAR2(32000); 
897     l_contains_str_temp VARCHAR2(32000); 
898     l_den_contains_str VARCHAR2(32000); 
899     l_den_contains_str_temp VARCHAR2(32000); 
900     l_filter_str VARCHAR2(4000) := null;
901     l_prim_temp VARCHAR2(4000) := null;
902     l_prim_temp_den VARCHAR2(4000) := null;
903   BEGIN
904     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
905       hz_utility_v2pub.debug(p_message=>'INIT_CONTACT_POINTS_QUERY  ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
906     END IF;
907     x_denorm_str := NULL;
908 
909     -- Dynamic setup of party site contains str
910     --
911     -- For each primary transformation add to intermedia query if it 
912     -- is not null
913     FOR I IN 1..g_contact_pt_stage_list.COUNT LOOP
914       l_contains_str_temp := null;
915       l_den_contains_str_temp := null;
916       l_filter_str := null;
917       l_filter_str := '('||g_contact_pt_stage_list(I).CONTACT_POINT_TYPE||') ';
918 
919       -- Setup query string for FLEX_FORMAT_PHONE_NUMBER
920       l_prim_temp := null;
921       l_prim_temp_den := null;
922       HZ_DQM_SEARCH_UTIL.add_transformation( -- EXACT SPECIAL CTX
923             g_contact_pt_stage_list(I).TX1,'A44',l_prim_temp);
924       HZ_DQM_SEARCH_UTIL.add_attribute(l_prim_temp, ' AND ', l_contains_str_temp);
925 
926       -- Setup query string for EMAIL_ADDRESS
927       l_prim_temp := null;
928       l_prim_temp_den := null;
929       HZ_DQM_SEARCH_UTIL.add_transformation( -- CLEANSE (EMAIL) + WRDOMAIN
930             g_contact_pt_stage_list(I).TX6,'A48',l_prim_temp);
931       HZ_DQM_SEARCH_UTIL.add_attribute(l_prim_temp, ' AND ', l_contains_str_temp);
932 
933       HZ_DQM_SEARCH_UTIL.add_search_record(l_contains_str_temp,  	 l_filter_str, l_contains_str);
934       HZ_DQM_SEARCH_UTIL.add_search_record(l_den_contains_str_temp,  	 null, l_den_contains_str);
935     END LOOP;
936     -- Add the search criteria to query string
937     IF lengthb(l_contains_str) > 4000 THEN
938         FND_MESSAGE.SET_NAME('AR', 'HZ_SEARCH_CRIT_LARGE_ERROR');
939         FND_MESSAGE.SET_TOKEN('ENTITY','CONTACT_POINTS');
940         FND_MSG_PUB.ADD;
941         RAISE FND_API.G_EXC_ERROR;
942     END IF;
943     x_denorm_str := l_den_contains_str;
944     RETURN l_contains_str;
945   END;
946 
947   PROCEDURE open_party_cursor_direct (
948             p_dup_party_id NUMBER, 
949             p_restrict_sql VARCHAR2, 
950             p_match_str VARCHAR2,
951             p_search_merged VARCHAR2,
952             p_party_contains_str VARCHAR2,
953             x_cursor OUT HZ_PARTY_STAGE.StageCurTyp) IS
954     l_sqlstr VARCHAR2(4000);
955     l_search_merged VARCHAR2(1);
956   BEGIN
957    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
958       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
959       hz_utility_v2pub.debug(p_message=>'calling procedure open party cursor direct',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
960     END IF;
961     IF (p_search_merged is null) then 
962        l_search_merged := 'N';  
963     ELSE 
964        l_search_merged := p_search_merged; 
965     END IF; 
966    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
967       hz_utility_v2pub.debug(p_message=>'Search Merged Flag -  '||l_search_merged,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
968     END IF;
969     IF p_restrict_sql IS NULL AND NOT g_other_party_level_attribs AND NOT (p_party_contains_str IS NOT NULL AND instrb(p_party_contains_str,'D_PS')>0 AND g_party_site_stage_list.COUNT=1) THEN
970    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
971       hz_utility_v2pub.debug(p_message=>'Restrict SQL is NULL and other conditions met to OPEN x_cursor',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
972     END IF;
973      OPEN x_cursor FOR 
974       SELECT PARTY_ID , TX44
975       FROM hz_staged_parties 
976       WHERE TX8 LIKE g_party_stage_rec.TX8||' %'
977       AND ((g_party_stage_rec.TX36 IS NULL OR g_party_stage_rec.TX36||' ' =  TX36))
978       AND( (l_search_merged ='Y' ) 
979            OR (l_search_merged = 'I' AND nvl(status, 'A') in ('A', 'I'))  
980            OR (l_search_merged = 'N' AND nvl(status, 'A') in ('A')))  
981       AND (p_dup_party_id IS NULL OR party_id <> p_dup_party_id);
982     ELSE
983    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
984       hz_utility_v2pub.debug(p_message=>'Restrict SQL is NOT NULL OR other conditions not met, Else Part',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
985     END IF;
986       l_sqlstr := 'SELECT PARTY_ID , TX44 FROM hz_staged_parties stage ';
987       l_sqlstr := l_sqlstr || ' WHERE TX8 like :TX8||'' %'' ';
988       l_sqlstr := l_sqlstr || ' AND (:TX36 IS NULL OR :TX36||'' '' =  TX36) ';
989       IF l_search_merged = 'N' THEN
990         l_sqlstr := l_sqlstr || ' AND nvl(status,''A'')=''A'' ';
991       ELSIF l_search_merged = 'I' THEN
992         l_sqlstr := l_sqlstr || ' AND nvl(status,''A'') in (''A'',''I'') ';
993       END IF;
994       l_sqlstr := l_sqlstr || ' AND (:p_dup IS NULL OR party_id <> :p_dup ) ';
995       IF g_other_party_level_attribs THEN
996       l_sqlstr := l_sqlstr || ' AND ((:attr IS NULL OR ';
997       l_sqlstr := l_sqlstr || '     (TX44 like :TX44||'' %'' ';
998      l_sqlstr := l_sqlstr || ' )) ';
999      l_sqlstr := l_sqlstr || ' ) ';
1000       l_sqlstr := l_sqlstr || ' AND (:attr IS NULL OR ';
1001       l_sqlstr := l_sqlstr || '     (TX36 like :TX36||'' %'' ';
1002      l_sqlstr := l_sqlstr || ' )) ';
1003      END IF;
1004      IF p_party_contains_str IS NOT NULL AND instrb(p_party_contains_str,'D_PS')>0 AND g_party_site_stage_list.COUNT=1 THEN
1005    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1006       hz_utility_v2pub.debug(p_message=>'p_party_contains_str string is NOT NULL and other conditions met',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1007     END IF;
1008        null;
1009      END IF;
1010    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1011       hz_utility_v2pub.debug(p_message=>'l_sqlstr before appending restrict_sql',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1012     END IF;
1013    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1014       hz_utility_v2pub.debug(p_message=>'l_sqlstr is -  '||l_sqlstr,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1015     END IF;
1016      IF p_restrict_sql IS NOT NULL THEN
1017        l_sqlstr := l_sqlstr || ' AND '||p_restrict_sql||' ';
1018      END IF;
1019    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1020       hz_utility_v2pub.debug(p_message=>'l_sqlstr after appending restrict_sql',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1021     END IF;
1022    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1023       hz_utility_v2pub.debug(p_message=>'l_sqlstr is -  '||l_sqlstr,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1024     END IF;
1025      IF g_other_party_level_attribs AND p_party_contains_str IS NOT NULL AND instrb(p_party_contains_str,'D_PS')>0 AND g_party_site_stage_list.COUNT=1 THEN
1026    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1027       hz_utility_v2pub.debug(p_message=>'IF g_other_party_level_attribs AND p_party_contains_str IS NOT NULL AND ...',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1028     END IF;
1029        OPEN x_cursor FOR l_sqlstr USING g_party_stage_rec.TX8,g_party_stage_rec.TX36,g_party_stage_rec.TX36,p_dup_party_id,p_dup_party_id
1030      ,g_party_stage_rec.TX44
1031      ,g_party_stage_rec.TX44
1032      ,g_party_stage_rec.TX36
1033      ,g_party_stage_rec.TX36
1034      ;
1035      ELSIF g_other_party_level_attribs THEN
1036    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1037       hz_utility_v2pub.debug(p_message=>'ELSIF g_other_party_level_attribs THEN',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1038     END IF;
1039        OPEN x_cursor FOR l_sqlstr USING g_party_stage_rec.TX8,g_party_stage_rec.TX36,g_party_stage_rec.TX36,p_dup_party_id,p_dup_party_id
1040      ,g_party_stage_rec.TX44
1041      ,g_party_stage_rec.TX44
1042      ,g_party_stage_rec.TX36
1043      ,g_party_stage_rec.TX36
1044      ;
1045      ELSIF p_party_contains_str IS NOT NULL AND instrb(p_party_contains_str,'D_PS')>0 AND g_party_site_stage_list.COUNT=1 THEN
1046    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1047       hz_utility_v2pub.debug(p_message=>'ELSIF p_party_contains_str IS NOT NULL AND ...',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1048     END IF;
1049        OPEN x_cursor FOR l_sqlstr USING g_party_stage_rec.TX8,g_party_stage_rec.TX36,g_party_stage_rec.TX36,p_dup_party_id,p_dup_party_id
1050      ;
1051      ELSE
1052    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1053       hz_utility_v2pub.debug(p_message=>'ELSE code fork',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1054     END IF;
1055        OPEN x_cursor FOR l_sqlstr USING g_party_stage_rec.TX8,g_party_stage_rec.TX36,g_party_stage_rec.TX36,p_dup_party_id,p_dup_party_id;
1056      END IF;
1057     END IF;
1058   END;
1059   PROCEDURE open_party_cursor(
1060             p_dup_party_id NUMBER, 
1061             p_restrict_sql VARCHAR2, 
1062             p_contains_str  VARCHAR2, 
1063             p_search_ctx_id NUMBER,
1064             p_match_str VARCHAR2,
1065             p_search_merged VARCHAR2,
1066             x_cursor OUT HZ_PARTY_STAGE.StageCurTyp) IS
1067   l_sqlstr VARCHAR2(4000);
1068   l_hint VARCHAR2(100); 
1069   l_check NUMBER; 
1070   l_search_merged VARCHAR2(1); 
1071   BEGIN
1072    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1073       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1074       hz_utility_v2pub.debug(p_message=>'calling procedure open party cursor',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1075     END IF;
1076     IF (p_search_merged is null) then 
1077        l_search_merged := 'N';  
1078     ELSE 
1079        l_search_merged := p_search_merged; 
1080     END IF; 
1081     IF p_contains_str IS NULL THEN
1082    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1083       hz_utility_v2pub.debug(p_message=>'part contains string is null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1084     END IF;
1085       OPEN x_cursor FOR 
1086         SELECT PARTY_ID , TX44
1087         FROM HZ_STAGED_PARTIES stage
1088         WHERE PARTY_ID = p_dup_party_id;
1089     ELSIF p_restrict_sql IS NULL OR p_search_ctx_id IS NOT NULL THEN
1090    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1091       hz_utility_v2pub.debug(p_message=>'Either restrict sql is null or search context id is not null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1092     END IF;
1093       IF p_search_ctx_id IS NULL THEN
1094    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1095       hz_utility_v2pub.debug(p_message=>'Search context id is null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1096     END IF;
1097         OPEN x_cursor FOR 
1098           SELECT PARTY_ID , TX44
1099           FROM HZ_STAGED_PARTIES stage
1100           WHERE contains( concat_col, p_contains_str)>0
1101           AND ((g_party_stage_rec.TX36 IS NULL OR g_party_stage_rec.TX36||' ' =  stage.TX36))
1102           AND( (l_search_merged ='Y' ) 
1103           OR (l_search_merged = 'I' AND nvl(stage.status, 'A') in ('A', 'I'))  
1104           OR (l_search_merged = 'N' AND nvl(stage.status, 'A') in ('A'))       ) 
1105           AND (p_dup_party_id IS NULL OR stage.party_id <> p_dup_party_id);
1106       ELSE
1107    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1108       hz_utility_v2pub.debug(p_message=>'Search context id is not null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1109     END IF;
1110         OPEN x_cursor FOR 
1111             SELECT /*+ ORDERED INDEX(stage HZ_STAGED_PARTIES_U1) */ stage.PARTY_ID , TX44
1112             FROM HZ_DQM_PARTIES_GT d, HZ_STAGED_PARTIES stage
1113             WHERE contains( concat_col, p_contains_str)>0
1114             AND d.SEARCH_CONTEXT_ID=p_search_ctx_id
1115             AND d.party_id = stage.party_id
1116             AND ((g_party_stage_rec.TX36 IS NULL OR g_party_stage_rec.TX36||' ' =  stage.TX36))
1117             AND (p_dup_party_id IS NULL OR stage.party_id <> p_dup_party_id)
1118             AND( (l_search_merged ='Y' ) 
1119             OR (l_search_merged = 'I' AND nvl(stage.status, 'A') in ('A', 'I'))  
1120             OR (l_search_merged = 'N' AND nvl(stage.status, 'A') in ('A'))       ); 
1121       END IF;
1122     ELSE
1123    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1124       hz_utility_v2pub.debug(p_message=>'Restrict sql is not null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1125     END IF;
1126        l_check := instrb(p_restrict_sql, 'SELECTIVE'); 
1127        IF (l_check > 0 ) THEN 
1128    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1129       hz_utility_v2pub.debug(p_message=>'Restrict sql has a Selective Hint',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1130     END IF;
1131            l_hint := '/*+ INDEX(stage HZ_STAGED_PARTIES_U1) */'; 
1132        END IF; 
1133      IF p_search_ctx_id IS NULL THEN
1134        l_sqlstr := 'SELECT   ' || l_hint || ' PARTY_ID , TX44'||
1135                    ' FROM HZ_STAGED_PARTIES stage'||
1136                    ' WHERE contains( concat_col, :cont)>0'||
1137                    ' AND ((:TX36 IS NULL OR :TX36||'' '' =  stage.TX36))'||
1138                    ' AND ('||p_restrict_sql||')' ||
1139                    ' AND (:p_dup IS NULL OR stage.party_id <> :p_dup) '; 
1140           IF l_search_merged = 'Y' THEN  
1141                   l_sqlstr := l_sqlstr ;  
1142           ELSIF l_search_merged = 'I' THEN  
1143                   l_sqlstr := l_sqlstr ||' AND nvl(stage.status,''A'') in (''A'', ''I'')';  
1144           ELSE  
1145                   l_sqlstr := l_sqlstr ||' AND nvl(stage.status,''A'') in (''A'')';  
1146           END IF;  
1147  	   output_long_strings('----------------------------------------------------------');
1148       output_long_strings('Party Contains String = '||p_contains_str);
1149 		output_long_strings('Restrict Sql = '||p_restrict_sql);
1150        OPEN x_cursor FOR l_sqlstr USING p_contains_str
1151                               ,g_party_stage_rec.TX36,g_party_stage_rec.TX36
1152                     ,p_dup_party_id, p_dup_party_id;
1153      END IF;
1154    END IF;
1155   exception
1156     when others then
1157       if (instrb(SQLERRM,'DRG-51030')>0) then 
1158         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_WILDCARD_ERR');
1159         FND_MSG_PUB.ADD;
1160         RAISE FND_API.G_EXC_ERROR;
1161       elsif (instrb(SQLERRM,'DRG-50943')>0) then 
1162         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_SEARCH_ERROR');
1163         FND_MSG_PUB.ADD;
1164         RAISE FND_API.G_EXC_ERROR;
1165       elsif (instrb(SQLERRM,'ORA-20000')>0) then 
1166         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_SEARCH_ERROR');
1167         FND_MSG_PUB.ADD;
1168         RAISE FND_API.G_EXC_ERROR;
1169       else 
1170         FND_MESSAGE.SET_NAME('AR', 'HZ_API_OTHERS_EXCEP');
1171     	 FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
1172     	 FND_MSG_PUB.ADD;
1173         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1174       end if;
1175   END;
1176 
1177   PROCEDURE open_party_site_cursor(
1178             p_dup_party_id NUMBER, 
1179             p_party_id NUMBER, 
1180             p_restrict_sql VARCHAR2, 
1181             p_contains_str  VARCHAR2, 
1182             p_search_ctx_id  NUMBER, 
1183             p_search_merged  VARCHAR2, 
1184             p_search_rel_sites  VARCHAR2, 
1185             p_person_api  VARCHAR2, 
1186             x_cursor OUT HZ_PARTY_STAGE.StageCurTyp) IS
1187   l_sqlstr VARCHAR2(4000);
1188   l_hint VARCHAR2(100); 
1189   l_check NUMBER; 
1190   l_check_dt NUMBER; 
1191   l_search_merged VARCHAR2(1); 
1192   l_status_sql VARCHAR2(100); 
1193   p_restrict_sql1 VARCHAR2(4000); 
1194  
1195   BEGIN
1196    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1197       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1198       hz_utility_v2pub.debug(p_message=>'calling the procedure open_party_site_cursor',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1199     END IF;
1200      IF (p_search_merged is null) then 
1201         l_search_merged := 'N';  
1202      ELSE 
1203         l_search_merged := p_search_merged; 
1204      END IF; 
1205      IF p_party_id IS NOT NULL THEN
1206    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1207       hz_utility_v2pub.debug(p_message=>'Single Party Scenario',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1208     END IF;
1209        IF p_search_rel_sites = 'N' THEN
1210          OPEN x_cursor FOR 
1211           SELECT /*+ INDEX(stage HZ_STAGED_PARTY_SITES_N1) */ PARTY_SITE_ID, PARTY_ID, ORG_CONTACT_ID
1212           FROM HZ_STAGED_PARTY_SITES stage
1213           WHERE contains( concat_col, p_contains_str)>0
1214           AND( (l_search_merged ='Y' )  
1215              OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1216              OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1217           AND stage.party_id = p_party_id; 
1218        ELSE
1219          OPEN x_cursor FOR 
1220           SELECT /*+ INDEX(stage HZ_STAGED_PARTY_SITES_N1) */ PARTY_SITE_ID, PARTY_ID, ORG_CONTACT_ID
1221           FROM HZ_STAGED_PARTY_SITES stage
1222           WHERE contains( concat_col, p_contains_str)>0
1223           AND( (l_search_merged ='Y' )  
1224             OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1225             OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1226           AND stage.party_id = p_party_id 
1227           UNION
1228           SELECT /*+ INDEX(stage HZ_STAGED_PARTY_SITES_N2) */ stage.PARTY_SITE_ID, stage.PARTY_ID, stage.ORG_CONTACT_ID
1229           FROM HZ_STAGED_PARTY_SITES stage, hz_relationships r, hz_org_contacts oc
1230           WHERE contains( concat_col, p_contains_str)>0
1231           AND( (l_search_merged ='Y' )  
1232             OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1233             OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1234           AND r.object_id = p_party_id 
1235           AND r.subject_id = stage.party_id 
1236           AND r.SUBJECT_TABLE_NAME = 'HZ_PARTIES' 
1237           AND r.OBJECT_TABLE_NAME = 'HZ_PARTIES' 
1238           AND r.relationship_id = oc.party_relationship_id
1239           AND oc.org_contact_id = stage.org_contact_id; 
1240       END IF;
1241     ELSIF p_restrict_sql IS NULL OR p_search_ctx_id IS NOT NULL THEN
1242    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1243       hz_utility_v2pub.debug(p_message=>'Either restrict sql is null or search context id is not null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1244     END IF;
1245       IF p_search_ctx_id IS NULL THEN
1246    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1247       hz_utility_v2pub.debug(p_message=>'Search context id is null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1248     END IF;
1249         OPEN x_cursor FOR 
1250           SELECT PARTY_SITE_ID, PARTY_ID, ORG_CONTACT_ID
1251           FROM HZ_STAGED_PARTY_SITES stage
1252         WHERE contains( concat_col, p_contains_str)>0
1253         AND EXISTS (
1254           SELECT 1 FROM HZ_STAGED_PARTIES p
1255           WHERE p.PARTY_ID = stage.PARTY_ID
1256           AND( (l_search_merged ='Y' )  
1257           OR (l_search_merged = 'I' AND nvl(p.status, 'A') in ('A', 'I'))  
1258           OR (l_search_merged = 'N' AND nvl(p.status, 'A') in ('A'))       )  
1259           AND ((g_party_stage_rec.TX36 IS NULL OR g_party_stage_rec.TX36||' ' =  p.TX36)))
1260           AND( (l_search_merged ='Y' )  
1261            OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1262            OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1263           AND (p_dup_party_id IS NULL OR stage.party_id <> p_dup_party_id);
1264       ELSE
1265    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1266       hz_utility_v2pub.debug(p_message=>'Search context id is not null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1267     END IF;
1268         IF p_person_api = 'Y' THEN
1269           OPEN x_cursor FOR 
1270             SELECT /*+ ORDERED INDEX(stage HZ_STAGED_PARTY_SITES_N1) */ PARTY_SITE_ID, stage.PARTY_ID, ORG_CONTACT_ID
1271             FROM HZ_DQM_PARTIES_GT d, HZ_STAGED_PARTY_SITES stage
1272             WHERE contains( concat_col, p_contains_str)>0
1273           AND( (l_search_merged ='Y' )  
1274           OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1275           OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1276             AND d.search_context_id = p_search_ctx_id
1277             AND d.party_id = stage.party_id
1278             AND (p_dup_party_id IS NULL OR stage.party_id <> p_dup_party_id)
1279             UNION 
1280             SELECT /*+ INDEX(stage HZ_STAGED_PARTY_SITES_N2) */ stage.PARTY_SITE_ID, r.subject_id, stage.ORG_CONTACT_ID
1281             FROM HZ_DQM_PARTIES_GT d, hz_relationships r,hz_org_contacts oc, HZ_STAGED_PARTY_SITES stage
1282             WHERE contains( concat_col, p_contains_str)>0
1283           AND( (l_search_merged ='Y' )  
1284           OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1285           OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1286             AND d.search_context_id = p_search_ctx_id
1287             AND d.party_id = r.subject_id
1288             AND r.relationship_id = oc.party_relationship_id
1289             AND oc.org_contact_id = stage.org_contact_id
1290             AND (p_dup_party_id IS NULL OR r.subject_id <> p_dup_party_id);
1291         ELSE
1292           OPEN x_cursor FOR 
1293             SELECT /*+ ORDERED INDEX(stage HZ_STAGED_PARTY_SITES_N1) */ PARTY_SITE_ID, stage.PARTY_ID, ORG_CONTACT_ID
1294             FROM HZ_DQM_PARTIES_GT d, HZ_STAGED_PARTY_SITES stage
1295             WHERE contains( concat_col, p_contains_str)>0
1296             AND( (l_search_merged ='Y' )  
1297              OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1298              OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1299             AND d.search_context_id = p_search_ctx_id
1300             AND d.party_id = stage.party_id
1301             AND (p_dup_party_id IS NULL OR stage.party_id <> p_dup_party_id);
1302         END IF;
1303       END IF;
1304     ELSE
1305    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1306       hz_utility_v2pub.debug(p_message=>'Restrict sql is not null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1307     END IF;
1308        l_check := instrb(p_restrict_sql, 'SELECTIVE'); 
1309        l_check_dt := instrb(p_restrict_sql, 'SELECTIVE_PS'); 
1310        IF (l_check_dt > 0 ) THEN 
1311    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1312       hz_utility_v2pub.debug(p_message=>'Restrict sql has the selective_ps  hint',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1313     END IF;
1314            l_hint := '/*+ INDEX(stage HZ_STAGED_PARTY_SITES_U1) */'; 
1315        ELSIF (l_check > 0 ) THEN 
1316    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1317       hz_utility_v2pub.debug(p_message=>'Restrict sql has the selective hint',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1318     END IF;
1319            l_hint := '/*+ INDEX(stage HZ_STAGED_PARTY_SITES_N1) */'; 
1320        END IF; 
1321        IF l_search_merged = 'Y' THEN 
1322                l_status_sql := ' ' ;  
1323        ELSIF l_search_merged = 'I' THEN  
1324                l_status_sql := ' AND nvl(p.status,''A'') in (''A'', ''I'')'; 
1325        ELSE 
1326                l_status_sql := ' AND nvl(p.status,''A'') in (''A'')'; 
1327        END IF; 
1328  		/*Performance fix for Bug:4589953*/ 
1329  		IF(p_person_api='Y') THEN 
1330        IF (l_check > 0 ) THEN 
1331        IF instrb(p_restrict_sql, 'STAGE.') > 0 THEN 
1332        	p_restrict_sql1 := replace( p_restrict_sql, 'STAGE.', 'stage1.');
1333        ELSIF instrb(p_restrict_sql, 'stage.') > 0 THEN 
1334        	p_restrict_sql1 := replace( p_restrict_sql, 'stage.', 'stage1.');
1335        ELSE
1336 		p_restrict_sql1 := 'stage1.'||p_restrict_sql;
1337        END IF; 
1338        l_sqlstr := 'SELECT  /*+ INDEX(stage HZ_STAGED_PARTY_SITES_N1) */ PARTY_SITE_ID, PARTY_ID, ORG_CONTACT_ID '||
1339                    ' FROM HZ_STAGED_PARTY_SITES stage'||
1340                    ' WHERE contains( concat_col, :cont)>0'||
1341                    '  AND( ('''||l_search_merged||''' =''Y'' )  '|| 
1342                    '   OR ('''||l_search_merged||''' = ''I'' AND nvl(stage.status_flag, ''A'') in (''A'', ''I''))  '|| 
1343                    '   OR ('''||l_search_merged||''' = ''N'' AND nvl(stage.status_flag, ''A'') = ''A'')       )  '|| 
1344          ' AND (ORG_CONTACT_ID IS NULL ' ||
1345        	' AND ('||p_restrict_sql||'))' ||
1346        	' AND (:p_dup IS NULL OR stage.party_id <> :p_dup) ' ||
1347          ' UNION ' ||
1348        			 'SELECT /*+ INDEX(stage HZ_STAGED_PARTY_SITES_N2) */ PARTY_SITE_ID, PARTY_ID, ORG_CONTACT_ID '||
1349                    ' FROM HZ_STAGED_PARTY_SITES stage'||
1350                    ' WHERE contains( concat_col, :cont)>0'||
1351                    '  AND( ('''||l_search_merged||''' =''Y'' )  '|| 
1352                    '   OR ('''||l_search_merged||''' = ''I'' AND nvl(stage.status_flag, ''A'') in (''A'', ''I''))  '|| 
1353                    '   OR ('''||l_search_merged||''' = ''N'' AND nvl(stage.status_flag, ''A'') = ''A'')       )  '|| 
1354          ' AND ORG_CONTACT_ID IN ' ||
1355          ' ( SELECT org_contact_id from HZ_ORG_CONTACTS oc, (select object_id, relationship_id, subject_id party_id from hz_relationships ' ||
1356          ' where subject_type = ''PERSON'' AND object_type = ''ORGANIZATION'') stage1 ' ||
1357          ' where stage1.relationship_id = oc.party_relationship_id ' || 
1358          ' and ('||p_restrict_sql1|| ') )' ||
1359          ' AND (:p_dup IS NULL OR stage.party_id <> :p_dup) '; 
1360        OPEN x_cursor FOR l_sqlstr USING p_contains_str,
1361                     p_dup_party_id, p_dup_party_id, p_contains_str, p_dup_party_id, p_dup_party_id;
1362        ELSE 
1363        l_sqlstr := 'SELECT ' || l_hint ||' PARTY_SITE_ID, PARTY_ID, ORG_CONTACT_ID '||
1364                    ' FROM HZ_STAGED_PARTY_SITES stage'||
1365                    ' WHERE contains( concat_col, :cont)>0'||
1366                    '  AND( ('''||l_search_merged||''' =''Y'' )  '|| 
1367                    '   OR ('''||l_search_merged||''' = ''I'' AND nvl(stage.status_flag, ''A'') in (''A'', ''I''))  '|| 
1368                    '   OR ('''||l_search_merged||''' = ''N'' AND nvl(stage.status_flag, ''A'') = ''A'')       )  '|| 
1369                  ' AND EXISTS ('||
1370                  ' SELECT 1 FROM HZ_STAGED_PARTIES p ' || 
1371                  ' WHERE p.party_id = stage.party_id ' || 
1372                  ' AND ((:TX36 IS NULL OR :TX36||'' '' =  p.TX36))  '|| l_status_sql ||' ) ' || 
1373                    ' AND ('||get_adjusted_restrict_sql(p_restrict_sql)||')' ||
1374                    ' AND (:p_dup IS NULL OR stage.party_id <> :p_dup) '; 
1375        OPEN x_cursor FOR l_sqlstr USING p_contains_str
1376                               ,g_party_stage_rec.TX36,g_party_stage_rec.TX36
1377                     ,p_dup_party_id, p_dup_party_id;
1378        END IF; 
1379 		ELSE 
1380        l_sqlstr := 'SELECT ' || l_hint ||' PARTY_SITE_ID, PARTY_ID, ORG_CONTACT_ID '||
1381                    ' FROM HZ_STAGED_PARTY_SITES stage'||
1382                    ' WHERE contains( concat_col, :cont)>0'||
1383                    '  AND( ('''||l_search_merged||''' =''Y'' )  '|| 
1384                    '   OR ('''||l_search_merged||''' = ''I'' AND nvl(stage.status_flag, ''A'') in (''A'', ''I''))  '|| 
1385                    '   OR ('''||l_search_merged||''' = ''N'' AND nvl(stage.status_flag, ''A'') = ''A'')       )  '|| 
1386                  ' AND EXISTS ('||
1387                  ' SELECT 1 FROM HZ_STAGED_PARTIES p ' || 
1388                  ' WHERE p.party_id = stage.party_id ' || 
1389                  ' AND ((:TX36 IS NULL OR :TX36||'' '' =  p.TX36))  '|| l_status_sql ||' ) ' || 
1390                    ' AND ('||p_restrict_sql||')' ||
1391                    ' AND (:p_dup IS NULL OR stage.party_id <> :p_dup) '; 
1392        OPEN x_cursor FOR l_sqlstr USING p_contains_str
1393                               ,g_party_stage_rec.TX36,g_party_stage_rec.TX36
1394                     ,p_dup_party_id, p_dup_party_id;
1395 		  END IF; 
1396     END IF;
1397  	    output_long_strings('----------------------------------------------------------');
1398        output_long_strings('Party Site Contains String = '||p_contains_str);
1399 		output_long_strings('Restrict Sql = '||p_restrict_sql);
1400   exception
1401     when others then
1402       if (instrb(SQLERRM,'DRG-51030')>0) then 
1403         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_WILDCARD_ERR');
1404         FND_MSG_PUB.ADD;
1405         RAISE FND_API.G_EXC_ERROR;
1406       elsif (instrb(SQLERRM,'DRG-50943')>0) then 
1407         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_SEARCH_ERROR');
1408         FND_MSG_PUB.ADD;
1409         RAISE FND_API.G_EXC_ERROR;
1410       elsif (instrb(SQLERRM,'ORA-20000')>0) then 
1411         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_SEARCH_ERROR');
1412         FND_MSG_PUB.ADD;
1413         RAISE FND_API.G_EXC_ERROR;
1414       else 
1415         FND_MESSAGE.SET_NAME('AR', 'HZ_API_OTHERS_EXCEP');
1416     	 FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
1417     	 FND_MSG_PUB.ADD;
1418         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1419       end if;
1420   END;
1421 
1422   PROCEDURE open_contact_cursor(
1423             p_dup_party_id NUMBER, 
1424             p_party_id NUMBER, 
1425             p_restrict_sql VARCHAR2, 
1426             p_contains_str  VARCHAR2, 
1427             p_search_ctx_id  NUMBER, 
1428             p_search_merged  VARCHAR2, 
1429             x_cursor OUT HZ_PARTY_STAGE.StageCurTyp) IS
1430   l_sqlstr VARCHAR2(4000);
1431   l_hint VARCHAR2(100); 
1432   l_check NUMBER; 
1433   l_check_dt NUMBER; 
1434   l_search_merged VARCHAR2(1); 
1435   l_status_sql VARCHAR2(100); 
1436  
1437   BEGIN
1438    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1439       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1440       hz_utility_v2pub.debug(p_message=>'calling the procedure open_contact_cursor',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1441     END IF;
1442      IF (p_search_merged is null) then 
1443         l_search_merged := 'N';  
1444      ELSE 
1445         l_search_merged := p_search_merged; 
1446      END IF; 
1447      IF p_party_id IS NOT NULL THEN
1448    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1449       hz_utility_v2pub.debug(p_message=>'Single party scenario',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1450     END IF;
1451        OPEN x_cursor FOR 
1452           SELECT /*+ INDEX(stage HZ_STAGED_CONTACTS_N1) */ ORG_CONTACT_ID, PARTY_ID
1453           FROM HZ_STAGED_CONTACTS stage
1454         WHERE contains( concat_col, p_contains_str)>0
1455         AND EXISTS (
1456           SELECT 1 FROM HZ_STAGED_PARTIES p
1457           WHERE p.PARTY_ID = stage.PARTY_ID
1458           AND( (l_search_merged ='Y' )  
1459           OR (l_search_merged = 'I' AND nvl(p.status, 'A') in ('A', 'I'))  
1460           OR (l_search_merged = 'N' AND nvl(p.status, 'A') in ('A'))       )  
1461           AND ((g_party_stage_rec.TX36 IS NULL OR g_party_stage_rec.TX36||' ' =  p.TX36)))
1462           AND( (l_search_merged ='Y' )  
1463            OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1464            OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1465           AND stage.party_id = p_party_id;
1466     ELSIF p_restrict_sql IS NULL OR p_search_ctx_id IS NOT NULL THEN
1467    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1468       hz_utility_v2pub.debug(p_message=>'Either Restrict sql is null or Search Context Id is not null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1469     END IF;
1470       IF p_search_ctx_id IS NULL THEN
1471    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1472       hz_utility_v2pub.debug(p_message=>'Search Context id is null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1473     END IF;
1474         OPEN x_cursor FOR 
1475           SELECT ORG_CONTACT_ID, PARTY_ID
1476           FROM HZ_STAGED_CONTACTS stage
1477         WHERE contains( concat_col, p_contains_str)>0
1478         AND EXISTS (
1479           SELECT 1 FROM HZ_STAGED_PARTIES p
1480           WHERE p.PARTY_ID = stage.PARTY_ID
1481           AND( (l_search_merged ='Y' )  
1482           OR (l_search_merged = 'I' AND nvl(p.status, 'A') in ('A', 'I'))  
1483           OR (l_search_merged = 'N' AND nvl(p.status, 'A') in ('A'))       )  
1484           AND ((g_party_stage_rec.TX36 IS NULL OR g_party_stage_rec.TX36||' ' =  p.TX36)))
1485           AND( (l_search_merged ='Y' )  
1486            OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1487            OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1488           AND (p_dup_party_id IS NULL OR stage.party_id <> p_dup_party_id);
1489       ELSE
1490    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1491       hz_utility_v2pub.debug(p_message=>'Search Context id is not null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1492     END IF;
1493           OPEN x_cursor FOR 
1494             SELECT /*+ ORDERED INDEX(stage HZ_STAGED_CONTACTS_N1) */ ORG_CONTACT_ID, stage.PARTY_ID
1495             FROM HZ_DQM_PARTIES_GT d, HZ_STAGED_CONTACTS stage
1496             WHERE contains( concat_col, p_contains_str)>0
1497             AND d.search_context_id = p_search_ctx_id
1498             AND d.party_id = stage.party_id
1499             AND( (l_search_merged ='Y' )  
1500              OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1501              OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1502             AND (p_dup_party_id IS NULL OR stage.party_id <> p_dup_party_id);
1503       END IF;
1504     ELSE
1505    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1506       hz_utility_v2pub.debug(p_message=>'Restrict Sql is not null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1507     END IF;
1508        l_check := instrb(p_restrict_sql, 'SELECTIVE'); 
1509        l_check_dt := instrb(p_restrict_sql, 'SELECTIVE_CT'); 
1510        IF (l_check_dt > 0 ) THEN 
1511    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1512       hz_utility_v2pub.debug(p_message=>'Restrict sql has the selective_ct hint',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1513     END IF;
1514            l_hint := '/*+ INDEX(stage HZ_STAGED_CONTACTS_U1) */'; 
1515        ELSIF (l_check > 0 ) THEN 
1516    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1517       hz_utility_v2pub.debug(p_message=>'Restrict sql has the selective hint',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1518     END IF;
1519            l_hint := '/*+ INDEX(stage HZ_STAGED_CONTACTS_N1) */'; 
1520        END IF; 
1521        IF l_search_merged = 'Y' THEN 
1522                l_status_sql := ' ' ;  
1523        ELSIF l_search_merged = 'I' THEN  
1524                l_status_sql := ' AND nvl(p.status,''A'') in (''A'', ''I'')'; 
1525        ELSE 
1526                l_status_sql := ' AND nvl(p.status,''A'') in (''A'')'; 
1527        END IF; 
1528        l_sqlstr := 'SELECT   ' || l_hint || ' ORG_CONTACT_ID, PARTY_ID '||
1529                    ' FROM HZ_STAGED_CONTACTS stage'||
1530                    ' WHERE contains( concat_col, :cont)>0'||
1531                  ' AND EXISTS ('||
1532                  ' SELECT 1 FROM HZ_STAGED_PARTIES p ' || 
1533                  ' WHERE p.party_id = stage.party_id ' || 
1534                  ' AND ((:TX36 IS NULL OR :TX36||'' '' =  p.TX36)) '|| l_status_sql ||' ) ' || 
1535                   ' AND( ('''||l_search_merged||''' =''Y'' )  '||
1536                   ' OR ('''||l_search_merged||''' = ''I'' AND nvl(stage.status_flag, ''A'') in (''A'', ''I''))  '||
1537                   ' OR ('''||l_search_merged||''' = ''N'' AND nvl(stage.status_flag, ''A'') = ''A'')       )  '||
1538                    ' AND ('||p_restrict_sql||')' ||
1539                    ' AND (:p_dup IS NULL OR stage.party_id <> :p_dup) '; 
1540        OPEN x_cursor FOR l_sqlstr USING p_contains_str
1541                               ,g_party_stage_rec.TX36,g_party_stage_rec.TX36
1542                     ,p_dup_party_id, p_dup_party_id;
1543     END IF;
1544  	    output_long_strings('----------------------------------------------------------');
1545        output_long_strings('Contacts Contains String = '||p_contains_str);
1546 		output_long_strings('Restrict Sql = '||p_restrict_sql);
1547   exception
1548     when others then
1549       if (instrb(SQLERRM,'DRG-51030')>0) then 
1550         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_WILDCARD_ERR');
1551         FND_MSG_PUB.ADD;
1552         RAISE FND_API.G_EXC_ERROR;
1553       elsif (instrb(SQLERRM,'DRG-50943')>0) then 
1554         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_SEARCH_ERROR');
1555         FND_MSG_PUB.ADD;
1556         RAISE FND_API.G_EXC_ERROR;
1557       elsif (instrb(SQLERRM,'ORA-20000')>0) then 
1558         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_SEARCH_ERROR');
1559         FND_MSG_PUB.ADD;
1560         RAISE FND_API.G_EXC_ERROR;
1561       else 
1562         FND_MESSAGE.SET_NAME('AR', 'HZ_API_OTHERS_EXCEP');
1563     	 FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
1564     	 FND_MSG_PUB.ADD;
1565         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1566       end if;
1567   END;
1568 
1569   PROCEDURE open_contact_pt_cursor(
1570             p_dup_party_id NUMBER, 
1571             p_party_id NUMBER, 
1572             p_restrict_sql VARCHAR2, 
1573             p_contains_str  VARCHAR2, 
1574             p_search_ctx_id  NUMBER, 
1575             p_search_merged  VARCHAR2, 
1576             p_search_rel_cpts  VARCHAR2, 
1577             p_person_api  VARCHAR2, 
1578             x_cursor OUT HZ_PARTY_STAGE.StageCurTyp,
1579             p_restrict_entity VARCHAR2 DEFAULT NULL) IS
1580   l_sqlstr VARCHAR2(4000);
1581   l_hint VARCHAR2(100); 
1582   l_check NUMBER; 
1583   l_check_dt NUMBER; 
1584   l_search_merged VARCHAR2(1); 
1585   l_status_sql VARCHAR2(100); 
1586   p_restrict_sql1 VARCHAR2(4000); 
1587  
1588   BEGIN
1589    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1590       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1591       hz_utility_v2pub.debug(p_message=>'calling the procedure open_contact_pt_cursor',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1592     END IF;
1593      IF (p_search_merged is null) then 
1594         l_search_merged := 'N';  
1595      ELSE 
1596         l_search_merged := p_search_merged; 
1597      END IF; 
1598   IF p_restrict_entity = 'CONTACTS'    
1599   THEN
1600           OPEN x_cursor FOR 
1601           SELECT /*+ USE_NL(d stage) ORDERED INDEX(stage HZ_STAGED_CONTACT_POINTS_N2) */ CONTACT_POINT_ID, stage.contact_point_type, stage.PARTY_ID, PARTY_SITE_ID, ORG_CONTACT_ID , TX1, TX6, TX5
1602           FROM HZ_DQM_PARTIES_GT d, HZ_STAGED_CONTACT_POINTS stage 
1603           WHERE contains( concat_col, p_contains_str)>0 
1604           AND d.search_context_id = p_search_ctx_id 
1605           AND( (l_search_merged ='Y' )  
1606            OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1607            OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1608           AND d.party_id = stage.org_contact_id ; 
1609    END IF; 
1610   IF p_restrict_entity = 'PARTY_SITES'    
1611   THEN
1612           OPEN x_cursor FOR 
1613           SELECT /*+ USE_NL(d stage) ORDERED INDEX(stage HZ_STAGED_CONTACT_POINTS_N3) */ CONTACT_POINT_ID, stage.contact_point_type, stage.PARTY_ID, PARTY_SITE_ID, ORG_CONTACT_ID , TX1, TX6, TX5
1614           FROM HZ_DQM_PARTIES_GT d, HZ_STAGED_CONTACT_POINTS stage 
1615           WHERE contains( concat_col, p_contains_str)>0 
1616           AND d.search_context_id = p_search_ctx_id 
1617           AND( (l_search_merged ='Y' )  
1618            OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1619            OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1620           AND d.party_id = stage.party_site_id ; 
1621    END IF; 
1622  IF p_restrict_entity IS NULL
1623  THEN
1624      IF p_party_id IS NOT NULL THEN
1625    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1626       hz_utility_v2pub.debug(p_message=>'Single Party Scenario',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1627     END IF;
1628        IF p_search_rel_cpts = 'N' THEN
1629          OPEN x_cursor FOR 
1630           SELECT /*+ INDEX(stage HZ_STAGED_CONTACT_POINTS_N1) */ CONTACT_POINT_ID, stage.contact_point_type, PARTY_ID, PARTY_SITE_ID, ORG_CONTACT_ID , TX1, TX6, TX5
1631           FROM HZ_STAGED_CONTACT_POINTS stage
1632           WHERE contains( concat_col, p_contains_str)>0
1633           AND( (l_search_merged ='Y' )  
1634            OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1635            OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1636           AND stage.party_id = p_party_id; 
1637        ELSE
1638          OPEN x_cursor FOR 
1639           SELECT /*+ INDEX(stage HZ_STAGED_CONTACT_POINTS_N1) */ CONTACT_POINT_ID, stage.contact_point_type, PARTY_ID, PARTY_SITE_ID, ORG_CONTACT_ID , TX1, TX6, TX5
1640           FROM HZ_STAGED_CONTACT_POINTS stage
1641           WHERE contains( concat_col, p_contains_str)>0
1642           AND( (l_search_merged ='Y' )  
1643            OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1644            OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1645           AND stage.party_id = p_party_id 
1646           UNION
1647           SELECT /*+ INDEX(stage HZ_STAGED_CONTACT_POINTS_N2) */ stage.CONTACT_POINT_ID, stage.contact_point_type, stage.PARTY_ID, stage.PARTY_SITE_ID, stage.ORG_CONTACT_ID , TX1, TX6, TX5
1648           FROM HZ_STAGED_CONTACT_POINTS stage, hz_relationships r, hz_org_contacts oc
1649           WHERE contains( concat_col, p_contains_str)>0
1650           AND r.object_id = p_party_id 
1651           AND( (l_search_merged ='Y' )  
1652            OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1653            OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1654                     AND r.subject_id = stage.party_id 
1655                     AND r.SUBJECT_TABLE_NAME = 'HZ_PARTIES' 
1656                     AND r.OBJECT_TABLE_NAME = 'HZ_PARTIES' 
1657                     AND r.relationship_id = oc.party_relationship_id
1658                     AND oc.org_contact_id = stage.org_contact_id; 
1659       END IF;
1660     ELSIF p_restrict_sql IS NULL OR p_search_ctx_id IS NOT NULL THEN
1661    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1662       hz_utility_v2pub.debug(p_message=>'Either Restrict sql is null or search_context_id is not null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1663     END IF;
1664       IF p_search_ctx_id IS NULL THEN
1665    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1666       hz_utility_v2pub.debug(p_message=>'Either Search context id is null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1667     END IF;
1668         OPEN x_cursor FOR 
1669           SELECT CONTACT_POINT_ID, stage.contact_point_type, PARTY_ID, PARTY_SITE_ID, ORG_CONTACT_ID , TX1, TX6, TX5
1670           FROM HZ_STAGED_CONTACT_POINTS stage
1671         WHERE contains( concat_col, p_contains_str)>0
1672         AND EXISTS (
1673           SELECT 1 FROM HZ_STAGED_PARTIES p
1674           WHERE p.PARTY_ID = stage.PARTY_ID
1675           AND( (l_search_merged ='Y' )  
1676           OR (l_search_merged = 'I' AND nvl(p.status, 'A') in ('A', 'I'))  
1677           OR (l_search_merged = 'N' AND nvl(p.status, 'A') in ('A'))       )  
1678           AND ((g_party_stage_rec.TX36 IS NULL OR g_party_stage_rec.TX36||' ' =  p.TX36)))
1679           AND( (l_search_merged ='Y' )  
1680            OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1681            OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1682           AND (p_dup_party_id IS NULL OR stage.party_id <> p_dup_party_id);
1683       ELSE
1684    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1685       hz_utility_v2pub.debug(p_message=>'Search_context_id is not null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1686     END IF;
1687         IF p_person_api = 'Y' THEN
1688           OPEN x_cursor FOR 
1689             SELECT /*+ ORDERED INDEX(stage HZ_STAGED_CONTACT_POINTS_N1) */ CONTACT_POINT_ID, stage.contact_point_type, stage.PARTY_ID, PARTY_SITE_ID, ORG_CONTACT_ID , TX1, TX6, TX5
1690             FROM HZ_DQM_PARTIES_GT d, HZ_STAGED_CONTACT_POINTS stage
1691             WHERE contains( concat_col, p_contains_str)>0
1692             AND d.search_context_id = p_search_ctx_id
1693             AND d.party_id = stage.party_id
1694             AND( (l_search_merged ='Y' )  
1695              OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1696              OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1697             AND (p_dup_party_id IS NULL OR stage.party_id <> p_dup_party_id)
1698             UNION 
1699             SELECT /*+ INDEX(stage HZ_STAGED_CONTACT_POINTS_N2) */ CONTACT_POINT_ID, stage.contact_point_type, r.subject_id, stage.PARTY_SITE_ID, stage.ORG_CONTACT_ID , TX1, TX6, TX5
1700             FROM HZ_DQM_PARTIES_GT d, HZ_RELATIONSHIPS r, HZ_ORG_CONTACTS oc, HZ_STAGED_CONTACT_POINTS stage
1701             WHERE contains( concat_col, p_contains_str)>0
1702             AND d.search_context_id = p_search_ctx_id
1703             AND d.party_id = r.subject_id
1704             AND r.relationship_id = oc.party_relationship_id
1705             AND oc.org_contact_id = stage.org_contact_id
1706             AND( (l_search_merged ='Y' )  
1707              OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1708              OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1709             AND (p_dup_party_id IS NULL OR r.subject_id <> p_dup_party_id);
1710         ELSE
1711           OPEN x_cursor FOR 
1712             SELECT /*+ ORDERED INDEX(stage HZ_STAGED_CONTACT_POINTS_N1) */ CONTACT_POINT_ID, stage.contact_point_type, stage.PARTY_ID, PARTY_SITE_ID, ORG_CONTACT_ID , TX1, TX6, TX5
1713             FROM HZ_DQM_PARTIES_GT d, HZ_STAGED_CONTACT_POINTS stage
1714             WHERE contains( concat_col, p_contains_str)>0
1715             AND d.search_context_id = p_search_ctx_id
1716             AND d.party_id = stage.party_id
1717             AND( (l_search_merged ='Y' )  
1718              OR (l_search_merged = 'I' AND nvl(stage.status_flag, 'A') in ('A', 'I'))  
1719              OR (l_search_merged = 'N' AND nvl(stage.status_flag, 'A') = 'A')       )  
1720             AND (p_dup_party_id IS NULL OR stage.party_id <> p_dup_party_id);
1721         END IF;
1722       END IF;
1723     ELSE
1724    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1725       hz_utility_v2pub.debug(p_message=>'Restrict sql is not null',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1726     END IF;
1727        l_check := instrb(p_restrict_sql, 'SELECTIVE'); 
1728        l_check_dt := instrb(p_restrict_sql, 'SELECTIVE_CPT'); 
1729        IF (l_check_dt > 0 ) THEN 
1730    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1731       hz_utility_v2pub.debug(p_message=>'Restrict Sql has the selective_cpt hint',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1732     END IF;
1733            l_hint := '/*+ INDEX(stage HZ_STAGED_CONTACT_POINTS_U1) */'; 
1734        ELSIF (l_check > 0 ) THEN 
1735    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1736       hz_utility_v2pub.debug(p_message=>'Restrict Sql has the selective hint',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1737     END IF;
1738            l_hint := '/*+ INDEX(stage HZ_STAGED_CONTACT_POINTS_N1) */'; 
1739        END IF; 
1740        IF l_search_merged = 'Y' THEN 
1741                l_status_sql := ' ' ;  
1742        ELSIF l_search_merged = 'I' THEN  
1743                l_status_sql := ' AND nvl(p.status,''A'') in (''A'', ''I'')'; 
1744        ELSE 
1745                l_status_sql := ' AND nvl(p.status,''A'') in (''A'')'; 
1746        END IF; 
1747        IF p_person_api = 'Y' THEN
1748  		/*Performance fix for Bug:4589953*/ 
1749        IF (l_check > 0 ) THEN 
1750        IF instrb(p_restrict_sql, 'STAGE.') > 0 THEN 
1751        	p_restrict_sql1 := replace( p_restrict_sql, 'STAGE.', 'stage1.');
1752        ELSIF instrb(p_restrict_sql, 'stage.') > 0 THEN 
1753        	p_restrict_sql1 := replace( p_restrict_sql, 'stage.', 'stage1.');
1754        ELSE
1755 		p_restrict_sql1 := 'stage1.'||p_restrict_sql;
1756        END IF; 
1757        	l_sqlstr := ' SELECT   /*+ INDEX(stage HZ_STAGED_CONTACT_POINTS_N1) */ CONTACT_POINT_ID, stage.contact_point_type, PARTY_ID, PARTY_SITE_ID, ORG_CONTACT_ID  , TX1, TX6, TX5'||
1758                    ' FROM HZ_STAGED_CONTACT_POINTS stage'||
1759                    ' WHERE contains( concat_col, :cont)>0  '||
1760                    ' AND (stage.org_contact_id is null '||
1761                    ' AND( ('''||l_search_merged||''' =''Y'' )  '||
1762                    '   OR ('''||l_search_merged||''' = ''I'' AND nvl(stage.status_flag, ''A'') in (''A'', ''I''))  '||
1763                    '   OR ('''||l_search_merged||''' = ''N'' AND nvl(stage.status_flag, ''A'') = ''A'')       )  '||
1764                    ' AND ('||p_restrict_sql||'))' ||
1765                    ' AND (:p_dup IS NULL OR stage.party_id <> :p_dup) ' ||
1766                    ' UNION ' ||
1767                    ' SELECT   /*+ INDEX(stage HZ_STAGED_CONTACT_POINTS_N2) */ CONTACT_POINT_ID, stage.contact_point_type, PARTY_ID, PARTY_SITE_ID, ORG_CONTACT_ID  , TX1, TX6, TX5'||
1768                    ' FROM HZ_STAGED_CONTACT_POINTS stage'||
1769                    ' WHERE contains( concat_col, :cont)>0  '||
1770                    ' AND( ('''||l_search_merged||''' =''Y'' )  '||
1771                    '   OR ('''||l_search_merged||''' = ''I'' AND nvl(stage.status_flag, ''A'') in (''A'', ''I''))  '||
1772                    '   OR ('''||l_search_merged||''' = ''N'' AND nvl(stage.status_flag, ''A'') = ''A'')       )  '||
1773                  ' AND (stage.org_contact_id in ' || 
1774                  ' ( SELECT org_contact_id from HZ_ORG_CONTACTS oc, (select object_id, relationship_id, subject_id party_id from hz_relationships r ' ||
1775                  ' where subject_type = ''PERSON'' AND object_type = ''ORGANIZATION'') stage1 ' || 
1776                  ' where stage1.relationship_id = oc.party_relationship_id ' || 
1777                  ' and ('||p_restrict_sql1 || ') ) )' ||
1778                  ' AND (:p_dup IS NULL OR stage.party_id <> :p_dup) '; 
1779        OPEN x_cursor FOR l_sqlstr USING p_contains_str,
1780                     p_dup_party_id, p_dup_party_id, p_contains_str, p_dup_party_id, p_dup_party_id;
1781        ELSE 
1782        	l_sqlstr := 'SELECT   ' || l_hint ||' CONTACT_POINT_ID, stage.contact_point_type, PARTY_ID, PARTY_SITE_ID, ORG_CONTACT_ID  , TX1, TX6, TX5'||
1783                    ' FROM HZ_STAGED_CONTACT_POINTS stage'||
1784                    ' WHERE contains( concat_col, :cont)>0'||
1785                  ' AND EXISTS ('||
1786                  ' SELECT 1 FROM HZ_STAGED_PARTIES p ' || 
1787                  ' WHERE p.party_id = stage.party_id ' || 
1788                  ' AND ((:TX36 IS NULL OR :TX36||'' '' =  p.TX36))  '|| l_status_sql ||' ) ' || 
1789                    ' AND( ('''||l_search_merged||''' =''Y'' )  '||
1790                    '   OR ('''||l_search_merged||''' = ''I'' AND nvl(stage.status_flag, ''A'') in (''A'', ''I''))  '||
1791                    '   OR ('''||l_search_merged||''' = ''N'' AND nvl(stage.status_flag, ''A'') = ''A'')       )  '||
1792                    ' AND ('||get_adjusted_restrict_sql(p_restrict_sql)||')' ||
1793                    ' AND (:p_dup IS NULL OR stage.party_id <> :p_dup) '; 
1794        OPEN x_cursor FOR l_sqlstr USING p_contains_str
1795                               ,g_party_stage_rec.TX36,g_party_stage_rec.TX36
1796                     ,p_dup_party_id, p_dup_party_id;
1797        END IF; 
1798        ELSE 
1799        	l_sqlstr := 'SELECT   ' || l_hint ||' CONTACT_POINT_ID, stage.contact_point_type, PARTY_ID, PARTY_SITE_ID, ORG_CONTACT_ID  , TX1, TX6, TX5'||
1800                    ' FROM HZ_STAGED_CONTACT_POINTS stage'||
1801                    ' WHERE contains( concat_col, :cont)>0'||
1802                  ' AND EXISTS ('||
1803                  ' SELECT 1 FROM HZ_STAGED_PARTIES p ' || 
1804                  ' WHERE p.party_id = stage.party_id ' || 
1805                  ' AND ((:TX36 IS NULL OR :TX36||'' '' =  p.TX36))  '|| l_status_sql ||' ) ' || 
1806                    ' AND( ('''||l_search_merged||''' =''Y'' )  '||
1807                    '   OR ('''||l_search_merged||''' = ''I'' AND nvl(stage.status_flag, ''A'') in (''A'', ''I''))  '||
1808                    '   OR ('''||l_search_merged||''' = ''N'' AND nvl(stage.status_flag, ''A'') = ''A'')       )  '||
1809                    ' AND ('||p_restrict_sql||')' ||
1810                    ' AND (:p_dup IS NULL OR stage.party_id <> :p_dup) '; 
1811        OPEN x_cursor FOR l_sqlstr USING p_contains_str
1812                               ,g_party_stage_rec.TX36,g_party_stage_rec.TX36
1813                     ,p_dup_party_id, p_dup_party_id;
1814        END IF; 
1815     END IF;
1816   END IF; 
1817  	    output_long_strings('----------------------------------------------------------');
1818        output_long_strings('Contact Points Contains String = '||p_contains_str);
1819 		output_long_strings('Restrict Sql = '||p_restrict_sql);
1820   exception
1821     when others then
1822       if (instrb(SQLERRM,'DRG-51030')>0) then 
1823         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_WILDCARD_ERR');
1824         FND_MSG_PUB.ADD;
1825         RAISE FND_API.G_EXC_ERROR;
1826       elsif (instrb(SQLERRM,'DRG-50943')>0) then 
1827         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_SEARCH_ERROR');
1828         FND_MSG_PUB.ADD;
1829         RAISE FND_API.G_EXC_ERROR;
1830       elsif (instrb(SQLERRM,'ORA-20000')>0) then 
1831         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_SEARCH_ERROR');
1832         FND_MSG_PUB.ADD;
1833         RAISE FND_API.G_EXC_ERROR;
1834       else 
1835         FND_MESSAGE.SET_NAME('AR', 'HZ_API_OTHERS_EXCEP');
1836     	 FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
1837     	 FND_MSG_PUB.ADD;
1838         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1839       end if;
1840   END;
1841 
1842 
1843   PROCEDURE return_direct_matches(p_restrict_sql VARCHAR2, p_match_str VARCHAR2, p_thresh NUMBER, p_search_ctx_id NUMBER, p_search_merged VARCHAR2, p_dup_party_id NUMBER, x_num_matches OUT NUMBER) IS
1844     l_sqlstr VARCHAR2(4000);
1845     l_search_merged VARCHAR2(1);
1846   BEGIN
1847     IF (p_search_merged is null) then 
1848        l_search_merged := 'N';  
1849     ELSE 
1850        l_search_merged := p_search_merged; 
1851     END IF; 
1852     IF p_restrict_sql IS NULL THEN
1853       INSERT INTO HZ_MATCHED_PARTIES_GT (SEARCH_CONTEXT_ID, PARTY_ID, SCORE) 
1854       SELECT p_search_ctx_id, PARTY_ID, 0
1855       FROM hz_staged_parties 
1856       WHERE TX8 LIKE g_party_stage_rec.TX8||' %'
1857       AND ((g_party_stage_rec.TX36 IS NULL OR g_party_stage_rec.TX36||' ' =  TX36))
1858       AND( (l_search_merged ='Y' ) 
1859            OR (l_search_merged = 'I' AND nvl(status, 'A') in ('A', 'I'))  
1860            OR (l_search_merged = 'N' AND nvl(status, 'A') in ('A')))  
1861       AND (p_dup_party_id IS NULL OR party_id <> p_dup_party_id)
1862       AND rownum <= p_thresh;
1863     ELSE
1864       l_sqlstr := 'INSERT INTO HZ_MATCHED_PARTIES_GT (SEARCH_CONTEXT_ID, PARTY_ID, SCORE) SELECT :ctx_id, PARTY_ID, 0 FROM hz_staged_parties stage ';
1865       l_sqlstr := l_sqlstr || ' WHERE TX8 like :TX8||'' %'' ';
1866       l_sqlstr := l_sqlstr || ' AND (:TX36 IS NULL OR :TX36||'' '' =  TX36) ';
1867       IF l_search_merged = 'N' THEN
1868         l_sqlstr := l_sqlstr || ' AND nvl(status,''A'')=''A'' ';
1869       ELSIF l_search_merged = 'Y' THEN
1870         l_sqlstr := l_sqlstr || ' AND nvl(status,''A'') in (''A'',''I'') ';
1871       END IF;
1872       l_sqlstr := l_sqlstr || ' AND (:p_dup IS NULL OR party_id <> :p_dup ) ';
1873      l_sqlstr := l_sqlstr || ' AND '||p_restrict_sql||' ';
1874      l_sqlstr := l_sqlstr || ' AND ROWNUM <= :thresh ';
1875      EXECUTE IMMEDIATE l_sqlstr USING p_search_ctx_id, g_party_stage_rec.TX8,g_party_stage_rec.TX36,g_party_stage_rec.TX36,p_dup_party_id,p_dup_party_id,p_thresh;
1876     END IF;
1877     x_num_matches := SQL%ROWCOUNT;
1878   END;
1879 
1880   FUNCTION get_new_score_rec (
1881     	 p_init_total_score NUMBER,
1882     	 p_init_party_score NUMBER,
1883     	 p_init_party_site_score NUMBER,
1884     	 p_init_contact_score NUMBER,
1885     	 p_init_contact_point_score NUMBER, 
1886     	 p_party_id NUMBER, 
1887     	 p_party_site_id NUMBER, 
1888     	 p_org_contact_id NUMBER, 
1889     	 p_contact_point_id NUMBER) 
1890      RETURN HZ_PARTY_SEARCH.score_rec IS
1891     l_score_rec HZ_PARTY_SEARCH.score_rec;
1892   BEGIN
1893    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
1894       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1895       hz_utility_v2pub.debug(p_message=>'calling the function get_new_score_rec to set the l_score_rec structure',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
1896     END IF;
1897     l_score_rec.TOTAL_SCORE := p_init_total_score;
1898     l_score_rec.PARTY_SCORE := p_init_party_score;
1899     l_score_rec.PARTY_SITE_SCORE := p_init_party_site_score;
1900     l_score_rec.CONTACT_SCORE := p_init_contact_score;
1901     l_score_rec.CONTACT_POINT_SCORE := p_init_contact_point_score;
1902     l_score_rec.PARTY_ID := p_party_id;
1903     l_score_rec.PARTY_SITE_ID := p_party_site_id;
1904     l_score_rec.ORG_CONTACT_ID := p_org_contact_id;
1905     l_score_rec.CONTACT_POINT_ID := p_contact_point_id;
1906     RETURN l_score_rec;
1907   END;
1908 
1909    /**********************************************************
1910    This procedure finds the set of parties that match the search
1911    criteria and returns a scored set of parties
1912 
1913    The steps in executing the search are as follows
1914     1. Initialization and error checks
1915     2. Setup of intermedia query strings for Acquisition query
1916     3. Execution of Acquisition query
1917     4. Execution of Secondary queries to score results
1918     5. Setup of data temporary table to return search results
1919    **********************************************************/
1920 
1921 PROCEDURE find_parties (
1922       p_rule_id               IN      NUMBER,
1923       p_party_search_rec      IN      HZ_PARTY_SEARCH.party_search_rec_type,
1924       p_party_site_list       IN      HZ_PARTY_SEARCH.party_site_list,
1925       p_contact_list          IN      HZ_PARTY_SEARCH.contact_list,
1926       p_contact_point_list    IN      HZ_PARTY_SEARCH.contact_point_list,
1927       p_restrict_sql          IN      VARCHAR2,
1928       p_match_type            IN      VARCHAR2,
1929       p_search_merged         IN      VARCHAR2,
1930       p_dup_party_id          IN      NUMBER,
1931       p_dup_set_id            IN      NUMBER,
1932       p_dup_batch_id          IN      NUMBER,
1933       p_ins_details           IN      VARCHAR2,
1934       x_search_ctx_id         OUT     NUMBER,
1935       x_num_matches           OUT     NUMBER
1936 ) IS
1937 
1938   -- Strings to hold the generated Intermedia query strings
1939   l_party_contains_str VARCHAR2(32000); 
1940   l_party_site_contains_str VARCHAR2(32000);
1941   l_contact_contains_str VARCHAR2(32000);
1942   l_contact_pt_contains_str VARCHAR2(32000);
1943   l_denorm_str VARCHAR2(32000);
1944   l_ps_denorm_str VARCHAR2(32000);
1945   l_ct_denorm_str VARCHAR2(32000);
1946   l_cpt_denorm_str VARCHAR2(32000);
1947 
1948   -- Other local variables
1949   l_match_str VARCHAR2(30); -- Match type (AND or OR)
1950   l_sqlstr VARCHAR2(32000); -- Dynamic SQL String
1951   -- For Score calculation
1952   l_max_score NUMBER;
1953   l_match_idx NUMBER;
1954   l_entered_max_score NUMBER;
1955   FIRST BOOLEAN;
1956   l_search_ctx_id NUMBER; -- Generated Search Context ID
1957 
1958   l_TX44 VARCHAR2(2000);
1959   l_TX1 VARCHAR2(2000);
1960   l_TX5 VARCHAR2(2000);
1961   l_TX6 VARCHAR2(2000);
1962   H_SCORES HZ_PARTY_SEARCH.score_list;
1963   H_PARTY_ID HZ_PARTY_SEARCH.IDList;
1964   H_PARTY_ID_LIST HZ_PARTY_SEARCH.IDList;
1965 
1966   l_score NUMBER;
1967   l_idx NUMBER;
1968   l_party_cur HZ_PARTY_STAGE.StageCurTyp;
1969   l_party_site_cur HZ_PARTY_STAGE.StageCurTyp;
1970   l_contact_cur HZ_PARTY_STAGE.StageCurTyp;
1971   l_contact_pt_cur HZ_PARTY_STAGE.StageCurTyp;
1972   l_party_id NUMBER;
1973   l_ps_party_id NUMBER;
1974   l_ct_party_id NUMBER;
1975   l_cpt_party_id NUMBER;
1976   l_cpt_ps_id NUMBER;
1977   l_cpt_contact_id NUMBER;
1978   l_cpt_type VARCHAR2(100);
1979   l_party_site_id NUMBER;
1980   l_org_contact_id NUMBER;
1981   l_contact_pt_id NUMBER;
1982   l_ps_contact_id NUMBER;
1983   l_party_max_score NUMBER;
1984   l_ps_max_score NUMBER;
1985   l_contact_max_score NUMBER;
1986   l_cpt_max_score NUMBER;
1987   l_denorm_max_score NUMBER;
1988   l_non_denorm_max_score NUMBER;
1989 
1990   defpt NUMBER :=0;
1991   defps NUMBER :=0;
1992   defct NUMBER :=0;
1993   defcpt NUMBER :=0;
1994   l_index NUMBER;
1995   l_max_thresh NUMBER;
1996   l_tmp NUMBER;
1997   l_merge_flag VARCHAR2(1);
1998   l_num_eval NUMBER:=0;
1999 
2000   --Fix for bug 4417124 
2001   l_use_contact_addr_info BOOLEAN := TRUE;
2002   l_use_contact_cpt_info BOOLEAN  := TRUE;
2003   l_use_contact_addr_flag VARCHAR2(1) := 'Y';
2004   l_use_contact_cpt_flag  VARCHAR2(1) := 'Y';
2005 
2006   L_RETURN_IMM_EXC EXCEPTION;
2007 
2008   
2009   /********************* Find Parties private procedures *******/
2010   PROCEDURE push_eval IS
2011   BEGIN
2012    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2013       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2014       hz_utility_v2pub.debug(p_message=>'calling the procedure push_eval',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2015     END IF;
2016    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2017       hz_utility_v2pub.debug(p_message=>'Emptying the lists H_PARTY_ID, H_PARTY_ID_LIST and H_SCORES',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2018     END IF;
2019     H_PARTY_ID.DELETE;
2020     H_PARTY_ID_LIST.DELETE;
2021     H_SCORES.DELETE;        
2022     g_mappings.DELETE;
2023     HZ_DQM_SEARCH_UTIL.set_num_eval(0);
2024     call_order(5) := call_order(1);
2025     call_type(5) := 'AND';
2026     call_max_score(5) := call_max_score(1);
2027     call_type(2) := 'OR';
2028   END;
2029 
2030   /**  Private procedure to acquire and score at party level  ***/
2031   PROCEDURE eval_party_level(p_party_contains_str VARCHAR2,p_call_type VARCHAR2, p_index NUMBER) IS
2032     l_party_id_idx NUMBER:=1;
2033     l_ctx_id NUMBER;
2034     l_precalc_score BOOLEAN := FALSE;
2035   BEGIN
2036    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2037       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2038       hz_utility_v2pub.debug(p_message=>'calling the procedure eval_party_level',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2039     END IF;
2040     SAVEPOINT eval_start;
2041     IF l_match_str = ' AND ' AND p_call_type = 'AND' THEN
2042       l_ctx_id := l_search_ctx_id;
2043    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2044       hz_utility_v2pub.debug(p_message=>'Match rule is AND and call type is AND. Inserting into HZ_DQM_PARTIES_GT, from the H_PARTY_ID list',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2045     END IF;
2046       FORALL I in 1..H_PARTY_ID.COUNT 
2047          INSERT INTO HZ_DQM_PARTIES_GT (SEARCH_CONTEXT_ID,PARTY_ID) VALUES (
2048              l_search_ctx_id,H_PARTY_ID(I));
2049       H_PARTY_ID.DELETE;
2050       H_PARTY_ID_LIST.DELETE;
2051     ELSIF l_match_str = ' OR ' AND p_call_type = 'AND' THEN
2052    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2053       hz_utility_v2pub.debug(p_message=>'Match rule is OR and call type is AND. Inserting into HZ_DQM_PARTIES_GT, from the H_PARTY_ID list',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2054     END IF;
2055       l_ctx_id := l_search_ctx_id;
2056       FORALL I in 1..H_PARTY_ID.COUNT 
2057          INSERT INTO HZ_DQM_PARTIES_GT (SEARCH_CONTEXT_ID,PARTY_ID) VALUES (
2058              l_search_ctx_id,H_PARTY_ID(I));
2059       l_party_id_idx := H_PARTY_ID.COUNT+1;
2060     ELSE
2061       IF (p_restrict_sql IS NULL OR instrb(p_restrict_sql, 'SELECTIVE')=0)
2062          and check_estimate_hits('PARTY',p_party_contains_str)>l_max_thresh THEN
2063    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2064       hz_utility_v2pub.debug(p_message=>'In eval party level estimated hits exceed threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2065     END IF;
2066         IF g_party_stage_rec.TX8 IS NOT NULL AND nvl(FND_PROFILE.VALUE('HZ_DQM_PN_THRESH_RESOLUTION'),'NONE')='SQL' AND p_dup_batch_id IS NULL THEN
2067    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2068       hz_utility_v2pub.debug(p_message=>'In eval party level resolution options is set to SQL search.',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2069     END IF;
2070           IF (l_party_site_contains_str IS NULL AND
2071              l_contact_contains_str IS NULL AND
2072              l_contact_pt_contains_str IS NULL) AND NOT g_other_party_level_attribs AND p_dup_set_id IS NULL THEN
2073             return_direct_matches(p_restrict_sql,l_match_str,l_max_thresh,l_search_ctx_id,p_search_merged,p_dup_party_id, x_num_matches);
2074             RAISE L_RETURN_IMM_EXC;
2075           ELSE
2076             open_party_cursor_direct(p_dup_party_id, p_restrict_sql, l_match_str,p_search_merged,p_party_contains_str,l_party_cur);
2077           END IF;
2078         ELSE
2079           IF p_index>1 THEN
2080    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2081       hz_utility_v2pub.debug(p_message=>'In eval party level number of matches found exceeded threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2082     END IF;
2083             FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_THRESH_EXCEEDED');
2084             FND_MSG_PUB.ADD;
2085             RAISE FND_API.G_EXC_ERROR;
2086           ELSE
2087             push_eval;
2088             RETURN;
2089           END IF;
2090         END IF;
2091       END IF;
2092       l_ctx_id := NULL;
2093       l_party_id_idx := H_PARTY_ID.COUNT+1;
2094     END IF;
2095    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2096       hz_utility_v2pub.debug(p_message=>'========== START LOOPING THROUGH WHAT IS RETURNED BY OPEN_PARTY_CURSOR ================',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2097     END IF;
2098     IF l_party_cur IS NULL OR (not l_party_cur%ISOPEN) THEN
2099       open_party_cursor(p_dup_party_id, p_restrict_sql, p_party_contains_str,l_ctx_id, l_match_str,p_search_merged,l_party_cur);
2100     END IF;
2101     LOOP 
2102       FETCH l_party_cur INTO
2103          l_party_id , l_TX44;
2104       EXIT WHEN l_party_cur%NOTFOUND;
2105       l_index := map_id(l_party_id);
2106       l_score := GET_PARTY_SCORE(l_TX44);
2107       IF NOT H_SCORES.EXISTS(l_index) THEN
2108         H_SCORES(l_index) := get_new_score_rec(l_score,l_score,defps,defct,defcpt, l_party_id, null, null,null);
2109       ELSE
2110         H_SCORES(l_index).TOTAL_SCORE := 
2111                 H_SCORES(l_index).TOTAL_SCORE+l_score;
2112         H_SCORES(l_index).PARTY_SCORE := l_score;
2113       END IF;
2114       IF NOT H_PARTY_ID_LIST.EXISTS(l_index) THEN
2115         H_PARTY_ID_LIST(l_index) := 1;
2116         H_PARTY_ID(l_party_id_idx) := l_party_id;
2117         l_party_id_idx:= l_party_id_idx+1;
2118       END IF;
2119       IF (l_party_id_idx-1)>l_max_thresh THEN
2120         IF p_index=1 AND call_order(2) = 'PARTY_SITE' 
2121           AND call_type(2) = 'AND' AND l_contact_contains_str IS NULL
2122           AND nvl(FND_PROFILE.VALUE('HZ_DQM_PN_THRESH_RESOLUTION'),'NONE')='SQL' 
2123           AND l_contact_pt_contains_str IS NULL THEN
2124             EXIT;
2125         END IF;
2126 	      CLOSE l_party_cur;
2127         IF p_index>1 THEN
2128    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2129       hz_utility_v2pub.debug(p_message=>'In eval party level estimated hits exceed threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2130     END IF;
2131           FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_THRESH_EXCEEDED');
2132           FND_MSG_PUB.ADD;
2133           RAISE FND_API.G_EXC_ERROR;
2134         ELSE
2135           push_eval;
2136           RETURN;
2137         END IF;
2138       END IF;
2139     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2140       hz_utility_v2pub.debug(p_message=>'In eval_party_level l_party_id =  '||l_party_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2141       hz_utility_v2pub.debug(p_message=>'In eval_party_level l_score =  '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2142     END IF;
2143     END LOOP;
2144    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2145       hz_utility_v2pub.debug(p_message=>'===========END of LOOP=====================',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2146     END IF;
2147     CLOSE l_party_cur;
2148     ROLLBACK to eval_start;
2149   END;
2150 
2151   /**  Private procedure to acquire and score at party site level  ***/
2152   PROCEDURE eval_party_site_level(p_party_site_contains_str VARCHAR2,p_call_type VARCHAR2, p_index NUMBER,p_ins_details VARCHAR2,p_emax_score NUMBER) IS
2153     l_party_id_idx NUMBER:=1;
2154     l_ctx_id NUMBER;
2155     h_ps_id HZ_PARTY_SEARCH.IDList;
2156     h_ps_party_id HZ_PARTY_SEARCH.IDList;
2157     h_ps_score HZ_PARTY_SEARCH.IDList;
2158     detcnt NUMBER := 1;
2159   BEGIN
2160    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2161       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2162       hz_utility_v2pub.debug(p_message=>'calling the procedure eval_party_site_level',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2163     END IF;
2164   IF (l_party_contains_str IS NOT NULL AND instrb(l_party_contains_str,'D_PS')>0
2165       AND l_contact_contains_str IS NULL and H_PARTY_ID.COUNT > 0 and
2166       l_contact_pt_contains_str IS NULL) AND g_ps_den_only AND p_ins_details <> 'Y' THEN
2167     l_party_id := H_SCORES.FIRST;
2168     WHILE l_party_id IS NOT NULL LOOP
2169       H_SCORES(l_party_id).TOTAL_SCORE := H_SCORES(l_party_id).TOTAL_SCORE + p_emax_score;
2170       l_party_id:=H_SCORES.NEXT(l_party_id);
2171     END LOOP;
2172     RETURN;
2173   END IF;
2174     SAVEPOINT eval_start;
2175     IF l_match_str = ' AND ' AND p_call_type = 'AND' THEN
2176    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2177       hz_utility_v2pub.debug(p_message=>'Match rule is AND and call type is AND. Inserting into HZ_DQM_PARTIES_GT, from the H_PARTY_ID list',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2178     END IF;
2179       l_ctx_id := l_search_ctx_id;
2180       FORALL I in 1..H_PARTY_ID.COUNT 
2181          INSERT INTO HZ_DQM_PARTIES_GT (SEARCH_CONTEXT_ID,PARTY_ID) VALUES (
2182              l_search_ctx_id,H_PARTY_ID(I));
2183       H_PARTY_ID.DELETE;
2184       H_PARTY_ID_LIST.DELETE;
2185     ELSIF l_match_str = ' OR ' AND p_call_type = 'AND' THEN
2186    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2187       hz_utility_v2pub.debug(p_message=>'Match rule is OR and call type is AND. Inserting into HZ_DQM_PARTIES_GT, from the H_PARTY_ID list',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2188     END IF;
2189       l_ctx_id := l_search_ctx_id;
2190       FORALL I in 1..H_PARTY_ID.COUNT 
2191          INSERT INTO HZ_DQM_PARTIES_GT (SEARCH_CONTEXT_ID,PARTY_ID) VALUES (
2192              l_search_ctx_id,H_PARTY_ID(I));
2193       l_party_id_idx := H_PARTY_ID.COUNT+1;
2194     ELSE
2195       IF (p_restrict_sql IS NULL OR instrb(p_restrict_sql, 'SELECTIVE')=0)
2196          and check_estimate_hits('PARTY_SITES',p_party_site_contains_str)>l_max_thresh THEN
2197    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2198       hz_utility_v2pub.debug(p_message=>'In eval party site level estimated hits exceed threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2199     END IF;
2200         IF p_index>1 THEN
2201    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2202       hz_utility_v2pub.debug(p_message=>'In eval party site level number of matches found exceeded threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2203     END IF;
2204           FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_THRESH_EXCEEDED');
2205           FND_MSG_PUB.ADD;
2206           RAISE FND_API.G_EXC_ERROR;
2207         ELSE
2208           push_eval;
2209           RETURN;
2210         END IF;
2211       END IF;
2212       l_party_id_idx := H_PARTY_ID.COUNT+1;
2213       l_ctx_id := NULL;
2214     END IF;
2215    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2216       hz_utility_v2pub.debug(p_message=>'========== START LOOPING THROUGH WHAT IS RETURNED BY OPEN_PARTY_SITE_CURSOR ================',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2217     END IF;
2218     open_party_site_cursor(p_dup_party_id,NULL, p_restrict_sql, p_party_site_contains_str,l_ctx_id,  p_search_merged, 'N','N',l_party_site_cur);
2219     LOOP 
2220       FETCH l_party_site_cur INTO
2221          l_party_site_id, l_ps_party_id, l_ps_contact_id ;
2222       EXIT WHEN l_party_site_cur%NOTFOUND;
2223       --Fix for bug 4417124 
2224       IF l_use_contact_addr_info OR l_ps_contact_id IS NULL THEN
2225         l_index := map_id(l_ps_party_id);
2226         l_score := GET_PARTY_SITES_SCORE(l_match_idx);
2227         IF NOT H_SCORES.EXISTS(l_index) THEN
2228           H_SCORES(l_index) := get_new_score_rec(l_score,defpt,l_score,defct,defcpt, l_ps_party_id, l_party_site_id, null,null);
2229         ELSE
2230           IF l_score > H_SCORES(l_index).PARTY_SITE_SCORE THEN
2231             H_SCORES(l_index).TOTAL_SCORE := 
2232                   H_SCORES(l_index).TOTAL_SCORE-H_SCORES(l_index).PARTY_SITE_SCORE+l_score;
2233             H_SCORES(l_index).PARTY_SITE_SCORE := l_score;
2234           END IF;
2235         END IF;
2236         IF NOT H_PARTY_ID_LIST.EXISTS(l_index) THEN
2237           H_PARTY_ID_LIST(l_index) := 1;
2238           H_PARTY_ID(l_party_id_idx) := l_ps_party_id;
2239           l_party_id_idx:= l_party_id_idx+1;
2240         END IF;
2241         IF p_ins_details = 'Y' THEN
2242           h_ps_id(detcnt) := l_party_site_id;
2243           h_ps_party_id(detcnt) := l_ps_party_id;
2244           IF (p_emax_score > 0) THEN 
2245               h_ps_score(detcnt) := round((l_score/p_emax_score)*100);
2246           ELSE 
2247               h_ps_score(detcnt) := 0; 
2248           END IF; 
2249           detcnt := detcnt +1;
2250         END IF;
2251     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2252       hz_utility_v2pub.debug(p_message=>'In eval_party_site_level l_party_site_id =  '||l_party_site_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2253       hz_utility_v2pub.debug(p_message=>'In eval_paty_site_level l_ps_party_id =  '||l_ps_party_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2254       hz_utility_v2pub.debug(p_message=>'In eval_party_site_level l_score =  '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2255     END IF;
2256       END IF;
2257     END LOOP;
2258    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2259       hz_utility_v2pub.debug(p_message=>'===========END of LOOP=====================',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2260     END IF;
2261     CLOSE l_party_site_cur;
2262     ROLLBACK to eval_start;
2263     IF p_ins_details = 'Y' THEN
2264    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2265       hz_utility_v2pub.debug(p_message=>'In eval_party_site_level inserting into HZ_MATCHED_PARTY_SITES_GT from the H_PS_ID list',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2266     END IF;
2267       FORALL I in 1..h_ps_id.COUNT 
2268         INSERT INTO HZ_MATCHED_PARTY_SITES_GT (SEARCH_CONTEXT_ID,PARTY_SITE_ID,PARTY_ID,SCORE) VALUES (
2269           l_search_ctx_id, h_ps_id(I), h_ps_party_id(I), h_ps_score(I));
2270     END IF;
2271   END;
2272 
2273   /**  Private procedure to acquire and score at contact point level  ***/
2274   PROCEDURE eval_contact_level(p_contact_contains_str VARCHAR2,p_call_type VARCHAR2, p_index NUMBER,p_ins_details VARCHAR2,p_emax_score NUMBER) IS
2275     l_party_id_idx NUMBER:=1;
2276     l_ctx_id NUMBER;
2277     h_ct_id HZ_PARTY_SEARCH.IDList;
2278     h_ct_party_id HZ_PARTY_SEARCH.IDList;
2279     h_ct_score HZ_PARTY_SEARCH.IDList;
2280     detcnt NUMBER := 1;
2281   BEGIN
2282    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2283       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2284       hz_utility_v2pub.debug(p_message=>'calling the procedure eval_contact_level',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2285     END IF;
2286     SAVEPOINT eval_start;
2287     IF l_match_str = ' AND ' AND p_call_type='AND' THEN
2288    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2289       hz_utility_v2pub.debug(p_message=>'Match rule is AND and call type is AND. Inserting into HZ_DQM_PARTIES_GT, from the H_PARTY_ID list',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2290     END IF;
2291       l_ctx_id := l_search_ctx_id;
2292       FORALL I in 1..H_PARTY_ID.COUNT 
2293          INSERT INTO HZ_DQM_PARTIES_GT (SEARCH_CONTEXT_ID,PARTY_ID) VALUES (
2294              l_search_ctx_id,H_PARTY_ID(I));
2295       H_PARTY_ID.DELETE;
2296       H_PARTY_ID_LIST.DELETE;
2297     ELSIF l_match_str = ' OR ' AND p_call_type = 'AND' THEN
2298    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2299       hz_utility_v2pub.debug(p_message=>'Match rule is OR and call type is AND. Inserting into HZ_DQM_PARTIES_GT, from the H_PARTY_ID list',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2300     END IF;
2301       l_ctx_id := l_search_ctx_id;
2302       FORALL I in 1..H_PARTY_ID.COUNT 
2303          INSERT INTO HZ_DQM_PARTIES_GT (SEARCH_CONTEXT_ID,PARTY_ID) VALUES (
2304              l_search_ctx_id,H_PARTY_ID(I));
2305       l_party_id_idx := H_PARTY_ID.COUNT+1;
2306     ELSE
2307       IF (p_restrict_sql IS NULL OR instrb(p_restrict_sql, 'SELECTIVE')=0)
2308          and check_estimate_hits('CONTACTS',p_contact_contains_str)>l_max_thresh THEN
2309    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2310       hz_utility_v2pub.debug(p_message=>'In eval contact level estimated hits exceed threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2311     END IF;
2312         IF p_index>1 THEN
2313    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2314       hz_utility_v2pub.debug(p_message=>'In eval contact level number of matches found exceeded threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2315     END IF;
2316           FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_THRESH_EXCEEDED');
2317           FND_MSG_PUB.ADD;
2318           RAISE FND_API.G_EXC_ERROR;
2319         ELSE
2320           push_eval;
2321           RETURN;
2322         END IF;
2323       END IF;
2324       l_ctx_id := NULL;
2325       l_party_id_idx := H_PARTY_ID.COUNT+1;
2326     END IF;
2327    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2328       hz_utility_v2pub.debug(p_message=>'========== START LOOPING THROUGH WHAT IS RETURNED BY OPEN_CONTACT_CURSOR ================',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2329     END IF;
2330     open_contact_cursor(p_dup_party_id,NULL, p_restrict_sql, p_contact_contains_str,l_ctx_id,  p_search_merged, l_contact_cur);
2331     LOOP 
2332       FETCH l_contact_cur INTO
2333          l_org_contact_id, l_ct_party_id ;
2334       EXIT WHEN l_contact_cur%NOTFOUND;
2335       l_index := map_id(l_ct_party_id);
2336       l_score := GET_CONTACTS_SCORE(l_match_idx);
2337       IF NOT H_SCORES.EXISTS(l_index) THEN
2338         H_SCORES(l_index) := get_new_score_rec(l_score,defpt,defps,l_score,defcpt, l_ct_party_id, null, l_org_contact_id,null);
2339       ELSE
2340         IF l_score > H_SCORES(l_index).CONTACT_SCORE THEN
2341           H_SCORES(l_index).TOTAL_SCORE := 
2342                 H_SCORES(l_index).TOTAL_SCORE-H_SCORES(l_index).CONTACT_SCORE+l_score;
2343           H_SCORES(l_index).CONTACT_SCORE := l_score;
2344         END IF;
2345       END IF;
2346       IF NOT H_PARTY_ID_LIST.EXISTS(l_index) THEN
2347         H_PARTY_ID_LIST(l_index) := 1;
2348         H_PARTY_ID(l_party_id_idx) := l_ct_party_id;
2349         l_party_id_idx:= l_party_id_idx+1;
2350       END IF;
2351       IF p_ins_details = 'Y' THEN
2352         h_ct_id(detcnt) := l_org_contact_id;
2353         h_ct_party_id(detcnt) := l_ct_party_id;
2354         IF (p_emax_score > 0) THEN 
2355             h_ct_score(detcnt) := round((l_score/p_emax_score)*100);
2356         ELSE 
2357             h_ct_score(detcnt) := 0; 
2358         END IF; 
2359         detcnt := detcnt +1;
2360       END IF;
2361     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2362       hz_utility_v2pub.debug(p_message=>'In eval_contact_level l_org_contact_id =  '||l_org_contact_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2363       hz_utility_v2pub.debug(p_message=>'In eval_contact_level l_ct_party_id =  '||l_ct_party_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2364       hz_utility_v2pub.debug(p_message=>'In eval_contact_level l_score =  '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2365     END IF;
2366     END LOOP;
2367    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2368       hz_utility_v2pub.debug(p_message=>'===========END of LOOP=====================',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2369     END IF;
2370     CLOSE l_contact_cur;
2371     ROLLBACK to eval_start;
2372     IF p_ins_details = 'Y' THEN
2373    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2374       hz_utility_v2pub.debug(p_message=>'In eval_contact_level inserting into HZ_MATCHED_CONTACTS_GT from the H_CT_ID list',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2375     END IF;
2376       FORALL I in 1..h_ct_id.COUNT 
2377         INSERT INTO HZ_MATCHED_CONTACTS_GT (SEARCH_CONTEXT_ID,ORG_CONTACT_ID,PARTY_ID,SCORE) VALUES (
2378           l_search_ctx_id, h_ct_id(I), h_ct_party_id(I), h_ct_score(I));
2379     END IF;
2380   END;
2381 
2382   /**  Private procedure to acquire and score at contact point level  ***/
2383   PROCEDURE eval_cpt_level(p_contact_pt_contains_str VARCHAR2,p_call_type VARCHAR2, p_index NUMBER, p_ins_details VARCHAR2,p_emax_score NUMBER) IS
2384     l_party_id_idx NUMBER:=1;
2385     l_ctx_id NUMBER;
2386     h_cpt_id HZ_PARTY_SEARCH.IDList;
2387     h_cpt_party_id HZ_PARTY_SEARCH.IDList;
2388     h_cpt_score HZ_PARTY_SEARCH.IDList;
2389     detcnt NUMBER := 1;
2390     l_cpt_flag VARCHAR2(1) := 'N';
2391     is_a_match VARCHAR2(1) := 'Y';
2392   BEGIN
2393    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2394       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2395       hz_utility_v2pub.debug(p_message=>'calling the procedure eval_cpt_level',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2396     END IF;
2397     SAVEPOINT eval_start;
2398     IF l_match_str = ' AND ' AND p_call_type = 'AND' THEN
2399    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2400       hz_utility_v2pub.debug(p_message=>'Match rule is AND and call type is AND. Inserting into HZ_DQM_PARTIES_GT, from the H_PARTY_ID list',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2401     END IF;
2402       l_ctx_id := l_search_ctx_id;
2403       FORALL I in 1..H_PARTY_ID.COUNT 
2404          INSERT INTO HZ_DQM_PARTIES_GT (SEARCH_CONTEXT_ID,PARTY_ID) VALUES (
2405              l_search_ctx_id,H_PARTY_ID(I));
2406       H_PARTY_ID.DELETE;
2407       H_PARTY_ID_LIST.DELETE;
2408     ELSIF l_match_str = ' OR ' AND p_call_type = 'AND' THEN
2409    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2410       hz_utility_v2pub.debug(p_message=>'Match rule is OR and call type is AND. Inserting into HZ_DQM_PARTIES_GT, from the H_PARTY_ID list',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2411     END IF;
2412       l_ctx_id := l_search_ctx_id;
2413       FORALL I in 1..H_PARTY_ID.COUNT 
2414          INSERT INTO HZ_DQM_PARTIES_GT (SEARCH_CONTEXT_ID,PARTY_ID) VALUES (
2415              l_search_ctx_id,H_PARTY_ID(I));
2416       l_party_id_idx := H_PARTY_ID.COUNT+1;
2417     ELSE
2418       IF (p_restrict_sql IS NULL OR instrb(p_restrict_sql, 'SELECTIVE')=0)
2419          and check_estimate_hits('CONTACT_POINTS',p_contact_pt_contains_str)>l_max_thresh THEN
2420    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2421       hz_utility_v2pub.debug(p_message=>'In eval contact point level estimated hits exceed threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2422     END IF;
2423         IF p_index>1 THEN
2424    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2425       hz_utility_v2pub.debug(p_message=>'In eval contact point level number of matches found exceeded threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2426     END IF;
2427           FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_THRESH_EXCEEDED');
2428           FND_MSG_PUB.ADD;
2429           RAISE FND_API.G_EXC_ERROR;
2430         ELSE
2431           push_eval;
2432           RETURN;
2433         END IF;
2434       END IF;
2435       l_ctx_id := NULL;
2436       l_party_id_idx := H_PARTY_ID.COUNT+1;
2437     END IF;
2438    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2439       hz_utility_v2pub.debug(p_message=>'========== START LOOPING THROUGH WHAT IS RETURNED BY OPEN_CONTACT_PT_CURSOR ================',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2440     END IF;
2441     open_contact_pt_cursor(p_dup_party_id,NULL, p_restrict_sql, p_contact_pt_contains_str,l_ctx_id,  p_search_merged, 'N', 'N',l_contact_pt_cur);
2442     LOOP 
2443       FETCH l_contact_pt_cur INTO
2444          l_contact_pt_id,  l_cpt_type, l_cpt_party_id,  l_cpt_ps_id, l_cpt_contact_id , l_TX1, l_TX6, l_TX5;
2445       EXIT WHEN l_contact_pt_cur%NOTFOUND;
2446    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2447       hz_utility_v2pub.debug(p_message=>'----------------------------------------------------------------------------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2448     END IF;
2449    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2450       hz_utility_v2pub.debug(p_message=>'Processing party_id -  '||l_cpt_party_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2451     END IF;
2452    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2453       hz_utility_v2pub.debug(p_message=>'Contact Point Type -  '||l_cpt_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2454     END IF;
2455       --Fix for bug 4417124 
2456       IF l_use_contact_cpt_info OR l_cpt_contact_id IS NULL THEN
2457         l_index := map_id(l_cpt_party_id);
2458         l_score := GET_CONTACT_POINTS_SCORE(l_match_idx,l_TX1,l_TX6,l_TX5);
2459         IF NOT H_SCORES.EXISTS(l_index) THEN
2460           H_SCORES(l_index) := get_new_score_rec(l_score,defpt,defps,defct,l_score, l_cpt_party_id, l_cpt_ps_id, l_cpt_contact_id,l_contact_pt_id);
2461    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2462       hz_utility_v2pub.debug(p_message=>'Processing First Time for this party',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2463     END IF;
2464    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2465       hz_utility_v2pub.debug(p_message=>'l_index is -  '||l_index,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2466     END IF;
2467         ELSE
2468           IF l_score > H_SCORES(l_index).CONTACT_POINT_SCORE THEN
2469             H_SCORES(l_index).TOTAL_SCORE := 
2470                   H_SCORES(l_index).TOTAL_SCORE-H_SCORES(l_index).CONTACT_POINT_SCORE+l_score;
2471             H_SCORES(l_index).CONTACT_POINT_SCORE := l_score;
2472           END IF;
2473         END IF;
2474    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2475       hz_utility_v2pub.debug(p_message=>'call type is -  '||p_call_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2476     END IF;
2477    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2478       hz_utility_v2pub.debug(p_message=>'match string is -  '||l_match_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2479     END IF;
2480         IF NOT H_PARTY_ID_LIST.EXISTS(l_index) THEN
2481           H_PARTY_ID_LIST(l_index) := 1;
2482           H_PARTY_ID(l_party_id_idx) := l_cpt_party_id;
2483           l_party_id_idx:= l_party_id_idx+1;
2484         END IF;
2485         IF p_ins_details = 'Y' THEN
2486           FOR I IN 1..h_cpt_id.COUNT LOOP
2487           IF h_cpt_id(I)=l_contact_pt_id THEN
2488           	 l_cpt_flag := 'Y';
2489           END IF;
2490           END LOOP;
2491           IF l_cpt_flag = 'Y' THEN
2492           	 NULL;
2493           ELSE
2494          	 h_cpt_id(detcnt) := l_contact_pt_id;
2495           	 h_cpt_party_id(detcnt) := l_cpt_party_id;
2496           	 IF (p_emax_score > 0) THEN 
2497               h_cpt_score(detcnt) := round((l_score/p_emax_score)*100);
2498             ELSE 
2499               h_cpt_score(detcnt) := 0; 
2500           	 END IF; 
2501             detcnt := detcnt +1;
2502           END IF;
2503         END IF;
2504     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2505       hz_utility_v2pub.debug(p_message=>'In eval_cpt_level l_contact_pt_id =  '||l_contact_pt_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2506       hz_utility_v2pub.debug(p_message=>'In eval_cpt_level l_cpt_party_id =  '||l_cpt_party_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2507       hz_utility_v2pub.debug(p_message=>'In eval_cpt_level l_score =  '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2508     END IF;
2509       END IF;
2510     END LOOP;
2511    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2512       hz_utility_v2pub.debug(p_message=>'===========END of LOOP=====================',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2513     END IF;
2514     CLOSE l_contact_pt_cur;
2515     ROLLBACK to eval_start;
2516     IF p_ins_details = 'Y' THEN
2517    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2518       hz_utility_v2pub.debug(p_message=>'In eval_contact_point_level inserting into HZ_MATCHED_CPTS_GT from the H_CPT_ID list',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2519     END IF;
2520       FORALL I in 1..h_cpt_id.COUNT 
2521         INSERT INTO HZ_MATCHED_CPTS_GT (SEARCH_CONTEXT_ID,CONTACT_POINT_ID,PARTY_ID,SCORE) VALUES (
2522           l_search_ctx_id, h_cpt_id(I), h_cpt_party_id(I), h_cpt_score(I));
2523     END IF;
2524   END eval_cpt_level;
2525 
2526   /**  Private procedure to call the eval procedure at each entity in the correct order ***/
2527   PROCEDURE do_eval (p_index NUMBER) IS
2528     l_ctx_id NUMBER;
2529     l_threshold NUMBER;
2530     other_acq_criteria_exists BOOLEAN; 
2531     acq_cnt NUMBER; 
2532   BEGIN
2533    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2534       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2535       hz_utility_v2pub.debug(p_message=>'calling the procedure do_eval',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2536     END IF;
2537     IF (p_index=5 AND call_order(5) <> 'NONE' AND H_PARTY_ID.COUNT=0) THEN
2538      l_threshold := 15;  
2539     other_acq_criteria_exists := TRUE ;
2540     --check if acquisition criteria exists for any other entity
2541     IF l_party_contains_str IS NOT NULL THEN 
2542     	acq_cnt := 1; 
2543     END IF; 
2544     IF l_party_site_contains_str IS NOT NULL THEN 
2545     	acq_cnt := acq_cnt+1; 
2546     END IF; 
2547     IF l_contact_contains_str IS NOT NULL THEN 
2548     	acq_cnt := acq_cnt+1; 
2549     END IF;
2550     IF l_contact_pt_contains_str IS NOT NULL THEN 
2551     	acq_cnt := acq_cnt+1; 
2552     END IF;  
2553     IF acq_cnt>1 THEN 
2554     	other_acq_criteria_exists := TRUE; 
2555     ELSE
2556     	other_acq_criteria_exists := FALSE; 
2557     END IF;  
2558       hz_utility_v2pub.debug(p_message=>'count of entities having acquisition attributes =  '||acq_cnt,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2559       hz_utility_v2pub.debug(p_message=>'call_max_score(p_index) =  '||call_max_score(p_index),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2560       hz_utility_v2pub.debug(p_message=>'l_threshold =  '||l_threshold,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2561     IF(l_match_str = ' AND ' AND other_acq_criteria_exists) THEN
2562     	IF ( call_max_score(p_index) < l_threshold) THEN 
2563    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2564       hz_utility_v2pub.debug(p_message=>'When max score of entity level<l_threshold, do not evaluate ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2565     END IF;
2566 	     	RETURN;	
2567     	ELSE 
2568    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2569       hz_utility_v2pub.debug(p_message=>'In do eval number of matches found exceeded threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2570     END IF;
2571 	     	FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_THRESH_EXCEEDED'); 
2572 	     	FND_MSG_PUB.ADD; 
2573 	     	RAISE FND_API.G_EXC_ERROR; 
2574     	END IF; 
2575     ELSE
2576    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2577       hz_utility_v2pub.debug(p_message=>'In do eval number of matches found exceeded threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2578     END IF;
2579       FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_THRESH_EXCEEDED');
2580       FND_MSG_PUB.ADD;
2581       RAISE FND_API.G_EXC_ERROR;
2582      END IF; 
2583     END IF;
2584     IF call_order(p_index) = 'PARTY' AND l_party_contains_str IS NOT NULL THEN
2585       eval_party_level(l_party_contains_str,call_type(p_index), p_index);
2586     ELSIF call_order(p_index) = 'PARTY_SITE' AND l_party_site_contains_str IS NOT NULL THEN
2587       eval_party_site_level(l_party_site_contains_str,call_type(p_index), p_index,p_ins_details,call_max_score(p_index));
2588     ELSIF call_order(p_index) = 'CONTACT' AND l_contact_contains_str IS NOT NULL THEN
2589       eval_contact_level(l_contact_contains_str,call_type(p_index), p_index,p_ins_details,call_max_score(p_index));
2590     ELSIF call_order(p_index) = 'CONTACT_POINT' AND l_contact_pt_contains_str IS NOT NULL THEN
2591       eval_cpt_level(l_contact_pt_contains_str,call_type(p_index), p_index,p_ins_details,call_max_score(p_index));
2592     END IF;
2593   END;
2594   /************ End of find_parties private procedures **********/ 
2595 
2596   BEGIN
2597 
2598    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2599       hz_utility_v2pub.debug(p_message=>'--------------------------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2600     END IF;
2601    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2602       hz_utility_v2pub.debug(p_message=>'Entering Procedure find_parties',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2603     END IF;
2604     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2605       hz_utility_v2pub.debug(p_message=>'Input Parameters are :',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2606       hz_utility_v2pub.debug(p_message=>'p_match_type =  '||p_match_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2607       hz_utility_v2pub.debug(p_message=>'p_restrict_sql =  '||p_restrict_sql,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2608       hz_utility_v2pub.debug(p_message=>'p_dup_set_id =  '||p_dup_set_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2609       hz_utility_v2pub.debug(p_message=>'p_search_merged =  '||p_search_merged,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2610       hz_utility_v2pub.debug(p_message=>'p_dup_party_id =  '||p_dup_party_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2611     END IF;
2612     -- ************************************
2613     -- STEP 1. Initialization and error checks
2614 
2615     l_match_str := ' AND ';
2616     IF p_match_type = 'AND' THEN
2617       l_match_str := ' AND ';
2618     ELSIF p_match_type = 'OR' THEN
2619       l_match_str := ' OR ';
2620     END IF;
2621     l_entered_max_score:= init_search(p_party_search_rec,p_party_site_list,p_contact_list,p_contact_point_list, l_match_str, l_party_max_score, l_ps_max_score, l_contact_max_score, l_cpt_max_score);
2622     IF l_entered_max_score = 0 THEN l_entered_max_score:=1; END IF;
2623 
2624    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2625       hz_utility_v2pub.debug(p_message=>'This is Duplicate Identification match rule',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2626     END IF;
2627   IF l_entered_max_score < 15 THEN
2628     x_num_matches:=0;
2629     x_search_ctx_id:=0;
2630    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2631       hz_utility_v2pub.debug(p_message=>'Returning since maximum obtainable score of input search criteria < threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2632     END IF;
2633     RETURN;
2634   END IF;
2635 
2636     --Fix for bug 4417124 
2637 
2638     SELECT use_contact_addr_flag, use_contact_cpt_flag 
2639     INTO l_use_contact_addr_flag, l_use_contact_cpt_flag 
2640     FROM hz_match_rules_b 
2641     WHERE match_rule_id = 3; 
2642 
2643     IF NVL(l_use_contact_addr_flag, 'Y') = 'N' THEN
2644       l_use_contact_addr_info := FALSE; 
2645     END IF; 
2646 
2647     IF NVL(l_use_contact_cpt_flag, 'Y') = 'N' THEN
2648       l_use_contact_cpt_info := FALSE; 
2649     END IF; 
2650 
2651    --End fix for bug 4417124
2652 
2653     IF p_dup_batch_id IS NOT NULL THEN
2654       l_max_thresh:=nvl(FND_PROFILE.VALUE('HZ_DQM_MAX_EVAL_THRESH_BATCH'),10000);
2655     ELSE
2656       l_max_thresh:=nvl(FND_PROFILE.VALUE('HZ_DQM_MAX_EVAL_THRESH'),200);
2657     END IF;
2658     IF nvl(FND_PROFILE.VALUE('HZ_DQM_SCORE_UNTIL_THRESH'),'N')='Y' THEN
2659       g_score_until_thresh := true;
2660    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2661       hz_utility_v2pub.debug(p_message=>'g_score_until_thresh is true',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2662     END IF;
2663     ELSE
2664       g_score_until_thresh := false;
2665    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2666       hz_utility_v2pub.debug(p_message=>'g_score_until_thresh is false',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2667     END IF;
2668     END IF;
2669    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2670       hz_utility_v2pub.debug(p_message=>'Maximum records that will be evaluated is  '||l_max_thresh,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2671     END IF;
2672     -- ************************************************************
2673     -- STEP 2. Setup of intermedia query strings for Acquisition query
2674     l_party_site_contains_str := INIT_PARTY_SITES_QUERY(l_match_str,l_ps_denorm_str);
2675     l_contact_contains_str := INIT_CONTACTS_QUERY(l_match_str,l_ct_denorm_str);
2676     l_contact_pt_contains_str := INIT_CONTACT_POINTS_QUERY(l_match_str,l_cpt_denorm_str);
2677    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2678       hz_utility_v2pub.debug(p_message=>'Commencing the DENORM LOGIC in find_parties',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2679     END IF;
2680     l_denorm_max_score:=0;
2681     l_non_denorm_max_score:=0;
2682     IF l_ps_denorm_str IS NOT NULL THEN
2683       l_denorm_max_score := l_denorm_max_score+l_ps_max_score;
2684       l_denorm_str := l_ps_denorm_str;
2685     ELSE
2686       l_non_denorm_max_score := l_non_denorm_max_score+l_ps_max_score;
2687     END IF;
2688     IF l_ct_denorm_str IS NOT NULL THEN
2689       l_denorm_max_score := l_denorm_max_score+l_contact_max_score;
2690       IF l_denorm_str IS NOT NULL THEN
2691         l_denorm_str := l_denorm_str || ' OR ' ||l_ct_denorm_str;
2692       ELSE
2693         l_denorm_str := l_ct_denorm_str;
2694       END IF;
2695     ELSE
2696       l_non_denorm_max_score := l_non_denorm_max_score+l_contact_max_score;
2697     END IF;
2698     IF l_cpt_denorm_str IS NOT NULL THEN
2699       l_denorm_max_score := l_denorm_max_score+l_cpt_max_score;
2700       IF l_denorm_str IS NOT NULL THEN
2701         l_denorm_str := l_denorm_str || ' OR ' ||l_cpt_denorm_str;
2702       ELSE
2703         l_denorm_str := l_cpt_denorm_str;
2704       END IF;
2705     ELSE
2706       l_non_denorm_max_score := l_non_denorm_max_score+l_cpt_max_score;
2707     END IF;
2708     l_party_contains_str := INIT_PARTY_QUERY(l_match_str, l_denorm_str, l_party_max_score, l_denorm_max_score, l_non_denorm_max_score, round((15/60)*l_entered_max_score));
2709     init_score_context(p_party_search_rec,p_party_site_list,p_contact_list,p_contact_point_list);
2710 
2711     -- Setup Search Context ID
2712     SELECT hz_search_ctx_s.nextval INTO l_search_ctx_id FROM dual;
2713     x_search_ctx_id := l_search_ctx_id;
2714 
2715    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2716       hz_utility_v2pub.debug(p_message=>'Search context id in find_parties is  '||x_search_ctx_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2717     END IF;
2718     IF l_party_contains_str IS NULL THEN
2719       defpt := 1;
2720     END IF;
2721     IF l_party_site_contains_str IS NULL THEN
2722       defps := 1;
2723     END IF;
2724     IF l_contact_contains_str IS NULL THEN
2725       defct := 1;
2726     END IF;
2727     IF l_contact_pt_contains_str IS NULL THEN
2728       defcpt := 1;
2729     END IF;
2730 
2731     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2732    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2733       hz_utility_v2pub.debug(p_message=>'------------------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2734     END IF;
2735       hz_utility_v2pub.debug(p_message=>'In find_parties l_match_str =   '||l_match_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2736       hz_utility_v2pub.debug(p_message=>'In find_parties l_party_contains_str =  '||l_party_contains_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2737       hz_utility_v2pub.debug(p_message=>'In find_parties l_party_site_contains_str =  '||l_party_site_contains_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2738       hz_utility_v2pub.debug(p_message=>'In find_parties l_contact_contains_str =  '||l_contact_contains_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2739       hz_utility_v2pub.debug(p_message=>'In find_parties l_contact_pt_contains_str =  '||l_contact_pt_contains_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2740       hz_utility_v2pub.debug(p_message=>'In find_parties l_search_ctx_id =  '||l_search_ctx_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2741     END IF;
2742     FOR I in 1..5 LOOP
2743       do_eval(I);
2744     END LOOP;
2745     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2746       hz_utility_v2pub.debug(p_message=>'In find_parties. This is a Duplicate Identification Rule. Evaluating Matches. Threshold : 15 ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2747     END IF;
2748     x_num_matches := 0;
2749     l_num_eval := 0;
2750     IF l_match_str = ' OR ' THEN
2751       l_party_id := H_SCORES.FIRST;
2752     ELSE
2753       l_party_id := H_PARTY_ID_LIST.FIRST;
2754     END IF;
2755     WHILE l_party_id IS NOT NULL LOOP
2756       l_num_eval:= l_num_eval+1;
2757     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2758    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2759       hz_utility_v2pub.debug(p_message=>'----------------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2760     END IF;
2761       hz_utility_v2pub.debug(p_message=>'In find_parties Match Party ID =  '||H_SCORES(l_party_id).PARTY_ID,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2762       hz_utility_v2pub.debug(p_message=>'In find_parties Score =  '||H_SCORES(l_party_id).TOTAL_SCORE,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2763     END IF;
2764    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2765       hz_utility_v2pub.debug(p_message=>'In find_parties inserting Duplicate Identification results into HZ_MATCHED_PARTIES_GT',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2766     END IF;
2767       IF H_SCORES(l_party_id).TOTAL_SCORE>=15 THEN
2768           IF p_dup_set_id IS NULL THEN
2769             INSERT INTO HZ_MATCHED_PARTIES_GT (SEARCH_CONTEXT_ID, PARTY_ID, SCORE) 
2770             VALUES (l_search_ctx_id,H_SCORES(l_party_id).PARTY_ID,H_SCORES(l_party_id).TOTAL_SCORE);
2771              x_num_matches := x_num_matches+1;
2772           ELSE
2773    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2774       hz_utility_v2pub.debug(p_message=>'Before Inserting Duplicate Identification results into HZ_DUP_SET_PARTIES, if dup party already exists',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2775     END IF;
2776             BEGIN
2777               SELECT 1 INTO l_tmp FROM HZ_DUP_SET_PARTIES
2778               WHERE DUP_PARTY_ID = H_SCORES(l_party_id).PARTY_ID
2779               AND DUP_SET_BATCH_ID = p_dup_batch_id 
2780               AND ROWNUM=1;
2781             EXCEPTION 
2782               WHEN NO_DATA_FOUND THEN
2783                 IF H_SCORES(l_party_id).TOTAL_SCORE>=99999 THEN
2784                   l_merge_flag := 'Y';
2785                 ELSE
2786                   l_merge_flag := 'N';
2787                 END IF;
2788    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2789       hz_utility_v2pub.debug(p_message=>'In find_parties inserting Duplicate Identification results into HZ_DUP_SET_PARTIES',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2790     END IF;
2791    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2792       hz_utility_v2pub.debug(p_message=>'----------------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2793     END IF;
2794                 INSERT INTO HZ_DUP_SET_PARTIES (DUP_PARTY_ID,DUP_SET_ID,MERGE_SEQ_ID,
2795                     MERGE_BATCH_ID,SCORE,MERGE_FLAG, CREATED_BY,CREATION_DATE,LAST_UPDATE_LOGIN,
2796                     LAST_UPDATE_DATE,LAST_UPDATED_BY,DUP_SET_BATCH_ID) 
2797                 VALUES (H_SCORES(l_party_id).PARTY_ID,p_dup_set_id,0,0,
2798                     H_SCORES(l_party_id).TOTAL_SCORE, l_merge_flag,
2799                     hz_utility_pub.created_by,hz_utility_pub.creation_date,
2800                     hz_utility_pub.last_update_login,
2801                     hz_utility_pub.last_update_date,
2802                     hz_utility_pub.user_id,p_dup_batch_id);
2803                 x_num_matches := x_num_matches+1;
2804             END;
2805           END IF;
2806       END IF;
2807       IF l_match_str = ' OR ' THEN
2808         l_party_id:=H_SCORES.NEXT(l_party_id);
2809       ELSE
2810         l_party_id:=H_PARTY_ID_LIST.NEXT(l_party_id);
2811       END IF;
2812     END LOOP;
2813     HZ_DQM_SEARCH_UTIL.set_num_eval(l_num_eval);
2814    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2815       hz_utility_v2pub.debug(p_message=>'Exiting Procedure find_parties',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2816     END IF;
2817    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2818       hz_utility_v2pub.debug(p_message=>'--------------------------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2819     END IF;
2820 EXCEPTION
2821   WHEN L_RETURN_IMM_EXC THEN
2822     RETURN;
2823   WHEN FND_API.G_EXC_ERROR THEN
2824     RAISE FND_API.G_EXC_ERROR;
2825   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2826     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2827   WHEN OTHERS THEN
2828     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
2829     FND_MESSAGE.SET_TOKEN('PROC','HZ_MATCH_RULE_3.find_parties');
2830     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
2831     FND_MSG_PUB.ADD;
2832     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2833 END find_parties;
2834 
2835 PROCEDURE find_persons (
2836       p_rule_id               IN      NUMBER,
2837       p_party_search_rec      IN      HZ_PARTY_SEARCH.party_search_rec_type,
2838       p_party_site_list       IN      HZ_PARTY_SEARCH.party_site_list,
2839       p_contact_list          IN      HZ_PARTY_SEARCH.contact_list,
2840       p_contact_point_list    IN      HZ_PARTY_SEARCH.contact_point_list,
2841       p_restrict_sql          IN      VARCHAR2,
2842       p_match_type            IN      VARCHAR2,
2843       p_search_merged         IN      VARCHAR2,
2844       p_dup_party_id          IN      NUMBER,
2845       p_dup_set_id            IN      NUMBER,
2846       p_dup_batch_id          IN      NUMBER,
2847       p_ins_details           IN      VARCHAR2,
2848       x_search_ctx_id         OUT     NUMBER,
2849       x_num_matches           OUT     NUMBER
2850 ) IS
2851 
2852   -- Strings to hold the generated Intermedia query strings
2853   l_party_contains_str VARCHAR2(32000); 
2854   l_party_site_contains_str VARCHAR2(32000);
2855   l_contact_contains_str VARCHAR2(32000);
2856   l_contact_pt_contains_str VARCHAR2(32000);
2857   l_denorm_str VARCHAR2(32000);
2858   l_ps_denorm_str VARCHAR2(32000);
2859   l_ct_denorm_str VARCHAR2(32000);
2860   l_cpt_denorm_str VARCHAR2(32000);
2861 
2862   -- Other local variables
2863   l_match_str VARCHAR2(30); -- Match type (AND or OR)
2864   l_sqlstr VARCHAR2(32000); -- Dynamic SQL String
2865   -- For Score calculation
2866   l_max_score NUMBER;
2867   l_match_idx NUMBER;
2868   l_entered_max_score NUMBER;
2869   FIRST BOOLEAN;
2870   l_search_ctx_id NUMBER; -- Generated Search Context ID
2871 
2872   l_TX44 VARCHAR2(2000);
2873   l_TX1 VARCHAR2(2000);
2874   l_TX5 VARCHAR2(2000);
2875   l_TX6 VARCHAR2(2000);
2876   H_SCORES HZ_PARTY_SEARCH.score_list;
2877   H_PARTY_ID HZ_PARTY_SEARCH.IDList;
2878   H_PARTY_ID_LIST HZ_PARTY_SEARCH.IDList;
2879 
2880   l_score NUMBER;
2881   l_idx NUMBER;
2882   l_party_cur HZ_PARTY_STAGE.StageCurTyp;
2883   l_party_site_cur HZ_PARTY_STAGE.StageCurTyp;
2884   l_contact_cur HZ_PARTY_STAGE.StageCurTyp;
2885   l_contact_pt_cur HZ_PARTY_STAGE.StageCurTyp;
2886   l_party_id NUMBER;
2887   l_ps_party_id NUMBER;
2888   l_ct_party_id NUMBER;
2889   l_cpt_party_id NUMBER;
2890   l_cpt_ps_id NUMBER;
2891   l_cpt_contact_id NUMBER;
2892   l_cpt_type VARCHAR2(100);
2893   l_party_site_id NUMBER;
2894   l_org_contact_id NUMBER;
2895   l_contact_pt_id NUMBER;
2896   l_cpt_level VARCHAR2(100);
2897   l_ps_contact_id NUMBER;
2898   l_party_max_score NUMBER;
2899   l_ps_max_score NUMBER;
2900   l_contact_max_score NUMBER;
2901   l_cpt_max_score NUMBER;
2902   l_denorm_max_score NUMBER;
2903   l_non_denorm_max_score NUMBER;
2904 
2905   defpt NUMBER :=0;
2906   defps NUMBER :=0;
2907   defct NUMBER :=0;
2908   defcpt NUMBER :=0;
2909   l_index NUMBER;
2910   l_max_thresh NUMBER;
2911   l_tmp NUMBER;
2912   l_merge_flag VARCHAR2(1);
2913   l_num_eval NUMBER:=0;
2914 
2915   L_RETURN_IMM_EXC Exception;
2916 
2917   
2918   /********************* Find Parties private procedures *******/
2919   PROCEDURE set_person_party_type IS
2920   BEGIN
2921     g_party_stage_rec.TX36:= 
2922         HZ_TRANS_PKG.EXACT(
2923              'PERSON'
2924              ,null,'PARTY_TYPE'
2925              ,'PARTY');
2926   END;
2927     
2928   PROCEDURE unset_person_party_type IS
2929   BEGIN
2930     g_party_stage_rec.TX36 := '';
2931   END;
2932   
2933   FUNCTION get_person_id(p_party_id NUMBER, p_contact_id NUMBER) 
2934   RETURN NUMBER IS
2935     l_party_type VARCHAR2(255);
2936     l_person_id NUMBER(15);
2937   BEGIN
2938     SELECT party_type INTO l_party_type from hz_parties where party_id = p_party_id;
2939     IF l_party_type = 'PERSON' THEN
2940       RETURN p_party_id;
2941     ELSIF p_contact_id IS NULL THEN
2942       RETURN NULL;
2943     ELSE
2944       BEGIN 
2945         SELECT subject_id INTO l_person_id FROM HZ_RELATIONSHIPS r, HZ_ORG_CONTACTS oc, hz_parties p
2946         WHERE oc.org_contact_id = p_contact_id
2947         AND r.relationship_id = oc.party_relationship_id 
2948         AND r.object_id = p_party_id
2949         AND p.party_id = r.subject_id 
2950         AND p.party_type = 'PERSON'
2951         AND ROWNUM=1;
2952         
2953         RETURN l_person_id;
2954       EXCEPTION
2955         WHEN NO_DATA_FOUND THEN
2956           RETURN NULL;
2957       END;      
2958     END IF;
2959   END;  
2960 
2961   PROCEDURE push_eval IS
2962   BEGIN
2963     H_PARTY_ID.DELETE;
2964     H_PARTY_ID_LIST.DELETE;
2965     H_SCORES.DELETE;        
2966     g_mappings.DELETE;
2967     HZ_DQM_SEARCH_UTIL.set_num_eval(0);
2968     call_order(5) := call_order(1);
2969     call_type(5) := 'AND';
2970     call_max_score(5) := call_max_score(1);
2971     call_type(2) := 'OR';
2972   END;
2973 
2974   /**  Private procedure to acquire and score at party level  ***/
2975   PROCEDURE eval_party_level(p_party_contains_str VARCHAR2,p_call_type VARCHAR2, p_index NUMBER) IS
2976     l_party_id_idx NUMBER:=1;
2977     l_ctx_id NUMBER;
2978   BEGIN
2979     SAVEPOINT eval_start;
2980     set_person_party_type;
2981     IF l_match_str = ' AND ' AND p_call_type = 'AND' THEN
2982       l_ctx_id := l_search_ctx_id;
2983       FORALL I in 1..H_PARTY_ID.COUNT 
2984          INSERT INTO HZ_DQM_PARTIES_GT (SEARCH_CONTEXT_ID,PARTY_ID) VALUES (
2985              l_search_ctx_id,H_PARTY_ID(I));
2986       H_PARTY_ID.DELETE;
2987       H_PARTY_ID_LIST.DELETE;
2988     ELSIF l_match_str = ' OR ' AND p_call_type = 'AND' THEN
2989       l_ctx_id := l_search_ctx_id;
2990       FORALL I in 1..H_PARTY_ID.COUNT 
2991          INSERT INTO HZ_DQM_PARTIES_GT (SEARCH_CONTEXT_ID,PARTY_ID) VALUES (
2992              l_search_ctx_id,H_PARTY_ID(I));
2993       l_party_id_idx := H_PARTY_ID.COUNT+1;
2994     ELSE
2995       IF (p_restrict_sql IS NULL OR instrb(p_restrict_sql, 'SELECTIVE')=0)
2996          and check_estimate_hits('PARTY',p_party_contains_str)>l_max_thresh THEN
2997    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
2998       hz_utility_v2pub.debug(p_message=>'In eval party level estimated hits exceed threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
2999     END IF;
3000         IF g_party_stage_rec.TX8 IS NOT NULL AND nvl(FND_PROFILE.VALUE('HZ_DQM_PN_THRESH_RESOLUTION'),'NONE')='SQL' THEN
3001    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3002       hz_utility_v2pub.debug(p_message=>'In eval party level resolution option is set to SQL search.',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3003     END IF;
3004           IF (l_party_site_contains_str IS NULL AND
3005              l_contact_contains_str IS NULL AND
3006              l_contact_pt_contains_str IS NULL) AND NOT g_other_party_level_attribs IS NULL THEN
3007             return_direct_matches(p_restrict_sql,l_match_str,l_max_thresh,l_search_ctx_id,null,null, x_num_matches);
3008             RAISE L_RETURN_IMM_EXC;
3009           ELSE
3010             open_party_cursor_direct(p_dup_party_id, p_restrict_sql, l_match_str,null,p_party_contains_str,l_party_cur);
3011           END IF;
3012         ELSE
3013           IF p_index>1 THEN
3014    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3015       hz_utility_v2pub.debug(p_message=>'In eval party level number of matches found exceeded threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3016     END IF;
3017             FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_THRESH_EXCEEDED');
3018             FND_MSG_PUB.ADD;
3019             RAISE FND_API.G_EXC_ERROR;
3020           ELSE
3021             push_eval;
3022             RETURN;
3023           END IF;
3024         END IF;
3025       END IF;
3026       l_ctx_id := NULL;
3027       l_party_id_idx := H_PARTY_ID.COUNT+1;
3028     END IF;
3029     IF l_party_cur IS NULL OR (not l_party_cur%ISOPEN) THEN
3030       open_party_cursor(p_dup_party_id, p_restrict_sql, p_party_contains_str,l_ctx_id, l_match_str,p_search_merged,l_party_cur);
3031     END IF;
3032     LOOP 
3033       FETCH l_party_cur INTO
3034          l_party_id , l_TX44;
3035       EXIT WHEN l_party_cur%NOTFOUND;
3036       l_index := map_id(l_party_id);
3037       l_score := GET_PARTY_SCORE(l_TX44);
3038       IF NOT H_SCORES.EXISTS(l_index) THEN
3039         H_SCORES(l_index) := get_new_score_rec(l_score,l_score,defps,defct,defcpt, l_party_id, null, null,null);
3040       ELSE
3041         H_SCORES(l_index).TOTAL_SCORE := 
3042                 H_SCORES(l_index).TOTAL_SCORE+l_score;
3043         H_SCORES(l_index).PARTY_SCORE := l_score;
3044       END IF;
3045       IF NOT H_PARTY_ID_LIST.EXISTS(l_index) AND H_SCORES.EXISTS(l_index) THEN
3046         H_PARTY_ID_LIST(l_index) := 1;
3047         H_PARTY_ID(l_party_id_idx) := l_party_id;
3048         l_party_id_idx:= l_party_id_idx+1;
3049       END IF;
3050       IF (l_party_id_idx-1)>l_max_thresh THEN
3051          IF p_index=1 AND call_order(2) = 'PARTY_SITE' 
3052           AND call_type(2) = 'AND' AND l_contact_contains_str IS NULL
3053           AND nvl(FND_PROFILE.VALUE('HZ_DQM_PN_THRESH_RESOLUTION'),'NONE')='SQL' 
3054           AND l_contact_pt_contains_str IS NULL THEN
3055           H_PARTY_ID.DELETE(l_party_id_idx-1);
3056           H_PARTY_ID_LIST.DELETE(l_index);
3057           H_SCORES.DELETE(l_index);
3058           EXIT;
3059         END IF;
3060         CLOSE l_party_cur;
3061         IF p_index>1 THEN
3062    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3063       hz_utility_v2pub.debug(p_message=>'In eval party level number of matches found exceeded threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3064     END IF;
3065           FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_THRESH_EXCEEDED');
3066           FND_MSG_PUB.ADD;
3067           RAISE FND_API.G_EXC_ERROR;
3068         ELSE
3069           push_eval;
3070           RETURN;
3071         END IF;
3072       END IF;
3073     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3074       hz_utility_v2pub.debug(p_message=>'Party Level Matches',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3075       hz_utility_v2pub.debug(p_message=>'l_party_id '||l_party_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3076       hz_utility_v2pub.debug(p_message=>'l_score '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3077     END IF;
3078     END LOOP;
3079     CLOSE l_party_cur;
3080     ROLLBACK to eval_start;
3081   END;
3082   PROCEDURE open_person_contact_cursor(
3083             p_contains_str  VARCHAR2, 
3084             p_search_ctx_id  NUMBER, 
3085             x_cursor OUT HZ_PARTY_STAGE.StageCurTyp) IS
3086   BEGIN
3087     OPEN x_cursor FOR 
3088       SELECT /*+ INDEX(stage HZ_STAGED_CONTACTS_U1) */ ORG_CONTACT_ID, PARTY_ID
3089       FROM HZ_STAGED_CONTACTS stage
3090       WHERE contains( concat_col, p_contains_str)>0
3091       AND ORG_CONTACT_ID in (
3092             SELECT  /*+ ORDERED INDEX(d hz_dqm_parties_gt_n1) USE_NL(d r)*/ 
3093             org_contact_id
3094             from hz_dqm_parties_gt d, hz_relationships r, hz_org_contacts oc
3095             where d.party_id = r.subject_id
3096             and oc.party_relationship_id = r.relationship_id
3097             and d.search_context_id = p_search_ctx_id);   
3098   exception
3099     when others then
3100       if (instrb(SQLERRM,'DRG-51030')>0) then 
3101         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_WILDCARD_ERR');
3102         FND_MSG_PUB.ADD;
3103         RAISE FND_API.G_EXC_ERROR;
3104       elsif (instrb(SQLERRM,'DRG-50943')>0) then 
3105         FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_SEARCH_ERROR');
3106         FND_MSG_PUB.ADD;
3107         RAISE FND_API.G_EXC_ERROR;
3108       else 
3109         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3110       end if;
3111   END;
3112 
3113   /**  Private procedure to acquire and score at party site level  ***/
3114   PROCEDURE eval_party_site_level(p_party_site_contains_str VARCHAR2,p_call_type VARCHAR2, p_index NUMBER,p_ins_details VARCHAR2,p_emax_score NUMBER) IS
3115     l_party_id_idx NUMBER:=1;
3116     l_ctx_id NUMBER;
3117     h_ps_id HZ_PARTY_SEARCH.IDList;
3118     h_ps_party_id HZ_PARTY_SEARCH.IDList;
3119     h_ps_score HZ_PARTY_SEARCH.IDList;
3120     detcnt NUMBER := 1;
3121     l_person_id NUMBER;
3122   BEGIN
3123     SAVEPOINT eval_start;
3124     unset_person_party_type;
3125     IF l_match_str = ' AND ' AND p_call_type = 'AND' THEN
3126       l_ctx_id := l_search_ctx_id;
3127       FORALL I in 1..H_PARTY_ID.COUNT 
3128          INSERT INTO HZ_DQM_PARTIES_GT (SEARCH_CONTEXT_ID,PARTY_ID) VALUES (
3129              l_search_ctx_id,H_PARTY_ID(I));
3130       H_PARTY_ID.DELETE;
3131       H_PARTY_ID_LIST.DELETE;
3132     ELSIF l_match_str = ' OR ' AND p_call_type = 'AND' THEN
3133       l_ctx_id := l_search_ctx_id;
3134       FORALL I in 1..H_PARTY_ID.COUNT 
3135          INSERT INTO HZ_DQM_PARTIES_GT (SEARCH_CONTEXT_ID,PARTY_ID) VALUES (
3136              l_search_ctx_id,H_PARTY_ID(I));
3137       l_party_id_idx := H_PARTY_ID.COUNT+1;
3138     ELSE
3139       l_party_id_idx := H_PARTY_ID.COUNT+1;
3140       l_ctx_id := NULL;
3141     END IF;
3142     open_party_site_cursor(p_dup_party_id,NULL, p_restrict_sql, p_party_site_contains_str,l_ctx_id, p_search_merged,'N', 'Y',l_party_site_cur);
3143     LOOP 
3144       FETCH l_party_site_cur INTO
3145          l_party_site_id, l_ps_party_id, l_ps_contact_id ;
3146       EXIT WHEN l_party_site_cur%NOTFOUND;
3147       IF l_ctx_id IS NULL THEN
3148         l_person_id := get_person_id(l_ps_party_id, l_ps_contact_id);
3149       ELSE
3150         l_person_id := l_ps_party_id;
3151       END IF;
3152       IF l_person_id IS NOT NULL AND l_person_id<>nvl(p_dup_party_id,-1) THEN
3153         l_index := map_id(l_person_id);
3154         l_score := GET_PARTY_SITES_SCORE(l_match_idx);
3155         IF NOT H_SCORES.EXISTS(l_index) THEN
3156           IF l_ctx_id IS NULL THEN
3157             H_SCORES(l_index) := get_new_score_rec(l_score,defpt,l_score,defct,defcpt, l_person_id, l_party_site_id, null,null);
3158           END IF;
3159         ELSE
3160           IF l_score > H_SCORES(l_index).PARTY_SITE_SCORE THEN
3161             H_SCORES(l_index).TOTAL_SCORE := 
3162                   H_SCORES(l_index).TOTAL_SCORE-H_SCORES(l_index).PARTY_SITE_SCORE+l_score;
3163             H_SCORES(l_index).PARTY_SITE_SCORE := l_score;
3164           END IF;
3165         END IF;
3166         IF NOT H_PARTY_ID_LIST.EXISTS(l_index) AND H_SCORES.EXISTS(l_index) THEN
3167           H_PARTY_ID_LIST(l_index) := 1;
3168           H_PARTY_ID(l_party_id_idx) := l_person_id;
3169           l_party_id_idx:= l_party_id_idx+1;
3170         END IF;
3171         IF (l_party_id_idx-1)>l_max_thresh THEN
3172           CLOSE l_party_site_cur;
3173           IF p_index>1 THEN
3174    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3175       hz_utility_v2pub.debug(p_message=>'In eval party site level number of matches found exceeded threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3176     END IF;
3177             FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_THRESH_EXCEEDED');
3178             FND_MSG_PUB.ADD;
3179             RAISE FND_API.G_EXC_ERROR;
3180           ELSE
3181             push_eval;
3182             RETURN;
3183           END IF;
3184         END IF;
3185         IF p_ins_details = 'Y' THEN
3186           h_ps_id(detcnt) := l_party_site_id;
3187           h_ps_party_id(detcnt) := l_person_id;
3188           IF (p_emax_score > 0) THEN 
3189               h_ps_score(detcnt) := round((l_score/p_emax_score)*100);
3190           ELSE 
3191               h_ps_score(detcnt) := 0; 
3192           END IF; 
3193           detcnt := detcnt +1;
3194         END IF;
3195     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3196       hz_utility_v2pub.debug(p_message=>'Party Site Level Matches',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3197       hz_utility_v2pub.debug(p_message=>'l_party_site_id '||l_party_site_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3198       hz_utility_v2pub.debug(p_message=>'l_ps_party_id '||l_person_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3199       hz_utility_v2pub.debug(p_message=>'l_score '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3200     END IF;
3201       END IF;
3202     END LOOP;
3203     CLOSE l_party_site_cur;
3204     ROLLBACK to eval_start;
3205     IF p_ins_details = 'Y' THEN
3206       FORALL I in 1..h_ps_id.COUNT 
3207         INSERT INTO HZ_MATCHED_PARTY_SITES_GT (SEARCH_CONTEXT_ID,PARTY_SITE_ID,PARTY_ID,SCORE) VALUES (
3208           l_search_ctx_id, h_ps_id(I), h_ps_party_id(I), h_ps_score(I));
3209     END IF;
3210   END;
3211 
3212   /**  Private procedure to acquire and score at party site level  ***/
3213   PROCEDURE eval_contact_level(p_contact_contains_str VARCHAR2,p_ins_details VARCHAR2,p_emax_score NUMBER) IS
3214     l_party_id_idx NUMBER:=1;
3215     l_ctx_id NUMBER;
3216     h_ct_id HZ_PARTY_SEARCH.IDList;
3217     h_ct_party_id HZ_PARTY_SEARCH.IDList;
3218     h_ct_score HZ_PARTY_SEARCH.IDList;
3219     detcnt NUMBER := 1;
3220     l_person_id NUMBER;
3221   BEGIN
3222     SAVEPOINT eval_start;
3223     l_ctx_id := l_search_ctx_id;
3224     unset_person_party_type;
3225     FORALL I in 1..H_PARTY_ID.COUNT 
3226          INSERT INTO HZ_DQM_PARTIES_GT (SEARCH_CONTEXT_ID,PARTY_ID) VALUES (
3227              l_search_ctx_id,H_PARTY_ID(I));
3228       l_party_id_idx := H_PARTY_ID.COUNT+1;
3229     open_person_contact_cursor(p_contact_contains_str,l_ctx_id, l_contact_cur);
3230     LOOP 
3231       FETCH l_contact_cur INTO
3232          l_org_contact_id, l_ct_party_id ;
3233       EXIT WHEN l_contact_cur%NOTFOUND;
3234       l_person_id := get_person_id(l_ct_party_id, l_org_contact_id);
3235       l_index := map_id(l_person_id);
3236       IF l_person_id IS NOT NULL AND H_SCORES.EXISTS(l_index) AND l_person_id<>nvl(p_dup_party_id,-1) THEN
3237         l_score := GET_CONTACTS_SCORE(l_match_idx);
3238         IF l_score > H_SCORES(l_index).CONTACT_SCORE THEN
3239           H_SCORES(l_index).TOTAL_SCORE := 
3240                 H_SCORES(l_index).TOTAL_SCORE-H_SCORES(l_index).CONTACT_SCORE+l_score;
3241           H_SCORES(l_index).CONTACT_SCORE := l_score;
3242         END IF;
3243       END IF;
3244       IF p_ins_details = 'Y' THEN
3245         h_ct_id(detcnt) := l_org_contact_id;
3246         h_ct_party_id(detcnt) := l_person_id;
3247         IF (p_emax_score > 0) THEN 
3248             h_ct_score(detcnt) := round((l_score/p_emax_score)*100);
3249         ELSE 
3250             h_ct_score(detcnt) := 0; 
3251         END IF; 
3252         detcnt := detcnt +1;
3253       END IF;
3254     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3255       hz_utility_v2pub.debug(p_message=>'Contact Level Matches',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3256       hz_utility_v2pub.debug(p_message=>'l_org_contact_id '||l_org_contact_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3257       hz_utility_v2pub.debug(p_message=>'l_ct_party_id '||l_person_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3258       hz_utility_v2pub.debug(p_message=>'l_score '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3259     END IF;
3260     END LOOP;
3261     CLOSE l_contact_cur;
3262     ROLLBACK to eval_start;
3263     IF p_ins_details = 'Y' THEN
3264       FORALL I in 1..h_ct_id.COUNT 
3265         INSERT INTO HZ_MATCHED_CONTACTS_GT (SEARCH_CONTEXT_ID,ORG_CONTACT_ID,PARTY_ID,SCORE) VALUES (
3266           l_search_ctx_id, h_ct_id(I), h_ct_party_id(I), h_ct_score(I));
3267     END IF;
3268   END;
3269 
3270   /**  Private procedure to acquire and score at contact point level  ***/
3271   PROCEDURE eval_cpt_level(p_contact_pt_contains_str VARCHAR2,p_call_type VARCHAR2, p_index NUMBER, p_ins_details VARCHAR2,p_emax_score NUMBER) IS
3272     l_party_id_idx NUMBER:=1;
3273     l_ctx_id NUMBER;
3274     h_cpt_id HZ_PARTY_SEARCH.IDList;
3275     h_cpt_party_id HZ_PARTY_SEARCH.IDList;
3276     h_cpt_score HZ_PARTY_SEARCH.IDList;
3277     detcnt NUMBER := 1;
3278     l_person_id NUMBER;
3279     is_a_match VARCHAR2(1) := 'Y';
3280     l_cpt_flag VARCHAR2(1) := 'N';
3281   BEGIN
3282    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3283       hz_utility_v2pub.debug(p_message=>'-----------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3284     END IF;
3285    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3286       hz_utility_v2pub.debug(p_message=>'calling the procedure eval_cpt_level - from find_persons',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3287     END IF;
3288     SAVEPOINT eval_start;
3289     unset_person_party_type;
3290     IF l_match_str = ' AND ' AND p_call_type = 'AND' THEN
3291       l_ctx_id := l_search_ctx_id;
3292       FORALL I in 1..H_PARTY_ID.COUNT 
3293          INSERT INTO HZ_DQM_PARTIES_GT (SEARCH_CONTEXT_ID,PARTY_ID) VALUES (
3294              l_search_ctx_id,H_PARTY_ID(I));
3295       H_PARTY_ID.DELETE;
3296       H_PARTY_ID_LIST.DELETE;
3297     ELSIF l_match_str = ' OR ' AND p_call_type = 'AND' THEN
3298    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3299       hz_utility_v2pub.debug(p_message=>'Match rule is AND and call type is AND. Inserting into HZ_DQM_PARTIES_GT, from the H_PARTY_ID list',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3300     END IF;
3301       l_ctx_id := l_search_ctx_id;
3302       FORALL I in 1..H_PARTY_ID.COUNT 
3303          INSERT INTO HZ_DQM_PARTIES_GT (SEARCH_CONTEXT_ID,PARTY_ID) VALUES (
3304              l_search_ctx_id,H_PARTY_ID(I));
3305       l_party_id_idx := H_PARTY_ID.COUNT+1;
3306     ELSE
3307    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3308       hz_utility_v2pub.debug(p_message=>'Match rule is OR and call type is AND. Inserting into HZ_DQM_PARTIES_GT, from the H_PARTY_ID list',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3309     END IF;
3310       l_ctx_id := NULL;
3311       l_party_id_idx := H_PARTY_ID.COUNT+1;
3312     END IF;
3313    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3314       hz_utility_v2pub.debug(p_message=>'====== START LOOPING THROUGH WHAT IS RETURNED BY OPEN_CONTACT_PT_CURSOR =======',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3315     END IF;
3316     open_contact_pt_cursor(p_dup_party_id,NULL, p_restrict_sql, p_contact_pt_contains_str,l_ctx_id, p_search_merged,'N', 'Y',l_contact_pt_cur);
3317     LOOP 
3318       FETCH l_contact_pt_cur INTO
3319          l_contact_pt_id, l_cpt_type, l_cpt_party_id,  l_cpt_ps_id, l_cpt_contact_id , l_TX1, l_TX6, l_TX5;
3320       EXIT WHEN l_contact_pt_cur%NOTFOUND;
3321    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3322       hz_utility_v2pub.debug(p_message=>' ------------------------------------',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3323     END IF;
3324    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3325       hz_utility_v2pub.debug(p_message=>'Processing party_id -  '||l_cpt_party_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3326     END IF;
3327    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3328       hz_utility_v2pub.debug(p_message=>'contact point type -  '||l_cpt_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3329     END IF;
3330       IF l_ctx_id IS NULL THEN
3331         l_person_id := get_person_id(l_cpt_party_id, l_cpt_contact_id);
3332       ELSE
3333         l_person_id := l_cpt_party_id;
3334       END IF;
3335       IF l_person_id IS NOT NULL AND l_person_id<>nvl(p_dup_party_id,-1) THEN
3336         l_index := map_id(l_person_id);
3337         l_score := GET_CONTACT_POINTS_SCORE(l_match_idx,l_TX1,l_TX6,l_TX5);
3338         IF NOT H_SCORES.EXISTS(l_index) THEN
3339           IF l_ctx_id IS NULL THEN
3340             H_SCORES(l_index) := get_new_score_rec(l_score,defpt,defps,defct,l_score, l_person_id, l_cpt_ps_id, l_cpt_contact_id,l_contact_pt_id);
3341           END IF;
3342         ELSE
3343           IF l_score > H_SCORES(l_index).CONTACT_POINT_SCORE THEN
3344             H_SCORES(l_index).TOTAL_SCORE := 
3345                   H_SCORES(l_index).TOTAL_SCORE-H_SCORES(l_index).CONTACT_POINT_SCORE+l_score;
3346             H_SCORES(l_index).CONTACT_POINT_SCORE := l_score;
3347           END IF;
3348         END IF;
3349    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3350       hz_utility_v2pub.debug(p_message=>'call type is -  '||p_call_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3351     END IF;
3352    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3353       hz_utility_v2pub.debug(p_message=>'match string is -  '||l_match_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3354     END IF;
3355         IF NOT H_PARTY_ID_LIST.EXISTS(l_index) AND H_SCORES.EXISTS(l_index) THEN
3356           H_PARTY_ID_LIST(l_index) := 1;
3357           H_PARTY_ID(l_party_id_idx) := l_person_id;
3358           l_party_id_idx:= l_party_id_idx+1;
3359         END IF;
3360         IF (l_party_id_idx-1)>l_max_thresh THEN
3361           CLOSE l_contact_pt_cur;
3362           IF p_index>1 THEN
3363    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3364       hz_utility_v2pub.debug(p_message=>'In eval contact point level number of matches found exceeded threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3365     END IF;
3366             FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_THRESH_EXCEEDED');
3367             FND_MSG_PUB.ADD;
3368             RAISE FND_API.G_EXC_ERROR;
3369           ELSE
3370             push_eval;
3371             RETURN;
3372           END IF;
3373         END IF;
3374         IF p_ins_details = 'Y' THEN
3375    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3376       hz_utility_v2pub.debug(p_message=>'Inserting into the final array, the person_id -  '||l_person_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3377     END IF;
3378           FOR I IN 1..h_cpt_id.COUNT LOOP
3379           IF h_cpt_id(I)=l_contact_pt_id THEN
3380           	 l_cpt_flag := 'Y';
3381           END IF;
3382           END LOOP;
3383           IF l_cpt_flag = 'Y' THEN
3384           	 NULL;
3385           ELSE 
3386          	 h_cpt_id(detcnt) := l_contact_pt_id;
3387           h_cpt_party_id(detcnt) := l_person_id;
3388           	 IF (p_emax_score > 0) THEN 
3389               h_cpt_score(detcnt) := round((l_score/p_emax_score)*100);
3390             ELSE 
3391               h_cpt_score(detcnt) := 0; 
3392           	 END IF; 
3393             detcnt := detcnt +1;
3394           END IF;
3395         END IF;
3396     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3397       hz_utility_v2pub.debug(p_message=>'Contact pt Level Matches',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3398       hz_utility_v2pub.debug(p_message=>'l_contact_pt_id '||l_contact_pt_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3399       hz_utility_v2pub.debug(p_message=>'l_cpt_party_id '||l_person_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3400       hz_utility_v2pub.debug(p_message=>'l_score '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3401     END IF;
3402       END IF;
3403     END LOOP;
3404     CLOSE l_contact_pt_cur;
3405     ROLLBACK to eval_start;
3406     IF p_ins_details = 'Y' THEN
3407       FORALL I in 1..h_cpt_id.COUNT 
3408         INSERT INTO HZ_MATCHED_CPTS_GT (SEARCH_CONTEXT_ID,CONTACT_POINT_ID,PARTY_ID,SCORE) VALUES (
3409           l_search_ctx_id, h_cpt_id(I), h_cpt_party_id(I), h_cpt_score(I));
3410     END IF;
3411   END;
3412 
3413   /**  Private procedure to call the eval procedure at each entity in the correct order ***/
3414   PROCEDURE do_eval (p_index NUMBER) IS
3415     l_ctx_id NUMBER;
3416     l_threshold NUMBER;
3417     other_acq_criteria_exists BOOLEAN; 
3418     acq_cnt NUMBER; 
3419   BEGIN
3420     IF (p_index=5 AND call_order(5) <> 'NONE' AND H_PARTY_ID.COUNT=0) THEN
3421      l_threshold := 15;  
3422     other_acq_criteria_exists := TRUE ;
3423     --check if acquisition criteria exists for any other entity
3424     IF l_party_contains_str IS NOT NULL THEN 
3425     	acq_cnt := 1; 
3426     END IF; 
3427     IF l_party_site_contains_str IS NOT NULL THEN 
3428     	acq_cnt := acq_cnt+1; 
3429     END IF; 
3430     IF l_contact_contains_str IS NOT NULL THEN 
3431     	acq_cnt := acq_cnt+1; 
3432     END IF;
3433     IF l_contact_pt_contains_str IS NOT NULL THEN 
3434     	acq_cnt := acq_cnt+1; 
3435     END IF;  
3436     IF acq_cnt>1 THEN 
3437     	other_acq_criteria_exists := TRUE; 
3438     ELSE
3439     	other_acq_criteria_exists := FALSE; 
3440     END IF;  
3441       hz_utility_v2pub.debug(p_message=>'count of entities having acquisition attributes =  '||acq_cnt,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3442       hz_utility_v2pub.debug(p_message=>'call_max_score(p_index) =  '||call_max_score(p_index),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3443       hz_utility_v2pub.debug(p_message=>'l_threshold =  '||l_threshold,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3444     IF(l_match_str = ' AND ' AND other_acq_criteria_exists) THEN
3445     	IF ( call_max_score(p_index) < l_threshold) THEN 
3446    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3447       hz_utility_v2pub.debug(p_message=>'When max score of entity level<l_threshold, do not evaluate ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3448     END IF;
3449 	     	RETURN;	
3450     	ELSE 
3451    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3452       hz_utility_v2pub.debug(p_message=>'In do eval number of matches found exceeded threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3453     END IF;
3454 	     	FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_THRESH_EXCEEDED'); 
3455 	     	FND_MSG_PUB.ADD; 
3456 	     	RAISE FND_API.G_EXC_ERROR; 
3457     	END IF; 
3458 	  ELSE
3459    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3460       hz_utility_v2pub.debug(p_message=>'In do eval number of matches found exceeded threshold',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3461     END IF;
3462       FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_THRESH_EXCEEDED');
3463       FND_MSG_PUB.ADD;
3464       RAISE FND_API.G_EXC_ERROR;
3465      END IF; 
3466     END IF;
3467     IF call_order(p_index) = 'PARTY' AND l_party_contains_str IS NOT NULL THEN
3468       eval_party_level(l_party_contains_str,call_type(p_index), p_index);
3469     ELSIF call_order(p_index) = 'PARTY_SITE' AND l_party_site_contains_str IS NOT NULL THEN
3470       eval_party_site_level(l_party_site_contains_str,call_type(p_index), p_index,p_ins_details,call_max_score(p_index));
3471     ELSIF call_order(p_index) = 'CONTACT_POINT' AND l_contact_pt_contains_str IS NOT NULL THEN
3472       eval_cpt_level(l_contact_pt_contains_str,call_type(p_index), p_index,p_ins_details,call_max_score(p_index));
3473     END IF;
3474   END;
3475   /************ End of find_persons private procedures **********/ 
3476 
3477   BEGIN
3478 
3479     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
3480       hz_utility_v2pub.debug(p_message=>'find_persons(+) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
3481     END IF;
3482     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3483       hz_utility_v2pub.debug(p_message=>'Input Parameters:',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3484       hz_utility_v2pub.debug(p_message=>'p_match_type '||p_match_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3485       hz_utility_v2pub.debug(p_message=>'p_restrict_sql '||p_restrict_sql,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3486     END IF;
3487     -- ************************************
3488     -- STEP 1. Initialization and error checks
3489 
3490     l_match_str := ' AND ';
3491     IF p_match_type = 'AND' THEN
3492       l_match_str := ' AND ';
3493     ELSIF p_match_type = 'OR' THEN
3494       l_match_str := ' OR ';
3495     END IF;
3496     l_entered_max_score:= init_search(p_party_search_rec,p_party_site_list,p_contact_list,p_contact_point_list, l_match_str, l_party_max_score, l_ps_max_score, l_contact_max_score, l_cpt_max_score);
3497     IF l_entered_max_score = 0 THEN l_entered_max_score:=1; END IF;
3498 
3499     l_max_thresh:=nvl(FND_PROFILE.VALUE('HZ_DQM_MAX_EVAL_THRESH'),200);
3500     IF nvl(FND_PROFILE.VALUE('HZ_DQM_SCORE_UNTIL_THRESH'),'N')='Y' THEN
3501       g_score_until_thresh := true;
3502     ELSE
3503       g_score_until_thresh := false;
3504     END IF;
3505     -- ************************************************************
3506     -- STEP 2. Setup of intermedia query strings for Acquisition query
3507     l_party_site_contains_str := INIT_PARTY_SITES_QUERY(l_match_str,l_ps_denorm_str);
3508     l_contact_contains_str := INIT_CONTACTS_QUERY(l_match_str,l_ct_denorm_str);
3509     l_contact_pt_contains_str := INIT_CONTACT_POINTS_QUERY(l_match_str,l_cpt_denorm_str);
3510     l_party_contains_str := INIT_PARTY_QUERY(l_match_str, null, 0, 0, 0,0);
3511     init_score_context(p_party_search_rec,p_party_site_list,p_contact_list,p_contact_point_list);
3512 
3513     -- Setup Search Context ID
3514     SELECT hz_search_ctx_s.nextval INTO l_search_ctx_id FROM dual;
3515     x_search_ctx_id := l_search_ctx_id;
3516 
3517     IF l_party_contains_str IS NULL THEN
3518       defpt := 1;
3519     END IF;
3520     IF l_party_site_contains_str IS NULL THEN
3521       defps := 1;
3522     END IF;
3523     IF l_contact_contains_str IS NULL THEN
3524       defct := 1;
3525     END IF;
3526     IF l_contact_pt_contains_str IS NULL THEN
3527       defcpt := 1;
3528     END IF;
3529 
3530     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3531       hz_utility_v2pub.debug(p_message=>'l_match_str '||l_match_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3532       hz_utility_v2pub.debug(p_message=>'l_party_contains_str '||l_party_contains_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3533       hz_utility_v2pub.debug(p_message=>'l_party_site_contains_str '||l_party_site_contains_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3534       hz_utility_v2pub.debug(p_message=>'l_contact_contains_str '||l_contact_contains_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3535       hz_utility_v2pub.debug(p_message=>'l_contact_pt_contains_str '||l_contact_pt_contains_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3536       hz_utility_v2pub.debug(p_message=>'l_search_ctx_id '||l_search_ctx_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3537     END IF;
3538     FOR I in 1..5 LOOP
3539       do_eval(I);
3540     END LOOP;
3541     IF l_contact_contains_str IS NOT NULL THEN
3542       eval_contact_level(l_contact_contains_str,p_ins_details,l_contact_max_score);
3543     END IF;
3544     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3545       hz_utility_v2pub.debug(p_message=>'Evaluating Matches. Threshold : 25 ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3546     END IF;
3547     x_num_matches := 0;
3548     l_num_eval := 0;
3549     IF l_match_str = ' OR ' THEN
3550       l_party_id := H_SCORES.FIRST;
3551     ELSE
3552       l_party_id := H_PARTY_ID_LIST.FIRST;
3553     END IF;
3554     WHILE l_party_id IS NOT NULL LOOP
3555       l_num_eval:= l_num_eval+1;
3556     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3557       hz_utility_v2pub.debug(p_message=>'Match Party ID '||H_SCORES(l_party_id).PARTY_ID,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3558       hz_utility_v2pub.debug(p_message=>'Score '||H_SCORES(l_party_id).TOTAL_SCORE,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3559     END IF;
3560       IF H_SCORES(l_party_id).TOTAL_SCORE>=15 THEN
3561           IF p_dup_set_id IS NULL THEN
3562             INSERT INTO HZ_MATCHED_PARTIES_GT (SEARCH_CONTEXT_ID, PARTY_ID, SCORE) 
3563             VALUES (l_search_ctx_id,H_SCORES(l_party_id).PARTY_ID,H_SCORES(l_party_id).TOTAL_SCORE);
3564              x_num_matches := x_num_matches+1;
3565           ELSE
3566             BEGIN
3567               SELECT  1 INTO l_tmp FROM HZ_DUP_SET_PARTIES
3568               WHERE DUP_PARTY_ID = H_SCORES(l_party_id).PARTY_ID
3569               AND DUP_SET_BATCH_ID = p_dup_batch_id 
3570               AND ROWNUM=1;
3571             EXCEPTION 
3572               WHEN NO_DATA_FOUND THEN
3573                 IF H_SCORES(l_party_id).TOTAL_SCORE>=99999 THEN
3574                   l_merge_flag := 'Y';
3575                 ELSE
3576                   l_merge_flag := 'N';
3577                 END IF;
3578                 INSERT INTO HZ_DUP_SET_PARTIES (DUP_PARTY_ID,DUP_SET_ID,MERGE_SEQ_ID,
3579                     MERGE_BATCH_ID,SCORE,MERGE_FLAG, CREATED_BY,CREATION_DATE,LAST_UPDATE_LOGIN,
3580                     LAST_UPDATE_DATE,LAST_UPDATED_BY,DUP_SET_BATCH_ID) 
3581                 VALUES (H_SCORES(l_party_id).PARTY_ID,p_dup_set_id,0,0,
3582                     H_SCORES(l_party_id).TOTAL_SCORE, l_merge_flag,
3583                     hz_utility_pub.created_by,hz_utility_pub.creation_date,
3584                     hz_utility_pub.last_update_login,
3585                     hz_utility_pub.last_update_date,
3586                     hz_utility_pub.user_id,p_dup_batch_id);
3587                 x_num_matches := x_num_matches+1;
3588             END;
3589           END IF;
3590       END IF;
3591       IF l_match_str = ' OR ' THEN
3592         l_party_id:=H_SCORES.NEXT(l_party_id);
3593       ELSE
3594         l_party_id:=H_PARTY_ID_LIST.NEXT(l_party_id);
3595       END IF;
3596     END LOOP;
3597     HZ_DQM_SEARCH_UTIL.set_num_eval(l_num_eval);
3598     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
3599       hz_utility_v2pub.debug(p_message=>'find_persons(-) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
3600     END IF;
3601 EXCEPTION
3602   WHEN L_RETURN_IMM_EXC THEN
3603     RETURN;
3604   WHEN FND_API.G_EXC_ERROR THEN
3605     RAISE FND_API.G_EXC_ERROR;
3606   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3607     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3608   WHEN OTHERS THEN
3609     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
3610     FND_MESSAGE.SET_TOKEN('PROC','HZ_MATCH_RULE_3.find_persons');
3611     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
3612     FND_MSG_PUB.ADD;
3613     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3614 END find_persons;
3615 
3616 PROCEDURE find_persons (
3617       p_rule_id               IN      NUMBER,
3618       p_party_search_rec      IN      HZ_PARTY_SEARCH.party_search_rec_type,
3619       p_party_site_list       IN      HZ_PARTY_SEARCH.party_site_list,
3620       p_contact_list          IN      HZ_PARTY_SEARCH.contact_list,
3621       p_contact_point_list    IN      HZ_PARTY_SEARCH.contact_point_list,
3622       p_restrict_sql          IN      VARCHAR2,
3623       p_match_type            IN      VARCHAR2,
3624       p_search_merged         IN      VARCHAR2,
3625       p_ins_details           IN      VARCHAR2,
3626       x_search_ctx_id         OUT     NUMBER,
3627       x_num_matches           OUT     NUMBER
3628 ) IS
3629 
3630   BEGIN
3631      find_persons(p_rule_id,p_party_search_rec,p_party_site_list,p_contact_list,p_contact_point_list,p_restrict_sql,p_match_type,p_search_merged,null,null,null,p_ins_details,x_search_ctx_id,x_num_matches);
3632   END;
3633 PROCEDURE find_party_details (
3634       p_rule_id               IN      NUMBER,
3635       p_party_search_rec      IN      HZ_PARTY_SEARCH.party_search_rec_type,
3636       p_party_site_list       IN      HZ_PARTY_SEARCH.party_site_list,
3637       p_contact_list          IN      HZ_PARTY_SEARCH.contact_list,
3638       p_contact_point_list    IN      HZ_PARTY_SEARCH.contact_point_list,
3639       p_restrict_sql          IN      VARCHAR2,
3640       p_match_type            IN      VARCHAR2,
3641       p_search_merged         IN      VARCHAR2,
3642       x_search_ctx_id         OUT     NUMBER,
3643       x_num_matches           OUT     NUMBER
3644 ) IS
3645 
3646   BEGIN
3647     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
3648       hz_utility_v2pub.debug(p_message=>'find_party_details(+) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
3649     END IF;
3650     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3651       hz_utility_v2pub.debug(p_message=>'Input Parameters:',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3652       hz_utility_v2pub.debug(p_message=>'p_match_type '||p_match_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3653       hz_utility_v2pub.debug(p_message=>'p_restrict_sql '||p_restrict_sql,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3654       hz_utility_v2pub.debug(p_message=>'p_search_merged '||p_search_merged,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3655     END IF;
3656   find_parties(p_rule_id,p_party_search_rec,p_party_site_list, p_contact_list, p_contact_point_list,
3657                p_restrict_sql,p_match_type,p_search_merged,null,null, null,'Y',
3658                x_search_ctx_id,x_num_matches);
3659   DELETE FROM HZ_MATCHED_PARTY_SITES_GT ps WHERE SEARCH_CONTEXT_ID = x_search_ctx_id 
3660   AND NOT EXISTS 
3661        (SELECT 1 FROM HZ_MATCHED_PARTIES_GT p WHERE SEARCH_CONTEXT_ID = x_search_ctx_id AND p.PARTY_ID = ps.PARTY_ID);
3662   DELETE FROM HZ_MATCHED_CONTACTS_GT ct WHERE SEARCH_CONTEXT_ID = x_search_ctx_id 
3663   AND NOT EXISTS 
3664        (SELECT 1 FROM HZ_MATCHED_PARTIES_GT p WHERE SEARCH_CONTEXT_ID = x_search_ctx_id AND p.PARTY_ID = ct.PARTY_ID);
3665   DELETE FROM HZ_MATCHED_CPTS_GT cpt WHERE SEARCH_CONTEXT_ID = x_search_ctx_id 
3666   AND NOT EXISTS 
3667        (SELECT 1 FROM HZ_MATCHED_PARTIES_GT p WHERE SEARCH_CONTEXT_ID = x_search_ctx_id AND p.PARTY_ID = cpt.PARTY_ID);
3668     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
3669       hz_utility_v2pub.debug(p_message=>'find_party_details(-) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
3670     END IF;
3671 EXCEPTION
3672   WHEN FND_API.G_EXC_ERROR THEN
3673     RAISE FND_API.G_EXC_ERROR;
3674   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3675     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3676   WHEN OTHERS THEN
3677     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
3678     FND_MESSAGE.SET_TOKEN('PROC','HZ_MATCH_RULE_3.find_party_details');
3679     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
3680     FND_MSG_PUB.ADD;
3681     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3682 END find_party_details;
3683 
3684 PROCEDURE find_duplicate_parties (
3685       p_rule_id               IN      NUMBER,
3686       p_party_id              IN      NUMBER,
3687       p_restrict_sql          IN      VARCHAR2,
3688       p_match_type            IN      VARCHAR2,
3689       p_dup_batch_id          IN      NUMBER,
3690       p_search_merged         IN      VARCHAR2,
3691       x_dup_set_id            OUT     NUMBER,
3692       x_search_ctx_id         OUT     NUMBER,
3693       x_num_matches           OUT     NUMBER
3694 ) IS
3695   l_party_rec HZ_PARTY_SEARCH.party_search_rec_type;
3696   l_party_site_list HZ_PARTY_SEARCH.party_site_list;
3697   l_contact_list HZ_PARTY_SEARCH.contact_list;
3698   l_cpt_list HZ_PARTY_SEARCH.contact_point_list;
3699   l_match_idx NUMBER;
3700 
3701   --Fix for bug 4417124
3702   l_use_contact_addr_info BOOLEAN := TRUE;
3703   l_use_contact_cpt_info BOOLEAN  := TRUE;
3704   l_use_contact_addr_flag VARCHAR2(1) := 'Y';
3705   l_use_contact_cpt_flag  VARCHAR2(1) := 'Y';
3706 
3707 BEGIN
3708 
3709     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
3710       hz_utility_v2pub.debug(p_message=>'find_duplicate_parties(+) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
3711     END IF;
3712     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3713       hz_utility_v2pub.debug(p_message=>'Input Parameters:',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3714       hz_utility_v2pub.debug(p_message=>'p_party_id '||p_party_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3715       hz_utility_v2pub.debug(p_message=>'p_match_type '||p_match_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3716       hz_utility_v2pub.debug(p_message=>'p_restrict_sql '||p_restrict_sql,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3717       hz_utility_v2pub.debug(p_message=>'p_dup_batch_id '||p_dup_batch_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3718       hz_utility_v2pub.debug(p_message=>'p_search_merged '||p_search_merged,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3719     END IF;
3720 
3721   --Fix for bug 4417124 
3722 
3723   SELECT use_contact_addr_flag, use_contact_cpt_flag 
3724   INTO l_use_contact_addr_flag, l_use_contact_cpt_flag 
3725   FROM hz_match_rules_b 
3726   WHERE match_rule_id = 3; 
3727 
3728   IF NVL(l_use_contact_addr_flag, 'Y') = 'N' THEN
3729     l_use_contact_addr_info := FALSE; 
3730   END IF; 
3731 
3732   IF NVL(l_use_contact_cpt_flag, 'Y') = 'N' THEN
3733     l_use_contact_cpt_info := FALSE; 
3734   END IF; 
3735 
3736  --End fix for bug 4417124
3737 
3738   get_party_for_search(
3739               p_party_id, l_party_rec,l_party_site_list, l_contact_list, l_cpt_list);
3740 
3741     IF NOT check_prim_cond (l_party_rec,
3742                             l_party_site_list,
3743                             l_contact_list,
3744                             l_cpt_list) THEN
3745       x_dup_set_id:=NULL;
3746       x_search_ctx_id:=NULL;
3747       x_num_matches:=0;
3748       RETURN;
3749     END IF;
3750   x_dup_set_id := NULL;
3751   IF p_dup_batch_id IS NOT NULL THEN
3752     SELECT HZ_MERGE_BATCH_S.nextval INTO x_dup_set_id FROM DUAL;
3753   END IF;
3754 
3755   --Fix for bug 4417124 
3756   IF l_party_rec.PARTY_TYPE = 'PERSON' AND (l_use_contact_addr_info OR l_use_contact_cpt_info) THEN
3757     find_persons(p_rule_id,l_party_rec,l_party_site_list, l_contact_list, l_cpt_list,
3758                p_restrict_sql,p_match_type,p_search_merged,p_party_id,x_dup_set_id,p_dup_batch_id,'N',
3759                x_search_ctx_id,x_num_matches);
3760   ELSE
3761     find_parties(p_rule_id,l_party_rec,l_party_site_list, l_contact_list, l_cpt_list,
3762                p_restrict_sql,p_match_type,p_search_merged,p_party_id,x_dup_set_id,p_dup_batch_id,'N',
3763                x_search_ctx_id,x_num_matches);
3764   END IF;
3765 
3766   IF x_num_matches > 0 AND p_dup_batch_id IS NOT NULL THEN
3767     INSERT INTO HZ_DUP_SETS ( DUP_SET_ID, DUP_BATCH_ID, WINNER_PARTY_ID,
3768       STATUS, MERGE_TYPE, CREATED_BY, CREATION_DATE, LAST_UPDATE_LOGIN,
3769       LAST_UPDATE_DATE, LAST_UPDATED_BY) 
3770     VALUES (x_dup_set_id, p_dup_batch_id, p_party_id, 'SYSBATCH',
3771       'PARTY_MERGE', hz_utility_pub.created_by, hz_utility_pub.creation_date,
3772       hz_utility_pub.last_update_login, hz_utility_pub.last_update_date,
3773       hz_utility_pub.user_id);
3774 
3775     INSERT INTO HZ_DUP_SET_PARTIES (DUP_PARTY_ID,DUP_SET_ID,MERGE_SEQ_ID,
3776       MERGE_BATCH_ID,merge_flag,SCORE,CREATED_BY,CREATION_DATE,LAST_UPDATE_LOGIN,
3777       LAST_UPDATE_DATE,LAST_UPDATED_BY,DUP_SET_BATCH_ID) 
3778     VALUES (p_party_id,x_dup_set_id,0,0,
3779       'Y',100,hz_utility_pub.created_by,hz_utility_pub.creation_date,
3780       hz_utility_pub.last_update_login,hz_utility_pub.last_update_date,
3781       hz_utility_pub.user_id,p_dup_batch_id);
3782   ELSE
3783     x_dup_set_id := NULL;
3784   END IF;
3785     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
3786       hz_utility_v2pub.debug(p_message=>'find_duplicate_parties(-) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
3787     END IF;
3788 EXCEPTION
3789   WHEN FND_API.G_EXC_ERROR THEN
3790     RAISE FND_API.G_EXC_ERROR;
3791   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3792     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3793   WHEN OTHERS THEN
3794     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
3795     FND_MESSAGE.SET_TOKEN('PROC','HZ_MATCH_RULE_3.find_duplicate_parties');
3796     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
3797     FND_MSG_PUB.ADD;
3798     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3799 END find_duplicate_parties;
3800 
3801 PROCEDURE find_duplicate_party_sites (
3802       p_rule_id               IN      NUMBER,
3803       p_party_site_id         IN      NUMBER,
3804       p_party_id              IN      NUMBER,
3805       p_restrict_sql          IN      VARCHAR2,
3806       p_match_type            IN      VARCHAR2,
3807       x_search_ctx_id         OUT     NUMBER,
3808       x_num_matches           OUT     NUMBER
3809 ) IS
3810 
3811    l_party_search_rec HZ_PARTY_SEARCH.party_search_rec_type; 
3812    l_party_site_list HZ_PARTY_SEARCH.party_site_list; 
3813    l_contact_list HZ_PARTY_SEARCH.contact_list; 
3814    l_contact_point_list HZ_PARTY_SEARCH.contact_point_list; 
3815    contact_point_ids HZ_PARTY_SEARCH.IDList; 
3816    p_party_site_list HZ_PARTY_SEARCH.IDList;  
3817    p_contact_ids HZ_PARTY_SEARCH.IDList; 
3818   l_match_idx NUMBER;
3819    cursor get_cpts_for_party_sites is select contact_point_id  
3820                          from hz_contact_points 
3821                          where owner_table_name = 'HZ_PARTY_SITES' 
3822                          and primary_flag='Y'
3823                          and owner_table_id = p_party_site_id; 
3824    BEGIN 
3825     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
3826       hz_utility_v2pub.debug(p_message=>'find_duplicate_party_sites(+) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
3827     END IF;
3828     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3829       hz_utility_v2pub.debug(p_message=>'Input Parameters:',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3830       hz_utility_v2pub.debug(p_message=>'p_party_site_id '||p_party_site_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3831       hz_utility_v2pub.debug(p_message=>'p_party_id '||p_party_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3832       hz_utility_v2pub.debug(p_message=>'p_match_type '||p_match_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3833       hz_utility_v2pub.debug(p_message=>'p_restrict_sql '||p_restrict_sql,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3834     END IF;
3835      p_party_site_list(1) := p_party_site_id; 
3836      OPEN get_cpts_for_party_sites;
3837      LOOP       
3838      FETCH get_cpts_for_party_sites BULK COLLECT INTO contact_point_ids; 
3839          EXIT WHEN get_cpts_for_party_sites%NOTFOUND; 
3840      END LOOP;  
3841      CLOSE get_cpts_for_party_sites; 
3842   
3843      get_search_criteria (
3844          null,
3845          p_party_site_list,
3846          HZ_PARTY_SEARCH.G_MISS_ID_LIST,
3847          contact_point_ids, 
3848          l_party_search_rec,
3849          l_party_site_list,
3850          l_contact_list,
3851          l_contact_point_list) ;
3852     IF NOT check_prim_cond (l_party_search_rec,
3853                             l_party_site_list,
3854                             l_contact_list,
3855                             l_contact_point_list) THEN
3856       x_search_ctx_id:=NULL;
3857       x_num_matches:=0;
3858       RETURN;
3859     END IF;
3860  
3861      get_matching_party_sites (p_rule_id, 
3862          p_party_id, 
3863          l_party_site_list, 
3864          l_contact_point_list,
3865          p_restrict_sql, 
3866          p_match_type, 
3867          p_party_site_id, 
3868          x_search_ctx_id,
3869          x_num_matches);
3870     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
3871       hz_utility_v2pub.debug(p_message=>'find_duplicate_party_sites(-) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
3872     END IF;
3873 EXCEPTION
3874   WHEN FND_API.G_EXC_ERROR THEN
3875     RAISE FND_API.G_EXC_ERROR;
3876   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3877     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3878   WHEN OTHERS THEN
3879     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
3880     FND_MESSAGE.SET_TOKEN('PROC','HZ_MATCH_RULE_3.find_duplicate_party_sites');
3881     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
3882     FND_MSG_PUB.ADD;
3883     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3884 END find_duplicate_party_sites; 
3885  
3886 PROCEDURE find_duplicate_contacts (
3887       p_rule_id               IN      NUMBER,
3888       p_org_contact_id        IN      NUMBER,
3889       p_party_id              IN      NUMBER,
3890       p_restrict_sql          IN      VARCHAR2,
3891       p_match_type            IN      VARCHAR2,
3892       x_search_ctx_id         OUT     NUMBER,
3893       x_num_matches           OUT     NUMBER
3894 ) IS
3895 
3896  l_party_search_rec HZ_PARTY_SEARCH.party_search_rec_type;
3897  l_party_site_list HZ_PARTY_SEARCH.party_site_list; 
3898  l_contact_list HZ_PARTY_SEARCH.contact_list; 
3899  l_contact_point_list HZ_PARTY_SEARCH.contact_point_list; 
3900  contact_point_ids HZ_PARTY_SEARCH.IDList; 
3901  p_party_site_list HZ_PARTY_SEARCH.IDList;   
3902  p_contact_ids HZ_PARTY_SEARCH.IDList; 
3903   l_match_idx NUMBER;
3904  cursor get_cpt_for_contact_id is select  contact_point_id 
3905    from hz_org_contacts a, hz_relationships b, hz_contact_points c 
3906    where a.party_relationship_id = b.relationship_id 
3907      and c.owner_table_name = 'HZ_PARTIES' 
3908      and c.primary_flag='Y'
3909      and c.owner_table_id = b.party_id 
3910      and b.directional_flag = 'F'  
3911      and a.org_contact_id = p_org_contact_id; 
3912 BEGIN 
3913     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
3914       hz_utility_v2pub.debug(p_message=>'find_duplicate_contacts(+) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
3915     END IF;
3916     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3917       hz_utility_v2pub.debug(p_message=>'Input Parameters:',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3918       hz_utility_v2pub.debug(p_message=>'p_org_contact_id '||p_org_contact_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3919       hz_utility_v2pub.debug(p_message=>'p_party_id '||p_party_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3920       hz_utility_v2pub.debug(p_message=>'p_match_type '||p_match_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3921       hz_utility_v2pub.debug(p_message=>'p_restrict_sql '||p_restrict_sql,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3922     END IF;
3923     p_contact_ids(1) := p_org_contact_id; 
3924     OPEN get_cpt_for_contact_id; 
3925     LOOP 
3926     FETCH get_cpt_for_contact_id BULK COLLECT INTO contact_point_ids; 
3927         EXIT WHEN get_cpt_for_contact_id%NOTFOUND; 
3928     END LOOP;  
3929     CLOSE get_cpt_for_contact_id; 
3930  
3931     get_search_criteria (
3932         null,
3933         HZ_PARTY_SEARCH.G_MISS_ID_LIST,
3934         p_contact_ids,
3935         contact_point_ids, 
3936         l_party_search_rec,
3937         l_party_site_list, 
3938         l_contact_list,
3939         l_contact_point_list) ;
3940     IF NOT check_prim_cond (l_party_search_rec,
3941                             l_party_site_list,
3942                             l_contact_list,
3943                             l_contact_point_list) THEN
3944       x_search_ctx_id:=NULL;
3945       x_num_matches:=0;
3946       RETURN;
3947     END IF;
3948  
3949     get_matching_contacts (p_rule_id, 
3950         p_party_id, 
3951         l_contact_list, 
3952         l_contact_point_list, 
3953         p_restrict_sql, 
3954         p_match_type, 
3955         p_org_contact_id, 
3956         x_search_ctx_id, 
3957         x_num_matches);
3958  
3959     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
3960       hz_utility_v2pub.debug(p_message=>'find_duplicate_contacts(-) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
3961     END IF;
3962 EXCEPTION
3963   WHEN FND_API.G_EXC_ERROR THEN
3964     RAISE FND_API.G_EXC_ERROR;
3965   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3966     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3967   WHEN OTHERS THEN
3968     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
3969     FND_MESSAGE.SET_TOKEN('PROC','HZ_MATCH_RULE_3.find_duplicate_contacts');
3970     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
3971     FND_MSG_PUB.ADD;
3972     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3973 END find_duplicate_contacts; 
3974 
3975 PROCEDURE find_duplicate_contact_points (
3976       p_rule_id               IN      NUMBER,
3977       p_contact_point_id      IN      NUMBER,
3978       p_party_id              IN      NUMBER,
3979       p_restrict_sql          IN      VARCHAR2,
3980       p_match_type            IN      VARCHAR2,
3981       x_search_ctx_id         OUT     NUMBER,
3982       x_num_matches           OUT     NUMBER
3983 ) IS
3984  l_party_search_rec HZ_PARTY_SEARCH.party_search_rec_type; 
3985   l_party_site_list HZ_PARTY_SEARCH.party_site_list; 
3986    l_contact_list HZ_PARTY_SEARCH.contact_list;  
3987    l_contact_point_list HZ_PARTY_SEARCH.contact_point_list;  
3988    contact_point_ids HZ_PARTY_SEARCH.IDList;  
3989   p_party_site_list HZ_PARTY_SEARCH.IDList;   
3990   p_contact_ids HZ_PARTY_SEARCH.IDList;  
3991   l_match_idx NUMBER;
3992 
3993 BEGIN
3994     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
3995       hz_utility_v2pub.debug(p_message=>'find_duplicate_contact_points(+) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
3996     END IF;
3997     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
3998       hz_utility_v2pub.debug(p_message=>'Input Parameters:',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
3999       hz_utility_v2pub.debug(p_message=>'p_contact_point_id '||p_contact_point_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4000       hz_utility_v2pub.debug(p_message=>'p_party_id '||p_party_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4001       hz_utility_v2pub.debug(p_message=>'p_match_type '||p_match_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4002       hz_utility_v2pub.debug(p_message=>'p_restrict_sql '||p_restrict_sql,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4003     END IF;
4004   contact_point_ids(1) := p_contact_point_id;   
4005   get_search_criteria (   
4006       null, 
4007       HZ_PARTY_SEARCH.G_MISS_ID_LIST, 
4008       HZ_PARTY_SEARCH.G_MISS_ID_LIST, 
4009       contact_point_ids,   
4010       l_party_search_rec, 
4011       l_party_site_list, 
4012       l_contact_list, 
4013       l_contact_point_list ); 
4014     
4015     IF NOT check_prim_cond (l_party_search_rec,
4016                             l_party_site_list,
4017                             l_contact_list,
4018                             l_contact_point_list) THEN
4019       x_search_ctx_id:=NULL;
4020       x_num_matches:=0;
4021       RETURN;
4022     END IF;
4023    get_matching_contact_points ( 
4024       p_rule_id, 
4025       p_party_id, 
4026      l_contact_point_list, 
4027       p_restrict_sql, 
4028       p_match_type, 
4029       p_contact_point_id, 
4030       x_search_ctx_id, 
4031       x_num_matches );  
4032     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
4033       hz_utility_v2pub.debug(p_message=>'find_duplicate_contact_points(-) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
4034     END IF;
4035 EXCEPTION
4036   WHEN FND_API.G_EXC_ERROR THEN
4037     RAISE FND_API.G_EXC_ERROR;
4038   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4039     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4040   WHEN OTHERS THEN
4041     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
4042     FND_MESSAGE.SET_TOKEN('PROC','HZ_MATCH_RULE_3.find_duplicate_contact_points');
4043     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
4044     FND_MSG_PUB.ADD;
4045     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4046 END find_duplicate_contact_points;
4047 
4048 PROCEDURE find_parties_dynamic (
4049         p_rule_id               IN      NUMBER,
4050         p_attrib_id1            IN      NUMBER,
4051         p_attrib_id2            IN      NUMBER,
4052         p_attrib_id3            IN      NUMBER,
4053         p_attrib_id4            IN      NUMBER,
4054         p_attrib_id5            IN      NUMBER,
4055         p_attrib_id6            IN      NUMBER,
4056         p_attrib_id7            IN      NUMBER,
4057         p_attrib_id8            IN      NUMBER,
4058         p_attrib_id9            IN      NUMBER,
4059         p_attrib_id10           IN      NUMBER,
4060         p_attrib_id11           IN      NUMBER,
4061         p_attrib_id12           IN      NUMBER,
4062         p_attrib_id13           IN      NUMBER,
4063         p_attrib_id14           IN      NUMBER,
4064         p_attrib_id15           IN      NUMBER,
4065         p_attrib_id16           IN      NUMBER,
4066         p_attrib_id17           IN      NUMBER,
4067         p_attrib_id18           IN      NUMBER,
4068         p_attrib_id19           IN      NUMBER,
4069         p_attrib_id20           IN      NUMBER,
4070         p_attrib_val1           IN      VARCHAR2,
4071         p_attrib_val2           IN      VARCHAR2,
4072         p_attrib_val3           IN      VARCHAR2,
4073         p_attrib_val4           IN      VARCHAR2,
4074         p_attrib_val5           IN      VARCHAR2,
4075         p_attrib_val6           IN      VARCHAR2,
4076         p_attrib_val7           IN      VARCHAR2,
4077         p_attrib_val8           IN      VARCHAR2,
4078         p_attrib_val9           IN      VARCHAR2,
4079         p_attrib_val10          IN      VARCHAR2,
4080         p_attrib_val11          IN      VARCHAR2,
4081         p_attrib_val12          IN      VARCHAR2,
4082         p_attrib_val13          IN      VARCHAR2,
4083         p_attrib_val14          IN      VARCHAR2,
4084         p_attrib_val15          IN      VARCHAR2,
4085         p_attrib_val16          IN      VARCHAR2,
4086         p_attrib_val17          IN      VARCHAR2,
4087         p_attrib_val18          IN      VARCHAR2,
4088         p_attrib_val19          IN      VARCHAR2,
4089         p_attrib_val20          IN      VARCHAR2,
4090         p_restrict_sql          IN      VARCHAR2,
4091         p_match_type            IN      VARCHAR2,
4092         p_search_merged         IN      VARCHAR2,
4093         x_search_ctx_id         OUT     NUMBER,
4094         x_num_matches           OUT     NUMBER
4095 ) IS
4096   BEGIN
4097     call_api_dynamic(p_rule_id,p_attrib_id1, p_attrib_id2,p_attrib_id3,p_attrib_id4,p_attrib_id5,
4098                      p_attrib_id6,p_attrib_id7,p_attrib_id8,p_attrib_id9,p_attrib_id10,
4099                      p_attrib_id11,p_attrib_id12,p_attrib_id13,p_attrib_id14,p_attrib_id15,
4100                      p_attrib_id16,p_attrib_id17,p_attrib_id18,p_attrib_id19,p_attrib_id20,
4101                      p_attrib_val1,p_attrib_val2,p_attrib_val3,p_attrib_val4,p_attrib_val5,
4102                      p_attrib_val6,p_attrib_val7,p_attrib_val8,p_attrib_val9,p_attrib_val10,
4103                      p_attrib_val11,p_attrib_val12,p_attrib_val13,p_attrib_val14,p_attrib_val15,
4104                      p_attrib_val16,p_attrib_val17,p_attrib_val18,p_attrib_val19,p_attrib_val20,
4105                      p_restrict_sql,'FIND_PARTIES',p_match_type,null,p_search_merged,x_search_ctx_id,x_num_matches);
4106  END;
4107 
4108 PROCEDURE call_api_dynamic (
4109         p_rule_id               IN      NUMBER,
4110         p_attrib_id1            IN      NUMBER,
4111         p_attrib_id2            IN      NUMBER,
4112         p_attrib_id3            IN      NUMBER,
4113         p_attrib_id4            IN      NUMBER,
4114         p_attrib_id5            IN      NUMBER,
4115         p_attrib_id6            IN      NUMBER,
4116         p_attrib_id7            IN      NUMBER,
4117         p_attrib_id8            IN      NUMBER,
4118         p_attrib_id9            IN      NUMBER,
4119         p_attrib_id10           IN      NUMBER,
4120         p_attrib_id11           IN      NUMBER,
4121         p_attrib_id12           IN      NUMBER,
4122         p_attrib_id13           IN      NUMBER,
4123         p_attrib_id14           IN      NUMBER,
4124         p_attrib_id15           IN      NUMBER,
4125         p_attrib_id16           IN      NUMBER,
4126         p_attrib_id17           IN      NUMBER,
4127         p_attrib_id18           IN      NUMBER,
4128         p_attrib_id19           IN      NUMBER,
4129         p_attrib_id20           IN      NUMBER,
4130         p_attrib_val1           IN      VARCHAR2,
4131         p_attrib_val2           IN      VARCHAR2,
4132         p_attrib_val3           IN      VARCHAR2,
4133         p_attrib_val4           IN      VARCHAR2,
4134         p_attrib_val5           IN      VARCHAR2,
4135         p_attrib_val6           IN      VARCHAR2,
4136         p_attrib_val7           IN      VARCHAR2,
4137         p_attrib_val8           IN      VARCHAR2,
4138         p_attrib_val9           IN      VARCHAR2,
4139         p_attrib_val10          IN      VARCHAR2,
4140         p_attrib_val11          IN      VARCHAR2,
4141         p_attrib_val12          IN      VARCHAR2,
4142         p_attrib_val13          IN      VARCHAR2,
4143         p_attrib_val14          IN      VARCHAR2,
4144         p_attrib_val15          IN      VARCHAR2,
4145         p_attrib_val16          IN      VARCHAR2,
4146         p_attrib_val17          IN      VARCHAR2,
4147         p_attrib_val18          IN      VARCHAR2,
4148         p_attrib_val19          IN      VARCHAR2,
4149         p_attrib_val20          IN      VARCHAR2,
4150         p_restrict_sql          IN      VARCHAR2,
4151         p_api_name              IN      VARCHAR2,
4152         p_match_type            IN      VARCHAR2,
4153         p_party_id              IN      NUMBER,
4154         p_search_merged         IN      VARCHAR2,
4155         x_search_ctx_id         OUT     NUMBER,
4156         x_num_matches           OUT     NUMBER
4157 ) IS
4158   TYPE AttrList IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
4159   l_match_idx NUMBER;
4160   AttrVals AttrList;
4161   l_party_rec HZ_PARTY_SEARCH.party_search_rec_type;
4162   l_party_site_list HZ_PARTY_SEARCH.party_site_list;
4163   l_contact_list HZ_PARTY_SEARCH.contact_list;
4164   l_cpt_list HZ_PARTY_SEARCH.contact_point_list;
4165   l_dup_set_id NUMBER;
4166   l_idx NUMBER;
4167   l_cpt_type VARCHAR2(255);
4168   FIRST BOOLEAN := TRUE; 
4169 
4170 BEGIN
4171     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
4172       hz_utility_v2pub.debug(p_message=>'call_api_dynamic(+) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
4173     END IF;
4174 
4175   IF p_attrib_id1 IS NOT NULL THEN
4176     AttrVals(p_attrib_id1):=p_attrib_val1;
4177   END IF;
4178   IF p_attrib_id2 IS NOT NULL THEN
4179     AttrVals(p_attrib_id2):=p_attrib_val2;
4180   END IF;
4181   IF p_attrib_id3 IS NOT NULL THEN
4182     AttrVals(p_attrib_id3):=p_attrib_val3;
4183   END IF;
4184   IF p_attrib_id4 IS NOT NULL THEN
4185     AttrVals(p_attrib_id4):=p_attrib_val4;
4186   END IF;
4187   IF p_attrib_id5 IS NOT NULL THEN
4188     AttrVals(p_attrib_id5):=p_attrib_val5;
4189   END IF;
4190   IF p_attrib_id6 IS NOT NULL THEN
4191     AttrVals(p_attrib_id6):=p_attrib_val6;
4192   END IF;
4193   IF p_attrib_id7 IS NOT NULL THEN
4194     AttrVals(p_attrib_id7):=p_attrib_val7;
4195   END IF;
4196   IF p_attrib_id8 IS NOT NULL THEN
4197     AttrVals(p_attrib_id8):=p_attrib_val8;
4198   END IF;
4199   IF p_attrib_id9 IS NOT NULL THEN
4200     AttrVals(p_attrib_id9):=p_attrib_val9;
4201   END IF;
4202   IF p_attrib_id10 IS NOT NULL THEN
4203     AttrVals(p_attrib_id10):=p_attrib_val10;
4204   END IF;
4205   IF p_attrib_id11 IS NOT NULL THEN
4206     AttrVals(p_attrib_id11):=p_attrib_val11;
4207   END IF;
4208   IF p_attrib_id12 IS NOT NULL THEN
4209     AttrVals(p_attrib_id12):=p_attrib_val12;
4210   END IF;
4211   IF p_attrib_id13 IS NOT NULL THEN
4212     AttrVals(p_attrib_id13):=p_attrib_val13;
4213   END IF;
4214   IF p_attrib_id14 IS NOT NULL THEN
4215     AttrVals(p_attrib_id14):=p_attrib_val14;
4216   END IF;
4217   IF p_attrib_id15 IS NOT NULL THEN
4218     AttrVals(p_attrib_id15):=p_attrib_val15;
4219   END IF;
4220   IF p_attrib_id16 IS NOT NULL THEN
4221     AttrVals(p_attrib_id16):=p_attrib_val16;
4222   END IF;
4223   IF p_attrib_id17 IS NOT NULL THEN
4224     AttrVals(p_attrib_id17):=p_attrib_val17;
4225   END IF;
4226   IF p_attrib_id18 IS NOT NULL THEN
4227     AttrVals(p_attrib_id18):=p_attrib_val18;
4228   END IF;
4229   IF p_attrib_id19 IS NOT NULL THEN
4230     AttrVals(p_attrib_id19):=p_attrib_val19;
4231   END IF;
4232   IF p_attrib_id20 IS NOT NULL THEN
4233     AttrVals(p_attrib_id20):=p_attrib_val20;
4234   END IF;
4235   IF AttrVals.EXISTS(14) THEN
4236     l_party_rec.PARTY_TYPE:= AttrVals(14);
4237     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4238       hz_utility_v2pub.debug(p_message=>'l_party_rec.PARTY_TYPE '||AttrVals(14),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4239     END IF;
4240   END IF;
4241 
4242   IF AttrVals.EXISTS(18) THEN
4243     l_party_rec.TAX_REFERENCE:= AttrVals(18);
4244     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4245       hz_utility_v2pub.debug(p_message=>'l_party_rec.TAX_REFERENCE '||AttrVals(18),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4246     END IF;
4247   END IF;
4248 
4249   IF AttrVals.EXISTS(44) THEN
4250     l_cpt_type := 'PHONE';
4251     FIRST := FALSE;
4252     FOR I in 1..l_cpt_list.COUNT LOOP
4253       IF l_cpt_list(I).CONTACT_POINT_TYPE=l_cpt_type THEN
4254         l_cpt_list(I).FLEX_FORMAT_PHONE_NUMBER:= AttrVals(44);
4255         FIRST := TRUE;
4256     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4257       hz_utility_v2pub.debug(p_message=>'l_cpt_list('||I||').CONTACT_POINT_TYPE '||l_cpt_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4258       hz_utility_v2pub.debug(p_message=>'l_cpt_list('||I||').FLEX_FORMAT_PHONE_NUMBER '||AttrVals(44),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4259     END IF;
4260       END IF;
4261     END LOOP;
4262     IF not FIRST THEN
4263       l_idx := l_cpt_list.COUNT+1;
4264       l_cpt_list(l_idx).CONTACT_POINT_TYPE:=l_cpt_type;
4265       l_cpt_list(l_idx).FLEX_FORMAT_PHONE_NUMBER:= AttrVals(44);
4266     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4267       hz_utility_v2pub.debug(p_message=>'l_cpt_list('||l_idx||').CONTACT_POINT_TYPE '||l_cpt_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4268       hz_utility_v2pub.debug(p_message=>'l_cpt_list('||l_idx||').FLEX_FORMAT_PHONE_NUMBER '||AttrVals(44),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4269     END IF;
4270     END IF;
4271   END IF;
4272 
4273   IF AttrVals.EXISTS(48) THEN
4274     l_cpt_type := 'EMAIL';
4275     FIRST := FALSE;
4276     FOR I in 1..l_cpt_list.COUNT LOOP
4277       IF l_cpt_list(I).CONTACT_POINT_TYPE=l_cpt_type THEN
4278         l_cpt_list(I).EMAIL_ADDRESS:= AttrVals(48);
4279         FIRST := TRUE;
4280     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4281       hz_utility_v2pub.debug(p_message=>'l_cpt_list('||I||').CONTACT_POINT_TYPE '||l_cpt_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4282       hz_utility_v2pub.debug(p_message=>'l_cpt_list('||I||').EMAIL_ADDRESS '||AttrVals(48),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4283     END IF;
4284       END IF;
4285     END LOOP;
4286     IF not FIRST THEN
4287       l_idx := l_cpt_list.COUNT+1;
4288       l_cpt_list(l_idx).CONTACT_POINT_TYPE:=l_cpt_type;
4289       l_cpt_list(l_idx).EMAIL_ADDRESS:= AttrVals(48);
4290     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4291       hz_utility_v2pub.debug(p_message=>'l_cpt_list('||l_idx||').CONTACT_POINT_TYPE '||l_cpt_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4292       hz_utility_v2pub.debug(p_message=>'l_cpt_list('||l_idx||').EMAIL_ADDRESS '||AttrVals(48),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4293     END IF;
4294     END IF;
4295   END IF;
4296 
4297 
4298   IF AttrVals.EXISTS(14) THEN
4299      l_party_rec.PARTY_TYPE:= AttrVals(14); 
4300   END IF; 
4301   IF upper(p_api_name) = 'FIND_PARTIES' THEN
4302     find_parties(p_rule_id,l_party_rec,l_party_site_list, l_contact_list, l_cpt_list,
4303                p_restrict_sql,p_match_type,p_search_merged,NULL,NULL,NULL,'N',
4304                x_search_ctx_id,x_num_matches);
4305   ELSIF upper(p_api_name) = 'FIND_PARTY_DETAILS' THEN
4306     find_party_details(p_rule_id,l_party_rec,l_party_site_list, l_contact_list, l_cpt_list,
4307                p_restrict_sql,p_match_type,p_search_merged,
4308                x_search_ctx_id,x_num_matches);
4309   ELSIF upper(p_api_name) = 'FIND_PERSONS' THEN
4310     find_persons(p_rule_id,l_party_rec,l_party_site_list, l_contact_list, l_cpt_list,
4311                p_restrict_sql,p_match_type,p_search_merged,'N',
4312                x_search_ctx_id,x_num_matches);
4313   ELSIF upper(p_api_name) = 'GET_MATCHING_PARTY_SITES' THEN
4314     get_matching_party_sites(p_rule_id,p_party_id,l_party_site_list, l_cpt_list,
4315                p_restrict_sql,p_match_type,NULL,
4316                x_search_ctx_id,x_num_matches);
4317   ELSIF upper(p_api_name) = 'GET_MATCHING_CONTACTS' THEN
4318     get_matching_contacts(p_rule_id,p_party_id,l_contact_list, l_cpt_list,
4319                p_restrict_sql,p_match_type,NULL,
4320                x_search_ctx_id,x_num_matches);
4321   ELSIF upper(p_api_name) = 'GET_MATCHING_CONTACT_POINTS' THEN
4322     get_matching_contact_points(p_rule_id,p_party_id, l_cpt_list,
4323                p_restrict_sql,p_match_type,NULL,
4324                x_search_ctx_id,x_num_matches);
4325   END IF;
4326     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
4327       hz_utility_v2pub.debug(p_message=>'call_api_dynamic(-) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
4328     END IF;
4329 EXCEPTION
4330   WHEN FND_API.G_EXC_ERROR THEN
4331     RAISE FND_API.G_EXC_ERROR;
4332   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4333     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4334   WHEN OTHERS THEN
4335     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
4336     FND_MESSAGE.SET_TOKEN('PROC','HZ_MATCH_RULE_3.call_api_dynamic');
4337     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
4338     FND_MSG_PUB.ADD;
4339     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4340 END call_api_dynamic; 
4341 
4342 
4343 PROCEDURE get_matching_party_sites (
4344         p_rule_id               IN      NUMBER,
4345         p_party_id              IN      NUMBER,
4346         p_party_site_list       IN      HZ_PARTY_SEARCH.PARTY_SITE_LIST,
4347         p_contact_point_list    IN      HZ_PARTY_SEARCH.CONTACT_POINT_LIST,
4348         p_restrict_sql          IN      VARCHAR2,
4349         p_match_type            IN      VARCHAR2,
4350         p_dup_party_site_id     IN      NUMBER, 
4351         x_search_ctx_id         OUT     NUMBER,
4352         x_num_matches           OUT     NUMBER
4353 ) IS
4354   
4355   -- Strings to hold the generated Intermedia query strings
4356   l_party_contains_str VARCHAR2(32000); 
4357   l_match_idx NUMBER;
4358   l_party_site_contains_str VARCHAR2(32000);
4359   l_contact_contains_str VARCHAR2(32000);
4360   l_contact_pt_contains_str VARCHAR2(32000);
4361   l_tmp VARCHAR2(32000);
4362 
4363   -- Other local variables
4364   l_match_str VARCHAR2(30); -- Match type (AND or OR)
4365   l_sqlstr VARCHAR2(32000); -- Dynamic SQL String
4366   -- For Score calculation
4367   l_max_score NUMBER;
4368   l_entered_max_score NUMBER;
4369   FIRST BOOLEAN;
4370   l_search_ctx_id NUMBER; -- Generated Search Context ID
4371 
4372   l_TX1 VARCHAR2(2000);
4373   l_TX5 VARCHAR2(2000);
4374   l_TX6 VARCHAR2(2000);
4375   H_SCORES HZ_PARTY_SEARCH.score_list;
4376 
4377   l_score NUMBER;
4378   l_idx NUMBER;
4379   l_party_cur HZ_PARTY_STAGE.StageCurTyp;
4380   l_party_site_cur HZ_PARTY_STAGE.StageCurTyp;
4381   l_contact_cur HZ_PARTY_STAGE.StageCurTyp;
4382   l_contact_pt_cur HZ_PARTY_STAGE.StageCurTyp;
4383   l_party_id NUMBER;
4384   l_ps_party_id NUMBER;
4385   l_ct_party_id NUMBER;
4386   l_cpt_party_id NUMBER;
4387   l_cpt_ps_id NUMBER;
4388   l_cpt_contact_id NUMBER;
4389   l_cpt_type VARCHAR2(100);
4390   l_cpt_level VARCHAR2(100);
4391   l_party_site_id NUMBER;
4392   l_org_contact_id NUMBER;
4393   l_contact_pt_id NUMBER;
4394   l_cpt_level VARCHAR2(100);
4395   l_ps_contact_id NUMBER;
4396   l_party_max_score NUMBER;
4397   l_ps_max_score NUMBER;
4398   l_contact_max_score NUMBER;
4399   l_cpt_max_score NUMBER;
4400 
4401   defpt NUMBER :=0;
4402   defps NUMBER :=0;
4403   defct NUMBER :=0;
4404   defcpt NUMBER :=0;
4405   l_index NUMBER;
4406   l_match_ps_list HZ_PARTY_SEARCH.IDList;
4407   l_cnt NUMBER:=1;
4408 
4409   
4410   BEGIN
4411     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
4412       hz_utility_v2pub.debug(p_message=>'get_matching_party_sites(+) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
4413     END IF;
4414     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4415       hz_utility_v2pub.debug(p_message=>'Input Parameters:',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4416       hz_utility_v2pub.debug(p_message=>'p_match_type '||p_match_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4417       hz_utility_v2pub.debug(p_message=>'p_restrict_sql '||p_restrict_sql,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4418       hz_utility_v2pub.debug(p_message=>'p_dup_party_site_id '||p_dup_party_site_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4419     END IF;
4420 
4421     -- ************************************
4422     -- STEP 1. Initialization and error checks
4423 
4424     l_match_str := ' AND ';
4425     IF p_match_type = 'AND' THEN
4426       l_match_str := ' AND ';
4427     ELSIF p_match_type = 'OR' THEN
4428       l_match_str := ' OR ';
4429     END IF;
4430     l_entered_max_score:= init_search( HZ_PARTY_SEARCH.G_MISS_PARTY_SEARCH_REC, p_party_site_list, HZ_PARTY_SEARCH.G_MISS_CONTACT_LIST, p_contact_point_list,l_match_str, l_party_max_score, l_ps_max_score, l_contact_max_score, l_cpt_max_score);
4431     g_score_until_thresh := false;
4432     IF l_entered_max_score = 0 THEN l_entered_max_score:=1; END IF;
4433 
4434     -- ************************************************************
4435     -- STEP 2. Setup of intermedia query strings for Acquisition query
4436     l_party_site_contains_str := INIT_PARTY_SITES_QUERY(l_match_str,l_tmp);
4437     l_contact_pt_contains_str := INIT_CONTACT_POINTS_QUERY(l_match_str,l_tmp);
4438     init_score_context(HZ_PARTY_SEARCH.G_MISS_PARTY_SEARCH_REC,p_party_site_list,HZ_PARTY_SEARCH.G_MISS_CONTACT_LIST,p_contact_point_list);
4439 
4440     -- Setup Search Context ID
4441     SELECT hz_search_ctx_s.nextval INTO l_search_ctx_id FROM dual;
4442     x_search_ctx_id := l_search_ctx_id;
4443 
4444     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4445       hz_utility_v2pub.debug(p_message=>'l_match_str '||l_match_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4446       hz_utility_v2pub.debug(p_message=>'l_party_site_contains_str '||l_party_site_contains_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4447       hz_utility_v2pub.debug(p_message=>'l_contact_pt_contains_str '||l_contact_pt_contains_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4448       hz_utility_v2pub.debug(p_message=>'l_search_ctx_id '||l_search_ctx_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4449     END IF;
4450     IF l_party_site_contains_str IS NULL THEN
4451       defps := 1;
4452     END IF;
4453     IF l_contact_pt_contains_str IS NULL THEN
4454       defcpt := 1;
4455     END IF;
4456 
4457     IF l_party_site_contains_str IS NOT NULL THEN
4458       open_party_site_cursor(NULL, P_PARTY_ID, p_restrict_sql, l_party_site_contains_str,NULL, null,'N', 'N',l_party_site_cur);
4459       LOOP
4460         FETCH l_party_site_cur INTO 
4461             l_party_site_id, l_ps_party_id, l_ps_contact_id ;
4462         EXIT WHEN l_party_site_cur%NOTFOUND;
4463       IF (p_dup_party_site_id IS NULL OR (
4464                 p_dup_party_site_id IS NOT NULL AND l_ps_contact_id IS NULL AND 
4465                 l_party_site_id <> p_dup_party_site_id)) THEN  
4466             l_index := map_id(l_party_site_id);
4467             l_match_ps_list(l_cnt):= l_party_site_id ;
4468             l_cnt:=l_cnt+1;
4469             l_score := GET_PARTY_SITES_SCORE(l_match_idx);
4470             H_SCORES(l_index) := get_new_score_rec(l_score,defpt,l_score,defct,defcpt, l_ps_party_id, l_party_site_id, null,null);
4471     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4472       hz_utility_v2pub.debug(p_message=>'Party Site Level Matches',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4473       hz_utility_v2pub.debug(p_message=>'l_party_site_id '||l_party_site_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4474       hz_utility_v2pub.debug(p_message=>'l_score '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4475     END IF;
4476       END IF; 
4477       END LOOP;
4478       CLOSE l_party_site_cur;
4479     END IF;
4480 
4481     IF l_contact_pt_contains_str IS NOT NULL THEN
4482     SAVEPOINT eval_start;
4483     IF l_match_str = ' AND ' OR (
4484         ((l_cpt_max_score/l_entered_max_score)<(15/60))
4485         ) THEN
4486       FORALL I in 1..l_match_ps_list.COUNT
4487            INSERT INTO HZ_DQM_PARTIES_GT (search_context_id, party_id)
4488            values (l_search_ctx_id,l_match_ps_list(I));
4489         open_contact_pt_cursor(NULL, P_PARTY_ID, p_restrict_sql, l_contact_pt_contains_str,NULL, null,'N', 'N',l_contact_pt_cur,'PARTY_SITES');
4490     ELSE
4491       open_contact_pt_cursor(NULL, P_PARTY_ID, p_restrict_sql, l_contact_pt_contains_str,NULL, null,'N', 'N',l_contact_pt_cur);
4492     END IF;
4493       LOOP
4494         FETCH l_contact_pt_cur INTO 
4495             l_contact_pt_id, l_cpt_type, l_cpt_party_id, l_cpt_ps_id, l_cpt_contact_id , l_TX1, l_TX6, l_TX5;
4496         EXIT WHEN l_contact_pt_cur%NOTFOUND;
4497       IF (l_cpt_ps_id IS NOT NULL AND (p_dup_party_site_id IS NULL OR (
4498          p_dup_party_site_id IS NOT NULL AND l_cpt_contact_id IS NULL AND p_dup_party_site_id <> l_cpt_ps_id))) THEN   
4499         l_index := map_id(l_cpt_ps_id);
4500         IF l_match_str = ' OR ' THEN
4501           l_score := GET_CONTACT_POINTS_SCORE(l_match_idx,l_TX1,l_TX6,l_TX5);
4502           IF NOT H_SCORES.EXISTS(l_index) THEN
4503             H_SCORES(l_index) := get_new_score_rec(l_score,defpt,defps,defct,l_score,l_cpt_party_id,l_cpt_ps_id,l_cpt_contact_id,l_contact_pt_id);
4504           ELSE
4505             IF l_score > H_SCORES(l_index).CONTACT_POINT_SCORE THEN
4506                H_SCORES(l_index).TOTAL_SCORE := 
4507                       H_SCORES(l_index).TOTAL_SCORE-H_SCORES(l_index).CONTACT_POINT_SCORE+l_score;
4508                H_SCORES(l_index).CONTACT_POINT_SCORE := l_score;
4509             END IF;
4510           END IF;
4511         ELSE
4512           IF H_SCORES.EXISTS(l_index) THEN
4513             l_score := GET_CONTACT_POINTS_SCORE(l_match_idx,l_TX1,l_TX6,l_TX5);
4514             IF l_score > H_SCORES(l_index).CONTACT_POINT_SCORE THEN
4515                H_SCORES(l_index).TOTAL_SCORE := 
4516                       H_SCORES(l_index).TOTAL_SCORE-H_SCORES(l_index).CONTACT_POINT_SCORE+l_score;
4517                H_SCORES(l_index).CONTACT_POINT_SCORE := l_score;
4518             END IF;
4519           ELSIF defps=1 THEN
4520             l_score := GET_CONTACT_POINTS_SCORE(l_match_idx,l_TX1,l_TX6,l_TX5);
4521             H_SCORES(l_index) := get_new_score_rec(l_score,defpt,defps,defct,l_score,l_cpt_party_id,l_cpt_ps_id,l_cpt_contact_id,l_contact_pt_id);
4522           END IF;
4523         END IF;
4524       END IF; 
4525     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4526       hz_utility_v2pub.debug(p_message=>'Contact_point Level Matches',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4527       hz_utility_v2pub.debug(p_message=>'l_party_site_id '||l_cpt_ps_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4528       hz_utility_v2pub.debug(p_message=>'l_score '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4529     END IF;
4530       END LOOP;
4531       CLOSE l_contact_pt_cur;
4532     ROLLBACK TO eval_start;
4533     END IF;
4534     x_num_matches := 0;
4535     l_party_site_id := H_SCORES.FIRST;
4536     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4537       hz_utility_v2pub.debug(p_message=>'Evaluating Matches. Threshold : 25 ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4538     END IF;
4539     WHILE l_party_site_id IS NOT NULL LOOP
4540     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4541       hz_utility_v2pub.debug(p_message=>'Match Party Site ID '||H_SCORES(l_party_site_id).PARTY_SITE_ID,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4542       hz_utility_v2pub.debug(p_message=>'Score '||round((H_SCORES(l_party_site_id).TOTAL_SCORE/l_entered_max_score)*100),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4543     END IF;
4544  IF l_match_str = ' OR ' THEN
4545 IF (H_SCORES(l_party_site_id).TOTAL_SCORE)>=( ROUND((0/60) * 15) ) THEN
4546     INSERT INTO HZ_MATCHED_PARTY_SITES_GT (SEARCH_CONTEXT_ID, PARTY_ID, PARTY_SITE_ID, SCORE) 
4547     VALUES (l_search_ctx_id,H_SCORES(l_party_site_id).PARTY_ID, H_SCORES(l_party_site_id).PARTY_SITE_ID, (H_SCORES(l_party_site_id).TOTAL_SCORE/l_entered_max_score)*100);
4548       x_num_matches := x_num_matches+1;
4549  END IF;
4550  ELSE
4551     IF H_SCORES(l_party_site_id).PARTY_SITE_SCORE>0 AND
4552        H_SCORES(l_party_site_id).CONTACT_POINT_SCORE>0 AND
4553        (H_SCORES(l_party_site_id).TOTAL_SCORE)>=(ROUND((0/60) * 15)) THEN
4554       INSERT INTO HZ_MATCHED_PARTY_SITES_GT (SEARCH_CONTEXT_ID, PARTY_ID, PARTY_SITE_ID, SCORE) 
4555       VALUES (l_search_ctx_id,H_SCORES(l_party_site_id).PARTY_ID, H_SCORES(l_party_site_id).PARTY_SITE_ID, round((H_SCORES(l_party_site_id).TOTAL_SCORE/l_entered_max_score)*100));
4556        x_num_matches := x_num_matches+1;
4557       END IF;
4558  END IF;
4559       l_party_site_id:=H_SCORES.NEXT(l_party_site_id);
4560     END LOOP;
4561     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
4562       hz_utility_v2pub.debug(p_message=>'get_matching_party_sites(-) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
4563     END IF;
4564 EXCEPTION
4565   WHEN FND_API.G_EXC_ERROR THEN
4566     RAISE FND_API.G_EXC_ERROR;
4567   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4568     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4569   WHEN OTHERS THEN
4570     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
4571     FND_MESSAGE.SET_TOKEN('PROC','HZ_MATCH_RULE_3.get_matching_party_sites');
4572     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
4573     FND_MSG_PUB.ADD;
4574     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4575 END get_matching_party_sites;
4576 
4577 
4578 PROCEDURE get_matching_contacts (
4579         p_rule_id               IN      NUMBER,
4580         p_party_id              IN      NUMBER,
4581         p_contact_list          IN      HZ_PARTY_SEARCH.CONTACT_LIST,
4582         p_contact_point_list    IN      HZ_PARTY_SEARCH.CONTACT_POINT_LIST,
4583         p_restrict_sql          IN      VARCHAR2,
4584         p_match_type            IN      VARCHAR2,
4585         p_dup_contact_id        IN      NUMBER, 
4586         x_search_ctx_id         OUT     NUMBER,
4587         x_num_matches           OUT     NUMBER
4588 ) IS
4589   
4590   -- Strings to hold the generated Intermedia query strings
4591   l_party_contains_str VARCHAR2(32000); 
4592   l_party_site_contains_str VARCHAR2(32000);
4593   l_contact_contains_str VARCHAR2(32000);
4594   l_contact_pt_contains_str VARCHAR2(32000);
4595   l_tmp VARCHAR2(32000);
4596 
4597   -- Other local variables
4598   l_match_str VARCHAR2(30); -- Match type (AND or OR)
4599   l_match_idx NUMBER;
4600   l_sqlstr VARCHAR2(32000); -- Dynamic SQL String
4601   -- For Score calculation
4602   l_max_score NUMBER;
4603   l_entered_max_score NUMBER;
4604   FIRST BOOLEAN;
4605   l_search_ctx_id NUMBER; -- Generated Search Context ID
4606 
4607   l_TX1 VARCHAR2(2000);
4608   l_TX5 VARCHAR2(2000);
4609   l_TX6 VARCHAR2(2000);
4610   H_SCORES HZ_PARTY_SEARCH.score_list;
4611 
4612   l_score NUMBER;
4613   l_idx NUMBER;
4614   l_party_cur HZ_PARTY_STAGE.StageCurTyp;
4615   l_party_site_cur HZ_PARTY_STAGE.StageCurTyp;
4616   l_contact_cur HZ_PARTY_STAGE.StageCurTyp;
4617   l_contact_pt_cur HZ_PARTY_STAGE.StageCurTyp;
4618   l_party_id NUMBER;
4619   l_ps_party_id NUMBER;
4620   l_ct_party_id NUMBER;
4621   l_cpt_party_id NUMBER;
4622   l_cpt_ps_id NUMBER;
4623   l_cpt_contact_id NUMBER;
4624   l_cpt_type VARCHAR2(100);
4625   l_party_site_id NUMBER;
4626   l_org_contact_id NUMBER;
4627   l_contact_pt_id NUMBER;
4628 
4629   defpt NUMBER :=0;
4630   defps NUMBER :=0;
4631   defct NUMBER :=0;
4632   defcpt NUMBER :=0;
4633   l_index NUMBER;
4634   l_party_max_score NUMBER;
4635   l_ps_max_score NUMBER;
4636   l_contact_max_score NUMBER;
4637   l_cpt_max_score NUMBER;
4638   l_match_contact_list HZ_PARTY_SEARCH.IDList;
4639   l_cnt NUMBER:=1;
4640 
4641   
4642   BEGIN
4643     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
4644       hz_utility_v2pub.debug(p_message=>'get_matching_contacts(+) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
4645     END IF;
4646     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4647       hz_utility_v2pub.debug(p_message=>'Input Parameters:',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4648       hz_utility_v2pub.debug(p_message=>'p_match_type '||p_match_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4649       hz_utility_v2pub.debug(p_message=>'p_restrict_sql '||p_restrict_sql,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4650       hz_utility_v2pub.debug(p_message=>'p_dup_contact_id '||p_dup_contact_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4651     END IF;
4652 
4653     -- ************************************
4654     -- STEP 1. Initialization and error checks
4655 
4656     l_match_str := ' AND ';
4657     IF p_match_type = 'AND' THEN
4658       l_match_str := ' AND ';
4659     ELSIF p_match_type = 'OR' THEN
4660       l_match_str := ' OR ';
4661     END IF;
4662     l_entered_max_score:= init_search( HZ_PARTY_SEARCH.G_MISS_PARTY_SEARCH_REC, HZ_PARTY_SEARCH.G_MISS_PARTY_SITE_LIST, p_contact_list, p_contact_point_list,l_match_str, l_party_max_score, l_ps_max_score, l_contact_max_score, l_cpt_max_score);
4663     g_score_until_thresh := false;
4664     IF l_entered_max_score = 0 THEN l_entered_max_score:=1; END IF;
4665 
4666     -- ************************************************************
4667     -- STEP 2. Setup of intermedia query strings for Acquisition query
4668     l_contact_contains_str := INIT_CONTACTS_QUERY(l_match_str,l_tmp);
4669     l_contact_pt_contains_str := INIT_CONTACT_POINTS_QUERY(l_match_str,l_tmp);
4670     init_score_context(HZ_PARTY_SEARCH.G_MISS_PARTY_SEARCH_REC,HZ_PARTY_SEARCH.G_MISS_PARTY_SITE_LIST,p_contact_list,p_contact_point_list);
4671 
4672     -- Setup Search Context ID
4673     SELECT hz_search_ctx_s.nextval INTO l_search_ctx_id FROM dual;
4674     x_search_ctx_id := l_search_ctx_id;
4675 
4676     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4677       hz_utility_v2pub.debug(p_message=>'l_match_str '||l_match_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4678       hz_utility_v2pub.debug(p_message=>'l_contact_contains_str '||l_contact_contains_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4679       hz_utility_v2pub.debug(p_message=>'l_contact_pt_contains_str '||l_contact_pt_contains_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4680       hz_utility_v2pub.debug(p_message=>'l_search_ctx_id '||l_search_ctx_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4681     END IF;
4682     IF l_contact_contains_str IS NULL THEN
4683       defct := 1;
4684     END IF;
4685     IF l_contact_pt_contains_str IS NULL THEN
4686       defcpt := 1;
4687     END IF;
4688 
4689     IF l_contact_contains_str IS NOT NULL THEN
4690       open_contact_cursor(NULL, P_PARTY_ID, p_restrict_sql, l_contact_contains_str,NULL, null, l_contact_cur);
4691       LOOP
4692         FETCH l_contact_cur INTO 
4693             l_org_contact_id, l_ct_party_id ;
4694         EXIT WHEN l_contact_cur%NOTFOUND;
4695       IF (p_dup_contact_id IS NULL OR l_org_contact_id <> p_dup_contact_id) THEN 
4696         l_index := map_id(l_org_contact_id);
4697         l_match_contact_list(l_cnt):=l_org_contact_id;
4698         l_cnt:=l_cnt+1;
4699           l_score := GET_CONTACTS_SCORE(l_match_idx);
4700             H_SCORES(l_index) := get_new_score_rec(l_score,defpt,defps,l_score,defcpt, l_ct_party_id, null, l_org_contact_id, null);
4701     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4702       hz_utility_v2pub.debug(p_message=>'Contact Level Matches',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4703       hz_utility_v2pub.debug(p_message=>'l_org_contact_id '||l_org_contact_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4704       hz_utility_v2pub.debug(p_message=>'l_score '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4705     END IF;
4706       END IF; 
4707       END LOOP;
4708       CLOSE l_contact_cur;
4709     END IF;
4710 
4711     IF l_contact_pt_contains_str IS NOT NULL THEN
4712     SAVEPOINT eval_start;
4713     IF l_match_str = ' AND ' OR (
4714         ((l_cpt_max_score/l_entered_max_score)<(15/60))
4715         ) THEN
4716       FORALL I in 1..l_match_contact_list.COUNT
4717            INSERT INTO HZ_DQM_PARTIES_GT (search_context_id, party_id)
4718            values (l_search_ctx_id,l_match_contact_list(I));
4719       open_contact_pt_cursor(NULL, P_PARTY_ID, p_restrict_sql, l_contact_pt_contains_str,NULL, null,'N', 'N',l_contact_pt_cur,'CONTACTS');
4720     ELSE
4721       open_contact_pt_cursor(NULL, P_PARTY_ID, p_restrict_sql, l_contact_pt_contains_str,NULL, null,'N', 'N',l_contact_pt_cur);
4722     END IF;
4723       LOOP
4724         FETCH l_contact_pt_cur INTO 
4725             l_contact_pt_id, l_cpt_type, l_cpt_party_id, l_cpt_ps_id, l_cpt_contact_id , l_TX1, l_TX6, l_TX5;
4726         EXIT WHEN l_contact_pt_cur%NOTFOUND;
4727       IF (l_cpt_contact_id IS NOT NULL AND (p_dup_contact_id IS NULL OR l_cpt_contact_id <>  p_dup_contact_id)) THEN 
4728         l_index := map_id(l_cpt_contact_id);
4729         IF l_match_str = ' OR ' THEN
4730           l_score := GET_CONTACT_POINTS_SCORE(l_match_idx,l_TX1,l_TX6,l_TX5);
4731           IF NOT H_SCORES.EXISTS(l_index) THEN
4732             H_SCORES(l_index) := get_new_score_rec(l_score,defpt,defps,defct,l_score,l_cpt_party_id,l_cpt_ps_id,l_cpt_contact_id,l_contact_pt_id);
4733           ELSE
4734             IF l_score > H_SCORES(l_index).CONTACT_POINT_SCORE THEN
4735                H_SCORES(l_index).TOTAL_SCORE := 
4736                       H_SCORES(l_index).TOTAL_SCORE-H_SCORES(l_index).CONTACT_POINT_SCORE+l_score;
4737                H_SCORES(l_index).CONTACT_POINT_SCORE := l_score;
4738             END IF;
4739           END IF;
4740         ELSE
4741           IF H_SCORES.EXISTS(l_index) THEN
4742             l_score := GET_CONTACT_POINTS_SCORE(l_match_idx,l_TX1,l_TX6,l_TX5);
4743             IF l_score > H_SCORES(l_index).CONTACT_POINT_SCORE THEN
4744                H_SCORES(l_index).TOTAL_SCORE := 
4745                       H_SCORES(l_index).TOTAL_SCORE-H_SCORES(l_index).CONTACT_POINT_SCORE+l_score;
4746                H_SCORES(l_index).CONTACT_POINT_SCORE := l_score;
4747             END IF;
4748           ELSIF defps=1 THEN
4749             l_score := GET_CONTACT_POINTS_SCORE(l_match_idx,l_TX1,l_TX6,l_TX5);
4750             H_SCORES(l_index) := get_new_score_rec(l_score,defpt,defps,defct,l_score,l_cpt_party_id,l_cpt_ps_id,l_cpt_contact_id,l_contact_pt_id);
4751           END IF;
4752         END IF;
4753         END IF; 
4754       END LOOP;
4755     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4756       hz_utility_v2pub.debug(p_message=>'Contact_point Level Matches',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4757       hz_utility_v2pub.debug(p_message=>'l_org_contact_id '||l_cpt_contact_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4758       hz_utility_v2pub.debug(p_message=>'l_score '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4759     END IF;
4760       CLOSE l_contact_pt_cur;
4761     END IF;
4762     x_num_matches := 0;
4763     l_org_contact_id := H_SCORES.FIRST;
4764     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4765       hz_utility_v2pub.debug(p_message=>'Evaluating Matches. Threshold : 25 ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4766     END IF;
4767     WHILE l_org_contact_id IS NOT NULL LOOP
4768       IF l_match_str = ' OR ' THEN
4769     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4770       hz_utility_v2pub.debug(p_message=>'Match Contact ID '||H_SCORES(l_org_contact_id).ORG_CONTACT_ID,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4771       hz_utility_v2pub.debug(p_message=>'Score '||round((H_SCORES(l_org_contact_id).TOTAL_SCORE/l_entered_max_score)*100),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4772     END IF;
4773         IF (H_SCORES(l_org_contact_id).TOTAL_SCORE)>=(ROUND((0/60) * 15)) THEN
4774             INSERT INTO HZ_MATCHED_CONTACTS_GT (SEARCH_CONTEXT_ID, PARTY_ID, ORG_CONTACT_ID, SCORE) 
4775             VALUES (l_search_ctx_id,H_SCORES(l_org_contact_id).PARTY_ID, H_SCORES(l_org_contact_id).ORG_CONTACT_ID, (H_SCORES(l_org_contact_id).TOTAL_SCORE/l_entered_max_score)*100);
4776           x_num_matches := x_num_matches+1;
4777         END IF;
4778       ELSE
4779            IF H_SCORES(l_org_contact_id).CONTACT_SCORE>0 AND
4780            H_SCORES(l_org_contact_id).CONTACT_POINT_SCORE>0 AND
4781            (H_SCORES(l_org_contact_id).TOTAL_SCORE)>=(ROUND((0/60) * 15)) THEN
4782           INSERT INTO HZ_MATCHED_CONTACTS_GT (SEARCH_CONTEXT_ID, PARTY_ID, ORG_CONTACT_ID, SCORE) 
4783           VALUES (l_search_ctx_id,H_SCORES(l_org_contact_id).PARTY_ID, H_SCORES(l_org_contact_id).ORG_CONTACT_ID, round((H_SCORES(l_org_contact_id).TOTAL_SCORE/l_entered_max_score)*100));
4784           x_num_matches := x_num_matches+1;
4785         END IF;
4786       END IF;
4787       l_org_contact_id:=H_SCORES.NEXT(l_org_contact_id);
4788     END LOOP;
4789     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
4790       hz_utility_v2pub.debug(p_message=>'get_matching_contacts(-) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
4791     END IF;
4792 EXCEPTION
4793   WHEN FND_API.G_EXC_ERROR THEN
4794     RAISE FND_API.G_EXC_ERROR;
4795   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4796     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4797   WHEN OTHERS THEN
4798     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
4799     FND_MESSAGE.SET_TOKEN('PROC','HZ_MATCH_RULE_3.get_matching_contacts');
4800     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
4801     FND_MSG_PUB.ADD;
4802     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4803 END get_matching_contacts;
4804 
4805 
4806 PROCEDURE get_matching_contact_points (
4807         p_rule_id               IN      NUMBER,
4808         p_party_id              IN      NUMBER,
4809         p_contact_point_list    IN      HZ_PARTY_SEARCH.CONTACT_POINT_LIST,
4810         p_restrict_sql          IN      VARCHAR2,
4811         p_match_type            IN      VARCHAR2,
4812         p_dup_contact_point_id  IN      NUMBER, 
4813         x_search_ctx_id         OUT     NUMBER,
4814         x_num_matches           OUT     NUMBER
4815 ) IS
4816 
4817 
4818   -- Strings to hold the generated Intermedia query strings
4819   l_contact_pt_contains_str VARCHAR2(32000);
4820   l_tmp VARCHAR2(32000);
4821 
4822   -- Other local variables
4823   l_match_str VARCHAR2(30); -- Match type (AND or OR)
4824   l_match_idx NUMBER;
4825   -- For Score calculation
4826   l_entered_max_score NUMBER;
4827   l_search_ctx_id NUMBER; -- Generated Search Context ID
4828 
4829   l_TX1 VARCHAR2(2000);
4830   l_TX5 VARCHAR2(2000);
4831   l_TX6 VARCHAR2(2000);
4832 
4833   l_score NUMBER;
4834   l_idx NUMBER;
4835   l_contact_pt_cur HZ_PARTY_STAGE.StageCurTyp;
4836   l_cpt_party_id NUMBER;
4837   l_cpt_ps_id NUMBER;
4838   l_cpt_contact_id NUMBER;
4839   l_contact_pt_id NUMBER;
4840   l_cpt_type VARCHAR2(100);
4841   H_PARTY_ID HZ_PARTY_SEARCH.IDList;
4842   H_CONTACT_POINT_ID HZ_PARTY_SEARCH.IDList;
4843   H_SCORE  HZ_PARTY_SEARCH.IDList;
4844 
4845   cnt NUMBER :=0;
4846   l_party_max_score NUMBER;
4847   l_ps_max_score NUMBER;
4848   l_contact_max_score NUMBER;
4849   l_cpt_max_score NUMBER;
4850 
4851   
4852   BEGIN
4853     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
4854       hz_utility_v2pub.debug(p_message=>'get_matching_contact_points(+) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
4855     END IF;
4856     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4857       hz_utility_v2pub.debug(p_message=>'Input Parameters:',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4858       hz_utility_v2pub.debug(p_message=>'p_match_type '||p_match_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4859       hz_utility_v2pub.debug(p_message=>'p_restrict_sql '||p_restrict_sql,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4860       hz_utility_v2pub.debug(p_message=>'p_dup_contact_point_id '||p_dup_contact_point_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4861     END IF;
4862 
4863     -- ************************************
4864     -- STEP 1. Initialization and error checks
4865 
4866     l_match_str := ' AND ';
4867     IF p_match_type = 'AND' THEN
4868       l_match_str := ' AND ';
4869     ELSIF p_match_type = 'OR' THEN
4870       l_match_str := ' OR ';
4871     END IF;
4872     l_entered_max_score:= init_search(HZ_PARTY_SEARCH.G_MISS_PARTY_SEARCH_REC, 
4873        HZ_PARTY_SEARCH.G_MISS_PARTY_SITE_LIST, HZ_PARTY_SEARCH.G_MISS_CONTACT_LIST,
4874        p_contact_point_list,l_match_str, l_party_max_score, l_ps_max_score, l_contact_max_score, l_cpt_max_score);
4875     g_score_until_thresh := false;
4876     IF l_entered_max_score = 0 THEN l_entered_max_score:=1; END IF;
4877 
4878     -- ************************************************************
4879     -- STEP 2. Setup of intermedia query strings for Acquisition query
4880     l_contact_pt_contains_str := INIT_CONTACT_POINTS_QUERY(l_match_str,l_tmp);
4881     init_score_context(HZ_PARTY_SEARCH.G_MISS_PARTY_SEARCH_REC,HZ_PARTY_SEARCH.G_MISS_PARTY_SITE_LIST,HZ_PARTY_SEARCH.G_MISS_CONTACT_LIST,p_contact_point_list);
4882 
4883     -- Setup Search Context ID
4884     SELECT hz_search_ctx_s.nextval INTO l_search_ctx_id FROM dual;
4885     x_search_ctx_id := l_search_ctx_id;
4886     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4887       hz_utility_v2pub.debug(p_message=>'l_match_str '||l_match_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4888       hz_utility_v2pub.debug(p_message=>'l_contact_pt_contains_str '||l_contact_pt_contains_str,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4889       hz_utility_v2pub.debug(p_message=>'l_search_ctx_id '||l_search_ctx_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4890     END IF;
4891 
4892     IF l_contact_pt_contains_str IS NOT NULL THEN
4893       open_contact_pt_cursor(NULL, P_PARTY_ID, p_restrict_sql, l_contact_pt_contains_str,NULL, null,'N', 'N',l_contact_pt_cur);
4894       cnt := 1;
4895       LOOP
4896         FETCH l_contact_pt_cur INTO 
4897             l_contact_pt_id, l_cpt_type, l_cpt_party_id, l_cpt_ps_id, l_cpt_contact_id , l_TX1, l_TX6, l_TX5;
4898         EXIT WHEN l_contact_pt_cur%NOTFOUND;
4899         IF (p_dup_contact_point_id IS NULL OR (
4900                p_dup_contact_point_id IS NOT NULL AND 
4901                l_cpt_ps_id IS NULL AND l_cpt_contact_id IS NULL AND 
4902                p_dup_contact_point_id <>  l_contact_pt_id)) THEN   
4903             H_CONTACT_POINT_ID(cnt) := l_contact_pt_id;
4904             H_PARTY_ID(cnt) := l_cpt_party_id;
4905             H_SCORE(cnt) := GET_CONTACT_POINTS_SCORE(l_match_idx,l_TX1,l_TX6,l_TX5);
4906             cnt := cnt+1;
4907     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4908       hz_utility_v2pub.debug(p_message=>'Contact Point Matches',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4909       hz_utility_v2pub.debug(p_message=>'l_contact_pt_id '||l_contact_pt_id,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4910       hz_utility_v2pub.debug(p_message=>'l_score '||l_score,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4911     END IF;
4912         END IF; 
4913       END LOOP;
4914       CLOSE l_contact_pt_cur;
4915     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4916       hz_utility_v2pub.debug(p_message=>'Evaluating Matches. Threshold : 25 ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4917     END IF;
4918       x_num_matches := 0; 
4919       FOR I in 1..H_CONTACT_POINT_ID.COUNT LOOP
4920     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
4921       hz_utility_v2pub.debug(p_message=>'Match Contact Point ID '||H_CONTACT_POINT_ID(I),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4922       hz_utility_v2pub.debug(p_message=>'Score '||round((H_SCORE(I)/l_entered_max_score)*100),p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
4923     END IF;
4924         IF (H_SCORE(I)) >= (ROUND((40/60) * 15)) THEN
4925         INSERT INTO HZ_MATCHED_CPTS_GT(SEARCH_CONTEXT_ID,CONTACT_POINT_ID,PARTY_ID,SCORE) VALUES (
4926             l_search_ctx_id,H_CONTACT_POINT_ID(I),H_PARTY_ID(I),round(H_SCORE(I)/l_entered_max_score)*100);
4927             x_num_matches := x_num_matches + 1; 
4928         END IF;
4929       END LOOP; 
4930     END IF;
4931     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
4932       hz_utility_v2pub.debug(p_message=>'get_matching_contact_points(-) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
4933     END IF;
4934 EXCEPTION
4935   WHEN FND_API.G_EXC_ERROR THEN
4936     RAISE FND_API.G_EXC_ERROR;
4937   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4938     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4939   WHEN OTHERS THEN
4940     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
4941     FND_MESSAGE.SET_TOKEN('PROC','HZ_MATCH_RULE_3.get_matching_contact_points');
4942     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
4943     FND_MSG_PUB.ADD;
4944     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4945 END get_matching_contact_points;
4946 
4947    /**********************************************************
4948    This procedure finds the score details for a specific party that 
4949    matched 
4950 
4951    **********************************************************/
4952 
4953 PROCEDURE get_score_details (
4954         p_rule_id               IN      NUMBER,
4955         p_party_id              IN      NUMBER,
4956         p_party_search_rec      IN      HZ_PARTY_SEARCH.party_search_rec_type,
4957         p_party_site_list       IN      HZ_PARTY_SEARCH.party_site_list,
4958         p_contact_list          IN      HZ_PARTY_SEARCH.contact_list,
4959         p_contact_point_list    IN      HZ_PARTY_SEARCH.contact_point_list,
4960         x_search_ctx_id         IN OUT  NUMBER
4961 ) IS
4962 
4963   -- Strings to hold the generated Intermedia query strings
4964   l_party_contains_str VARCHAR2(32000); 
4965   l_party_site_contains_str VARCHAR2(32000);
4966   l_contact_contains_str VARCHAR2(32000);
4967   l_contact_pt_contains_str VARCHAR2(32000);
4968   l_tmp VARCHAR2(32000);
4969 
4970   -- Other local variables
4971   l_match_str VARCHAR2(30); -- Match type (AND or OR)
4972   -- For Score calculation
4973   l_max_score NUMBER;
4974   l_entered_max_score NUMBER;
4975   FIRST BOOLEAN;
4976   l_search_ctx_id NUMBER; -- Generated Search Context ID
4977 
4978   l_TX44 VARCHAR2(2000);
4979   l_max_TX44 VARCHAR2(2000);
4980   l_TX1 VARCHAR2(2000);
4981   l_max_TX1 VARCHAR2(2000);
4982   l_TX5 VARCHAR2(2000);
4983   l_max_TX5 VARCHAR2(2000);
4984   l_TX6 VARCHAR2(2000);
4985   l_max_TX6 VARCHAR2(2000);
4986   H_SCORES HZ_PARTY_SEARCH.score_list;
4987 
4988   l_score NUMBER;
4989   l_match_idx NUMBER;
4990   l_idx NUMBER;
4991   l_party_cur HZ_PARTY_STAGE.StageCurTyp;
4992   l_party_site_cur HZ_PARTY_STAGE.StageCurTyp;
4993   l_contact_cur HZ_PARTY_STAGE.StageCurTyp;
4994   l_contact_pt_cur HZ_PARTY_STAGE.StageCurTyp;
4995   l_party_id NUMBER;
4996   l_ps_party_id NUMBER;
4997   l_ct_party_id NUMBER;
4998   l_cpt_party_id NUMBER;
4999   l_cpt_ps_id NUMBER;
5000   l_cpt_contact_id NUMBER;
5001   l_cpt_type VARCHAR2(100);
5002   l_party_site_id NUMBER;
5003   l_org_contact_id NUMBER;
5004   l_contact_pt_id NUMBER;
5005   l_ps_contact_id NUMBER;
5006   l_max_id NUMBER;
5007   l_max_idx NUMBER;
5008 
5009   l_index NUMBER;
5010   l_party_max_score NUMBER;
5011   l_ps_max_score NUMBER;
5012   l_contact_max_score NUMBER;
5013   l_cpt_max_score NUMBER;
5014 
5015   --Fix for bug 4417124 
5016   l_use_contact_addr_info BOOLEAN:=TRUE;
5017   l_use_contact_cpt_info  BOOLEAN:=TRUE;
5018 
5019   BEGIN
5020 
5021     IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5022       hz_utility_v2pub.debug(p_message=>'get_score_details(+) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5023     END IF;
5024     -- ************************************
5025     -- STEP 1. Initialization and error checks
5026 
5027     l_entered_max_score:= init_search(p_party_search_rec,p_party_site_list,p_contact_list,p_contact_point_list,' OR ', l_party_max_score, l_ps_max_score, l_contact_max_score, l_cpt_max_score);
5028     g_score_until_thresh := false;
5029     IF l_entered_max_score = 0 THEN l_entered_max_score:=1; END IF;
5030     -- ************************************************************
5031     -- STEP 2. Setup of intermedia query strings for Acquisition query
5032     l_party_site_contains_str := INIT_PARTY_SITES_QUERY(l_match_str,l_tmp);
5033     l_contact_contains_str := INIT_CONTACTS_QUERY(l_match_str,l_tmp);
5034     l_contact_pt_contains_str := INIT_CONTACT_POINTS_QUERY(l_match_str,l_tmp);
5035     init_score_context(p_party_search_rec,p_party_site_list,p_contact_list,p_contact_point_list);
5036 
5037     -- Setup Search Context ID
5038     IF x_search_ctx_id IS NULL THEN
5039       SELECT hz_search_ctx_s.nextval INTO l_search_ctx_id FROM dual;
5040       x_search_ctx_id := l_search_ctx_id;
5041     ELSE
5042       l_search_ctx_id := x_search_ctx_id;
5043     END IF;
5044 
5045     open_party_cursor(p_party_id, null, null,null,null,null,l_party_cur);
5046     LOOP 
5047         FETCH l_party_cur INTO
5048            l_party_id , l_TX44;
5049         EXIT WHEN l_party_cur%NOTFOUND;
5050           INSERT_PARTY_SCORE(p_party_id, p_party_id, l_search_ctx_id, p_party_search_rec, g_party_stage_rec, l_TX44,1);
5051     END LOOP;
5052     CLOSE l_party_cur;
5053 
5054     IF l_party_site_contains_str IS NOT NULL THEN
5055       l_max_score := 0;
5056       l_max_id := 0;
5057       l_max_idx := 0;
5058       IF p_party_search_rec.PARTY_TYPE = 'PERSON' AND l_use_contact_addr_info THEN
5059         open_party_site_cursor(null, p_party_id, null, l_party_site_contains_str,NULL,NULL, 'Y','N',l_party_site_cur);
5060       ELSE
5061         open_party_site_cursor(null, p_party_id, null, l_party_site_contains_str,NULL,NULL, 'N','N',l_party_site_cur);
5062       END IF;
5063       LOOP
5064         FETCH l_party_site_cur INTO 
5065             l_party_site_id, l_ps_party_id,l_ps_contact_id ;
5066         EXIT WHEN l_party_site_cur%NOTFOUND;
5067         l_score := GET_PARTY_SITES_SCORE(l_match_idx);
5068         IF l_score > l_max_score THEN
5069           l_max_score := l_score;
5070           l_max_id := l_party_site_id;
5071           l_max_idx := l_match_idx;
5072         END IF;
5073       END LOOP;
5074       CLOSE l_party_site_cur;
5075       IF l_max_score>0 THEN
5076         INSERT_PARTY_SITES_SCORE(p_party_id,l_max_id,l_search_ctx_id, p_party_site_list(l_max_idx), g_party_site_stage_list(l_max_idx) ,l_max_idx);
5077       END IF;
5078     END IF;
5079 
5080     IF l_contact_contains_str IS NOT NULL THEN
5081       l_max_score := 0;
5082       l_max_id := 0;
5083       l_max_idx := 0;
5084       open_contact_cursor(null, p_party_id, null, l_contact_contains_str,NULL, null, l_contact_cur);
5085       LOOP
5086         FETCH l_contact_cur INTO 
5087             l_org_contact_id, l_ct_party_id ;
5088         EXIT WHEN l_contact_cur%NOTFOUND;
5089         l_score := GET_CONTACTS_SCORE(l_match_idx);
5090         IF l_score > l_max_score THEN
5091           l_max_score := l_score;
5092           l_max_id := l_org_contact_id;
5093           l_max_idx := l_match_idx;
5094         END IF;
5095       END LOOP;
5096       CLOSE l_contact_cur;
5097       IF l_max_score>0 THEN
5098         INSERT_CONTACTS_SCORE(p_party_id,l_max_id,l_search_ctx_id, p_contact_list(l_max_idx), g_contact_stage_list(l_max_idx) ,l_max_idx);
5099       END IF;
5100     END IF;
5101 
5102     IF l_contact_pt_contains_str IS NOT NULL THEN
5103       l_max_score := 0;
5104       l_max_id := 0;
5105       l_max_idx := 0;
5106       IF p_party_search_rec.PARTY_TYPE = 'PERSON' AND l_use_contact_cpt_info THEN
5107         open_contact_pt_cursor(null, p_party_id, null, l_contact_pt_contains_str,NULL,NULL, 'Y','N',l_contact_pt_cur);
5108       ELSE
5109         open_contact_pt_cursor(null, p_party_id, null, l_contact_pt_contains_str,NULL,NULL, 'N','N',l_contact_pt_cur);
5110       END IF;
5111       LOOP
5112         FETCH l_contact_pt_cur INTO 
5113             l_contact_pt_id, l_cpt_type, l_cpt_party_id, l_cpt_ps_id, l_cpt_contact_id , l_TX1, l_TX6, l_TX5;
5114         EXIT WHEN l_contact_pt_cur%NOTFOUND;
5115         l_score := GET_CONTACT_POINTS_SCORE(l_match_idx,l_TX1,l_TX6,l_TX5);
5116         IF l_score > l_max_score THEN
5117           l_max_score := l_score;
5118           l_max_id := l_contact_pt_id;
5119           l_max_idx := l_match_idx;
5120           l_max_TX1 := l_TX1;
5121           l_max_TX5 := l_TX5;
5122           l_max_TX6 := l_TX6;
5123         END IF;
5124       END LOOP;
5125       IF l_max_score>0 THEN
5126         INSERT_CONTACT_POINTS_SCORE(p_party_id,l_max_id,l_search_ctx_id, p_contact_point_list(l_max_idx), g_contact_pt_stage_list(l_max_idx) ,l_max_TX1,l_max_TX6,l_max_TX5,l_max_idx);
5127       END IF;
5128       CLOSE l_contact_pt_cur;
5129     END IF;
5130     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
5131       hz_utility_v2pub.debug(p_message=>'get_score_details(-) ',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_procedure);
5132     END IF;
5133 EXCEPTION
5134   WHEN FND_API.G_EXC_ERROR THEN
5135     RAISE FND_API.G_EXC_ERROR;
5136   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5137     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5138   WHEN OTHERS THEN
5139     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
5140     FND_MESSAGE.SET_TOKEN('PROC','HZ_MATCH_RULE_3.get_score_details');
5141     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
5142     FND_MSG_PUB.ADD;
5143     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5144 END get_score_details;
5145 
5146 
5147 /************************************************
5148   This procedure retrieves the match rule attributes into 
5149   the search record structures
5150 ************************************************/
5151 
5152 PROCEDURE get_party_for_search (
5153         p_party_id              IN      NUMBER,
5154         x_party_search_rec      OUT NOCOPY HZ_PARTY_SEARCH.party_search_rec_type,
5155         x_party_site_list       OUT NOCOPY HZ_PARTY_SEARCH.party_site_list,
5156         x_contact_list          OUT NOCOPY HZ_PARTY_SEARCH.contact_list,
5157         x_contact_point_list    OUT NOCOPY HZ_PARTY_SEARCH.contact_point_list
5158 ) IS
5159   l_party_id NUMBER;
5160   l_party_site_ids HZ_PARTY_SEARCH.IDList;
5161   l_contact_ids HZ_PARTY_SEARCH.IDList;
5162   l_contact_pt_ids HZ_PARTY_SEARCH.IDList;
5163   ps NUMBER :=1;
5164   cpt NUMBER :=1;
5165   ct NUMBER :=1;
5166   l_use_contact_info varchar2(1);
5167 BEGIN
5168 
5169     l_use_contact_info := 'Y';
5170   IF nvl(FND_PROFILE.VALUE('HZ_DQM_REL_PARTY_MATCH'),'N')='Y' THEN
5171     l_use_contact_info := 'N';
5172   END IF;
5173   l_party_id := p_party_id;
5174     FOR CONTACT_POINTS IN (
5175       SELECT CONTACT_POINT_ID
5176       FROM HZ_CONTACT_POINTS 
5177       WHERE PRIMARY_FLAG = 'Y'
5178       AND owner_table_name = 'HZ_PARTIES'
5179       AND owner_table_id = p_party_id
5180 
5181       UNION
5182 
5183       SELECT CONTACT_POINT_ID
5184       FROM HZ_CONTACT_POINTS,HZ_ORG_CONTACTS, HZ_RELATIONSHIPS 
5185       WHERE PRIMARY_FLAG = 'Y'
5186       AND owner_table_name = 'HZ_PARTIES'
5187       AND OWNER_TABLE_ID = HZ_RELATIONSHIPS.party_id
5188       AND HZ_RELATIONSHIPS.object_id = p_party_id
5189       AND HZ_RELATIONSHIPS.SUBJECT_TABLE_NAME = 'HZ_PARTIES'
5190       AND HZ_RELATIONSHIPS.OBJECT_TABLE_NAME = 'HZ_PARTIES'
5191       AND HZ_ORG_CONTACTS.party_relationship_id = HZ_RELATIONSHIPS.relationship_id
5192         and l_use_contact_info = 'Y'
5193       AND ROWNUM<6
5194       UNION
5195 
5196       SELECT CONTACT_POINT_ID
5197       FROM HZ_CONTACT_POINTS,HZ_PARTY_SITES  
5198       WHERE PRIMARY_FLAG = 'Y'
5199       AND owner_table_name = 'HZ_PARTY_SITES'
5200       AND owner_table_id = party_site_id 
5201       AND PARTY_ID = p_party_id 
5202       AND IDENTIFYING_ADDRESS_FLAG = 'Y') LOOP
5203       l_contact_pt_ids(cpt) := CONTACT_POINTS.CONTACT_POINT_ID;
5204       cpt := cpt+1;
5205     END LOOP;
5206     get_search_criteria(l_party_id,l_party_site_ids,l_contact_ids,l_contact_pt_ids,
5207           x_party_search_rec,x_party_site_list,x_contact_list,x_contact_point_list);
5208 EXCEPTION
5209   WHEN FND_API.G_EXC_ERROR THEN
5210     RAISE FND_API.G_EXC_ERROR;
5211   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5212     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5213   WHEN OTHERS THEN
5214     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
5215     FND_MESSAGE.SET_TOKEN('PROC','get_party_for_search');
5216     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
5217     FND_MSG_PUB.ADD;
5218     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5219 END get_party_for_search;
5220 
5221 PROCEDURE get_search_criteria (
5222         p_party_id              IN      NUMBER,
5223         p_party_site_ids        IN      HZ_PARTY_SEARCH.IDList,
5224         p_contact_ids           IN      HZ_PARTY_SEARCH.IDList,
5225         p_contact_pt_ids        IN      HZ_PARTY_SEARCH.IDList,
5226         x_party_search_rec      OUT NOCOPY HZ_PARTY_SEARCH.party_search_rec_type,
5227         x_party_site_list       OUT NOCOPY HZ_PARTY_SEARCH.party_site_list,
5228         x_contact_list          OUT NOCOPY HZ_PARTY_SEARCH.contact_list,
5229         x_contact_point_list    OUT NOCOPY HZ_PARTY_SEARCH.contact_point_list
5230 ) IS
5231 BEGIN
5232 
5233    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5234       hz_utility_v2pub.debug(p_message=>'Inside Calling Procedure - get_search_criteria',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5235     END IF;
5236     IF p_party_id IS NOT NULL THEN
5237    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5238       hz_utility_v2pub.debug(p_message=>'Before Calling Procedure - get_party_rec',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5239     END IF;
5240       get_party_rec(p_party_id, x_party_search_rec);
5241     END IF;
5242     IF p_contact_pt_ids IS NOT NULL AND p_contact_pt_ids.COUNT>0 THEN
5243    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5244       hz_utility_v2pub.debug(p_message=>'Before Calling Procedure - get_contact_point_rec',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5245     END IF;
5246       get_contact_point_rec(p_contact_pt_ids, x_contact_point_list);
5247     END IF;
5248 EXCEPTION
5249   WHEN FND_API.G_EXC_ERROR THEN
5250     RAISE FND_API.G_EXC_ERROR;
5251   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5252     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5253   WHEN OTHERS THEN
5254     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
5255     FND_MESSAGE.SET_TOKEN('PROC','get_search_criteria');
5256     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
5257     FND_MSG_PUB.ADD;
5258     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5259 END get_search_criteria;
5260 
5261 
5262 /************************************************
5263   This procedure retrieves the match rule party attributes into 
5264   the party search record structure 
5265 ************************************************/
5266 
5267 PROCEDURE get_party_rec (
5268         p_party_id              IN      NUMBER,
5269         x_party_search_rec      OUT NOCOPY HZ_PARTY_SEARCH.party_search_rec_type
5270 ) IS
5271     l_party_type VARCHAR2(255);
5272 BEGIN
5273 
5274    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5275       hz_utility_v2pub.debug(p_message=>'Inside calling procedure - get_party_rec',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5276     END IF;
5277     SELECT PARTY_TYPE INTO l_party_type
5278     FROM HZ_PARTIES
5279     WHERE PARTY_ID = p_party_id;
5280 
5281    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5282       hz_utility_v2pub.debug(p_message=>'l_party_type is -  '||l_party_type,p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5283     END IF;
5284     IF l_party_type = 'ORGANIZATION' THEN
5285       SELECT 
5286         translate(HZ_PARTIES.PARTY_TYPE, '%',' ')
5287        ,translate(HZ_ORGANIZATION_PROFILES.TAX_REFERENCE, '%',' ')
5288       INTO 
5289         x_party_search_rec.PARTY_TYPE
5290        ,x_party_search_rec.TAX_REFERENCE
5291       FROM HZ_PARTIES, HZ_ORGANIZATION_PROFILES
5292       WHERE HZ_PARTIES.party_id = HZ_ORGANIZATION_PROFILES.party_id
5293       AND HZ_ORGANIZATION_PROFILES.effective_end_date is NULL
5294       AND HZ_PARTIES.party_id = p_party_id;
5295     ELSIF l_party_type = 'PERSON' THEN
5296       SELECT 
5297         translate(HZ_PARTIES.PARTY_TYPE, '%',' ')
5298        ,translate(HZ_PERSON_PROFILES.TAX_REFERENCE, '%',' ')
5299       INTO 
5300         x_party_search_rec.PARTY_TYPE
5301        ,x_party_search_rec.TAX_REFERENCE
5302       FROM HZ_PARTIES, HZ_PERSON_PROFILES
5303       WHERE HZ_PARTIES.party_id = HZ_PERSON_PROFILES.party_id
5304       AND HZ_PERSON_PROFILES.effective_end_date is NULL
5305       AND HZ_PARTIES.party_id = p_party_id;
5306     END IF;
5307     x_party_search_rec.PARTY_TYPE := l_party_type;
5308    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5309       hz_utility_v2pub.debug(p_message=>'Inside calling procedure - generate_custom_code',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5310     END IF;
5311 
5312 EXCEPTION
5313   WHEN OTHERS THEN
5314     FND_MESSAGE.SET_NAME('AR', 'HZ_PARTY_QUERY_ERROR');
5315     FND_MESSAGE.SET_TOKEN('PROC','get_party_rec');
5316     FND_MESSAGE.SET_TOKEN('PARTY_ID',p_party_id);
5317     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
5318     FND_MSG_PUB.ADD;
5319     RAISE FND_API.G_EXC_ERROR;
5320 END get_party_rec;
5321 
5322 /************************************************
5323   This procedure retrieves the match rule party site attributes into 
5324   the party site search record structure 
5325 ************************************************/
5326 
5327 PROCEDURE get_party_site_rec (
5328         p_party_site_ids       IN      HZ_PARTY_SEARCH.IDList,
5329         x_party_site_list      OUT NOCOPY HZ_PARTY_SEARCH.party_site_list
5330 ) IS
5331   CURSOR c_party_sites(cp_party_site_id NUMBER) IS
5332     SELECT party_site_id
5333     FROM HZ_PARTY_SITES, HZ_LOCATIONS
5334     WHERE HZ_PARTY_SITES.party_site_id = cp_party_site_id
5335     AND   HZ_PARTY_SITES.location_id = HZ_LOCATIONS.location_id;
5336 
5337   I NUMBER;
5338   J NUMBER:=1;
5339   l_party_site_id NUMBER;
5340 
5341 BEGIN
5342 
5343    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5344       hz_utility_v2pub.debug(p_message=>'Inside calling procedure - get_party_site_rec',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5345     END IF;
5346     FOR I IN 1..p_party_site_ids.COUNT LOOP
5347       l_party_site_id := p_party_site_ids(I);
5348       OPEN c_party_sites(p_party_site_ids(I));
5349       LOOP
5350         FETCH c_party_sites INTO
5351              l_party_site_id
5352         ;
5353         EXIT WHEN c_party_sites%NOTFOUND;
5354 
5355    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5356       hz_utility_v2pub.debug(p_message=>'Inside calling procedure - generate_custom_code',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5357     END IF;
5358         J:=J+1;
5359 
5360       END LOOP;
5361       CLOSE c_party_sites;
5362     END LOOP;
5363 
5364 EXCEPTION
5365   WHEN OTHERS THEN
5366     FND_MESSAGE.SET_NAME('AR', 'HZ_PARTY_QUERY_ERROR');
5367     FND_MESSAGE.SET_TOKEN('PROC','get_party_site_rec');
5368     FND_MESSAGE.SET_TOKEN('PARTY_ID',l_party_site_id);
5369     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
5370     FND_MSG_PUB.ADD;
5371     RAISE FND_API.G_EXC_ERROR;
5372 END get_party_site_rec;
5373 
5374 /************************************************
5375   This procedure retrieves the match rule contact attributes into 
5376   the contact search record structure 
5377 ************************************************/
5378 
5379 PROCEDURE get_contact_rec (
5380         p_contact_ids       IN      HZ_PARTY_SEARCH.IDList,
5381         x_contact_list      OUT NOCOPY HZ_PARTY_SEARCH.contact_list
5382 ) IS
5383   CURSOR c_contacts(cp_org_contact_id NUMBER) IS
5384     SELECT org_contact_id
5385     FROM HZ_ORG_CONTACTS, HZ_RELATIONSHIPS, HZ_PERSON_PROFILES
5386     WHERE HZ_ORG_CONTACTS.org_contact_id = cp_org_contact_id
5387     AND HZ_RELATIONSHIPS.SUBJECT_TABLE_NAME = 'HZ_PARTIES'
5388     AND HZ_RELATIONSHIPS.OBJECT_TABLE_NAME = 'HZ_PARTIES'
5389     AND HZ_RELATIONSHIPS.DIRECTIONAL_FLAG = 'F'
5390     AND HZ_ORG_CONTACTS.party_relationship_id = HZ_RELATIONSHIPS.relationship_id
5391     AND HZ_RELATIONSHIPS.subject_id = HZ_PERSON_PROFILES.party_id
5392     AND HZ_PERSON_PROFILES.effective_end_date IS NULL;
5393 
5394   I NUMBER;
5395   l_org_contact_id NUMBER;
5396   J NUMBER:=1;
5397   BEGIN
5398 
5399    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5400       hz_utility_v2pub.debug(p_message=>'Inside calling procedure - get_contact_rec',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5401     END IF;
5402     FOR I IN 1..p_contact_ids.COUNT LOOP
5403       l_org_contact_id := p_contact_ids(I);
5404       OPEN c_contacts(p_contact_ids(I));
5405       LOOP
5406         FETCH c_contacts INTO
5407              l_org_contact_id
5408         ;
5409         EXIT WHEN c_contacts%NOTFOUND;
5410 
5411    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5412       hz_utility_v2pub.debug(p_message=>'Inside calling procedure - generate_custom_code',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5413     END IF;
5414 
5415         J:=J+1;
5416       END LOOP;
5417       CLOSE c_contacts;
5418     END LOOP;
5419 
5420 EXCEPTION
5421   WHEN OTHERS THEN
5422     FND_MESSAGE.SET_NAME('AR', 'HZ_PARTY_QUERY_ERROR');
5423     FND_MESSAGE.SET_TOKEN('PROC','get_contact_rec');
5424     FND_MESSAGE.SET_TOKEN('PARTY_ID',l_org_contact_id);
5425     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
5426     FND_MSG_PUB.ADD;
5427     RAISE FND_API.G_EXC_ERROR;
5428 END get_contact_rec;
5429 
5430 /************************************************
5431   This procedure retrieves the match rule contact point attributes into 
5432   the contact point search record structure 
5433 ************************************************/
5434 
5435 PROCEDURE get_contact_point_rec (
5436         p_contact_point_ids     IN  HZ_PARTY_SEARCH.IDList,
5437         x_contact_point_list    OUT NOCOPY HZ_PARTY_SEARCH.contact_point_list
5438 ) IS
5439 
5440   -- Cursor to fetch primary contact points for party
5441   CURSOR c_cpts(cp_contact_point_id NUMBER) IS
5442     SELECT contact_point_id, contact_point_type
5443       ,translate(HZ_CONTACT_POINTS.EMAIL_ADDRESS, '%',' ')
5444     FROM HZ_CONTACT_POINTS
5445     WHERE contact_point_id = cp_contact_point_id;
5446 
5447   I NUMBER;
5448   l_contact_point_id NUMBER;
5449   J NUMBER:=1;
5450   BEGIN
5451 
5452    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5453       hz_utility_v2pub.debug(p_message=>'Inside calling procedure - get_contact_point_rec',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5454     END IF;
5455     FOR I in 1..p_contact_point_ids.COUNT LOOP
5456       l_contact_point_id := p_contact_point_ids(I);
5457       OPEN c_cpts(p_contact_point_ids(I));
5458       LOOP
5459         FETCH c_cpts INTO
5460              l_contact_point_id, x_contact_point_list(J).contact_point_type
5461              ,x_contact_point_list(J).EMAIL_ADDRESS
5462         ;
5463         EXIT WHEN c_cpts%NOTFOUND;
5464 
5465    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5466       hz_utility_v2pub.debug(p_message=>'Inside calling procedure - generate_custom_code',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5467     END IF;
5468         x_contact_point_list(J).FLEX_FORMAT_PHONE_NUMBER:=
5469        HZ_PARTY_ACQUIRE.get_phone_number(l_contact_point_id , 'CONTACT_POINTS','FLEX_FORMAT_PHONE_NUMBER');
5470         J:=J+1;
5471 
5472       END LOOP;
5473       CLOSE c_cpts;
5474     END LOOP;
5475 
5476 EXCEPTION
5477   WHEN OTHERS THEN
5478     FND_MESSAGE.SET_NAME('AR', 'HZ_PARTY_QUERY_ERROR');
5479     FND_MESSAGE.SET_TOKEN('PROC','get_contact_point_rec');
5480     FND_MESSAGE.SET_TOKEN('PARTY_ID',l_contact_point_id);
5481     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
5482     FND_MSG_PUB.ADD;
5483     RAISE FND_API.G_EXC_ERROR;
5484 END get_contact_point_rec;
5485 
5486 /************************************************
5487   This procedure maps a search record from the logical
5488   record structure to the stage schema structure 
5489   for the PARTY Entity after applying 
5490   the defined transformations
5491 ************************************************/
5492 
5493 PROCEDURE MAP_PARTY_REC( 
5494     p_search_ctx IN BOOLEAN,
5495     p_search_rec IN HZ_PARTY_SEARCH.party_search_rec_type, 
5496     x_entered_max_score OUT NUMBER,
5497     x_stage_rec IN OUT NOCOPY HZ_PARTY_STAGE.party_stage_rec_type
5498   ) IS 
5499   tmp VARCHAR2(4000);
5500   l_party_name VARCHAR2(4000);
5501 BEGIN
5502    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5503       hz_utility_v2pub.debug(p_message=>'Inside Calling Procedure - MAP_PARTY_REC',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5504     END IF;
5505    IF p_search_ctx THEN
5506      x_stage_rec.TX8 := NULL;
5507      g_other_party_level_attribs:=FALSE;
5508     IF p_search_rec.TAX_REFERENCE IS NOT NULL 
5509     THEN
5510       g_other_party_level_attribs:=TRUE;
5511     END IF;
5512      x_entered_max_score:=0;
5513     IF p_search_rec.TAX_REFERENCE IS NOT NULL THEN 
5514       x_entered_max_score := x_entered_max_score+20;
5515     END IF;
5516     END IF;
5517     IF p_search_rec.PARTY_TYPE IS NOT NULL THEN 
5518       x_stage_rec.TX36 := 
5519         HZ_TRANS_PKG.EXACT(
5520              p_search_rec.PARTY_TYPE
5521              ,null,'PARTY_TYPE'
5522              ,'PARTY');
5523     ELSE
5524       x_stage_rec.TX36 := '';
5525     END IF;
5526   IF p_search_ctx THEN
5527     IF p_search_rec.TAX_REFERENCE IS NOT NULL THEN 
5528       x_stage_rec.TX44 := 
5529         HZ_TRANS_PKG.RM_SPLCHAR(
5530              p_search_rec.TAX_REFERENCE
5531              ,null,'TAX_REFERENCE'
5532              ,'PARTY','SDIB');
5533     ELSE
5534       x_stage_rec.TX44 := '';
5535     END IF;
5536   ELSE
5537     IF p_search_rec.TAX_REFERENCE IS NOT NULL THEN 
5538       tmp :=HZ_TRANS_PKG.RM_SPLCHAR(
5539              x_stage_rec.TX44
5540              ,null,'TAX_REFERENCE'
5541              ,'PARTY','SCORE');
5542       IF tmp IS NOT NULL THEN
5543         x_stage_rec.TX44 := tmp;
5544       END IF;
5545     END IF;
5546   END IF;
5547     l_party_name := p_search_rec.PARTY_NAME;
5548     IF l_party_name IS NULL AND p_search_rec.PARTY_ALL_NAMES IS NOT NULL THEN
5549       l_party_name := p_search_rec.PARTY_ALL_NAMES;
5550     END IF;
5551     IF l_party_name IS NOT NULL AND x_stage_rec.TX8 IS NULL THEN
5552       x_stage_rec.TX8 := HZ_TRANS_PKG.WRNAMES_EXACT(l_party_name,null,'PARTY_NAME','PARTY','SDIB');
5553     END IF;
5554 EXCEPTION
5555   WHEN OTHERS THEN
5556     FND_MESSAGE.SET_NAME('AR', 'HZ_TRANSFORM_PROC_ERROR');
5557     FND_MESSAGE.SET_TOKEN('PROC' , 'MAP_PARTY_REC');
5558     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
5559     FND_MSG_PUB.ADD;
5560     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5561 END;
5562 
5563 
5564 /************************************************
5565   This procedure maps a search record from the logical
5566   record structure to the stage schema structure 
5567   for the PARTY_SITES Entity after applying 
5568   the defined transformations
5569 ************************************************/
5570 
5571 PROCEDURE MAP_PARTY_SITE_REC( 
5572     p_search_ctx IN BOOLEAN,
5573     p_search_list IN HZ_PARTY_SEARCH.party_site_list, 
5574     x_entered_max_score OUT NUMBER,
5575     x_stage_list IN OUT NOCOPY HZ_PARTY_STAGE.party_site_stage_list
5576   ) IS 
5577   l_current_max_score NUMBER;
5578   tmp VARCHAR2(4000);
5579 BEGIN
5580    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5581       hz_utility_v2pub.debug(p_message=>'Inside Calling Procedure - MAP_PARTY_SITE_REC',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5582     END IF;
5583    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5584       hz_utility_v2pub.debug(p_message=>'p_entity - PARTY_SITES',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5585     END IF;
5586   IF p_search_ctx THEN
5587    g_ps_den_only:=TRUE;
5588     x_entered_max_score:=0;
5589     FOR I IN 1..p_search_list.COUNT LOOP
5590       l_current_max_score:=0;
5591       IF l_current_max_score>x_entered_max_score THEN
5592         x_entered_max_score:=l_current_max_score;
5593       END IF;
5594     END LOOP;
5595   END IF;
5596   NULL;
5597 EXCEPTION
5598   WHEN OTHERS THEN
5599     FND_MESSAGE.SET_NAME('AR', 'HZ_TRANSFORM_PROC_ERROR');
5600     FND_MESSAGE.SET_TOKEN('PROC' , 'MAP_PARTY_SITE_REC');
5601     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
5602     FND_MSG_PUB.ADD;
5603     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5604 END;
5605 
5606 
5607 /************************************************
5608   This procedure maps a search record from the logical
5609   record structure to the stage schema structure 
5610   for the CONTACTS Entity after applying 
5611   the defined transformations
5612 ************************************************/
5613 
5614 PROCEDURE MAP_CONTACT_REC( 
5615     p_search_ctx IN BOOLEAN,
5616     p_search_list IN HZ_PARTY_SEARCH.contact_list, 
5617     x_entered_max_score OUT NUMBER,
5618     x_stage_list IN OUT NOCOPY HZ_PARTY_STAGE.contact_stage_list
5619   ) IS 
5620   l_current_max_score NUMBER;
5621   tmp VARCHAR2(4000);
5622 BEGIN
5623    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5624       hz_utility_v2pub.debug(p_message=>'Inside Calling Procedure - MAP_CONTACT_REC',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5625     END IF;
5626    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5627       hz_utility_v2pub.debug(p_message=>'p_entity - CONTACTS',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5628     END IF;
5629   IF p_search_ctx THEN
5630     x_entered_max_score:=0;
5631     FOR I IN 1..p_search_list.COUNT LOOP
5632       l_current_max_score:=0;
5633       IF l_current_max_score>x_entered_max_score THEN
5634         x_entered_max_score:=l_current_max_score;
5635       END IF;
5636     END LOOP;
5637   END IF;
5638   NULL;
5639 EXCEPTION
5640   WHEN OTHERS THEN
5641     FND_MESSAGE.SET_NAME('AR', 'HZ_TRANSFORM_PROC_ERROR');
5642     FND_MESSAGE.SET_TOKEN('PROC' , 'MAP_CONTACT_REC');
5643     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
5644     FND_MSG_PUB.ADD;
5645     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5646 END;
5647 
5648 
5649 /************************************************
5650   This procedure maps a search record from the logical
5651   record structure to the stage schema structure 
5652   for the CONTACT_POINTS Entity after applying 
5653   the defined transformations
5654 ************************************************/
5655 
5656 PROCEDURE MAP_CONTACT_POINT_REC( 
5657     p_search_ctx IN BOOLEAN,
5658     p_search_list IN HZ_PARTY_SEARCH.contact_point_list, 
5659     x_entered_max_score OUT NUMBER,
5660     x_stage_list IN OUT NOCOPY HZ_PARTY_STAGE.contact_pt_stage_list
5661   ) IS 
5662   l_current_max_score NUMBER;
5663   tmp VARCHAR2(4000);
5664 BEGIN
5665    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5666       hz_utility_v2pub.debug(p_message=>'Inside Calling Procedure - MAP_CONTACT_POINT_REC',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5667     END IF;
5668    IF fnd_log.level_statement>=fnd_log.g_current_runtime_level THEN
5669       hz_utility_v2pub.debug(p_message=>'p_entity - CONTACT_POINTS',p_module_prefix=>'dqm',p_module=>'hz_match_rule_xxx',p_prefix=>NULL,p_msg_level=>fnd_log.level_statement);
5670     END IF;
5671   IF p_search_ctx THEN
5672     x_entered_max_score:=0;
5673     FOR I IN 1..p_search_list.COUNT LOOP
5674       l_current_max_score:=0;
5675       x_stage_list(I).CONTACT_POINT_TYPE := p_search_list(I).CONTACT_POINT_TYPE;
5676       IF p_search_list(I).FLEX_FORMAT_PHONE_NUMBER IS NOT NULL THEN 
5677         l_current_max_score := l_current_max_score+20;
5678       END IF;
5679       IF p_search_list(I).EMAIL_ADDRESS IS NOT NULL THEN 
5680         l_current_max_score := l_current_max_score+20;
5681       END IF;
5682       IF l_current_max_score>x_entered_max_score THEN
5683         x_entered_max_score:=l_current_max_score;
5684       END IF;
5685     END LOOP;
5686   END IF;
5687   FOR I IN 1..p_search_list.COUNT LOOP
5688     IF p_search_ctx THEN
5689       IF p_search_list(I).EMAIL_ADDRESS IS NOT NULL THEN 
5690         x_stage_list(I).TX6 := 
5691           HZ_TRANS_PKG.CLEANSED_EMAIL(
5692              p_search_list(I).EMAIL_ADDRESS
5693              ,null,'EMAIL_ADDRESS'
5694              ,'CONTACT_POINTS','SDIB');
5695       ELSE
5696         x_stage_list(I).TX6 := '';
5697       END IF;
5698     ELSE
5699       IF p_search_list(I).EMAIL_ADDRESS IS NOT NULL THEN 
5700         tmp := HZ_TRANS_PKG.CLEANSED_EMAIL(
5701              x_stage_list(I).TX6
5702              ,null,'EMAIL_ADDRESS'
5703              ,'CONTACT_POINTS','SCORE');
5704         IF tmp IS NOT NULL THEN
5705           x_stage_list(I).TX6 := tmp;
5706         END IF;
5707       END IF;
5708     END IF;
5709   END LOOP;
5710   FOR I IN 1..p_search_list.COUNT LOOP
5711     IF p_search_ctx THEN
5712       IF p_search_list(I).EMAIL_ADDRESS IS NOT NULL THEN 
5713         x_stage_list(I).TX5 := 
5714           HZ_TRANS_PKG.EXACT_EMAIL(
5715              p_search_list(I).EMAIL_ADDRESS
5716              ,null,'EMAIL_ADDRESS'
5717              ,'CONTACT_POINTS');
5718       ELSE
5719         x_stage_list(I).TX5 := '';
5720       END IF;
5721     END IF;
5722   END LOOP;
5723   FOR I IN 1..p_search_list.COUNT LOOP
5724     IF p_search_ctx THEN
5725       IF p_search_list(I).FLEX_FORMAT_PHONE_NUMBER IS NOT NULL THEN 
5726         x_stage_list(I).TX1 := 
5727           HZ_TRANS_PKG.RM_SPLCHAR_CTX(
5728              p_search_list(I).FLEX_FORMAT_PHONE_NUMBER
5729              ,null,'FLEX_FORMAT_PHONE_NUMBER'
5730              ,'CONTACT_POINTS','SDIB');
5731       ELSE
5732         x_stage_list(I).TX1 := '';
5733       END IF;
5734     ELSE
5735       IF p_search_list(I).FLEX_FORMAT_PHONE_NUMBER IS NOT NULL THEN 
5736         tmp := HZ_TRANS_PKG.RM_SPLCHAR_CTX(
5737              x_stage_list(I).TX1
5738              ,null,'FLEX_FORMAT_PHONE_NUMBER'
5739              ,'CONTACT_POINTS','SCORE');
5740         IF tmp IS NOT NULL THEN
5741           x_stage_list(I).TX1 := tmp;
5742         END IF;
5743       END IF;
5744     END IF;
5745   END LOOP;
5746 EXCEPTION
5747   WHEN OTHERS THEN
5748     FND_MESSAGE.SET_NAME('AR', 'HZ_TRANSFORM_PROC_ERROR');
5749     FND_MESSAGE.SET_TOKEN('PROC' , 'MAP_CONTACT_POINT_REC');
5750     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
5751     FND_MSG_PUB.ADD;
5752     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5753 END;
5754 
5755 
5756 /************************************************
5757   This procedure checks if the input search criteria 
5758   is valid. It checks if : 
5759    1. At least one primary condition is passed
5760    2. Contact Point Type is not null for each condition
5761 ************************************************/
5762 
5763 FUNCTION check_prim_cond(
5764       p_party_search_rec      IN      HZ_PARTY_SEARCH.party_search_rec_type,
5765       p_party_site_list       IN      HZ_PARTY_SEARCH.party_site_list,
5766       p_contact_list          IN      HZ_PARTY_SEARCH.contact_list,
5767       p_contact_point_list    IN      HZ_PARTY_SEARCH.contact_point_list)
5768       RETURN BOOLEAN IS
5769   BEGIN
5770     FOR I IN 1..p_contact_point_list.COUNT LOOP
5771       IF p_contact_point_list(I).CONTACT_POINT_TYPE IS NULL AND (
5772 p_contact_point_list(I).FLEX_FORMAT_PHONE_NUMBER IS NOT NULL 
5773 OR p_contact_point_list(I).EMAIL_ADDRESS IS NOT NULL 
5774  ) THEN
5775         FND_MESSAGE.SET_NAME('AR', 'HZ_NO_CONTACT_POINT_TYPE');
5776         FND_MSG_PUB.ADD;
5777         RAISE FND_API.G_EXC_ERROR;
5778       END IF;
5779     END LOOP;
5780 
5781     IF p_party_search_rec.TAX_REFERENCE IS NOT NULL THEN 
5782       RETURN TRUE;
5783     END IF;
5784     FOR I IN 1..p_contact_point_list.COUNT LOOP
5785       IF p_contact_point_list(I).FLEX_FORMAT_PHONE_NUMBER IS NOT NULL THEN 
5786         RETURN TRUE;
5787       END IF;
5788     END LOOP;
5789     FOR I IN 1..p_contact_point_list.COUNT LOOP
5790       IF p_contact_point_list(I).EMAIL_ADDRESS IS NOT NULL THEN 
5791         RETURN TRUE;
5792       END IF;
5793     END LOOP;
5794     RETURN FALSE;
5795 EXCEPTION
5796   WHEN FND_API.G_EXC_ERROR THEN
5797     RAISE FND_API.G_EXC_ERROR;
5798   WHEN OTHERS THEN
5799     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
5800     FND_MESSAGE.SET_TOKEN('PROC','check_prim_cond');
5801     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
5802     FND_MSG_PUB.ADD;
5803     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5804   END check_prim_cond;
5805 
5806 /************************************************
5807   This procedure checks if the input search condition 
5808   has party site criteria. 
5809 ************************************************/
5810 
5811 PROCEDURE check_party_site_cond(
5812       p_party_site_list       IN      HZ_PARTY_SEARCH.party_site_list,
5813       p_contact_point_list    IN      HZ_PARTY_SEARCH.contact_point_list,
5814 	   x_secondary		   OUT     BOOLEAN,
5815 	   x_primary		   OUT     BOOLEAN
5816 ) IS
5817   BEGIN
5818     x_primary:= FALSE;
5819     x_secondary:= FALSE;
5820     FOR I IN 1..p_party_site_list.COUNT LOOP
5821       NULL;
5822     END LOOP;
5823     FOR I IN 1..p_contact_point_list.COUNT LOOP
5824       IF p_contact_point_list(I).FLEX_FORMAT_PHONE_NUMBER IS NOT NULL 
5825          OR p_contact_point_list(I).EMAIL_ADDRESS IS NOT NULL
5826       THEN
5827         x_primary := TRUE;
5828       END IF;
5829       EXIT WHEN x_primary;
5830     END LOOP;
5831 
5832     FOR I IN 1..p_party_site_list.COUNT LOOP
5833       NULL;
5834     END LOOP;
5835     FOR I IN 1..p_contact_point_list.COUNT LOOP
5836       IF p_contact_point_list(I).FLEX_FORMAT_PHONE_NUMBER IS NOT NULL 
5837          OR p_contact_point_list(I).EMAIL_ADDRESS IS NOT NULL
5838       THEN
5839         x_secondary := TRUE;
5840       END IF;
5841       EXIT WHEN x_secondary;
5842     END LOOP;
5843 EXCEPTION
5844   WHEN OTHERS THEN
5845     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
5846     FND_MESSAGE.SET_TOKEN('PROC','check_party_site_cond');
5847     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
5848     FND_MSG_PUB.ADD;
5849     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5850   END check_party_site_cond;
5851 
5852 /************************************************
5853   This procedure checks if the input search condition 
5854   has contact criteria. 
5855 ************************************************/
5856 
5857 PROCEDURE check_contact_cond(
5858       p_contact_list          IN      HZ_PARTY_SEARCH.contact_list,
5859       p_contact_point_list    IN      HZ_PARTY_SEARCH.contact_point_list,
5860       x_secondary             OUT     BOOLEAN,
5861       x_primary               OUT     BOOLEAN
5862 ) IS
5863   BEGIN
5864     x_primary:= FALSE;
5865     x_secondary:= FALSE;
5866     FOR I IN 1..p_contact_list.COUNT LOOP
5867       NULL;
5868     END LOOP;
5869 
5870     FOR I IN 1..p_contact_point_list.COUNT LOOP
5871       IF p_contact_point_list(I).FLEX_FORMAT_PHONE_NUMBER IS NOT NULL 
5872          OR p_contact_point_list(I).EMAIL_ADDRESS IS NOT NULL
5873       THEN
5874         x_primary := TRUE;
5875       END IF;
5876       EXIT WHEN x_primary;
5877     END LOOP;
5878 
5879     FOR I IN 1..p_contact_list.COUNT LOOP
5880       NULL;
5881     END LOOP;
5882 
5883     FOR I IN 1..p_contact_point_list.COUNT LOOP
5884       IF p_contact_point_list(I).FLEX_FORMAT_PHONE_NUMBER IS NOT NULL 
5885          OR p_contact_point_list(I).EMAIL_ADDRESS IS NOT NULL
5886       THEN
5887         x_secondary := TRUE;
5888       END IF;
5889       EXIT WHEN x_secondary;
5890     END LOOP;
5891 EXCEPTION
5892   WHEN OTHERS THEN
5893     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
5894     FND_MESSAGE.SET_TOKEN('PROC','check_contact_cond');
5895     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
5896     FND_MSG_PUB.ADD;
5897     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5898   END check_contact_cond;
5899 
5900 /************************************************
5901   This procedure checks if the input search condition 
5902   has valid contact point criteria. 
5903 ************************************************/
5904 
5905 PROCEDURE check_contact_point_cond(
5906       p_contact_point_list    IN      HZ_PARTY_SEARCH.contact_point_list,
5907       x_secondary             OUT     BOOLEAN,
5908       x_primary               OUT     BOOLEAN
5909 ) IS
5910   BEGIN
5911     x_primary:= FALSE;
5912     x_secondary:= FALSE;
5913 
5914     FOR I IN 1..p_contact_point_list.COUNT LOOP
5915       IF p_contact_point_list(I).CONTACT_POINT_TYPE IS NULL THEN 
5916         FND_MESSAGE.SET_NAME('AR', 'HZ_NO_CONTACT_POINT_TYPE');
5917         FND_MSG_PUB.ADD;
5918         RAISE FND_API.G_EXC_ERROR;
5919       END IF;
5920     END LOOP;
5921 
5922     FOR I IN 1..p_contact_point_list.COUNT LOOP
5923       IF p_contact_point_list(I).FLEX_FORMAT_PHONE_NUMBER IS NOT NULL 
5924          OR p_contact_point_list(I).EMAIL_ADDRESS IS NOT NULL 
5925       THEN
5926         x_primary := TRUE;
5927       END IF;
5928       EXIT WHEN x_primary;
5929     END LOOP;
5930     FOR I IN 1..p_contact_point_list.COUNT LOOP
5931       IF p_contact_point_list(I).FLEX_FORMAT_PHONE_NUMBER IS NOT NULL  
5932          OR p_contact_point_list(I).EMAIL_ADDRESS IS NOT NULL 
5933       THEN
5934         x_secondary := TRUE;
5935       END IF;
5936       EXIT WHEN x_secondary;
5937     END LOOP;
5938 EXCEPTION
5939   WHEN OTHERS THEN
5940     FND_MESSAGE.SET_NAME('AR', 'HZ_DQM_API_ERROR');
5941     FND_MESSAGE.SET_TOKEN('PROC','check_contact_point_cond');
5942     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM );
5943     FND_MSG_PUB.ADD;
5944     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5945   END check_contact_point_cond;
5946 
5947 FUNCTION check_staged RETURN BOOLEAN IS
5948 
5949   CURSOR c_check_staged IS 
5950     SELECT 1 FROM HZ_TRANS_FUNCTIONS_VL 
5951     WHERE nvl(STAGED_FLAG,'N') = 'N' 
5952     AND FUNCTION_ID in (
5953                 40
5954                 ,49
5955                 ,110
5956                 ,114
5957                 ,115
5958     );
5959   l_tmp NUMBER;
5960 BEGIN
5961   IF g_staged =  1 THEN
5962     RETURN TRUE;
5963   ELSIF g_staged = 0 THEN
5964     RETURN FALSE;
5965   END IF;
5966 
5967   OPEN c_check_staged;
5968   FETCH c_check_staged INTO l_tmp;
5969   IF c_check_staged%FOUND THEN
5970     CLOSE c_check_staged;
5971     g_staged := 0;
5972     RETURN FALSE;
5973   ELSE
5974     CLOSE c_check_staged;
5975     g_staged := 1;
5976     RETURN TRUE;
5977   END IF;
5978 END check_staged;
5979 
5980 -- Fix for Bug 4736139
5981 FUNCTION check_staged_var RETURN VARCHAR2 IS
5982   l_staged       VARCHAR2(1);
5983   l_staged_bool  BOOLEAN;
5984 BEGIN
5985   l_staged_bool := check_staged;
5986   IF l_staged_bool THEN
5987     l_staged := 'Y';
5988   ELSE
5989     l_staged := 'N';
5990   END IF;
5991   RETURN l_staged;
5992 END check_staged_var;
5993 -- End fix for Bug 4736139
5994 
5995 END;
5996