DBA Data[Home] [Help]

PACKAGE BODY: APPS.HXC_ARCHIVE

Source


1 PACKAGE BODY hxc_archive AS
2   /* $Header: hxcarchive.pkb 120.13.12020000.2 2012/07/04 09:17:27 amnaraya ship $ */
3 
4 
5 ----------------------------------------------------------------------------
6 -- Procedure Name : archive_process
7 -- Description : This procedure is called during Archive Data Set process.
8 --               For a given data set, it copies the records FROM
9 --               base tables to archive tables AND DELETEs the records in base
10 --               table. It removes the links FROM hxc_tc_ap_links AND
11 --               hxc_ap_detail_links. It cancels open notifications. This
12 --               process is done in chunks.
13 ----------------------------------------------------------------------------
14 PROCEDURE archive_process(p_data_set_id 	NUMBER,
15               		  p_data_set_start_date DATE,
16               		  p_data_set_end_date   DATE)
17 IS
18 
19 -- For the given data set id, pick up all the timecard scope records
20 -- to be dumped into the temp table for processing.
21 
22 CURSOR get_timecards( p_data_set_id   IN NUMBER)
23     IS SELECT /*+ INDEX (HXC HXC_TIME_BUILDING_BLOCKS_N2)*/
24               TIME_BUILDING_BLOCK_ID,TYPE,MEASURE,UNIT_OF_MEASURE,
25               START_TIME,STOP_TIME,PARENT_BUILDING_BLOCK_ID,PARENT_BUILDING_BLOCK_OVN,
26               SCOPE,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,
27               LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,APPROVAL_STATUS,RESOURCE_ID,RESOURCE_TYPE,
28               APPROVAL_STYLE_ID,DATE_FROM,DATE_TO,COMMENT_TEXT,APPLICATION_SET_ID,DATA_SET_ID,
29               TRANSLATION_DISPLAY_KEY
30          FROM hxc_time_building_blocks hxc
31         WHERE data_set_id = p_data_set_id
32           AND scope = 'TIMECARD'
33          ORDER BY time_building_block_id;
34 
35 -- To pick up the details of the timecards processed, grouped by threads- chunks.
36 
37 CURSOR get_log_details
38     IS SELECT temp1.resource_id,
39               temp1.start_time,
40               temp1.time_building_block_id tc_id,
41               temp2.thread_id||'('||temp2.chunk_number||')' detail
42         FROM hxc_ar_detail_log temp2,
43              hxc_ar_tc_ids_temp temp1
44        WHERE temp1.time_building_block_id = temp2.time_building_block_id
45          AND temp1.object_version_number = temp2.object_version_number
46          AND temp2.process_type NOT LIKE '%INCOMPLETE%'
47 	ORDER BY temp2.thread_id,
48                  temp2.chunk_number,
49                  temp1.start_time,
50                  temp1.resource_id     ;
51 
52 -- To pick up the details of the timecards that failed, grouped by threads - chunks.
53 CURSOR get_log_details_failed
54     IS SELECT temp1.resource_id,
55               temp1.start_time,
56               temp1.time_building_block_id tc_id,
57               temp2.thread_id||'('||temp2.chunk_number||')' detail
58         FROM hxc_ar_detail_log temp2,
59              hxc_ar_tc_ids_temp temp1
60        WHERE temp1.time_building_block_id = temp2.time_building_block_id
61          AND temp1.object_version_number = temp2.object_version_number
62          AND temp2.process_type LIKE '%INCOMPLETE%'
63 	ORDER BY temp2.thread_id,
64                  temp2.chunk_number,
65                  temp1.start_time,
66                  temp1.resource_id     ;
67 
68 
69 TYPE tc_tab  IS TABLE OF get_timecards%ROWTYPE;
70 
71 l_tc_tab   tc_tab;
72 
73 l_tc_cnt  NUMBER;
74 l_tc_count  NUMBER;
75 
76 l_chunk_size number;
77 
78 
79 TYPE NUMTABLE IS TABLE OF hxc_time_building_blocks_ar.time_building_block_id%TYPE;
80 TYPE VARCHARTABLE IS TABLE OF VARCHAR2(4000);
81 
82 
83 TYPE NUMBERTABLE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
84 bb_id_tab   NUMBERTABLE;
85 
86 l_index BINARY_INTEGER;
87 --	l_item_key wf_item_attribute_values.item_key%type;
88 
89 l_min_start_time	DATE;
90 l_bb_ctr                BINARY_INTEGER ;
91 
92 l_tc_chunk     NUMBER;
93 l_start        NUMBER;
94 l_stop         NUMBER;
95 id_start       NUMBER;
96 id_stop        NUMBER;
97 l_req_id_tab   NUMBERTABLE ;
98 
99 l_call_status  BOOLEAN ;
100 l_interval     NUMBER := 30;
101 l_phase        VARCHAR2(30);
102 l_status       VARCHAR2(30);
103 l_dev_phase    VARCHAR2(30);
104 l_dev_status   VARCHAR2(30);
105 l_message      VARCHAR2(30);
106 iloop          NUMBER;
107 
108 all_threads_complete      BOOLEAN := FALSE;
109 
110 trans_count    NUMBER := 0;
111 l_debug_info   VARCHAR2(50);
112 l_thread_success  BOOLEAN := TRUE;
113 
114 
115 BEGIN
116 
117   hr_general.g_data_migrator_mode := 'Y';
118 
119   l_chunk_size := nvl(fnd_profile.value('HXC_ARCHIVE_RESTORE_CHUNK_SIZE'),50);
120 
121 fnd_file.put_line(fnd_file.LOG,'--- > Chunk Size is: '||l_chunk_size);
122 
123   -- Update hxc_data_sets as BACKUP_IN_PROGRESS because the process is going to take some time.
124 
125   UPDATE hxc_data_sets
126   SET status = 'BACKUP_IN_PROGRESS'
127   WHERE data_set_id = p_data_set_id;
128 
129   -- Delete from the temp tables,  if there is any left over data.
130 
131   DELETE FROM hxc_ar_detail_log ;
132   DELETE FROM hxc_ar_tc_ids_temp;
133   DELETE FROM hxc_ar_trans_temp;
134   DELETE FROM hxc_data_set_details;
135 
136   l_bb_ctr  := 0;
137 
138   -- Get timecards in this data set.
139   OPEN get_timecards(p_data_set_id);
140   LOOP
141      -- Fetch 500 timecard scope records ( one record is one tbb_id- ovn combination )
142      FETCH get_timecards
143       BULK COLLECT INTO l_tc_tab  LIMIT 500;
144 
145      EXIT WHEN l_tc_tab.COUNT = 0;
146 
147      -- Insert these 500 records into hxc_ar_tc_ids_temp
148      FORALL i IN l_tc_tab.FIRST..l_tc_tab.LAST
149        INSERT INTO hxc_ar_tc_ids_temp
150        --(TIME_BUILDING_BLOCK_ID,TYPE,MEASURE,UNIT_OF_MEASURE,START_TIME,STOP_TIME,PARENT_BUILDING_BLOCK_ID,
151        --SCOPE,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,
152        --APPROVAL_STATUS,RESOURCE_ID,RESOURCE_TYPE,APPROVAL_STYLE_ID,DATE_FROM,DATE_TO,COMMENT_TEXT,
153        --PARENT_BUILDING_BLOCK_OVN,APPLICATION_SET_ID,DATA_SET_ID,TRANSLATION_DISPLAY_KEY)
154          VALUES l_tc_tab(i) ;
155 
156     -- Loop thru the timecard records fetched
157     -- and record the time_building_block_ids
158     -- coming in positions which are multiples of 10.
159     -- Eg. For 500 timecards, pick 0th, 10th, 20th, 30th ids etc.
160 
161     iloop := l_tc_tab.FIRST;
162     WHILE iloop < l_tc_tab.last
163     LOOP
164          l_bb_ctr := l_bb_ctr + 1;
165          -- Copy the ids in 10s positions to this table.
166          bb_id_tab(l_bb_ctr) := l_tc_tab(iloop).time_building_block_id;
167          iloop := iloop + 10;
168          -- If there are only less than 10 records left,
169          -- make the last record as the next one.
170          IF iloop >= l_tc_tab.last
171          THEN
172             iloop := l_tc_tab.last;
173             l_bb_ctr := l_bb_ctr + 1;
174             bb_id_tab(l_bb_ctr) := l_tc_tab(iloop).time_building_block_id;
175          END IF;
176      END LOOP;
177 
178   END LOOP;
179 
180 
181   COMMIT;
182 
183   -- Check how many are there in the plsql table,
184   -- which has timecard ids at an offset of 10.
185   l_tc_count := bb_id_tab.COUNT;
186 
187   -- We would process the below construct of launching the
188   -- multithreaded structure only if there are 10 entries above.
189   -- Meaning 10 * 10, 100 timecards in all to be archived.
190 
191   IF l_tc_count > 10
192   THEN
193      -- There are five threads in all anyways.
194      -- This variable decides how many timecards go to each thread.
195      l_tc_chunk := ceil(l_tc_count/5);
196 
197      l_start := 1;
198      l_stop  := l_tc_chunk ;
199      id_stop := bb_id_tab(l_start);
200 
201      fnd_file.put_line(fnd_file.log,'Following are the bb id ranges for the threads ');
202      fnd_file.put_line(fnd_file.log,'==============================================');
203      FOR i IN 1..4
204      LOOP
205         -- Calculate the start and stop ids and launch the threads.
206         -- ( 1- 4 threads get launched in this loop
207         id_start := id_stop;
208         id_stop  := bb_id_tab(l_stop);
209 
210         l_req_id_tab(i) := FND_REQUEST.SUBMIT_REQUEST( application => 'HXC',
211                                                        program      => 'HXCARCCHILD',
212                                                        description => NULL,
213                                                        sub_request => FALSE,
214                                                        argument1   => id_start,
215                                                        argument2   => id_stop,
216                                                        argument3   => p_data_set_id,
217                                                        argument4   => i );
218         fnd_file.put_line(fnd_file.log,id_start||' -> '||id_stop);
219         COMMIT;
220         l_stop  := l_stop  + l_tc_chunk ;
221         IF l_stop > l_tc_count
222         THEN
223            EXIT;
224         END IF;
225      END LOOP;
226 
227      -- Calculate the last tc id range and launch the fifth thread.
228 
229      id_start  := id_stop;
230      id_stop   := bb_id_tab(bb_id_tab.LAST)+1;
231 
232      fnd_file.put_line(fnd_file.log,id_start||' -> '||id_stop);
233 
234      l_req_id_tab(5) := FND_REQUEST.SUBMIT_REQUEST( application => 'HXC',
235                                                      program      => 'HXCARCCHILD',
236                                                      description => NULL,
237                                                      sub_request => FALSE,
238                                                      argument1   =>   id_start,
239                                                      argument2    =>  id_stop,
240                                                      argument3    =>  p_data_set_id,
241                                                      argument4    =>  5 );
242 
243       COMMIT;
244 
245   ELSE
246      -- This is in case the total number of timecards is less than 100.
247      -- Pretty pointless, having timecards Archived in threads if there are
248      -- only 100.  Launch just one thread, and let it take care of all
249      -- records.
250      id_start  := bb_id_tab(bb_id_tab.FIRST);
251      id_stop   := bb_id_tab(bb_id_tab.LAST)+1;
252 
253      fnd_file.put_line(fnd_file.log,id_start||' -> '||id_stop);
254 
255      l_req_id_tab(5) := FND_REQUEST.SUBMIT_REQUEST( application => 'HXC',
256                                                      program      => 'HXCARCCHILD',
257                                                      description => NULL,
258                                                      sub_request => FALSE,
259                                                      argument1   =>   id_start,
260                                                      argument2    =>  id_stop,
261                                                      argument3    =>  p_data_set_id,
262                                                      argument4    =>  5 );
263      COMMIT;
264   END IF;
265 
266    -- Keep watching the threads until they are completed.
267   WHILE all_threads_complete <> TRUE
268   LOOP
269 
270       all_threads_complete := TRUE;
271 
272       FOR i IN l_req_id_tab.FIRST..l_req_id_tab.LAST
273       LOOP
274           IF l_req_id_tab.EXISTS(i)
275 	  THEN
276              l_call_status := FND_CONCURRENT.get_request_status(l_req_id_tab(i), '', '',
277       			                                     l_phase,
278       			                                     l_status,
279       			                                     l_dev_phase,
280       			                                     l_dev_status,
281       	     		                                     l_message);
282 
283              IF l_call_status = FALSE
284              THEN
285                 fnd_file.put_line(fnd_file.LOG,i||'th request failed');
286                 l_thread_success := FALSE;
287              END IF;
288              IF l_dev_phase <> 'COMPLETE'
289              THEN
290                 all_threads_complete := FALSE;
291              END IF   ;
292           END IF;
293       END LOOP;
294 
295       -- Check if hxc_ar_trans_temp table has records.
296       -- ( Rownum condition put so that no FTS is issued by the DB.
297       --   We dont want the total count, just wanna know if it has atleast
298       --   one record )
299       SELECT COUNT(1)
300         INTO trans_count
301         FROM hxc_ar_trans_temp
302        WHERE rownum < 2;
303 
304       -- If it has records, it means that the thread processes would have
305       -- created RETRIEVAL transaction records in the table. Process them.
306       IF trans_count >= 1
307       THEN
308          -- Update all threads to zero, to ensure we seal them from the threads.
309          UPDATE hxc_ar_trans_temp
310             SET thread_id = 0 ;
311 
312          -- Not much processing left, just insert the records from hxc_transacitons
313          -- to hxc_transactions_ar if they are not present already.
314 
315          INSERT INTO hxc_transactions_ar
316                      (DATA_SET_ID,TRANSACTION_ID,TRANSACTION_PROCESS_ID,TRANSACTION_DATE,TYPE,
317                       STATUS,EXCEPTION_DESCRIPTION,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,
318                       LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,TRANSACTION_CODE)
319               SELECT  /*+ INDEX(bkuptxn hxc_transactions_pk) */
320                       p_data_set_id,bkuptxn.TRANSACTION_ID,TRANSACTION_PROCESS_ID,
321 	              TRANSACTION_DATE,TYPE,STATUS,EXCEPTION_DESCRIPTION,OBJECT_VERSION_NUMBER,
322                       CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,
323 	              TRANSACTION_CODE
324                 FROM hxc_transactions bkuptxn
325                WHERE bkuptxn.transaction_id IN ( SELECT temp.transaction_id
326                                                    FROM hxc_ar_trans_temp temp
327                                                   WHERE thread_id = 0 )
328                  AND bkuptxn.transaction_id NOT IN ( SELECT transaction_id
329                                                        FROM hxc_transactions_ar hxc
330                                                       WHERE bkuptxn.transaction_id = hxc.transaction_id)
331                   ;
332 
333          -- Delete those records from hxc_transactions.
334 
335          -- Bug 11781607
336          -- Added a NOT EXISTS condition to avoid deleting transactions
337          -- which have details falling outside the DATA Set.
338 
339          DELETE FROM hxc_transactions ht
340                WHERE ROWID IN ( SELECT CHARTOROWID(trans_rowid)
341                                   FROM hxc_ar_trans_temp
342                                  WHERE thread_id = 0 )
343                  AND NOT EXISTS( SELECT 1
344                                    FROM hxc_transaction_details htd
345                                   WHERE htd.transaction_id = ht.transaction_id);
346 
347 
348          -- Clear all the records, which are processed.
349 
350          DELETE FROM hxc_ar_trans_temp
351                WHERE thread_id = 0 ;
352 
353          COMMIT;
354 
355       ELSE
356 
357          -- There are no records still in the temp table for transactions.
358          -- Sleep for 10 seconds and try again.
359          dbms_lock.sleep(10);
360 
361       END IF;
362 
363   END LOOP;
364 
365   COMMIT;
366 
367 
368 
369   -- Check if hxc_data_set_details table has records.
370   -- ( Rownum condition put so that no FTS is issued by the DB.
371   --   We dont want the total count, just wanna know if it has atleast
372   --   one record )
373 
374   trans_count := 0;
375   SELECT COUNT(1)
376     INTO trans_count
377     FROM hxc_data_set_details;
378 
379   -- Done with the processing, update the data set status to OFFLINE.
380   IF l_thread_success AND trans_count = 0
381   THEN
382      -- If all threads finished successfully and there is no data left in
383      -- hxc_data_set_details, then mark the data set as OFF_LINE.
384      UPDATE hxc_data_sets
385         SET status = 'OFF_LINE', validation_status = ' '
386       WHERE data_set_id = p_data_set_id;
387 
388   ELSE
389      fnd_file.put_line(fnd_file.LOG,' There were some issues with the process');
390      fnd_file.put_line(fnd_file.LOG,' Either one of the threads failed or there is a data issue ');
394   END IF;
391      fnd_file.put_line(fnd_file.LOG,' Please run the process again to reprocess the failed timecards ');
392      fnd_file.put_line(fnd_file.LOG,' ');
393 
395 
396 
397   COMMIT;
398 
399   l_debug_info := ' ';
400   -- Check if the profile is set for detailed logging.
401   IF fnd_profile.value('HXC_AR_ENABLE_LOG') = 'Y'
402   THEN
403      -- Print out the log.
404      fnd_file.put_line(fnd_file.LOG,' ');
405      fnd_file.put_line(fnd_file.LOG,'Following are the timecards processed ');
406      fnd_file.put_line(fnd_file.LOG,'======================================');
407      fnd_file.put_line(fnd_file.LOG,' ');
408      fnd_file.put_line(fnd_file.LOG,'Person id - Timecard start time [TC ID - Debug information]');
409      fnd_file.put_line(fnd_file.LOG,' ');
410      FOR log_rec IN get_log_details
411      LOOP
412         IF l_debug_info <> log_rec.detail
413         THEN
414            fnd_file.put_line(fnd_file.log,'   ----    ');
415            l_debug_info := log_rec.detail;
416         END IF;
417         hr_utility.trace(log_rec.resource_id||' - '||log_rec.start_time||
418              '  ['||log_rec.tc_id||'-'||log_rec.detail||']');
419         fnd_file.put_line(fnd_file.log,log_rec.resource_id||' - '||log_rec.start_time||
420              '  ['||log_rec.tc_id||'-'||log_rec.detail||']');
421      END LOOP;
422 
423      l_debug_info := ' ';
424      fnd_file.put_line(fnd_file.LOG,' ');
425      fnd_file.put_line(fnd_file.LOG,'Following are the timecards not processed ');
426      fnd_file.put_line(fnd_file.LOG,'==========================================');
427      fnd_file.put_line(fnd_file.LOG,' ');
428      fnd_file.put_line(fnd_file.LOG,'Person id - Timecard start time [TC ID - Debug information]');
429      fnd_file.put_line(fnd_file.LOG,' ');
430      FOR log_rec IN get_log_details_failed
431      LOOP
432         IF l_debug_info <> log_rec.detail
433         THEN
434            fnd_file.put_line(fnd_file.log,'   ----    ');
435            l_debug_info := log_rec.detail;
436         END IF;
437         hr_utility.trace(log_rec.resource_id||' - '||log_rec.start_time||
438              '  ['||log_rec.tc_id||'-'||log_rec.detail||']');
439         fnd_file.put_line(fnd_file.log,log_rec.resource_id||' - '||log_rec.start_time||
440              '  ['||log_rec.tc_id||'-'||log_rec.detail||']');
441      END LOOP;
442   END IF;
443 
444   -- COMMIT and come out of the process.
445   COMMIT;
446 
447 END archive_process;
448 
449 
450 
451 
452 -- Public Procedure child_archive_process
453 -- Added as part of re-architecture to multithread the process.
454 -- Would be called from the Worker process for Archive Data Set.
455 
456 
457 PROCEDURE child_archive_process ( errbuf         OUT  NOCOPY VARCHAR2,
458                                   retcode        OUT  NOCOPY NUMBER,
459                                   p_from_id      IN   NUMBER,
460                                   p_to_id        IN   NUMBER,
461                                   p_data_set_id  IN   NUMBER,
462                                   p_thread_id    IN   NUMBER )
463 IS
464 
465 
466 CURSOR get_tcs
467     IS SELECT time_building_block_id,
468               object_version_number
469          FROM hxc_ar_tc_ids_temp
470         WHERE time_building_block_id >= p_from_id
471           AND time_building_block_id < p_to_id   ;
472 
473 CURSOR get_transactions
474     IS SELECT /*+ LEADING(temp) */
475               transaction_detail_id,
476               transaction_id,
477               ROWIDTOCHAR(ar.ROWID)
478          FROM hxc_temp_timecard_chunks temp,
479               hxc_transaction_details ar
480         WHERE ar.time_building_block_id = temp.id
481           AND ar.time_building_block_ovn = temp.ref_ovn
482           AND thread_id = p_thread_id ;
483 
484 -- Bug 8888813
485 -- Added this new cursor to pick up from the table for
486 -- DEPOSIT transactions.
487 CURSOR get_dep_transactions
488     IS SELECT /*+ LEADING(temp) */
489               transaction_detail_id,
490               transaction_id,
491               ROWIDTOCHAR(ar.ROWID)
492          FROM hxc_temp_timecard_chunks temp,
493               hxc_dep_transaction_details ar
494         WHERE ar.time_building_block_id = temp.id
495           AND ar.time_building_block_ovn = temp.ref_ovn
496           AND thread_id = p_thread_id ;
497 
498 
499 CURSOR get_attributes
500     IS SELECT /*+ LEADING(temp) */
501               DISTINCT
502               time_attribute_usage_id,
503               time_attribute_id,
504               ROWIDTOCHAR(ar.ROWID)
505          FROM hxc_temp_timecard_chunks temp,
506               hxc_time_attribute_usages ar
507         WHERE ar.time_building_block_id = temp.id
508           AND thread_id = p_thread_id ;
509 
510 CURSOR get_tbb_rowid (p_scope  VARCHAR2)
511     IS SELECT ref_rowid
512          FROM hxc_temp_timecard_chunks
513         WHERE scope = p_scope
514           AND thread_id = p_thread_id ;
515 
516 CURSOR get_dup_trans
517     IS SELECT master_id,
518               MAX(ROWID)
519          FROM hxc_archive_temp
520         WHERE thread_id = p_thread_id
521         GROUP BY master_id ;
522 
523 
524 CURSOR get_latest_details
525     IS SELECT det.time_building_block_id,
526               ROWIDTOCHAR(det.ROWID)
527          FROM hxc_temp_timecard_chunks temp,
528               hxc_latest_details det
529         WHERE temp.scope = 'DETAIL'
530           AND temp.id  = det.time_building_block_id ;
531 
532 
533 CURSOR get_max_ovn
534     IS SELECT id,
535               max(ref_ovn)
536          FROM hxc_temp_timecard_chunks temp
537         WHERE scope = 'DETAIL'
541 -- Bug 9790410
538           AND thread_id = p_thread_id
539         GROUP by id ;
540 
542 -- Added this cursor to pick up HXT records.
543 CURSOR get_sum_hrs
544     IS SELECT DISTINCT
545               sum.id,
546               sum.tim_id
547          FROM hxc_temp_timecard_chunks temp,
548               hxt_sum_hours_worked_f sum
549         WHERE temp.id = sum.time_building_block_id
550           AND temp.thread_id = p_thread_id;
551 
552 
553 
554 l_chunk_size number;
555 
556 TYPE NUMTABLE     IS TABLE OF hxc_time_building_blocks_ar.time_building_block_id%TYPE;
557 TYPE VARCHARTABLE IS TABLE OF VARCHAR2(4000);
558 
559 tc_id_tab            NUMTABLE;
560 tc_ovn_tab  	     NUMTABLE;
561 tc_rowid_tab         VARCHARTABLE;
562 rowid_tab            VARCHARTABLE;
563 td_rowid_tab 	     VARCHARTABLE;
564 trans_detail_tab     NUMTABLE;
565 trans_tab            NUMTABLE;
566 usage_tab   	     NUMTABLE;
567 attribute_tab        NUMTABLE;
568 usage_rowid_tab      VARCHARTABLE;
569 uniq_rowid_tab       VARCHARTABLE;
570 trans_id_tab         NUMTABLE;
571 
572 latest_id_tab        NUMTABLE;
573 latest_ovn_Tab       NUMTABLE;
574 latest_rowid_tab     VARCHARTABLE;
575 
576 -- Bug 9790410
577 sum_id_tab           NUMTABLE;
578 tim_id_tab           NUMTABLE;
579 
580 
581 l_tc_count		NUMBER := 0;
582 l_day_count		NUMBER := 0;
583 l_detail_count		NUMBER := 0;
584 l_det_count		NUMBER := 0;
585 l_app_period_count	NUMBER := 0;
586 l_tau_count		NUMBER := 0;
587 l_td_count		NUMBER := 0;
588 l_trans_count		NUMBER := 0;
589 l_tal_count		NUMBER := 0;
590 l_adl_count		NUMBER := 0;
591 l_app_period_sum_count	NUMBER := 0;
592 l_ta_count              NUMBER := 0;
593 l_hxt_sum_count             NUMBER := 0;
594 l_hxt_det_count             NUMBER := 0;
595 
596 l_tc_del_count         NUMBER := 0;
597 l_tal_del_count        NUMBER := 0;
598 l_day_del_count        NUMBER := 0;
599 l_det_del_count        NUMBER := 0;
600 l_app_del_count        NUMBER := 0;
601 l_app_sum_del_count    NUMBER := 0;
602 l_tau_del_count        NUMBER := 0;
603 l_ta_del_count         NUMBER := 0;
604 l_td_del_count         NUMBER := 0;
605 l_trans_del_count      NUMBER := 0;
606 l_adl_del_count        NUMBER := 0;
607 l_hxt_sum_del_count             NUMBER := 0;
608 l_hxt_det_del_count             NUMBER := 0;
609 
610 
611 
612 
613 l_data_set_end_date     DATE;
614 l_data_set_start_date   DATE;
615 
616 data_mismatch           BOOLEAN  := FALSE;
617 iloop                   NUMBER := 0;
618 l_chunk_no              NUMBER := 0;
619 
620 DEADLOCK_DETECTED EXCEPTION;
621 PRAGMA EXCEPTION_INIT(DEADLOCK_DETECTED,-60);
622 
623 
624    PROCEDURE  write_data_mismatch(p_scope     IN VARCHAR2)
625    IS
626 
627    BEGIN
628        FORALL i IN tc_id_tab.FIRST..tc_id_tab.LAST
629        	  INSERT INTO hxc_ar_detail_log
630        	    	              (time_building_block_id,
631        	    	    	       object_version_number,
632        	    	    	       process_type,
633             	    	       thread_id,
634             	    	       chunk_number)
635        	    	       VALUES (tc_id_tab(i),
636        	    	               tc_ovn_tab(i),
637        	    	               'ARCHIVE-INCOMPLETE',
638        	    	               p_thread_id,
639        	    	               l_chunk_no);
640          INSERT INTO hxc_data_set_details
641                       (data_set_id,
642                        scope,
643                        table_name,
644                        row_count)
645               VALUES (p_data_set_id,
646                       p_scope,
647                       p_thread_id,
648                       l_chunk_no );
649 
650        COMMIT;
651        retcode := 2;
652 
653    END;
654 
655 
656 
657 BEGIN
658 
659 
660   -- Bug 7358756
661   -- REWRITTEN ARCHIVE PROCESS
662 
663   -- This procedure is rewritten in line with the changed Archive process
664   -- The process is now multithreaded, and each thread processes independant
665   --  of others.  Detailed algorithm/approach as below.
666 
667   -- HXC_AR_TC_IDS_TEMP table populated by the parent process holds all the timecard
668   -- scope records that are to be archived.  The process parameters are as below.
669   -- p_from_id          -- Starting time_building_block_id for this thread.
670   -- p_to_id		-- Ending time_building_block_id for this thread
671   -- p_data_set_id	-- Data set id to be populated in the tables.
672   -- p_thread_id	-- Thread number for this thread.
673   --
674   -- Following are the steps.
675   --
676   -- * Pick up the timecards(id-ovn) from hxc_ar_tc_ids_temp table, limited by
677   --   chunk size profile option.
678   -- * Insert the above id-ovn combination into hxc_temp_timecard_chunks table.
679   -- * Pick up all records from hxc_time_building_blocks for these combinations
680   --   and insert into hxc_time_building_blocks_ar
681   -- * For the timecard records in hxc_temp_timecard_chunks, pick up all records
682   --    from hxc_tc_ap_links, and insert into itself with application_period scope.
683   -- * Join hxc_temp_timecard_chunks with hxc_tc_ap_links and insert into hxc_tc_ap_links_ar
684   --    table.
685   -- * Delete these records from hxc_tc_ap_links table.
686   -- * For all the application_period records in hxc_temp_timecard_chunks table, select from
687   --    hxc_time_building_blocks and insert into hxc_time_building_blocks_ar.
688   -- * Delete from hxc_time_building_blocks these records.
689   -- * Pick up all records for the application_period from hxc_app_period_summary
693   --    all DAY records for these timecards, insert them into hxc_temp_timecard_chunks.
690   --    table and insert into hxc_app_period_summary_ar table.
691   -- * Delete from hxc_app_period_summary table, the corresponding records.
692   -- * Join hxc_temp_timecard_chunks with hxc_time_building_blocks, DAY scope and pick up
694   --     ( id, ovn, ROWID )
695   -- * Insert into hxc_time_building_blocks_ar these records, joining them by ROWID.
696   -- * Delete the above records from hxc_time_building_blocks.
697   -- * Join hxc_temp_timecard_chunks with hxc_time_building_blocks, DETAIL scope and pick up
698   --    all DETAIL records for these timecards, insert them into hxc_temp_timecard_chunks.
699   --     ( id, ovn, ROWID )
700   -- * Insert into hxc_time_building_blocks_ar these records, joining them by ROWID.
701   -- * Delete the above records from hxc_time_building_blocks.
702   -- * Loop to process transaction records.
703   --      Pick up transaction detail records for the records in hxc_temp_timecard_chunks
704   --        as of now. ( detail_id, transaction_id, detail_rowid ), and insert into
705   --        hxc_archive_temp.
706   --      Using the rowids, insert the transaction detail records into
707   --        hxc_transaction_details_ar.
708   --      Delete the records from hxc_transaction_details_ar using the ROWID.
709   --      Delete duplicate transaction ids from hxc_archive_temp.
710   --      Select all deposit transaction records from hxc_transactions table and
711   --        insert into hxc_transactions_ar table.
712   --      Select all retrieval transaction ids and insert into hxc_ar_trans_temp
713   --        table for the parent thread to process.
714   --      Delete all transaction records from hxc_transactions table, if the transaction
715   --        id is present in hxc_archive_temp.
716   --      Delete from hxc_archive temp for the the next iteration of this loop.
717   -- * Loop to process attribute records.
718   --      Pick up attribute usage records for the records in hxc_temp_timecard_chunks
719   --        as of now. ( usage_id, attribute_id, usage_rowid ), and insert into
720   --        hxc_archive_temp.
721   --      Using the rowids, insert the attribute usage records into
722   --        hxc_attribute_usages_ar.
723   --      Delete the records from hxc_transaction_details_ar using the ROWID.
724   --      Delete all records from hxc_archive_temp if attribute_id is
725   --        present in hxc_time_attributes_ar
726   --      Select all attribute records from hxc_time_attributes table and
727   --        insert into hxc_time_attributes_ar table.
728   --      Delete all attribute records from hxc_time_attributes table, if the attribute
729   --        id is present in hxc_archive_temp.
730   --      Delete from hxc_archive temp for the the next iteration of this loop.
731   -- * Delete all other scopes except DETAIL from hxc_temp_timecard_chunks.
732   -- * Select from hxc_ap_detail_links table, the records corresponding to the
733   --     details and insert into hxc_ap_detail_links_ar table.
734   -- * Delete from hxc_ap_detail_links table the above records.
735   -- * Delete from hxc_temp_timecard_chunks all records except the latest ovns.
736   -- * Insert these records into hxc_latest_details.
737   -- * COMMIT and pick up the next chunk.
738   --
739   -- Technical points to look for.
740   -- 1. Simulated Continue with each chunk check.
741   --        Each insert into AR - Delete from core action has to be followed
742   --        by a count check to see if total inserted and total deleted is the same.
743   --        If no, we have to rollback that chunk and proceed with the rest of the
744   --        chunks.  That also means that we need to have a 'continue' to next chunk
745   --        after all errored count checks.  To enable this, there is an inner loop
746   --        << TO_CONTINUE_TO_NEXT_CHUNK >>.  For a normal chunk, this will iterate
747   --        once and exit out ( look at the WHILE condition.) -- meaning there is
748   --        no functional addition here.  To continue to next chunk at any point, the
749   --        code will EXIT from this loop.  That will bring it to the end of the code inside
750   --        the original loop and would function like a continue.  This handles count checks
751   --        after moving data from each set of tables.
752   -- 2. Avoiding issues of resource contention.
753   --        Since we are dealing with multiple sessions doing the same thing, there are issues
754   --        of resource contention.  The threads are working in different sets of timecards, but
755   --        still there could be some records shared between the threads.  For eg, a retrieval
756   --        transaction id can be shared across two versions of the timecard, and it might
757   --        be possible that they fall in different thread. ( All timecards of the same
758   --        building block id fall in the same thread, but in case of a template overwrite,
759   --        the building block ids are different and might fall in different threads. ).
760   --        Hence the retrieval transactions are all moved to the parent thread for processing, so
761   --        there is no issue of resource contention here.
762   --        Apart from this, there are application period records which are shared.  For example,
763   --        by weekly timecards having monthly approval, four timecards can share a single application
764   --        period record, and this might cause a resource contention.  But we cannot afford to
765   --        move this also to parent process, because in that case, the application attributes also
766   --        need to be moved out, meaning we lose too much of the multithreaded advantage.
767   --        To work this around, the whole processing is put inside a BEGIN-END block. In case
768   --        of a resource contention ( you would have dup_val_on_index error on the _AR ) tables,
769   --        the process will come to exception block, and wait sleep there for a minute.  This would
770   --        let the thread which committed the record earlier to finish.  The thread would continue
771   --        after a minute iterating again in the inner while loop as mentioned above.
772   --
776 
773   --   The Worker Process for Restore Data set follows the same logic, except that the
774   --   source and destination tables interchange.
775   --
777   hr_general.g_data_migrator_mode := 'Y';
778 
779   l_chunk_size := nvl(fnd_profile.value('HXC_ARCHIVE_RESTORE_CHUNK_SIZE'),50);
780 
781   fnd_file.put_line(fnd_file.LOG,'--- > Chunk Size is: '||l_chunk_size);
782 
783   -- firs let's get the min start time of
784   -- the timecard for this data set
785 
786   SELECT start_date,
787          end_date
788     INTO l_data_set_start_date,
789          l_data_set_end_date
790     FROM hxc_data_sets
791    WHERE data_set_id = p_data_set_id;
792 
793     OPEN get_tcs ;
794     LOOP
795 
796        FETCH get_tcs
797         BULK COLLECT
798         INTO tc_id_tab,
799              tc_ovn_tab  LIMIT l_chunk_size ;
800 
801         EXIT WHEN tc_id_tab.COUNT = 0;
802 
803         l_td_count := 0;
804         l_trans_count := 0;
805         l_tau_count := 0;
806         l_ta_count  := 0;
807         data_mismatch := FALSE;
808         iloop := 1;
809         l_chunk_no := l_chunk_no + 1;
810 
811         fnd_file.put_line(fnd_file.log,'                                                   ');
812         fnd_file.put_line(fnd_file.log,'*****************************************************************');
813         fnd_file.put_line(fnd_file.log,'=================================================================');
814         fnd_file.put_line(fnd_file.log,'Entering in a new chunk ');
815         fnd_file.put_line(fnd_file.log,'==================================================================');
816 
817         <<TO_CONTINUE_TO_NEXT_CHUNK >>
818         WHILE iloop = 1
819         LOOP
820             iloop := 0;
821 
822             BEGIN
823 
824                 FORALL i IN tc_id_tab.FIRST..tc_id_tab.LAST
825             	   INSERT INTO hxc_temp_timecard_chunks
826             	               ( id,
827             	                 ref_ovn,
828             	                 scope,
829             	                 thread_id )
830             	        VALUES ( tc_id_tab(i),
831             	                 tc_ovn_tab(i),
832             	                 'TIMECARD',
833             	                 p_thread_id );
834 
835 
836             	INSERT INTO hxc_time_building_blocks_ar
837             	              (DATA_SET_ID,TIME_BUILDING_BLOCK_ID,TYPE,MEASURE,
838             	              UNIT_OF_MEASURE,START_TIME,STOP_TIME,PARENT_BUILDING_BLOCK_ID,
839             	              SCOPE,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,
840 		              LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,APPROVAL_STATUS,RESOURCE_ID,
841 		   	      RESOURCE_TYPE,APPROVAL_STYLE_ID,DATE_FROM,DATE_TO,COMMENT_TEXT,
842 		   	      PARENT_BUILDING_BLOCK_OVN,APPLICATION_SET_ID,
843 		   	      TRANSLATION_DISPLAY_KEY)
844             	SELECT /*+ INDEX(bkup HXC_TIME_BUILDING_BLOCKS_PK) */
845             	       bkup.DATA_SET_ID,TIME_BUILDING_BLOCK_ID,TYPE,MEASURE,
846 	    	       UNIT_OF_MEASURE,START_TIME,STOP_TIME,PARENT_BUILDING_BLOCK_ID,
847 	    	       bkup.SCOPE,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,
848 	    	       LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,APPROVAL_STATUS,RESOURCE_ID,RESOURCE_TYPE,
849 	    	       APPROVAL_STYLE_ID,DATE_FROM,DATE_TO,COMMENT_TEXT,PARENT_BUILDING_BLOCK_OVN,APPLICATION_SET_ID,
850 	    	       TRANSLATION_DISPLAY_KEY
851 	    	  FROM hxc_temp_timecard_chunks temp,
852 	    	       hxc_time_building_blocks bkup
853 	    	 WHERE bkup.scope = 'TIMECARD'
854             	   AND bkup.time_building_block_id = temp.id
855             	   AND bkup.object_version_number = temp.ref_ovn
856 	    	   AND bkup.data_set_id = p_data_set_id
857 	    	   AND thread_id = p_thread_id ;
858 
859             	l_tc_count := sql%rowcount;
860 
861             	FORALL i IN tc_id_tab.FIRST..tc_id_tab.LAST
862             	     DELETE
863             	       FROM hxc_time_building_blocks
864             	      WHERE time_building_block_id = tc_id_tab(i)
865             	        AND object_version_number = tc_ovn_tab(i) ;
866 
867             	l_tc_del_count := sql%rowcount;
868 
869             	hxc_archive.log_data_mismatch(p_scope => 'Timecard',
870             	                              p_insert => l_tc_count,
871             	                              p_delete => l_tc_del_count,
872             	                              p_mismatch  => data_mismatch
873             	                              );
874             	IF data_mismatch
875             	THEN
876             	   write_data_mismatch('Timecard');
877                    EXIT TO_CONTINUE_TO_NEXT_CHUNK ;
878             	END IF;
879 
880             	FORALL i IN tc_id_tab.FIRST..tc_id_tab.LAST
881        	    	  INSERT INTO hxc_ar_detail_log
882        	    	              (time_building_block_id,
883        	    	    	       object_version_number,
884        	    	    	       process_type,
885             	    	       thread_id,
886             	    	       chunk_number)
887        	    	       VALUES (tc_id_tab(i),
888        	    	               tc_ovn_tab(i),
889        	    	               'ARCHIVE',
890        	    	               p_thread_id,
891        	    	               l_chunk_no);
892 
893 
894             	INSERT INTO hxc_temp_timecard_chunks
895             	      ( id,
896             	        scope,
897             	        ref_rowid,
898             	        thread_id )
899             	SELECT /*+ ORDERED */
900             	      DISTINCT talbkup.application_period_id,
901             	               'APPLICATION_PERIOD',
902             	               ROWIDTOCHAR(talbkup.ROWID),
903             	               thread_id
904 	    	  FROM hxc_temp_timecard_chunks temp,
908 	    	   AND thread_id = p_thread_id ;
905 	    	       hxc_tc_ap_links talbkup
906 	    	 WHERE temp.id = talbkup.timecard_id
907 	    	   AND temp.scope IN ('TIMECARD')
909 
910 
911 	    	INSERT INTO hxc_tc_ap_links_ar
912 	    	     ( timecard_id,
913 	    	       application_period_id)
914 	    	SELECT timecard_id,
915 	    	       application_period_id
916 	    	  FROM hxc_temp_timecard_chunks temp,
917 	    	       hxc_tc_ap_links talbkup
918 	    	 WHERE temp.ref_rowid = talbkup.ROWID
919 	    	   AND temp.scope = ('APPLICATION_PERIOD')
920 	    	   AND thread_id = p_thread_id ;
921 
922 
923 	    	l_tal_count := SQL%ROWCOUNT;
924 
925 
926    	    	DELETE FROM hxc_tc_ap_links
927 	    	      WHERE ROWID IN ( SELECT CHARTOROWID(ref_rowid)
928 	    	                         FROM hxc_temp_timecard_chunks
929 	    	                        WHERE scope = 'APPLICATION_PERIOD'
930 	    	                          AND thread_id = p_thread_id );
931 
932             	l_tal_del_count := SQL%ROWCOUNT;
933 
934             	hxc_archive.log_data_mismatch(p_scope => 'TC App LINKs ',
935             	                              p_insert => l_tal_count,
936             	                              p_delete => l_tal_del_count,
937             	                              p_mismatch => data_mismatch );
938 
939             	IF data_mismatch
940             	THEN
941             	   write_data_mismatch('TC App LINKs ');
942                    EXIT TO_CONTINUE_TO_NEXT_CHUNK ;
943             	END IF;
944 
945             	INSERT INTO hxc_time_building_blocks_ar
946 	    	      (DATA_SET_ID,TIME_BUILDING_BLOCK_ID,TYPE,MEASURE,
947 	    	       UNIT_OF_MEASURE,START_TIME,STOP_TIME,PARENT_BUILDING_BLOCK_ID,
948 	 	       SCOPE,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,
949 	 	       LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,APPROVAL_STATUS,RESOURCE_ID,
950 	 	       RESOURCE_TYPE,APPROVAL_STYLE_ID,DATE_FROM,DATE_TO,COMMENT_TEXT,
951 	 	       PARENT_BUILDING_BLOCK_OVN,APPLICATION_SET_ID,TRANSLATION_DISPLAY_KEY)
952 	    	SELECT /*+ ORDERED */
953 	    	       p_data_set_id,TIME_BUILDING_BLOCK_ID,TYPE,MEASURE,
954 	    	       UNIT_OF_MEASURE,START_TIME,STOP_TIME,PARENT_BUILDING_BLOCK_ID,
955 	    	       appbkup.SCOPE,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,
956 	    	       LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,APPROVAL_STATUS,RESOURCE_ID,RESOURCE_TYPE,
957 	    	       APPROVAL_STYLE_ID,DATE_FROM,DATE_TO,COMMENT_TEXT,PARENT_BUILDING_BLOCK_OVN,
958 	    	       APPLICATION_SET_ID,TRANSLATION_DISPLAY_KEY
959 	    	  FROM hxc_time_building_blocks appbkup
960 	    	 WHERE appbkup.scope = 'APPLICATION_PERIOD'
961 	 	   AND appbkup.time_building_block_id IN ( SELECT id
962             	                                             FROM hxc_temp_timecard_chunks temp
963             	                                            WHERE temp.scope IN
964             	                                                       ('APPLICATION_PERIOD')
965             	                                              AND thread_id = p_thread_id ) ;
966 
967 	    	l_app_period_count := SQL%ROWCOUNT;
968 
969 	    	DELETE FROM hxc_time_building_blocks
970 	    	      WHERE time_building_block_id IN ( SELECT id
971 	    	                                          FROM hxc_temp_timecard_chunks
972 	    	                                         WHERE scope IN
973             	                                                      ('APPLICATION_PERIOD')
974             	                                           AND thread_id = p_thread_id );
975 
976             	l_app_del_count := SQL%ROWCOUNT;
977 
978             	hxc_archive.log_data_mismatch( p_scope => 'Application Period ',
979             	                               p_insert => l_app_period_count,
980             	                               p_delete => l_app_del_count,
981             	                               p_mismatch => data_mismatch );
982 
983             	IF data_mismatch
984             	THEN
985             	    write_data_mismatch('Application Period ');
986             	    EXIT TO_CONTINUE_TO_NEXT_CHUNK ;
987             	END IF;
988 
989             	INSERT INTO hxc_app_period_summary_ar
990             	           (APPLICATION_PERIOD_ID,APPLICATION_PERIOD_OVN,APPROVAL_STATUS,TIME_RECIPIENT_ID,
991             	            TIME_CATEGORY_ID,START_TIME,STOP_TIME,RESOURCE_ID,RECIPIENT_SEQUENCE,
992             	            CATEGORY_SEQUENCE,CREATION_DATE,NOTIFICATION_STATUS,APPROVER_ID,APPROVAL_COMP_ID,
993             	            APPROVAL_ITEM_TYPE,APPROVAL_PROCESS_NAME,APPROVAL_ITEM_KEY,DATA_SET_ID)
994 	    	     SELECT APPLICATION_PERIOD_ID,APPLICATION_PERIOD_OVN,APPROVAL_STATUS,
995 	    	            TIME_RECIPIENT_ID,TIME_CATEGORY_ID,START_TIME,STOP_TIME,RESOURCE_ID,
996 	    	            RECIPIENT_SEQUENCE,CATEGORY_SEQUENCE,CREATION_DATE,NOTIFICATION_STATUS,
997 	    	            APPROVER_ID,APPROVAL_COMP_ID,APPROVAL_ITEM_TYPE,APPROVAL_PROCESS_NAME,
998 	    	            APPROVAL_ITEM_KEY,p_data_set_id
999 	    	       FROM hxc_app_period_summary apsbkup
1000 	    	      WHERE application_period_id IN (SELECT id
1001 	    	                                        FROM hxc_temp_timecard_chunks
1002 	    	                                       WHERE scope = 'APPLICATION_PERIOD'
1003 	    	                                         AND thread_id = p_thread_id );
1004 
1005             	l_app_period_sum_count := SQL%ROWCOUNT;
1006 
1007 
1008             	DELETE FROM hxc_app_period_summary
1009             	      WHERE application_period_id IN (SELECT id
1010             	                                        FROM hxc_temp_timecard_chunks
1011             	     	                               WHERE scope = 'APPLICATION_PERIOD'
1012             	    	                                 AND thread_id = p_thread_id );
1013 
1014             	l_app_sum_del_count := SQL%ROWCOUNT;
1015 
1016             	hxc_archive.log_data_mismatch( p_scope => 'App Period Summary ',
1020 
1017             	                               p_insert => l_app_period_sum_count,
1018             	                               p_delete => l_app_sum_del_count,
1019             	                               p_mismatch => data_mismatch );
1021             	IF data_mismatch
1022             	THEN
1023             	    write_data_mismatch('App Period Summary ');
1024             	    EXIT TO_CONTINUE_TO_NEXT_CHUNK ;
1025             	END IF;
1026 
1027             	INSERT INTO hxc_temp_timecard_chunks
1028             	             ( id,
1029             	               ref_ovn,
1030             	               scope,
1031             	               ref_rowid,
1032             	               day_start_time,
1033             	               day_stop_time,
1034             	               thread_id )
1035             	     SELECT /*+ LEADING(TEMP) INDEX(AR HXC_TIME_BUILDING_BLOCKS_FK3) */
1036             	               time_building_block_id,
1037             	               object_version_number,
1038             	               'DAY',
1039             	               ROWIDTOCHAR(ar.ROWID),
1040             	               ar.start_time,
1041             	               ar.stop_time,
1042             	               thread_id
1043             	          FROM hxc_temp_timecard_chunks temp,
1044             	               hxc_time_building_blocks ar
1045             	         WHERE parent_building_block_id = temp.id
1046             	           AND parent_building_block_ovn = temp.ref_ovn
1047             	           AND temp.scope = 'TIMECARD'
1048             	           AND thread_id = p_thread_id ;
1049 
1050 
1051             	INSERT INTO hxc_time_building_blocks_ar
1052             	           (DATA_SET_ID,TIME_BUILDING_BLOCK_ID,TYPE,MEASURE,
1053 	 		    UNIT_OF_MEASURE,START_TIME,STOP_TIME,PARENT_BUILDING_BLOCK_ID,
1054 	 		    SCOPE,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,
1055 	 		    LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,APPROVAL_STATUS,RESOURCE_ID,
1056 	 		    RESOURCE_TYPE,APPROVAL_STYLE_ID,DATE_FROM,DATE_TO,COMMENT_TEXT,
1057 	 		    PARENT_BUILDING_BLOCK_OVN,APPLICATION_SET_ID,TRANSLATION_DISPLAY_KEY)
1058 	    	     SELECT /*+ LEADING(temp) NO_INDEX(bkupday)*/
1059 	    	            p_data_set_id,TIME_BUILDING_BLOCK_ID,TYPE,MEASURE,
1060 	    	            UNIT_OF_MEASURE,START_TIME,STOP_TIME,PARENT_BUILDING_BLOCK_ID,
1061 	 		    bkupday.SCOPE,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,
1062 	 		    LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,APPROVAL_STATUS,RESOURCE_ID,RESOURCE_TYPE,
1063 	 		    APPROVAL_STYLE_ID,DATE_FROM,DATE_TO,COMMENT_TEXT,PARENT_BUILDING_BLOCK_OVN,APPLICATION_SET_ID,
1064 	 		    TRANSLATION_DISPLAY_KEY
1065 	    	       FROM hxc_temp_timecard_chunks temp,
1066 	    	            hxc_time_building_blocks bkupday
1067 	    	      WHERE bkupday.ROWID = CHARTOROWID(temp.ref_rowid)
1068 	    	        AND temp.scope = 'DAY'
1069 	    	        AND thread_id = p_thread_id;
1070 
1071 
1072             	l_day_count := sql%rowcount;
1073 
1074             	l_day_del_count := 0;
1075             	OPEN get_tbb_rowid('DAY');
1076 	    	LOOP
1077             	    FETCH get_tbb_rowid
1078 	    	     BULK COLLECT INTO
1079 	    	               rowid_tab  LIMIT 501;
1080 
1081 	    	    EXIT WHEN rowid_tab.COUNT = 0;
1082 
1083 	    	    FORALL i IN rowid_tab.FIRST..rowid_tab.LAST
1084 	    	       DELETE FROM hxc_time_building_blocks
1085 	    	             WHERE ROWID = CHARTOROWID(rowid_tab(i));
1086 
1087             	     l_day_del_count := l_day_del_count + SQL%ROWCOUNT;
1088             	     rowid_tab.DELETE;
1089             	END LOOP;
1090             	CLOSE get_tbb_rowid;
1091 
1092             	hxc_archive.log_data_mismatch( p_scope => 'Day ',
1093             	                               p_insert => l_day_count,
1094             	                               p_delete => l_day_del_count,
1095             	                               p_mismatch => data_mismatch );
1096 
1097             	IF data_mismatch
1098             	THEN
1099             	   write_data_mismatch('Day ');
1100             	   EXIT TO_CONTINUE_TO_NEXT_CHUNK ;
1101             	END IF;
1102 
1103             	INSERT INTO hxc_temp_timecard_chunks
1104             	               ( id,
1105             	                 ref_ovn,
1106             	                 scope,
1107             	                 day_start_time,
1108             	                 day_stop_time,
1109             	                 ref_rowid,
1110             	                 thread_id )
1111             	      SELECT /*+ LEADING(TEMP) INDEX(AR HXC_TIME_BUILDING_BLOCKS_FK3) */
1112             	             time_building_block_id,
1113             	             object_version_number,
1114             	             'DETAIL',
1115             	             nvl(day_start_time,ar.start_time),
1116             	             nvl(day_stop_time,ar.stop_time),
1117             	             ROWIDTOCHAR(ar.ROWID),
1118             	             thread_id
1119             	        FROM hxc_temp_timecard_chunks temp,
1120             	             hxc_time_building_blocks ar
1121             	       WHERE parent_building_block_id = temp.id
1122             	         AND parent_building_block_ovn = temp.ref_ovn
1123             	         AND temp.scope = 'DAY'
1124             	         AND thread_id = p_thread_id ;
1125 
1126 
1127             	INSERT INTO hxc_time_building_blocks_ar
1128             	           (DATA_SET_ID,TIME_BUILDING_BLOCK_ID,TYPE,MEASURE,
1129 	 		    UNIT_OF_MEASURE,START_TIME,STOP_TIME,PARENT_BUILDING_BLOCK_ID,
1130 	 		    SCOPE,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,
1131 	 		    LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,APPROVAL_STATUS,RESOURCE_ID,
1132 	 		    RESOURCE_TYPE,APPROVAL_STYLE_ID,DATE_FROM,DATE_TO,COMMENT_TEXT,
1133 	 		    PARENT_BUILDING_BLOCK_OVN,APPLICATION_SET_ID,TRANSLATION_DISPLAY_KEY)
1134 	    	     SELECT /*+ LEADING(temp) NO_INDEX(bkupday)*/
1138 	 		    LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,APPROVAL_STATUS,RESOURCE_ID,RESOURCE_TYPE,
1135 	    	            p_data_set_id,TIME_BUILDING_BLOCK_ID,TYPE,MEASURE,
1136 	    	            UNIT_OF_MEASURE,START_TIME,STOP_TIME,PARENT_BUILDING_BLOCK_ID,
1137 	 		    bkupday.SCOPE,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,
1139 	 		    APPROVAL_STYLE_ID,DATE_FROM,DATE_TO,COMMENT_TEXT,PARENT_BUILDING_BLOCK_OVN,APPLICATION_SET_ID,
1140 	 		    TRANSLATION_DISPLAY_KEY
1141 	    	       FROM hxc_temp_timecard_chunks temp,
1142 	    	            hxc_time_building_blocks bkupday
1143 	    	      WHERE bkupday.ROWID = CHARTOROWID(temp.ref_rowid)
1144 	    	        AND temp.scope = 'DETAIL'
1145 	    	        AND thread_id = p_thread_id ;
1146 
1147             	l_det_count := sql%rowcount;
1148 
1149             	l_det_del_count := 0;
1150             	OPEN get_tbb_rowid('DETAIL');
1151             	LOOP
1152 	    	   FETCH get_tbb_rowid
1153 	  		  BULK COLLECT INTO
1154 	  		        rowid_tab LIMIT 501;
1155 
1156 	  		 EXIT WHEN rowid_tab.COUNT = 0;
1157 
1158 	  		 FORALL i IN rowid_tab.FIRST..rowid_tab.LAST
1159 	  		     DELETE FROM hxc_time_building_blocks
1160 	  		           WHERE ROWID = CHARTOROWID(rowid_tab(i));
1161 
1162             	   l_det_del_count := l_det_del_count + SQL%ROWCOUNT;
1163           		 rowid_tab.DELETE;
1164             	END LOOP;
1165             	CLOSE get_tbb_rowid;
1166 
1167             	hxc_archive.log_data_mismatch( p_scope => 'Detail ',
1168             	                              p_insert => l_det_count,
1169             	                              p_delete => l_det_del_count,
1170             	                              p_mismatch => data_mismatch );
1171             	IF data_mismatch
1172             	THEN
1173             	   write_data_mismatch('Detail ');
1174             	   EXIT TO_CONTINUE_TO_NEXT_CHUNK ;
1175             	END IF;
1176 
1177             	l_td_count        := 0;
1178             	l_td_del_count    := 0;
1179             	l_trans_count     := 0;
1180             	l_trans_del_count := 0;
1181 
1182                 IF get_transactions%ISOPEN
1183                 THEN
1184                    CLOSE get_transactions;
1185                 END IF;
1186             	OPEN get_transactions ;
1187             	LOOP
1188             	    FETCH get_transactions
1189             	     BULK COLLECT INTO trans_detail_tab,
1190             	                       trans_tab,
1191             	                       td_rowid_tab LIMIT 250;
1192 
1193             	    EXIT WHEN trans_detail_tab.COUNT = 0 ;
1194 
1195             	    FORALL i IN trans_detail_tab.FIRST..trans_detail_tab.LAST
1196             	       INSERT INTO hxc_archive_temp
1197             	                 ( detail_id,
1198             	                   master_id,
1199             	                   ref_rowid,
1200             	                   thread_id )
1201             	           VALUES ( trans_detail_tab(i),
1202             	                    trans_tab(i),
1203             	                    td_rowid_tab(i),
1204             	                    p_thread_id );
1205 
1206             	    INSERT INTO hxc_transaction_details_ar
1207             	               (DATA_SET_ID,TRANSACTION_DETAIL_ID,TIME_BUILDING_BLOCK_ID,TRANSACTION_ID,
1208             		        STATUS,EXCEPTION_DESCRIPTION,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,
1209             		        LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,TIME_BUILDING_BLOCK_OVN)
1210             	         SELECT /*+ LEADING(temp) USE_NL(bkuptxnd) */
1211             	                p_data_set_id,TRANSACTION_DETAIL_ID,TIME_BUILDING_BLOCK_ID,TRANSACTION_ID,
1212             		   	STATUS,EXCEPTION_DESCRIPTION,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,
1213             		   	LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,TIME_BUILDING_BLOCK_OVN
1214             	           FROM hxc_archive_temp temp,
1215             	                hxc_transaction_details bkuptxnd
1216             	          WHERE CHARTOROWID(temp.ref_rowid) = bkuptxnd.ROWID
1217             	            AND thread_id  = p_thread_id ;
1218 
1219             	    l_td_count := l_td_count + SQL%ROWCOUNT;
1220 
1221             	    FORALL i IN td_rowid_tab.FIRST..td_rowid_tab.LAST
1222             	       DELETE FROM hxc_transaction_details
1223             	             WHERE ROWID = CHARTOROWID(td_rowid_tab(i));
1224 
1225             	    l_td_del_count := l_td_del_count + SQL%ROWCOUNT;
1226 
1227             	    trans_detail_tab.DELETE;
1228             	    trans_tab.DELETE;
1229             	    td_rowid_tab.DELETE;
1230 
1231             	    OPEN get_dup_trans;
1232             	    LOOP
1233             	       FETCH get_dup_trans
1234             	        BULK COLLECT INTO trans_id_tab,
1235             	                          uniq_rowid_tab LIMIT 500;
1236 
1237             	       EXIT WHEN trans_id_tab.COUNT = 0;
1238 
1239             	       FORALL i IN trans_id_tab.FIRST..trans_id_tab.LAST
1240             	           DELETE FROM hxc_archive_temp
1241             	                 WHERE master_id = trans_id_tab(i)
1242             	                   AND ROWID <> uniq_rowid_tab(i)
1243             	                   AND thread_id = p_thread_id ;
1244             	    END LOOP;
1245             	    CLOSE get_dup_trans;
1246 
1247             	    -- Bug 11781607
1248             	    -- This is no longer required because the fix should be
1249             	    -- handled by the Parent process.
1250             	    /*
1251 
1252             	    DELETE FROM hxc_archive_temp
1253             	          WHERE EXISTS ( SELECT 1
1254             	                           FROM hxc_transactions_ar
1255             	                          WHERE transaction_id = master_id )
1256             	            AND thread_id = p_thread_id ;
1257             	    */
1258 
1259                   -- Bug 8888813
1263                   IF NOT hxc_upgrade_pkg.txn_upgrade_completed
1260                   -- If the upgrade for Deposit Transaction is not completed,
1261                   -- ( Bug 8888811 ), hxc_transactions and hxc_transaction_details
1262                   -- might still contain DEPOSIT transactions. Process them.
1264                   THEN
1265 
1266             	        INSERT INTO hxc_transactions_ar
1267             	                  (DATA_SET_ID,TRANSACTION_ID,TRANSACTION_PROCESS_ID,TRANSACTION_DATE,TYPE,
1268             	                   STATUS,EXCEPTION_DESCRIPTION,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,
1269                 	               LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,TRANSACTION_CODE)
1270                 	        SELECT /*+ LEADING(temp) USE_NL(bkuptxn) */
1271                 	               p_data_set_id,TRANSACTION_ID,TRANSACTION_PROCESS_ID,
1272                 	  	       TRANSACTION_DATE,TYPE,STATUS,EXCEPTION_DESCRIPTION,OBJECT_VERSION_NUMBER,
1273             	      	       CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,
1274             	  	           TRANSACTION_CODE
1275                 	         FROM hxc_transactions bkuptxn,
1276                 	              hxc_archive_temp temp
1277                 	        WHERE transaction_id = master_id
1278                 	          AND thread_id = p_thread_id
1279             	              AND transaction_id NOT IN ( SELECT transaction_id
1280             	                                            FROM hxc_transactions_ar hxc
1281             	                                           WHERE bkuptxn.transaction_id = hxc.transaction_id)
1282                 	          AND type <> 'RETRIEVAL'
1283                 	          ;
1284 
1285                 	    l_trans_count := l_trans_count + SQL%ROWCOUNT;
1286 
1287                 	    DELETE /*+ LEADING(temp) USE_NL(bkuptxn) */
1288                 	           FROM hxc_transactions  bkuptxn
1289                 	          WHERE transaction_id IN ( SELECT master_id
1290             	                                          FROM hxc_archive_temp temp
1291             	                                         WHERE thread_id = p_thread_id)
1292             	                AND type <> 'RETRIEVAL';
1293 
1294                 	    l_trans_del_count := l_trans_del_count + SQL%ROWCOUNT;
1295 
1296                   END IF;
1297 
1298             	    INSERT INTO hxc_ar_trans_temp
1299             	                ( transaction_id, data_set_id, thread_id, trans_rowid )
1300             	         SELECT bkuptxn.transaction_id,
1301             	                p_data_set_id,
1302             	                p_thread_id,
1303             	                ROWIDTOCHAR(bkuptxn.ROWID)
1304             	           FROM hxc_transactions bkuptxn,
1305             	                hxc_archive_temp temp
1306             	          WHERE transaction_id = master_id
1307             	            AND thread_id = p_thread_id
1308             	            AND type = 'RETRIEVAL';
1309 
1310             	    DELETE FROM hxc_archive_temp
1311             	          WHERE thread_id = p_thread_id ;
1312 
1313             	END LOOP;
1314             	CLOSE get_transactions;
1315 
1316             	hxc_archive.log_data_mismatch( p_scope => 'Transaction Detail ',
1317             	                               p_insert => l_td_count,
1318             	                               p_delete => l_td_del_count,
1319             	                               p_mismatch => data_mismatch );
1320 
1321             	IF data_mismatch
1322             	THEN
1323             	   write_data_mismatch('Transaction Detail ');
1324             	   EXIT TO_CONTINUE_TO_NEXT_CHUNK ;
1325             	END IF;
1326 
1327               -- Bug 8888813
1328               -- Need to report Transactions here only if Txn upgrade is not completed.
1329               -- If it is completed, Deposit transactions are moved later, and RETRIEVAL
1330               -- transactions are moved in the PARENT process -- No transactions to move here
1331               -- so dont report anything unless required.
1332               IF NOT hxc_upgrade_pkg.txn_upgrade_completed
1333                AND  (  l_trans_count <> 0
1334                     OR l_trans_del_count <> 0 )
1335               THEN
1336 
1337             	   hxc_archive.log_data_mismatch( p_scope => 'Transaction ',
1338             	                                  p_insert => l_trans_count,
1339             	                                  p_delete => l_trans_del_count,
1340             	                                  p_mismatch => data_mismatch );
1341 
1342             	   IF data_mismatch
1343             	   THEN
1344             	      write_data_mismatch('Transaction ');
1345             	      EXIT TO_CONTINUE_TO_NEXT_CHUNK ;
1346             	   END IF;
1347 
1348             	END IF;
1349 
1350             	l_td_count        := 0;
1351             	l_td_del_count    := 0;
1352             	l_trans_count     := 0;
1353             	l_trans_del_count := 0;
1354 
1355 
1356                 -- Bug 8888813
1357                 -- Open the deposit transaction tables to move DEPOSIT transactions.
1358                 -- Process the Details and Master
1359                 -- Log the data capture.
1360                 IF get_dep_transactions%ISOPEN
1361                 THEN
1362                    CLOSE get_dep_transactions;
1363                 END IF;
1364             	OPEN get_dep_transactions ;
1365             	LOOP
1366             	    FETCH get_dep_transactions
1367             	     BULK COLLECT INTO trans_detail_tab,
1368             	                       trans_tab,
1369             	                       td_rowid_tab LIMIT 250;
1370 
1371             	    EXIT WHEN trans_detail_tab.COUNT = 0 ;
1372 
1373             	    FORALL i IN trans_detail_tab.FIRST..trans_detail_tab.LAST
1374             	       INSERT INTO hxc_archive_temp
1375             	                 ( detail_id,
1379             	           VALUES ( trans_detail_tab(i),
1376             	                   master_id,
1377             	                   ref_rowid,
1378             	                   thread_id )
1380             	                    trans_tab(i),
1381             	                    td_rowid_tab(i),
1382             	                    p_thread_id );
1383 
1384             	    INSERT INTO hxc_dep_txn_details_ar
1385             	               (DATA_SET_ID,TRANSACTION_DETAIL_ID,TIME_BUILDING_BLOCK_ID,TRANSACTION_ID,
1386             		        STATUS,EXCEPTION_DESCRIPTION,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,
1387             		        LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,TIME_BUILDING_BLOCK_OVN)
1388             	         SELECT /*+ LEADING(temp) USE_NL(bkuptxnd) */
1389             	                p_data_set_id,TRANSACTION_DETAIL_ID,TIME_BUILDING_BLOCK_ID,TRANSACTION_ID,
1390             		   	STATUS,EXCEPTION_DESCRIPTION,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,
1391             		   	LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,TIME_BUILDING_BLOCK_OVN
1392             	           FROM hxc_archive_temp temp,
1393             	                hxc_dep_transaction_details bkuptxnd
1394             	          WHERE CHARTOROWID(temp.ref_rowid) = bkuptxnd.ROWID
1395             	            AND thread_id  = p_thread_id ;
1396 
1397             	    l_td_count := l_td_count + SQL%ROWCOUNT;
1398 
1399             	    FORALL i IN td_rowid_tab.FIRST..td_rowid_tab.LAST
1400             	       DELETE FROM hxc_dep_transaction_details
1401             	             WHERE ROWID = CHARTOROWID(td_rowid_tab(i));
1402 
1403             	    l_td_del_count := l_td_del_count + SQL%ROWCOUNT;
1404 
1405             	    trans_detail_tab.DELETE;
1406             	    trans_tab.DELETE;
1407             	    td_rowid_tab.DELETE;
1408 
1409             	    OPEN get_dup_trans;
1410             	    LOOP
1411             	       FETCH get_dup_trans
1412             	        BULK COLLECT INTO trans_id_tab,
1413             	                          uniq_rowid_tab LIMIT 500;
1414 
1415             	       EXIT WHEN trans_id_tab.COUNT = 0;
1416 
1417             	       FORALL i IN trans_id_tab.FIRST..trans_id_tab.LAST
1418             	           DELETE FROM hxc_archive_temp
1419             	                 WHERE master_id = trans_id_tab(i)
1420             	                   AND ROWID <> uniq_rowid_tab(i)
1421             	                   AND thread_id = p_thread_id ;
1422             	    END LOOP;
1423             	    CLOSE get_dup_trans;
1424 
1425             	    DELETE FROM hxc_archive_temp
1426             	          WHERE EXISTS ( SELECT 1
1427             	                           FROM hxc_dep_transactions_ar
1428             	                          WHERE transaction_id = master_id )
1429             	            AND thread_id = p_thread_id ;
1430 
1431             	    INSERT INTO hxc_dep_transactions_ar
1432             	              (DATA_SET_ID,TRANSACTION_ID,TRANSACTION_PROCESS_ID,TRANSACTION_DATE,TYPE,
1433             	               STATUS,EXCEPTION_DESCRIPTION,OBJECT_VERSION_NUMBER,CREATED_BY,CREATION_DATE,
1434             	               LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,TRANSACTION_CODE)
1435             	        SELECT /*+ LEADING(temp) USE_NL(bkuptxn) */
1436             	               p_data_set_id,TRANSACTION_ID,TRANSACTION_PROCESS_ID,
1437             	  	       TRANSACTION_DATE,TYPE,STATUS,EXCEPTION_DESCRIPTION,OBJECT_VERSION_NUMBER,
1438             	  	       CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,
1439             	  	       TRANSACTION_CODE
1440             	         FROM hxc_dep_transactions bkuptxn,
1441             	              hxc_archive_temp temp
1442             	        WHERE transaction_id = master_id
1443             	          AND thread_id = p_thread_id
1444             	          AND transaction_id NOT IN ( SELECT transaction_id
1445             	                                        FROM hxc_dep_transactions_ar hxc
1446             	                                       WHERE bkuptxn.transaction_id = hxc.transaction_id)
1447             	          ;
1448 
1449             	    l_trans_count := l_trans_count + SQL%ROWCOUNT;
1450 
1451             	    DELETE /*+ LEADING(temp) USE_NL(bkuptxn) */
1452             	           FROM hxc_dep_transactions  bkuptxn
1453             	          WHERE transaction_id IN ( SELECT master_id
1454             	                                      FROM hxc_archive_temp temp
1455             	                                     WHERE thread_id = p_thread_id) ;
1456 
1457             	    l_trans_del_count := l_trans_del_count + SQL%ROWCOUNT;
1458 
1459             	    DELETE FROM hxc_archive_temp
1460             	          WHERE thread_id = p_thread_id ;
1461 
1462             	END LOOP;
1463             	CLOSE get_dep_transactions;
1464 
1465             	hxc_archive.log_data_mismatch( p_scope => 'Deposit Transaction Detail ',
1466             	                               p_insert => l_td_count,
1467             	                               p_delete => l_td_del_count,
1468             	                               p_mismatch => data_mismatch );
1469 
1470             	IF data_mismatch
1471             	THEN
1472             	   write_data_mismatch('Deposit Transaction Detail ');
1473             	   EXIT TO_CONTINUE_TO_NEXT_CHUNK ;
1474             	END IF;
1475 
1476             	hxc_archive.log_data_mismatch( p_scope => 'Deposit Transaction ',
1477             	                               p_insert => l_trans_count,
1478             	                               p_delete => l_trans_del_count,
1479             	                               p_mismatch => data_mismatch );
1480 
1481             	IF data_mismatch
1482             	THEN
1483             	   write_data_mismatch('Deposit Transaction ');
1484             	   EXIT TO_CONTINUE_TO_NEXT_CHUNK ;
1485             	END IF;
1486 
1487 
1488 
1489 
1490 
1491 
1495             	l_tau_count := 0;
1492 
1493 
1494 
1496             	l_tau_del_count := 0;
1497             	l_ta_count := 0;
1498             	l_ta_del_count := 0;
1499             	IF get_attributes%ISOPEN
1500                 THEN
1501                    CLOSE get_attributes;
1502                 END IF;
1503             	OPEN get_attributes;
1504             	LOOP
1505             	    FETCH get_attributes
1506             	     BULK COLLECT INTO usage_tab,
1507             	                      attribute_tab,
1508             	                      usage_rowid_tab LIMIT 250;
1509 
1510             	    EXIT WHEN usage_tab.COUNT = 0;
1511 
1512 
1513             	    FORALL i IN usage_tab.FIRST..usage_tab.LAST
1514             	      INSERT INTO hxc_archive_temp
1515             	               ( detail_id,
1516             	                 master_id,
1517             	                 ref_rowid,
1518             	                 thread_id)
1519             	         VALUES ( usage_tab(i),
1520             	                  attribute_tab(i),
1521             	                  usage_rowid_tab(i),
1522             	                  p_thread_id );
1523 
1524 
1525             	    INSERT INTO hxc_time_attribute_usages_ar
1526             	              (DATA_SET_ID,TIME_ATTRIBUTE_USAGE_ID,TIME_ATTRIBUTE_ID,TIME_BUILDING_BLOCK_ID,
1527 	    	               CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,
1528 	    	               OBJECT_VERSION_NUMBER,TIME_BUILDING_BLOCK_OVN)
1529             	          SELECT /*+ LEADING(temp) USE_NL(bkuptau) */
1530             	                 p_data_set_id,TIME_ATTRIBUTE_USAGE_ID,TIME_ATTRIBUTE_ID,TIME_BUILDING_BLOCK_ID,
1531 	    	                 CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,
1532 	    	                 OBJECT_VERSION_NUMBER,TIME_BUILDING_BLOCK_OVN
1533 	    	            FROM hxc_archive_temp temp,
1534             	                 hxc_time_attribute_usages bkuptau
1535             	           WHERE bkuptau.ROWID = CHARTOROWID(temp.ref_rowid)
1536             	             AND thread_id   = p_thread_id ;
1537 
1538             	    l_tau_count := l_tau_count + SQL%ROWCOUNT;
1539 
1540             	    FORALL i IN usage_rowid_tab.FIRST..usage_rowid_tab.LAST
1541             	        DELETE FROM hxc_time_attribute_usages
1542             	              WHERE ROWID = CHARTOROWID(usage_rowid_tab(i)) ;
1543 
1544             	    l_tau_del_count := l_tau_del_count + SQL%ROWCOUNT;
1545 
1546             	    DELETE FROM hxc_archive_temp
1547             	          WHERE EXISTS ( SELECT 1
1548             	                           FROM hxc_time_attributes_ar
1549             	                          WHERE time_attribute_id = master_id )
1550             	            AND thread_id = p_thread_id ;
1551 
1552             	    INSERT INTO hxc_time_attributes_ar
1553             	             (ATTRIBUTE15,ATTRIBUTE16,ATTRIBUTE17,ATTRIBUTE18,ATTRIBUTE19,ATTRIBUTE20,ATTRIBUTE21,
1554             	 	      ATTRIBUTE22,ATTRIBUTE23,ATTRIBUTE24,ATTRIBUTE25,ATTRIBUTE26,ATTRIBUTE27,ATTRIBUTE28,
1555             	 	      ATTRIBUTE29,ATTRIBUTE30,BLD_BLK_INFO_TYPE_ID,OBJECT_VERSION_NUMBER,TIME_ATTRIBUTE_ID,
1556             	 	      ATTRIBUTE_CATEGORY,ATTRIBUTE1,ATTRIBUTE2,ATTRIBUTE3,ATTRIBUTE4,ATTRIBUTE5,ATTRIBUTE6,
1557             	 	      ATTRIBUTE7,ATTRIBUTE8,ATTRIBUTE9,ATTRIBUTE10,ATTRIBUTE11,ATTRIBUTE12,ATTRIBUTE13,
1558             	 	      ATTRIBUTE14,CONSOLIDATED_FLAG,DATA_SET_ID)
1559             	        SELECT /*+ LEADING(temp) USE_NL(bkupta) */
1560             	               ATTRIBUTE15,ATTRIBUTE16,ATTRIBUTE17,ATTRIBUTE18,ATTRIBUTE19,ATTRIBUTE20,ATTRIBUTE21,
1561             	               ATTRIBUTE22,ATTRIBUTE23,ATTRIBUTE24,ATTRIBUTE25,ATTRIBUTE26,ATTRIBUTE27,ATTRIBUTE28,
1562             	 	       ATTRIBUTE29,ATTRIBUTE30,BLD_BLK_INFO_TYPE_ID,OBJECT_VERSION_NUMBER,TIME_ATTRIBUTE_ID,
1563             	 	       ATTRIBUTE_CATEGORY,ATTRIBUTE1,ATTRIBUTE2,ATTRIBUTE3,ATTRIBUTE4,ATTRIBUTE5,ATTRIBUTE6,
1564             	 	       ATTRIBUTE7,ATTRIBUTE8,ATTRIBUTE9,ATTRIBUTE10,ATTRIBUTE11,ATTRIBUTE12,ATTRIBUTE13,
1565             	 	       ATTRIBUTE14,null,p_data_set_id
1566             	          FROM hxc_time_attributes bkupta
1567             	         WHERE bkupta.time_attribute_id in ( SELECT /*+ NO_INDEX(temp) */
1568             	                                                    master_id
1569             	                                               FROM hxc_archive_temp temp
1570             	                                              WHERE thread_id = p_thread_id );
1571 
1572             	    l_ta_count := l_ta_count + SQL%ROWCOUNT;
1573 
1574             	    DELETE /*+ LEADING(temp) USE_NL(bkupta) */
1575             	           FROM hxc_time_attributes bkupta
1576             	          WHERE time_attribute_id IN ( SELECT /*+ NO_INDEX(temp) */
1577             	                                              master_id
1578             	                                         FROM hxc_archive_temp temp
1579             	                                        WHERE thread_id = p_thread_id ) ;
1580 
1581             	    l_ta_del_count := l_ta_del_count + SQL%ROWCOUNT;
1582 
1583             	    usage_tab.DELETE;
1584             	    attribute_tab.DELETE;
1585             	    usage_rowid_tab.DELETE;
1586 
1587             	    DELETE FROM hxc_archive_temp
1588             	          WHERE thread_id = p_thread_id ;
1589 
1590             	END LOOP ;
1591             	CLOSE get_attributes;
1592 
1593             	hxc_archive.log_data_mismatch( p_scope => 'Attribute Usages ',
1594             	                               p_insert => l_tau_count,
1595             	                               p_delete => l_tau_del_count,
1596             	                               p_mismatch => data_mismatch );
1597             	IF data_mismatch
1598             	THEN
1599             	   write_data_mismatch('Attribute Usages ');
1600             	   EXIT TO_CONTINUE_TO_NEXT_CHUNK ;
1601             	END IF;
1602 
1606             	                               p_mismatch => data_mismatch );
1603             	hxc_archive.log_data_mismatch( p_scope => 'Attributes ',
1604             	                               p_insert => l_ta_count,
1605             	                               p_delete => l_ta_del_count,
1607 
1608             	IF data_mismatch
1609             	THEN
1610             	   write_data_mismatch('Attributes ');
1611             	   EXIT TO_CONTINUE_TO_NEXT_CHUNK ;
1612             	END IF;
1613 
1614             	DELETE FROM hxc_temp_timecard_chunks
1615             	      WHERE scope IN ( 'TIMECARD', 'DAY','APPLICATION_PERIOD')
1616             	        AND thread_id = p_thread_id ;
1617 
1618 
1619 
1620                 -- Bug 9790410
1621                 -- Added the following construct to work with OTLR records.
1622 
1623                 OPEN get_sum_hrs;
1624                 LOOP
1625                    FETCH get_sum_hrs BULK COLLECT INTO sum_id_tab,
1626                                                        tim_id_tab LIMIT 500;
1627 
1628 
1629                    EXIT WHEN sum_id_tab.COUNT = 0;
1630 
1631 
1632                    FORALL i IN sum_id_tab.FIRST..sum_id_tab.LAST
1633                      INSERT INTO hxc_archive_temp
1634                              ( detail_id,
1635                                master_id,
1636                                thread_id)
1637                         VALUES ( sum_id_tab(i),
1638                                  tim_id_tab(i),
1639                                  p_thread_id);
1640 
1641                    INSERT INTO hxt_sum_hours_worked_f_ar
1642                          ( state_name, county_name, city_name, zip_code, ffv_cost_center_id,
1643                            ffv_labor_account_id, tas_id, location_id, sht_id, hrw_comment,
1644                            ffv_rate_code_id, rate_multiple, hourly_rate, amount, fcl_tax_rule_code,
1645                            separate_check_flag, seqno, created_by, creation_date, last_updated_by,
1646                            last_update_date, last_update_login, actual_time_in, actual_time_out,
1647                            job_id, earn_pol_id, project_id, prev_wage_code, effective_start_date,
1648                            effective_end_date, attribute_category, attribute1, attribute2, attribute3,
1649                            attribute4, attribute5, attribute6, attribute7, attribute8, attribute9,
1650                            attribute10, attribute11, attribute12, attribute13, attribute14, attribute15,
1651                            attribute16, attribute17, attribute18, attribute19, attribute20, attribute21,
1652                            attribute22, attribute23, attribute24, attribute25, attribute26, attribute27,
1653                            attribute28, attribute29, attribute30, object_version_number, time_building_block_id,
1654                            time_building_block_ovn, id, line_status, tim_id, date_worked, assignment_id,
1655                            hours, time_in, time_out, element_type_id, fcl_earn_reason_code,data_set_id )
1656                        SELECT DISTINCT state_name, county_name, city_name, zip_code, ffv_cost_center_id,
1657                            ffv_labor_account_id, tas_id, location_id, sht_id, hrw_comment,
1658                            ffv_rate_code_id, rate_multiple, hourly_rate, amount, fcl_tax_rule_code,
1659                            separate_check_flag, seqno, created_by, creation_date, last_updated_by,
1660                            last_update_date, last_update_login, actual_time_in, actual_time_out,
1661                            job_id, earn_pol_id, project_id, prev_wage_code, effective_start_date,
1662                            effective_end_date, attribute_category, attribute1, attribute2, attribute3,
1663                            attribute4, attribute5, attribute6, attribute7, attribute8, attribute9,
1664                            attribute10, attribute11, attribute12, attribute13, attribute14, attribute15,
1665                            attribute16, attribute17, attribute18, attribute19, attribute20, attribute21,
1666                            attribute22, attribute23, attribute24, attribute25, attribute26, attribute27,
1667                            attribute28, attribute29, attribute30, object_version_number, time_building_block_id,
1668                            time_building_block_ovn, id, line_status, tim_id, date_worked, assignment_id,
1669                            hours, time_in, time_out, element_type_id, fcl_earn_reason_code ,p_data_set_id
1670                         FROM hxt_sum_hours_worked_f sum,
1671                              hxc_archive_temp temp
1672                        WHERE temp.detail_id = sum.id
1673                          AND temp.thread_id = p_thread_id;
1674 
1675 
1676                     l_hxt_sum_count := l_hxt_sum_count + SQL%ROWCOUNT;
1677 
1678                     FORALL i IN sum_id_tab.FIRST..sum_id_tab.LAST
1679                          DELETE FROM hxt_sum_hours_worked_f
1680                                WHERE id = sum_id_tab(i);
1681 
1682                     l_hxt_sum_del_count := l_hxt_sum_del_count + SQL%ROWCOUNT;
1683 
1684                     INSERT INTO hxt_det_hours_worked_f_ar
1685                            (  data_set_id, state_name, county_name, city_name, zip_code, id, parent_id, line_status,
1686                               tim_id, date_worked, assignment_id, hours, time_in, time_out, element_type_id,
1687                               fcl_earn_reason_code, ffv_cost_center_id, ffv_labor_account_id, tas_id, location_id,
1688                               sht_id, hrw_comment, ffv_rate_code_id, rate_multiple, hourly_rate, amount,
1689                               fcl_tax_rule_code, separate_check_flag, seqno, created_by, creation_date, last_updated_by,
1690                               last_update_date, last_update_login, actual_time_in, actual_time_out, job_id, earn_pol_id,
1691                               effective_start_date, effective_end_date, pbl_line_id, retro_pbl_line_id, project_id,
1692                               prev_wage_code, pa_status, pay_status, retro_batch_id, object_version_number )
1693                        SELECT DISTINCT
1697                               sht_id, hrw_comment, ffv_rate_code_id, rate_multiple, hourly_rate, amount,
1694                               p_data_set_id, state_name, county_name, city_name, zip_code, id, parent_id, line_status,
1695                               tim_id, date_worked, assignment_id, hours, time_in, time_out, element_type_id,
1696                               fcl_earn_reason_code, ffv_cost_center_id, ffv_labor_account_id, tas_id, location_id,
1698                               fcl_tax_rule_code, separate_check_flag, seqno, created_by, creation_date, last_updated_by,
1699                               last_update_date, last_update_login, actual_time_in, actual_time_out, job_id, earn_pol_id,
1700                               effective_start_date, effective_end_date, pbl_line_id, retro_pbl_line_id, project_id,
1701                               prev_wage_code, pa_status, pay_status, retro_batch_id, object_version_number
1702                          FROM hxc_archive_temp temp,
1703                               hxt_det_hours_worked_f det
1704                         WHERE temp.detail_id = det.parent_id
1705                           AND temp.thread_id = p_thread_id;
1706 
1707                    l_hxt_det_count  := l_hxt_det_count + SQL%ROWCOUNT;
1708 
1709 
1710                    FORALL i IN sum_id_tab.FIRST..sum_id_tab.LAST
1711                            DELETE FROM hxt_det_hours_worked_f
1712                                  WHERE parent_id = sum_id_tab(i);
1713 
1714                    l_hxt_det_del_count  := l_hxt_det_del_count + SQL%ROWCOUNT;
1715 
1716                    FORALL i IN tim_id_tab.FIRST..tim_id_tab.LAST
1717                          UPDATE hxt_timecards_f
1718                             SET data_set_id = p_data_set_id
1719                           WHERE id = tim_id_tab(i);
1720 
1721                    DELETE FROM hxc_archive_temp
1722                          WHERE thread_id = p_thread_id;
1723 
1724 
1725                 END LOOP;
1726                 CLOSE get_sum_hrs;
1727 
1728 
1729 
1730             	hxc_archive.log_data_mismatch( p_scope => 'OTLR Summary ',
1731             	                               p_insert => l_hxt_sum_count,
1732             	                               p_delete => l_hxt_sum_del_count,
1733             	                               p_mismatch => data_mismatch );
1734             	IF data_mismatch
1735             	THEN
1736             	   write_data_mismatch('OTLR Summary ');
1737             	   EXIT TO_CONTINUE_TO_NEXT_CHUNK ;
1738             	END IF;
1739 
1740             	hxc_archive.log_data_mismatch( p_scope => 'OTLR Details',
1741             	                               p_insert => l_hxt_det_count,
1742             	                               p_delete => l_hxt_det_del_count,
1743             	                               p_mismatch => data_mismatch );
1744 
1745             	IF data_mismatch
1746             	THEN
1747             	   write_data_mismatch('OTLR Details');
1748             	   EXIT TO_CONTINUE_TO_NEXT_CHUNK ;
1749             	END IF;
1750 
1751 
1752 
1753             	INSERT INTO hxc_ap_detail_links_ar
1754             	            (application_period_id,
1755             	             time_building_block_id,
1756             	             time_building_block_ovn)
1757             	     SELECT application_period_id, time_building_block_id, time_building_block_ovn
1758             	       FROM hxc_temp_timecard_chunks temp,
1759             	            hxc_ap_detail_links adlbkup
1760 	    	      WHERE temp.id = adlbkup.time_building_block_id
1761             	        AND temp.ref_ovn = adlbkup.time_building_block_ovn
1762 		    AND temp.scope = ('DETAIL')
1763 		    AND thread_id = p_thread_id ;
1764 
1765             	l_adl_count := SQL%ROWCOUNT;
1766 
1767 
1768             	DELETE FROM hxc_ap_detail_links
1769             	      WHERE (time_building_block_id,time_building_block_ovn)
1770             	                                    IN ( SELECT id,
1771             	                                                ref_ovn
1772             	                                           FROM hxc_temp_timecard_chunks
1773             	                                          WHERE scope = 'DETAIL'
1774             	                                            AND thread_id = p_thread_id );
1775 
1776             	l_adl_del_count := SQL%ROWCOUNT;
1777 
1778             	hxc_archive.log_data_mismatch( p_scope => 'App Detail LINKs ',
1779             	                                p_insert => l_adl_count,
1780             	                                p_delete => l_adl_del_count,
1781             	                                p_mismatch => data_mismatch );
1782 
1783             	IF data_mismatch
1784             	THEN
1785             	   write_data_mismatch('App Detail LINKs ');
1786             	   EXIT TO_CONTINUE_TO_NEXT_CHUNK ;
1787             	END IF;
1788 
1789             	OPEN get_latest_details;
1790             	LOOP
1791             	   FETCH get_latest_details
1792             	    BULK COLLECT INTO latest_id_tab,
1793             	                      latest_rowid_tab LIMIT 500;
1794             	   EXIT WHEN latest_id_tab.COUNT = 0;
1795             	   FORALL i IN latest_id_Tab.FIRST..latest_id_Tab.last
1796             	      DELETE FROM hxc_latest_details
1797             	           WHERE ROWID = CHARTOROWID(latest_rowid_tab(i)) ;
1798 
1799             	   latest_rowid_tab.DELETE;
1800             	   latest_id_tab.DELETE;
1801             	END LOOP;
1802             	CLOSE get_latest_details;
1803 
1804 
1805             	fnd_file.put_line(fnd_file.log,' ');
1806        	    	fnd_file.put_line(fnd_file.log,' ');
1807        	    	fnd_file.put_line(fnd_file.log,'========================================================== ');
1808        	    	fnd_file.put_line(fnd_file.log,' ');
1809        	    	fnd_file.put_line(fnd_file.log,' ');
1810             	COMMIT;
1811             	tc_id_tab.DELETE;
1812             	tc_ovn_tab.DELETE;
1813             	iloop:= 0;
1814             	EXCEPTION
1815             	  WHEN DUP_VAL_ON_INDEX THEN
1816             	     ROLLBACK;
1817             	     iloop := 1;
1818             	     fnd_file.put_line(fnd_file.LOG,'This chunk found a resource contention, will sleep for a minute ');
1819    	             fnd_file.put_line(fnd_file.log,'=================================================================');
1820 	             fnd_file.put_line(fnd_file.log,'Reprocessing this chunk ');
1821 	             fnd_file.put_line(fnd_file.log,'==================================================================');
1822             	     l_td_count := 0;
1823             	     l_trans_count := 0;
1824             	     l_tau_count := 0;
1825             	     l_ta_count  := 0;
1826             	     data_mismatch := FALSE;
1827             	     dbms_lock.sleep(60);
1828                   WHEN DEADLOCK_DETECTED THEN
1829                      ROLLBACK;
1830                      iloop := 1;
1831                      fnd_file.put_line(fnd_file.LOG,'This chunk found a resource contention(deadlock), will sleep for a minute ');
1832    	             fnd_file.put_line(fnd_file.log,'=================================================================');
1833 	             fnd_file.put_line(fnd_file.log,'Reprocessing this chunk ');
1834 	             fnd_file.put_line(fnd_file.log,'==================================================================');
1835                      l_td_count := 0;
1836                      l_trans_count := 0;
1837                      l_tau_count := 0;
1838                      l_ta_count  := 0;
1839                      data_mismatch := FALSE;
1840                      dbms_lock.sleep(60);
1841             END ;
1842         END LOOP TO_CONTINUE_TO_NEXT_CHUNK ;
1843 
1844     END LOOP;
1845 
1846 END child_archive_process;
1847 
1848 
1849 
1850 PROCEDURE log_data_mismatch( p_scope      IN VARCHAR2,
1851                              p_insert     IN NUMBER,
1852                              p_delete     IN NUMBER,
1853                              p_mismatch   IN OUT NOCOPY BOOLEAN)
1854 IS
1855 
1856 BEGIN
1857     IF p_insert = p_delete
1858     THEN
1859        fnd_file.put_line(fnd_file.log,' ');
1860        fnd_file.put_line(fnd_file.log,' '||p_scope||' records moved : '||p_insert);
1861     ELSE
1862        fnd_file.put_line(fnd_file.log,' ');
1863        fnd_file.put_line(fnd_file.log,'==========================================================================');
1864        fnd_file.put_line(fnd_file.log,'  An error occured while processing '||p_scope||' records');
1865        fnd_file.put_line(fnd_file.log,'==========================================================================');
1866        fnd_file.put_line(fnd_file.log, p_insert||' records were inserted into offline table ');
1867        fnd_file.put_line(fnd_file.log, p_delete||' records were deleted from online table ');
1868        fnd_file.put_line(fnd_file.log,'This chunk is rolled back, pls check up data. ');
1869        p_mismatch := TRUE;
1870        ROLLBACK;
1871     END IF;
1872 
1873     RETURN;
1874 END log_data_mismatch ;
1875 
1876 
1877 END hxc_archive;