DBA Data[Home] [Help]

PACKAGE BODY: APPS.PAY_DK_SICKPAY_PKG

Source


1 PACKAGE BODY pay_dk_sickpay_pkg AS
2 /* $Header: pydksckp.pkb 120.0 2006/03/23 04:03:16 knelli noship $ */
3 
4 function get_worked_hours(
5 	   	          p_assignment_id IN number
6 			 ,p_period_start_date IN date
7 			 ,p_period_end_date IN date)RETURN NUMBER is
8 
9 l_assignment_id NUMBER;
10 l_period_start_date DATE;
11 l_period_end_date DATE;
12 l_period_start_time varchar2(5);
13 l_period_end_time varchar2(5);
14 
15 l_input_value varchar2(30);
16 l_screen_value varchar2(30);
17 l_rec_start_date l_type;
18 l_rec_end_date l_type;
19 l_rec_start_time l_type;
20 l_rec_end_time l_type;
21 
22 l_records number;
23 l_absent_hours number;
24 l_return number;
25 l_duration number;
26 l_days_or_hours varchar2(2);
27 l_include_event varchar2(2);
28 l_hours_in_period number;
29 l_worked_hours number;
30 
31 l_start_date date;
32 l_end_date date;
33 l_start_time varchar2(10);
34 l_end_time varchar2(10);
35 
36 
37 CURSOR csr_get_details(p_period_start_date DATE,p_period_end_date DATE,p_assignment_id NUMBER,p_input_value VARCHAR2) is
38   SELECT eev.screen_entry_value  screen_entry_value
39   FROM   per_all_assignments_f      asg
40         ,per_all_people_f           per
41         ,pay_element_links_f        el
42         ,pay_element_types_f        et
43         ,pay_input_values_f         iv
44         ,pay_element_entries_f      ee
45         ,pay_element_entry_values_f eev
46    WHERE  asg.assignment_id     = p_assignment_id
47      AND  per.person_id         = asg.person_id
48      AND  et.element_name       IN ('Absent Sick','Absent Holiday')
49      AND  et.legislation_code   = 'DK'
50      AND  iv.element_type_id    = et.element_type_id
51      AND  iv.name               = p_input_value
52      AND  el.business_group_id  = per.business_group_id
53      AND  el.element_type_id    = et.element_type_id
54      AND  ee.element_link_id    = el.element_link_id
55      and  ee.assignment_id      = asg.assignment_id
56      AND  eev.element_entry_id  = ee.element_entry_id
57      AND  eev.input_value_id    = iv.input_value_id
58      AND  ((p_period_start_date BETWEEN ee.effective_start_date AND ee.effective_end_date)
59            OR
60 	   (p_period_end_date BETWEEN ee.effective_start_date AND ee.effective_end_date)
61 	   OR
62 	   (p_period_start_date < ee.effective_start_date AND p_period_end_date > ee.effective_end_date))
63     ORDER BY ee.element_entry_id;
64 
65 
66 begin
67 
68 l_period_start_date := p_period_start_date;
69 l_period_end_date := p_period_end_date;
70 l_assignment_id := p_assignment_id;
71 
72 l_period_start_time := '00.00';
73 l_period_end_time := '23.59';
74 
75 l_hours_in_period :=0;
76 l_worked_hours :=0;
77 
78 hr_utility.set_location('get worked Hours function call',10);
79 
80 l_input_value := 'Start Date';
81 OPEN csr_get_details(l_period_start_date ,l_period_end_date ,l_assignment_id ,l_input_value );
82 FETCH csr_get_details BULK COLLECT INTO l_rec_start_date;
83 CLOSE csr_get_details;
84 
85 l_input_value := 'End Date';
86 OPEN csr_get_details(l_period_start_date ,l_period_end_date ,l_assignment_id ,l_input_value );
87 FETCH csr_get_details BULK COLLECT INTO l_rec_end_date;
88 CLOSE csr_get_details;
89 
90 l_input_value := 'Start Time';
91 OPEN csr_get_details(l_period_start_date ,l_period_end_date ,l_assignment_id ,l_input_value );
92 FETCH csr_get_details BULK COLLECT INTO l_rec_start_time;
93 CLOSE csr_get_details;
94 
95 l_input_value := 'End Time';
96 OPEN csr_get_details(l_period_start_date ,l_period_end_date ,l_assignment_id ,l_input_value );
97 FETCH csr_get_details BULK COLLECT INTO l_rec_end_time;
98 CLOSE csr_get_details;
99 
100 l_records := l_rec_start_date.count;
101 l_absent_hours := 0;
102 l_return := -1;
103 l_duration := -1;
104 l_days_or_hours := 'H';
105 l_include_event := 'Y';
106 
107 FOR l_index IN 1 .. l_records LOOP
108     l_start_date := to_date(substr(l_rec_start_date(l_index),1,10),'YYYY/MM/DD');
109     l_end_date := to_date(substr(l_rec_end_date(l_index),1,10),'YYYY/MM/DD');
110     l_start_time := l_rec_start_time(l_index);
111     l_end_time := l_rec_end_time(l_index);
112 
113     IF (l_start_date < l_period_start_date) then
114        l_start_date := l_period_start_date;
115     END IF;
116 
117     IF (l_end_date > l_period_end_date) then
118        l_end_date := l_period_end_date;
119     END IF;
120 
121     l_return := hr_loc_work_schedule.calc_sch_based_dur(
122 			      				p_assignment_id => l_assignment_id,
123 			       				p_days_or_hours => l_days_or_hours,
124 			       				p_include_event => l_include_event,
125                                				p_date_start    => l_start_date,
126                                				p_date_end      => l_end_date,
127                                				p_time_start    => l_start_time,
128                                				p_time_end      => l_end_time,
129                                				p_duration      => l_duration);
130 
131 	/*  Handled availability of work schedule for Sickness Report */
132 	IF l_return <> 0 then
133 	   l_worked_hours := -1;
134 	ELSE
135            l_absent_hours := l_absent_hours + l_duration;
136 	END if;
137 END LOOP;
138 IF l_worked_hours = -1 then
139    RETURN l_worked_hours;
140 END IF;
141 /*  Handled availability of work schedule for Sickness Report */
142 
143 l_duration := -1;
144 l_include_event := 'Y';
145 
146 l_return := hr_loc_work_schedule.calc_sch_based_dur(
147 			      			    p_assignment_id => l_assignment_id,
148 			       			    p_days_or_hours => l_days_or_hours,
149                                			    p_include_event => l_include_event,
150 			       			    p_date_start    => l_period_start_date,
151                                			    p_date_end      => l_period_end_date,
152                                			    p_time_start    => l_period_start_time,
153                                			    p_time_end      => l_period_end_time,
154                                			    p_duration      => l_duration);
155 
156    l_hours_in_period := l_duration;
157    l_worked_hours := l_hours_in_period - l_absent_hours;
158 
159 
160 RETURN l_worked_hours;
161 END get_worked_hours;
162 
163 
164 /*Bug 5047360 fix- Passing p_abs_start_time and p_abs_end_time*/
165 FUNCTION get_sickness_dur_details
166 	 (p_assignment_id               IN      NUMBER
167 	 ,p_effective_date              IN      DATE
168 	 ,p_abs_start_date              IN      DATE
169 	 ,p_abs_end_date                IN      DATE
170 	 ,p_abs_start_time              IN      VARCHAR2 --Bug 5047360 fix
171 	 ,p_abs_end_time                IN      VARCHAR2 --Bug 5047360 fix
172 	 ,p_start_date                  OUT NOCOPY DATE
173 	 ,p_end_date                    OUT NOCOPY DATE
174 	 ,p_sick_days                   OUT NOCOPY NUMBER
175 	 ,p_sick_hours                  OUT NOCOPY NUMBER
176 	 ) RETURN NUMBER IS
177   CURSOR get_details(p_assignment_id NUMBER , p_effective_date  DATE ) IS
178    SELECT ee.element_entry_id element_entry_id
179           , eev1.screen_entry_value  screen_entry_value
180           , iv1.name
181    FROM   per_all_assignments_f      asg1
182          ,per_all_assignments_f      asg2
183          ,per_all_people_f           per
184          ,pay_element_links_f        el
185          ,pay_element_types_f        et
186          ,pay_input_values_f         iv1
187          ,pay_element_entries_f      ee
188          ,pay_element_entry_values_f eev1
189    WHERE  asg1.assignment_id    = p_assignment_id
190      AND p_effective_date BETWEEN asg1.effective_start_date AND asg1.effective_end_date
191      AND p_effective_date BETWEEN asg2.effective_start_date AND asg2.effective_end_date
192      AND  per.person_id         = asg1.person_id
193      AND  asg2.person_id        = per.person_id
194      AND  et.element_name       = 'Override Sickness Duration'
195      AND  et.legislation_code   = 'DK'
196      AND  iv1.element_type_id   = et.element_type_id
197      /*Bug 5047360 fix */
198     /* AND  iv1.name            in ('Start Date', 'End Date', 'Sick Days', 'Sick Hours')*/
199      AND  iv1.name              in ('Start Date', 'End Date', 'Sick Days','Start Time','End Time', 'Sick Hours')
200      AND  el.business_group_id  = per.business_group_id
201      AND  el.element_type_id    = et.element_type_id
202      AND  ee.assignment_id      = asg2.assignment_id
203      AND  ee.element_link_id    = el.element_link_id
204      AND  eev1.element_entry_id = ee.element_entry_id
205      AND  eev1.input_value_id   = iv1.input_value_id
206      AND  p_effective_date BETWEEN ee.effective_start_date AND ee.effective_end_date
207      AND  p_effective_date BETWEEN eev1.effective_start_date AND eev1.effective_end_date
208      ORDER BY ee.element_entry_id, DECODE(iv1.name, 'Start Date', 1,'End Date', 2, 'Sick Days', 3,'Start Time', 4,'End Time', 5,'Sick Hours', 6) ;
209   --
210   TYPE l_record is record (eeid    pay_element_entries_f.element_entry_id%TYPE,
211                            eevalue pay_element_entry_values_f.screen_entry_value%TYPE,
212                            eename  pay_input_values_f.name%TYPE );
213   l_rec l_record;
214   TYPE l_table  is table of l_record index by BINARY_INTEGER;
215   l_tab l_table;
216 
217   l_start_date date;
218   l_end_date date;
219   l_sick_hours number;
220   l_sick_days number;
221   l_counter number ;
222   l_bool_match boolean;
223   l_num_match number;
224   /*Bug 5047360 fix */
225   l_start_time pay_element_entry_values_f.screen_entry_value%TYPE;
226   l_end_time pay_element_entry_values_f.screen_entry_value%TYPE;
227   --
228  BEGIN
229   --
230   l_counter := 1;
231   l_bool_match := FALSE;
232 
233   -- Open cursor to fetch all screen entry values of Sickness Duration element.
234   OPEN  get_details(p_assignment_id , p_effective_date );
235   -- Assign the values to a table type
236   FETCH get_details BULK COLLECT INTO l_tab;
237   CLOSE get_details;
238 
239   -- Loop through each values for processing.
240   FOR l_cur in 1..l_tab.count LOOP
241         -- Assign values to local variables.
242         IF l_tab(l_cur).eename = 'Start Date' THEN
243            l_start_date := to_date(l_tab(l_cur).eevalue,'yyyy/mm/dd hh24:mi:ss') ;
244         elsif l_tab(l_cur).eename = 'End Date' THEN
245            l_end_date := to_date(l_tab(l_cur).eevalue,'yyyy/mm/dd hh24:mi:ss');
246         elsif l_tab(l_cur).eename = 'Sick Days' THEN
247            l_sick_days := l_tab(l_cur).eevalue;
248 	  /*Bug 5047360 fix */
249          elsif l_tab(l_cur).eename = 'Start Time' THEN
250            l_start_time := NVL(l_tab(l_cur).eevalue,'0');
251         elsif l_tab(l_cur).eename = 'End Time' THEN
252            l_end_time := NVL(l_tab(l_cur).eevalue,'0');
253         elsif l_tab(l_cur).eename = 'Sick Hours' THEN
254            l_sick_hours := l_tab(l_cur).eevalue;
255         end if;
256         -- Check no. of input values of override element is 4
257         --IF l_counter < 4 then
258 	  /*Bug 5047360 fix */
259          -- Check no. of input values of override element is 6
260 	  IF l_counter < 6 then
261            l_counter := l_counter + 1;
262         else
263            -- Check override element's start and end date matches with Absent element.
264            --if l_start_date = p_abs_start_date and l_end_date = p_abs_end_date then
265             /*Bug 5047360 fix-Check override element's start date,end date,start time and end time
266 	      matches with Absent element */
267             IF l_start_date = p_abs_start_date AND  l_end_date = p_abs_end_date
268             AND l_start_time = p_abs_start_time AND l_end_time  = p_abs_end_time THEN
269               -- Multiple entry exists with same start and end date
270               IF l_bool_match THEN
271                  p_start_date := null;
272                  p_end_date := null;
273                  p_sick_days := null;
274                  p_sick_hours := null;
275                  return -1;
276               -- Exact match found
277               ELSE
278                  l_bool_match := True;
279               END IF;
280               -- Assign input values to output variables.
281               p_start_date := l_start_date;
282               p_end_date := l_end_date;
283               p_sick_days := l_sick_days;
284               p_sick_hours := l_sick_hours;
285            end if;
286            l_counter := 1;
287         end if;
288   END LOOP;
289 
290   -- Match found successfully
291   IF p_start_date is not null then
292      RETURN 1;
293   -- Override element exists but date doesnt match.
294   /*Bug 5047360 fix- commenting the else if part*/
295   /*elsif p_start_date is null and l_tab.count > 0 then
296      RETURN 2;*/
297   -- No override element attached
298   else
299      RETURN 0;
300   end if;
301   --
302  END get_sickness_dur_details;
303 
304 
305    FUNCTION get_le_sickpay_details
306 	(p_effective_date IN DATE,
307 	 p_org_id IN NUMBER,
308 	 p_section27 OUT NOCOPY VARCHAR2
309 	 ) RETURN NUMBER is
310 
311 	 /* Modified cursor */
312 	 CURSOR csr_get_sickpay_defaults(p_effective_date DATE, p_org_id NUMBER) is
313 	 SELECT org_information1
314 	 FROM hr_organization_information
318 	 order by org_information2;
315 	 WHERE organization_id = p_org_id
316 	 and org_information_context = 'DK_SICKPAY_DEFAULTS'
317 	 AND p_effective_date BETWEEN fnd_date.canonical_to_date( org_information2) and fnd_date.canonical_to_date( org_information3)
319 	 TYPE l_record is record (sec_27 varchar2(1));
320 	 l_rec l_record;
321 	 TYPE l_table  is table of l_record index by BINARY_INTEGER;
322 	 l_tab l_table;
323 	 begin
324 	 OPEN csr_get_sickpay_defaults(p_effective_date,p_org_id);
325 	 FETCH csr_get_sickpay_defaults BULK COLLECT INTO l_tab;
326 	 CLOSE csr_get_sickpay_defaults;
327 	 IF l_tab.COUNT = 1 then
328 	     p_section27 := l_tab(1).sec_27;
329 	     RETURN 1;
330 	 Elsif l_tab.COUNT = 0 then
331 	     RETURN 0;
332 	 else
333 	     RETURN -1;
334 	 END if;
335  END get_le_sickpay_details;
336 
337 /*Bug 5020916 fix - Fucntion to get the section 28 value based on the payroll processing start date*/
338 FUNCTION get_section28_details
339      (p_assignment_id IN NUMBER
340      ,p_effective_date IN DATE --payroll processing start date
341      ) RETURN VARCHAR2 IS
342 CURSOR csr_section28 IS
343 SELECT
344     NVL(hsck.segment18,'N')
345 FROM
346 	per_all_assignments_f paaf
347 	,hr_soft_coding_keyflex hsck
348 WHERE
349 	paaf.assignment_id = p_assignment_id
350 	AND p_effective_date BETWEEN paaf.effective_start_date AND paaf.effective_end_date
351 	AND hsck.soft_coding_keyflex_id = paaf.soft_coding_keyflex_id;
352 
353 l_section28_reg hr_soft_coding_keyflex.segment18%TYPE ;
354 
355 BEGIN
356 	OPEN csr_section28;
357 	FETCH csr_section28 INTO l_section28_reg;
358 	CLOSE csr_section28;
359 	RETURN l_section28_reg;
360 END get_section28_details;
361 
362 
363 /* Bug fix 5045710, added function get_worked_days */
364 FUNCTION get_worked_days(p_assignment_id     IN number
365 			,p_period_start_date IN date
366 			,p_period_end_date   IN date)RETURN NUMBER is
367 
368 l_assignment_id NUMBER;
369 l_period_start_date DATE;
370 l_period_end_date DATE;
371 l_period_start_time varchar2(5);
372 l_period_end_time varchar2(5);
373 
374 l_input_value varchar2(30);
375 l_screen_value varchar2(30);
376 l_rec_start_date l_type;
377 l_rec_end_date l_type;
378 l_rec_start_time l_type;
379 l_rec_end_time l_type;
380 
381 l_records number;
382 l_absent_days number;
383 l_return number;
384 l_duration number;
385 l_days_or_hours varchar2(2);
386 l_include_event varchar2(2);
387 l_days_in_period number;
388 l_worked_days number;
389 
390 l_start_date date;
391 l_end_date date;
392 l_start_time varchar2(10);
393 l_end_time varchar2(10);
394 
395 
396 CURSOR csr_get_details(p_period_start_date DATE,p_period_end_date DATE,p_assignment_id NUMBER,p_input_value VARCHAR2) is
397   SELECT eev.screen_entry_value  screen_entry_value
398   FROM   per_all_assignments_f      asg
399         ,per_all_people_f           per
400         ,pay_element_links_f        el
401         ,pay_element_types_f        et
402         ,pay_input_values_f         iv
403         ,pay_element_entries_f      ee
404         ,pay_element_entry_values_f eev
405    WHERE  asg.assignment_id     = p_assignment_id
406      AND  per.person_id         = asg.person_id
407      AND  et.element_name       IN ('Absent Sick','Absent Holiday')
408      AND  et.legislation_code   = 'DK'
409      AND  iv.element_type_id    = et.element_type_id
410      AND  iv.name               = p_input_value
411      AND  el.business_group_id  = per.business_group_id
412      AND  el.element_type_id    = et.element_type_id
413      AND  ee.element_link_id    = el.element_link_id
414      and  ee.assignment_id      = asg.assignment_id
415      AND  eev.element_entry_id  = ee.element_entry_id
416      AND  eev.input_value_id    = iv.input_value_id
417      AND  ((p_period_start_date BETWEEN ee.effective_start_date AND ee.effective_end_date)
418            OR
419 	   (p_period_end_date BETWEEN ee.effective_start_date AND ee.effective_end_date)
420 	   OR
421 	   (p_period_start_date < ee.effective_start_date AND p_period_end_date > ee.effective_end_date))
422     ORDER BY ee.element_entry_id;
423 
424 
425 begin
426 
427 l_period_start_date := p_period_start_date;
428 l_period_end_date := p_period_end_date;
429 l_assignment_id := p_assignment_id;
430 
431 l_period_start_time := '00.00';
432 l_period_end_time := '23.59';
433 
434 l_days_in_period :=0;
435 l_worked_days :=0;
436 
437 l_input_value := 'Start Date';
438 OPEN csr_get_details(l_period_start_date ,l_period_end_date ,l_assignment_id ,l_input_value );
439 FETCH csr_get_details BULK COLLECT INTO l_rec_start_date;
440 CLOSE csr_get_details;
441 
442 l_input_value := 'End Date';
443 OPEN csr_get_details(l_period_start_date ,l_period_end_date ,l_assignment_id ,l_input_value );
444 FETCH csr_get_details BULK COLLECT INTO l_rec_end_date;
445 CLOSE csr_get_details;
446 
447 l_input_value := 'Start Time';
448 OPEN csr_get_details(l_period_start_date ,l_period_end_date ,l_assignment_id ,l_input_value );
449 FETCH csr_get_details BULK COLLECT INTO l_rec_start_time;
450 CLOSE csr_get_details;
451 
452 l_input_value := 'End Time';
453 OPEN csr_get_details(l_period_start_date ,l_period_end_date ,l_assignment_id ,l_input_value );
454 FETCH csr_get_details BULK COLLECT INTO l_rec_end_time;
455 CLOSE csr_get_details;
456 
457 l_records := l_rec_start_date.count;
458 l_absent_days := 0;
459 l_return := -1;
460 l_duration := -1;
461 l_days_or_hours := 'D';
462 l_include_event := 'N';
463 
464 FOR l_index IN 1 .. l_records LOOP
465     l_start_date := to_date(substr(l_rec_start_date(l_index),1,10),'YYYY/MM/DD');
469     l_end_time := '23.59';
466     l_end_date := to_date(substr(l_rec_end_date(l_index),1,10),'YYYY/MM/DD');
467 
468     l_start_time := '00.00';
470 
471     IF (l_start_date < l_period_start_date) then
472        l_start_date := l_period_start_date;
473     END IF;
474 
475     IF (l_end_date > l_period_end_date) then
476        l_end_date := l_period_end_date;
477     END IF;
478 
479     l_duration := -1;
480     l_return := hr_loc_work_schedule.calc_sch_based_dur(
481 			      				p_assignment_id => l_assignment_id,
482 			       				p_days_or_hours => l_days_or_hours,
483 			       				p_include_event => l_include_event,
484                                				p_date_start    => l_start_date,
485                                				p_date_end      => l_end_date,
486                                				p_time_start    => l_start_time,
487                                				p_time_end      => l_end_time,
488                                				p_duration      => l_duration);
489 
490 	/*  Handled availability of work schedule for Sickness Report */
491 	IF l_return <> 0 then
492 	   l_worked_days := -1;
493 	ELSE
494            l_absent_days := l_absent_days + l_duration;
495 	END if;
496 END LOOP;
497 IF l_worked_days = -1 then
498    RETURN l_worked_days;
499 END IF;
500 /*  Handled availability of work schedule for Sickness Report */
501 
502 l_duration := -1;
503 l_include_event := 'Y';
504 l_days_or_hours := 'D';
505 
506 l_return := hr_loc_work_schedule.calc_sch_based_dur(
507 			      			    p_assignment_id => l_assignment_id,
508 			       			    p_days_or_hours => l_days_or_hours,
509                                			    p_include_event => l_include_event,
510 			       			    p_date_start    => l_period_start_date,
511                                			    p_date_end      => l_period_end_date,
512                                			    p_time_start    => l_period_start_time,
513                                			    p_time_end      => l_period_end_time,
514                                			    p_duration      => l_duration);
515 
516    l_days_in_period := l_duration;
517    l_worked_days := l_days_in_period - l_absent_days;
518 
519 RETURN l_worked_days;
520 
521 
522 END get_worked_days;
523 
524 
525 FUNCTION get_worked_hours_flag(p_assignment_id      IN number
526 			      ,p_worked_days_limit  IN number
527 			      ,p_worked_hours_limit IN number
528 			      ,p_period_end_date    IN date) RETURN varchar2 is
529 
530 l_assignment_id NUMBER;
531 l_worked_days_limit NUMBER;
532 l_worked_hours_limit NUMBER;
533 l_period_start_date DATE;
534 l_period_end_date DATE;
535 l_worked_hours number;
536 l_worked_days number;
537 l_total_worked_hours number;
538 l_total_worked_days number;
539 l_return varchar2(2);
540 
541 begin
542 
543 l_assignment_id := p_assignment_id;
544 l_worked_days_limit := p_worked_days_limit;
545 l_worked_hours_limit := p_worked_hours_limit;
546 l_period_end_date :=  p_period_end_date - 1;
547 l_period_start_date := p_period_end_date - l_worked_days_limit;
548 
549 l_total_worked_days := -1;
550 l_total_worked_hours := -1;
551 l_worked_hours := -1;
552 l_worked_days := -1;
553 l_return := 'N';
554 
555 l_total_worked_hours := get_worked_hours(
556 	   	                        l_assignment_id
557 			               ,l_period_start_date
558 			               ,l_period_end_date);
559 
560 l_total_worked_days := get_worked_days(
561 	   	                      l_assignment_id
562 			             ,l_period_start_date
563 			             ,l_period_end_date);
564 /* reopned bug fix 5045710, following statement caused problem, which is not required
565 l_total_worked_days := l_total_worked_days - 1;
566 */
567 
568 /* reopned bug fix 5045710, following conditions corrected
569 IF l_worked_hours > l_worked_hours_limit THEN
570    l_return := 'Y';
571    RETURN l_return;
572 ELSIF l_total_worked_days >= l_worked_days_limit AND l_worked_hours < l_worked_hours_limit THEN
573    l_return := 'N';
574    RETURN l_return;
575 END IF;
576 */
577 
578 IF l_total_worked_hours >= l_worked_hours_limit THEN
579    l_return := 'Y';
580    RETURN l_return;
581 ELSIF l_total_worked_days >= l_worked_days_limit AND l_total_worked_hours < l_worked_hours_limit THEN
582    l_return := 'N';
583    RETURN l_return;
584 END IF;
585 
586 l_period_end_date := l_period_start_date - 1;
587 l_period_start_date := l_period_start_date - (l_worked_days_limit - l_total_worked_days);
588 
589 WHILE (l_total_worked_hours < l_worked_hours_limit AND l_total_worked_days < l_worked_days_limit)
590 LOOP
591 
592 	 l_worked_hours := get_worked_hours(
593 	   	                           l_assignment_id
594 			                  ,l_period_start_date
595 			                  ,l_period_end_date);
596 	l_total_worked_hours := l_total_worked_hours + l_worked_hours;
597 
598 	l_worked_days := get_worked_days(
599 	   	                        l_assignment_id
600 			               ,l_period_start_date
601 			               ,l_period_end_date);
602 	l_total_worked_days := l_total_worked_days + l_worked_days;
603 
604 	l_period_end_date := l_period_start_date - 1;
605 	l_period_start_date := l_period_start_date - (l_worked_days_limit - l_total_worked_days);
606 
607 END LOOP;
608 
609 IF l_total_worked_hours > l_worked_hours_limit THEN
610    l_return := 'Y';
611 ELSE
612    l_return := 'N';
613 END IF;
614 
615 RETURN l_return;
616 
617 END get_worked_hours_flag;
618 
619 END pay_dk_sickpay_pkg;