[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;