DBA Data[Home] [Help]

PACKAGE BODY: APPS.HXC_TIMECARD_DEPOSIT

Source


1 PACKAGE BODY hxc_timecard_deposit AS
2 /* $Header: hxctimedp.pkb 120.10.12010000.3 2008/11/13 11:52:46 bbayragi ship $ */
3 
4   g_debug boolean := hr_utility.debug_enabled;
5 
6   Procedure add_transaction_info
7     (p_time_building_block_id in          hxc_time_building_blocks.time_building_block_id%type
8      ,p_object_version_number  in          hxc_time_building_blocks.object_version_number%type
9      ,p_exception_desc       in          varchar2
10      ,p_transaction_info       in out nocopy hxc_timecard.transaction_info
11      ,p_messages             in out nocopy hxc_message_table_type
12      ) is
13 
14     l_index  number;
15     l_status varchar2(20);
16 
17   Begin
18 
19     if(p_time_building_block_id is null) then
20 
21       hxc_timecard_message_helper.addErrorToCollection
22         (p_messages
23          ,'HXC_NULL_TRANS_BLOCK'
24          ,hxc_timecard.c_error
25          ,null
26          ,null
27          ,'HXC'
28          ,null
29          ,null
30          ,null
31          ,null
32          );
33 
34     else
35 
36 
37       l_index := p_transaction_info.count + 1;
38 
39       if(p_exception_desc is not null) then
40         l_status := hxc_timecard.c_trans_error;
41       else
42         l_status := hxc_timecard.c_trans_success;
43       end if;
44 
45       p_transaction_info(l_index).time_building_block_id := p_time_building_block_id;
46       p_transaction_info(l_index).object_version_number  := p_object_version_number;
47       p_transaction_info(l_index).exception_desc := p_exception_desc;
48       p_transaction_info(l_index).status := l_status;
49 
50     end if;
51 
52   End add_transaction_info;
53 
54   Procedure deposit_error
55     (p_messages       in out nocopy hxc_message_table_type
56      ,p_transaction_info in out nocopy hxc_timecard.transaction_info
57      ,p_time_building_block_id in hxc_time_building_blocks.time_building_block_id%type
58      ,p_time_building_block_ovn in hxc_time_building_blocks.object_version_number%type
59      ) is
60 
61     l_exception_desc varchar2(2000);
62 
63   Begin
64 
65     hr_message.provide_error;
66 
67 
68     if(hr_message.last_message_name is not null) then
69 
70       --
71       -- If we have a specific error, then I think
72       -- we shouldn't associate the blocks in this case
73       -- the reason is that we have no corresponding web beans
74       -- on the page at this point to set the item level errors
75       -- on.
76 
77       hxc_timecard_message_helper.addErrorToCollection
78         (p_messages
79          ,hr_message.last_message_name
80          ,hxc_timecard.c_error
81          ,null
82          ,null
83          ,hr_message.last_message_app
84          ,null
85          ,null
86          ,null
87          ,null
88          );
89 
90       l_exception_desc := hr_message.get_message_text;
91 
92     else
93 
94       if(SQLERRM is not null) then
95         -- fix for 3266231, v115.6
96         -- adding 'BLK_AND_CHILDREN' for "MESSAGE_EXTENT"
97         hxc_timecard_message_helper.addErrorToCollection
98           (p_messages
99            ,'HXC_HXT_DEP_VAL_ORAERR'
100            ,hxc_timecard.c_error
101            ,null
102            ,substr('ERROR&' || SQLERRM,1,240)
103            ,'HXC'
104            ,null
105            ,null
106            ,null
107            ,null
108            ,'BLK_AND_CHILDREN'
109            );
110 
111         l_exception_desc := substr(SQLERRM,1,2000);
112 
113       else
114         -- Unable to determine error from stack or SQLERRM,
115         -- set to internal block deposit error.
116 
117         hxc_timecard_message_helper.addErrorToCollection
118           (p_messages
119            ,'HXC_XXXXXX_UNKN_BLOCK_DEP'
120            ,hxc_timecard.c_error
121            ,null
122            ,null
123            ,hxc_timecard.c_hxc
124            ,p_time_building_block_id
125            ,p_time_building_block_ovn
126            ,null
127            ,null
128            );
129 
130         l_exception_desc := 'An Unknown error has occurred.'
131           ||'  HXC_TIMECARD_DEPOSIT.DEPOSIT_ERROR';
132       end if;
133 
134     end if;
135 
136     --
137     -- Create some new transaction info for this building block
138     --
139 
140     add_transaction_info
141       (p_time_building_block_id => p_time_building_block_id
142        ,p_object_version_number  => p_time_building_block_ovn
143        ,p_exception_desc       => l_exception_desc
144        ,p_transaction_info       => p_transaction_info
145        ,p_messages             => p_messages
146        );
147 
148   End deposit_error;
149 
150   Procedure update_dependent_attributes
151     (p_attributes       in out nocopy hxc_attribute_table_type
152      ,p_building_block_id  in          number
153      ) is
154 
155     l_index     number;
156     l_attribute hxc_attribute_type;
157 
158   Begin
159 
160     --
161     -- now do the attributes
162     -- These aren't sorted, so we go through
163     -- them all.
164     --
165     l_index := p_attributes.first;
166     LOOP
167       EXIT WHEN NOT p_attributes.exists(l_index);
168 
169       l_attribute := p_attributes(l_index);
170 
171       if(hxc_timecard_attribute_utils.is_corresponding_block
172   (p_attribute => l_attribute
173    ,p_block_id  => p_building_block_id
174    )
175          ) then
176 
177         p_attributes(l_index).process := 'Y';
178 
179       end if;
180 
181       l_index := p_attributes.next(l_index);
182 
183     END LOOP;
184 
185   End update_dependent_attributes;
186 
187   Function set_child_process
188     (p_block in hxc_block_type)
189     return varchar2 is
190 
191   Begin
192 
193     if(hxc_timecard_block_utils.is_new_block(p_block)) then
194       --
195       -- Process flag is set to No for new block.
196       -- User probably entered it, then deleted it
197       -- without commit to db inbetween.  Don't
198       -- process
199       return 'N';
200     else
201       return 'Y';
202     end if;
203 
204   End set_child_process;
205 
206   Procedure maintain_error_table
207     (p_messages     in out nocopy hxc_message_table_type
208      ,p_old_ta_id    in          hxc_time_building_blocks.time_building_block_id%type
209      ,p_old_ta_ovn   in          hxc_time_building_blocks.object_version_number%type
210      ,p_new_ta_id    in          hxc_time_building_blocks.time_building_block_id%type
211      ,p_new_ta_ovn   in          hxc_time_building_blocks.object_version_number%type
212      ,p_timecard_id  in          hxc_time_building_blocks.time_building_block_id%type
213      ,p_timecard_ovn in          hxc_time_building_blocks.object_version_number%type
214      ) is
215 
216     l_index number;
217 
218   Begin
219 
220     l_index := p_messages.first;
221 
222     Loop
223       Exit when not p_messages.exists(l_index);
224       if((p_messages(l_index).time_attribute_id = p_old_ta_id)
225          AND
226            (p_messages(l_index).time_attribute_ovn = p_old_ta_ovn)) then
227         p_messages(l_index).time_attribute_id := p_new_ta_id;
228         p_messages(l_index).time_attribute_ovn := p_new_ta_ovn;
229       end if;
230       if((p_messages(l_index).time_attribute_id is null)
231          AND
232            (p_messages(l_index).time_building_block_id is null)) then
233         p_messages(l_index).time_building_block_id  := p_timecard_id;
234         p_messages(l_index).time_building_block_ovn := p_timecard_ovn;
235       end if;
236       l_index := p_messages.next(l_index);
237     End Loop;
238 
239   End maintain_error_table;
240 
241   Procedure maintain_error_table
242     (p_messages     in out nocopy hxc_message_table_type
243      ,p_old_bb_id    in          hxc_time_building_blocks.time_building_block_id%type
244      ,p_old_bb_ovn   in          hxc_time_building_blocks.object_version_number%type
245      ,p_new_bb_id    in          hxc_time_building_blocks.time_building_block_id%type
246      ,p_new_bb_ovn   in          hxc_time_building_blocks.object_version_number%type
247      ,p_timecard_id  in          hxc_time_building_blocks.time_building_block_id%type
248      ,p_timecard_ovn in          hxc_time_building_blocks.object_version_number%type
249      ) is
250 
251     l_index number;
252 
253   Begin
254 
255     l_index := p_messages.first;
256 
257     Loop
258       Exit when not p_messages.exists(l_index);
259       if((p_messages(l_index).time_building_block_id = p_old_bb_id)
260          AND
261            (nvl(p_messages(l_index).time_building_block_ovn,p_old_bb_ovn) = p_old_bb_ovn)) then
262         p_messages(l_index).time_building_block_id := p_new_bb_id;
263         p_messages(l_index).time_building_block_ovn := p_new_bb_ovn;
264       end if;
265       if(p_messages(l_index).time_building_block_id is null) then
266         p_messages(l_index).time_building_block_id := p_timecard_id;
267         p_messages(l_index).time_building_block_ovn := p_timecard_ovn;
268       end if;
269       l_index := p_messages.next(l_index);
270     End Loop;
271 
272   End maintain_error_table;
273 
274   Procedure maintain_dependents
275     (p_blocks       in out nocopy hxc_block_table_type
276      ,p_attributes   in out nocopy hxc_attribute_table_type
277      ,p_messages     in out nocopy hxc_message_table_type
278      ,p_block_list   in          hxc_timecard.block_list
279      ,l_old_bb_id    in          hxc_time_building_blocks.time_building_block_id%type
280      ,l_old_ovn      in          hxc_time_building_blocks.object_version_number%type
281      ,l_new_bb_id    in          hxc_time_building_blocks.time_building_block_id%type
282      ,l_new_ovn      in          hxc_time_building_blocks.object_version_number%type
283      ,p_timecard_id  in          hxc_time_building_blocks.time_building_block_id%type
284      ,p_timecard_ovn in          hxc_time_building_blocks.object_version_number%type
285      ) is
286 
287     l_parent_chk pls_integer;
288     l_index      number;
289     l_block      hxc_block_type;
290     l_attribute  hxc_attribute_type;
291 
292   Begin
293     --
294     -- Loop through the specified blocks, looking for the parents
295     --
296     l_index := p_block_list.first;
297     LOOP
298       EXIT WHEN NOT p_block_list.exists(l_index);
299 
300       l_block := p_blocks(p_block_list(l_index));
301 
302       l_parent_chk := hxc_timecard_block_utils.is_parent_block
303         (p_block      => l_block,
304          p_parent_id  => l_old_bb_id,
305          p_parent_ovn => l_old_ovn,
306          p_check_id   => true
307          );
308 
309       if(l_parent_chk = 0)then
310 
311         p_blocks(p_block_list(l_index)).parent_building_block_id := l_new_bb_id;
312         p_blocks(p_block_list(l_index)).parent_building_block_ovn := l_new_ovn;
313         if(p_blocks(p_block_list(l_index)).process <> 'Y') then
314           p_blocks(p_block_list(l_index)).process := set_child_process(p_blocks(p_block_list(l_index)));
315           update_dependent_attributes(p_attributes,p_blocks(p_block_list(l_index)).time_building_block_id);
316         end if;
317       elsif(l_parent_chk = 1) then
318         --
319         -- This means the id matched, but the ovn did not.
320         -- This should never happen when depositing a timecard
321         -- Some likely corruption going on, raise error.
322         --
323         hxc_timecard_message_helper.addErrorToCollection
324           (p_messages
325            ,'HXC_366502_INVALID_PARENT_DEP'
326            ,hxc_timecard.c_error
327            ,null
328            ,null
329            ,'HXC'
330            ,l_block.time_building_block_id
331            ,l_block.object_version_number
332            ,null
333            ,null
334            );
335 
336       end if;
337 
338       l_index := p_block_list.next(l_index);
339     END LOOP;
340     --
341     -- now do the attributes
342     -- These aren't sorted, so we go through
343     -- them all.
344     --
345     l_index := p_attributes.first;
346     LOOP
347       EXIT WHEN NOT p_attributes.exists(l_index);
348 
349       --l_attribute := p_attributes(l_index);
350 
351       if(hxc_timecard_attribute_utils.is_corresponding_block
352   (p_attribute => p_attributes(l_index)
353    ,p_block_id  => l_old_bb_id
354    )
355          ) then
356 
357         p_attributes(l_index).building_block_id := l_new_bb_id;
358         p_attributes(l_index).building_block_ovn := l_new_ovn;
359 
360       end if;
361 
362       l_index := p_attributes.next(l_index);
363 
364     END LOOP;
365 
366     --
367     -- Lastly the messages.  This is done for
368     -- timekeeper, there shouldn't be any messages
369     -- at this point for self service.
370     --
371     maintain_error_table
372       (p_messages     => p_messages
373        ,p_old_bb_id    => l_old_bb_id
374        ,p_old_bb_ovn   => l_old_ovn
375        ,p_new_bb_id    => l_new_bb_id
376        ,p_new_bb_ovn   => l_new_ovn
377        ,p_timecard_id  => p_timecard_id
378        ,p_timecard_ovn => p_timecard_ovn
379        );
380 
381   End maintain_dependents;
382 
383   Procedure deposit_new_block
384     (p_block          in out nocopy HXC_BLOCK_TYPE
385      ,p_old_bb_id         out nocopy NUMBER
386      ,p_new_bb_id         out nocopy NUMBER
387      ,p_transaction_info in out nocopy hxc_timecard.transaction_info
388      ,p_messages       in out nocopy hxc_message_table_type
389      ) is
390 
391     l_object_version_number HXC_TIME_BUILDING_BLOCKS.OBJECT_VERSION_NUMBER%TYPE;
392     l_time_building_block_id HXC_TIME_BUILDING_BLOCKS.TIME_BUILDING_BLOCK_ID%TYPE := null;
393 
394   Begin
395 
396     p_old_bb_id := p_block.time_building_block_id;
397 
398     --
399     -- Call the block Api to create the new block
400     --
401     hxc_building_block_api.create_building_block
402       (p_effective_date          => sysdate
403        ,p_type                  => p_block.type
404        ,p_measure               => p_block.measure
405        ,p_unit_of_measure         => p_block.unit_of_measure
406        ,p_start_time            => hxc_timecard_block_utils.date_value(p_block.start_time)
407        ,p_stop_time             => hxc_timecard_block_utils.date_value(p_block.stop_time)
408        ,p_parent_building_block_id  => p_block.parent_building_block_id
409        ,p_parent_building_block_ovn => p_block.parent_building_block_ovn
410        ,p_scope                 => p_block.scope
411        ,p_approval_style_id       => p_block.approval_style_id
412        ,p_approval_status         => p_block.approval_status
413        ,p_resource_id             => p_block.resource_id
414        ,p_resource_type           => p_block.resource_type
415        ,p_comment_text            => p_block.comment_text
416        ,p_application_set_id      => p_block.application_set_id
417        ,p_translation_display_key   => p_block.translation_display_key
418        ,p_time_building_block_id    => l_time_building_block_id
419        ,p_object_version_number     => l_object_version_number
420        );
421     --
422     -- Keep for the out parameter
423     --
424     p_new_bb_id := l_time_building_block_id;
425     --
426     -- Set the values in the structure
427     --
428     p_block.time_building_block_id := p_new_bb_id;
429     p_block.object_version_number  := 1;
430 
431   Exception
432     when others then
433       --
434       -- Here the save of the building block
435       -- has failed, so we should maintain
436       -- the error.  However, we don't reraise
437       -- the error, since that will be handled
438       -- by timekeeper, or in the case of self
439       -- service, the commit will fail, the inserts
440       -- rolledback, and all the errors for all the
441       -- blocks shown to the user.
442 
443       deposit_error
444         (p_messages => p_messages
445          ,p_transaction_info => p_transaction_info
446          ,p_time_building_block_id => p_block.time_building_block_id
447          ,p_time_building_block_ovn => p_block.object_version_number
448          );
449 
450   End deposit_new_block;
451 
452   Procedure deposit_old_block
453     (p_block            in out nocopy hxc_block_type,
454      p_old_ovn             out nocopy number,
455      p_new_ovn             out nocopy number,
456      p_deleted_blocks   in out nocopy hxc_timecard.block_list,
457      p_transaction_info in out nocopy hxc_timecard.transaction_info,
458      p_messages         in out nocopy hxc_message_table_type
459      ) is
460 
461     l_object_version_number hxc_time_building_blocks.object_version_number%type;
462 
463   Begin
464     --
465     -- Keep the old ovn for future use
466     --
467     p_old_ovn := p_block.object_version_number;
468     --
469     -- Since we want a history of the timecard, we
470     -- don't update the row, rather create a new
471     -- block, then update it with the old
472     -- id and ovn +1 - currently the block API
473     -- handles this for us, based on the value
474     -- passed in the time_building_block_id
475     -- parameter!
476     -- Call the API, with the real values!
477     --
478 
479 
480     if(hxc_timecard_block_utils.is_active_block(p_block)) then
481 
482       hxc_building_block_api.create_building_block
483         (p_effective_date          => sysdate
484          ,p_type                  => p_block.type
485          ,p_measure               => p_block.measure
486          ,p_unit_of_measure         => p_block.unit_of_measure
487          ,p_start_time            => hxc_timecard_block_utils.date_value(p_block.start_time)
488          ,p_stop_time             => hxc_timecard_block_utils.date_value(p_block.stop_time)
489          ,p_parent_building_block_id  => p_block.parent_building_block_id
490          ,p_parent_building_block_ovn => p_block.parent_building_block_ovn
491          ,p_scope                 => p_block.scope
492          ,p_approval_style_id       => p_block.approval_style_id
493          ,p_approval_status         => p_block.approval_status
494          ,p_resource_id             => p_block.resource_id
495          ,p_resource_type           => p_block.resource_type
496          ,p_comment_text            => p_block.comment_text
497          ,p_application_set_id      => p_block.application_set_id
498          ,p_translation_display_key   => p_block.translation_display_key
499          ,p_time_building_block_id    => p_block.time_building_block_id
500          ,p_object_version_number     => l_object_version_number
501          );
502 
503     else
504 
505       hxc_building_block_api.delete_building_block
506         (p_object_version_number  => l_object_version_number
507          ,p_time_building_block_id => p_block.time_building_block_id
508          ,p_effective_date       => sysdate
509          ,p_application_set_id     => p_block.application_set_id
510          );
511       --
512       -- Record this as a deleted block
513       --
514       p_deleted_blocks(p_block.time_building_block_id) := p_block.object_version_number;
515 
516     end if;
517     --
518     -- Keep for the out parameter
519     --
520     p_new_ovn := l_object_version_number;
521     --
522     -- Set the values in the structure
523     --
524     p_block.object_version_number  := l_object_version_number;
525 
526   Exception
527     when others then
528       --
529       -- Here the save of the building block
530       -- has failed, so we should maintain
531       -- the error.  However, we don't reraise
532       -- the error, since that will be handled
533       -- by timekeeper, or in the case of self
534       -- service, the commit will fail, the inserts
535       -- rolledback, and all the errors for all the
536       -- blocks shown to the user.
537 
538       deposit_error
539         (p_messages => p_messages
540          ,p_transaction_info => p_transaction_info
541          ,p_time_building_block_id => p_block.time_building_block_id
542          ,p_time_building_block_ovn => p_block.object_version_number
543          );
544 
545   End deposit_old_block;
546 
547   Procedure deposit_timecard_blocks
548     (p_blocks           in out nocopy hxc_block_table_type,
549      p_attributes       in out nocopy hxc_attribute_table_type,
550      p_timecard_blocks  in          hxc_timecard.block_list,
551      p_day_blocks       in          hxc_timecard.block_list,
552      p_deleted_blocks   in out nocopy hxc_timecard.block_list,
553      p_transaction_info in out nocopy hxc_timecard.transaction_info,
554      p_messages         in out nocopy hxc_message_table_type
555      ) is
556 
557     l_index NUMBER;
558     l_block HXC_BLOCK_TYPE;
559 
560     l_new_bb_id hxc_time_building_blocks.time_building_block_id%type;
561     l_old_bb_id hxc_time_building_blocks.time_building_block_id%type;
562     l_new_ovn   hxc_time_building_blocks.object_version_number%type;
563     l_old_ovn   hxc_time_building_blocks.object_version_number%type;
564 
565   Begin
566 
567     l_index := p_timecard_blocks.first;
568 
569     LOOP
570       EXIT WHEN NOT p_timecard_blocks.exists(l_index);
571 
572       l_block := p_blocks(p_timecard_blocks(l_index));
573       --  if(p_messages.count < 1) then
574       if(hxc_timecard_block_utils.process_block(l_block)) then
575         if(hxc_timecard_block_utils.is_timecard_block(l_block)) then
576 
577           if(hxc_timecard_block_utils.is_new_block(l_block)) then
578             deposit_new_block(l_block,l_old_bb_id,l_new_bb_id,p_transaction_info,p_messages);
579             if(l_new_bb_id is not null) then
580               add_transaction_info(l_new_bb_id,1,null,p_transaction_info,p_messages);
581             end if;
582             p_blocks(p_timecard_blocks(l_index)) := l_block;
583             maintain_dependents
584               (p_blocks
585                ,p_attributes
586                ,p_messages
587                ,p_day_blocks
588                ,l_old_bb_id
589                ,1
590                ,l_new_bb_id
591                ,1
592                ,l_new_bb_id
593                ,1
594                );
595           else
596             deposit_old_block(l_block,l_old_ovn,l_new_ovn,p_deleted_blocks,p_transaction_info,p_messages);
597             add_transaction_info(l_block.time_building_block_id,l_new_ovn,null,p_transaction_info,p_messages);
598             p_blocks(p_timecard_blocks(l_index)) := l_block;
599             maintain_dependents
600               (p_blocks
601                ,p_attributes
602                ,p_messages
603                ,p_day_blocks
604                ,l_block.time_building_block_id
605                ,l_old_ovn
606                ,l_block.time_building_block_id
607                ,l_new_ovn
608                ,l_block.time_building_block_id
609                ,l_new_ovn
610                );
611           end if;
612 
613         end if;
614       end if;
615       --  end if; -- only want to continue processing while there are no errors.
616       l_index := p_timecard_blocks.next(l_index);
617 
618     END LOOP;
619 
620   End deposit_timecard_blocks;
621 
622   Procedure deposit_day_blocks
623     (p_blocks           in out nocopy hxc_block_table_type,
624      p_attributes       in out nocopy hxc_attribute_table_type,
625      p_day_blocks       in          hxc_timecard.block_list,
626      p_detail_blocks    in          hxc_timecard.block_list,
627      p_deleted_blocks   in out nocopy hxc_timecard.block_list,
628      p_transaction_info in out nocopy hxc_timecard.transaction_info,
629      p_messages         in out nocopy hxc_message_table_type,
630      p_timecard_id      in          number,
631      p_timecard_ovn     in          number
632      ) is
633 
634     l_index NUMBER;
635     l_block HXC_BLOCK_TYPE;
636 
637     l_new_bb_id hxc_time_building_blocks.time_building_block_id%type;
638     l_old_bb_id hxc_time_building_blocks.time_building_block_id%type;
639     l_new_ovn   hxc_time_building_blocks.object_version_number%type;
640     l_old_ovn   hxc_time_building_blocks.object_version_number%type;
641 
642   Begin
643 
644     l_index := p_day_blocks.first;
645 
646     LOOP
647       EXIT WHEN NOT p_day_blocks.exists(l_index);
648 
649       l_block := p_blocks(p_day_blocks(l_index));
650 
651       if(hxc_timecard_block_utils.process_block(l_block)) then
652         if(hxc_timecard_block_utils.is_day_block(l_block)) then
653 
654           if(hxc_timecard_block_utils.is_new_block(l_block)) then
655             deposit_new_block(l_block,l_old_bb_id,l_new_bb_id,p_transaction_info,p_messages);
656             add_transaction_info(l_new_bb_id,1,null,p_transaction_info,p_messages);
657             p_blocks(p_day_blocks(l_index)) := l_block;
658             maintain_dependents
659               (p_blocks
660                ,p_attributes
661                ,p_messages
662                ,p_detail_blocks
663                ,l_old_bb_id
664                ,1
665                ,l_new_bb_id
666                ,1
667                ,p_timecard_id
668                ,p_timecard_ovn
669                );
670           else
671             deposit_old_block(l_block,l_old_ovn,l_new_ovn,p_deleted_blocks,p_transaction_info,p_messages);
672             add_transaction_info(l_block.time_building_block_id,l_new_ovn,null,p_transaction_info,p_messages);
673             p_blocks(p_day_blocks(l_index)) := l_block;
674             maintain_dependents
675               (p_blocks
676                ,p_attributes
677                ,p_messages
678                ,p_detail_blocks
679                ,l_block.time_building_block_id
680                ,l_old_ovn
681                ,l_block.time_building_block_id
682                ,l_new_ovn
683                ,p_timecard_id
684                ,p_timecard_ovn
685                );
686           end if;
687 
688         end if;
689       end if;
690       l_index := p_day_blocks.next(l_index);
691 
692     END LOOP;
693 
694   End deposit_day_blocks;
695 
696 	Function is_duplicate_block(p_blocks in HXC_BLOCK_TABLE_TYPE,
697 				p_block_new in HXC_BLOCK_TYPE)
698 	return boolean
699 	IS
700 
701 	l_index number;
702 	isDuplicate boolean := false;
703 
704 	Begin
705 
706 	hr_utility.trace(' Entering is_duplicate_block .. ');
707 	hr_utility.trace(' p_block_new.time_building_block_id is : ' || p_block_new.time_building_block_id);
708 	hr_utility.trace(' In is_duplicate_block p_block_new.translation_display_key is : ' || p_block_new.translation_display_key);
709 
710 	l_index := p_blocks.first;
711 
712 	LOOP
713 		EXIT WHEN not p_blocks.exists(l_index) or isDuplicate;
714 
715 		hr_utility.trace(' l_index is : ' || l_index);
716 
717 		hr_utility.trace(' time_building_block_id is : ' || p_blocks(l_index).time_building_block_id);
718 		hr_utility.trace(' scope is : ' || p_blocks(l_index).scope);
719 		hr_utility.trace(' translation_display_key is : ' || p_blocks(l_index).translation_display_key);
720 		hr_utility.trace(' parent_building_block_id is : ' || p_blocks(l_index).parent_building_block_id);
721 		hr_utility.trace(' parent_building_block_ovn is : ' || p_blocks(l_index).parent_building_block_ovn);
722 		hr_utility.trace(' date_to is : ' || p_blocks(l_index).date_to);
723 
724 		if(p_blocks(l_index).scope = 'DETAIL'
725 			AND p_blocks(l_index).time_building_block_id <> p_block_new.time_building_block_id
726 			AND p_blocks(l_index).date_to = fnd_date.date_to_canonical(hr_general.end_of_time)
727 			AND p_blocks(l_index).parent_building_block_id = p_block_new.parent_building_block_id
728 			AND p_blocks(l_index).parent_building_block_ovn = p_block_new.parent_building_block_ovn
729 			AND p_blocks(l_index).translation_display_key is NOT NULL
730 			AND p_block_new.translation_display_key is NOT NULL
731 			AND p_blocks(l_index).translation_display_key = p_block_new.translation_display_key
732 			)
733 		then
734 			hr_utility.trace(' DUPLICATE is TRUE ');
735 			isDuplicate := true;
736 		end if;
737 
738 		l_index := p_blocks.next(l_index);
739 	END LOOP;
740 
741 	if(NOT isDuplicate) then
742 		hr_utility.trace(' DUPLICATE is FALSE ');
743 	end if;
744 
745 	return isDuplicate;
746 
747 	End is_duplicate_block;
748 
749   Procedure deposit_detail_blocks
750     (p_blocks           in out nocopy hxc_block_table_type,
751      p_attributes       in out nocopy hxc_attribute_table_type,
752      p_detail_blocks    in          hxc_timecard.block_list,
753      p_deleted_blocks   in out nocopy hxc_timecard.block_list,
754      p_transaction_info in out nocopy hxc_timecard.transaction_info,
755      p_messages         in out nocopy hxc_message_table_type,
756      p_timecard_id      in          number,
757      p_timecard_ovn     in          number
758      ) is
759 
760     l_index NUMBER;
761     l_block HXC_BLOCK_TYPE;
762     l_list  hxc_timecard.block_list;
763 
764     l_new_bb_id hxc_time_building_blocks.time_building_block_id%type;
765     l_old_bb_id hxc_time_building_blocks.time_building_block_id%type;
766     l_new_ovn   hxc_time_building_blocks.object_version_number%type;
767     l_old_ovn   hxc_time_building_blocks.object_version_number%type;
768 
769     l_duplicate_block BOOLEAN := false;
770 
771   Begin
772 
773    -- Checking for duplicate records for detail blocks
774    l_index := p_detail_blocks.first;
775 
776     LOOP
777       EXIT WHEN NOT p_detail_blocks.exists(l_index) OR l_duplicate_block;
778 
779       l_block := p_blocks(p_detail_blocks(l_index));
780 
781       if(hxc_timecard_block_utils.is_active_block(l_block) AND is_duplicate_block(p_blocks, l_block)) then
782 	hr_utility.trace(' DUPLICATE BLOCK is TRUE ');
783 	l_duplicate_block := true;
784       end if;
785 
786       l_index := p_detail_blocks.next(l_index);
787 
788     END LOOP;
789 
790     IF(l_duplicate_block) THEN
791 
792 	hr_utility.trace(' Adding error to table for block : ' || l_block.time_building_block_id);
793 	hxc_timecard_message_helper.addErrorToCollection
794 	(p_messages
795 	,'HXC_DUP_TIME_BUILDING_BLOCKS'
796 	,hxc_timecard.c_error
797 	,null
798 	,null
799 	,'HXC'
800 	,null
801 	,null
802 	,l_block.time_building_block_id
803 	,l_block.object_version_number
804 	,null);
805 
806     ELSE
807 
808    -- Depositing detail blocks
809 
810     l_index := p_detail_blocks.first;
811 
812     LOOP
813       EXIT WHEN NOT p_detail_blocks.exists(l_index);
814 
815       l_block := p_blocks(p_detail_blocks(l_index));
816 
817       if(hxc_timecard_block_utils.process_block(l_block)) then
818         if(hxc_timecard_block_utils.is_detail_block(l_block)) then
819 
820           if(hxc_timecard_block_utils.is_new_block(l_block)) then
821             if(hxc_timecard_block_utils.is_active_block(l_block)) then
822               deposit_new_block(l_block,l_old_bb_id,l_new_bb_id,p_transaction_info,p_messages);
823               add_transaction_info(l_new_bb_id,1,null,p_transaction_info,p_messages);
824               p_blocks(p_detail_blocks(l_index)) := l_block;
825               maintain_dependents
826                 (p_blocks
827                  ,p_attributes
828                  ,p_messages
829                  ,l_list
830                  ,l_old_bb_id
831                  ,1
832                  ,l_new_bb_id
833                  ,1
834                  ,p_timecard_id
835                  ,p_timecard_ovn
836                  );
837             end if;
838           else
839             deposit_old_block(l_block,l_old_ovn,l_new_ovn,p_deleted_blocks,p_transaction_info,p_messages);
840             add_transaction_info(l_block.time_building_block_id,l_new_ovn,null,p_transaction_info,p_messages);
841             p_blocks(p_detail_blocks(l_index)) := l_block;
842             maintain_dependents
843               (p_blocks
844                ,p_attributes
845                ,p_messages
846                ,l_list
847                ,l_block.time_building_block_id
848                ,l_old_ovn
849                ,l_block.time_building_block_id
850                ,l_new_ovn
851                ,p_timecard_id
852                ,p_timecard_ovn
853                );
854           end if;
855 
856         end if;
857       end if;
858       l_index := p_detail_blocks.next(l_index);
859 
860     END LOOP;
861 
862     END IF;
863 
864   End deposit_detail_blocks;
865 
866 
867 
868     FUNCTION get_days_to_hours_factor(p_resource_id IN number,
869     				    p_evaluation_date IN date,
870     				    p_dividing_factor in varchar2)
871     RETURN NUMBER
872     is
873 
874     l_hours NUMBER;
875     l_day_hours NUMBER;
876     l_dividing_factor number;
877     l_pref_frequency varchar2(10);
878     l_asg_frequency varchar2(10);
879 
880     CURSOR get_hours(p_reource_id IN number,
881     		p_evaluation_date IN date,
882     		p_dividing_factor IN number)
883     IS
884     SELECT normal_hours/p_dividing_factor
885     FROM per_all_assignments_f
886     WHERE person_id =p_reource_id
887     AND assignment_type in ('E','C')
888     AND primary_flag = 'Y'
889     AND p_evaluation_date BETWEEN effective_start_date AND effective_end_Date;
890 
891     BEGIN
892 
893     OPEN get_hours(p_resource_id, p_evaluation_date, p_dividing_factor);
894     FETCH get_hours INTO l_hours;
895     CLOSE get_hours;
896 
897     	return nvl(round(l_hours,2),1);
898 
899     END get_days_to_hours_factor;
900 
901 
902   FUNCTION get_block_index(p_blocks in  hxc_block_table_type, p_tbb_id in number)
903   return number
904   IS
905 
906   l_index number;
907   l_found boolean;
908   l_block number;
909   BEGIN
910 
911   l_index := p_blocks.first;
912 
913      Loop
914        Exit when ((not p_blocks.exists(l_index)) or (l_found));
915 
916            if(p_tbb_id = p_blocks(l_index).time_building_block_id) then
917            	l_found := true;
918            	l_block := l_index;
919            end if;
920 
921 
922        l_index := p_blocks.next(l_index);
923      End Loop;
924 
925      return l_block;
926 
927   END    get_block_index;
928 
929     Procedure deposit_attributes
930       (p_attributes     in out nocopy hxc_attribute_table_type,
931        p_messages       in out nocopy hxc_message_table_type,
932        p_timecard_id    in            hxc_time_building_blocks.time_building_block_id%type,
933        p_timecard_ovn   in            hxc_time_building_blocks.object_version_number%type,
934        p_deleted_blocks in   out nocopy         hxc_timecard.block_list,
935        p_blocks         in   out nocopy         hxc_block_table_type,
936        p_transaction_info in out nocopy hxc_timecard.transaction_info
937        ) is
938 
939       l_index     number;
940       l_attribute hxc_attribute_type;
941 
942       l_time_attribute_id     hxc_time_attributes.time_attribute_id%type;
943       l_object_version_number hxc_time_attributes.object_version_number%type;
944 
945       l_conversion_factor number;
946       p_tco_att           hxc_self_service_time_deposit.building_block_attribute_info;
947       l_tc_id             number;
948       l_pref_table  hxc_preference_evaluation.t_pref_table;
949       l_start_date date;
950       l_stop_date date;
951       l_resource_id number;
952       l_dividing_factor number;
953       l_active_index number;
954       p_master_pref_table hxc_preference_evaluation.t_pref_table;
955       l_update boolean := false;
956       l_count number;
957       l_block_index number;
958       l_old_ovn number;
959       l_new_ovn number;
960       l_block HXC_BLOCK_TYPE;
961       l_list  hxc_timecard.block_list;
962       l_timecard_id number;
963       l_timecard_ovn number;
964       l_block_updated number := -999;
965 
966       l_new_bb_id hxc_time_building_blocks.time_building_block_id%type;
967       l_old_bb_id hxc_time_building_blocks.time_building_block_id%type;
968       l_updated_blocks hxc_timecard.block_list;
969       l_local_index number;
970 
971     Begin
972 
973          --***********DAYS Vs HOURS - Start ************
974          l_active_index := hxc_timecard_block_utils.find_active_timecard_index(p_blocks);
975          l_timecard_id := p_blocks(l_active_index).time_building_block_id;
976          l_timecard_ovn := p_blocks(l_active_index).object_version_number;
977          l_start_date := hxc_timecard_block_utils.date_value(p_blocks(l_active_index).start_time);
978          l_stop_date := hxc_timecard_block_utils.date_value(p_blocks(l_active_index).stop_time);
979          l_resource_id := p_blocks(l_active_index).resource_id;
980 
981        --Get the Preference value - Time Store Days to Hour Conversion
982        hxc_preference_evaluation.resource_preferences(p_resource_id  => l_resource_id,
983         			 p_preference_code => 'TS_PER_DAYS_TO_HOURS',
984                                  p_start_evaluation_date => l_start_date,
985                                  p_end_evaluation_date => l_stop_date,
986                                  p_sorted_pref_table => l_pref_table,
987                                  p_master_pref_table => p_master_pref_table );
988 
989          IF l_pref_table.count > 0 THEN
990          	l_tc_id:=l_pref_table(1).attribute1;   --Time Category Identifying Day Elements
991                 l_dividing_factor := l_pref_table(1).attribute2;   --Number of Days in Assignment Frequency
992          END IF;
993 
994        IF l_tc_id IS NOT NULL THEN
995 
996         	 hxc_time_category_utils_pkg.initialise_time_category (
997                 	                         p_time_category_id => l_tc_id
998                            		        ,p_tco_att          => p_tco_att );
999 
1000       	 l_conversion_factor:= get_days_to_hours_factor(l_resource_id,l_stop_date,l_dividing_factor );
1001 
1002       END IF;
1003 
1004        --***********DAYS Vs HOURS - End ************
1005 
1006       -- Loop over all attributes, and deposit the ones
1007       -- that need it.
1008       --
1009 
1010         l_index := p_attributes.first;
1011 
1012       LOOP
1013         EXIT WHEN NOT p_attributes.exists(l_index);
1014 
1015 
1016         --
1017         -- If the attribute should be processed - deposit
1018         -- it.
1019         --
1020 
1021          l_attribute := p_attributes(l_index);
1022 
1023           --***********DAYS Vs HOURS - Start ************
1024 
1025          IF l_tc_id IS NOT NULL THEN
1026 
1027            IF (l_attribute.ATTRIBUTE_CATEGORY LIKE 'ELEMENT%' OR
1028              l_attribute.ATTRIBUTE_CATEGORY = 'PROJECTS')THEN -- Process only Payroll and Projects attributes
1029 
1030                  if l_attribute.process <> hxc_timecard.c_process
1031   	          and not l_updated_blocks.exists(l_attribute.BUILDING_BLOCK_ID) then
1032 
1033 		--When the block/atribute not touched, but the value of the Preference changed like
1034 		--Time Category chnaged from NULL => TC1 or TC1=> NULL or TC1=>TC2, so in this case
1035 		--we need to process the block/attribute to take the new value of preference.
1036 
1037   	            IF hxc_time_category_utils_pkg.chk_tc_bb_ok ( l_attribute.BUILDING_BLOCK_ID )
1038   	            	AND nvl(l_attribute.ATTRIBUTE26,1) <> l_conversion_factor then
1039   	            	l_update := true;
1040   	            	l_attribute.ATTRIBUTE26 :=l_conversion_factor;
1041   	            elsif  NOT hxc_time_category_utils_pkg.chk_tc_bb_ok ( l_attribute.BUILDING_BLOCK_ID )
1042   	            and nvl(l_attribute.ATTRIBUTE26,1) <> 1  THEN
1043  			l_update := true;
1044   	            	l_attribute.ATTRIBUTE26 :=null;
1045 
1046   	            END IF;
1047 
1048          	 end if;
1049 
1050   	       if ( hxc_time_category_utils_pkg.chk_tc_bb_ok ( l_attribute.BUILDING_BLOCK_ID ) )  then
1051   		       l_attribute.ATTRIBUTE26 :=l_conversion_factor;
1052   	       else
1053   		       l_attribute.ATTRIBUTE26:=1;
1054   	       end if;
1055   	  END IF;
1056 
1057          ELSE
1058 	     IF (l_attribute.ATTRIBUTE_CATEGORY = 'PROJECTS')THEN
1059 	     		--l_attribute.ATTRIBUTE_CATEGORY LIKE 'ELEMENT%' OR
1060 
1061 		if l_attribute.process <> hxc_timecard.c_process
1062 		 and nvl(l_attribute.ATTRIBUTE26,1) <> 1
1063 		 and not l_updated_blocks.exists(l_attribute.BUILDING_BLOCK_ID)
1064 		then
1065 			--When the Time category is changed from TC1 => NULL, although the block is not touched
1066 			--we must resubmit the block.
1067 			l_update := true;
1068 
1069 		end if;
1070 
1071 		l_attribute.ATTRIBUTE26 :=null;
1072 
1073 	      END IF;
1074          END IF;
1075 
1076          IF l_update THEN
1077 
1078              l_update:= false;
1079 
1080              l_updated_blocks(l_attribute.BUILDING_BLOCK_ID) := 1;
1081 
1082              l_block_index:= get_block_index(p_blocks, l_attribute.BUILDING_BLOCK_ID);
1083              l_block := p_blocks(l_block_index);
1084 
1085              deposit_old_block(l_block,l_old_ovn,l_new_ovn,p_deleted_blocks,p_transaction_info,p_messages);
1086 
1087              add_transaction_info(l_block.time_building_block_id
1088           	,l_new_ovn,null,p_transaction_info,p_messages);
1089 
1090   	   p_blocks(l_block_index) := l_block;
1091    	   p_blocks(l_block_index).process := 'Y';
1092 
1093   	   l_local_index := p_attributes.first;
1094 
1095   	    LOOP
1096   	      EXIT WHEN NOT p_attributes.exists(l_local_index);
1097 
1098             	if(hxc_timecard_attribute_utils.is_corresponding_block
1099   		  (p_attribute => p_attributes(l_local_index)
1100   		   ,p_block_id  => l_block.time_building_block_id
1101   		   )
1102   	         ) then
1103 
1104   			p_attributes(l_local_index).building_block_id := l_block.time_building_block_id;
1105   			p_attributes(l_local_index).building_block_ovn := l_new_ovn;
1106    			p_attributes(l_local_index).process := hxc_timecard.c_process;
1107     	        end if;
1108 
1109   	      l_local_index := p_attributes.next(l_local_index);
1110 
1111              END LOOP;
1112 
1113              l_attribute.building_block_id := p_attributes(l_index).building_block_id;
1114              l_attribute.building_block_ovn := p_attributes(l_index).building_block_ovn;
1115              l_attribute.process := p_attributes(l_index).process;
1116 
1117          END IF;
1118 
1119 	 --***********DAYS Vs HOURS - End ************
1120 
1121         if((hxc_timecard_attribute_utils.process_attribute(p_attribute => l_attribute))
1122            AND
1123              (not p_deleted_blocks.exists(l_attribute.building_block_id))
1124            ) then
1125 
1126           hxc_time_attributes_api.create_attribute
1127             (P_ATTRIBUTE_CATEGORY         => l_attribute.ATTRIBUTE_CATEGORY,
1128              P_ATTRIBUTE1               => l_attribute.ATTRIBUTE1,
1129              P_ATTRIBUTE2               => l_attribute.ATTRIBUTE2,
1130              P_ATTRIBUTE3               => l_attribute.ATTRIBUTE3,
1131              P_ATTRIBUTE4               => l_attribute.ATTRIBUTE4,
1132              P_ATTRIBUTE5               => l_attribute.ATTRIBUTE5,
1133              P_ATTRIBUTE6               => l_attribute.ATTRIBUTE6,
1134              P_ATTRIBUTE7               => l_attribute.ATTRIBUTE7,
1135              P_ATTRIBUTE8               => l_attribute.ATTRIBUTE8,
1136              P_ATTRIBUTE9               => l_attribute.ATTRIBUTE9,
1137              P_ATTRIBUTE10              => l_attribute.ATTRIBUTE10,
1138              P_ATTRIBUTE11              => l_attribute.ATTRIBUTE11,
1139              P_ATTRIBUTE12              => l_attribute.ATTRIBUTE12,
1140              P_ATTRIBUTE13              => l_attribute.ATTRIBUTE13,
1141              P_ATTRIBUTE14              => l_attribute.ATTRIBUTE14,
1142              P_ATTRIBUTE15              => l_attribute.ATTRIBUTE15,
1143              P_ATTRIBUTE16              => l_attribute.ATTRIBUTE16,
1144              P_ATTRIBUTE17              => l_attribute.ATTRIBUTE17,
1145              P_ATTRIBUTE18              => l_attribute.ATTRIBUTE18,
1146              P_ATTRIBUTE19              => l_attribute.ATTRIBUTE19,
1147              P_ATTRIBUTE20              => l_attribute.ATTRIBUTE20,
1148              P_ATTRIBUTE21              => l_attribute.ATTRIBUTE21,
1149              P_ATTRIBUTE22              => l_attribute.ATTRIBUTE22,
1150              P_ATTRIBUTE23              => l_attribute.ATTRIBUTE23,
1151              P_ATTRIBUTE24              => l_attribute.ATTRIBUTE24,
1152              P_ATTRIBUTE25              => l_attribute.ATTRIBUTE25,
1153              P_ATTRIBUTE26              => l_attribute.ATTRIBUTE26,
1154              P_ATTRIBUTE27              => l_attribute.ATTRIBUTE27,
1155              P_ATTRIBUTE28              => l_attribute.ATTRIBUTE28,
1156              P_ATTRIBUTE29              => l_attribute.ATTRIBUTE29,
1157              P_ATTRIBUTE30              => l_attribute.ATTRIBUTE30,
1158              P_TIME_BUILDING_BLOCK_ID   => l_attribute.BUILDING_BLOCK_ID,
1159              P_TBB_OVN                  => l_attribute.BUILDING_BLOCK_OVN,
1160              P_BLD_BLK_INFO_TYPE_ID     => nvl(l_attribute.BLD_BLK_INFO_TYPE_ID,
1161                                                   hxc_timecard_attribute_utils.get_bld_blk_info_type_id(l_attribute.bld_blk_info_type)),
1162              P_TIME_ATTRIBUTE_ID        => l_time_attribute_id,
1163              P_OBJECT_VERSION_NUMBER    => l_object_version_number
1164              );
1165           --
1166           -- Maintain the errors structure
1167           --
1168           maintain_error_table
1169             (p_messages     => p_messages,
1170              p_old_ta_id    => p_attributes(l_index).time_attribute_id,
1171              p_old_ta_ovn   => p_attributes(l_index).object_version_number,
1172              p_new_ta_id    => l_time_attribute_id,
1173              p_new_ta_ovn   => l_object_version_number,
1174              p_timecard_id  => p_timecard_id,
1175              p_timecard_ovn => p_timecard_ovn
1176              );
1177 
1178           --
1179           -- Maintain the structure
1180           --
1181           p_attributes(l_index).time_attribute_id := l_time_attribute_id;
1182           p_attributes(l_index).object_version_number := l_object_version_number;
1183 
1184         end if;
1185 
1186         l_index := p_attributes.next(l_index);
1187       END LOOP;
1188 
1189   End deposit_attributes;
1190 
1191 
1192   procedure populate_transaction_data_set(p_transaction_info in out nocopy hxc_timecard.transaction_info)
1193   is
1194 
1195     cursor c_get_data_set_id(p_tbb_id number,p_tbb_ovn number) is
1196       select data_set_id
1197         from hxc_time_building_blocks
1198        where time_building_block_id = p_tbb_id
1199          and object_version_number = p_tbb_ovn;
1200 
1201     l_data_set_id hxc_transaction_details.data_set_id%TYPE;
1202     l_index BINARY_INTEGER;
1203   begin
1204 
1205 
1206 
1207     l_index := p_transaction_info.first;
1208     if l_index is not null then
1209       open c_get_data_set_id(p_transaction_info(l_index).time_building_block_id,
1210                              p_transaction_info(l_index).object_version_number);
1211       fetch c_get_data_set_id into l_data_set_id;
1212       close c_get_data_set_id;
1213     end if;
1214 
1215     While l_index is not null loop
1216       p_transaction_info(l_index).data_set_id := l_data_set_id;
1217       if g_debug then
1218         hr_utility.trace(p_transaction_info(l_index).time_building_block_id||'-'||p_transaction_info(l_index).data_set_id);
1219       end if;
1220       l_index := p_transaction_info.next(l_index);
1221     End loop;
1222 
1223   end populate_transaction_data_set;
1224 
1225 
1226   Procedure execute
1227       (p_blocks         in out nocopy hxc_block_table_type,
1228        p_attributes       in out nocopy hxc_attribute_table_type,
1229        p_timecard_blocks  in          hxc_timecard.block_list,
1230        p_day_blocks       in          hxc_timecard.block_list,
1231        p_detail_blocks    in          hxc_timecard.block_list,
1232        p_messages       in out nocopy hxc_message_table_type,
1233        p_transaction_info in out nocopy hxc_timecard.transaction_info
1234        ) is
1235 
1236       l_timecard_id  hxc_time_building_blocks.time_building_block_id%type;
1237       l_timecard_ovn hxc_time_building_blocks.object_version_number%type;
1238 
1239       l_deleted_blocks hxc_timecard.block_list;
1240       l_dummy boolean;
1241 
1242        cursor c_check_bussiness_group_id(p_person_id number, p_timecard_start_date date) is
1243             	SELECT business_group_id,
1244             	  organization_id
1245             	FROM per_all_assignments_f
1246             	WHERE person_id = p_person_id
1247             	 AND assignment_type IN('E',   'C')
1248             	 AND primary_flag = 'Y'
1249             	 AND p_timecard_start_date BETWEEN effective_start_date AND effective_end_date;
1250 
1251      l_business_group_id per_all_assignments_f.business_group_id%type;
1252      l_organization_id   per_all_assignments_f.organization_id%type;
1253 
1254 
1255     Begin
1256 
1257       g_debug := hr_utility.debug_enabled;
1258 
1259       -- A new Savepoint has been introduced to makesure we rollback the
1260       -- block transaction incase of any exception being thrown.
1261       savepoint deposit_timecard;
1262 
1263 
1264                     hr_utility.trace('*********************InvalidSecurityContext Trace Start**********************************');
1265                     hr_utility.trace('InvalidSecurityContext > PER_BUSINESS_GROUP_ID from fnd profile : '||fnd_profile.value('PER_BUSINESS_GROUP_ID'));
1266                     hr_utility.trace('InvalidSecurityContext > ORG_ID from fnd profile : '||fnd_profile.value('ORG_ID'));
1267                     hr_utility.trace('InvalidSecurityContext > Resource_id : '||  p_blocks(hxc_timecard_block_utils.find_active_timecard_index(p_blocks)).resource_id);
1268                     hr_utility.trace('InvalidSecurityContext > Timecard Start Time :'||  p_blocks(hxc_timecard_block_utils.find_active_timecard_index(p_blocks)).start_time);
1269 
1270     open c_check_bussiness_group_id(p_blocks(hxc_timecard_block_utils.find_active_timecard_index(p_blocks)).resource_id,
1271 				 hxc_timecard_block_utils.date_value(p_blocks(hxc_timecard_block_utils.find_active_timecard_index(p_blocks)).start_time));
1272 	  fetch c_check_bussiness_group_id into l_business_group_id,l_organization_id;
1273     close c_check_bussiness_group_id;
1274 
1275     hr_utility.trace('InvalidSecurityContext > BUSINESS_GROUP_ID of the person : '||l_business_group_id);
1276     hr_utility.trace('InvalidSecurityContext > ORG_ID of the person : '||l_organization_id);
1277 
1278     IF l_business_group_id <> fnd_profile.value('PER_BUSINESS_GROUP_ID') THEN
1279 
1280 	     hxc_timecard_message_helper.addErrorToCollection
1281 		      (p_messages
1282 		       ,'HXC_366551_INVALID_SEC_CONTEXT' -- You cannot submit this timecard because of invalid security context. Please logout and try again or contact your system administrator.
1283 		       ,hxc_timecard.c_error
1284 		       ,null
1285 		       ,null
1286 		       ,'HXC'
1287 		       ,null
1288 		       ,null
1289 		       ,null
1290 		       ,null
1291 	   );
1292 	    hr_utility.trace('InvalidSecurityContext >l_business_group_id <> fnd_profile.value(PER_BUSINESS_GROUP_ID) : True');
1293 
1294     ELSE
1295       	    hr_utility.trace('InvalidSecurityContext >l_business_group_id <> fnd_profile.value(PER_BUSINESS_GROUP_ID) : False');
1296       l_deleted_blocks.delete;
1297       -- Blocks have to be in order, to ensure
1298       -- self referential integrity
1299 
1300       deposit_timecard_blocks(p_blocks,p_attributes,p_timecard_blocks,p_day_blocks,l_deleted_blocks,p_transaction_info,p_messages);
1301       l_timecard_id := p_blocks(hxc_timecard_block_utils.find_active_timecard_index(p_blocks)).time_building_block_id;
1302       l_timecard_ovn := p_blocks(hxc_timecard_block_utils.find_active_timecard_index(p_blocks)).object_version_number;
1303       deposit_day_blocks(p_blocks,p_attributes,p_day_blocks,p_detail_blocks,l_deleted_blocks,p_transaction_info,p_messages,l_timecard_id,l_timecard_ovn);
1304       deposit_detail_blocks(p_blocks,p_attributes,p_detail_blocks,l_deleted_blocks,p_transaction_info,p_messages,l_timecard_id,l_timecard_ovn);
1305       --
1306       -- And now corresponding attributes
1307       --
1308       hxc_time_category_utils_pkg.push_timecard(p_blocks, p_attributes);
1309 
1310       deposit_attributes(p_attributes,p_messages,l_timecard_id,l_timecard_ovn,l_deleted_blocks,
1311       			p_blocks, p_transaction_info);
1312       --
1313       -- Maintain the timecard summary structures
1314       populate_transaction_data_set(p_transaction_info);
1315 
1316   END IF;
1317         hr_utility.trace('*********************InvalidSecurityContext Trace End*************************************');
1318 
1319 
1320     Exception
1321       When Others then
1322         rollback to deposit_timecard;
1323 
1324         --Pickup the last message(HXC_USAGE_DATA_MISSING) that has been set.
1325         hr_message.provide_error;
1326         if (hr_message.last_message_name is not null) then
1327   	hxc_timecard_message_helper.addErrorToCollection
1328             (p_messages,
1329              hr_message.last_message_name,
1330              hxc_timecard.c_error,
1331              null,
1332              null,
1333              'HXC',
1334              null,
1335              null,
1336              null,
1337              null
1338              );
1339         else
1340           raise; --If any other exception occurs without errormsg being set.
1341         end if;
1342 
1343     End execute;
1344 
1345 End hxc_timecard_deposit;