1 package body pay_asg_process_grp_pkg as
2 /* $Header: pycorapg.pkb 120.11.12020000.3 2012/10/05 15:44:44 jkvallab ship $ */
3 /* Name
4 is_pog_enable
5 Description
6
7 This function is used to indicate whether the POG functionality
8 is enabled for a localisation.
9 */
10 g_debug boolean := hr_utility.debug_enabled;
11 function is_pog_enable(p_bgp_id in number)
12 return boolean
13 is
14 --
15 l_leg_code per_business_groups.legislation_code%type;
16 l_value pay_legislation_rules.rule_mode%type;
17 l_found boolean;
18 --
19 begin
20 --
21 if g_debug then
22 hr_utility.trace('In is_pog_enable()');
23 end if;
24 select pbg.legislation_code
25 into l_leg_code
26 from per_business_groups_perf pbg
27 where pbg.business_group_id = p_bgp_id;
28 --
29 pay_core_utils.get_legislation_rule
30 (p_legrul_name => 'I',
31 p_legislation => l_leg_code,
32 p_legrul_value => l_value,
33 p_found => l_found);
34 --
35 if (l_found = FALSE) then
36 l_value := 'N';
37 end if;
38 --
39 if (l_value <> 'G') then
40 return FALSE;
41 else
42 return TRUE;
43 end if;
44 --
45 if g_debug then
46 hr_utility.trace('Out is_pog_enable()');
47 end if;
48 end is_pog_enable;
49 --
50 /*
51 Name
52 get_group_definition
53 Description
54
55 This function is used to retrieve/Create a group definition.
56 */
57 function get_group_definition(p_definition_name in varchar2)
58 return number
59 is
60 l_definition_id number;
61 begin
62 --
63 if g_debug then
64 hr_utility.trace('In get_group_definition()');
65 end if;
66 select group_definition_id
67 into l_definition_id
68 from pay_group_definitions
69 where name = p_definition_name;
70 --
71 return l_definition_id;
72 --
73 exception
74 when no_data_found then
75 begin
76 --
77 -- Need to lock the table to esnure only
78 -- one thread creates the group row.
79 --
80 lock table pay_group_definitions in share mode;
81 --
82 -- Ensure that nothing has created
83 -- the row in the meantime
84 select group_definition_id
85 into l_definition_id
86 from pay_group_definitions
87 where name = p_definition_name;
88 --
89 return l_definition_id;
90 --
91 exception
92 when no_data_found then
93 --
94 select pay_group_definitions_s.nextval
95 into l_definition_id
96 from dual;
97 --
98 insert into pay_group_definitions
99 (group_definition_id,
100 name)
101 values
102 (l_definition_id,
103 p_definition_name);
104 --
105 return l_definition_id;
106 end;
107 --
108 if g_debug then
109 hr_utility.trace('Out get_group_definition()');
110 end if;
111 end get_group_definition;
112 --
113 /*
114 Name
115 get_assignment_group
116 Description
117
118 This function is used to retrieve/Create an assignment group
119 */
120 function get_assignment_group(p_person_group_id in number,
121 p_assignment_id in number,
122 p_effective_start_date in date,
123 p_effective_end_date in date,
124 p_payroll_id in number,
125 p_update_row in varchar2 default 'Y'
126 )
127 return number
128 is
129 l_object_group_id pay_object_groups.object_group_id%type;
130 l_start_date pay_object_groups.start_date%type;
131 l_end_date pay_object_groups.end_date%type;
132 l_cnt number;
133 begin
134 --
135 if g_debug then
136 hr_utility.trace('In get_assignment_group()');
137 hr_utility.trace('p_person_group_id ' || p_person_group_id );
138 hr_utility.trace('p_assignment_id ' || p_assignment_id );
139 hr_utility.trace('p_effective_start_date ' || p_effective_start_date );
140 hr_utility.trace('p_effective_end_date ' || p_effective_end_date );
141 hr_utility.trace('p_payroll_id ' || p_payroll_id );
142 hr_utility.trace('p_update_row ' || p_update_row );
143 end if;
144
145 --Bug 14585781 case c
146 --changed the start/end date boundary condition check
147 select object_group_id,
148 start_date,
149 end_date
150 into l_object_group_id,
151 l_start_date,
152 l_end_date
153 from pay_object_groups
154 where source_id = p_assignment_id
155 and source_type = 'PAF'
156 and start_date = p_effective_start_date
157 and end_date = p_effective_end_date
158 and parent_object_group_id = p_person_group_id
159 and payroll_id = p_payroll_id;
160 --
161 -- changed the date joins as this can return more than one rows under certain condition,
162 -- where it shouldn't return those rows
163
164 return l_object_group_id;
165 --
166 exception
167 when no_data_found then
168 --
169 -- An assignment can not switch
170 -- from one processing group to another
171 --
172 select count(*)
173 into l_cnt
174 from pay_object_groups
175 where source_id = p_assignment_id
176 and source_type = 'PAF'
177 and parent_object_group_id <> p_person_group_id;
178 --
179 if (l_cnt <> 0) then
180 pay_core_utils.assert_condition('pay_asg_process_grp_pkg.get_assignment_group:1',
181 1 = 2);
182 end if;
183 --
184 if (p_update_row = 'Y') then
185 --
186 select pay_object_groups_s.nextval
187 into l_object_group_id
188 from dual;
189 --
190 if g_debug then
191 hr_utility.trace('Inserting into POG with ');
192 hr_utility.trace('Object_group_id ' || l_object_group_id );
193 hr_utility.trace('p_effective_start_date ' || p_effective_start_date );
194 hr_utility.trace('p_effective_start_date ' || p_effective_end_date );
195 end if;
196 insert into pay_object_groups
197 (object_group_id,
198 source_id,
199 source_type,
200 start_date,
201 end_date,
202 payroll_id,
203 parent_object_group_id)
204 values
205 (l_object_group_id,
206 p_assignment_id,
207 'PAF',
208 p_effective_start_date,
209 p_effective_end_date, -- Bug 14585781 Case A
210 p_payroll_id,
211 p_person_group_id
212 );
213 --
214 else
215 --
216 l_object_group_id := null;
217 --
218 end if;
219 --
220 return l_object_group_id;
221 --
222
223 --
224 if g_debug then
225 hr_utility.trace('Out get_assignment_group()');
226 end if;
227 end get_assignment_group;
228 --
229 /*
230 Name
231 get_person_group
232 Description
233
234 This function is used to retrieve/Create a person group.
235 */
236
237 function get_person_group(p_person_id in number,
238 p_period_of_service_id in number,
239 p_effective_start_date in date,
240 p_effective_end_date in date,
241 p_definition_name in varchar2,
242 p_update_row in varchar2 default 'Y'
243 )
244 return number
245 is
246 l_definition_id pay_group_definitions.group_definition_id%type;
247 l_object_group_id pay_object_groups.object_group_id%type;
248 l_start_date pay_object_groups.start_date%type;
249 l_end_date pay_object_groups.end_date%type;
250 l_update boolean;
251 l_upd_start_date date;
252 l_upd_end_date date;
253 begin
254 --
255 if g_debug then
256 hr_utility.trace('In get_person_group()');
257 end if;
258 l_definition_id := get_group_definition(p_definition_name);
259 --
260 select object_group_id,
261 start_date,
262 end_date
263 into l_object_group_id,
264 l_start_date,
265 l_end_date
266 from pay_object_groups
267 where source_id = p_person_id
268 and source_type = 'PPF'
269 -- bug 9354495
270 -- and start_date <= p_effective_end_date
271 -- and end_date >= p_effective_start_date
272 and period_of_service_id = p_period_of_service_id
273 and group_definition_id = l_definition_id;
274 --
275 -- Ensure that the object group dates
276 -- are correct
277 --
278 if g_debug then
279 hr_utility.trace('p_update_row = '|| p_update_row);
280 hr_utility.trace('l_start_date = '|| l_start_date);
281 hr_utility.trace('p_effective_start_date = '|| p_effective_start_date);
282 hr_utility.trace('l_end_date = '|| l_end_date);
283 hr_utility.trace(' p_effective_end_date = '|| p_effective_end_date);
284 end if;
285 if (p_update_row = 'Y') then
286 if (l_start_date > p_effective_start_date) then
287 l_update := TRUE;
288 l_upd_start_date := p_effective_start_date;
289 else
290 l_upd_start_date := l_start_date;
291 end if;
292 if (l_end_date < p_effective_end_date) then
293 l_upd_end_date := p_effective_end_date;
294 else
295 l_update := TRUE;
296 l_upd_end_date := l_end_date;
297 end if;
298 if (l_update = TRUE) then
299 if g_debug then
300 hr_utility.trace('object group id = '|| l_object_group_id);
301 hr_utility.trace('start date = '|| l_upd_start_date);
302 hr_utility.trace('end date = '|| l_upd_end_date);
303 end if;
304 update pay_object_groups
305 set start_date = l_upd_start_date,
306 end_date = l_upd_end_date
307 where object_group_id = l_object_group_id;
308 end if;
309 end if;
310 --
311 return l_object_group_id;
312 --
313 exception
314 when no_data_found then
315 --
316 if (p_update_row = 'Y') then
317 --
318 select pay_object_groups_s.nextval
319 into l_object_group_id
320 from dual;
321 --
322 insert into pay_object_groups
323 (object_group_id,
324 source_id,
325 source_type,
326 start_date,
327 end_date,
328 group_definition_id,
329 period_of_service_id)
330 values
331 (l_object_group_id,
332 p_person_id,
333 'PPF',
334 p_effective_start_date,
335 to_date('4712/12/31', 'YYYY/MM/DD'),
336 l_definition_id,
337 p_period_of_service_id
338 );
339 --
340 else
341 --
342 l_object_group_id := null;
343 --
344 end if;
345 --
346 return l_object_group_id;
347 --
348
349 --
350 if g_debug then
351 hr_utility.trace('Out get_person_group()');
352 end if;
353 end get_person_group;
354 --
355 /*
356 Name
357 evaluate_asg_group
358 Description
359
360 This procedure calls the legislative function to retrieve the
361 process group name.
362 */
363
364 procedure evaluate_asg_group(p_assignment_id in number,
365 p_effective_start_date in date,
366 p_effective_end_date in date,
367 p_group_name out nocopy varchar2)
368 is
369 l_leg_code varchar2(30);
370 l_bg_id number;
371 statem varchar2(2000); -- used with dynamic pl/sql
372 sql_cursor integer;
373 l_rows integer;
374 begin
375 --
376 if g_debug then
377 hr_utility.trace('In evaluate_asg_group()');
378 end if;
379 select distinct legislation_code, paf.business_group_id
380 into l_leg_code, l_bg_id
381 from per_business_groups_perf pbg,
382 per_all_assignments_f paf
383 where paf.assignment_id = p_assignment_id
384 and p_effective_start_date between paf.effective_start_date
385 and paf.effective_end_date
386 and paf.business_group_id = pbg.business_group_id;
387 --
388 -- bug 9354495 set business group profile from the assignments bg
389 fnd_profile.put('PER_BUSINESS_GROUP_ID',l_bg_id);
390 --
391 statem :=
392 'begin
393 pay_'||l_leg_code||'_rules.get_asg_process_group(
394 :assignment_id,
395 :effective_start_date,
396 :effective_end_date,
397 :group_name);
398 end;
399 ';
400 --
401 sql_cursor := dbms_sql.open_cursor;
402 --
403 dbms_sql.parse(sql_cursor, statem, dbms_sql.v7);
404 --
405 --
406 dbms_sql.bind_variable(sql_cursor, 'assignment_id', p_assignment_id);
407 --
408 dbms_sql.bind_variable(sql_cursor, 'effective_start_date', p_effective_start_date);
409 --
410 dbms_sql.bind_variable(sql_cursor, 'effective_end_date', p_effective_end_date);
411 --
412 dbms_sql.bind_variable(sql_cursor, 'group_name', p_group_name, 30);
413 --
414 l_rows := dbms_sql.execute (sql_cursor);
415 --
416 if (l_rows = 1) then
417 dbms_sql.variable_value(sql_cursor, 'group_name',
418 p_group_name);
419 dbms_sql.close_cursor(sql_cursor);
420 --
421 else
422 dbms_sql.close_cursor(sql_cursor);
423 pay_core_utils.assert_condition
424 ('pay_asg_process_grp_pkg.evaluate_asg_group:1',
425 1 = 2);
426 end if;
427 --
428 pay_core_utils.assert_condition
429 ('pay_asg_process_grp_pkg.evaluate_asg_group:2',
430 p_group_name is not null);
431 --
432 if g_debug then
433 hr_utility.trace('Out evaluate_asg_group()');
434 end if;
435 end evaluate_asg_group;
436 --
437 /*
438 Name
439 generate_asg_group
440 Description
441
442 This procedure calls all the required procedures to
443 create an assignment group.
444 */
445 procedure generate_asg_group(p_assignment_id in number,
446 p_person_id in number,
447 p_period_of_service_id in number,
448 p_effective_start_date in date,
449 p_effective_end_date in date,
450 p_payroll_id in number
451 )
452 is
453 l_group_name pay_group_definitions.name%type;
454 l_person_group_id pay_object_groups.object_group_id%type;
455 l_asg_group_id pay_object_groups.object_group_id%type;
456 begin
457 --
458 if g_debug then
459 hr_utility.trace('In generate_asg_group()');
460 end if;
461
462 if (p_payroll_id is not null) then
463 --
464 evaluate_asg_group(p_assignment_id,
465 p_effective_start_date,
466 p_effective_end_date,
467 l_group_name
468 );
469 l_person_group_id := get_person_group
470 (p_person_id,
471 p_period_of_service_id,
472 p_effective_start_date,
473 p_effective_end_date,
474 l_group_name
475 );
476 l_asg_group_id := get_assignment_group
477 (p_person_group_id => l_person_group_id,
478 p_assignment_id => p_assignment_id,
479 p_effective_start_date => p_effective_start_date,
480 p_effective_end_date => p_effective_end_date,
481 p_payroll_id => p_payroll_id
482 );
483 --
484 end if;
485 --
486 if g_debug then
487 hr_utility.trace('Out generate_asg_group()');
488 end if;
489 end generate_asg_group;
490 --
491 /*
492 Name
493 asg_datetracked_insert
494 Description
495
496 This is called from the Assignment Dynamic Triggers
497 to maintain the assignment groups
498 */
499
500 procedure asg_datetracked_insert(p_assignment_id in number,
501 p_person_id in number,
502 p_period_of_service_id in number,
503 p_effective_start_date in date,
504 p_effective_end_date in date,
505 p_payroll_id in number
506 )
507 is
508 begin
509 --
510 if g_debug then
511 hr_utility.trace('In asg_datetracked_insert()');
512 end if;
513 generate_asg_group(p_assignment_id,
514 p_person_id,
515 p_period_of_service_id,
516 p_effective_start_date,
517 p_effective_end_date,
518 p_payroll_id
519 );
520 --
521 if g_debug then
522 hr_utility.trace('Out asg_datetracked_insert()');
523 end if;
524 end asg_datetracked_insert;
525 --
526 /*
527 Name
528 zap_object_group
529 Description
530
531 This is purges an assignment processing group from the
532 system, then removes the person object groups if no
533 other assignment processing groups exist for it.
534 */
535
536 procedure zap_object_group(p_object_group_id in number)
537 is
538 l_parent_object_group_id pay_object_groups.parent_object_group_id%type;
539 l_cnt number;
540 begin
541 --
542 if g_debug then
543 hr_utility.trace('In zap_object_group()');
544 end if;
545 select parent_object_group_id
546 into l_parent_object_group_id
547 from pay_object_groups
548 where object_group_id = p_object_group_id;
549 --
550 if (l_parent_object_group_id is not null) then
551 --
552 -- Find out how many object groups are on the
553 -- parent. If its only one then delete it.
554 -- Since its the current object group.
555 --
556 select count(*)
557 into l_cnt
558 from pay_object_groups
559 where parent_object_group_id = l_parent_object_group_id;
560 --
561 if (l_cnt = 1) then
562 delete from pay_object_groups
563 where object_group_id = l_parent_object_group_id;
564 end if;
565 end if;
566 --
567 delete from pay_object_groups
568 where object_group_id = p_object_group_id;
569 --
570 if g_debug then
571 hr_utility.trace('Out zap_object_group()');
572 end if;
573 end zap_object_group;
574 --
575 /*
576 Name
577 end_date_object_group
578 Description
579
580 This is end dates an object group.
581 */
582
583 procedure end_date_object_group(p_object_group_id in number,
584 p_effective_end_date in date)
585 is
586 begin
587 --
588 if g_debug then
589 hr_utility.trace('In end_date_object_group()');
590 hr_utility.trace('Object group id = '|| p_object_group_id);
591 hr_utility.trace('Effective date = '|| p_effective_end_date);
592 end if;
593 update pay_object_groups
594 set end_date = p_effective_end_date
595 where object_group_id = p_object_group_id;
596 --
597 if g_debug then
598 hr_utility.trace('Out end_date_object_group()');
599 end if;
600 end end_date_object_group;
601 --
602 /*
603 Name
604 asg_datetracked_delete_next
605 Description
606
607 This is called from the Assignment Dynamic Triggers
608 to maintain the assignment groups
609 */
610 procedure asg_datetracked_delete_next(p_assignment_id in number,
611 p_effective_end_date in date,
612 p_effective_end_date_o in date,
613 p_val_end_date in date
614 )
615 is
616 cursor get_pogpaf(p_assignment_id number,
617 p_effective_end_date_o date)
618 is
619 select object_group_id,
620 parent_object_group_id,
621 start_date,
622 end_date
623 from pay_object_groups pog_paf
624 where pog_paf.source_id = p_assignment_id
625 and pog_paf.source_type = 'PAF'
626 and pog_paf.end_date = p_effective_end_date_o;
627 --
628 cursor get_pogppf(p_par_object_group_id number,
629 p_effective_end_date_o date)
630 is
631 select object_group_id,
632 start_date,
633 end_date
634 from pay_object_groups pog_paf
635 where object_group_id = p_par_object_group_id
636 and pog_paf.end_date = p_effective_end_date_o;
637 begin
638 --
639 if g_debug then
640 hr_utility.trace('In asg_datetracked_delete_next()');
641 end if;
642 for pogrec in get_pogpaf(p_assignment_id, p_effective_end_date_o) loop
643 --
644 if g_debug then
645 hr_utility.trace('Object group id = '|| pogrec.object_group_id);
646 hr_utility.trace('Effective date = '|| p_effective_end_date);
647 hr_utility.trace('p_effective_end_date_o = ' || p_effective_end_date_o);
648 end if;
649 update pay_object_groups
650 set end_date = p_val_end_date --Bug 14585781 ,Case delete_next/future
651 where object_group_id = pogrec.object_group_id;
652 --
653
654 -- Bug 14585781, perform the delete of the next record
655 delete from pay_object_groups where source_id = p_assignment_id and source_type = 'PAF'
656 and start_date > = p_effective_end_date_o
657 and end_date <= p_val_end_date;
658
659 for ppfrec in get_pogppf(pogrec.parent_object_group_id,
660 p_effective_end_date_o)
661 loop
662 --
663 if g_debug then
664 hr_utility.trace('Object group id = '|| ppfrec.object_group_id);
665 hr_utility.trace('Effective date = '|| p_effective_end_date);
666 end if;
667 update pay_object_groups
668 set end_date = p_effective_end_date
669 where object_group_id = ppfrec.object_group_id;
670 --
671 end loop;
672 --
673 end loop;
674 --
675
676 --
677 if g_debug then
678 hr_utility.trace('In asg_datetracked_delete_next()');
679 end if;
680 end asg_datetracked_delete_next;
681 --
682 /*
683 Name
684 asg_datetracked_end_date
685 Description
686
687 This is called from the Assignment Dynamic Triggers
688 to maintain the assignment groups
689 */
690 procedure asg_datetracked_end_date(p_assignment_id in number,
691 p_effective_end_date in date
692 )
693 is
694 cursor get_pogpaf(p_assignment_id number,
695 p_effective_end_date date)
696 is
697 select object_group_id,
698 start_date,
699 end_date
700 from pay_object_groups pog_paf
701 where pog_paf.source_id = p_assignment_id
702 and pog_paf.source_type = 'PAF'
703 and pog_paf.end_date > p_effective_end_date
704 order by start_date;
705 begin
706 --
707 -- OK the assignment has ended, we need to end all the
708 -- POG PAFs that the assignment has.
709 if g_debug then
710 hr_utility.trace('In asg_datetracked_end_date()');
711 end if;
712 for pafrec in get_pogpaf(p_assignment_id, p_effective_end_date) loop
713 --
714 if g_debug then
715 hr_utility.trace('pafrec.start_date ' || pafrec.start_date);
716 hr_utility.trace('p_effective_end_date ' || p_effective_end_date);
717 end if;
718 if (pafrec.start_date > p_effective_end_date) then
719 zap_object_group(pafrec.object_group_id);
720 else
721 end_date_object_group(pafrec.object_group_id,
722 p_effective_end_date);
723 end if;
724 --
725 end loop;
726 --
727 if g_debug then
728 hr_utility.trace('Out asg_datetracked_end_date()');
729 end if;
730 end asg_datetracked_end_date;
731 --
732 /*
733 Name
734 find_asg_group_definition
735 Description
736
737 This retrieves the group name for an assignment group.
738 */
739 procedure find_asg_group_definition(p_assignment_id in number,
740 p_payroll_id in number,
741 p_effective_date in date,
742 p_definition_name out nocopy varchar2)
743 is
744 begin
745 --
746 if g_debug then
747 hr_utility.trace('In find_asg_group_definition()');
748 end if;
749 select pgd.name
750 into p_definition_name
751 from pay_group_definitions pgd,
752 pay_object_groups pog_ppf,
753 pay_object_groups pog_paf
754 where pog_paf.source_id = p_assignment_id
755 and pog_paf.source_type = 'PAF'
756 and pog_paf.payroll_id = p_payroll_id
757 and p_effective_date between pog_paf.start_date
758 and pog_paf.end_date
759 and pog_paf.parent_object_group_id = pog_ppf.object_group_id
760 and pog_ppf.group_definition_id = pgd.group_definition_id;
761 --
762 if g_debug then
763 hr_utility.trace('Out find_asg_group_definition()');
764 end if;
765 end find_asg_group_definition;
766 --
767 -- start of Bug 14585781
768 /*
769 Name
770 asg_datetracked_correction
771 Description
772
773 This is called from the Assignment Dynamic Triggers
774 to maintain the assignment groups
775 */
776 procedure asg_datetracked_correction(p_assignment_id in number,
777 p_person_id in number,
778 p_period_of_service_id in number,
779 p_old_effective_start_date in date,
780 p_old_effective_end_date in date,
781 p_new_effective_start_date in date,
782 p_new_effective_end_date in date,
783 p_old_payroll_id in number,
784 p_new_payroll_id in number
785 )
786 is
787 l_old_group_name pay_group_definitions.name%type;
788 l_new_group_name pay_group_definitions.name%type;
789 l_object_group_id pay_object_groups.object_group_id%type;
790
791 procedure purge_curr_obj_group is
792 begin
793 select object_group_id into l_object_group_id
794 from pay_object_groups pog_paf
795 where pog_paf.source_id = p_assignment_id
796 and pog_paf.source_type = 'PAF'
797 and pog_paf.payroll_id = p_old_payroll_id
798 and pog_paf.start_date = p_old_effective_start_date
799 and pog_paf.end_date = p_old_effective_end_date;
800
801 --Now Zap the object group since the change is in Correction Mode and there is no further payroll
802 zap_object_group(l_object_group_id);
803 exception
804 when NO_DATA_FOUND then
805 hr_utility.set_message(801, 'HR_6153_ALL_PROCEDURE_FAIL');
806 hr_utility.set_message_token('PROCEDURE',
807 'pay_asg_process_grp_pkg.asg_datetracked_correction');
808 hr_utility.set_message_token('STEP','1');
809 hr_utility.raise_error;
810 end purge_curr_obj_group;
811
812 begin
813 if g_debug then
814 hr_utility.trace('In asg_datetracked_correction()');
815 end if;
816 if ( p_old_payroll_id is null
817 and p_new_payroll_id is null) then
818 --
819 return;
820 --
821 elsif ( p_old_payroll_id is null
822 and p_new_payroll_id is not null) then
823 --
824 generate_asg_group(p_assignment_id,
825 p_person_id,
826 p_period_of_service_id,
827 p_new_effective_start_date,
828 p_new_effective_end_date,
829 p_new_payroll_id
830 );
831 elsif ( p_old_payroll_id is not null
832 and p_new_payroll_id is null) then
833 --
834 purge_curr_obj_group;
835 return;
836 --
837 elsif (p_old_payroll_id = p_new_payroll_id) then
838 --
839 find_asg_group_definition(p_assignment_id => p_assignment_id,
840 p_payroll_id => p_old_payroll_id,
841 p_effective_date => p_old_effective_end_date,
842 p_definition_name => l_old_group_name
843 );
844 --
845 evaluate_asg_group(p_assignment_id,
846 p_new_effective_start_date,
847 p_new_effective_end_date,
848 l_new_group_name
849 );
850 if (l_old_group_name <> l_new_group_name) then
851 generate_asg_group(p_assignment_id,
852 p_person_id,
853 p_period_of_service_id,
854 p_new_effective_start_date,
855 p_new_effective_end_date,
856 p_new_payroll_id
857 );
858 end if;
859 --
860 else
861 --different payrolls, so delete the record for old payroll and generate new record for new payroll
862
863 purge_curr_obj_group;
864 generate_asg_group(p_assignment_id,
865 p_person_id,
866 p_period_of_service_id,
867 p_new_effective_start_date,
868 p_new_effective_end_date,
869 p_new_payroll_id
870 );
871
872 end if;
873 if g_debug then
874 hr_utility.trace('Out asg_datetracked_correction()');
875 end if;
876 end asg_datetracked_correction;
877
878 --End of Bug 14585781
879 /*
880 Name
881 asg_datetracked_update
882 Description
883
884 This is called from the Assignment Dynamic Triggers
885 to maintain the assignment groups
886 */
887
888 procedure asg_datetracked_update(p_assignment_id in number,
889 p_person_id in number,
890 p_period_of_service_id in number,
891 p_old_effective_start_date in date,
892 p_old_effective_end_date in date,
893 p_new_effective_start_date in date,
894 p_new_effective_end_date in date,
895 p_old_payroll_id in number,
896 p_new_payroll_id in number
897 )
898 is
899 l_old_group_name pay_group_definitions.name%type;
900 l_new_group_name pay_group_definitions.name%type;
901 begin
902 --
903 if g_debug then
904 hr_utility.trace('In asg_datetracked_update()');
905 end if;
906 if ( p_old_payroll_id is null
907 and p_new_payroll_id is null) then
908 --
909 return;
910 --
911 elsif ( p_old_payroll_id is null
912 and p_new_payroll_id is not null) then
913 --
914 generate_asg_group(p_assignment_id,
915 p_person_id,
916 p_period_of_service_id,
917 p_new_effective_start_date,
918 p_new_effective_end_date,
919 p_new_payroll_id
920 );
921 elsif ( p_old_payroll_id is not null
922 and p_new_payroll_id is null) then
923 --
924 update pay_object_groups
925 set end_date = p_new_effective_start_date -1
926 where source_id = p_assignment_id
927 and source_type = 'PAF'
928 and payroll_id = p_old_payroll_id
929 and p_old_effective_end_date between start_date and end_date
930 and p_old_effective_start_date <> p_new_effective_start_date;
931
932 return;
933 --
934 elsif (p_old_payroll_id = p_new_payroll_id) then
935 --
936 find_asg_group_definition(p_assignment_id => p_assignment_id,
937 p_payroll_id => p_old_payroll_id,
938 p_effective_date => p_old_effective_end_date,
939 p_definition_name => l_old_group_name
940 );
941 --
942 evaluate_asg_group(p_assignment_id,
943 p_new_effective_start_date,
944 p_new_effective_end_date,
945 l_new_group_name
946 );
947 if g_debug then
948 hr_utility.trace ('location X old group id = '||l_old_group_name||' new gr id = '||l_new_group_name);
949 hr_utility.trace ('p_assignment_id = '||p_assignment_id);
950 hr_utility.trace ('p_person_id = '||p_person_id);
951 hr_utility.trace ('p_period_of_service_id = '||p_period_of_service_id);
952 hr_utility.trace ('p_new_effective_start_date = '||p_new_effective_start_date);
953 hr_utility.trace ('p_new_effective_end_date = '||p_new_effective_end_date);
954 hr_utility.trace ('p_new_payroll_id = '||p_new_payroll_id);
955 end if;
956 if (l_old_group_name <> l_new_group_name) then
957 generate_asg_group(p_assignment_id,
958 p_person_id,
959 p_period_of_service_id,
960 p_new_effective_start_date,
961 p_new_effective_end_date,
962 p_new_payroll_id
963 );
964 end if;
965 --
966 else
967
968 update pay_object_groups
969 set end_date = p_new_effective_start_date -1
970
971 where source_id = p_assignment_id
972 and source_type = 'PAF'
973 and payroll_id = p_old_payroll_id
974 and p_old_effective_end_date between start_date and end_date;
975
976
977
978 generate_asg_group(p_assignment_id,
979 p_person_id,
980 p_period_of_service_id,
981 p_new_effective_start_date,
982 p_new_effective_end_date,
983 p_new_payroll_id
984 );
985
986
987 end if;
988 --
989 if g_debug then
990 hr_utility.trace('Out asg_datetracked_update()');
991 end if;
992 end asg_datetracked_update;
993 --
994 /*
995 Name
996 asg_datetracked_strt_early
997 Description
998 This is called from the Assignment Dynamic Triggers
999 to maintain the assignment groups
1000 */
1001
1002 procedure asg_datetracked_strt_early(p_assignment_id in number,
1003 p_person_id in number,
1004 p_period_of_service_id in number,
1005 p_old_effective_start_date in date,
1006 p_old_effective_end_date in date,
1007 p_new_effective_start_date in date,
1008 p_new_effective_end_date in date,
1009 p_old_payroll_id in number,
1010 p_new_payroll_id in number
1011 )
1012 is
1013 l_period_of_service_id NUMBER;
1014 l_new_effective_start_date DATE;
1015 begin
1016 --
1017 if g_debug then
1018 hr_utility.trace('In asg_datetracked_strt_early()');
1019 hr_utility.trace('Start date = '|| p_new_effective_start_date);
1020 hr_utility.trace('Source id = '|| p_assignment_id);
1021 hr_utility.trace('Old start date = '|| p_old_effective_start_date);
1022 end if;
1023 update pay_object_groups
1024 set start_date = p_new_effective_start_date
1025 where source_id = p_assignment_id
1026 and source_type = 'PAF'
1027 and start_date = p_old_effective_start_date;
1028
1029 --start of bug 12696936
1030 begin
1031 select pos.date_start
1032 ,pos.period_of_service_id
1033 into l_new_effective_start_date
1034 ,l_period_of_service_id
1035 from per_all_assignments_f asg
1036 ,per_periods_of_service pos
1037 where asg.assignment_id = p_assignment_id
1038 and asg.period_of_service_id = pos.period_of_service_id;
1039
1040 update pay_object_groups
1041 set start_date = p_new_effective_start_date
1042 where source_type = 'PPF'
1043 and period_of_service_id = l_period_of_service_id;
1044 exception
1045 when others then
1046 null;
1047 end;
1048 --end of bug 12696936
1049 --
1050 if g_debug then
1051 hr_utility.trace('Out asg_datetracked_strt_early()');
1052 end if;
1053 end asg_datetracked_strt_early;
1054
1055 --start of bug 12696936
1056 --
1057 /*
1058 Name
1059 asg_datetracked_strt_later
1060 Description
1061 This is called from the Assignment Dynamic Triggers
1062 to maintain the assignment groups
1063 */
1064
1065 procedure asg_datetracked_strt_later(p_assignment_id in number,
1066 p_person_id in number,
1067 p_period_of_service_id in number,
1068 p_old_effective_start_date in date,
1069 p_old_effective_end_date in date,
1070 p_new_effective_start_date in date,
1071 p_new_effective_end_date in date,
1072 p_old_payroll_id in number,
1073 p_new_payroll_id in number
1074 )
1075 is
1076 l_period_of_service_id NUMBER;
1077 l_new_effective_start_date DATE;
1078 begin
1079 --
1080 if g_debug then
1081 hr_utility.trace('In asg_datetracked_strt_later()');
1082 hr_utility.trace('Start date = '|| p_new_effective_start_date);
1083 hr_utility.trace('Source id = '|| p_assignment_id);
1084 hr_utility.trace('Old start date = '|| p_old_effective_start_date);
1085 end if;
1086 update pay_object_groups
1087 set start_date = p_new_effective_start_date
1088 where source_id = p_assignment_id
1089 and source_type = 'PAF'
1090 and start_date = p_old_effective_start_date;
1091
1092 begin
1093 select pos.date_start
1094 ,pos.period_of_service_id
1095 into l_new_effective_start_date
1096 ,l_period_of_service_id
1097 from per_all_assignments_f asg
1098 ,per_periods_of_service pos
1099 where asg.assignment_id = p_assignment_id
1100 and asg.period_of_service_id = pos.period_of_service_id;
1101
1102 update pay_object_groups
1103 set start_date = p_new_effective_start_date
1104 where source_type = 'PPF'
1105 and period_of_service_id = l_period_of_service_id
1106 and start_date = p_old_effective_start_date;
1107 exception
1108 when others then
1109 null;
1110 end;
1111
1112 --
1113 if g_debug then
1114 hr_utility.trace('Out asg_datetracked_strt_later()');
1115 end if;
1116 end asg_datetracked_strt_later;
1117
1118 --end of bug 12696936
1119
1120 /*
1121 Name
1122 asg_datetracked_ovrr_update
1123 Description
1124
1125 This is called from the Assignment Dynamic Triggers
1126 to maintain the assignment groups
1127 */
1128
1129 procedure asg_datetracked_ovrr_update(p_assignment_id in number,
1130 p_person_id in number,
1131 p_period_of_service_id in number,
1132 p_old_effective_start_date in date,
1133 p_old_effective_end_date in date,
1134 p_new_effective_start_date in date,
1135 p_new_effective_end_date in date,
1136 p_old_payroll_id in number,
1137 p_new_payroll_id in number
1138 )
1139 is
1140 cursor get_pogpaf(p_assignment_id number,
1141 p_effective_end_date date)
1142 is
1143 select object_group_id,
1144 start_date,
1145 end_date
1146 from pay_object_groups pog_paf
1147 where pog_paf.source_id = p_assignment_id
1148 and pog_paf.source_type = 'PAF';
1149 --Bug 14585781,changed the cur,Case C
1150 begin
1151 --
1152 if g_debug then
1153 hr_utility.trace('In asg_datetracked_ovrr_update()');
1154 end if;
1155 asg_datetracked_update(p_assignment_id,
1156 p_person_id,
1157 p_period_of_service_id,
1158 p_old_effective_start_date,
1159 p_old_effective_end_date,
1160 p_new_effective_start_date,
1161 p_new_effective_end_date,
1162 p_old_payroll_id,
1163 p_new_payroll_id
1164 );
1165 --
1166 -- Any POG_PAF that starts after the new start date
1167 -- then they must be removed as a they have been
1168 -- overriden
1169 if g_debug then
1170 hr_utility.trace(' p_new_effective_start_date '|| p_new_effective_start_date);
1171 hr_utility.trace('p_new_effective_end_date '|| p_new_effective_end_date);
1172 end if;
1173 for pafrec in get_pogpaf(p_assignment_id, p_new_effective_end_date) loop
1174 -- Bug 14585781, changed below condition,Case C
1175 if (pafrec.start_date > p_new_effective_start_date) then
1176 zap_object_group(pafrec.object_group_id);
1177 end if;
1178 --
1179 end loop;
1180 --
1181 if g_debug then
1182 hr_utility.trace('Out asg_datetracked_ovrr_update()');
1183 end if;
1184 end asg_datetracked_ovrr_update;
1185 --
1186 /*
1187 Name
1188 asg_datetracked_zap
1189 Description
1190
1191 This is called from the Assignment Dynamic Triggers
1192 to maintain the assignment groups
1193 */
1194
1195 procedure asg_datetracked_zap(p_assignment_id in number)
1196 is
1197 cursor get_pogpaf(p_assignment_id number)
1198 is
1199 select object_group_id,
1200 start_date,
1201 end_date
1202 from pay_object_groups pog_paf
1203 where pog_paf.source_id = p_assignment_id
1204 and pog_paf.source_type = 'PAF';
1205 begin
1206 --
1207 if g_debug then
1208 hr_utility.trace('In asg_datetracked_zap()');
1209 end if;
1210 -- all POG_PAF for the assignment must be removed
1211 for pafrec in get_pogpaf(p_assignment_id) loop
1212 --
1213 zap_object_group(pafrec.object_group_id);
1214 --
1215 end loop;
1216 --
1217 if g_debug then
1218 hr_utility.trace('Out asg_datetracked_zap()');
1219 end if;
1220 end;
1221
1222 /*
1223 Name
1224 asg_insert_trigger
1225 Description
1226
1227 This is the Dynamic Trigger Code for Assignment Processing
1228 Groups
1229 */
1230
1231 procedure asg_insert_trigger(p_assignment_id in number,
1232 p_person_id in number,
1233 p_period_of_service_id in number,
1234 p_new_effective_start_date in date,
1235 p_new_effective_end_date in date,
1236 p_new_payroll_id in number,
1237 p_business_group_id in number
1238 )
1239 is
1240 dt_mode varchar2(20);
1241 begin
1242 --
1243 if g_debug then
1244 hr_utility.trace('In asg_insert_trigger()');
1245 end if;
1246 if (is_pog_enable(p_business_group_id) = TRUE) then
1247 asg_datetracked_insert(p_assignment_id,
1248 p_person_id,
1249 p_period_of_service_id,
1250 p_new_effective_start_date,
1251 p_new_effective_end_date,
1252 p_new_payroll_id
1253 );
1254 end if;
1255 --
1256 if g_debug then
1257 hr_utility.trace('Out asg_insert_trigger()');
1258 end if;
1259 end asg_insert_trigger;
1260
1261 /*
1262 Name
1263 asg_update_trigger
1264 Description
1265
1266 This is the Dynamic Trigger Code for Assignment Processing
1267 Groups
1268 */
1269
1270 procedure asg_update_trigger(p_assignment_id in number,
1271 p_person_id in number,
1272 p_period_of_service_id in number,
1273 p_old_effective_start_date in date,
1274 p_old_effective_end_date in date,
1275 p_new_effective_start_date in date,
1276 p_new_effective_end_date in date,
1277 p_old_payroll_id in number,
1278 p_new_payroll_id in number,
1279 p_business_group_id in number
1280 )
1281 is
1282 dt_mode varchar2(20);
1283 begin
1284 --
1285 if g_debug then
1286 hr_utility.trace('In asg_update_trigger()');
1287 end if;
1288 if (is_pog_enable(p_business_group_id) = TRUE) then
1289 --
1290 -- First set the Date Track mode
1291 --
1292 dt_mode := PAY_POG_ALL_ASSIGNMENTS_PKG.dyt_mode;
1293 if g_debug then
1294 hr_utility.trace ('Location 02 dt_mode = '||dt_mode);
1295 end if;
1296 --Bug 14585781 added Correction mode
1297 if ( dt_mode = 'CORRECTION') then
1298
1299 asg_datetracked_correction (p_assignment_id,
1300 p_person_id,
1301 p_period_of_service_id,
1302 p_old_effective_start_date,
1303 p_old_effective_end_date,
1304 p_new_effective_start_date,
1305 p_new_effective_end_date,
1306 p_old_payroll_id,
1307 p_new_payroll_id
1308 );
1309 elsif ( dt_mode = 'UPDATE'
1310 or dt_mode = 'UPDATE_CHANGE_INSERT') then
1311 --
1312 asg_datetracked_update(p_assignment_id,
1313 p_person_id,
1314 p_period_of_service_id,
1315 p_old_effective_start_date,
1316 p_old_effective_end_date,
1317 p_new_effective_start_date,
1318 p_new_effective_end_date,
1319 p_old_payroll_id,
1320 p_new_payroll_id
1321 );
1322 --
1323 elsif ( dt_mode = 'UPDATE_OVERRIDE') then
1324 --
1325 asg_datetracked_ovrr_update(p_assignment_id,
1326 p_person_id,
1327 p_period_of_service_id,
1328 p_old_effective_start_date,
1329 p_old_effective_end_date,
1330 p_new_effective_start_date,
1331 p_new_effective_end_date,
1332 p_old_payroll_id,
1333 p_new_payroll_id
1334 );
1335 --
1336 elsif ( dt_mode = 'START_EARLIER') then
1337 --
1338 asg_datetracked_strt_early(p_assignment_id,
1339 p_person_id,
1340 p_period_of_service_id,
1341 p_old_effective_start_date,
1342 p_old_effective_end_date,
1343 p_new_effective_start_date,
1344 p_new_effective_end_date,
1345 p_old_payroll_id,
1346 p_new_payroll_id
1347 );
1348 --start of bug 12696936
1349 elsif ( dt_mode = 'START_LATER') then
1350 --
1351 asg_datetracked_strt_later(p_assignment_id,
1352 p_person_id,
1353 p_period_of_service_id,
1354 p_old_effective_start_date,
1355 p_old_effective_end_date,
1356 p_new_effective_start_date,
1357 p_new_effective_end_date,
1358 p_old_payroll_id,
1359 p_new_payroll_id
1360 );
1361 --end of bug 12696936
1362 end if;
1363 end if;
1364 --
1365 if g_debug then
1366 hr_utility.trace('Out asg_update_trigger()');
1367 end if;
1368 end asg_update_trigger;
1369 --
1370 /*
1371 Name
1372 asg_delete_trigger
1373 Description
1374
1375 This is the Dynamic Trigger Code for Assignment Processing
1376 Groups
1377 */
1378
1379 procedure asg_delete_trigger(p_assignment_id in number,
1380 p_effective_end_date in date,
1381 p_business_group_id in number,
1382 p_effective_end_date_o in date,
1383 p_val_end_date in date
1384 )
1385 is
1386 dt_mode varchar2(20);
1387 begin
1388 --
1389 if g_debug then
1390 hr_utility.trace('In asg_delete_trigger()');
1391 end if;
1392 if (is_pog_enable(p_business_group_id) = TRUE) then
1393 --
1394 -- First set the Date Track mode
1395 --
1396 dt_mode := PAY_POG_ALL_ASSIGNMENTS_PKG.dyt_mode;
1397 --
1398 if ( dt_mode = 'ZAP') then
1399 --
1400 asg_datetracked_zap(p_assignment_id);
1401 --
1402 elsif ( dt_mode = 'DELETE') then
1403 --
1404 if g_debug then
1405 hr_utility.trace ('Asg del trig - eff date = '||p_effective_end_date);
1406 end if;
1407 asg_datetracked_end_date(p_assignment_id,
1408 p_effective_end_date
1409 );
1410 --
1411 elsif dt_mode = 'FUTURE_CHANGE' or dt_mode = 'DELETE_NEXT_CHANGE' then
1412 asg_datetracked_delete_next(p_assignment_id,
1413 p_effective_end_date,
1414 p_effective_end_date_o,
1415 p_val_end_date
1416 );
1417 end if;
1418 end if;
1419 --
1420 if g_debug then
1421 hr_utility.trace('Out asg_delete_trigger()');
1422 end if;
1423 end asg_delete_trigger;
1424 --
1425 /*
1426 Name
1427 upgrade_asg
1428 Description
1429
1430 Upgrades existing data to have process groups. This is used by
1431 the generic upgrade process to convert existing legislations.
1432 */
1433 procedure upgrade_asg(p_asg_id in number)
1434 is
1435 --
1436 cursor get_asg_info(p_asg_id in number)
1437 is
1438 select assignment_id,
1439 person_id,
1440 period_of_service_id,
1441 payroll_id,
1442 effective_start_date,
1443 effective_end_date,
1444 business_group_id
1445 from per_all_assignments_f
1446 where assignment_id = p_asg_id
1447 order by assignment_id, effective_start_date;
1448 --
1449 asg_id per_all_assignments_f.assignment_id%type;
1450 per_id per_all_assignments_f.person_id%type;
1451 pos_id per_all_assignments_f.period_of_service_id%type;
1452 pay_id per_all_assignments_f.payroll_id%type;
1453 effective_start_date date;
1454 effective_end_date date;
1455 first_row boolean;
1456 --
1457 begin
1458 --
1459 if g_debug then
1460 hr_utility.trace('In upgrade_asg()');
1461 end if;
1462 first_row := TRUE;
1463 for asgrec in get_asg_info(p_asg_id) loop
1464 --
1465 if (first_row = TRUE) then
1466 --
1467 PAY_POG_ALL_ASSIGNMENTS_PKG.dyt_mode := 'INSERT';
1468 asg_insert_trigger
1469 (p_assignment_id => asgrec.assignment_id,
1470 p_person_id => asgrec.person_id,
1471 p_period_of_service_id => asgrec.period_of_service_id,
1472 p_new_effective_start_date => asgrec.effective_start_date,
1473 p_new_effective_end_date => asgrec.effective_end_date,
1474 p_new_payroll_id => asgrec.payroll_id,
1475 p_business_group_id => asgrec.business_group_id
1476 );
1477 asg_id := asgrec.assignment_id;
1478 per_id := asgrec.person_id;
1479 pos_id := asgrec.period_of_service_id;
1480 pay_id := asgrec.payroll_id;
1481 effective_start_date := asgrec.effective_start_date;
1482 effective_end_date := asgrec.effective_end_date;
1483 first_row := FALSE;
1484 --
1485 else
1486 --
1487 PAY_POG_ALL_ASSIGNMENTS_PKG.dyt_mode := 'UPDATE';
1488 asg_update_trigger
1489 (p_assignment_id => asgrec.assignment_id,
1490 p_person_id => asgrec.person_id,
1491 p_period_of_service_id => asgrec.period_of_service_id,
1492 p_old_effective_start_date => effective_start_date,
1493 p_old_effective_end_date => effective_end_date,
1494 p_new_effective_start_date => asgrec.effective_start_date,
1495 p_new_effective_end_date => asgrec.effective_end_date,
1496 p_old_payroll_id => pay_id,
1497 p_new_payroll_id => asgrec.payroll_id,
1498 p_business_group_id => asgrec.business_group_id
1499 );
1500 --
1501 asg_id := asgrec.assignment_id;
1502 per_id := asgrec.person_id;
1503 pos_id := asgrec.period_of_service_id;
1504 pay_id := asgrec.payroll_id;
1505 effective_start_date := asgrec.effective_start_date;
1506 effective_end_date := asgrec.effective_end_date;
1507 first_row := FALSE;
1508 --
1509 end if;
1510 --
1511 end loop;
1512 --
1513 if g_debug then
1514 hr_utility.trace('Out upgrade_asg()');
1515 end if;
1516 end upgrade_asg;
1517 --
1518 end pay_asg_process_grp_pkg;