DBA Data[Home] [Help]

PACKAGE BODY: APPS.PAY_DK_HOLIDAY_PAY_PKG

Source


1 PACKAGE BODY PAY_DK_HOLIDAY_PAY_PKG AS
2 /* $Header: pydkholp.pkb 120.17 2012/01/19 09:02:59 rpahune ship $ */
3 --
4 --
5 
6 FUNCTION get_allowance_perc(p_payroll_id NUMBER
7 			   ,p_date_earned DATE ) RETURN NUMBER IS
8 
9 
10 
11 l_value  PER_TIME_PERIODS.PRD_INFORMATION1%TYPE;
12 CURSOR get_perc_from_ddf(p_payroll_id NUMBER , p_date_earned DATE) IS
13   SELECT nvl(PRD_INFORMATION1 ,0)
14   FROM PER_TIME_PERIODS ptp
15   WHERE PAYROLL_ID = p_payroll_id
16   AND p_date_earned BETWEEN ptp.START_DATE AND ptp.END_DATE;
17 
18 
19 BEGIN
20   OPEN get_perc_from_ddf(p_payroll_id, p_date_earned);
21   FETCH get_perc_from_ddf INTO l_value;
22   CLOSE get_perc_from_ddf;
23   /* Change the to_number to fnd_number.canonical_to_number */
24   RETURN fnd_number.canonical_to_number(l_value);
25 
26 END  get_allowance_perc;
27 
28 /* 10092419 start */
29 FUNCTION get_hol_Unpaid_details
30 
31 	(p_org_id IN NUMBER,
32 	 p_unpaid_def_Y_N    OUT NOCOPY VARCHAR2,
33 	 p_def_5day_days     OUT NOCOPY NUMBER,
34 	 p_def_6day_days     OUT NOCOPY NUMBER
35 	) RETURN NUMBER is
36 
37 	 CURSOR csr_get_hol_rates(p_org_id NUMBER) is
38 	 SELECT org_information10, fnd_number.canonical_to_number(org_information12),fnd_number.canonical_to_number(org_information13)
39 	 FROM hr_organization_information
40 	 WHERE organization_id = p_org_id
41 	 and org_information_context = 'DK_HOLIDAY_ENTITLEMENT_INFO';
42 
43 	 BEGIN
44 
45 	 OPEN csr_get_hol_rates(p_org_id);
46 	 FETCH csr_get_hol_rates INTO p_unpaid_def_Y_N,p_def_5day_days,p_def_6day_days;
47 	 CLOSE csr_get_hol_rates;
48 
49 	 RETURN 1;
50 
51 
52 END get_hol_Unpaid_details;
53 /* 10092419 end */
54 FUNCTION get_prev_bal(p_assignment_id NUMBER
55 		    , p_balance_name VARCHAR2
56 		    , p_balance_dim VARCHAR2
57 		    , p_virtual_date DATE) RETURN NUMBER IS
58 
59 l_context1 PAY_DEFINED_BALANCES.DEFINED_BALANCE_ID%TYPE;
60 l_value    NUMBER;
61 
62 
63 CURSOR get_dbal_id(p_balance_name VARCHAR2 , p_balance_dim VARCHAR2) IS
64   SELECT pdb.defined_balance_id
65   FROM   pay_defined_balances  pdb
66 	,pay_balance_types  pbt
67 	,pay_balance_dimensions  pbd
68   WHERE  pbt.legislation_code='DK'
69   AND    pbt.balance_name = p_balance_name
70   AND    pbd.legislation_code = 'DK'
71   AND    pbd.database_item_suffix = p_balance_dim
72   AND    pdb.balance_type_id = pbt.balance_type_id
73   AND    pdb.balance_dimension_id = pbd.balance_dimension_id;
74 
75 
76 BEGIN
77   OPEN get_dbal_id(p_balance_name, p_balance_dim);
78   FETCH get_dbal_id INTO l_context1;
79   CLOSE get_dbal_id;
80 
81 --12398485
82 	BEGIN
83 	l_value := pay_balance_pkg.get_value(l_context1,p_assignment_id,p_virtual_date);
84 	EXCEPTION When others THEN
85 	RETURN 0;
86 	END;
87 
88 	IF l_value is null THEN
89 	l_value := 0;
90 	END IF;
91 --12398485
92 
93   RETURN l_value;
94 
95   END  get_prev_bal;
96 
97 
98 /* Bug fix 4950983 added parameter p_work_pattern */
99 /* Bug#8293282 fix - Added out parameter p_hol_all_reduction */
100 FUNCTION get_le_holiday_details
101 
102 	(p_org_id IN NUMBER,
103 	 p_sal_accrual_rate    OUT NOCOPY NUMBER,
104 	 p_hourly_accrual_rate OUT NOCOPY NUMBER,
105 	 p_use_holiday_card    OUT NOCOPY VARCHAR2,
106 	 p_work_pattern        OUT NOCOPY VARCHAR2,
107          p_hol_all_reduction   OUT NOCOPY VARCHAR2) RETURN NUMBER is
108 
109 	/* Bug fix 4950983 added org_information1 in select clause */
110        /* Change the to_number to fnd_number.canonical_to_number */
111 	 CURSOR csr_get_hol_rates(p_org_id NUMBER) is
112 	 SELECT fnd_number.canonical_to_number(org_information4), fnd_number.canonical_to_number(org_information3), org_information5, org_information1, org_information8 --9559824 abraghun - swapped first two columns.
113 	 FROM hr_organization_information
114 	 WHERE organization_id = p_org_id
115 	 and org_information_context = 'DK_HOLIDAY_ENTITLEMENT_INFO';
116 
117 	 BEGIN
118 
119 	/* Bug fix 4950983 added p_work_pattern in fetch statement */
120 	 OPEN csr_get_hol_rates(p_org_id);
121 	 FETCH csr_get_hol_rates INTO p_sal_accrual_rate,p_hourly_accrual_rate,p_use_holiday_card,p_work_pattern,p_hol_all_reduction;
122 	 CLOSE csr_get_hol_rates;
123 
124 	 RETURN 1;
125 
126 
127 END get_le_holiday_details;
128 
129 
130  FUNCTION get_le_employment_details
131   (p_org_id                     IN      NUMBER
132   ,p_le_work_hours              OUT NOCOPY NUMBER
133   ,p_freq                       OUT NOCOPY VARCHAR2
134   )RETURN NUMBER IS
135   --
136   CURSOR get_details(p_org_id VARCHAR2) IS
137   SELECT   hoi.org_information3
138 	 , hoi.org_information4
139   FROM     hr_organization_information  hoi
140   WHERE    hoi.org_information_context='DK_EMPLOYMENT_DEFAULTS'
141   AND      hoi.organization_id =  p_org_id ;
142 
143   --
144  BEGIN
145   --
146   OPEN  get_details(p_org_id);
147   FETCH get_details INTO p_le_work_hours,p_freq;
148   CLOSE get_details;
149 
150 
151   RETURN 1;
152   --
153  END get_le_employment_details;
154 
155 
156 FUNCTION get_eligible_days(p_assignment_id     IN NUMBER
157 			  ,p_org_id            IN NUMBER
158 			  ,p_period_start_date IN DATE
159 			  ,p_period_end_date   IN DATE
160 			  ,p_5days             OUT NOCOPY NUMBER
161 			  ,p_6days             OUT NOCOPY NUMBER) RETURN NUMBER is
162 
163 /* return 5day days and 6day days as out parameter, in the formula calculate accrual*/
164 l_assignment_id NUMBER;
165 l_org_id NUMBER;
166 l_elig_start_date DATE;
167 l_elig_end_date DATE;
168 l_wrkp_start_date DATE;
169 l_wrkp_end_date DATE;
170 
171 l_input_value VARCHAR2(80);
172 
173 l_elig_record l_rec;
174 l_wrkp_record l_rec;
175 
176 l_elig_records NUMBER;
177 l_wrkp_records NUMBER;
178 l_el_start_date DATE;
179 l_el_end_date DATE;
180 l_eligible VARCHAR2(5);
181 
182 l_wp_start_date DATE;
183 l_wp_end_date DATE;
184 l_work_pattern VARCHAR2(5);
185 
186 l_le_work_pattern VARCHAR2(5);
187 
188 l_5days NUMBER;
189 l_6days NUMBER;
190 l_eligibility_change VARCHAR2(1);
191 
192 CURSOR csr_get_accrual_elig(p_assignment_id NUMBER,p_period_start_date DATE,p_period_end_date DATE,p_input_value VARCHAR2) IS
193    SELECT  distinct eev.effective_start_date,eev.effective_end_date,eev.screen_entry_value
194    FROM   per_all_assignments_f      asg
195 	 ,per_all_people_f           per
196 	 ,pay_element_links_f        el
197 	 ,pay_element_types_f        et
198 	 ,pay_input_values_f         iv
199 	 ,pay_element_entries_f      ee
200 	 ,pay_element_entry_values_f eev
201    WHERE  asg.assignment_id        = p_assignment_id
202      AND  per.person_id            = asg.person_id
203      AND  et.element_name          = 'Holiday Accrual'
204      AND  et.legislation_code      = 'DK'
205      AND  iv.element_type_id       = et.element_type_id
206      AND  iv.name                  = p_input_value
207      AND  el.business_group_id     = per.business_group_id
208      AND  el.element_type_id       = et.element_type_id
209      AND  ee.assignment_id         = asg.assignment_id
210      AND  ee.element_link_id       = el.element_link_id
211      AND  eev.element_entry_id     = ee.element_entry_id
212      AND  eev.input_value_id       = iv.input_value_id
213      AND  eev.effective_end_date >= p_period_start_date /* knadhan */
214      AND  eev.effective_start_date <= p_period_end_date;
215      /*
216      AND  eev.effective_start_date >= p_period_start_date
217      AND  eev.effective_start_date <= p_period_end_date;
218      */
219 CURSOR csr_get_asg_work_pattern(p_assignment_id NUMBER,p_period_start_date DATE,p_period_end_date DATE) IS
220 	SELECT  effective_start_date, effective_end_date, segment10
221 	FROM    per_all_assignments_f  paa,
222 		hr_soft_coding_keyflex kf
223 	WHERE  assignment_id = p_assignment_id
224 	AND  paa.SOFT_CODING_KEYFLEX_ID = kf.SOFT_CODING_KEYFLEX_ID
225 	AND  ((p_period_start_date BETWEEN paa.effective_start_date AND paa.effective_end_date)
226 	   OR
227 	   (p_period_end_date BETWEEN paa.effective_start_date AND paa.effective_end_date)
228 	   OR
229 	   (p_period_start_date < paa.effective_start_date AND p_period_end_date > paa.effective_end_date));
230 
231 
232 CURSOR csr_get_le_work_pattern(p_org_id NUMBER) IS
233 	 SELECT org_information1
234 	 FROM hr_organization_information
235 	 WHERE organization_id = p_org_id
236 	 and org_information_context = 'DK_HOLIDAY_ENTITLEMENT_INFO';
237 
238 BEGIN
239 
240 l_elig_start_date := p_period_start_date;
241 l_elig_end_date := p_period_end_date;
242 l_assignment_id := p_assignment_id;
243 l_org_id := p_org_id;
244 
245 l_le_work_pattern := ' ';
246 l_eligibility_change := 'Y';
247 
248 l_5days := 0;
249 l_6days := 0;
250 
251 l_input_value := 'Holiday Accrual Eligibility';
252 OPEN csr_get_accrual_elig(l_assignment_id,l_elig_start_date ,l_elig_end_date,l_input_value);
253 FETCH csr_get_accrual_elig BULK COLLECT INTO l_elig_record;
254 CLOSE csr_get_accrual_elig;
255 
256 IF l_elig_record.count = 0 THEN
257 	l_wrkp_start_date := l_elig_start_date;
258 	l_wrkp_end_date := l_elig_end_date;
259 
260 	OPEN csr_get_asg_work_pattern(l_assignment_id,l_el_start_date ,l_el_end_date);
261 	FETCH csr_get_asg_work_pattern BULK COLLECT INTO l_wrkp_record;
262 	CLOSE csr_get_asg_work_pattern;
263 
264 	l_wrkp_records := l_wrkp_record.count;
265 
266 	IF l_wrkp_records = 0 THEN
267 		IF l_le_work_pattern = '6DAY' THEN
268 			l_6days := (l_wrkp_end_date - l_wrkp_start_date) + 1;
269 		ELSE
270 			l_5days := (l_wrkp_end_date - l_wrkp_start_date)+ 1;
271 		END IF;
272 		p_5days := l_5days;
273 		p_6days := l_6days;
274 		RETURN -1;
275 	ELSE
276 		FOR l_wrkp_index IN 1 .. l_wrkp_records LOOP
277 			l_wp_start_date := l_wrkp_record(l_wrkp_index).date1;
278 			l_wp_end_date := l_wrkp_record(l_wrkp_index).date2;
279 			l_work_pattern := l_wrkp_record(l_wrkp_index).value;
280 
281 			IF (l_wp_start_date < l_wrkp_start_date) THEN
282 			       l_wp_start_date := l_wrkp_start_date;
283 			END IF;
284 
285 			IF (l_wp_end_date > l_wrkp_end_date) THEN
286 			       l_wp_end_date := l_wrkp_end_date;
287 			END IF;
288 
289 			IF l_work_pattern = '5DAY' THEN
290 				l_5days := l_5days + (l_wp_end_date - l_wp_start_date) + 1;
291 			ELSIF l_work_pattern = '6DAY' THEN
292 				l_6days := l_6days + (l_wp_end_date - l_wp_start_date) + 1;
293 			ELSIF l_le_work_pattern = '6DAY' THEN
294 				l_6days := l_6days + (l_wp_end_date - l_wp_start_date) + 1;
295 			ELSE
296 				l_5days := l_5days + (l_wp_end_date - l_wp_start_date) + 1;
297 			END IF;
298 
299 		END LOOP;
300 	END IF;
301 
302 	p_5days := l_5days;
303 	p_6days := l_6days;
304 	RETURN 1;
305 
306 ELSE
307 	OPEN csr_get_le_work_pattern(l_org_id);
308 	FETCH csr_get_le_work_pattern INTO l_le_work_pattern;
309 	CLOSE csr_get_le_work_pattern;
310 
311 	l_elig_records := l_elig_record.count;
312 
313 	FOR l_elig_index IN 1 .. l_elig_records LOOP
314 		l_el_start_date := l_elig_record(l_elig_index).date1;
315 		l_el_end_date := l_elig_record(l_elig_index).date2;
316 		l_eligible := l_elig_record(l_elig_index).value;
317 
318 		IF l_eligible = 'N' THEN
319 			null;
320 		ELSE
321 
322 		    IF (l_el_start_date < l_elig_start_date) THEN
323 			l_el_start_date := l_elig_start_date;
324 		    END IF;
325 
326 		    IF (l_el_end_date > l_elig_end_date) THEN
327 		       l_el_end_date := l_elig_end_date;
328 		    END IF;
329 
330 		    /* work pattern record*/
331 		    l_wrkp_start_date := l_el_start_date;
332 		    l_wrkp_end_date := l_el_end_date;
333 
334 		    OPEN csr_get_asg_work_pattern(l_assignment_id,l_el_start_date ,l_el_end_date);
335 		    FETCH csr_get_asg_work_pattern BULK COLLECT INTO l_wrkp_record;
336 		    CLOSE csr_get_asg_work_pattern;
337 
338 		    l_wrkp_records := l_wrkp_record.count;
339 
340 
341 		     FOR l_wrkp_index IN 1 .. l_wrkp_records LOOP
342 			    l_wp_start_date := l_wrkp_record(l_wrkp_index).date1;
343 			    l_wp_end_date := l_wrkp_record(l_wrkp_index).date2;
344 			    l_work_pattern := l_wrkp_record(l_wrkp_index).value;
345 
346 			    IF (l_wp_start_date < l_wrkp_start_date) THEN
347 			       l_wp_start_date := l_wrkp_start_date;
348 			    END IF;
349 
350 			    IF (l_wp_end_date > l_wrkp_end_date) THEN
351 			       l_wp_end_date := l_wrkp_end_date;
352 			    END IF;
353 
354 			    IF l_work_pattern = '5DAY' THEN
355 				l_5days := l_5days + (l_wp_end_date - l_wp_start_date) + 1;
356 			    ELSIF l_work_pattern = '6DAY' THEN
357 				l_6days := l_6days + (l_wp_end_date - l_wp_start_date) + 1;
358 			    ELSIF l_le_work_pattern = '6DAY' THEN
359 				l_6days := l_6days + (l_wp_end_date - l_wp_start_date) + 1;
360 			    ELSE
361 				l_5days := l_5days + (l_wp_end_date - l_wp_start_date) + 1;
362 			    END IF;
363 
364 			END LOOP;
365 	    END IF;
366 
367 	END LOOP;
368 	p_5days := l_5days;
369 	p_6days := l_6days;
370 	RETURN 1;
371 END IF;
372 
373 END get_eligible_days;
374 
375 /* Bug Fix 4947637, Added function get_weekdays */
376 FUNCTION get_weekdays(p_period_start_date IN DATE
377 		     ,p_period_end_date   IN DATE
378 		     ,p_work_pattern      IN VARCHAR) RETURN NUMBER IS
379 
380 /* Version 115.8 Bug fix 5185910 */
381 /* Commented to add new logic
382 
383 l_abs_start_date  date;
384 l_abs_end_date    date;
385 l_loop_start_date date;
386 l_days    number;
390 l_index     number;
387 l_start_d number;
388 l_end_d   number;
389 l_work_pattern varchar2(6);
391 l_weekdays  number;
392 l_curr_date date;
393 l_d         number;
394 */
395 
396 
397 /* Bug fix 5185910 , added cursor and variable */
398 /* Version 115.8 Bug fix 5185910 */
399 /* Commented to add new logic
400 CURSOR csr_get_territory IS
401 SELECT value FROM nls_database_parameters
402 WHERE  parameter = 'NLS_TERRITORY';
403 l_territory varchar2(80);
404 
405 begin
406 l_abs_start_date := p_period_start_date;
407 l_abs_end_date := p_period_end_date;
408 l_days := (l_abs_end_date - l_abs_start_date) + 1;
409 l_days := (l_abs_end_date - l_abs_start_date) + 1;
410 l_weekdays := 0;
411 l_curr_date := l_abs_start_date;
412 l_work_pattern := p_work_pattern;
413 */
414 
415 /* Bug fix 5185910 , added fetch statement */
416 /* Version 115.8 Bug fix 5185910 */
417 /* Commented to add new logic
418 OPEN csr_get_territory;
419 FETCH csr_get_territory INTO l_territory;
420 CLOSE csr_get_territory;
421 
422 IF l_work_pattern = '5DAY' then
423 FOR l_index IN 1..l_days
424 loop
425     l_curr_date := l_abs_start_date + (l_index - 1);
426     l_d := to_number(to_char(l_curr_date,'d'));
427     */
428     /* Bug fix 5084425 , Danish Weekends to be considered instead of American weekends
429     In American territory case Sunday is considered as day 1, where as in Denmark monday is
430     to be considered as day 1 of the week */
431     /*IF l_d NOT IN (7,1) then*/
432 
433     /* Bug fix 5185910 commented following if statement
434     IF l_d NOT IN (6,7) then
435 	l_weekdays := l_weekdays +1;
436     END IF;*/
437 
438     /* Bug fix 5185910 , added following logic */
439     /* Version 115.8 Bug fix 5185910 */
440     /* Commented to add new logic
441 
442     IF l_territory = 'DENMARK' THEN
443 	IF l_d NOT IN (6,7) then
444 	    l_weekdays := l_weekdays +1;
445         END IF;
446     ELSE
447 	IF l_d NOT IN (7,1) THEN
448 	    l_weekdays := l_weekdays +1;
449         END IF;
450     END IF;
451 
452 
453 END loop;
454 END if;
455 */
456 
457 /* Version 115.8 Bug fix 5185910 */
458     /* Commented to add new logic
459 IF l_work_pattern = '6DAY' then
460 FOR l_index IN 1..l_days
461 loop
462     l_curr_date := l_abs_start_date + (l_index - 1);
463     l_d := to_number(to_char(l_curr_date,'d'));*/
464     /* Bug fix 5084425 , Danish Weekends to be considered instead of American weekends
465     In American territory case Sunday is considered as day 1, where as in Denmark monday is
466     to be considered as day 1 of the week */
467     /*IF l_d <> 1 then*/
468     /* Bug fix 5185910 commented following if statement
469     IF l_d <> 7 then
470 	l_weekdays := l_weekdays +1;
471     END IF;*/
472 
473     /* Bug fix 5185910 , added following logic */
474     /* Version 115.8 Bug fix 5185910 */
475     /* Commented to add new logic
476     IF l_territory = 'DENMARK' THEN
477 	IF l_d <> 7 then
478 	    l_weekdays := l_weekdays +1;
479         END IF;
480     ELSE
481 	IF l_d <> 1 THEN
482 	    l_weekdays := l_weekdays +1;
483         END IF;
484     END IF;
485 
486 END  loop;
487 END if;
488 */
489 
490 
491 /* Version 115.8 Bug fix 5185910 */
492 /* Following logic is added to determine weekdays */
493 v_st_date date;
494 v_en_date date;
495 v_beg_of_week date;
496 v_end_of_week date;
497 l_weekdays number;
498 v_work_pattern varchar2(20);
499 begin
500 	v_st_date :=p_period_start_date;
501 	v_en_date :=p_period_end_date;
502 	l_weekdays    := 0;
503 	v_work_pattern := p_work_pattern;
504 	if p_period_start_date > p_period_end_date then
505 		return l_weekdays;
506 	end if;
507 	--Determine the Beginning of Week Date for Start Date
508 	--and End of Week Date for End Date
509 	v_beg_of_week := v_st_date - (get_day_of_week(v_st_date)-1);
510 	v_end_of_week  := v_en_date;
511 	if get_day_of_week(v_en_date) NOT IN('1') then
512 		v_end_of_week := v_en_date + (7- get_day_of_week(v_en_date)+1);
513 	end if;
514 	IF v_work_pattern = '5DAY' THEN
515 		--Calculate the Total Week Days @ of 5 per week
516 		l_weekdays := ((v_end_of_week-v_beg_of_week)/7)*5;
517 		--Adjust the Total Week Days by subtracting
518 		--No of Days before the Start Date
519 		if (v_st_date > (v_beg_of_week+1)) then
520 			l_weekdays := l_weekdays - (v_st_date - (v_beg_of_week+1)) ;
521 		end if;
522 		if v_end_of_week <> v_en_date then
523 			v_end_of_week := v_end_of_week -2;
524 		else
525 			if v_st_date = v_en_date then
526 				l_weekdays := 0;
527 			end if;
528 		end if;
529 		--Adjust the Total Week Days by subtracting
530 		--No of Days After the End Date
531 		if (v_end_of_week - v_en_date) >= 0 then
532 			l_weekdays := l_weekdays - (v_end_of_week - v_en_date) ;
533 		end if;
534 
535 	ELSE
536 		--Calculate the Total Week Days @ of 6 per week
537 		l_weekdays := ((v_end_of_week-v_beg_of_week)/7)*6;
538 		--Adjust the Total Week Days by subtracting
539 		--No of Days before the Start Date
540 		if (v_st_date > (v_beg_of_week+1)) then
541 			l_weekdays := l_weekdays - (v_st_date - (v_beg_of_week+1)) ;
542 		end if;
543 		if v_end_of_week <> v_en_date then
544 			v_end_of_week := v_end_of_week -1;
545 		else
546 			if v_st_date = v_en_date then
547 				l_weekdays := 0;
548 			end if;
549 		end if;
550 		--Adjust the Total Week Days by subtracting
551 		--No of Days After the End Date
552 		if (v_end_of_week - v_en_date) >= 0 then
553 			l_weekdays := l_weekdays - (v_end_of_week - v_en_date) ;
554 		end if;
555 	END IF;
556 
557 	return (l_weekdays);
558 
559 
560 END get_weekdays;
561 
562 /* Bug fix 5185910 , added function get_day_of_week
563 This Function returns the day of the week.
564 Sunday is considered to be the first day of the week*/
565 FUNCTION  get_day_of_week(p_date DATE) RETURN NUMBER IS
566 l_reference_date date:=to_date('01/01/1984','DD/MM/YYYY');
567 v_index number;
568 
569 BEGIN
570 v_index := abs(p_date - l_reference_date);
571 v_index := mod(v_index,7);
572 v_index := v_index + 1;
573 RETURN v_index;
574 
575 END get_day_of_week;
576 
577 /* Added for Public Holiday Pay */
578 FUNCTION get_pub_hol_pay_details(p_assignment_id IN NUMBER
579                                     ,p_organization_id IN NUMBER
580                                     ,p_effective_date IN DATE
581                                     ,p_sh_payment_rate OUT NOCOPY NUMBER)
582 
583 RETURN NUMBER IS
584 
585         l_sh_payment_rate NUMBER;
586         l_sh_payment_percentage NUMBER;
587 
588         CURSOR csr_le_holidaypay(csr_organization_id IN NUMBER) IS
589         SELECT hoi.org_information6,
590                hoi.org_information7
591         FROM hr_organization_information hoi
592         WHERE organization_id = csr_organization_id
593         AND org_information_context = 'DK_HOLIDAY_ENTITLEMENT_INFO';
594 
595         CURSOR csr_asg_holidaypay IS
596         SELECT scl.segment19
597               ,scl.segment20
598         FROM hr_soft_coding_keyflex scl,
599              per_all_assignments_f paaf
600         WHERE scl.soft_coding_keyflex_id = paaf.soft_coding_keyflex_id
601         AND paaf.assignment_id = p_assignment_id
602         AND p_effective_date between paaf.effective_start_date and effective_end_date;
603 
604 BEGIN
605 
606                 FOR csr_asg_val IN csr_asg_holidaypay
607                 LOOP
608                          l_sh_payment_rate := csr_asg_val.segment19;
609                          l_sh_payment_percentage := csr_asg_val.segment20;
610                 END LOOP;
611 
612              IF l_sh_payment_rate IS NULL OR l_sh_payment_percentage IS NULL THEN
613 
614                 FOR csr_le_val IN csr_le_holidaypay(p_organization_id)
615                 LOOP
616                  IF l_sh_payment_rate IS NULL THEN
617                         l_sh_payment_rate := csr_le_val.org_information6;
618                  END IF;
619                  IF l_sh_payment_percentage IS NULL THEN
620                         l_sh_payment_percentage := csr_le_val.org_information7;
621                  END IF;
622 
623                 END LOOP;
624              END IF;
625 
626 	      p_sh_payment_rate := l_sh_payment_rate;
627 
628         RETURN l_sh_payment_percentage;
629 
630 END get_pub_hol_pay_details;
631 
632 /*9495504 abraghun*/
633 FUNCTION get_max_carryover_days(p_assignment_id IN NUMBER
634                                ,p_organization_id IN NUMBER
635                                ,p_effective_date IN DATE
636 			       ,p_carryover_limit IN NUMBER) RETURN NUMBER is
637 
638   ----Assignment setting----
639   CURSOR csr_assignment_carryover(c_assignment_id number) IS
640   SELECT
641     aei_information1 asg_max_carryover
642   FROM
643     per_assignment_extra_info
644   WHERE assignment_id = c_assignment_id
645     AND aei_information_category = 'DK_HOLIDAY_ENTITLEMENT';
646 
647   ----Legal Employer setting----
648   CURSOR csr_organization_carryover(c_organization_id number) IS
649   SELECT
650     org_information9 org_max_carryover
651   FROM
652     hr_organization_information
653   WHERE organization_id = c_organization_id
654     AND org_information_context = 'DK_HOLIDAY_ENTITLEMENT_INFO';
655 
656   ----Global Setting----
657   /*CURSOR csr_global_carryover(c_effective_date DATE) IS
658   SELECT
659     global_value gbl_max_carryover
660   FROM
661     ff_globals_f
662   WHERE global_name = 'DK_HOLIDAY_MAX_CARRYOVER_DAYS'
663     AND legislation_code = 'DK'
664     AND c_effective_date BETWEEN effective_start_date AND effective_end_date;
665 
666     l_gbl_max_carryover NUMBER;*/
667     l_org_max_carryover NUMBER;
668     l_asg_max_carryover NUMBER;
669     l_max_carryover     NUMBER;
670 
671 BEGIN
672 
673   OPEN csr_assignment_carryover(p_assignment_id);
674   FETCH csr_assignment_carryover INTO l_asg_max_carryover;
675   CLOSE csr_assignment_carryover;
676 
677   OPEN csr_organization_carryover(p_organization_id);
678   FETCH csr_organization_carryover INTO l_org_max_carryover;
679   CLOSE csr_organization_carryover;
680 
681   /*OPEN csr_global_carryover(p_effective_date);
682   FETCH csr_global_carryover INTO l_gbl_max_carryover;
683   CLOSE csr_global_carryover;*/
684 
685   /* Set Global Value to Zero if not set */
686   --l_gbl_max_carryover := NVL(l_gbl_max_carryover,0);
687 
688   /* 9578958 fix Modified the logic not to use global value */
689   IF l_asg_max_carryover IS NOT NULL THEN
690     l_max_carryover := LEAST(l_asg_max_carryover,p_carryover_limit);
691   ELSIF l_org_max_carryover IS NOT NULL THEN
692     l_max_carryover := LEAST(l_org_max_carryover,p_carryover_limit);
693   ELSE
694     l_max_carryover := 0; -- Default carryover is zero
695   END IF;
696 
697   RETURN l_max_carryover;
698 
699 END get_max_carryover_days;
700 
701 END PAY_DK_HOLIDAY_PAY_PKG;