DBA Data[Home] [Help]

PACKAGE BODY: APPS.PAY_NO_ABS_VALIDATION

Source


1 PACKAGE BODY PAY_NO_ABS_VALIDATION AS
2 /* $Header: pynoabsval.pkb 120.3.12020000.8 2012/08/28 09:02:18 nkjaladi ship $ */
3 l_glb_overlap_chk_done VARCHAR2(1); --#8510300
4 l_glb_absence_attendance_id NUMBER := NULL; --#8510300/14542232
5 --14073252 Starts
6 -- Function used to populate default value in NO_SC_OVERRIDE Org Developer DFF.
7 FUNCTION get_default_rule_value(p_rule           IN VARCHAR2
8                                ,p_effective_date IN DATE)
9 RETURN NUMBER IS
10 
11   CURSOR csr_default_rule_value(c_rule IN VARCHAR2
12                                ,c_date IN DATE) IS
13   SELECT to_number(NVL(ucf.value,0)) DefaultValue
14   FROM    pay_user_column_instances_f ucf
15          ,pay_user_columns uc
16          ,pay_user_rows_f ur
17          ,pay_user_tables ut
18   WHERE   ut.legislation_code = 'NO'
19   AND     ut.user_table_name = 'Self Certification Rules'
20   AND     ur.row_low_range_or_name = c_rule
21   AND     ur.legislation_code = 'NO'
22   AND     ur.user_table_id = ut.user_table_id
23   AND     c_date BETWEEN ur.effective_start_date
24                  AND     ur.effective_end_date
25   AND     uc.user_column_name='Default'
26   AND     uc.legislation_code = 'NO'
27   AND     uc.user_table_id = ut.user_table_id
28   AND     ur.row_low_range_or_name = p_rule
29   AND     ucf.legislation_code = 'NO'
30   AND     ucf.user_row_id = ur.user_row_id
31   AND     ucf.user_column_id = uc.user_column_id
32   AND     c_date BETWEEN ucf.effective_start_date
33                  AND     ucf.effective_end_date;
34 
35   r_default_rule_value csr_default_rule_value%ROWTYPE;
36 
37   BEGIN
38     OPEN  csr_default_rule_value(P_RULE,P_EFFECTIVE_DATE);
39     FETCH csr_default_rule_value INTO r_default_rule_value;
40     CLOSE csr_default_rule_value;
41 
42    RETURN r_default_rule_value.DefaultValue;
43 
44 END get_default_rule_value;
45   -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --+
46 FUNCTION get_rule_value(p_rule           IN VARCHAR2
47                        ,p_person_id      IN NUMBER
48                        ,p_effective_date IN DATE)
49 RETURN NUMBER IS
50 
51   CURSOR csr_default_rule_values(c_rule IN VARCHAR2
52                                 ,c_date IN DATE) IS
53   SELECT max (decode (uc.user_column_name
54                       ,'Default'
55                       ,ucf.value
56                       ,0)) DefaultValue
57          ,max (decode (uc.user_column_name
58                       ,'Minimum'
59                       ,ucf.value
60                       ,0)) MinValue
61          ,max (decode (uc.user_column_name
62                       ,'Maximum'
63                       ,ucf.value
64                       ,0)) MaxValue
65   FROM    pay_user_column_instances_f ucf
66          ,pay_user_columns uc
67          ,pay_user_rows_f ur
68          ,pay_user_tables ut
69   WHERE   ut.legislation_code = 'NO'
70   AND     ut.user_table_name = 'Self Certification Rules'
71   AND     ur.row_low_range_or_name = c_rule
72   AND     ur.legislation_code = 'NO'
73   AND     ur.user_table_id = ut.user_table_id
74   AND     c_date BETWEEN ur.effective_start_date
75                  AND     ur.effective_end_date
76   AND     uc.legislation_code = 'NO'
77   AND     uc.user_table_id = ut.user_table_id
78   AND     ucf.legislation_code = 'NO'
79   AND     ucf.user_row_id = ur.user_row_id
80   AND     ucf.user_column_id = uc.user_column_id
81   AND     c_date BETWEEN ucf.effective_start_date
82                  AND     ucf.effective_end_date
83   GROUP BY ur.row_low_range_or_name;
84   ----+
85 
86   CURSOR csr_get_org(c_person_id IN NUMBER) IS
87   SELECT  hoi.organization_id org_id
88   FROM    per_all_assignments_f paaf
89          ,per_all_people_f papf
90          ,hr_soft_coding_keyflex hsc
91          ,hr_organization_information hoi
92   WHERE   papf.person_id = c_person_id
93   AND     paaf.person_id = papf.person_id
94   AND     paaf.primary_flag = 'Y'
95   AND     hsc.soft_coding_keyflex_id = paaf.soft_coding_keyflex_id
96   AND     hoi.org_information1 = hsc.segment2
97   AND     hoi.org_information_context = 'NO_LOCAL_UNITS';
98   ----+
99   CURSOR csr_override_rule_values(c_org_id IN NUMBER,
100                                   c_rule   IN VARCHAR2) IS
101   SELECT  decode (c_rule
102                  ,'CONSECUTIVE_DAYS'     ,org_information1
103                  ,'YEARLY_DAYS'          ,org_information2
104                  ,'YEARLY_COUNT'         ,org_information3
105                  ,'EMPLOYER_PERIOD_DAYS' ,org_information4
106                  ,0) override
107   FROM    hr_organization_information
108   WHERE   organization_id = c_org_id
109   AND     org_information_context = 'NO_SC_OVERRIDE';
110   ----+
111   l_override   csr_override_rule_values%ROWTYPE;
112   l_rule       csr_default_rule_values%ROWTYPE;
113   l_org        csr_get_org%ROWTYPE;
114   l_rule_value NUMBER:=0;
115   BEGIN
116 
117     OPEN  csr_get_org(P_PERSON_ID);
118     FETCH csr_get_org INTO l_org;
119     CLOSE csr_get_org;
120 
121     OPEN  csr_override_rule_values(l_org.org_id,P_RULE);
122     FETCH csr_override_rule_values INTO l_override;
123     CLOSE csr_override_rule_values;
124 
125     OPEN  csr_default_rule_values(P_RULE,P_EFFECTIVE_DATE);
126     FETCH csr_default_rule_values INTO l_rule;
127     CLOSE csr_default_rule_values;
128 
129     l_rule_value:=NVL(l_override.override,l_rule.DefaultValue);
130     l_rule_value:=LEAST(l_rule_value,l_rule.MaxValue);
131     l_rule_value:=GREATEST(l_rule_value,l_rule.MinValue);
132 
133     RETURN l_rule_value;
134   END get_rule_value;
135   -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --+
136   FUNCTION is_reimbursement_day(p_person_id       IN NUMBER
137                                ,p_abs_link_period IN NUMBER
138                                ,p_start_date      IN DATE
139                                ,p_end_date        IN DATE)
140   RETURN NUMBER IS
141     J BINARY_INTEGER;
142     TYPE date_table   IS TABLE OF DATE  INDEX BY BINARY_INTEGER;
143     sick_dates date_table;
144     sick_day DATE;
145 
146   FUNCTION get_connected_absence(p_conn_start_date IN DATE
147                                 ,p_dates           IN date_table)
148   RETURN NUMBER IS
149     CURSOR csr_connected_absence IS
150       SELECT  p_conn_start_date - prev_abs.date_end duration
151              ,prev_abs.date_start               start_date
152              ,prev_abs.date_end                 end_date
153       FROM    per_absence_attendances prev_abs
154              ,per_absence_attendance_types pat
155       WHERE   prev_abs.absence_attendance_type_id = pat.absence_attendance_type_id
156       AND     prev_abs.date_end < p_conn_start_date
157       AND     pat.absence_category IN ('S','PTS')
158       AND     (((p_conn_start_date - prev_abs.date_end) <= p_abs_link_period)
159               OR (decode (trim (to_char (prev_abs.date_end,'DAY'))
160                      ,'FRIDAY',next_day (prev_abs.date_end,'SUNDAY')
161                      ,'SATURDAY',next_day (prev_abs.date_end,'SUNDAY')
162                      ,prev_abs.date_end) BETWEEN decode (trim (to_char (p_conn_start_date,'DAY'))
163                                                    ,'MONDAY',p_conn_start_date - 2
164                                                    ,'SUNDAY',p_conn_start_date - 1
165                                                    ,p_conn_start_date) - (p_abs_link_period+1)
166                                     AND     decode (trim (to_char (p_conn_start_date,'DAY'))
167                                                    ,'MONDAY',p_conn_start_date - 2
168                                                    ,'SUNDAY',p_conn_start_date - 1
169                                                    ,p_conn_start_date)-1))
170       AND     prev_abs.date_start IS NOT NULL
171       AND     prev_abs.date_end IS NOT NULL
172       AND     prev_abs.person_id = p_person_id
173       ORDER BY duration;
174 
175 
176     r_connected_absence csr_connected_absence%ROWTYPE;
177     l_dates date_table;
178     l_day   DATE;
179     l_days  NUMBER;
180 
181 
182   BEGIN
183     OPEN  csr_connected_absence;
184     FETCH csr_connected_absence INTO r_connected_absence;
185 
186       IF csr_connected_absence%FOUND THEN
187         CLOSE csr_connected_absence;
188         l_dates := p_dates;
189         l_day   := r_connected_absence.end_date;
190       WHILE l_day >= r_connected_absence.start_date LOOP
191         l_dates(NVL(l_dates.LAST,0)+1) := l_day;
192         l_day := l_day-1;
193       END LOOP;
194 
195         RETURN get_connected_absence(p_conn_start_date => r_connected_absence.start_date
196                                     ,p_dates           => l_dates);
197 
198       ELSIF csr_connected_absence%NOTFOUND THEN
199         CLOSE csr_connected_absence;
200 
201       l_dates := p_dates;
202       l_days   :=0;
203 
204       FOR I IN REVERSE l_dates.FIRST..l_dates.LAST LOOP
205         l_days:=l_days+1;
206         IF  l_days > p_abs_link_period
207         AND (trim(to_char (l_dates(I),'DAY')) NOT IN ('SATURDAY','SUNDAY'))
208         AND l_dates(I) BETWEEN p_start_date AND p_end_date THEN
209           RETURN 1;
210         END IF;
211         EXIT WHEN l_dates(I)>p_end_date;
212       END LOOP;
213         RETURN 0;
214       END IF;
215   END get_connected_absence;
216 
217 
218   BEGIN
219     sick_day        := p_end_date;
220       WHILE sick_day >= p_start_date LOOP
221         sick_dates(NVL(sick_dates.LAST,0)+1) := sick_day;
222         sick_day := sick_day-1;
223       END LOOP;
224 
225 
226 
227     RETURN get_connected_absence(p_start_date
228                                 ,sick_dates);
229 
230   END is_reimbursement_day;
231 --14073252 Ends
232 --#8510300 Start
233 -- Procedure checks for the Overlap of the absence for a person
234 -- during a particular period. If exists then procedure raises
235 -- an error
236 --
237 PROCEDURE chk_absence_overlap ( p_absence_attendance_id IN NUMBER
238                                ,p_person_id             IN NUMBER
239                                ,p_date_start            IN DATE
240                                ,p_date_end              IN DATE
241                               )  IS
242 
243   CURSOR csr_abs_overlap_another IS
244     SELECT 'Y'
245     FROM   per_absence_attendances abs
246     WHERE  abs.person_id = p_person_id
247     AND    abs.date_start is not null
248     AND    p_date_start is not null
249     AND   (p_absence_attendance_id is null or
250            p_absence_attendance_id <> abs.absence_attendance_id)
251     AND (( abs.date_start
252            BETWEEN  p_date_start AND NVL(p_date_end,hr_api.g_eot)
253           )
254           OR
255          ( p_date_start
256            BETWEEN abs.date_start AND NVL(abs.date_end,hr_api.g_eot)
257          )
258         );
259   l_exists   VARCHAR2(1);
260   l_proc     VARCHAR2(100) := 'PAY_NO_ABS_VALIDATION.CHK_ABSENCE_OVERLAP';
261 BEGIN
262 --
263   hr_utility.set_location (l_proc,5);
264   --
265   -- Cursor to return the absence for the period
266   --
267   OPEN  csr_abs_overlap_another;
268   FETCH csr_abs_overlap_another INTO l_exists;
269 
270   hr_utility.set_location (l_proc,10);
271   IF csr_abs_overlap_another%FOUND THEN
272      --
273      -- Raise the error message
274      --
275      hr_utility.set_location (l_proc,15);
276      Fnd_message.set_name('PAY','PAY_376933_NO_ABS_OVERLAP');
277      CLOSE csr_abs_overlap_another;
278      Fnd_message.raise_error;
279   END IF;
280 
281   hr_utility.set_location (l_proc,20);
282   CLOSE csr_abs_overlap_another;
283   hr_utility.set_location (l_proc,25);
284 --
285 END chk_absence_overlap;
286 --
287 -- Function returns the number of working days for a given period as per
288 -- the Norway Legislation.
289 --
290 FUNCTION get_no_work_days( p_start_date IN DATE
291                           ,p_end_date   IN DATE
292                          )
293 RETURN NUMBER IS
294   l_date DATE;
295   l_working_days NUMBER;
296   l_proc         VARCHAR2(100) := 'PAY_NO_ABS_VALIDATION.GET_NO_WORK_DAYS';
297 BEGIN
298 
299   hr_utility.set_location (l_proc,5);
300   --
301   -- Function would return 0 if start date is greater than end date
302   --
303   IF (p_start_date > p_end_date) THEN
304     hr_utility.set_location (l_proc,10);
305     RETURN 0;
306   END IF;
307 
308   l_date := p_start_date;
309   l_working_days := 0;
310 
311   hr_utility.set_location (l_proc,15);
312 
313   --
314   -- Loop through all days from start date to the end date
315   --
316   WHILE (l_date <= p_end_date)
317   LOOP
318     hr_utility.set_location (l_proc,20);
319     --
320     -- Check if the day of the date is Saturday or Sunday. If not add
321     -- 1 to number of working days
322     --
323     IF ((to_char(l_date,'DY','nls_date_language=ENGLISH') <> 'SUN')
324          AND (to_char(l_date,'DY','nls_date_language=ENGLISH') <> 'SAT')
325        ) THEN
326       hr_utility.set_location (l_proc,25);
327       l_working_days := l_working_days + 1;
328     END IF;
329     l_date := l_date + 1;
330     hr_utility.set_location (l_proc,30);
331   END LOOP;
332 
333   hr_utility.set_location (l_proc,35);
334 
335   RETURN l_working_days;
336 
337 END get_no_work_days;
338 --
339 -- This function will be created for calculating the number of Child minder
340 -- sickness leave a person is eligible for as on effective date.
341 --
342 FUNCTION get_cms_entitlement( p_person_id      IN NUMBER
343                              ,p_effective_date IN DATE)
344 RETURN NUMBER IS
345 
346   CURSOR csr_child_contact ( p_person_id NUMBER, p_contact_type VARCHAR2, p_eff_date DATE) IS
347     SELECT pap.date_of_birth
348           ,ROUND(MONTHS_BETWEEN( p_eff_date, pap.date_of_birth ) / 12, 2)  AS AGE
349           ,pcr.contact_type
350   	      ,pcr.cont_information1
351           ,pcr.cont_information2
352           ,nvl(pcr.date_end,to_date('31-12-4712','DD-MM-YYYY')) date_end
353      FROM per_all_people_f pap
354          ,per_contact_relationships pcr
355     WHERE pap.person_id = pcr.contact_person_id
356       AND pcr.person_id = p_person_id
357       AND pcr.contact_type = p_contact_type
358       AND (pcr.date_start is null or pcr.date_start <= p_eff_date)
359       AND (pcr.date_end is null or pcr.date_end >= p_eff_date );
360 
361   l_total_child  NUMBER;
362   l_dep_child    NUMBER;
363   l_dis_child    NUMBER;
364   l_entitlement  NUMBER;
365   l_sole_count   NUMBER;
366   l_proc         VARCHAR2(100) := 'PAY_NO_ABS_VALIDATION.GET_CMS_ENTITLEMENT';
367 BEGIN
368   hr_utility.set_location (l_proc,5);
369   l_dep_child := 0;
370   l_dis_child := 0;
371   l_total_child := 0;
372   l_sole_count := 0;
373 	l_entitlement := 0;
374 
375   -- Fetch the contact information for the person as of an effective date
376   -- with relation as 'Dependent Child(DC)'
377   FOR i IN csr_child_contact( p_person_id, 'DC', p_effective_date )
378   LOOP
379     hr_utility.set_location (l_proc,10);
380 
381     -- Count the Total number of contact with relation as 'Dependent Child(DC)'
382     l_total_child := l_total_child + 1;
383 	  i.cont_information2 := NVL(i.cont_information2,'N');
384 	  i.cont_information1 := NVL(i.cont_information1,'N');
385 	  -- Count the child as dependent only if Age is less than 13 years
386     -- or Age is less than 19 years with chronic flag as Yes
387 	  IF (i.age < 13) THEN
388        hr_utility.set_location (l_proc,15);
389        l_dep_child := l_dep_child + 1;
390        IF (i.cont_information2 = 'Y') THEN
391           hr_utility.set_location (l_proc,20);
392           l_dis_child := l_dis_child + 1;
393        END IF;
394        IF  (i.cont_information1 = 'Y') THEN
395           hr_utility.set_location (l_proc,25);
396           l_sole_count := l_sole_count + 1;
397        END IF;
398     ELSE
399        hr_utility.set_location (l_proc,30);
400        IF ( i.age < 19 AND i.cont_information2 = 'Y') THEN
401          hr_utility.set_location (l_proc,35);
402          l_dep_child := l_dep_child + 1;
403          l_dis_child := l_dis_child + 1;
404          IF  (i.cont_information1 = 'Y') THEN
405            hr_utility.set_location (l_proc,40);
406            l_sole_count := l_sole_count + 1;
407          END IF;
408        END IF;
409     END IF;
410     hr_utility.set_location (l_proc,45);
411   END LOOP;
412 
413   hr_utility.set_location (l_proc,50);
414 
415   -- If dependent child is more than 0 and less than 2
416   -- then entitlement is 10 . If it is more than 2 then
417   -- entitlement is 15.
418   IF ((l_dep_child > 0) AND  (l_dep_child <= 2)) THEN
419     hr_utility.set_location (l_proc,55);
420     l_entitlement := 10;
421   ELSIF ((l_dep_child > 2)) THEN
422     hr_utility.set_location (l_proc,60);
423     l_entitlement := 15;
424   END IF;
425 
426   -- If all the dependent child have sole guardian marked as yes
427   -- then entitlement is doubled.
428   hr_utility.set_location (l_proc,65);
429   IF (l_sole_count = l_dep_child) THEN
430     hr_utility.set_location (l_proc,70);
431     l_entitlement := l_entitlement * 2;
432   END IF;
433 
434   -- For every disabled dependent child 10 days of entitlement is added
435   hr_utility.set_location (l_proc,75);
436   IF (l_dis_child > 0) THEN
437     hr_utility.set_location (l_proc,80);
438     l_entitlement := l_entitlement + (l_dis_child * 10);
439   END IF;
440 
441   hr_utility.set_location (l_proc,85);
442   RETURN l_entitlement;
443 
444 END get_cms_entitlement;
445 
446 -- This function will be created for calculating the number of Child minder
447 -- sickness leave taken by the person from the year start of effective date
448 -- and effective date.
449 FUNCTION get_cms_leave_taken( p_person_id      IN NUMBER
450                              ,p_effective_date IN DATE)
451 RETURN NUMBER IS
452 
453   CURSOR csr_cms_leave_taken ( p_personid NUMBER, p_start_date DATE, p_end_date DATE) IS
454     SELECT  abs.date_start
455            ,abs.date_end
456            ,abs.absence_days
457       FROM per_absence_attendances abs
458           ,per_absence_attendance_types paat
459      WHERE abs.person_id = p_person_id
460        AND abs.absence_attendance_type_id = paat.absence_attendance_type_id
461        AND paat.absence_category = 'CMS'
462        AND abs.absence_attendance_id <> NVL(l_glb_absence_attendance_id,-1)
463        AND abs.date_start IS NOT NULL
464        AND (
465             (abs.date_start BETWEEN p_start_date AND p_end_date)
466 			       OR
467             (abs.date_end BETWEEN p_start_date AND p_end_date)
468 					 );
469 
470   l_leave_taken  NUMBER;
471   l_year_st_date DATE;
472   l_start_date   DATE;
473   l_end_date     DATE;
474   l_proc         VARCHAR2(100) := 'PAY_NO_ABS_VALIDATION.GET_CMS_LEAVE_TAKEN';
475 
476 BEGIN
477   hr_utility.set_location (l_proc,5);
478   l_leave_taken := 0;
479 
480   l_year_st_date := trunc(p_effective_date,'YYYY');
481   hr_utility.set_location (l_proc,10);
482 
483   -- Fetch all the leaves of the person between year start of the effective date
484   -- and effective date
485   FOR l_csr_leave IN csr_cms_leave_taken(p_person_id,l_year_st_date,p_effective_date)
486   LOOP
487 
488    hr_utility.set_location (l_proc,15);
489    -- If the leave start and end dates are between the year start of the
490    -- effective date and effective date then added the absence days to the leave
491    -- taken and if days are not provided calculate number of days using func
492    -- get_no_work_days
493    IF ((l_csr_leave.date_start >= l_year_st_date ) AND (l_csr_leave.date_end <= p_effective_date)) THEN
494       hr_utility.set_location (l_proc,20);
495       IF NVL(l_csr_leave.absence_days,0) <> 0 THEN
496         l_leave_taken := l_leave_taken + l_csr_leave.absence_days;
497       ELSE
498         l_leave_taken := l_leave_taken + get_no_work_days(l_csr_leave.date_start,l_csr_leave.date_end);
499       END IF;
500    ELSE
501      hr_utility.set_location (l_proc,25);
502      -- if leave start date is less than year start date of the effective date
503      -- then calculate the leave from the year start date of the effective date
504      IF (l_csr_leave.date_start < l_year_st_date) THEN
505         hr_utility.set_location (l_proc,30);
506         l_start_date := l_year_st_date;
507      ELSE
508         hr_utility.set_location (l_proc,35);
509         l_start_date := l_csr_leave.date_start;
510      END IF;
511      hr_utility.set_location (l_proc,40);
512      -- if leave end date is greaten than effective date then calculate the
513      -- leave upto effective date
514      IF (NVL(l_csr_leave.date_end, TO_DATE('31-12-4712','DD-MM-YYYY')) > p_effective_date) THEN
515         hr_utility.set_location (l_proc,45);
516         l_end_date := p_effective_date;
517      ELSE
518         hr_utility.set_location (l_proc,50);
519         l_end_date := l_csr_leave.date_end;
520      END IF;
521      hr_utility.set_location (l_proc,60);
522      l_leave_taken :=  l_leave_taken + get_no_work_days (l_start_date,l_end_date);
523      hr_utility.set_location (l_proc,65);
524    END IF;
525   END LOOP;
526 
527   hr_utility.set_location (l_proc,70);
528   RETURN l_leave_taken;
529 
530 END get_cms_leave_taken;
531 --
532 --
533 FUNCTION cms_validation ( p_person_id       IN NUMBER
534                          ,p_date_start      IN DATE
535                          ,p_date_end        IN DATE
536                          ,p_cert_type       IN VARCHAR2
537                          ,p_dis_child_care  IN VARCHAR2
538                          ,p_absence_days    IN VARCHAR2
539                         ) RETURN VARCHAR2 IS
540   CURSOR child_contact ( personid NUMBER, contacttype VARCHAR2, abs_stdt DATE) IS
541     SELECT pap.date_of_birth
542           ,ROUND(MONTHS_BETWEEN( abs_stdt, pap.date_of_birth ) / 12, 2)  AS AGE
543           ,pcr.contact_type
544           ,pcr.cont_information1
545           ,pcr.cont_information2
546           ,NVL(pcr.date_end,TO_DATE('31-12-4712','DD-MM-YYYY')) date_end
547           ,pcr.contact_relationship_id
548      FROM per_all_people_f pap
549          ,per_contact_relationships pcr
550     WHERE pap.person_id = pcr.contact_person_id
551       AND pcr.person_id = personid
552       AND pcr.contact_type = contacttype
553       AND (pcr.date_start IS NULL OR pcr.date_start <= abs_stdt)
554       AND (pcr.date_end IS NULL OR pcr.date_end >= abs_stdt );
555 
556   CURSOR csr_contact_extra_info (p_con_relationship_id NUMBER) IS
557     SELECT pceif.effective_start_date
558           ,pceif.effective_end_date
559           ,fnd_date.canonical_to_date(pceif.cei_information1) start_date
560           ,fnd_date.canonical_to_date(pceif.cei_information2) end_date
561      FROM per_contact_extra_info_f pceif
562     WHERE pceif.contact_relationship_id = p_con_relationship_id
563       AND pceif.information_type = 'NO_CMS_DIS_DATE';
564 
565   CURSOR csr_get_glb_value(p_global_name VARCHAR2, p_effective_date DATE) IS
566     SELECT fnd_number.canonical_to_number(global_value)
567       FROM ff_globals_f
568      WHERE global_name = p_global_name
569        AND legislation_code = 'NO'
570        AND p_effective_date BETWEEN effective_start_date AND effective_end_date;
571 
572   l_cms_eligible_flag    VARCHAR2(3);
573 	l_cms_eligible_count   NUMBER;
574   l_cms_contact_end_date DATE;
575   l_cms_child_count      NUMBER;
576   l_cms_balance          NUMBER;
577   l_warnings             VARCHAR2(50);
578   l_absence_days         NUMBER;
579   l_dis_child            NUMBER;
580   l_nav_no_warn          VARCHAR2(1);
581   l_cms_max_sc_elig      NUMBER;
582   l_proc                 VARCHAR2(100) := 'PAY_NO_ABS_VALIDATION.CMS_VALIDATION';
583 BEGIN
584   hr_utility.set_location (l_proc,5);
585   l_cms_eligible_flag  := 'N' ;
586   l_cms_eligible_count := 0 ;
587   l_cms_contact_end_date := null ;
588   l_cms_child_count := 0;
589   l_warnings := '';
590   l_dis_child := 0;
591   l_nav_no_warn := 'N';
592 
593   hr_utility.set_location (l_proc,10);
594   -- Fetch the contact information for the person as of an effective date
595   -- with relation as 'Dependent Child(DC)'
596   FOR i IN child_contact ( p_person_id, 'DC', p_date_start )
597   LOOP
598     hr_utility.set_location (l_proc,15);
599     l_cms_child_count := l_cms_child_count + 1;
600     i.cont_information2 := nvl(i.cont_information2,'N');
601      -- Age is less than 13 years or Age is less than 19 years with chronic flag as Yes
602      IF (i.age < 13) OR ( i.age < 19 AND i.cont_information2 = 'Y') THEN
603           hr_utility.set_location (l_proc,20);
604           l_cms_eligible_count := l_cms_eligible_count + 1 ;
605           l_cms_eligible_flag := 'Y' ;
606           l_cms_contact_end_date := i.date_end;
607      END IF;
608      hr_utility.set_location (l_proc,25);
609      IF (i.cont_information2 = 'Y') THEN
610          hr_utility.set_location (l_proc,30);
611          l_dis_child := l_dis_child + 1;
612          IF l_nav_no_warn <> 'Y' THEN
613            hr_utility.set_location (l_proc,35);
614            FOR j in csr_contact_extra_info (i.contact_relationship_id)
615            LOOP
616              hr_utility.set_location (l_proc,40);
617              IF ((j.start_date <= p_date_start) AND (j.end_date >= p_date_end)) THEN
618                hr_utility.set_location (l_proc,45);
619                l_nav_no_warn := 'Y';
620                EXIT;
621              END IF;
622            END LOOP;
623          END IF;
624       END IF;
625   END LOOP;
626 
627   IF l_cms_child_count  = 0 THEN
628     hr_utility.set_location (l_proc,50);
629     l_warnings := l_warnings || '1';  --No Registered Children
630   END IF;
631 
632   IF l_cms_eligible_flag = 'N' THEN
633     hr_utility.set_location (l_proc,55);
634     IF l_cms_child_count > 0 THEN
635       hr_utility.set_location (l_proc,60);
636       l_warnings := l_warnings || ',2';  --No Eligible Childen
637     END IF;
638   ELSIF l_cms_eligible_count = 1 AND  p_date_end > l_cms_contact_end_date THEN
639     hr_utility.set_location (l_proc,65);
640     l_warnings := l_warnings || ',3';  --Contact Relationship has been end date
641   END IF;
642 
643   IF p_date_start IS NOT NULL THEN
644     hr_utility.set_location (l_proc,70);
645     l_cms_balance := (pay_no_abs_validation.get_cms_entitlement(p_person_id,p_date_start) - pay_no_abs_validation.get_cms_leave_taken(p_person_id,p_date_start));
646     IF ((NVL(p_absence_days,0) = 0) AND (p_date_end IS NOT NULL)) THEN
647       hr_utility.set_location (l_proc,75);
648       l_absence_days := get_no_work_days(p_date_start,p_date_end);
649     ELSE
650       hr_utility.set_location (l_proc,80);
651       l_absence_days := p_absence_days;
652     END IF;
653 
654     hr_utility.set_location (l_proc,85);
655     OPEN csr_get_glb_value('NO_MAX_CMS_SC_ELIGIBLE',p_date_start);
656     FETCH csr_get_glb_value INTO l_cms_max_sc_elig;
657     CLOSE csr_get_glb_value;
658 
659     hr_utility.set_location (l_proc,90);
660     IF ((l_absence_days > l_cms_max_sc_elig) AND (p_cert_type = 'SC')) THEN
661       hr_utility.set_location (l_proc,95);
662       l_warnings := l_warnings || ',6'; --	Self Certification more than 3 days
663 		END IF;
664     IF (l_absence_days > l_cms_balance) THEN
665       hr_utility.set_location (l_proc,100);
666       l_warnings := l_warnings || ',4'; --Entitlement is less than leave days
667     END IF;
668   END IF;
669 
670 
671   IF NVL(p_dis_child_care,'N') = 'Y' THEN
672     hr_utility.set_location (l_proc,105);
673     IF l_dis_child = 0 THEN
674       hr_utility.set_location (l_proc,110);
675       l_warnings := l_warnings || ',5';    -- No Disabled Children Registered
676     ELSE
677       hr_utility.set_location (l_proc,115);
678       IF l_nav_no_warn = 'N' THEN
679         hr_utility.set_location (l_proc,120);
680         l_warnings := l_warnings || ',5';   --NAV details doesn't exist
681       END IF;
682     END IF;
683   END IF;
684 
685   hr_utility.set_location (l_proc,125);
686   RETURN l_warnings;
687 
688 END cms_validation;
689 --
690 -- #14542232 This overloaded procedure was added to pass the
691 --  p_absence_attendance_id while updating the absence
692 --  record so that duration of current absence is considered
693 --  while calculating the entitlement
694 FUNCTION cms_validation ( p_person_id             IN NUMBER
695                          ,p_date_start            IN DATE
696                          ,p_date_end              IN DATE
697                          ,p_cert_type             IN VARCHAR2
698                          ,p_dis_child_care        IN VARCHAR2
699                          ,p_absence_days          IN VARCHAR2
700                          ,p_absence_attendance_id IN NUMBER
701                         )
702 RETURN VARCHAR2 IS
703 l_warnings VARCHAR2(50);
704 BEGIN
705   l_warnings := NULL;
706   l_glb_absence_attendance_id := p_absence_attendance_id;
707 
708   l_warnings :=  cms_validation ( p_person_id      => p_person_id
709                                  ,p_date_start     => p_date_start
710                                  ,p_date_end       => p_date_end
711                                  ,p_cert_type      => p_cert_type
712                                  ,p_dis_child_care => p_dis_child_care
713                                  ,p_absence_days   => p_absence_days
714                                 );
715 
716   l_glb_absence_attendance_id := NULL;
717   RETURN l_warnings;
718 
719 END cms_validation;
720 --
721 --#8510300 End
722 PROCEDURE CREATE_ABS_VALIDATION ( P_ABS_INFORMATION_CATEGORY varchar2
723                                  ,P_PERSON_ID in NUMBER
724                                  ,P_EFFECTIVE_DATE in DATE
725                                  ,P_ABS_INFORMATION1 in VARCHAR2
726                                  ,P_ABS_INFORMATION2 in VARCHAR2
727                                  ,P_ABS_INFORMATION3 in VARCHAR2
728                                  ,P_ABS_INFORMATION5 in VARCHAR2
729                                  ,P_ABS_INFORMATION6 in VARCHAR2
730                                  ,P_ABS_INFORMATION9 in VARCHAR2 --#8510300
731                                  ,P_ABS_INFORMATION15 in VARCHAR2
732                                  ,P_ABS_INFORMATION16 in VARCHAR2
733                                  ,P_DATE_START in DATE
734                                  ,P_DATE_END in DATE
735                                  ,P_DATE_PROJECTED_START in DATE
736                                  ,P_DATE_PROJECTED_END in DATE
737                                  ,P_ABSENCE_DAYS in NUMBER 			--#8510300
738                                  ,P_ABS_ATTENDANCE_REASON_ID in NUMBER) is
739 
740  CURSOR csr_get_gender(l_person_id NUMBER, l_date DATE) IS
741  SELECT sex FROM per_all_people_f
742   WHERE person_id = l_person_id
743     AND l_date BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE;
744 
745 -- Cursor to fetch global values
746 CURSOR csr_get_glb_value(p_global_name VARCHAR2, p_effective_date DATE) IS
747 SELECT fnd_number.canonical_to_number(global_value)
748 FROM  ff_globals_f
749 WHERE global_name = p_global_name
750 AND   legislation_code = 'NO'
751 AND   p_effective_date BETWEEN effective_start_date AND effective_end_date;
752 
753 CURSOR csr_get_person_hire_date(p_person_id number,p_effective_date date) IS
754 SELECT start_date,PER_INFORMATION7 FROM per_all_people_f where
755 person_id = p_person_id
756 AND P_EFFECTIVE_DATE BETWEEN EFFECTIVE_START_DATE
757      AND EFFECTIVE_END_DATE;
758 
759 CURSOR CSR_SICKNESS_ELIG_CHECK (personid NUMBER) IS
760 SELECT (PAA.DATE_END - PAA.DATE_START) + 1 AS DAYS,PAA.DATE_START, PAA.DATE_END
761  FROM PER_ABSENCE_ATTENDANCES PAA, PER_ABSENCE_ATTENDANCE_TYPES PAT
762 WHERE PAA.ABSENCE_ATTENDANCE_TYPE_ID = PAT.ABSENCE_ATTENDANCE_TYPE_ID
763   AND PAT.ABSENCE_CATEGORY = 'UN'
764   AND PAA.DATE_START IS NOT NULL
765   AND PAA.DATE_END IS NOT NULL
766   AND PAA.PERSON_ID = personid
767   ORDER BY DATE_START ;
768 
769 CURSOR CSR_REASON_CODE ( attn_reason_id NUMBER) IS
770 select name from PER_ABS_ATTENDANCE_REASONS  par
771 WHERE PAR.ABS_ATTENDANCE_REASON_ID = attn_reason_id ;
772 
773 CURSOR CSR_3SC_SICKNESS_CHECK(personid NUMBER, abs_start_date DATE, abs_link_period NUMBER) IS
774    SELECT DATE_START
775          ,DATE_END
776     FROM PER_ABSENCE_ATTENDANCES
777    WHERE PERSON_ID = personid
778      AND DATE_END BETWEEN (abs_start_date - abs_link_period) AND (abs_start_date -1)
779      AND ABS_INFORMATION1 = 'SC'
780      AND DATE_START IS NOT NULL
781      AND DATE_END IS NOT NULL;
782 
783 -- Bug# 14073252 Starts
784 CURSOR csr_absences_in_12months(c_person_id  IN NUMBER
785                                ,c_start_date IN DATE) IS
786 SELECT  count (paa.absence_attendance_id)         counts
787        ,sum ((paa.date_end - paa.date_start) + 1) days
788 FROM    per_absence_attendances paa
789 WHERE   paa.person_id = c_person_id
790 AND     paa.date_end BETWEEN add_months (c_start_date,- 12)
791                      AND     (c_start_date - 1)
792 AND     paa.abs_information1 = 'SC'
793 AND     paa.date_start IS NOT NULL
794 AND     paa.date_end IS NOT NULL;
795 
796 r_absences_in_12months csr_absences_in_12months%ROWTYPE;
797 -- Bug# 14073252 Ends
798 
799 
800   l_gender varchar2(5);
801   l_date_of_birth date;
802   l_elig_start_date DATE;
803   l_reason_code varchar2(30);
804   l_abs_min_gap number;
805   l_person_id   number;
806   l_abs_start_date date;
807   l_abs_end_date date;
808   l_person_hire_date date;
809   l_entitled_sc           Varchar2(10);
810   l_abs_count             Number(5);
811   l_months_employed_prev number;
812   l_months_employed_curr number;
813   l_eligible varchar2(4);
814   l_min_worked_months number;
815   l_abs_link_period number;
816   l_within_n_months number;
817   l_months_employed number;
818   l_check_start_date date;
819   l_tot_abs  Number;  -- Bug#8905705 fix
820   l_cms_warnings VARCHAR2(50); --Bug#8510300
821 
822 BEGIN
823 
824   OPEN csr_get_gender(P_PERSON_ID,P_EFFECTIVE_DATE);
825   FETCH csr_get_gender INTO l_gender;
826   CLOSE csr_get_gender;
827   --Error If gender is Male and apply leave for Maternity or Part Time Maternity
828   IF P_ABS_INFORMATION_CATEGORY IN ('NO_M','NO_PTM') THEN
829      IF l_gender = 'M' then
830         fnd_message.set_name('PAY','PAY_376876_NO_MATERNITY_LEAVE');
831         fnd_message.raise_error;
832      END IF;
833   END IF;
834 
835   --Error If gender is Female and apply leave for Paternity or Part Time Paternity
836   IF P_ABS_INFORMATION_CATEGORY IN ('NO_PA','NO_PTP') THEN
837      IF l_gender = 'F' then
838         fnd_message.set_name('PAY','PAY_376877_NO_PATERNITY_LEAVE');
839         fnd_message.raise_error;
840      END IF;
841   END IF;
842 
843   -- Error If initial absence is set to Yes and also a linking absence attached to the same absence
844   IF (P_ABS_INFORMATION15 = 'Y' AND P_ABS_INFORMATION16 is NOT NULL) THEN
845      Fnd_message.set_name('PAY','PAY_376916_NO_ABS_LINKING_INI');
846      fnd_message.raise_error;
847   END IF;
848  -- Error - If initial absence is set to No and no linking absence is provided
849  IF (P_ABS_INFORMATION15 = 'N'  AND P_ABS_INFORMATION16 is NULL) THEN
850      Fnd_message.set_name('PAY','PAY_376917_NO_ABS_LINKING_DTL');
851      fnd_message.raise_error;
852  END IF;
853  IF P_ABS_INFORMATION_CATEGORY IN ('NO_S','NO_PTS') AND
854     P_ABS_INFORMATION15 is null AND P_ABS_INFORMATION16 is NOT NULL THEN
855       Fnd_message.set_name('PAY','PAY_376916_NO_ABS_LINKING_INI');
856       fnd_message.raise_error;
857  END IF;
858 
859 	l_person_id := P_PERSON_ID;
860 	l_abs_start_date := NVL(P_DATE_START,P_DATE_PROJECTED_START);
861         l_abs_end_date := NVL(P_DATE_END,P_DATE_PROJECTED_END);
862 
863      OPEN csr_get_person_hire_date(l_person_id, l_abs_start_date);
864      FETCH csr_get_person_hire_date INTO l_person_hire_date,l_entitled_sc;
865      CLOSE csr_get_person_hire_date;
866 
867      OPEN csr_get_glb_value('NO_ABS_MIN_GAP',l_abs_start_date);
868      FETCH csr_get_glb_value INTO l_abs_min_gap;
869      CLOSE csr_get_glb_value;
870 
871      OPEN csr_get_glb_value('NO_ABS_LINK_PERIOD',l_abs_start_date);
872      FETCH csr_get_glb_value INTO l_abs_link_period;
873      CLOSE csr_get_glb_value;
874 
875 
876  IF P_ABS_INFORMATION_CATEGORY IN ('NO_S','NO_PTS','NO_CMS') THEN
877     -- Error - if the certificate end date is earlier than the certificate start date
878     IF P_ABS_INFORMATION3 < P_ABS_INFORMATION2 THEN
879        Fnd_message.set_name('PAY','PAY_376908_NO_ST_END_DATE_VAL');
880        fnd_message.raise_error;
881     END IF;
882 
883      --Find the eligiblity date
884      l_elig_start_date := l_person_hire_date + l_abs_min_gap ;
885      FOR i in CSR_SICKNESS_ELIG_CHECK (l_person_id) LOOP
886        IF i.date_start < l_elig_start_date THEN
887           l_elig_start_date := l_elig_start_date + i.days ;
888        ELSE
889           EXIT;
890        END IF;
891      END LOOP;
892 
893      OPEN csr_reason_code (P_ABS_ATTENDANCE_REASON_ID);
894      FETCH csr_reason_code INTO l_reason_code;
895      CLOSE csr_reason_code ;
896 
897      -- Error - When an absence is recorded before eligibility 28 days
898      IF (l_abs_start_date < l_elig_start_date) AND (l_reason_code is NULL or l_reason_code <> 'ABS_WA') THEN
899          Fnd_message.set_name('PAY','PAY_376910_NO_EMP_NOT_ELIGIBLE');
900          Fnd_message.raise_error;
901      END IF;
902 
903   -- Error - if Self-Certificate is selected and the employee has had Self-Certified Sickness absences
904   -- totaling more than 3 days in the previous 14 days
905   IF P_ABS_INFORMATION_CATEGORY IN ('NO_S','NO_PTS') AND P_ABS_INFORMATION1 = 'SC' THEN
906      l_abs_count := 0;
907      l_tot_abs := (l_abs_end_date - l_abs_start_date) + 1;   -- Bug#8905705 fix
908      /* --SC Warning 1 -- Bug# 14073252
909      IF l_tot_abs > get_rule_value(p_rule           => 'CONSECUTIVE_DAYS'
910                                   ,p_person_id      => P_PERSON_ID
911                                   ,p_effective_date => P_EFFECTIVE_DATE) THEN
912        Fnd_message.set_name('PAY','PAY_376929_ABS_SC_CONSECUTIVE');
913        Fnd_message.raise_error;
914      END IF;
915      */
916      FOR I IN CSR_3SC_SICKNESS_CHECK (l_person_id,l_abs_start_date,l_abs_link_period )
917      LOOP
918        IF i.DATE_START < (l_abs_start_date - l_abs_link_period) THEN
919           l_abs_count := ( i.DATE_END - (l_abs_start_date - l_abs_link_period) ) +1;
920        ELSIF i.DATE_END > (l_abs_start_date-1) THEN
921           l_abs_count := ((l_abs_start_date-1) - i.DATE_START )+1;
922        ELSIF i.DATE_END = i.DATE_START THEN
923           l_abs_count := 1;
924        ELSE
925           l_abs_count := (i.DATE_END - i.DATE_START)+1 ;
926        END IF;
927        l_tot_abs := l_tot_abs + l_abs_count; -- Bug#8905705 fix
928      END LOOP;
929 
930      /* --SC Warning 2 -- Bug# 14073252
931      IF l_tot_abs > get_rule_value(p_rule           => 'EMPLOYER_PERIOD_DAYS'
932                                   ,p_person_id      => P_PERSON_ID
933                                   ,p_effective_date => P_EFFECTIVE_DATE) THEN
934        Fnd_message.set_name('PAY','PAY_376932_ABS_SC_EMPLR_PERIOD');
935        Fnd_message.raise_error;
936      END IF;
937 
938 
939       IF l_tot_abs > 3 THEN -- Bug#8905705 fix
940        Fnd_message.set_name('PAY','PAY_376869_NO_ABS_SELF_CERT');
941          Fnd_message.raise_error;
942       END IF;
943 
944       --Error - Only 4 self certificate absences are allowed for an year.
945         BEGIN
946              SELECT count(1)
947                INTO l_abs_count
948                FROM PER_ABSENCE_ATTENDANCES PAA
949               WHERE PAA.PERSON_ID = l_person_id
950                 AND PAA.DATE_END BETWEEN add_months(l_abs_start_date, -12) AND (l_abs_start_date-1)
951                 AND PAA.ABS_INFORMATION1 = 'SC'
952                 AND PAA.DATE_START IS NOT NULL
953                 AND PAA.DATE_END IS NOT NULL;
954         EXCEPTION
955            WHEN OTHERS THEN
956                 l_abs_count := 0;
957         END;
958         --Moved above query to cursor csr_absences_in_12months for Bug# 14073252
959 
960      OPEN  csr_absences_in_12months(P_PERSON_ID,l_abs_start_date);
961      FETCH csr_absences_in_12months INTO r_absences_in_12months;
962      CLOSE csr_absences_in_12months;
963 
964      --SC Warning 3 --Bug# 14073252
965      IF r_absences_in_12months.counts > get_rule_value(p_rule           => 'YEARLY_COUNT'
966                                                       ,p_person_id      => P_PERSON_ID
967                                                       ,p_effective_date => P_EFFECTIVE_DATE) THEN
968        Fnd_message.set_name('PAY','PAY_376931_ABS_SC_YEARLY_COUNT');
969        Fnd_message.raise_error;
970      END IF;
971 
972      --SC Warning 4 --Bug# 14073252
973      IF r_absences_in_12months.days > get_rule_value(p_rule           => 'YEARLY_DAYS'
974                                                     ,p_person_id      => P_PERSON_ID
975                                                     ,p_effective_date => P_EFFECTIVE_DATE) THEN
976        Fnd_message.set_name('PAY','PAY_376930_ABS_SC_YEARLY_DAYS');
977        Fnd_message.raise_error;
978      END IF;
979 
980 
981 
982         IF l_abs_count >= 4 THEN
983   	   Fnd_message.set_name('PAY','PAY_376907_NO_SC_NOT_ELIGIBLE');
984            Fnd_message.raise_error;
985         END IF;
986         */ -- All SC Warnings not applicable in Self Service. Only below Error appears.
987 
988      --SC Error 1 --Bug# 14073252
989      IF is_reimbursement_day   (p_person_id       => P_PERSON_ID
990                                ,p_abs_link_period => l_abs_link_period
991                                ,p_start_date      => l_abs_start_date
992                                ,p_end_date        => NVL(l_abs_end_date,l_abs_start_date)) =1 THEN
993        Fnd_message.set_name('PAY','PAY_376888_ABS_SC_REIMB_DAY');
994        Fnd_message.raise_error;
995      END IF;
996 
997   END IF;
998 
999   IF P_ABS_INFORMATION_CATEGORY IN ('NO_S','NO_PTS') THEN
1000     -- Error - if the Entitltment for self certificate is No and type is selected as Self certification
1001     IF l_entitled_sc = 'N' AND P_ABS_INFORMATION1 = 'SC' THEN
1002       Fnd_message.set_name('PAY','PAY_376907_NO_SC_NOT_ELIGIBLE');
1003       Fnd_message.raise_error;
1004     END IF;
1005 
1006       -- Error - if the Self certification is used and the service is less than 2 months
1007       l_months_employed_curr := trunc(months_between(l_abs_start_date,l_person_hire_date),2);
1008       IF l_months_employed_curr < 2 AND P_ABS_INFORMATION1 = 'SC' THEN
1009 	 Fnd_message.set_name('PAY','PAY_376907_NO_SC_NOT_ELIGIBLE');
1010          Fnd_message.raise_error; -- This is warning not error
1011       END IF;
1012   END IF;
1013 
1014   -- Bug#8510300 start
1015   IF p_abs_information_category IN ('NO_CMS') THEN
1016     --
1017     -- Check if this absence overlaps another absence for the same person.
1018     --
1019     IF (NVL(l_glb_overlap_chk_done,'N') = 'N') THEN
1020       chk_absence_overlap (p_absence_attendance_id =>  NULL
1021                           ,p_person_id             => p_person_id
1022                           ,p_date_start            => p_date_start
1023                           ,p_date_end              => p_date_end
1024                           );
1025     END IF;
1026 
1027     l_cms_warnings := cms_validation( p_person_id      => p_person_id
1028                                      ,p_date_start     => p_date_start
1029                                      ,p_date_end       => p_date_end
1030                                      ,p_cert_type      => p_abs_information1
1031                                      ,p_dis_child_care => p_abs_information9
1032                                      ,p_absence_days   => p_absence_days
1033                                     );
1034     IF (INSTR(l_cms_warnings,'6') > 0) THEN
1035        hr_utility.set_message(801, 'PAY_376907_NO_SC_NOT_ELIGIBLE');
1036        hr_multi_message.add
1037             (p_message_type => hr_multi_message.g_warning_msg
1038             );
1039     END IF;
1040     IF (INSTR(l_cms_warnings,'1') > 0) THEN
1041        hr_utility.set_message(801, 'PAY_376934_NO_CHILD_REG');
1042        hr_multi_message.add
1043             (p_message_type => hr_multi_message.g_warning_msg
1044             );
1045     END IF;
1046     IF (INSTR(l_cms_warnings,'2') > 0) THEN
1047        hr_utility.set_message(801, 'PAY_376935_NO_CHILD_MIN_AGE');
1048        hr_multi_message.add
1049             (p_message_type => hr_multi_message.g_warning_msg
1050             );
1051     END IF;
1052     IF (INSTR(l_cms_warnings,'3') > 0) THEN
1053        hr_utility.set_message(801, 'PAY_376914_NO_CMS_CONT_CHECK');
1054        hr_multi_message.add
1055             (p_message_type => hr_multi_message.g_warning_msg
1056             );
1057     END IF;
1058     IF (INSTR(l_cms_warnings,'4') > 0) THEN
1059        hr_utility.set_message(801, 'PAY_376936_NO_LIMIT_EXCEEED');
1060        hr_multi_message.add
1061             (p_message_type => hr_multi_message.g_warning_msg
1062             );
1063     END IF;
1064     IF (INSTR(l_cms_warnings,'5') > 0) THEN
1065        hr_utility.set_message(801, 'PAY_376937_NO_NAV_REQ');
1066        hr_multi_message.add
1067             (p_message_type => hr_multi_message.g_warning_msg
1068             );
1069     END IF;
1070   END IF;
1071   -- Bug#8510300 end
1072   END IF;
1073 
1074 
1075     IF P_ABS_INFORMATION_CATEGORY IN ('NO_PA','NO_PTP','NO_M','NO_PTM','NO_IE_AL','NO_PTA') THEN
1076 
1077 	l_months_employed_prev :=0;
1078 	l_months_employed_curr :=0;
1079 	l_months_employed := 0;
1080 	l_eligible := 'N';
1081 
1082 	l_months_employed_curr := trunc(months_between(l_abs_start_date,l_person_hire_date),2);
1083 
1084 	OPEN csr_get_glb_value('NO_ABSENCE_MIN_MONTHS_SERVICE_REQUIRED',l_abs_start_date);
1085 	FETCH csr_get_glb_value INTO l_min_worked_months;
1086 	CLOSE csr_get_glb_value;
1087 
1088 	IF l_months_employed_curr >= l_min_worked_months THEN --changed to global
1089 		l_eligible := 'Y';
1090 	ELSE
1091 		OPEN csr_get_glb_value('NO_ABSENCE_SERVICE_REQUIRED_WITHIN_MONTHS',l_abs_start_date);
1092 		FETCH csr_get_glb_value INTO l_within_n_months;
1093 		CLOSE csr_get_glb_value;
1094 
1095 		l_within_n_months := -1 * l_within_n_months;
1096 		l_check_start_date := add_months(l_abs_start_date - 1,l_within_n_months); --changed to global
1097 		l_months_employed_prev := PAY_NO_ABSENCE.get_months_employed(l_person_id,l_check_start_date,l_person_hire_date);
1098 		l_months_employed := l_months_employed_curr + l_months_employed_prev;
1099 		IF l_months_employed >= l_min_worked_months THEN --changed to global
1100 			l_eligible := 'Y';
1101 		END IF;
1102 		l_within_n_months := -1 * l_within_n_months;
1103 	END IF;
1104 
1105 	IF l_eligible = 'N' THEN
1106 		--fnd_message.debug ('Person is not eligible to avail this absence as he/she is not employed for 6/10 months'); -- put proper warning message
1107 		fnd_message.set_name('PAY','PAY_376875_NO_PARENTAL_ELIGIBL');
1108 		fnd_message.set_token('MIN',to_char(l_min_worked_months));
1109 		fnd_message.set_token('LIMIT',to_char(l_within_n_months));
1110 		Fnd_message.raise_error;
1111 
1112        END IF;
1113        IF P_ABS_INFORMATION_CATEGORY IN ('NO_PA','NO_PTP') THEN
1114           -- Error - if the absence start date is earlier than the date of birth
1115           l_date_of_birth := fnd_date.canonical_to_date(P_ABS_INFORMATION1) ;
1116           IF l_date_of_birth > P_DATE_START THEN
1117              Fnd_message.set_name('PAY','PAY_376905_NO_DOB_ST_DT_CHECK');
1118              Fnd_message.raise_error;
1119           END IF;
1120        END IF;
1121        IF  P_ABS_INFORMATION_CATEGORY  ='NO_M' THEN
1122          IF NVL(P_ABS_INFORMATION5,'N') = 'N' AND  P_ABS_INFORMATION6 IS NOT NULL THEN
1123             fnd_message.set_name('PER','HR_376901_NO_ABS_NO_SPOUSE');
1124             fnd_message.raise_error;
1125          END IF;
1126        END IF ;
1127     END IF;
1128 END CREATE_ABS_VALIDATION ;
1129 
1130 --Update Mode validations
1131 procedure UPDATE_ABS_VALIDATION (P_ABS_INFORMATION_CATEGORY in varchar2
1132                                     ,P_ABSENCE_ATTENDANCE_ID in NUMBER
1133                                     ,P_EFFECTIVE_DATE in DATE
1134                                     ,P_ABS_INFORMATION1 in VARCHAR2
1135                                     ,P_ABS_INFORMATION2 in VARCHAR2
1136                                     ,P_ABS_INFORMATION3 in VARCHAR2
1137                                     ,P_ABS_INFORMATION5 in VARCHAR2
1138                                     ,P_ABS_INFORMATION6 in VARCHAR2
1139                                     ,P_ABS_INFORMATION9 in VARCHAR2 --#8510300
1140                                     ,P_ABS_INFORMATION15 in VARCHAR2
1141                                     ,P_ABS_INFORMATION16 in VARCHAR2
1142                                     ,P_DATE_START in DATE
1143                                     ,P_DATE_END in DATE
1144                                     ,P_DATE_PROJECTED_START in DATE
1145                                     ,P_DATE_PROJECTED_END in DATE
1146                                     ,P_ABSENCE_DAYS in NUMBER 			--#8510300
1147                                     ,P_ABS_ATTENDANCE_REASON_ID in NUMBER) is
1148 
1149 -- Get the person Id
1150 CURSOR get_person_id (p_abs_attendance_id in NUMBER) is
1151 SELECT person_id
1152   FROM PER_ABSENCE_ATTENDANCES
1153  WHERE ABSENCE_ATTENDANCE_ID = p_abs_attendance_id;
1154 
1155  l_person_id NUMBER;
1156 BEGIN
1157     OPEN get_person_id(P_ABSENCE_ATTENDANCE_ID);
1158     FETCH get_person_id INTO l_person_id;
1159     CLOSE get_person_id;
1160 
1161     l_glb_absence_attendance_id := P_ABSENCE_ATTENDANCE_ID; --#8510300/14542232
1162     -- Bug#8510300 start
1163     IF p_abs_information_category IN ('NO_CMS') THEN
1164       --
1165       -- Check if this absence overlaps another absence for the same person.
1166       --
1167       chk_absence_overlap (p_absence_attendance_id => p_absence_attendance_id
1168                           ,p_person_id             => l_person_id
1169                           ,p_date_start            => p_date_start
1170                           ,p_date_end              => p_date_end
1171                           );
1172       l_glb_overlap_chk_done := 'Y';
1173     END IF;
1174     -- Bug#8510300 end
1175     -- Get the Person ID and pass it to Absence Create level validation package
1176     CREATE_ABS_VALIDATION (P_ABS_INFORMATION_CATEGORY
1177                           ,l_person_id
1178                           ,P_EFFECTIVE_DATE
1179                           ,P_ABS_INFORMATION1
1180                           ,P_ABS_INFORMATION2
1181                           ,P_ABS_INFORMATION3
1182                           ,P_ABS_INFORMATION5
1183                           ,P_ABS_INFORMATION6
1184                           ,P_ABS_INFORMATION9      --#8510300
1185                           ,P_ABS_INFORMATION15
1186                           ,P_ABS_INFORMATION16
1187                           ,P_DATE_START
1188                           ,P_DATE_END
1189                           ,P_DATE_PROJECTED_START
1190                           ,P_DATE_PROJECTED_END
1191                           ,P_ABSENCE_DAYS			    --#8510300
1192                           ,P_ABS_ATTENDANCE_REASON_ID ) ;
1193 
1194     l_glb_overlap_chk_done := 'N';  -- Bug#8510300
1195     l_glb_absence_attendance_id := NULL;  --#8510300/14542232
1196 END UPDATE_ABS_VALIDATION;
1197 
1198 END  PAY_NO_ABS_VALIDATION;