DBA Data[Home] [Help]

PACKAGE BODY: APPS.HZ_MATCH_RULE_240

Source


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