DBA Data[Home] [Help]

PACKAGE BODY: APPS.HZ_DQM_SYNC

Source


1 PACKAGE BODY hz_dqm_sync AS
2 /* $Header: ARHDQSNB.pls 120.57.12020000.2 2012/07/19 10:06:22 ajaising ship $ */
3 
4 --------------------------------------------------------------------------------
5 -- Note that when this profile option is not set, the default value is Y
6 -- i.e., SYNC is assumed to be in REALTIME.
7 -- Need to look into the impact of this, for customers who do not need DQM out of the box.
8 ---------------------------------------------------------------------------------
9 L_REALTIME_SYNC_VALUE VARCHAR2(15) := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
10 
11 
12 PROCEDURE  REALTIME_SYNC_INDEXES(i_party IN boolean,
13 i_party_sites IN boolean,
14 i_contacts IN boolean,
15 i_contact_points IN boolean
16 ) ;
17 
18 
19 PROCEDURE insert_interface_rec (
20         p_party_id      IN      NUMBER,
21         p_record_id     IN      NUMBER,
22         p_party_site_id IN      NUMBER,
23         p_org_contact_id IN     NUMBER,
24         p_entity        IN      VARCHAR2,
25         p_operation     IN      VARCHAR2,
26 	p_staged_flag   IN      VARCHAR2 DEFAULT 'N'
27 );
28 PROCEDURE out(
29    message      IN      VARCHAR2,
30    newline      IN      BOOLEAN DEFAULT TRUE);
31 
32 PROCEDURE log(
33    message      IN      VARCHAR2,
34    newline      IN      BOOLEAN DEFAULT TRUE);
35 
36 PROCEDURE outandlog(
37    message      IN      VARCHAR2,
38    newline      IN      BOOLEAN DEFAULT TRUE);
39 
40 FUNCTION logerror(SQLERRM VARCHAR2 DEFAULT NULL)
41          RETURN VARCHAR2;
42 
43 FUNCTION check_for_transaction RETURN VARCHAR2;
44 
45 g_commit_counter NUMBER := 1;
46 
47 -- VJN INTRODUCED FOR SYNC FUNCTIONALITY IN R12
48 
49 -- This will take a request id and return TRUE if the concurrent program
50 -- is either Running or Pending
51 FUNCTION is_conc_complete ( p_request_id IN NUMBER) RETURN BOOLEAN ;
52 
53 FUNCTION is_sync_success
54   (p_entity IN VARCHAR2
55   ,p_record_id IN NUMBER
56   ,p_party_id IN NUMBER
57   ) RETURN BOOLEAN ;
58 
59 -- Will submit a concurrent request to call the Serial Sync Index Concurrent Program
60 PROCEDURE call_sync_index_serial IS
61   l_sub_request         NUMBER ;
62   l_ignore_conc_limits  VARCHAR2(80);
63   l_conc_req_limit      VARCHAR2(80);
64 BEGIN
65   -- Fix for bug 5061761.
66   -- Check for Profile Value to decide if conc req limit per user can be ignored.
67   l_ignore_conc_limits := nvl(FND_PROFILE.VALUE('HZ_DQM_IGNORE_CONC_LIMITS'), 'N');
68   IF l_ignore_conc_limits = 'Y' THEN
69      l_conc_req_limit := nvl(FND_PROFILE.VALUE('CONC_REQUEST_LIMIT'), '0');
70      IF l_conc_req_limit <> '0' THEN
71        FND_PROFILE.PUT (
72          NAME => 'CONC_REQUEST_LIMIT',
73          VAL  => NULL
74        );
75      END IF;
76     l_sub_request :=  FND_REQUEST.SUBMIT_REQUEST(
77                         'AR',
78                         'ARHDQMSS',
79                         'DQM Serial Sync Index Program',
80                         NULL,
81                         FALSE
82                       );
83     FND_PROFILE.PUT (
84       NAME => 'CONC_REQUEST_LIMIT',
85       VAL  => l_conc_req_limit
86     );
87   ELSE
88     l_sub_request :=  FND_REQUEST.SUBMIT_REQUEST(
89                         'AR',
90                         'ARHDQMSS',
91                         'DQM Serial Sync Index Program',
92                         NULL,
93                         FALSE
94                       );
95   END IF;
96 
97 EXCEPTION WHEN OTHERS THEN
98   NULL ;
99 END ;
100 
101 PROCEDURE insert_into_interface(p_party_id	IN	NUMBER
102 )  IS
103 l_char NUMBER;
104 BEGIN
105  -- check if record already exists in HZ_DQM_SYNC_INTERFACE
106 	BEGIN
107             select 'Y' into l_char
108             from hz_dqm_sync_interface
109             where party_id = p_party_id
110             and entity = 'PARTY'
111             and staged_flag in ('N', 'Y')
112 	    and rownum = 1;
113 	EXCEPTION WHEN NO_DATA_FOUND THEN
114              insert_interface_rec (p_party_id, null, null, null, 'PARTY', 'U', 'Y');
115 	END;
116 EXCEPTION WHEN others THEN
117    NULL;
118 END insert_into_interface;
119 
120 -- REPURI. Bug 4884742. Introduced this function to check if Shadow Staging completely succesfully.
121 -- This function would return TRUE if the shadow staging program has run successfully
122 
123 FUNCTION is_shadow_staging_complete RETURN BOOLEAN
124 IS
125   l_num            NUMBER;
126   func_ret_status  BOOLEAN := FALSE;
127 
128   CURSOR c_sh_stage_log_count IS
129     SELECT 1
130     FROM hz_dqm_stage_log
131     WHERE operation = 'SHADOW_STAGING'
132     AND STEP = 'COMPLETE';
133 
134 BEGIN
135   OPEN c_sh_stage_log_count;
136   FETCH c_sh_stage_log_count INTO l_num;
137   IF c_sh_stage_log_count%FOUND THEN
138     func_ret_status := TRUE;
139   END IF;
140   CLOSE c_sh_stage_log_count;
141 
142   RETURN func_ret_status;
143 EXCEPTION WHEN OTHERS THEN
144   RETURN func_ret_status;
145 END is_shadow_staging_complete;
146 
147 
148 PROCEDURE set_to_batch_sync
149 IS
150 BEGIN
151    L_REALTIME_SYNC_VALUE := 'N' ;
152 END set_to_batch_sync;
153 
154 FUNCTION is_prof_enable_for_sync
155 RETURN BOOLEAN
156 IS
157 l_prof VARCHAR2(1);
158 BEGIN
159     l_prof := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
160     IF (l_prof = 'Y') THEN
161         RETURN TRUE;
162     ELSE
163         RETURN FALSE;
164     END IF;
165     EXCEPTION WHEN OTHERS THEN
166         RETURN FALSE;
167 END is_prof_enable_for_sync;
168 
169 PROCEDURE sync_index_realtime(
170         p_index_name            IN     VARCHAR2,
171         retcode                 OUT    NOCOPY VARCHAR2,
172         err                     OUT    NOCOPY VARCHAR2) IS
173 
174 cursor l_party_cur is select rowid, party_id, record_id
175             from hz_dqm_sync_interface a
176             where a.staged_flag = 'Y'
177             and a.entity = 'PARTY' AND REALTIME_SYNC_FLAG='Y';
178 cursor l_ps_cur is select rowid, party_id, record_id
179                 from hz_dqm_sync_interface a
180                 where a.staged_flag = 'Y'
181                 and a.entity = 'PARTY_SITES' AND REALTIME_SYNC_FLAG='Y';
182 cursor l_ct_cur is select rowid, party_id, record_id
183                 from hz_dqm_sync_interface a
184                 where a.staged_flag = 'Y'
185                 and entity = 'CONTACTS'  AND REALTIME_SYNC_FLAG='Y';
186 cursor l_cp_cur is select rowid, party_id, record_id
187                 from hz_dqm_sync_interface a
188                 where a.staged_flag = 'Y'
189                 and entity = 'CONTACT_POINTS' AND REALTIME_SYNC_FLAG='Y';
190 
191 l_limit NUMBER := 1000;
192 TYPE RowList IS TABLE OF VARCHAR2(255);
193 L_ROWID RowList;
194 TYPE NumberList IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
195 L_PARTY_ID NumberList;
196 L_RECORD_ID NumberList;
197 l_last_fetch BOOLEAN := FALSE;
198 l_index_name VARCHAR2(100);
199 
200 BEGIN
201   retcode := 0;
202   err := null;
203   l_index_name := lower(p_index_name);
204   IF (INSTRB(l_index_name,'hz_stage_parties_t1') > 0) THEN
205      ad_ctx_Ddl.Sync_Index ( p_index_name );
206      OPEN l_party_cur;
207      LOOP
208          FETCH l_party_cur BULK COLLECT INTO
209            L_ROWID
210            , L_PARTY_ID
211            , L_RECORD_ID  LIMIT l_limit;
212          IF l_party_cur%NOTFOUND THEN
213              l_last_fetch:=TRUE;
214          END IF;
215          IF L_PARTY_ID.COUNT=0 AND l_last_fetch THEN
216              EXIT;
217          END IF;
218          FORALL I in L_PARTY_ID.FIRST..L_PARTY_ID.LAST
219              update hz_staged_parties a set concat_col = concat_col
220               where a.party_id = L_PARTY_ID(I);
221          FORALL I in L_PARTY_ID.FIRST..L_PARTY_ID.LAST
222              delete from hz_dqm_sync_interface
223               where rowid = L_ROWID(I);
224          ad_ctx_Ddl.Sync_Index ( p_index_name );
225          IF l_last_fetch THEN
226              EXIT;
227          END IF;
228          FND_CONCURRENT.AF_Commit;
229       END LOOP;
230       CLOSE l_party_cur;
231   ELSIF (INSTRB(l_index_name,'hz_stage_party_sites_t1') > 0) THEN
232      ad_ctx_Ddl.Sync_Index ( p_index_name );
233      OPEN l_ps_cur;
234      LOOP
235          FETCH l_ps_cur BULK COLLECT INTO
236              L_ROWID
237            , L_PARTY_ID
238            , L_RECORD_ID  LIMIT l_limit;
239          IF l_ps_cur%NOTFOUND THEN
240              l_last_fetch:=TRUE;
241          END IF;
242          IF L_RECORD_ID.COUNT=0 AND l_last_fetch THEN
243              EXIT;
244          END IF;
245          FORALL I in L_RECORD_ID.FIRST..L_RECORD_ID.LAST
246                update hz_staged_party_sites a set concat_col = concat_col
247                 where a.party_site_id = L_RECORD_ID(I);
248          FORALL I in L_RECORD_ID.FIRST..L_RECORD_ID.LAST
249                delete from hz_dqm_sync_interface
250                 where rowid = L_ROWID(I);
251         ad_ctx_Ddl.Sync_Index ( p_index_name );
252          IF l_last_fetch THEN
253              EXIT;
254          END IF;
255          FND_CONCURRENT.AF_Commit;
256       END LOOP;
257       CLOSE l_ps_cur;
258   ELSIF (INSTRB(l_index_name,'hz_stage_contact_t1') > 0) THEN
259       ad_ctx_Ddl.Sync_Index ( p_index_name );
260       OPEN l_ct_cur;
261       LOOP
262          FETCH l_ct_cur BULK COLLECT INTO
263              L_ROWID
264            , L_PARTY_ID
265            , L_RECORD_ID  LIMIT l_limit;
266          IF l_ct_cur%NOTFOUND THEN
267              l_last_fetch:=TRUE;
268          END IF;
269          IF L_RECORD_ID.COUNT=0 AND l_last_fetch THEN
270              EXIT;
271          END IF;
272          FORALL I in L_RECORD_ID.FIRST..L_RECORD_ID.LAST
273                 update hz_staged_contacts a set concat_col = concat_col
274                  where a.org_contact_id  = L_RECORD_ID(I);
275          FORALL I in L_RECORD_ID.FIRST..L_RECORD_ID.LAST
276                delete from hz_dqm_sync_interface
277                 where rowid = L_ROWID(I);
278         ad_ctx_Ddl.Sync_Index ( p_index_name );
279          IF l_last_fetch THEN
280              EXIT;
281          END IF;
282          FND_CONCURRENT.AF_Commit;
283       END LOOP;
284       CLOSE l_ct_cur;
285  ELSIF (INSTRB(l_index_name,'hz_stage_cpt_t1') > 0) THEN
286      ad_ctx_Ddl.Sync_Index ( p_index_name );
287      OPEN l_cp_cur;
288      LOOP
289          FETCH l_cp_cur BULK COLLECT INTO
290              L_ROWID
291            , L_PARTY_ID
292            , L_RECORD_ID  LIMIT l_limit;
293          IF l_cp_cur%NOTFOUND THEN
294             l_last_fetch:=TRUE;
295          END IF;
296          IF L_RECORD_ID.COUNT=0 AND l_last_fetch THEN
297              EXIT;
298          END IF;
299          FORALL I in L_RECORD_ID.FIRST..L_RECORD_ID.LAST
300                update hz_staged_contact_points a set concat_col = concat_col
301                 where a.contact_point_id  = L_RECORD_ID(I);
302          FORALL I in L_RECORD_ID.FIRST..L_RECORD_ID.LAST
303                delete from hz_dqm_sync_interface
304                 where rowid = L_ROWID(I);
305          ad_ctx_Ddl.Sync_Index ( p_index_name );
306          IF l_last_fetch THEN
307              EXIT;
308          END IF;
309          FND_CONCURRENT.AF_Commit;
310       END LOOP;
311       CLOSE l_cp_cur;
312   END IF;
313   --Call to sync index
314 END sync_index_realtime;
315 
316 
317 
318 PROCEDURE sync_index(
319         p_index_name            IN     VARCHAR2,
320         retcode                 OUT    NOCOPY VARCHAR2,
321         err                     OUT    NOCOPY VARCHAR2) IS
322 
323 cursor l_party_cur is select rowid, party_id, record_id
324             from hz_dqm_sync_interface a
325             where a.staged_flag = 'Y'
326             and a.entity = 'PARTY';
327 cursor l_ps_cur is select rowid, party_id, record_id
328                 from hz_dqm_sync_interface a
329                 where a.staged_flag = 'Y'
330                 and a.entity = 'PARTY_SITES';
331 cursor l_ct_cur is select rowid, party_id, record_id
332                 from hz_dqm_sync_interface a
333                 where a.staged_flag = 'Y'
334                 and entity = 'CONTACTS' ;
335 cursor l_cp_cur is select rowid, party_id, record_id
336                 from hz_dqm_sync_interface a
337                 where a.staged_flag = 'Y'
338                 and entity = 'CONTACT_POINTS';
339 
340 l_limit NUMBER := 1000;
341 TYPE RowList IS TABLE OF VARCHAR2(255);
342 L_ROWID RowList;
343 TYPE NumberList IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
344 L_PARTY_ID NumberList;
345 L_RECORD_ID NumberList;
346 l_last_fetch BOOLEAN := FALSE;
347 l_index_name VARCHAR2(100);
348 
349 BEGIN
350   retcode := 0;
351   err := null;
352   l_index_name := lower(p_index_name);
353   IF (INSTRB(l_index_name,'hz_stage_parties_t1') > 0) THEN
354      ad_ctx_Ddl.Sync_Index ( p_index_name );
355      OPEN l_party_cur;
356      LOOP
357          FETCH l_party_cur BULK COLLECT INTO
358            L_ROWID
359            , L_PARTY_ID
360            , L_RECORD_ID  LIMIT l_limit;
361          IF l_party_cur%NOTFOUND THEN
362              l_last_fetch:=TRUE;
363          END IF;
364          IF L_PARTY_ID.COUNT=0 AND l_last_fetch THEN
365              EXIT;
366          END IF;
367          FORALL I in L_PARTY_ID.FIRST..L_PARTY_ID.LAST
368              update hz_staged_parties a set concat_col = concat_col
369               where a.party_id = L_PARTY_ID(I);
370          FORALL I in L_PARTY_ID.FIRST..L_PARTY_ID.LAST
371              delete from hz_dqm_sync_interface
372               where rowid = L_ROWID(I);
373 	 ad_ctx_Ddl.Sync_Index ( p_index_name );
374          IF l_last_fetch THEN
375              EXIT;
376          END IF;
377          FND_CONCURRENT.AF_Commit;
378       END LOOP;
379       CLOSE l_party_cur;
380   ELSIF (INSTRB(l_index_name,'hz_stage_party_sites_t1') > 0) THEN
381      ad_ctx_Ddl.Sync_Index ( p_index_name );
382      OPEN l_ps_cur;
383      LOOP
384          FETCH l_ps_cur BULK COLLECT INTO
385              L_ROWID
386            , L_PARTY_ID
387            , L_RECORD_ID  LIMIT l_limit;
388          IF l_ps_cur%NOTFOUND THEN
389              l_last_fetch:=TRUE;
390          END IF;
391          IF L_RECORD_ID.COUNT=0 AND l_last_fetch THEN
392              EXIT;
393          END IF;
394          FORALL I in L_RECORD_ID.FIRST..L_RECORD_ID.LAST
395                update hz_staged_party_sites a set concat_col = concat_col
396                 where a.party_site_id = L_RECORD_ID(I);
397          FORALL I in L_RECORD_ID.FIRST..L_RECORD_ID.LAST
398                delete from hz_dqm_sync_interface
399                 where rowid = L_ROWID(I);
400         ad_ctx_Ddl.Sync_Index ( p_index_name );
401          IF l_last_fetch THEN
402              EXIT;
403          END IF;
404          FND_CONCURRENT.AF_Commit;
405       END LOOP;
406       CLOSE l_ps_cur;
407   ELSIF (INSTRB(l_index_name,'hz_stage_contact_t1') > 0) THEN
408       ad_ctx_Ddl.Sync_Index ( p_index_name );
409       OPEN l_ct_cur;
410       LOOP
411          FETCH l_ct_cur BULK COLLECT INTO
412              L_ROWID
413            , L_PARTY_ID
414            , L_RECORD_ID  LIMIT l_limit;
415          IF l_ct_cur%NOTFOUND THEN
416              l_last_fetch:=TRUE;
417          END IF;
418          IF L_RECORD_ID.COUNT=0 AND l_last_fetch THEN
419              EXIT;
420          END IF;
421          FORALL I in L_RECORD_ID.FIRST..L_RECORD_ID.LAST
422                 update hz_staged_contacts a set concat_col = concat_col
423                  where a.org_contact_id  = L_RECORD_ID(I);
424          FORALL I in L_RECORD_ID.FIRST..L_RECORD_ID.LAST
425                delete from hz_dqm_sync_interface
426                 where rowid = L_ROWID(I);
427         ad_ctx_Ddl.Sync_Index ( p_index_name );
428          IF l_last_fetch THEN
429              EXIT;
430          END IF;
431          FND_CONCURRENT.AF_Commit;
432       END LOOP;
433       CLOSE l_ct_cur;
434  ELSIF (INSTRB(l_index_name,'hz_stage_cpt_t1') > 0) THEN
435      ad_ctx_Ddl.Sync_Index ( p_index_name );
436      OPEN l_cp_cur;
437      LOOP
438          FETCH l_cp_cur BULK COLLECT INTO
439              L_ROWID
440            , L_PARTY_ID
441            , L_RECORD_ID  LIMIT l_limit;
442          IF l_cp_cur%NOTFOUND THEN
443             l_last_fetch:=TRUE;
444          END IF;
445          IF L_RECORD_ID.COUNT=0 AND l_last_fetch THEN
446              EXIT;
447          END IF;
448          FORALL I in L_RECORD_ID.FIRST..L_RECORD_ID.LAST
449                update hz_staged_contact_points a set concat_col = concat_col
450                 where a.contact_point_id  = L_RECORD_ID(I);
451          FORALL I in L_RECORD_ID.FIRST..L_RECORD_ID.LAST
452                delete from hz_dqm_sync_interface
453                 where rowid = L_ROWID(I);
454          ad_ctx_Ddl.Sync_Index ( p_index_name );
455          IF l_last_fetch THEN
456              EXIT;
457          END IF;
458          FND_CONCURRENT.AF_Commit;
459       END LOOP;
460       CLOSE l_cp_cur;
461   END IF;
462   --Call to sync index
463 EXCEPTION
464   WHEN OTHERS THEN
465     retcode :=  2;
466     err := SQLERRM;
467     log ('Error:' || SQLERRM);
468 END sync_index;
469 
470 
471 PROCEDURE optimize_index(
472         p_index_name            IN           VARCHAR2,
473         p_level                 IN           VARCHAR2,
474         p_max_time              IN           NUMBER,
475         retcode                 OUT NOCOPY   VARCHAR2,
476         err                     OUT NOCOPY    VARCHAR2) IS
477 l_max_time NUMBER ;
478 BEGIN
479 
480   retcode := 0;
481   err := null;
482 
483    IF (p_max_time <> null) THEN
484     l_max_time := to_number(p_max_time);
485  ELSE
486     l_max_time := null;
487   END IF;
488 
489   --Call to optimize index
490   ad_ctx_Ddl.Optimize_Index( p_index_name, p_level, l_max_time, null);
491  EXCEPTION
492   WHEN OTHERS THEN
493 /*    retcode :=  1;
494     err := SQLERRM; */
495    null;
496 END optimize_index;
497 
498 
499 FUNCTION is_sync_success (
500     p_entity      IN   VARCHAR2
501    ,p_record_id   IN   NUMBER
502    ,p_party_id    IN   NUMBER
503  ) RETURN BOOLEAN IS
504   CURSOR c_entity_sync_err (p_entity IN VARCHAR2, p_record_id IN NUMBER) IS
505     SELECT 1 from hz_dqm_sync_interface
506     WHERE entity       = p_entity
507     AND   record_id    = p_record_id
508     AND   staged_flag  = 'E';
509 
510   CURSOR c_party_sync_err (p_entity IN VARCHAR2, p_party_id IN NUMBER) IS
511     SELECT 1 from hz_dqm_sync_interface
512     WHERE entity       = p_entity
513     AND   party_id     = p_party_id
514     AND   staged_flag  = 'E';
515 
516   l_num     NUMBER;
517   x_status  BOOLEAN  := TRUE;
518 BEGIN
519   IF p_entity = 'PARTY' THEN
520     OPEN c_party_sync_err (p_entity, p_party_id);
521     FETCH c_party_sync_err INTO l_num;
522     IF c_party_sync_err%FOUND THEN
523       x_status := FALSE;
524     END IF;
525     CLOSE c_party_sync_err;
526   ELSE
527     OPEN c_entity_sync_err (p_entity, p_record_id);
528     FETCH c_entity_sync_err INTO l_num;
529     IF  c_entity_sync_err%FOUND THEN
530       x_status := FALSE;
531     END IF;
532     CLOSE c_entity_sync_err;
533   END IF;
534   RETURN x_status;
535 EXCEPTION
536   WHEN OTHERS THEN
537     IF c_entity_sync_err%ISOPEN THEN
538       CLOSE c_entity_sync_err;
539     END IF;
540     IF c_party_sync_err%ISOPEN THEN
541       CLOSE c_party_sync_err;
542     END IF;
543     x_status := TRUE;
544     RETURN x_status;
545 
546 END is_sync_success;
547 
548 
549 PROCEDURE sync_org (
550   p_party_id     IN   NUMBER,
551   p_create_upd   IN   VARCHAR2
552 ) IS
553   l_sql_err_message  VARCHAR2(2000);
554 BEGIN
555   L_REALTIME_SYNC_VALUE := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
556   IF ( L_REALTIME_SYNC_VALUE = 'Y') THEN
557     -- REPURI. SYNC Perf Improvements. Insert directly into staging tables
558     HZ_STAGE_MAP_TRANSFORM.sync_single_party_online(p_party_id, p_create_upd);
559     --Check if sync went through successfully
560     IF (is_sync_success('PARTY',null,p_party_id)) THEN
561       -- Call sync index serial concurrent program
562       call_sync_index_serial ;
563     END IF;
564   ELSIF ( L_REALTIME_SYNC_VALUE = 'N') THEN
565     insert_interface_rec(p_party_id,null,null,null,'PARTY',p_create_upd);
566     --  REPURI. Bug 4884742. Added this to insert data into hz_dqm_sh_sync_interface table
567     --  if shadow staging conc prog completed successfully.
568     IF (is_shadow_staging_complete) THEN
569       insert_sh_interface_rec(p_party_id,null,null,null,'PARTY',p_create_upd);
570     END IF;
571   END IF;
572 EXCEPTION
573   WHEN OTHERS THEN
574     hz_common_pub.enable_cont_source_security;
575     FND_MESSAGE.SET_NAME('AR', 'HZ_SYNC_SQL_EXCEP');
576     FND_MESSAGE.SET_TOKEN('PROC','sync_org');
577     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
578     FND_MSG_PUB.ADD;
579     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
580 END sync_org;
581 
582 
583 PROCEDURE sync_person (
584   p_party_id      IN      NUMBER,
585   p_create_upd    IN      VARCHAR2
586 ) IS
587     l_org_contact_id NUMBER;
588     l_sql_err_message VARCHAR2(2000);
589 
590     CURSOR c_contact IS
591       SELECT oc.org_contact_id
592       FROM  HZ_RELATIONSHIPS pr, HZ_ORG_CONTACTS oc
593       WHERE pr.relationship_id    = oc.party_relationship_id
594       AND   pr.subject_id         = p_party_id
595       AND   pr.subject_table_name = 'HZ_PARTIES'
596       AND   pr.object_table_name  = 'HZ_PARTIES'
597       AND   pr.directional_flag   = 'F';
598 BEGIN
599   L_REALTIME_SYNC_VALUE := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
600   IF (L_REALTIME_SYNC_VALUE = 'Y') THEN
601     -- REPURI. SYNC Perf Improvements. Insert directly into staging tables
602     HZ_STAGE_MAP_TRANSFORM.sync_single_party_online(p_party_id, p_create_upd);
603     --Check if sync went through successfully
604     IF (is_sync_success('PARTY',null,p_party_id)) THEN
605       -- Call sync index serial concurrent program
606       call_sync_index_serial ;
607     END IF;
608   ELSIF ( L_REALTIME_SYNC_VALUE = 'N') THEN
609     insert_interface_rec(p_party_id,null,null,null,'PARTY',p_create_upd);
610     --  REPURI. Bug 4884742. Added this to insert data into hz_dqm_sh_sync_interface table
611     --  if shadow staging conc prog completed successfully.
612     IF (is_shadow_staging_complete) THEN
613       insert_sh_interface_rec(p_party_id,null,null,null,'PARTY',p_create_upd);
614     END IF;
615     IF p_create_upd = 'U' THEN
616       OPEN c_contact;
617       LOOP
618         FETCH c_contact INTO l_org_contact_id;
619         EXIT WHEN c_contact%NOTFOUND;
620         insert_interface_rec(p_party_id,l_org_contact_id,null,null,'CONTACTS','U');
621     --  REPURI. Bug 4884742. Added this to insert data into hz_dqm_sh_sync_interface table
622     --  if shadow staging conc prog completed successfully.
623         IF (is_shadow_staging_complete) THEN
624           insert_sh_interface_rec(p_party_id,l_org_contact_id,null,null,'CONTACTS','U');
625         END IF;
626       END LOOP;
627     END IF ;
628   END IF;
629 EXCEPTION
630   WHEN OTHERS THEN
631     FND_MESSAGE.SET_NAME('AR', 'HZ_SYNC_SQL_EXCEP');
632     FND_MESSAGE.SET_TOKEN('PROC','sync_person');
633     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
634     FND_MSG_PUB.ADD;
635     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
636 END sync_person;
637 
638 
639 PROCEDURE sync_party_site (
640   p_party_site_id   IN   NUMBER,
641   p_create_upd      IN   VARCHAR2
642 ) IS
643   l_party_id         NUMBER;
644   l_party_id1        NUMBER;
645   l_org_contact_id   NUMBER;
646   l_party_type       VARCHAR2(255);
647   l_sql_err_message  VARCHAR2(2000) ;
648 BEGIN
649   L_REALTIME_SYNC_VALUE := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
650   IF (L_REALTIME_SYNC_VALUE = 'Y') THEN
651     -- REPURI. SYNC Perf Improvements. Insert directly into staging tables
652     HZ_STAGE_MAP_TRANSFORM.sync_single_party_site_online(p_party_site_id, p_create_upd);
653     --Check if sync went through successfully
654     IF (is_sync_success('PARTY_SITES',p_party_site_id,null)) THEN
655       -- Call sync index serial concurrent program
656       call_sync_index_serial ;
657     END IF;
658   ELSIF (L_REALTIME_SYNC_VALUE = 'N') THEN
659     BEGIN
660       SELECT ps.party_id,p.party_type INTO l_party_id, l_party_type
661       FROM HZ_PARTY_SITES ps, HZ_PARTIES p
662       WHERE party_site_id = p_party_site_id
663       AND p.PARTY_ID = ps.PARTY_ID;
664     EXCEPTION
665       /* Bug No: 2707873. Added this exception because the above sql
666          will not retrive any record for party_id -1. */
667       WHEN NO_DATA_FOUND THEN
668         RETURN;
669     END;
670     IF l_party_type = 'PARTY_RELATIONSHIP' THEN
671       BEGIN
672         SELECT r.object_id, org_contact_id INTO l_party_id1,l_org_contact_id
673         FROM HZ_ORG_CONTACTS oc, HZ_RELATIONSHIPS r
674         WHERE r.party_id = l_party_id
675         AND r.relationship_id = oc.party_relationship_id
676         AND r.directional_flag='F'
677         AND r.SUBJECT_TABLE_NAME = 'HZ_PARTIES'
678         AND r.OBJECT_TABLE_NAME = 'HZ_PARTIES';
679       EXCEPTION
680         WHEN NO_DATA_FOUND THEN
681           RETURN;
682       END;
683     ELSE
684       l_party_id1:=l_party_id;
685       l_org_contact_id:=NULL;
686     END IF;
687     insert_interface_rec(l_party_id1,p_party_site_id,null,l_org_contact_id,'PARTY_SITES',p_create_upd);
688     --  REPURI. Bug 4884742. Added this to insert data into hz_dqm_sh_sync_interface table
689     --  if shadow staging conc prog completed successfully.
690     IF (is_shadow_staging_complete) THEN
691       insert_sh_interface_rec(l_party_id1,p_party_site_id,null,l_org_contact_id,'PARTY_SITES',p_create_upd);
692     END IF;
693   END IF;
694 EXCEPTION
695   WHEN OTHERS THEN
696     hz_common_pub.enable_cont_source_security;
697     FND_MESSAGE.SET_NAME('AR', 'HZ_SYNC_SQL_EXCEP');
698     FND_MESSAGE.SET_TOKEN('PROC','sync_party_site');
699     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
700     FND_MSG_PUB.ADD;
701     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
702 END sync_party_site;
703 
704 
705 PROCEDURE sync_contact (
706   p_org_contact_id   IN   NUMBER,
707   p_create_upd       IN   VARCHAR2
708 ) IS
709   l_party_id NUMBER;
710   l_sql_err_message VARCHAR2(2000);
711 BEGIN
712   L_REALTIME_SYNC_VALUE := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
713   IF (L_REALTIME_SYNC_VALUE = 'Y') THEN
714     -- REPURI. SYNC Perf Improvements. Insert directly into staging tables
715     HZ_STAGE_MAP_TRANSFORM.sync_single_contact_online(p_org_contact_id, p_create_upd);
716     --Check if sync went through successfully
717     IF (is_sync_success('CONTACTS',p_org_contact_id,null)) THEN
718       -- Call sync index serial concurrent program
719       call_sync_index_serial ;
720     END IF;
721   ELSIF ( L_REALTIME_SYNC_VALUE = 'N') THEN
722     IF (p_create_upd <> 'D') THEN
723 	SELECT r.object_id INTO l_party_id
724 	    FROM HZ_ORG_CONTACTS oc, HZ_RELATIONSHIPS r
725 	    WHERE oc.org_contact_id = p_org_contact_id
726 	    AND oc.party_relationship_id =  r.relationship_id
727 	    AND r.SUBJECT_TABLE_NAME = 'HZ_PARTIES'
728 	    AND r.OBJECT_TABLE_NAME = 'HZ_PARTIES'
729 	    AND subject_type ='PERSON'
730 	    AND DIRECTIONAL_FLAG= 'F'
731 	    AND (oc.status is null OR oc.status = 'A' or oc.status = 'I')
732 	    AND (r.status is null OR r.status = 'A' or r.status = 'I') ;
733     ELSIF (p_create_upd = 'D') THEN
734 	    SELECT r.object_id INTO l_party_id
735 	    FROM HZ_ORG_CONTACTS oc, HZ_RELATIONSHIPS r
736 	    WHERE oc.org_contact_id = p_org_contact_id
737 	    AND oc.party_relationship_id =  r.relationship_id
738 	    AND r.SUBJECT_TABLE_NAME = 'HZ_PARTIES'
739 	    AND r.OBJECT_TABLE_NAME = 'HZ_PARTIES'
740 	    AND subject_type ='PERSON'
741 	    AND DIRECTIONAL_FLAG= 'F';
742     END IF;
743 
744     insert_interface_rec(l_party_id,p_org_contact_id,null,null,'CONTACTS',p_create_upd);
745     --  REPURI. Bug 4884742. Added this to insert data into hz_dqm_sh_sync_interface table
746     --  if shadow staging conc prog completed successfully.
747     IF (is_shadow_staging_complete) THEN
748        insert_sh_interface_rec(l_party_id,p_org_contact_id,null,null,'CONTACTS',p_create_upd);
749     END IF;
750   END IF;
751 EXCEPTION
752   WHEN NO_DATA_FOUND THEN
753     NULL;
754   WHEN OTHERS THEN
755     hz_common_pub.enable_cont_source_security;
756     FND_MESSAGE.SET_NAME('AR', 'HZ_SYNC_SQL_EXCEP');
757     FND_MESSAGE.SET_TOKEN('PROC','sync_contact');
758     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
759     FND_MSG_PUB.ADD;
760     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
761 END sync_contact;
762 
763 
764 PROCEDURE sync_contact_point (
765   p_contact_point_id   IN   NUMBER,
766   p_create_upd         IN   VARCHAR2
767 ) IS
768   l_party_id         NUMBER := 0;
769   l_party_id1        NUMBER;
770   l_org_contact_id   NUMBER;
771   l_party_site_id    NUMBER;
772   l_pr_id            NUMBER;
773   l_num_ocs          NUMBER;
774   l_ot_id            NUMBER;
775   l_ot_table         VARCHAR2(60);
776   l_party_type       VARCHAR2(60);
777   l_sql_err_message  VARCHAR2(2000);
778 BEGIN
779   l_party_id := 0;
780   L_REALTIME_SYNC_VALUE := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
781   IF (L_REALTIME_SYNC_VALUE = 'Y') THEN
782     -- REPURI. SYNC Perf Improvements. Insert directly into staging tables
783     HZ_STAGE_MAP_TRANSFORM.sync_single_cpt_online(p_contact_point_id, p_create_upd);
784     --Check if sync went through successfully
785     IF (is_sync_success('CONTACT_POINTS',p_contact_point_id,null)) THEN
786       -- Call sync index serial concurrent program
787       call_sync_index_serial ;
788     END IF;
789   ELSIF ( L_REALTIME_SYNC_VALUE = 'N') THEN
790     SELECT owner_table_name,owner_table_id INTO l_ot_table, l_ot_id
791     FROM hz_contact_points
792     WHERE contact_point_id = p_contact_point_id;
793 
794     IF l_ot_table = 'HZ_PARTY_SITES' THEN
795       SELECT p.party_id, ps.party_site_id, party_type
796         INTO l_party_id1, l_party_site_id, l_party_type
797       FROM HZ_PARTY_SITES ps, HZ_PARTIES p
798       WHERE party_site_id = l_ot_id
799       AND   p.party_id    = ps.party_id;
800 
801       IF l_party_type = 'PARTY_RELATIONSHIP' THEN
802         BEGIN
803           SELECT r.object_id, org_contact_id INTO l_party_id,l_org_contact_id
804           FROM HZ_ORG_CONTACTS oc, HZ_RELATIONSHIPS r
805           WHERE r.party_id = l_party_id1
806           AND r.relationship_id = oc.party_relationship_id
807           AND r.directional_flag='F'
808           AND r.SUBJECT_TABLE_NAME = 'HZ_PARTIES'
809           AND r.OBJECT_TABLE_NAME = 'HZ_PARTIES';
810         EXCEPTION
811           WHEN NO_DATA_FOUND THEN
812            RETURN;
813         END;
814       ELSE
815         l_party_id:=l_party_id1;
816         l_org_contact_id:=NULL;
817       END IF;
818     ELSIF l_ot_table = 'HZ_PARTIES' THEN
819       l_party_site_id := NULL;
820       SELECT party_type INTO l_party_type
821       FROM hz_parties
822       WHERE party_id = l_ot_id;
823 
824       IF l_party_type <> 'PARTY_RELATIONSHIP' THEN
825         l_party_id := l_ot_id;
826         l_org_contact_id:=NULL;
827       ELSE
828         BEGIN
829           SELECT r.object_id, org_contact_id INTO l_party_id,l_org_contact_id
830           FROM HZ_ORG_CONTACTS oc, HZ_RELATIONSHIPS r
831           WHERE r.party_id = l_ot_id
832           AND r.relationship_id = oc.party_relationship_id
833           AND r.directional_flag='F'
834           AND r.SUBJECT_TABLE_NAME = 'HZ_PARTIES'
835           AND r.OBJECT_TABLE_NAME = 'HZ_PARTIES';
836         EXCEPTION
837           WHEN NO_DATA_FOUND THEN
838             RETURN;
839         END;
840       END IF;
841     END IF;
842 
843     insert_interface_rec(l_party_id,p_contact_point_id,l_party_site_id, l_org_contact_id, 'CONTACT_POINTS',p_create_upd);
844     --  REPURI. Bug 4884742. Added this to insert data into hz_dqm_sh_sync_interface table
845     --  if shadow staging conc prog completed successfully.
846     IF (is_shadow_staging_complete) THEN
847       insert_sh_interface_rec(l_party_id,p_contact_point_id,l_party_site_id, l_org_contact_id, 'CONTACT_POINTS',p_create_upd);
848     END IF;
849   END IF;
850 EXCEPTION
851   WHEN OTHERS THEN
852     hz_common_pub.enable_cont_source_security;
853     FND_MESSAGE.SET_NAME('AR', 'HZ_SYNC_SQL_EXCEP');
854     FND_MESSAGE.SET_TOKEN('PROC','sync_contact_point');
855     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
856     FND_MSG_PUB.ADD;
857     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
858 END sync_contact_point;
859 
860 
861 PROCEDURE sync_relationship (
862         p_relationship_id  IN      NUMBER,
863         p_create_upd       IN      VARCHAR2
864 ) IS
865 
866   CURSOR org_contacts IS
867   SELECT org_contact_id
868   FROM hz_org_contacts
869   WHERE party_relationship_id  = p_relationship_id
870   AND status = 'A';
871 
872   l_org_contact_id NUMBER;
873 
874 BEGIN
875     L_REALTIME_SYNC_VALUE := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
876     IF ( L_REALTIME_SYNC_VALUE = 'Y' OR L_REALTIME_SYNC_VALUE = 'N')
877     THEN
878       OPEN org_contacts;
879       LOOP
880         FETCH org_contacts INTO l_org_contact_id;
881         EXIT WHEN org_contacts%NOTFOUND;
882         sync_contact(l_org_contact_id,'U');
883       END LOOP;
884       CLOSE org_contacts;
885     END IF;
886 
887 EXCEPTION
888   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
889     hz_common_pub.enable_cont_source_security;
890     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
891   WHEN OTHERS THEN
892     hz_common_pub.enable_cont_source_security;
893     FND_MESSAGE.SET_NAME('AR', 'HZ_SYNC_SQL_EXCEP');
894     FND_MESSAGE.SET_TOKEN('PROC','sync_relationship');
895     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
896     FND_MSG_PUB.ADD;
897     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
898 END;
899 
900 --- VJN CHANGED THIS PROCEDURE TO INCLUDE THE CHECK OF 'I' FOR THE
901 --  party_sites CURSOR (Bug 3139325)
902 PROCEDURE sync_location (
903         p_location_id 	IN      NUMBER,
904         p_create_upd       IN      VARCHAR2
905 ) IS
906 
907   CURSOR party_sites IS
908   SELECT party_site_id
909   FROM hz_party_Sites
910   WHERE location_id = p_location_id
911   AND (status = 'A' or status = 'I') ;
912 
913   l_party_site_id NUMBER;
914 
915 BEGIN
916 L_REALTIME_SYNC_VALUE := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
917 IF ( L_REALTIME_SYNC_VALUE = 'Y' OR L_REALTIME_SYNC_VALUE = 'N')
918 THEN
919       OPEN party_sites;
920       LOOP
921         FETCH party_sites INTO l_party_site_id;
922         EXIT WHEN party_sites%NOTFOUND;
923         sync_party_site(l_party_site_id,'U');
924       END LOOP;
925       CLOSE party_sites;
926 END IF;
927 
928 EXCEPTION
929   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
930     hz_common_pub.enable_cont_source_security;
931     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
932   WHEN OTHERS THEN
933     hz_common_pub.enable_cont_source_security;
934     FND_MESSAGE.SET_NAME('AR', 'HZ_SYNC_SQL_EXCEP');
935     FND_MESSAGE.SET_TOKEN('PROC','sync_location');
936     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
937     FND_MSG_PUB.ADD;
938     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
939 END;
940 
941 PROCEDURE sync_cust_account (
942 	p_cust_acct_id	IN	NUMBER,
943 	p_create_upd	IN	VARCHAR2
944 ) IS
945 
946   CURSOR c_cust_party IS
947     SELECT c.PARTY_ID, p.PARTY_TYPE
948     FROM HZ_CUST_ACCOUNTS c, HZ_PARTIES p
949     WHERE c.cust_account_id = p_cust_acct_id
950     AND p.party_id = c.party_id
951     AND NOT EXISTS (
952       SELECT d.PARTY_ID
953       FROM HZ_DQM_SYNC_INTERFACE d
954       WHERE d.ENTITY = 'PARTY'
955       AND d.PARTY_ID = c.PARTY_ID
956       AND d.STAGED_FLAG = 'N');
957 
958   l_party_id NUMBER;
959   l_party_type VARCHAR2(200);
960 
961 BEGIN
962 L_REALTIME_SYNC_VALUE := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
963 IF ( L_REALTIME_SYNC_VALUE = 'Y' OR L_REALTIME_SYNC_VALUE = 'N')
964 THEN
965       OPEN c_cust_party;
966       FETCH c_cust_party INTO l_party_id, l_party_type;
967       IF c_cust_party%FOUND THEN
968         IF l_party_type = 'ORGANIZATION' THEN
969           HZ_DQM_SYNC.sync_org(l_party_id,'U');
970         ELSIF l_party_type = 'PERSON' THEN
971           HZ_DQM_SYNC.sync_person(l_party_id,'U');
972         END IF;
973       END IF;
974       CLOSE c_cust_party;
975 END IF;
976 EXCEPTION
977   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
978     hz_common_pub.enable_cont_source_security;
979     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
980   WHEN OTHERS THEN
981     hz_common_pub.enable_cont_source_security;
982     FND_MESSAGE.SET_NAME('AR', 'HZ_SYNC_SQL_EXCEP');
983     FND_MESSAGE.SET_TOKEN('PROC','sync_cust_account');
984     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
985     FND_MSG_PUB.ADD;
986     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
987 END;
988 
989 -- VJN added for Reporting errored records into HZ_DQM_SYNC_INTERFACE
990 
991 PROCEDURE insert_error_rec (
992 	p_party_id	IN	NUMBER,
993 	p_record_id	IN	NUMBER,
994 	p_party_site_id	IN	NUMBER,
995 	p_org_contact_id IN	NUMBER,
996 	p_entity	IN	VARCHAR2,
997 	p_operation	IN	VARCHAR2,
998 	p_staged_flag   IN      VARCHAR2 DEFAULT 'E',
999     p_realtime_sync_flag IN      VARCHAR2 DEFAULT 'Y',
1000     p_error_data IN VARCHAR2
1001 ) IS
1002 
1003 BEGIN
1004 
1005   INSERT INTO hz_dqm_sync_interface (
1006 	PARTY_ID,
1007 	RECORD_ID,
1008     PARTY_SITE_ID,
1009     ORG_CONTACT_ID,
1010 	ENTITY,
1011 	OPERATION,
1012 	STAGED_FLAG,
1013     REALTIME_SYNC_FLAG,
1014     ERROR_DATA,
1015 	CREATED_BY,
1016 	CREATION_DATE,
1017 	LAST_UPDATE_LOGIN,
1018 	LAST_UPDATE_DATE,
1019 	LAST_UPDATED_BY,
1020     SYNC_INTERFACE_NUM
1021   ) VALUES (
1022 	p_party_id,
1023 	p_record_id,
1024     p_party_site_id,
1025     p_org_contact_id,
1026 	p_entity,
1027 	p_operation,
1028 	p_staged_flag,
1029     p_realtime_sync_flag,
1030     p_error_data,
1031 	hz_utility_pub.created_by,
1032         hz_utility_pub.creation_date,
1033         hz_utility_pub.last_update_login,
1034         hz_utility_pub.last_update_date,
1035         hz_utility_pub.user_id,
1036         HZ_DQM_SYNC_INTERFACE_S.nextval
1037   );
1038 END insert_error_rec;
1039 
1040 -- REPURI. Bug 4884742. Added this procedure to insert data into hz_dqm_sh_sync_interface table.
1041 -- This is the interface table for Shadow Sync.
1042 
1043 PROCEDURE insert_sh_interface_rec (
1044   p_party_id       IN  NUMBER,
1045   p_record_id      IN  NUMBER,
1046   p_party_site_id  IN  NUMBER,
1047   p_org_contact_id IN  NUMBER,
1048   p_entity         IN  VARCHAR2,
1049   p_operation      IN  VARCHAR2,
1050   p_staged_flag    IN  VARCHAR2 DEFAULT 'N'
1051 ) IS
1052 
1053   is_real_time VARCHAR2(1);
1054 
1055 BEGIN
1056   L_REALTIME_SYNC_VALUE := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
1057   IF (L_REALTIME_SYNC_VALUE = 'Y') THEN
1058     is_real_time := 'Y';
1059   END IF;
1060 
1061     -- REPURI. Bug 4968126.
1062     -- Using the Merge instead of Insert statement
1063     -- so that duplicate records dont get inserted.
1064 
1065     MERGE INTO hz_dqm_sh_sync_interface S
1066       USING (
1067         SELECT
1068            p_entity          AS entity
1069           ,p_party_id        AS party_id
1070           ,p_record_id       AS record_id
1071           ,p_party_site_id   AS party_site_id
1072           ,p_org_contact_id  AS org_contact_id
1073         FROM dual ) T
1074       ON (S.entity                  = T.entity                  AND
1075           S.party_id                = T.party_id                AND
1076           NVL(S.record_id,-99)      = NVL(T.record_id,-99)      AND
1077           NVL(S.party_site_id, -99) = NVL(T.party_site_id,-99)  AND
1078           NVL(S.org_contact_id,-99) = NVL(T.org_contact_id,-99) AND
1079           S.staged_flag             <> 'E')
1080       WHEN NOT MATCHED THEN
1081       INSERT (
1082         PARTY_ID,
1083         RECORD_ID,
1084         PARTY_SITE_ID,
1085         ORG_CONTACT_ID,
1086         ENTITY,
1087         OPERATION,
1088         STAGED_FLAG,
1089         REALTIME_SYNC_FLAG,
1090         CREATED_BY,
1091         CREATION_DATE,
1092         LAST_UPDATE_LOGIN,
1093         LAST_UPDATE_DATE,
1094         LAST_UPDATED_BY,
1095         SYNC_INTERFACE_NUM
1096         ) VALUES (
1097         p_party_id,
1098         p_record_id,
1099         p_party_site_id,
1100         p_org_contact_id,
1101         p_entity,
1102         p_operation,
1103         p_staged_flag,
1104         is_real_time,
1105         hz_utility_pub.created_by,
1106         hz_utility_pub.creation_date,
1107         hz_utility_pub.last_update_login,
1108         hz_utility_pub.last_update_date,
1109         hz_utility_pub.user_id,
1110         HZ_DQM_SH_SYNC_INTERFACE_S.nextval
1111       );
1112 
1113 END insert_sh_interface_rec;
1114 
1115 
1116 PROCEDURE insert_interface_rec (
1117   p_party_id       IN  NUMBER,
1118   p_record_id      IN  NUMBER,
1119   p_party_site_id  IN  NUMBER,
1120   p_org_contact_id IN  NUMBER,
1121   p_entity         IN  VARCHAR2,
1122   p_operation      IN  VARCHAR2,
1123   p_staged_flag    IN  VARCHAR2  DEFAULT 'N'
1124 ) IS
1125 
1126   is_real_time VARCHAR2(1);
1127 
1128 BEGIN
1129   L_REALTIME_SYNC_VALUE := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
1130   IF (L_REALTIME_SYNC_VALUE = 'Y') THEN
1131     is_real_time := 'Y';
1132   END IF;
1133 
1134     --Bug 13810656 Logic for handling the Delete Operation
1135     IF (p_operation = 'D') THEN
1136 
1137        INSERT INTO HZ_DQM_SYNC_INTERFACE(
1138         PARTY_ID,
1139         RECORD_ID,
1140         PARTY_SITE_ID,
1141         ORG_CONTACT_ID,
1142         ENTITY,
1143         OPERATION,
1144         STAGED_FLAG,
1145         REALTIME_SYNC_FLAG,
1146         CREATED_BY,
1147         CREATION_DATE,
1148         LAST_UPDATE_LOGIN,
1149         LAST_UPDATE_DATE,
1150         LAST_UPDATED_BY,
1151         SYNC_INTERFACE_NUM
1152         ) VALUES (
1153         p_party_id,
1154         p_record_id,
1155         p_party_site_id,
1156         p_org_contact_id,
1157         p_entity,
1158         p_operation,
1159         p_staged_flag,
1160         is_real_time,
1161         hz_utility_pub.created_by,
1162         hz_utility_pub.creation_date,
1163         hz_utility_pub.last_update_login,
1164         hz_utility_pub.last_update_date,
1165         hz_utility_pub.user_id,
1166         HZ_DQM_SYNC_INTERFACE_S.nextval
1167       );
1168 
1169     ELSE
1170 
1171     -- REPURI. Bug 4968126.
1172     -- Using the Merge instead of Insert statement
1173     -- so that duplicate records dont get inserted.
1174     MERGE INTO hz_dqm_sync_interface S
1175       USING (
1176         SELECT
1177            p_entity          AS entity
1178           ,p_party_id        AS party_id
1179           ,p_record_id       AS record_id
1180           ,p_party_site_id   AS party_site_id
1181           ,p_org_contact_id  AS org_contact_id
1182         FROM dual ) T
1183       ON (S.entity                  = T.entity                  AND
1184           S.party_id                = T.party_id                AND
1185           NVL(S.record_id,-99)      = NVL(T.record_id,-99)      AND
1186           NVL(S.party_site_id, -99) = NVL(T.party_site_id,-99)  AND
1187           NVL(S.org_contact_id,-99) = NVL(T.org_contact_id,-99) AND
1188           S.staged_flag             <> 'E' AND
1189 	  S.operation               <> 'D')
1190       WHEN NOT MATCHED THEN
1191       INSERT (
1192         PARTY_ID,
1196         ENTITY,
1193         RECORD_ID,
1194         PARTY_SITE_ID,
1195         ORG_CONTACT_ID,
1197         OPERATION,
1198         STAGED_FLAG,
1199         REALTIME_SYNC_FLAG,
1200         CREATED_BY,
1201         CREATION_DATE,
1202         LAST_UPDATE_LOGIN,
1203         LAST_UPDATE_DATE,
1204         LAST_UPDATED_BY,
1205         SYNC_INTERFACE_NUM
1206         ) VALUES (
1207         p_party_id,
1208         p_record_id,
1209         p_party_site_id,
1210         p_org_contact_id,
1211         p_entity,
1212         p_operation,
1213         p_staged_flag,
1214         is_real_time,
1215         hz_utility_pub.created_by,
1216         hz_utility_pub.creation_date,
1217         hz_utility_pub.last_update_login,
1218         hz_utility_pub.last_update_date,
1219         hz_utility_pub.user_id,
1220         HZ_DQM_SYNC_INTERFACE_S.nextval
1221       );
1222 
1223     END IF;
1224 
1225 END insert_interface_rec;
1226 
1227 
1228 PROCEDURE optimize_indexes (
1229         errbuf                  OUT     NOCOPY VARCHAR2,
1230         retcode                 OUT     NOCOPY VARCHAR2
1231 ) IS
1232 
1233 l_bool BOOLEAN;
1234 l_status VARCHAR2(255);
1235 l_index_owner VARCHAR2(255);
1236 l_tmp VARCHAR2(2000);
1237 
1238 l_prof VARCHAR2(255);
1239 l_prof_val NUMBER;
1240 idx_retcode VARCHAR2(1);
1241 idx_err     VARCHAR2(2000);
1242 
1243 BEGIN
1244   retcode := 0;
1245 
1246   outandlog('Starting Concurrent Program ''Synchronize Stage Schema''');
1247   outandlog('Start Time ' || TO_CHAR(SYSDATE, 'MM-DD-YY HH24:MI:SS'));
1248   outandlog('NEWLINE');
1249 
1250  BEGIN
1251     l_prof := FND_PROFILE.VALUE('HZ_DQM_OPT_MAXTIME');
1252     IF upper(l_prof) = 'UNLIMITED' THEN
1253       l_prof_val := null;
1254     ELSE
1255       l_prof_val := TO_NUMBER(l_prof);
1256     END IF;
1257   EXCEPTION
1258     WHEN OTHERS THEN
1259       l_prof_val := null;
1260   END;
1261 
1262   -- Initialize return status and message stack
1263   FND_MSG_PUB.initialize;
1264 
1265   log('Optimizing Intermedia indexes');
1266   log('Optimizing party index .. ', TRUE);
1267 
1268   l_bool := fnd_installation.GET_APP_INFO('AR',l_status,l_tmp,l_index_owner);
1269   OPTIMIZE_INDEX(l_index_owner || '.hz_stage_parties_t1', 'FULL', l_prof_val, idx_retcode , idx_err);
1270       IF idx_retcode = 1 THEN
1271           RAISE FND_API.G_EXC_ERROR;
1272       END IF;
1273   log('Done');
1274 
1275   log('Optimizing party site index .. ', TRUE);
1276   OPTIMIZE_INDEX(l_index_owner || '.hz_stage_party_sites_t1', 'FULL', l_prof_val, idx_retcode , idx_err);
1277       IF idx_retcode = 1 THEN
1278           RAISE FND_API.G_EXC_ERROR;
1279       END IF;
1280   log('Done');
1281 
1282   log('Optimizing contact index .. ', TRUE);
1283   OPTIMIZE_INDEX(l_index_owner || '.hz_stage_contact_t1', 'FULL', l_prof_val, idx_retcode , idx_err);
1284       IF idx_retcode = 1 THEN
1285           RAISE FND_API.G_EXC_ERROR;
1286       END IF;
1287   log('Done');
1288 
1289   log('Optimizing contact point index .. ', TRUE);
1290   OPTIMIZE_INDEX(l_index_owner || '.hz_stage_cpt_t1', 'FULL', l_prof_val, idx_retcode , idx_err);
1291       IF idx_retcode = 1 THEN
1292           RAISE FND_API.G_EXC_ERROR;
1293       END IF;
1294   log('Done');
1295 
1296   outandlog('Concurrent Program Execution completed ');
1297   outandlog('End Time : '|| TO_CHAR(SYSDATE, 'MM-DD-YY HH24:MI:SS'));
1298 
1299 
1300 END;
1301 
1302 /**
1303 * Procedure to write a message to the out NOCOPY file
1304 **/
1305 PROCEDURE out(
1306    message      IN      VARCHAR2,
1307    newline      IN      BOOLEAN DEFAULT TRUE) IS
1308 BEGIN
1309   IF message = 'NEWLINE' THEN
1310     FND_FILE.NEW_LINE(FND_FILE.OUTPUT, 1);
1311   ELSIF (newline) THEN
1312     FND_FILE.put_line(fnd_file.output,message);
1313   ELSE
1314     FND_FILE.put(fnd_file.output,message);
1315   END IF;
1316 END out;
1317 
1318 /**
1319 * Procedure to write a message to the log file
1320 **/
1321 PROCEDURE log(
1322    message      IN      VARCHAR2,
1323    newline      IN      BOOLEAN DEFAULT TRUE
1324 ) IS
1325 BEGIN
1326   IF message = 'NEWLINE' THEN
1327    FND_FILE.NEW_LINE(FND_FILE.LOG, 1);
1328   ELSIF (newline) THEN
1329     FND_FILE.put_line(fnd_file.log,message);
1330   ELSE
1331     FND_FILE.put(fnd_file.log,message);
1332   END IF;
1333 END log;
1334 
1335 /**
1336 * Procedure to write a message to the out NOCOPY and log files
1337 **/
1338 PROCEDURE outandlog(
1339    message      IN      VARCHAR2,
1340    newline      IN      BOOLEAN DEFAULT TRUE) IS
1341 BEGIN
1342   out(message, newline);
1343   log(message, newline);
1344 END outandlog;
1345 
1346 /**
1347 * Function to fetch messages of the stack and log the error
1348 * Also returns the error
1349 **/
1350 FUNCTION logerror(SQLERRM VARCHAR2 DEFAULT NULL)
1351 RETURN VARCHAR2 IS
1352 
1353   l_msg_data VARCHAR2(2000);
1354 BEGIN
1355   FND_MSG_PUB.Reset;
1356 
1357   FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
1358     l_msg_data := l_msg_data || FND_MSG_PUB.Get(p_encoded => FND_API.G_FALSE );
1359   END LOOP;
1360   IF (SQLERRM IS NOT NULL) THEN
1361     l_msg_data := l_msg_data || SQLERRM;
1362   END IF;
1363   log(l_msg_data);
1364   RETURN l_msg_data;
1365 END logerror;
1366 
1367 PROCEDURE stage_party_merge(
1368         p_entity_name   IN      VARCHAR2:=FND_API.G_MISS_CHAR,
1369         p_from_id       IN      NUMBER:=FND_API.G_MISS_NUM,
1370         x_to_id         IN OUT  NOCOPY NUMBER,
1371         p_from_fk_id    IN      NUMBER:=FND_API.G_MISS_NUM,
1372         p_to_fk_id      IN      NUMBER:=FND_API.G_MISS_NUM,
1373         p_par_entity_name IN    VARCHAR2:=FND_API.G_MISS_CHAR,
1374         p_batch_id      IN      NUMBER:=FND_API.G_MISS_NUM,
1375         p_batch_party_id IN     NUMBER:=FND_API.G_MISS_NUM,
1376         x_return_status OUT          NOCOPY VARCHAR2
1377 ) IS
1378 
1379 l_party_type VARCHAR2(30);
1380 
1381 BEGIN
1382 
1383   x_return_status := FND_API.G_RET_STS_SUCCESS;
1384   L_REALTIME_SYNC_VALUE := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
1385 
1386   SELECT party_type INTO l_party_type
1387   FROM HZ_PARTIES
1388   WHERE party_id = p_from_id;
1389 
1390 --Bug 9249643
1391  	 IF     l_party_type='ORGANIZATION' THEN
1392  	             sync_org(p_to_fk_id, 'U');
1393  	     ELSIF  l_party_type='PERSON' THEN
1394  	             sync_person(p_to_fk_id, 'U');
1395  	 END IF;
1396 
1397   IF l_party_type <> 'PARTY_RELATIONSHIP' THEN
1398     IF ( L_REALTIME_SYNC_VALUE = 'Y') THEN
1399     BEGIN
1400       UPDATE HZ_STAGED_PARTIES
1401       SET STATUS = 'M'
1402       WHERE party_id = p_from_id;
1403     EXCEPTION
1404       WHEN NO_DATA_FOUND THEN
1405         NULL;
1406     END;
1407     ELSIF ( L_REALTIME_SYNC_VALUE = 'N') THEN--Bug 13810656 Deferring the update of 'M' Status operation of Merge flow
1408       IF     l_party_type='ORGANIZATION' THEN
1409  	        sync_org(p_from_id, 'D');
1410       ELSIF  l_party_type='PERSON' THEN
1411  	        sync_person(p_from_id, 'D');
1412       END IF;
1413     END IF;
1414   END IF;
1415 
1416 EXCEPTION
1417   WHEN OTHERS THEN
1418     FND_MESSAGE.SET_NAME('AR', 'HZ_MERGE_SQL_ERROR');
1419     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
1420     FND_MSG_PUB.ADD;
1421     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1422 END stage_party_merge;
1423 
1424 PROCEDURE stage_party_site_merge(
1425         p_entity_name   IN      VARCHAR2:=FND_API.G_MISS_CHAR,
1426         p_from_id       IN      NUMBER:=FND_API.G_MISS_NUM,
1427         x_to_id         IN OUT  NOCOPY NUMBER,
1428         p_from_fk_id    IN      NUMBER:=FND_API.G_MISS_NUM,
1429         p_to_fk_id      IN      NUMBER:=FND_API.G_MISS_NUM,
1430         p_par_entity_name IN    VARCHAR2:=FND_API.G_MISS_CHAR,
1431         p_batch_id      IN      NUMBER:=FND_API.G_MISS_NUM,
1432         p_batch_party_id IN     NUMBER:=FND_API.G_MISS_NUM,
1433         x_return_status OUT          NOCOPY VARCHAR2
1434 ) IS
1435 
1436 l_party_id NUMBER;
1437 l_party_site_id         NUMBER;
1438 l_party_site_search_rec HZ_PARTY_SEARCH.party_site_search_rec_type;
1439 l_party_site_stage_rec  HZ_PARTY_STAGE.PARTY_SITE_STAGE_REC_TYPE;
1440 
1441 BEGIN
1442   x_return_status := FND_API.G_RET_STS_SUCCESS;
1443   L_REALTIME_SYNC_VALUE := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
1444 
1445   IF ( L_REALTIME_SYNC_VALUE = 'Y') THEN
1446   BEGIN
1447     DELETE FROM HZ_STAGED_PARTY_SITES
1448     WHERE party_site_id = p_from_id;
1449   EXCEPTION
1450     WHEN NO_DATA_FOUND THEN
1451       NULL;
1452   END;
1453   ELSIF ( L_REALTIME_SYNC_VALUE = 'N') THEN--Bug 13810656 Deferring the delete of from party_site_id for Merge flow
1454   sync_party_site (p_from_id,'D');
1455   END IF;
1456 
1457   IF p_from_fk_id = p_to_fk_id THEN--Not Sure this will ever occur as Merge always deletes and creates a new PS for Merge/Transfer Case.
1458     SELECT party_id INTO l_party_id
1459     FROM HZ_PARTY_SITES
1460     WHERE party_site_id = p_from_id;
1461 
1462     l_party_site_id := p_from_id;
1463 
1464     SAVEPOINT party_site_sync;
1465 
1466     BEGIN
1467       sync_party_site (l_party_site_id,'C');
1468 
1469     EXCEPTION
1470       WHEN OTHERS THEN
1471         ROLLBACK TO party_site_sync;
1472         sync_party_site (p_from_id, 'C');
1473     END;
1474   END IF;
1475 
1476 EXCEPTION
1477   WHEN OTHERS THEN
1478     FND_MESSAGE.SET_NAME('AR', 'HZ_MERGE_SQL_ERROR');
1479     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
1480     FND_MSG_PUB.ADD;
1481     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1482 END stage_party_site_merge;
1483 
1484 PROCEDURE stage_contact_point_merge(
1485         p_entity_name   IN      VARCHAR2:=FND_API.G_MISS_CHAR,
1486         p_from_id       IN      NUMBER:=FND_API.G_MISS_NUM,
1487         x_to_id         IN OUT  NOCOPY NUMBER,
1488         p_from_fk_id    IN      NUMBER:=FND_API.G_MISS_NUM,
1489         p_to_fk_id      IN      NUMBER:=FND_API.G_MISS_NUM,
1490         p_par_entity_name IN    VARCHAR2:=FND_API.G_MISS_CHAR,
1491         p_batch_id      IN      NUMBER:=FND_API.G_MISS_NUM,
1492         p_batch_party_id IN     NUMBER:=FND_API.G_MISS_NUM,
1493         x_return_status OUT          NOCOPY VARCHAR2
1494 ) IS
1495 
1496 l_contact_point_id      NUMBER;
1497 l_cpt_search_rec        HZ_PARTY_SEARCH.contact_point_search_rec_type;
1498 l_contact_pt_stage_rec  HZ_PARTY_STAGE.CONTACT_PT_STAGE_REC_TYPE;
1499 l_party_id NUMBER := 0;
1500 l_pr_id NUMBER;
1501 l_num_ocs NUMBER;
1502 l_ot_id NUMBER;
1503 l_ot_table VARCHAR2(60);
1504 l_party_type VARCHAR2(60);
1505 
1506   CURSOR c_cp_party_site (cp_id NUMBER) IS
1507     SELECT owner_table_id
1508     FROM HZ_CONTACT_POINTS
1509     WHERE owner_table_name = 'HZ_PARTY_SITES'
1510     AND contact_point_id = cp_id;
1511 
1512   CURSOR c_cp_org_contact (cp_id NUMBER) IS
1513     SELECT oc.org_contact_id
1514     FROM HZ_CONTACT_POINTS cp, HZ_RELATIONSHIPS rl, HZ_ORG_CONTACTS oc
1515     WHERE owner_table_name = 'HZ_PARTIES'
1516     AND contact_point_id = cp_id
1517     AND rl.PARTY_ID = cp.owner_table_id
1518     AND oc.party_relationship_id = rl.relationship_id
1519     AND rl.SUBJECT_TABLE_NAME = 'HZ_PARTIES'
1520     AND rl.OBJECT_TABLE_NAME = 'HZ_PARTIES'
1521     AND rl.DIRECTIONAL_FLAG = 'F';
1522 
1523   CURSOR c_ps_org_contact (ps_id NUMBER) IS
1524     SELECT oc.org_contact_id
1525     FROM HZ_PARTY_SITES ps, HZ_RELATIONSHIPS rl, HZ_ORG_CONTACTS oc
1526     WHERE ps.party_site_id = ps_id
1527     AND rl.PARTY_ID = ps.party_id
1528     AND oc.party_relationship_id = rl.relationship_id
1529     AND rl.SUBJECT_TABLE_NAME = 'HZ_PARTIES'
1530     AND rl.OBJECT_TABLE_NAME = 'HZ_PARTIES'
1531     AND rl.DIRECTIONAL_FLAG = 'F';
1532 
1533 l_cp_party_site_id         NUMBER;
1534 l_cp_org_contact_id        NUMBER;
1535 
1536 BEGIN
1537 
1538   x_return_status := FND_API.G_RET_STS_SUCCESS;
1539 
1540   L_REALTIME_SYNC_VALUE := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
1541 
1542   IF ( L_REALTIME_SYNC_VALUE = 'Y') THEN
1543    BEGIN
1544     DELETE FROM HZ_STAGED_CONTACT_POINTS
1545     WHERE contact_point_id = p_from_id;
1546    EXCEPTION
1547     WHEN NO_DATA_FOUND THEN
1548       NULL;
1549    END;
1550   ELSIF ( L_REALTIME_SYNC_VALUE = 'N') THEN--Bug 13810656 Deferring the delete of from contact_point_id for Merge flow
1551      BEGIN
1552        DELETE FROM HZ_DQM_SYNC_INTERFACE WHERE STAGED_FLAG='N'
1553        AND RECORD_ID=p_from_id AND ENTITY='CONTACT_POINTS';
1554      EXCEPTION
1555        WHEN NO_DATA_FOUND THEN
1556        NULL;
1557      END;
1558   sync_contact_point (p_from_id,'D');
1559   END IF;
1560 
1561   IF p_from_fk_id = p_to_fk_id THEN
1562 
1563     l_contact_point_id := p_from_id;
1564     l_party_id := 0;
1565 
1566     SELECT owner_table_name,owner_table_id INTO l_ot_table, l_ot_id
1567     FROM hz_contact_points
1568     WHERE contact_point_id = l_contact_point_id;
1569 
1570     IF l_ot_table = 'HZ_PARTY_SITES' THEN
1571       SELECT party_id INTO l_party_id
1572       FROM HZ_PARTY_SITES
1573       WHERE party_site_id = l_ot_id;
1574 
1575     ELSIF l_ot_table = 'HZ_PARTIES' THEN
1576       SELECT party_type INTO l_party_type
1577       FROM hz_parties
1578       WHERE party_id = l_ot_id;
1579 
1580       IF l_party_type = 'ORGANIZATION' OR l_party_type = 'PERSON' THEN
1581         l_party_id := l_ot_id;
1582       ELSIF l_party_type = 'PARTY_RELATIONSHIP' THEN
1583         SELECT relationship_id, object_id INTO l_pr_id, l_party_id
1584         FROM hz_relationships                      --bug 4500011 replaced hz_party_relationships with hz_relationships
1585         WHERE party_id = l_ot_id
1586         AND subject_table_name = 'HZ_PARTIES'
1587         AND object_table_name = 'HZ_PARTIES'
1588         AND directional_flag = 'F';
1589 
1590         SELECT count(1) INTO l_num_ocs
1591         FROM HZ_ORG_CONTACTS
1592         WHERE party_relationship_id = l_pr_id;
1593 
1594         IF l_num_ocs = 0 THEN
1595           l_party_id := 0;
1596         END IF;
1597       END IF;
1598     END IF;
1599 
1600     IF l_party_id <> 0 AND l_party_id IS NOT NULL THEN
1601     fnd_file.put_line(fnd_file.log,'pt 11');
1602       SAVEPOINT contact_point_sync;
1603     fnd_file.put_line(fnd_file.log,'pt 12');
1604       BEGIN
1605         sync_contact_point (l_contact_point_id,'C');
1606 
1607 
1608       EXCEPTION
1609         WHEN OTHERS THEN
1610           ROLLBACK TO contact_point_sync;
1611           sync_contact_point (p_from_id, 'C');
1612       END;
1613     END IF;
1614   END IF;
1615 
1616 EXCEPTION
1617   WHEN OTHERS THEN
1618   fnd_file.put_line(fnd_file.log,'Error here1 '||SQLERRM);
1619     FND_MESSAGE.SET_NAME('AR', 'HZ_MERGE_SQL_ERROR');
1620     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
1621     FND_MSG_PUB.ADD;
1622     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1623 END stage_contact_point_merge;
1624 
1625 
1626 PROCEDURE stage_contact_merge(
1627         p_entity_name   IN      VARCHAR2:=FND_API.G_MISS_CHAR,
1628         p_from_id       IN      NUMBER:=FND_API.G_MISS_NUM,
1629         x_to_id         IN OUT  NOCOPY NUMBER,
1630         p_from_fk_id    IN      NUMBER:=FND_API.G_MISS_NUM,
1631         p_to_fk_id      IN      NUMBER:=FND_API.G_MISS_NUM,
1632         p_par_entity_name IN    VARCHAR2:=FND_API.G_MISS_CHAR,
1633         p_batch_id      IN      NUMBER:=FND_API.G_MISS_NUM,
1634         p_batch_party_id IN     NUMBER:=FND_API.G_MISS_NUM,
1635         x_return_status OUT          NOCOPY VARCHAR2
1636 ) IS
1637 
1638 l_org_contact_id NUMBER;
1639 l_party_id NUMBER;
1640 l_contact_search_rec    HZ_PARTY_SEARCH.contact_search_rec_type;
1641 l_contact_stage_rec     HZ_PARTY_STAGE.CONTACT_STAGE_REC_TYPE;
1642 l_rel_party_id NUMBER;
1643 BEGIN
1644 
1645   x_return_status := FND_API.G_RET_STS_SUCCESS;
1646   L_REALTIME_SYNC_VALUE := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
1647 
1648   IF ( L_REALTIME_SYNC_VALUE = 'Y') THEN
1649     BEGIN
1650       DELETE FROM HZ_STAGED_CONTACTS
1651       WHERE org_contact_id = p_from_id;
1652     EXCEPTION
1653       WHEN NO_DATA_FOUND THEN
1654       NULL;
1655     END;
1656   ELSIF ( L_REALTIME_SYNC_VALUE = 'N') THEN----Bug 13810656 Deferring the delete of from contacts for Merge flow
1657     sync_contact(p_from_id,'D');
1658   END IF;
1659 
1660 
1661   IF p_from_fk_id = p_to_fk_id THEN
1662     l_org_contact_id := p_from_id;
1663 
1664     SELECT pr.party_id, pr.object_id INTO l_rel_party_id, l_party_id
1665     FROM HZ_RELATIONSHIPS pr, HZ_ORG_CONTACTS oc             --bug 4500011 replaced hz_party_relationships with hz_relationships
1666     WHERE oc.org_contact_id = l_org_contact_id
1667     AND pr.relationship_id = oc.party_relationship_id
1668     AND pr.subject_table_name = 'HZ_PARTIES'
1669     AND pr.object_table_name = 'HZ_PARTIES'
1670     AND pr.directional_flag = 'F';
1671 
1672     SAVEPOINT contact_sync;
1673     IF ( L_REALTIME_SYNC_VALUE = 'Y') THEN
1674     BEGIN
1675       sync_contact(l_org_contact_id,'C');
1676 
1677       UPDATE HZ_STAGED_PARTY_SITES
1678       SET party_id = l_party_id
1679       WHERE party_site_id in (
1680           SELECT party_site_id
1681           FROM HZ_PARTY_SITES
1682           WHERE party_id = l_rel_party_id
1683           AND (nvl(STATUS,'A') = 'A' OR nvl(STATUS,'A')='I'));
1684 
1685       UPDATE HZ_STAGED_CONTACT_POINTS
1686       SET party_id = l_party_id
1687       WHERE contact_point_id in (
1688           SELECT contact_point_id
1689           FROM HZ_CONTACT_POINTS
1690           WHERE owner_table_name = 'HZ_PARTIES'
1691           AND owner_table_id = l_rel_party_id
1692           AND (nvl(STATUS,'A') = 'A' OR nvl(STATUS,'A')='I'));
1693 
1694 
1695     EXCEPTION
1696       WHEN OTHERS THEN
1697         ROLLBACK TO contact_sync;
1698         sync_contact(p_from_id, 'C');
1699     END;
1700     ELSIF ( L_REALTIME_SYNC_VALUE = 'N') THEN----Bug 13810656 Deferring the update of relationships for Merge flow
1701      BEGIN
1702      FOR I IN (SELECT party_site_id
1703           FROM HZ_PARTY_SITES
1704           WHERE party_id = l_rel_party_id
1705           AND (nvl(STATUS,'A') = 'A' OR nvl(STATUS,'A')='I'))
1706 	  LOOP
1707           sync_party_site (I.party_site_id, 'U');
1708 	  END LOOP;
1709 
1710       FOR I IN (SELECT contact_point_id
1711           FROM HZ_CONTACT_POINTS
1712           WHERE owner_table_name = 'HZ_PARTIES'
1713           AND owner_table_id = l_rel_party_id
1714           AND (nvl(STATUS,'A') = 'A' OR nvl(STATUS,'A')='I'))
1715 	  LOOP
1716           sync_contact_point (I.contact_point_id, 'U');
1717 	  END LOOP;
1718 
1719       sync_contact(l_org_contact_id,'C');
1720       EXCEPTION
1721       WHEN OTHERS THEN
1722         ROLLBACK TO contact_sync;
1723         sync_contact(p_from_id, 'C');
1724     END;
1725 
1726     END IF;
1727 
1728   END IF;
1729 
1730 EXCEPTION
1731   WHEN OTHERS THEN
1732     FND_MESSAGE.SET_NAME('AR', 'HZ_MERGE_SQL_ERROR');
1733     FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
1734     FND_MSG_PUB.ADD;
1735     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1736 
1737 END stage_contact_merge;
1738 
1739 
1740 -- procedure to sync data realtime from hx_dqm_sync_interface table
1741 -- the program sets staged_flag = 'P' as an intermediate step during complete processing of rows in going on.
1742 FUNCTION realtime_sync  (p_subscription_guid  IN RAW,
1743    p_event              IN OUT NOCOPY WF_EVENT_T) return VARCHAR2
1744  AS
1745 
1746  TYPE PartyIdList IS TABLE OF NUMBER;
1747  TYPE OperationList IS TABLE OF VARCHAR2(1);
1748  TYPE EntityList IS TABLE OF VARCHAR2(30);
1749 
1750  l_party_id PartyIdList;
1751  l_record_id PartyIdList;
1752  l_entity EntityList;
1753  l_operation OperationList;
1754  l_party_type VARCHAR2(30);
1755  l_sql_error_message VARCHAR2(2000);
1756  l_rowid EntityList;
1757 
1758  errbuf VARCHAR2(1000);
1759  retcode VARCHAR2(10);
1760 
1761  i_party boolean := false;
1762  i_party_sites boolean := false;
1763  i_contacts boolean := false;
1764  i_contact_points boolean  := false;
1765  l_dqm_run VARCHAR2(1);
1766 
1767 
1768 BEGIN
1769 
1770   select 'Y' into l_dqm_run
1771   from HZ_TRANS_FUNCTIONS_VL
1772   where STAGED_FLAG='Y'
1773   and nvl(ACTIVE_FLAG,'Y')='Y'
1774   and rownum = 1;
1775 
1776   IF (l_dqm_run = 'Y') THEN
1777 
1778       update HZ_DQM_SYNC_INTERFACE set STAGED_FLAG = 'P'
1779         where STAGED_FLAG = 'N' and REALTIME_SYNC_FLAG = 'Y'
1780         returning party_id, record_id, entity, operation, rowid BULK COLLECT into
1781         l_party_id, l_record_id, l_entity, l_operation, l_rowid;
1782 
1783    COMMIT;
1784 
1785    FOR i in 1..l_party_id.COUNT LOOP
1786      BEGIN
1787      IF (l_entity(i) = 'PARTY') THEN
1788         select party_type into l_party_type from hz_parties where party_id = l_party_id(i);
1789         hz_trans_pkg.set_party_type(l_party_type);
1790         HZ_STAGE_MAP_TRANSFORM.sync_single_party(l_party_id(i), l_party_type, l_operation(i));
1791         i_party := true;
1792      ELSIF (l_entity(i) = 'PARTY_SITES') THEN
1793         HZ_STAGE_MAP_TRANSFORM.sync_single_party_site(l_record_id(i), l_operation(i));
1794         i_party := true;
1795         i_party_sites := true;
1796      ELSIF (l_entity(i) = 'CONTACTS') THEN
1797         HZ_STAGE_MAP_TRANSFORM.sync_single_contact(l_record_id(i), l_operation(i));
1798         i_party := true;
1799         i_contacts := true;
1800      ELSIF (l_entity(i) = 'CONTACT_POINTS') THEN
1801         HZ_STAGE_MAP_TRANSFORM.sync_single_contact_point(l_record_id(i), l_operation(i));
1802         i_party := true;
1803         i_contact_points := true;
1804      END IF;
1805 
1806      BEGIN
1807           IF (l_entity(i) <> 'PARTY') THEN
1808               insert_into_interface(l_party_id(i));
1809           END IF;
1810           IF l_operation(i) = 'C' THEN
1811                DELETE FROM hz_dqm_sync_interface WHERE rowid = l_rowid(i) ;
1812           ELSE
1813                UPDATE hz_dqm_sync_interface SET staged_flag = 'Y' WHERE rowid = l_rowid(i);
1814           END IF;
1815      EXCEPTION WHEN OTHERS THEN
1816           NULL;
1817      END;
1818 
1819      EXCEPTION
1820        WHEN OTHERS THEN
1821           -- update staged_flag to 'E' if program generates an error.
1822           l_sql_error_message := SQLERRM;
1823           UPDATE hz_dqm_sync_interface SET error_data = l_sql_error_message, staged_flag = 'E' WHERE ROWID = l_rowid(i);
1824      END;
1825 
1826      COMMIT;
1827   END LOOP ;
1828   COMMIT;
1829 
1830    REALTIME_SYNC_INDEXES(i_party, i_party_sites, i_contacts, i_contact_points);
1831    RETURN 'SUCCESS';
1832  END IF;
1833  EXCEPTION
1834         when others then
1835         IF p_subscription_guid IS NOT NULL THEN
1836           WF_CORE.context('HZ_DQM_SYNC', 'REALTIME_SYNC', p_event.getEventName(), p_subscription_guid);
1837           WF_EVENT.setErrorInfo(p_event, 'ERROR');
1838         END IF;
1839         return 'ERROR';
1840 
1841 END REALTIME_SYNC;
1842 
1843 
1844 
1845 -- procedure to sync indexes real time.  Commented code will be useful later.
1846 PROCEDURE realtime_sync_indexes(i_party IN boolean,
1847   i_party_sites IN boolean,
1848   i_contacts IN boolean,
1849   i_contact_points IN boolean
1850 )
1851 AS
1852 
1853   idx_retcode varchar2(1);
1854   idx_err     varchar2(2000);
1855 
1856   l_status VARCHAR2(255);
1857   l_index_owner VARCHAR2(255);
1858   l_tmp		VARCHAR2(2000);
1859 
1860 BEGIN
1861  IF(fnd_installation.GET_APP_INFO('AR',l_status,l_tmp,l_index_owner)) THEN
1862   IF (i_party) THEN
1863         SYNC_INDEX_REALTIME(l_index_owner || '.hz_stage_parties_t1',
1864                                        idx_retcode , idx_err);
1865         IF idx_retcode = 1 THEN
1866           RAISE FND_API.G_EXC_ERROR;
1867         END IF;
1868 
1869   END IF;
1870   IF (i_party_sites) THEN
1871         SYNC_INDEX_REALTIME(l_index_owner || '.hz_stage_party_sites_t1',
1872                                        idx_retcode , idx_err);
1873         IF idx_retcode = 1 THEN
1874           RAISE FND_API.G_EXC_ERROR;
1875         END IF;
1876 
1877   END IF;
1878   IF (i_contacts) THEN
1879       SYNC_INDEX_REALTIME(l_index_owner || '.hz_stage_contact_t1',
1880                                        idx_retcode , idx_err);
1881       IF idx_retcode = 1 THEN
1882           RAISE FND_API.G_EXC_ERROR;
1883       END IF;
1884 
1885   END IF;
1886   IF (i_contact_points) THEN
1887       SYNC_INDEX_REALTIME(l_index_owner || '.hz_stage_cpt_t1',
1888                                        idx_retcode , idx_err);
1889       IF idx_retcode = 1 THEN
1890           RAISE FND_API.G_EXC_ERROR;
1891       END IF;
1892   END IF;
1893  END IF;
1894 EXCEPTION
1895   WHEN FND_API.G_EXC_ERROR THEN
1896     outandlog('Error : Aborting Program');
1897     outandlog(idx_err);
1898   WHEN OTHERS THEN
1899     outandlog('Error : Aborting Program');
1900     outandlog(SQLERRM);
1901 END REALTIME_SYNC_INDEXES;
1902 
1903 -- returns 'Y' if at least one row present in the global temporary table.
1904 -- This is done to reduce the number of events fired.
1905 FUNCTION check_for_transaction
1906 RETURN VARCHAR2 IS
1907 
1908 bool varchar2(1) := 'N';
1909 
1910 BEGIN
1911     SELECT 'Y' INTO bool
1912     FROM HZ_DQM_SYNC_GT
1913     WHERE ROWNUM = 1;
1914     IF bool <> 'Y' THEN
1915         bool := 'N';
1916     END IF;
1917    RETURN bool;
1918 EXCEPTION
1919     WHEN NO_DATA_FOUND THEN
1920         RETURN bool;
1921 END check_for_transaction;
1922 
1923 
1924 PROCEDURE sync_work_unit(
1925     retcode     OUT NOCOPY  VARCHAR2,
1926     err         OUT NOCOPY  VARCHAR2,
1927     p_from_rec  IN  VARCHAR2,
1928     p_to_rec    IN  VARCHAR2,
1929     p_sync_type IN  VARCHAR2
1930 ) IS
1931 
1932   -- REPURI - Removed all the variable declarations not being used,
1933   -- as part of code changes for Sync Performance Improvement Project.
1934 
1935   l_sql_error_message   VARCHAR2(2000);
1936   l_do_exec boolean     := TRUE;
1937   l_sync_party_cur      HZ_DQM_SYNC.SyncCurTyp;
1938   l_sync_party_site_cur HZ_DQM_SYNC.SyncCurTyp;
1939   l_sync_contact_cur    HZ_DQM_SYNC.SyncCurTyp;
1940   l_sync_cpt_cur        HZ_DQM_SYNC.SyncCurTyp;
1941 
1942 BEGIN
1943 
1944   log(' p_from_rec = '|| p_from_rec);
1945   log(' p_to_rec = '|| p_to_rec);
1946   log(' p_sync_type = ' || p_sync_type);
1947   LOOP
1948     BEGIN
1949       IF (l_do_exec = FALSE) THEN
1950         log('l_do_exec is false');
1951         EXIT;
1952       ELSE
1953         log('l_do_exec is true');
1954         l_do_exec := FALSE;
1955       END IF;
1956 
1957       -- Part of DQM Sync Peformance Improvements Project (REPURI).
1958 
1959       -- Instead of calling the sync_single_xxx in a LOOP for each row, we now call
1960       -- the new open_sync_xxx_cursor and pass the IN OUT CURSOR to sync_all_xxx APIs
1961       -- for all the 4 entities, to Fetch and Insert/Update data in Bulk Mode.
1962 
1963       log ('-----------------------------');
1964       log ('Begin DQM SYNC');
1965       log ('-----------------------------');
1966 
1967       -- Sync all organization parties
1968       -- For Create
1969       log ('-----------------------------');
1970       log ('For Create Organization Party');
1971       log ('-----------------------------');
1972       log ('Calling HZ_STAGE_MAP_TRANSFORM.open_sync_party_cursor');
1973       HZ_STAGE_MAP_TRANSFORM.open_sync_party_cursor ('C','ORGANIZATION', p_from_rec, p_to_rec, l_sync_party_cur);
1974       log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_parties');
1975       HZ_STAGE_MAP_TRANSFORM.sync_all_parties ('C', 'DQM_SYNC' ,l_sync_party_cur);
1976       -- For Update
1977       log ('-----------------------------');
1978       log ('For Update Organization Party');
1979       log ('-----------------------------');
1980       log ('Calling HZ_STAGE_MAP_TRANSFORM.open_sync_party_cursor');
1981       HZ_STAGE_MAP_TRANSFORM.open_sync_party_cursor ('U','ORGANIZATION', p_from_rec, p_to_rec, l_sync_party_cur);
1982       log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_parties');
1983       HZ_STAGE_MAP_TRANSFORM.sync_all_parties ('U', 'DQM_SYNC' , l_sync_party_cur);
1984 
1985       -- Sync all person parties
1986       -- For Create
1987       log ('-----------------------');
1988       log ('For Create Person Party');
1989       log ('-----------------------');
1990       log ('Calling HZ_STAGE_MAP_TRANSFORM.open_sync_party_cursor');
1991       HZ_STAGE_MAP_TRANSFORM.open_sync_party_cursor ('C','PERSON', p_from_rec, p_to_rec, l_sync_party_cur);
1992       log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_parties');
1993       HZ_STAGE_MAP_TRANSFORM.sync_all_parties ('C', 'DQM_SYNC', l_sync_party_cur);
1994       -- For Update
1995       log ('-----------------------');
1996       log ('For Update Person Party');
1997       log ('-----------------------');
1998       log ('Calling HZ_STAGE_MAP_TRANSFORM.open_sync_party_cursor');
1999       HZ_STAGE_MAP_TRANSFORM.open_sync_party_cursor ('U','PERSON', p_from_rec, p_to_rec, l_sync_party_cur);
2000       log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_parties');
2001       HZ_STAGE_MAP_TRANSFORM.sync_all_parties ('U', 'DQM_SYNC', l_sync_party_cur);
2002 
2003       -- Sync all party_sites
2004       -- For Create
2005       log ('----------------------');
2006       log ('For Create Party Sites');
2007       log ('----------------------');
2008       log ('Calling HZ_STAGE_MAP_TRANSFORM.open_sync_party_site_cursor');
2009       HZ_STAGE_MAP_TRANSFORM.open_sync_party_site_cursor ('C', p_from_rec, p_to_rec, l_sync_party_site_cur);
2010       log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_party_sites');
2011       HZ_STAGE_MAP_TRANSFORM.sync_all_party_sites ('C', 'DQM_SYNC', l_sync_party_site_cur);
2012       -- For Update
2013       log ('----------------------');
2014       log ('For Update Party Sites');
2015       log ('----------------------');
2016       log ('Calling HZ_STAGE_MAP_TRANSFORM.open_sync_party_site_cursor');
2017       HZ_STAGE_MAP_TRANSFORM.open_sync_party_site_cursor ('U', p_from_rec, p_to_rec, l_sync_party_site_cur);
2018       log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_party_sites');
2019       HZ_STAGE_MAP_TRANSFORM.sync_all_party_sites ('U', 'DQM_SYNC', l_sync_party_site_cur);
2020 
2021       -- Sync all contacts
2022       -- For Create
2023       log ('-------------------');
2024       log ('For Create Contacts');
2025       log ('-------------------');
2026       log ('Calling HZ_STAGE_MAP_TRANSFORM.open_sync_contact_cursor');
2027       HZ_STAGE_MAP_TRANSFORM.open_sync_contact_cursor ('C', p_from_rec, p_to_rec, l_sync_contact_cur);
2028       log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_contacts');
2029       HZ_STAGE_MAP_TRANSFORM.sync_all_contacts ('C', 'DQM_SYNC', l_sync_contact_cur);
2030       -- For Update
2031       log ('-------------------');
2032       log ('For Update Contacts');
2033       log ('-------------------');
2034       log ('Calling HZ_STAGE_MAP_TRANSFORM.open_sync_contact_cursor');
2035       HZ_STAGE_MAP_TRANSFORM.open_sync_contact_cursor ('U', p_from_rec, p_to_rec, l_sync_contact_cur);
2036       log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_contacts');
2037       HZ_STAGE_MAP_TRANSFORM.sync_all_contacts ('U', 'DQM_SYNC', l_sync_contact_cur);
2038 
2039       -- Sync all contact_points
2040       -- For Create
2041       log ('-------------------------');
2042       log ('For Create Contact Points');
2043       log ('-------------------------');
2044       log ('Calling HZ_STAGE_MAP_TRANSFORM.open_sync_cpt_cursor');
2045       HZ_STAGE_MAP_TRANSFORM.open_sync_cpt_cursor ('C', p_from_rec, p_to_rec, l_sync_cpt_cur);
2046       log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_contact_points');
2047       HZ_STAGE_MAP_TRANSFORM.sync_all_contact_points ('C', 'DQM_SYNC', l_sync_cpt_cur);
2048       -- For Update
2049       log ('-------------------------');
2050       log ('For Update Contact Points');
2051       log ('-------------------------');
2052       log ('Calling HZ_STAGE_MAP_TRANSFORM.open_sync_cpt_cursor');
2053       HZ_STAGE_MAP_TRANSFORM.open_sync_cpt_cursor ('U', p_from_rec, p_to_rec, l_sync_cpt_cur);
2054       log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_contact_points');
2055       HZ_STAGE_MAP_TRANSFORM.sync_all_contact_points ('U', 'DQM_SYNC', l_sync_cpt_cur);
2056 
2057       -- Delete from from hz_dqm_sync_interface table, all the range
2058       -- of records that are already processed
2059       DELETE FROM hz_dqm_sync_interface
2060       WHERE staged_flag = 'N'
2061       AND error_data IS NULL
2062 	  AND sync_interface_num BETWEEN p_from_rec AND p_to_rec;
2063 
2064     EXCEPTION
2065       WHEN OTHERS THEN
2066         IF SQLCODE = -1555 THEN
2067           l_do_exec := true;
2068           log(' Snapshot too old exception raised and caught. Cursor re-executed. ');
2069         ELSE
2070           retcode :=  2;
2071           err := SQLERRM;
2072           log(err);
2073           RAISE;
2074           EXIT;
2075         END IF;
2076       END;
2077 
2078     END LOOP ;
2079 
2080   EXCEPTION
2081     WHEN OTHERS THEN
2082       retcode :=  2;
2083       err := SQLERRM;
2084       log(err);
2085 
2086 END sync_work_unit;
2087 
2088 
2089 PROCEDURE sync_parties(retcode  OUT NOCOPY   VARCHAR2,
2090     err             OUT NOCOPY    VARCHAR2,
2091     p_num_of_workers  IN  VARCHAR2,
2092     p_indexes_only  IN VARCHAR2
2093 ) IS
2094 
2095 l_num_of_workers NUMBER;
2096 l_min_id NUMBER;
2097 l_max_id NUMBER;
2098 l_range NUMBER;
2099 l_count NUMBER;
2100 l_from_rec NUMBER;
2101 l_to_rec NUMBER;
2102 l_from_rec_v VARCHAR2(255);
2103 l_to_rec_v VARCHAR2(255);
2104 idx_name VARCHAR2(300); -- VJN Increased Size of this for P1 4096839, from 30 to 300
2105 l_index_owner VARCHAR2(255);
2106 l_status VARCHAR2(255);
2107 l_tmp		VARCHAR2(2000);
2108 idx_retcode varchar2(1);
2109 idx_err     varchar2(2000);
2110 TYPE nTable IS TABLE OF NUMBER index by binary_integer;
2111 l_sub_requests nTable;
2112 
2113 l_range1 NUMBER;
2114 j number := 0;
2115 req_data            varchar2(30);
2116 l_indexes_only      VARCHAR2(30);
2117 l_workers_completed boolean ;
2118 
2119 
2120 
2121 -- VJN Introduced
2122 
2123 FIRST BOOLEAN ;
2124 l_index_conc_program_req_id NUMBER ;
2125 l_request_id NUMBER ;
2126 --Start of bug 4915282
2127 CURSOR c_non_indexed IS select 1 from hz_dqm_stage_log where operation= 'ALTER_INDEX'
2128                         and start_flag = 'Y' and end_flag ='Y';
2129 l_index_count number := 0;
2130 
2131 
2132 --End of bug 4915282
2133 BEGIN
2134     log (' -------------------------------------------');
2135     log ('Entering procedure sync_parties');
2136     log ('p_num_of_workers = ' || p_num_of_workers);
2137     log('p_indexes_only = '|| p_indexes_only);
2138 
2139     req_data := fnd_conc_global.request_data;
2140 
2141     log(' req_data = ' || req_data);
2142 
2143     l_indexes_only := nvl(p_indexes_only, 'N');
2144 
2145     log (' l_indexes_only = ' || l_indexes_only);
2146 
2147 
2148 
2149     /************* we don't have to support this  ************/
2150     -- IF ( l_indexes_only = 'Y') AND (req_data IS NULL) THEN
2151     --    req_data := 'PAUSED_FOR_INDEX';
2152     -- END IF;
2153 
2154     -- First Phase
2155     IF ( req_data IS NULL) THEN
2156 
2157 
2158     /* Code for handling the records with operation 'D' Flag*/
2159 
2160 	 FOR I in (SELECT PARTY_ID,RECORD_ID,ENTITY FROM HZ_DQM_SYNC_INTERFACE WHERE OPERATION='D' AND STAGED_FLAG='N')
2161 	 LOOP
2162 
2163 	 IF (I.ENTITY='PARTY')
2164 	 THEN
2165 	   BEGIN
2166 	   UPDATE HZ_STAGED_PARTIES
2167 		SET STATUS = 'M'
2168 		WHERE party_id = I.PARTY_ID;
2169            EXCEPTION
2170            WHEN NO_DATA_FOUND THEN
2171             NULL;
2172            END;
2173 	 END IF;
2174 
2175 	 IF (I.ENTITY='PARTY_SITES')
2176 	 THEN
2177  	 BEGIN
2178 	    DELETE FROM HZ_STAGED_PARTY_SITES
2179             WHERE party_site_id = I.RECORD_ID;
2180 	 EXCEPTION
2181            WHEN NO_DATA_FOUND THEN
2182             NULL;
2183          END;
2184 	 END IF;
2185 
2186 	 IF (I.ENTITY='CONTACTS')
2187 	 THEN
2188 	  BEGIN
2189 	    DELETE FROM HZ_STAGED_CONTACTS
2190 	    WHERE org_contact_id = I.RECORD_ID;
2191 	  EXCEPTION
2192 	    WHEN NO_DATA_FOUND THEN
2193 	      NULL;
2194 	  END;
2195 	 END IF;
2196 
2197 	 IF (I.ENTITY='CONTACT_POINTS')
2198 	 THEN
2199 	  BEGIN
2200              DELETE FROM HZ_STAGED_CONTACT_POINTS
2201              WHERE contact_point_id = I.RECORD_ID;
2202           EXCEPTION
2203           WHEN NO_DATA_FOUND THEN
2204             NULL;
2205           END;
2206 	 END IF;
2207 
2208 
2209 	 END LOOP;
2210 
2211       /* Code for handling the records with operation 'D' Flag*/
2212 
2213 	--Start Bug:5407223---
2214 	/* Delete records from HZ_DQM_SYNC_INTERFACE table if that record already exists in staged table*/
2215 	log('Start Time for delete statements = ' || TO_CHAR(SYSDATE, 'MM-DD-YY HH24:MI:SS'));
2216 	delete /*+ parallel(i)  */ from hz_dqm_sync_interface i where entity='PARTY' and operation='C'
2217 	and party_id in (select /*+ parallel_index(s) index_ffs(s) */ party_id from hz_staged_parties s );
2218 	log (' After delete duplicate party entity records, time= '||TO_CHAR(SYSDATE, 'MM-DD-YY HH24:MI:SS'));
2219 
2220 	delete /*+ parallel(i)  */ from hz_dqm_sync_interface i where entity='PARTY_SITES' and operation='C'
2221 	and record_id in (select /*+ parallel_index(s) index_ffs(s) */ party_site_id from hz_staged_party_sites s );
2222 	log (' After delete duplicate party site entity records '||TO_CHAR(SYSDATE, 'MM-DD-YY HH24:MI:SS') );
2223 
2224 	delete /*+ parallel(i)  */ from hz_dqm_sync_interface i where entity='CONTACTS' and operation='C'
2225 	and record_id in (select /*+ parallel_index(s) index_ffs(s) */ org_contact_id from hz_staged_contacts s );
2226 	log (' After delete duplicate contact entity records = '||TO_CHAR(SYSDATE, 'MM-DD-YY HH24:MI:SS') );
2227 
2228 	delete /*+ parallel(i)  */ from hz_dqm_sync_interface i where entity='CONTACT_POINTS' and operation='C'
2229 	and record_id in (select /*+ parallel_index(s) index_ffs(s) */ contact_point_id from hz_staged_contact_points s );
2230 	log (' After delete duplicate contact point entity records = '||TO_CHAR(SYSDATE, 'MM-DD-YY HH24:MI:SS') );
2231 	log('End Time for delete statements = ' || TO_CHAR(SYSDATE, 'MM-DD-YY HH24:MI:SS'));
2232 
2233 
2234 
2235 	--End Bug:5407223---
2236 
2237 	--start bug 5460390: Add commit
2238 	COMMIT;
2239 	FND_CONCURRENT.AF_Commit;
2240 	log('Committed Records');
2241 	--end bug 5460390
2242         -- Get number of workers
2243         l_num_of_workers := to_number(nvl(p_num_of_workers, '1'));
2244 
2245         -- If number of workers is 0, make it 1
2246         IF (l_num_of_workers <= 0) THEN
2247           l_num_of_workers := 1;
2248         END IF;
2249 
2250         -- Get range if any possible optimization could be done on the number of workers to
2251         -- be deployed
2252         SELECT min(sync_interface_num), max(sync_interface_num) into l_min_id, l_max_id
2253         FROM hz_dqm_sync_interface
2254         WHERE staged_flag = 'N';
2255         l_range := l_max_id - l_min_id;
2256 
2257         IF ( l_range <= l_num_of_workers) THEN
2258             l_num_of_workers := 1;
2259             log('Too less data to process hence reducing the number of workers. ');
2260         END IF;
2261 
2262           l_from_rec := l_min_id;
2266           log ('Data Workers only create/update data');
2263           l_range1 := floor(l_range/l_num_of_workers);
2264 
2265           log('Total number of Data Workers deployed = ' || l_num_of_workers );
2267 
2268           --get request_id of this program
2269           l_request_id := FND_GLOBAL.conc_request_id ;
2270 
2271         -- Deploy Data Workers
2272 
2273         FIRST := TRUE ;
2274         FOR I in 1..l_num_of_workers LOOP
2275             j := j + 1;
2276             l_to_rec := l_from_rec + l_range1;
2277             IF (l_to_rec > l_max_id) THEN
2278                 l_to_rec := l_max_id;
2279             END IF;
2280            log ( 'Calling the DQM Import Sync child program for Data Worker ' || i);
2281            log ( 'l_from_rec and l_to_rec are : ' || to_char(l_from_rec) || ' , ' || TO_CHAR(l_to_rec) );
2282 
2283            l_sub_requests(i) := FND_REQUEST.SUBMIT_REQUEST('AR', 'ARHDCH',
2284                             'DQM Import Sync Child Program' || to_char(i),
2285                             NULL,--Bug No:3941365
2286                             true, to_char(l_from_rec), TO_CHAR(l_to_rec), 'BATCH');
2287 
2288            -- Boolean used to track the submission of the parallel sync concurrent program
2289 
2290            IF l_sub_requests(i) = 0 THEN
2291                 log('Error submitting worker ' || i);
2292                 log(fnd_message.get);
2293            ELSE
2294                 log('Submitted request for Worker ' || TO_CHAR(I) );
2295                 log('Request ID : ' || l_sub_requests(i));
2296 
2297                     IF FIRST
2298                     THEN
2299                         FIRST := FALSE ;
2300 
2301                         log('Calling Parallel Sync Index concurrent program');
2302                         log('Request Id of the program to be waited on, that is being passed to this : ' || l_request_id );
2303                         l_index_conc_program_req_id := FND_REQUEST.SUBMIT_REQUEST('AR',
2304                                                                  'ARHDQMPP',
2305                                                                  'DQM Parallel Sync Index Parent Program',
2306                                                                   NULL,
2307                                                                   FALSE,
2308                                                                   l_request_id
2309                                   );
2310                         log('Request Id of Parallel Sync concurrent Program is  : ' || l_index_conc_program_req_id );
2311                     END IF ;
2312            END IF;
2313 
2314            EXIT when l_sub_requests(i) = 0;
2315            l_from_rec := l_to_rec + 1;
2316            IF (l_to_rec >= l_max_id) THEN
2317                 EXIT;
2318            END IF;
2319         END LOOP;
2320 
2321       -- be in paused status until all the concurrent requests submitted have completed
2322       fnd_conc_global.set_req_globals(conc_status => 'PAUSED',
2323                                         request_data => 'END') ;
2324       err  := 'Concurrent Workers submitted.';
2325       retcode := 0;
2326 
2327   ELSIF( req_data = 'END') THEN
2328           -- This is for error handling, to make sure that after the
2329           -- control of this program returns here, that we catch any
2330           -- errored concurrent requests that were spawned by this program
2331           -- and if any of them errored out, we error out this program
2332           -- itself
2333           log ('checking completion status of child programs spawned by tis program' );
2334           l_workers_completed := TRUE;
2335 
2336           -- program id is hard coded since any conc program submitted by this program is construed
2337           -- as its child in FND_CONCURRENT_REQUESTS, regardless of the TRUE/FALSE flag
2338           -- used in FND_CONCURRENT.SUBMIT_REQUEST
2339 
2340           select request_id BULK COLLECT into l_sub_requests
2341           from fnd_concurrent_requests R
2342           where parent_request_id = l_request_id
2343           and concurrent_program_id = 46839
2344           and (phase_code<>'C' or status_code<>'C');
2345 
2346           IF  l_sub_requests.count > 0 THEN
2347             l_workers_completed := FALSE;
2348             FOR I in 1..l_sub_requests.COUNT LOOP
2349               outandlog('Worker with request id ' || l_sub_requests(I) );
2350               outandlog('Did not complete normally.');
2351               retcode := 2;
2352               log(' retcode = ' || retcode);
2353               RAISE FND_API.G_EXC_ERROR;
2354             END LOOP;
2355           END IF;
2356 	  --Start of Bug No : 4915282
2357 	  --Set the index transactional, if the search on non indexed records is enabled.
2358 	  L_REALTIME_SYNC_VALUE := nvl(FND_PROFILE.VALUE('HZ_DQM_ENABLE_REALTIME_SYNC'), 'Y');
2359           IF(L_REALTIME_SYNC_VALUE = 'Y') THEN
2360 	    OPEN c_non_indexed;
2361 	    FETCH c_non_indexed INTO l_index_count;
2362 	    if(c_non_indexed%FOUND) then
2363     	      HZ_DQM_SYNC.set_index_transactional(enabled=>'Y');
2364             end if;
2365 	    CLOSE c_non_indexed;
2366           END IF;
2367 	  --End of Bug No : 4915282
2368   END IF;
2369 
2370 EXCEPTION
2371   WHEN FND_API.G_EXC_ERROR THEN
2372     log('DQM Synchronization Program Aborted');
2373     retcode := 2;
2374     err := err || logerror || SQLERRM;
2375     RAISE;
2376   WHEN OTHERS THEN
2377     log('DQM Synchronization Program Aborted');
2378     retcode := 2;
2379     err := err || logerror || SQLERRM;
2380     RAISE;
2381 END sync_parties;
2382 
2383 
2384 PROCEDURE sync_index_conc(
2385         retcode                 OUT    NOCOPY VARCHAR2,
2386         err                     OUT    NOCOPY VARCHAR2,
2387         p_index_name            IN     VARCHAR2 ) IS
2388 BEGIN
2389   log('Index being synched ...  ' || p_index_name);
2390   sync_index( p_index_name, retcode, err);
2391   if (retcode=2) then
2392    RAISE FND_API.G_EXC_ERROR;
2393   end if;
2394   EXCEPTION
2395   WHEN OTHERS THEN
2396     retcode :=  2;
2397     err := SQLERRM;
2398     RAISE FND_API.G_EXC_ERROR;--
2399 END sync_index_conc;
2400 
2401 ----------------------------------------
2402 -- VJN Changes for SYNC in R12
2403 ---------------------------------------
2404 
2405 -- VJN modified for R12 for Bulk Import
2406 -- This API would be called by the Bulk Import Post Processing Program, to directly insert
2407 -- data into the STAGING tables
2408 
2409 -- REPURI, Modifying to procedure signature to process the records in bulk mode. Bug 4884735.
2410 PROCEDURE sync_work_unit_imp(
2411   p_batch_id        IN          NUMBER,
2412   p_batch_mode_flag IN          VARCHAR2,
2413   p_from_osr        IN          VARCHAR2,
2414   p_to_osr          IN          VARCHAR2,
2415   p_os              IN          VARCHAR2,
2416   x_return_status   OUT NOCOPY  VARCHAR2,
2417   x_msg_count       OUT NOCOPY  NUMBER,
2418   x_msg_data        OUT NOCOPY  VARCHAR2
2419 )
2420 IS
2421 
2422   l_sync_party_cur      HZ_DQM_SYNC.SyncCurTyp;
2423   l_sync_party_site_cur HZ_DQM_SYNC.SyncCurTyp;
2424   l_sync_contact_cur    HZ_DQM_SYNC.SyncCurTyp;
2425   l_sync_cpt_cur        HZ_DQM_SYNC.SyncCurTyp;
2426 
2427 BEGIN
2428   -- Part of DQM Bulk Import Sync Peformance Improvements Project (REPURI). Bug 4884735.
2429 
2430   -- Instead of calling the sync_single_xxx_online in a LOOP for each row, we now call
2431   -- the new open_bulk_imp_sync_xxx_cur and pass the IN OUT CURSOR to sync_all_xxx APIs
2432   -- for all the 4 entities, to Fetch and Insert/Update data in Bulk Mode.
2433 
2434   log ('-----------------------------');
2435   log ('Begin Bulk Import SYNC');
2436   log ('-----------------------------');
2437   log ('');
2438   log ('------------------------');
2439   log ('Incoming variable values');
2440   log ('------------------------');
2441   log ('p_batch_id - '|| p_batch_id);
2442   log ('p_batch_mode_flag - '||p_batch_mode_flag);
2443   log ('p_from_osr - '||p_from_osr);
2444   log ('p_to_osr - '||p_to_osr);
2445   log ('p_os - '||p_os);
2446   log ('------------------------');
2447 
2448   -- Sync all organization parties
2449   -- For Create
2450   log ('-----------------------------');
2451   log ('For Create Organization Party');
2452   log ('-----------------------------');
2453 
2454   log ('Calling HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_party_cur');
2455   HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_party_cur (
2456      p_batch_id         => p_batch_id
2457     ,p_batch_mode_flag  => p_batch_mode_flag
2458     ,p_from_osr         => p_from_osr
2459     ,p_to_osr           => p_to_osr
2460     ,p_os               => p_os
2461     ,p_party_type       => 'ORGANIZATION'
2462     ,p_operation        => 'I'
2463     ,x_sync_party_cur   => l_sync_party_cur
2464   );
2465 
2466   log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_parties');
2467   HZ_STAGE_MAP_TRANSFORM.sync_all_parties ('C', 'IMPORT_SYNC', l_sync_party_cur);
2468 
2469   -- For Update
2470   log ('-----------------------------');
2471   log ('For Update Organization Party');
2472   log ('-----------------------------');
2473 
2474   log ('Calling HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_party_cur');
2475   HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_party_cur (
2476      p_batch_id         => p_batch_id
2477     ,p_batch_mode_flag  => p_batch_mode_flag
2478     ,p_from_osr         => p_from_osr
2479     ,p_to_osr           => p_to_osr
2480     ,p_os               => p_os
2481     ,p_party_type       => 'ORGANIZATION'
2482     ,p_operation        => 'U'
2483     ,x_sync_party_cur   => l_sync_party_cur
2484   );
2485 
2486   log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_parties');
2487   HZ_STAGE_MAP_TRANSFORM.sync_all_parties ('U', 'IMPORT_SYNC', l_sync_party_cur);
2488 
2489   -- Sync all person parties
2490   -- For Create
2491 
2492   log ('-----------------------');
2493   log ('For Create Person Party');
2494   log ('-----------------------');
2495 
2496   log ('Calling HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_party_cur');
2497   HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_party_cur (
2498      p_batch_id         => p_batch_id
2499     ,p_batch_mode_flag  => p_batch_mode_flag
2500     ,p_from_osr         => p_from_osr
2501     ,p_to_osr           => p_to_osr
2502     ,p_os               => p_os
2503     ,p_party_type       => 'PERSON'
2504     ,p_operation        => 'I'
2505     ,x_sync_party_cur   => l_sync_party_cur
2506   );
2507 
2508   log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_parties');
2509   HZ_STAGE_MAP_TRANSFORM.sync_all_parties ('C', 'IMPORT_SYNC', l_sync_party_cur);
2510 
2511   -- For Update
2512 
2513   log ('-----------------------');
2514   log ('For Update Person Party');
2515   log ('-----------------------');
2516 
2517   log ('Calling HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_party_cur');
2518   HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_party_cur (
2519      p_batch_id         => p_batch_id
2520     ,p_batch_mode_flag  => p_batch_mode_flag
2521     ,p_from_osr         => p_from_osr
2522     ,p_to_osr           => p_to_osr
2523     ,p_os               => p_os
2524     ,p_party_type       => 'PERSON'
2525     ,p_operation        => 'U'
2526     ,x_sync_party_cur   => l_sync_party_cur
2527   );
2528 
2529   log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_parties');
2530   HZ_STAGE_MAP_TRANSFORM.sync_all_parties ('U', 'IMPORT_SYNC', l_sync_party_cur);
2531 
2532   -- Sync all party_sites
2533   -- For Create
2534 
2535   log ('----------------------');
2536   log ('For Create Party Sites');
2537   log ('----------------------');
2538 
2539   log ('Calling HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_psite_cur');
2543     ,p_from_osr            => p_from_osr
2540   HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_psite_cur (
2541      p_batch_id            => p_batch_id
2542     ,p_batch_mode_flag     => p_batch_mode_flag
2544     ,p_to_osr              => p_to_osr
2545     ,p_os                  => p_os
2546     ,p_operation           => 'I'
2547     ,x_sync_party_site_cur => l_sync_party_site_cur
2548   );
2549 
2550   log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_party_sites');
2551   HZ_STAGE_MAP_TRANSFORM.sync_all_party_sites ('C', 'IMPORT_SYNC', l_sync_party_site_cur);
2552 
2553   -- For Update
2554   log ('----------------------');
2555   log ('For Update Party Sites');
2556   log ('----------------------');
2557 
2558   log ('Calling HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_psite_cur');
2559   HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_psite_cur (
2560      p_batch_id            => p_batch_id
2561     ,p_batch_mode_flag     => p_batch_mode_flag
2562     ,p_from_osr            => p_from_osr
2563     ,p_to_osr              => p_to_osr
2564     ,p_os                  => p_os
2565     ,p_operation           => 'U'
2566     ,x_sync_party_site_cur => l_sync_party_site_cur
2567   );
2568 
2569   log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_party_sites');
2570   HZ_STAGE_MAP_TRANSFORM.sync_all_party_sites ('U', 'IMPORT_SYNC', l_sync_party_site_cur);
2571 
2572   -- Sync all contacts
2573   -- For Create
2574   log ('-------------------');
2575   log ('For Create Contacts');
2576   log ('-------------------');
2577 
2578   log ('Calling HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_ct_cur');
2579   HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_ct_cur (
2580      p_batch_id            => p_batch_id
2581     ,p_batch_mode_flag     => p_batch_mode_flag
2582     ,p_from_osr            => p_from_osr
2583     ,p_to_osr              => p_to_osr
2584     ,p_os                  => p_os
2585     ,p_operation           => 'I'
2586     ,x_sync_contact_cur    => l_sync_contact_cur
2587   );
2588 
2589   log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_contacts');
2590   HZ_STAGE_MAP_TRANSFORM.sync_all_contacts ('C', 'IMPORT_SYNC', l_sync_contact_cur);
2591   -- For Update
2592   log ('-------------------');
2593   log ('For Update Contacts');
2594   log ('-------------------');
2595 
2596   log ('Calling HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_ct_cur');
2597   HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_ct_cur (
2598      p_batch_id            => p_batch_id
2599     ,p_batch_mode_flag     => p_batch_mode_flag
2600     ,p_from_osr            => p_from_osr
2601     ,p_to_osr              => p_to_osr
2602     ,p_os                  => p_os
2603     ,p_operation           => 'U'
2604     ,x_sync_contact_cur    => l_sync_contact_cur
2605   );
2606 
2607   log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_contacts');
2608   HZ_STAGE_MAP_TRANSFORM.sync_all_contacts ('U', 'IMPORT_SYNC', l_sync_contact_cur);
2609 
2610   -- Sync all contact_points
2611   -- For Create
2612 
2613   log ('-------------------------');
2614   log ('For Create Contact Points');
2615   log ('-------------------------');
2616 
2617   log ('Calling HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_cpt_cur');
2618   HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_cpt_cur (
2619      p_batch_id            => p_batch_id
2620     ,p_batch_mode_flag     => p_batch_mode_flag
2621     ,p_from_osr            => p_from_osr
2622     ,p_to_osr              => p_to_osr
2623     ,p_os                  => p_os
2624     ,p_operation           => 'I'
2625     ,x_sync_cpt_cur        => l_sync_cpt_cur
2626   );
2627 
2628   log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_contact_points');
2629   HZ_STAGE_MAP_TRANSFORM.sync_all_contact_points ('C', 'IMPORT_SYNC', l_sync_cpt_cur);
2630 
2631   -- For Update
2632 
2633   log ('-------------------------');
2634   log ('For Update Contact Points');
2635   log ('-------------------------');
2636 
2637   log ('Calling HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_cpt_cur');
2638   HZ_STAGE_MAP_TRANSFORM.open_bulk_imp_sync_cpt_cur (
2639      p_batch_id            => p_batch_id
2640     ,p_batch_mode_flag     => p_batch_mode_flag
2641     ,p_from_osr            => p_from_osr
2642     ,p_to_osr              => p_to_osr
2643     ,p_os                  => p_os
2644     ,p_operation           => 'U'
2645     ,x_sync_cpt_cur        => l_sync_cpt_cur
2646   );
2647 
2648   log ('Calling HZ_STAGE_MAP_TRANSFORM.sync_all_contact_points');
2649   HZ_STAGE_MAP_TRANSFORM.sync_all_contact_points ('U', 'IMPORT_SYNC', l_sync_cpt_cur);
2650 
2651 END ;
2652 
2653 -- This would take a request_id , see if the corresponding conc program is complete
2654 -- and return TRUE or FALSE
2655 FUNCTION is_conc_complete ( p_request_id IN NUMBER) RETURN BOOLEAN
2656 IS
2657 req_id NUMBER ;
2658 rphase varchar2(30);
2659 rstatus varchar2(30);
2660 dphase varchar2(30);
2661 dstatus varchar2(30);
2662 message varchar2(240);
2663 status boolean ;
2664 
2665 BEGIN
2666 -- set request id we want to query
2667 req_id := p_request_id ;
2668 
2669 -- call FND procedure to find status of concurrent program
2670 status := FND_CONCURRENT.GET_REQUEST_STATUS(req_id, NULL, NULL, rphase,rstatus,dphase,dstatus,message);
2671 
2672 -- Return true any time request is complete
2673 -- IF dphase = 'RUNNING'  OR  dphase = 'PENDING'
2674  IF dphase = 'COMPLETE'
2675  THEN
2676     RETURN TRUE ;
2677  ELSE
2678     RETURN FALSE ;
2679  END IF ;
2680 
2681 END ;
2682 
2683 -- This will return true if the passed in index has any rows to be synced
2684 -- else will return false
2685 FUNCTION is_index_pending( p_index_name IN VARCHAR2,p_owner_name IN VARCHAR2) RETURN BOOLEAN
2686 IS
2687 BEGIN
2688        --bug 5929615
2689     FOR cur in
2690     ( SELECT 'Y' FROM
2691  (
2692  select
2693  u.name      pnd_index_owner,
2694  idx_name    pnd_index_name,
2695  ixp_name    pnd_partition_name,
2696  pnd_rowid,
2697  pnd_timestamp
2698  from ctxsys.dr$pending, ctxsys.dr$index i, ctxsys.dr$index_partition p,
2699  sys.user$ u
2700  where idx_owner# = u.user#
2701  and idx_id = ixp_idx_id
2702  and pnd_pid = ixp_id
2703  and pnd_pid <> 0
2704  and pnd_cid = idx_id
2705  UNION ALL
2706  select
2707  u.name      pnd_index_owner,
2708  idx_name    pnd_index_name,
2709  null        pnd_partition_name,
2710  pnd_rowid,
2711  pnd_timestamp
2712  from ctxsys.dr$pending, ctxsys.dr$index i, sys.user$ u
2713  where idx_owner# = u.user#
2714  and pnd_pid = 0
2715  and pnd_cid = idx_id
2716  )
2717  WHERE PND_INDEX_NAME = p_index_name
2718  and pnd_index_owner=p_owner_name
2719  and rownum =1
2720 
2721     )
2722     LOOP
2723         RETURN TRUE ;
2724     END LOOP ;
2725 
2726    RETURN FALSE ;
2727 END ;
2728 
2729 -- VJN Introduced for setting transactional property of Index, a new feature
2730 -- for text indexes, available as part of 10g.
2731 PROCEDURE set_index_transactional( enabled IN VARCHAR2 )
2732 IS
2733 l_bool boolean ;
2734 
2735 l_status VARCHAR2(255);
2736 l_temp VARCHAR2(255);
2737 l_index_owner VARCHAR2(255);
2738 index_cnt NUMBER;
2739 BEGIN
2740      -- GET THE INDEX OWNER INSTEAD OF HARDCODING IT
2741      -- THIS FND FUNCTION, WILL TAKE THE APPLICATION SHORT NAME AND RETURN THE ORACLE_SCHEMA FOR THE USER
2742      -- AND THIS IS ESSENTIALLY THE INDEX OWNER
2743 
2744      l_bool := fnd_installation.GET_APP_INFO('AR',l_status,l_temp,l_index_owner);
2745 
2746      -- Propagating the changes done for Bug:4706376
2747      SELECT COUNT(*) INTO index_cnt FROM HZ_DQM_STAGE_LOG WHERE OPERATION='ALTER_INDEX';
2748 
2749      IF enabled = 'Y'
2750      THEN
2751             EXECUTE IMMEDIATE 'ALTER INDEX ' || l_index_owner ||
2752                               '.hz_stage_parties_t1 rebuild parameters(''replace metadata transactional'')';
2753             EXECUTE IMMEDIATE 'ALTER INDEX ' || l_index_owner ||
2754                               '.hz_stage_party_sites_t1 rebuild parameters(''replace metadata transactional'')';
2755             EXECUTE IMMEDIATE 'ALTER INDEX ' || l_index_owner ||
2756                               '.hz_stage_contact_t1 rebuild parameters(''replace metadata transactional'')';
2757             EXECUTE IMMEDIATE 'ALTER INDEX ' || l_index_owner ||
2758                               '.hz_stage_cpt_t1 rebuild parameters(''replace metadata transactional'')';
2759 
2760         -- Propagating the changes done for Bug:4706376
2761         if(index_cnt=null OR index_cnt=0) then
2762             insert into hz_dqm_stage_log(OPERATION, NUMBER_OF_WORKERS,WORKER_NUMBER,STEP,START_FLAG,START_TIME,END_FLAG,
2763                         END_TIME,LAST_UPDATE_DATE, CREATION_DATE,CREATED_BY,LAST_UPDATED_BY,LAST_UPDATE_LOGIN )
2764                         values ('ALTER_INDEX',1,1,'STAGED_TABLES','Y',sysdate,'Y',null,sysdate,sysdate,
2765             fnd_global.user_id,fnd_global.user_id,fnd_global.login_id);
2766         else
2767             update hz_dqm_stage_log set start_flag='Y',end_flag='Y',start_time=sysdate,
2768             last_update_date=sysdate,last_update_login=fnd_global.login_id
2769             where operation='ALTER_INDEX';
2770         end if;
2771 
2772      ELSE
2773             EXECUTE IMMEDIATE 'ALTER INDEX ' || l_index_owner ||
2774                               '.hz_stage_parties_t1 rebuild parameters(''replace metadata nontransactional'')';
2775             EXECUTE IMMEDIATE 'ALTER INDEX ' || l_index_owner ||
2776                               '.hz_stage_party_sites_t1 rebuild parameters(''replace metadata nontransactional'')';
2777             EXECUTE IMMEDIATE 'ALTER INDEX ' || l_index_owner ||
2778                               '.hz_stage_contact_t1 rebuild parameters(''replace metadata nontransactional'')';
2779             EXECUTE IMMEDIATE 'ALTER INDEX ' || l_index_owner ||
2780                               '.hz_stage_cpt_t1 rebuild parameters(''replace metadata nontransactional'')';
2781 
2782         -- Propagating the changes done for Bug:4706376
2783         if(index_cnt=null OR index_cnt=0) then
2784             insert into hz_dqm_stage_log(OPERATION, NUMBER_OF_WORKERS,WORKER_NUMBER,STEP,START_FLAG,START_TIME,END_FLAG,
2785                         END_TIME,LAST_UPDATE_DATE, CREATION_DATE,CREATED_BY,LAST_UPDATED_BY,LAST_UPDATE_LOGIN)
2786                         values ('ALTER_INDEX',1,1,'STAGED_TABLES','N',sysdate,'N',null,sysdate,sysdate,
2787             fnd_global.user_id,fnd_global.user_id,fnd_global.login_id);
2788         else
2789             update hz_dqm_stage_log set start_flag='N',end_flag='N',start_time=sysdate,
2790             last_update_date=sysdate,last_update_login=fnd_global.login_id
2791             where operation='ALTER_INDEX';
2792         end if;
2793 
2794      END IF ;
2795      EXCEPTION WHEN OTHERS THEN
2796            NULL ;
2797 
2798 END ;
2799 
2800 -- conc program executable for Serial Sync Index Concurrent Program
2801 -- This will be used only by online (API) flows
2802 PROCEDURE sync_index_serial(
2803         retcode                 OUT    NOCOPY VARCHAR2,
2804         err                     OUT    NOCOPY VARCHAR2
2805         )
2806 IS
2807 idx_name VARCHAR2(300);
2808 l_index_owner VARCHAR2(255);
2809 l_status VARCHAR2(255);
2810 l_tmp		VARCHAR2(2000);
2811 BEGIN
2812      retcode := 0;
2813      err := null;
2814 
2815      -- Sequentially Sync all indexes one by one
2816      -- set OUT variables and write any messages to logs appropriately
2817      -- Fix for bug 5048604. Moved the call to Parties Sync Index to be the last, instead of being first.
2818      IF ( fnd_installation.GET_APP_INFO('AR', l_status, l_tmp, l_index_owner ))
2819      THEN
2820              log ( 'index_owner is ' || l_index_owner );
2821              BEGIN
2822                 idx_name := l_index_owner || '.hz_stage_party_sites_t1';
2823                 ad_ctx_Ddl.Sync_Index (idx_name);
2824                 log ('Successful in syncing hz_stage_party_sites_t1 ');
2825              EXCEPTION
2826              WHEN OTHERS THEN
2827                 retcode :=  2;
2828                 err := SQLERRM;
2829                 log ('Error syncing hz_stage_party_sites_t1 :' ||  SQLERRM);
2830              END ;
2831 
2832              BEGIN
2833                 idx_name := l_index_owner || '.hz_stage_contact_t1';
2834                 ad_ctx_Ddl.Sync_Index (idx_name);
2835                 log ('Successful in syncing hz_stage_contact_t1 ');
2836              EXCEPTION
2837              WHEN OTHERS THEN
2838                 retcode :=  2;
2839                 err := SQLERRM;
2840                 log ('Error syncing hz_stage_contact_t1 :' ||  SQLERRM);
2841              END ;
2842 
2843              BEGIN
2844                 idx_name := l_index_owner || '.hz_stage_cpt_t1';
2845                 ad_ctx_Ddl.Sync_Index (idx_name);
2846                 log ('Successful in syncing hz_stage_cpt_t1 ');
2847              EXCEPTION
2848              WHEN OTHERS THEN
2849                 retcode :=  2;
2850                 err := SQLERRM;
2851                 log ('Error syncing hz_stage_cpt_t1 :' ||  SQLERRM);
2852              END ;
2853 
2854              BEGIN
2855                 idx_name := l_index_owner || '.hz_stage_parties_t1';
2856                 ad_ctx_Ddl.Sync_Index (idx_name);
2857                 log ('Successful in syncing hz_stage_parties_t1 ');
2858              EXCEPTION
2859              WHEN OTHERS THEN
2860                 retcode :=  2;
2861                 err := SQLERRM;
2862                 log ('Error syncing hz_stage_parties_t1 :' ||  SQLERRM);
2863              END ;
2864 
2865      END IF ;
2866 
2867 END ;
2868 
2869 -- conc program executable for Parallel Sync Index Parent Concurrent Program
2870 -- This will be used by both Manual ( Batch) Synchronization and Bulk Import
2871 
2872 PROCEDURE sync_index_parallel_parent (
2873         retcode                 OUT    NOCOPY VARCHAR2,
2874         err                     OUT    NOCOPY VARCHAR2,
2875         p_request_id            IN     NUMBER
2876         )
2877 IS
2878 req_data VARCHAR2(100);
2879 idx_name VARCHAR2(300);
2880 l_index_owner VARCHAR2(255);
2881 l_status VARCHAR2(255);
2882 l_tmp		VARCHAR2(2000);
2883 idx_retcode varchar2(1);
2884 idx_err     varchar2(2000);
2885 TYPE nTable IS TABLE OF NUMBER index by binary_integer;
2886 l_sub_requests nTable;
2887 l_workers_completed boolean ;
2888 
2889 BEGIN
2890    -- req_data will be null the first time, by default
2891   req_data := fnd_conc_global.request_data;
2892 
2893   -- First Phase
2894   -- Submit the Parallel Sync Index Child Concurrent Progarm for each one of the indexes
2895   IF (req_data IS NULL)
2896   THEN
2897       retcode := 0;
2898 
2899       log('------------------------------');
2900       log('Starting DQM Parallel Sync Index Parent Program ');
2901 
2902       FND_MSG_PUB.initialize;
2903 
2904 
2905       IF ( fnd_installation.GET_APP_INFO('AR', l_status, l_tmp, l_index_owner ))
2906       THEN
2907         log ( 'index_owner is ' || l_index_owner );
2908 
2909         -- Submit requests for the Parallel Sync Index Child concurrent program
2910         -- for creating the four indexes
2911         FOR i in 1..4
2912         LOOP
2913           IF (i = 1) THEN
2914               idx_name := l_index_owner || '.hz_stage_parties_t1';
2915           ELSIF ( i = 2) THEN
2916               idx_name := l_index_owner || '.hz_stage_party_sites_t1';
2917           ELSIF ( i = 3) THEN
2918               idx_name := l_index_owner || '.hz_stage_contact_t1';
2919           ELSE
2920               idx_name :=l_index_owner || '.hz_stage_cpt_t1';
2921           END IF;
2922 
2923           log('Calling the Parallel Sync Index Child program for index ' || idx_name );
2924           l_sub_requests(i) := FND_REQUEST.SUBMIT_REQUEST('AR',
2925                                                           'ARHDQMPC',
2926                                                           'DQM Parallel Sync Index Child Program' || to_char(i),
2927                                                            NULL,
2928                                                            TRUE,
2929                                                            p_request_id,
2930                                                            idx_name);
2931            IF l_sub_requests(i) = 0 THEN
2932                 log('Error submitting index worker for ' || idx_name);
2933                 log(fnd_message.get);
2934            ELSE
2935                 log('Submitted request for index worker ' || idx_name );
2936                 log('Request ID : ' || l_sub_requests(i));
2937            END IF;
2938            EXIT when l_sub_requests(i) = 0;
2939          END LOOP;
2940 
2941         -- This will make sure that the parent is waits until the above requests complete
2942         fnd_conc_global.set_req_globals(conc_status => 'PAUSED', request_data => 'END') ;
2943         return;
2944 
2945 
2946         END IF;
2947 
2948   END IF ;
2949 
2950   -- Second Phase
2951   -- After all workers have completed, see if they have completed normally
2952   IF req_data = 'END'
2953   THEN
2954 
2955 
2956       -- assume that all concurrent dup workers completed normally, unless found otherwise
2957       l_workers_completed := TRUE;
2958 
2959       -- get request ids that did not complete
2960       Select request_id BULK COLLECT into l_sub_requests
2961       from Fnd_Concurrent_Requests R
2962       Where Parent_Request_Id = FND_GLOBAL.conc_request_id
2963       and (phase_code<>'C' or status_code<>'C');
2964 
2965       -- log these request_ids and set the return code of the parent concurrent program
2966       -- to 2 ie., ERROR
2967       IF  l_sub_requests.count>0 THEN
2968         l_workers_completed:=FALSE;
2969         FOR I in 1..l_sub_requests.COUNT LOOP
2970           log('Index worker with request id ' || l_sub_requests(I) );
2971           log('did not complete normally');
2972           retcode := 2;
2973         END LOOP;
2974       END IF;
2975 
2976       -- If any worker has not completed just return
2977       IF (l_workers_completed = false)
2978       THEN
2979         return;
2980       END IF ;
2981 
2982       -- This means success
2983       log('All the Child Index workers completed successfully');
2984 
2985 
2986   END IF ;
2987 
2988   EXCEPTION
2989   WHEN OTHERS THEN
2990     log('Parallel Sync Index Parent Program Aborted');
2991     retcode := 2;
2992     err := err || logerror || SQLERRM;
2993 
2994 
2995 END ;
2996 
2997 -- conc program executable for Parallel Sync Index Child Concurrent Program
2998 -- This will be used by both Manual ( Batch) Synchronization and Bulk Import
2999 PROCEDURE sync_index_parallel_child (
3000         retcode                 OUT    NOCOPY VARCHAR2,
3001         err                     OUT    NOCOPY VARCHAR2,
3002         p_request_id            IN     NUMBER,
3003         p_index_name            IN     VARCHAR2
3004         )
3005 IS
3006 idx_name varchar2(300);
3007 owner_name VARCHAR2(30); --bug 5929615
3008 BEGIN
3009   log ( ' Starting Sync Index Parallel Child concurrent Program for index ' || p_index_name );
3010 
3011   idx_name := substrb( upper(p_index_name),instrb( upper(p_index_name),'.' ) + 1 ) ;
3012    owner_name := SubStrB(Upper(p_index_name),0,instrb( upper(p_index_name),'.' )-1); --bug 5929615
3013   log ( ' Schema name stripped index is ' || idx_name );
3014    log ( ' index owner is ' || owner_name );
3015 
3016 
3017    retcode := 0;
3018    err := null;
3019 
3020    -- we make sure that we call the sync index atleast once, regardless of the status
3021    -- of the concurrent program to be waited on ( just to make sure, if the completion happens
3022    -- so fast that we have nothing to SYNC
3023    LOOP
3024           BEGIN
3025             -- SYNC THE INDEX IF THERE IS ANY IN THE PENDING QUEUE
3026             IF is_index_pending( idx_name,owner_name)    --bug 5929615
3027             THEN
3028                 ad_ctx_Ddl.Sync_Index (p_index_name );
3029             END IF ;
3030 
3031             -- WHEN EXCEPTION HAPPENS GET THE HELL OUT OF HERE
3032             EXCEPTION
3033             WHEN OTHERS THEN
3034                retcode :=  2;
3035                err := SQLERRM;
3036                log ('Error syncing index ' || p_index_name || ' :' ||  SQLERRM);
3037                return ;
3038           END ;
3039 
3040           /********* will incorporate this in the future
3041           -- sleep for 2 minutes
3042           -- dbms_lock.sleep( 120 );
3043 
3044           ************/
3045 
3046           -- EXIT CONDITION
3047           -- GET THE HELL OUT OF HERE WHEN THE CONCURRENT PROGRAM WE ARE WAITING ON IS COMPLETE
3048           EXIT WHEN is_conc_complete(p_request_id) = TRUE ;
3049 
3050    END LOOP;
3051 
3052 END ;
3053 
3054 END HZ_DQM_SYNC;
3055