DBA Data[Home] [Help]

PACKAGE BODY: APPS.PAY_NO_HOLIDAY_PAY

Source


1 PACKAGE BODY pay_no_holiday_pay AS
2   /* $Header: pynoholp.pkb 120.0.12000000.1 2007/05/22 07:53:23 rajesrin noship $ */
3   -- Function to get the G value.
4   FUNCTION get_grate(p_business_group_id IN NUMBER,   p_effective_date IN DATE) RETURN NUMBER IS l_g_rate NUMBER;
5   BEGIN
6     -- Get the daily rate value
7     BEGIN
8 
9       -- Bug Fix 5566622 : Value of G (National Insurance Base Rate) to be taken from Global and not user table.
10 
11       -- l_g_rate := to_number(hruserdt.get_table_value(p_business_group_id,   'NO_GLOBAL_CONSTANTS',   'Value',   'NATIONAL_INSURANCE_BASE_RATE',   p_effective_date));
12 
13      select to_number(GLOBAL_VALUE)
14      into l_g_rate
15      from ff_globals_f
16      where global_name = 'NO_NATIONAL_INSURANCE_BASE_RATE'
17      and LEGISLATION_CODE = 'NO'
18      and BUSINESS_GROUP_ID IS NULL
19      and p_effective_date between EFFECTIVE_START_DATE and EFFECTIVE_END_DATE ;
20 
21 
22     EXCEPTION
23     WHEN no_data_found THEN
24       l_g_rate := NULL;
25     END;
26 
27     RETURN l_g_rate;
28   END get_grate;
29 
30   --Function to get the age of a person as on 31-AUG of the holiday year.
31   FUNCTION get_age(p_payroll_proc_start_date IN DATE,   p_date_of_birth IN DATE) RETURN NUMBER IS l_age NUMBER;
32   l_effective_date DATE;
33   BEGIN
34     l_effective_date := to_date('31/08/' || to_char(p_payroll_proc_start_date,   'YYYY'),   'DD/MM/YYYY');
35     l_age := FLOOR(months_between(l_effective_date,   p_date_of_birth) / 12);
36     RETURN l_age;
37   END get_age;
38 
39   /* Function to whether the payroll run is the last payroll run of the year in order
40  recalulate the holiday pay over 60*/ FUNCTION get_last_payroll(p_payroll_id IN NUMBER,   p_pay_proc_period_end_date IN DATE) RETURN VARCHAR2 IS l_next_period_start_date DATE;
41   l_next_period_end_date DATE;
42   l_flag VARCHAR2(1);
43 
44   CURSOR csr_next_pay_proc_end_date(p_start_date DATE) IS
45   SELECT end_date
46   FROM per_time_periods ptp
47   WHERE ptp.payroll_id = p_payroll_id
48    AND ptp.start_date = p_start_date;
49 
50   BEGIN
51     l_next_period_start_date := p_pay_proc_period_end_date + 1;
52 
53     OPEN csr_next_pay_proc_end_date(l_next_period_start_date);
54     FETCH csr_next_pay_proc_end_date
55     INTO l_next_period_end_date;
56     CLOSE csr_next_pay_proc_end_date;
57 
58     IF(to_char(p_pay_proc_period_end_date,   'YYYY') <> to_char(l_next_period_start_date,   'YYYY')) THEN
59       l_flag := 'Y';
60       RETURN l_flag;
61       ELSIF(to_char(l_next_period_start_date,   'YYYY') <> to_char(l_next_period_end_date,   'YYYY')) THEN
62         l_flag := 'Y';
63         RETURN l_flag;
64       ELSE
65         l_flag := 'N';
66         RETURN l_flag;
67       END IF;
68 
69     END;
70 
71     -- Function to get the assignments status.
72     FUNCTION get_assg_status(p_business_group_id IN NUMBER,   p_asg_id IN NUMBER,   p_pay_proc_period_start_date IN DATE,   p_pay_proc_period_end_date IN DATE) RETURN VARCHAR2 IS
73 
74      CURSOR csr_asg IS
75     SELECT MIN(paaf.effective_start_date) effective_start_date
76     FROM per_all_assignments_f paaf
77     WHERE paaf.business_group_id = p_business_group_id
78      AND paaf.assignment_id = p_asg_id
79      AND paaf.assignment_status_type_id = 3;
80 
81     l_flag VARCHAR2(1);
82     l_asg_status csr_asg % rowtype;
83 
84     BEGIN
85 
86       OPEN csr_asg;
87       FETCH csr_asg
88       INTO l_asg_status;
89       CLOSE csr_asg;
90 
91       IF l_asg_status.effective_start_date >= p_pay_proc_period_start_date
92        AND l_asg_status.effective_start_date <=(p_pay_proc_period_end_date + 1) THEN
93         l_flag := 'T';
94       ELSE
95         l_flag := 'A';
96       END IF;
97 
98       RETURN l_flag;
99 
100     END get_assg_status;
101 
102     -- Function to get the entitlement days as years last payroll run end date.
103     FUNCTION get_entitlement_days(p_business_group_id IN NUMBER,   p_asg_id IN NUMBER,   p_tax_unit_id IN NUMBER,   p_effective_date IN DATE,   p_above_60 IN VARCHAR2,   p_entit_days OUT nocopy NUMBER,
104              p_entit_days_over_60 OUT nocopy NUMBER) RETURN NUMBER IS CURSOR csr_assig_details IS
105     SELECT hsck.segment15 holiday_entitlement,
106       hsck.segment16 holiday_pay_calc_basis
107     FROM per_all_assignments_f paaf,
108       hr_soft_coding_keyflex hsck
109     WHERE paaf.business_group_id = p_business_group_id
110      AND paaf.assignment_id = p_asg_id
111      AND p_effective_date BETWEEN paaf.effective_start_date
112      AND paaf.effective_end_date
113      AND hsck.soft_coding_keyflex_id = paaf.soft_coding_keyflex_id;
114 
115     CURSOR csr_person_details IS
116     SELECT papf.per_information16 holiday_entitlement,
117       papf.per_information17 holiday_pay_calc_basis
118     FROM per_all_people_f papf,
119       per_all_assignments_f paaf
120     WHERE paaf.business_group_id = p_business_group_id
121      AND paaf.assignment_id = p_asg_id
122      AND papf.person_id = paaf.person_id
123      AND p_effective_date BETWEEN papf.effective_start_date
124      AND papf.effective_end_date;
125 
126     --Added Cursor to get the legal employer details
127     CURSOR csr_le_details IS
128     SELECT hoi.org_information1 holiday_entitlement,
129       hoi.org_information2 holiday_pay_calc_basis
130     FROM hr_organization_information hoi
131     WHERE hoi.organization_id = p_tax_unit_id
132      AND hoi.org_information_context = 'NO_HOLIDAY_PAY_DETAILS';
133 
134     CURSOR csr_globals(p_global_name VARCHAR2) IS
135     SELECT fgf.global_value
136     FROM ff_globals_f fgf
137     WHERE fgf.global_name = p_global_name
138      AND fgf.legislation_code = 'NO'
139      AND p_effective_date BETWEEN fgf.effective_start_date
140      AND fgf.effective_end_date;
141 
142     l_holiday_entitlement VARCHAR2(150);
143     l_holiday_pay_calc_basis VARCHAR2(150);
144     l_entit_days NUMBER;
145     l_entit_days_over_60 NUMBER;
146     l_assig_details csr_assig_details % rowtype;
147     l_person_details csr_person_details % rowtype;
148     l_le_details csr_le_details % rowtype;
149     l_global_name ff_globals_f.global_name%TYPE;
150     BEGIN
151 
152       /*Bug 5346834 fix*/
153 
154       OPEN csr_assig_details;
155       FETCH csr_assig_details
156       INTO l_assig_details;
157       CLOSE csr_assig_details;
158 
159       OPEN csr_person_details;
160       FETCH csr_person_details
161       INTO l_person_details;
162       CLOSE csr_person_details;
163 
164       OPEN csr_le_details;
165       FETCH csr_le_details
166       INTO l_le_details;
167       CLOSE csr_le_details;
168 
169       IF(l_assig_details.holiday_entitlement IS NOT NULL) THEN
170         l_holiday_entitlement := l_assig_details.holiday_entitlement;
171         ELSIF(l_person_details.holiday_entitlement IS NOT NULL) THEN
172           l_holiday_entitlement := l_person_details.holiday_entitlement;
173           ELSIF(l_person_details.holiday_entitlement IS NOT NULL) THEN
174             l_holiday_entitlement := l_person_details.holiday_entitlement;
175             ELSIF(l_le_details.holiday_entitlement IS NOT NULL) THEN
176               l_holiday_entitlement := l_le_details.holiday_entitlement;
177             ELSE
178               l_holiday_entitlement := 'HA';
179             END IF;
180 
181             IF(l_assig_details.holiday_pay_calc_basis IS NOT NULL) THEN
182               l_holiday_pay_calc_basis := l_assig_details.holiday_pay_calc_basis;
183               ELSIF(l_person_details.holiday_pay_calc_basis IS NOT NULL) THEN
184                 l_holiday_pay_calc_basis := l_person_details.holiday_pay_calc_basis;
185                 ELSIF(l_le_details.holiday_pay_calc_basis IS NOT NULL) THEN
186                   l_holiday_pay_calc_basis := l_le_details.holiday_pay_calc_basis;
187                 ELSE
188                   l_holiday_pay_calc_basis := '5DAY';
189                 END IF;
190 
191                 IF(l_holiday_entitlement = 'HA'
192                  AND l_holiday_pay_calc_basis = '5DAY') THEN
193                   l_global_name := 'NO_HOLACT_5DAY_ENTITLMENT';
194 
195                   ELSIF(l_holiday_entitlement = 'HA'
196                    AND l_holiday_pay_calc_basis = '6DAY') THEN
197                     l_global_name := 'NO_HOLACT_6DAY_ENTITLMENT';
198                     ELSIF(l_holiday_entitlement = 'CA'
199                      AND l_holiday_pay_calc_basis = '5DAY') THEN
200                       l_global_name := 'NO_COLAGR_5DAY_ENTITLMENT';
201                       ELSIF(l_holiday_entitlement = 'CA'
202                        AND l_holiday_pay_calc_basis = '6DAY') THEN
203                         l_global_name := 'NO_COLAGR_6DAY_ENTITLMENT';
204                       END IF;
205 
206                       OPEN csr_globals(l_global_name);
207                       FETCH csr_globals
208                       INTO p_entit_days;
209                       CLOSE csr_globals;
210 
211                       IF p_above_60 = 'Y' THEN
212 
213                         IF(l_holiday_pay_calc_basis = '5DAY') THEN
214 	                  l_global_name := 'NO_HOL_5DAY_OVER60_ENTITLEMENT';
215                         ELSE
216 			  l_global_name := 'NO_HOL_6DAY_OVER60_ENTITLEMENT';
217                         END IF;
218 			  OPEN csr_globals(l_global_name);
219 			  FETCH csr_globals
220 			  INTO p_entit_days_over_60;
221 			  CLOSE csr_globals;
222 
223                       ELSE
224                         p_entit_days_over_60 := 0;
225                       END IF;
226 
227                       RETURN 1;
228                     END get_entitlement_days;
229 
230     -- Function to get the fixed period for a payroll.
231     FUNCTION get_fixed_period(p_payroll_id IN NUMBER,   p_start_date IN DATE) RETURN NUMBER IS l_fixed_period NUMBER;
232 
233     CURSOR csr_fixed_period IS
234     SELECT period_num
235     FROM per_time_periods
236     WHERE payroll_id = p_payroll_id
237      AND to_char(start_date,   'YYYY') = to_char(p_start_date,   'YYYY')
238      AND prd_information2 = 'Y';
239     BEGIN
240 
241       OPEN csr_fixed_period;
242       FETCH csr_fixed_period
243       INTO l_fixed_period;
244       CLOSE csr_fixed_period;
245 
246       RETURN l_fixed_period;
247 
248     END get_fixed_period;
249 
250     -- Function to get the previous employer details.
251     FUNCTION get_prev_employer_days(p_business_group_id IN NUMBER,   p_assg_id IN NUMBER,   p_emp_hire_date IN DATE,   p_asg_start_date IN DATE) RETURN NUMBER IS
252 
253      l_person_id per_all_people_f.person_id%TYPE;
254 
255     CURSOR csr_person_id IS
256     SELECT paaf.person_id
257     FROM per_all_assignments_f paaf
258     WHERE paaf.business_group_id = p_business_group_id
259      AND paaf.assignment_id = p_assg_id;
260     /*Bug 5344736 fix - getting the previous employer days */
261     /* Bug 5344736 fix - added condition to check the assignment start year*/
262     CURSOR csr_prev_employer_days(p_person_id NUMBER) IS
263     SELECT SUM(to_number(ppe.pem_information2))
264     FROM per_previous_employers ppe
265     WHERE ppe.business_group_id = p_business_group_id
266      AND ppe.person_id = p_person_id
267      AND to_char(ppe.end_date,   'YYYY') = to_char(p_emp_hire_date,   'YYYY')
268      AND to_char(ppe.end_date,   'YYYY') = to_char(p_asg_start_date,   'YYYY');
269 
270     l_prev_employer_days per_previous_employers.pem_information2%TYPE;
271     BEGIN
272 
273       OPEN csr_person_id;
274       FETCH csr_person_id
275       INTO l_person_id;
276       CLOSE csr_person_id;
277 
278       OPEN csr_prev_employer_days(l_person_id);
279       FETCH csr_prev_employer_days
280       INTO l_prev_employer_days;
281       CLOSE csr_prev_employer_days;
282       RETURN nvl(l_prev_employer_days,   0);
283     END get_prev_employer_days;
284 
285 -- Function to get the holiday details required for hoiliday pay calculation.
286 FUNCTION get_hol_parameters(p_bus_group_id IN NUMBER,   p_assignment_id IN NUMBER,   p_date_earned IN DATE,   p_tax_unit_id IN NUMBER,   p_hourly_salaried_code IN OUT nocopy VARCHAR2,
287 	     p_holiday_entitlement IN OUT nocopy VARCHAR2,   p_holiday_pay_calc_basis IN OUT nocopy VARCHAR2,   p_holiday_pay_in_fixed_period IN OUT nocopy VARCHAR2,
288 	     p_hol_pay_over60_in_fix_period IN OUT nocopy VARCHAR2,   p_holiday_pay_to_be_adjusted IN OUT nocopy VARCHAR2,   p_res_hol_pay_to_6g_for_over60 IN OUT nocopy VARCHAR2) RETURN NUMBER IS
289 
290      CURSOR csr_assg_details IS
291     SELECT paaf.hourly_salaried_code hourly_salaried_code,
292       hsck.segment15 holiday_entitlement,
293       hsck.segment16 holiday_pay_calc_basis,
294       hsck.segment17 holiday_pay_in_fixed_period,
295       hsck.segment18 hol_pay_over60_in_fix_period,
296       hsck.segment19 holiday_pay_to_be_adjusted
297     FROM per_all_assignments_f paaf,
298       hr_soft_coding_keyflex hsck
299     WHERE paaf.business_group_id = p_bus_group_id
300      AND paaf.assignment_id = p_assignment_id
301      AND p_date_earned BETWEEN paaf.effective_start_date
302      AND paaf.effective_end_date
303      AND hsck.soft_coding_keyflex_id = paaf.soft_coding_keyflex_id;
304 
305     CURSOR csr_person_details IS
306     SELECT papf.per_information6 hourly_salaried_code,
307       papf.per_information16 holiday_entitlement,
308       papf.per_information17 holiday_pay_calc_basis,
309       papf.per_information18 holiday_pay_in_fixed_period,
313     FROM per_all_people_f papf,
310       papf.per_information19 hol_pay_over60_in_fix_period,
311       papf.per_information20 holiday_pay_to_be_adjusted,
312       papf.per_information21 res_hol_pay_to_6g_for_over60
314       per_all_assignments_f paaf
315     WHERE paaf.business_group_id = p_bus_group_id
316      AND paaf.assignment_id = p_assignment_id
317      AND papf.person_id = paaf.person_id
318      AND p_date_earned BETWEEN papf.effective_start_date
319      AND papf.effective_end_date;
320 
321     --Added Cursor to get the legal employer details
322     CURSOR csr_le_details IS
323     SELECT hoi.org_information1 holiday_entitlement,
324       hoi.org_information2 holiday_pay_calc_basis,
325       hoi.org_information3 holiday_pay_in_fixed_period,
326       hoi.org_information4 hol_pay_over60_in_fix_period,
327       hoi.org_information5 holiday_pay_to_be_adjusted,
328       hoi.org_information6 res_hol_pay_to_6g_for_over60
329     FROM hr_organization_information hoi
330     WHERE hoi.organization_id = p_tax_unit_id
331      AND hoi.org_information_context = 'NO_HOLIDAY_PAY_DETAILS';
332 
333     CURSOR csr_le_hourly_sal IS
334     SELECT hoi.org_information5 hourly_salaried_code
335     FROM hr_organization_information hoi
336     WHERE hoi.organization_id = p_tax_unit_id
337      AND hoi.org_information_context = 'NO_ABSENCE_PAYMENT_DETAILS';
338 
339     l_person_details csr_person_details % rowtype;
340     l_le_details csr_le_details % rowtype;
341     l_le_hourly_sal csr_le_hourly_sal % rowtype;
342 
343     BEGIN
344 
345       OPEN csr_assg_details;
346       FETCH csr_assg_details
347       INTO p_hourly_salaried_code,
348 	p_holiday_entitlement,
349 	p_holiday_pay_calc_basis,
350 	p_holiday_pay_in_fixed_period,
351 	p_hol_pay_over60_in_fix_period,
352 	p_holiday_pay_to_be_adjusted;
353       CLOSE csr_assg_details;
354 
355       OPEN csr_person_details;
356       FETCH csr_person_details
357       INTO l_person_details;
358       CLOSE csr_person_details;
359 
360       OPEN csr_le_details;
361       FETCH csr_le_details
362       INTO l_le_details;
363       CLOSE csr_le_details;
364 
365       OPEN csr_le_hourly_sal;
366       FETCH csr_le_hourly_sal
367       INTO l_le_hourly_sal;
368       CLOSE csr_le_hourly_sal;
369 
370       IF(p_hourly_salaried_code IS NULL) THEN
371 
372 	IF(l_person_details.hourly_salaried_code IS NOT NULL) THEN
373 	  p_hourly_salaried_code := l_person_details.hourly_salaried_code;
374 	  ELSIF(l_le_hourly_sal.hourly_salaried_code IS NOT NULL) THEN
375 	    p_hourly_salaried_code := l_le_hourly_sal.hourly_salaried_code;
376 	  ELSE
377 	    p_hourly_salaried_code := 'S';
378 	  END IF;
379 
380 	END IF;
381 
382 	IF p_holiday_entitlement IS NULL THEN
383 
387 	      p_holiday_entitlement := l_le_details.holiday_entitlement;
384 	  IF(l_person_details.holiday_entitlement IS NOT NULL) THEN
385 	    p_holiday_entitlement := l_person_details.holiday_entitlement;
386 	    ELSIF(l_le_details.holiday_entitlement IS NOT NULL) THEN
388 	    ELSE
389 	      p_holiday_entitlement := 'HA';
390 	    END IF;
391 
392 	  END IF;
393 
394 	  IF p_holiday_pay_calc_basis IS NULL THEN
395 
396 	    IF(l_person_details.holiday_pay_calc_basis IS NOT NULL) THEN
397 	      p_holiday_pay_calc_basis := l_person_details.holiday_pay_calc_basis;
398 	      ELSIF(l_le_details.holiday_pay_calc_basis IS NOT NULL) THEN
399 		p_holiday_pay_calc_basis := l_le_details.holiday_pay_calc_basis;
400 	      ELSE
401 		p_holiday_pay_calc_basis := '5DAY';
402 	      END IF;
403 
404 	    END IF;
405 
406 	    IF p_holiday_pay_in_fixed_period IS NULL THEN
407 
408 	      IF(l_person_details.holiday_pay_in_fixed_period IS NOT NULL) THEN
409 		p_holiday_pay_in_fixed_period := l_person_details.holiday_pay_in_fixed_period;
410 		p_hol_pay_over60_in_fix_period := l_person_details.hol_pay_over60_in_fix_period;
411 		p_holiday_pay_to_be_adjusted := l_person_details.holiday_pay_to_be_adjusted;
412 		ELSIF(l_le_details.holiday_pay_in_fixed_period IS NOT NULL) THEN
413 		  p_holiday_pay_in_fixed_period := l_le_details.holiday_pay_in_fixed_period;
414 		  p_hol_pay_over60_in_fix_period := l_le_details.hol_pay_over60_in_fix_period;
415 		  p_holiday_pay_to_be_adjusted := l_le_details.holiday_pay_to_be_adjusted;
416 
417 		ELSE
418 		  p_holiday_pay_in_fixed_period := 'N';
419 		  p_hol_pay_over60_in_fix_period := 'N';
420 		  p_holiday_pay_to_be_adjusted := 'N';
421 		END IF;
422 
423 	      END IF;
424 
425 	      IF(l_person_details.res_hol_pay_to_6g_for_over60 IS NOT NULL) THEN
426 		p_res_hol_pay_to_6g_for_over60 := l_person_details.res_hol_pay_to_6g_for_over60;
427 		ELSIF(l_le_details.res_hol_pay_to_6g_for_over60 IS NOT NULL) THEN
428 		  p_res_hol_pay_to_6g_for_over60 := l_le_details.res_hol_pay_to_6g_for_over60;
429 		ELSE
430 		  p_res_hol_pay_to_6g_for_over60 := 'Y';
431 		END IF;
432 
433 		RETURN 1;
434 	      END get_hol_parameters;
435 
436       -- Function to get the assignment start date.
437 
438       /*Bug 5334894 fix- Added a new function to get the assignment start date*/
439  FUNCTION get_asg_start_date(p_business_group_id IN NUMBER,   p_assignment_id IN NUMBER,   p_asg_start_date OUT nocopy DATE) RETURN NUMBER IS CURSOR csr_asg_start_date IS
440       SELECT MIN(paaf.effective_start_date)
441       FROM per_all_assignments_f paaf
442       WHERE paaf.business_group_id = p_business_group_id
443        AND paaf.assignment_id = p_assignment_id
444        AND paaf.assignment_status_type_id = 1;
445 
446       BEGIN
447 
448 	OPEN csr_asg_start_date;
449 	FETCH csr_asg_start_date
450 	INTO p_asg_start_date;
451 	CLOSE csr_asg_start_date;
452 	RETURN 1;
453       END get_asg_start_date;
454 
455 --Function to get the accrual act information from absence details
456  FUNCTION get_abs_hol_accr_entitl (p_bus_group_id IN NUMBER,   p_assignment_id IN NUMBER,   p_date_earned IN DATE,   p_tax_unit_id IN NUMBER
457                                      , p_hol_accrual_entit OUT nocopy VARCHAR2) RETURN NUMBER IS
458 
459 	    CURSOR csr_person_details IS
460 	    SELECT
461 	      papf.per_information13 hol_accrual_entit
462 	    FROM per_all_people_f papf,
463 	      per_all_assignments_f paaf
464 	    WHERE paaf.business_group_id = p_bus_group_id
465 	     AND paaf.assignment_id = p_assignment_id
466 	     AND papf.person_id = paaf.person_id
467 	     AND p_date_earned BETWEEN papf.effective_start_date
468 	     AND papf.effective_end_date;
469 
470 	    --Added Cursor to get the legal employer details
471 	    CURSOR csr_le_details IS
472 	    SELECT hoi.org_information9 hol_accrual_entit
473 	    FROM hr_organization_information hoi
474 	    WHERE hoi.organization_id = p_tax_unit_id
475 	     AND hoi.org_information_context = 'NO_ABSENCE_PAYMENT_DETAILS';
476 
477 	    l_person_details csr_person_details % rowtype;
478 	    l_le_details csr_le_details % rowtype;
479 
480 	    BEGIN
481 
482 
483 	      OPEN csr_person_details;
484 	      FETCH csr_person_details
485 	      INTO l_person_details;
486 	      CLOSE csr_person_details;
487 
488 	      OPEN csr_le_details;
489 	      FETCH csr_le_details
490 	      INTO l_le_details;
491 	      CLOSE csr_le_details;
492 
493 	     p_hol_accrual_entit := NVL(NVL(l_person_details.hol_accrual_entit,l_le_details.hol_accrual_entit),'HA');
494 
495 	     RETURN 1;
496 
497 	    EXCEPTION WHEN OTHERS THEN
498 	    RETURN 0 ;
499 
500 	END get_abs_hol_accr_entitl;
501 
502 END;