DBA Data[Home] [Help]

PACKAGE BODY: APPS.HZ_MATCH_RULE_98

Source


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