DBA Data[Home] [Help]

PACKAGE BODY: APPS.PAY_DK_ABSENCE_USER

Source


1 PACKAGE BODY PAY_DK_ABSENCE_USER AS
2 /*$Header: pydkabsence.pkb 120.2.12000000.4 2007/03/29 11:49:48 nprasath noship $*/
3 
4 -------------------------------------------------------------------------------------------------------------------------
5 /*  Element populate function to return Input values of absence element */
6    -- NAME
7    --  Element_populate
8    -- PURPOSE
9    --  To populate element input values for absence recording.
10    -- ARGUMENTS
11    --  P_ASSIGNMENT_ID         - Assignment id
12    --  P_PERSON_ID 	       - Person id,
13    --  P_ABSENCE_ATTENDANCE_ID - Absence attendance id,
14    --  P_ELEMENT_TYPE_ID       - Element type id,
15    --  P_ABSENCE_CATEGORY      - Absence category ( Sickness ),
16    --  P_INPUT_VALUE_NAME 1-15 - Output variable holds element input value name.
17    --  P_INPUT_VALUE 1-15      - Output variable holds element input value.
18    -- USES
19    -- NOTES
20    --  The procedure fetches absence information from absence table with input absence_attendance_id and absence
21    --  category 'Sickness' and 'Vacation'. Then it assigns the values to output variables.
22 -------------------------------------------------------------------------------------------------------------------------
23 Function Element_populate(p_assignment_id         in number,
24                 p_person_id 	in number,
25                 p_absence_attendance_id in number,
26                 p_element_type_id 	    in number,
27                 p_absence_category 	    in varchar2,
28                 p_original_entry_id     OUT nocopy NUMBER,
29                 p_input_value_name1 	OUT NOCOPY VARCHAR2,
30 		p_input_value1	    	OUT NOCOPY VARCHAR2,
31                 p_input_value_name2 	OUT NOCOPY VARCHAR2,
32 		p_input_value2	    	OUT NOCOPY VARCHAR2,
33                 p_input_value_name3 	OUT NOCOPY VARCHAR2,
34 		p_input_value3	    	OUT NOCOPY VARCHAR2,
35                 p_input_value_name4 	OUT NOCOPY VARCHAR2,
36 		p_input_value4	    	OUT NOCOPY VARCHAR2,
37                 p_input_value_name5 	OUT NOCOPY VARCHAR2,
38 		p_input_value5	    	OUT NOCOPY VARCHAR2,
39                 p_input_value_name6 	OUT NOCOPY VARCHAR2,
40 		p_input_value6	    	OUT NOCOPY VARCHAR2,
41                 p_input_value_name7 	OUT NOCOPY VARCHAR2,
42 		p_input_value7	    	OUT NOCOPY VARCHAR2,
43                 p_input_value_name8 	OUT NOCOPY VARCHAR2,
44 		p_input_value8	    	OUT NOCOPY VARCHAR2,
45                 p_input_value_name9 	OUT NOCOPY VARCHAR2,
46 		p_input_value9	    	OUT NOCOPY VARCHAR2,
47                 p_input_value_name10 	OUT NOCOPY VARCHAR2,
48 		p_input_value10	    	OUT NOCOPY VARCHAR2,
49                 p_input_value_name11 	OUT NOCOPY VARCHAR2,
50 		p_input_value11	    	OUT NOCOPY VARCHAR2,
51                 p_input_value_name12 	OUT NOCOPY VARCHAR2,
52 		p_input_value12	    	OUT NOCOPY VARCHAR2,
53                 p_input_value_name13 	OUT NOCOPY VARCHAR2,
54 		p_input_value13	    	OUT NOCOPY VARCHAR2,
55                 p_input_value_name14 	OUT NOCOPY VARCHAR2,
56 		p_input_value14	    	OUT NOCOPY VARCHAR2,
57                 p_input_value_name15 	OUT NOCOPY VARCHAR2,
58 		p_input_value15	    	OUT NOCOPY VARCHAR2) RETURN VARCHAR2 IS
59 
60 
61 		/*Cursor to get the intial entry id*/
62 		CURSOR csr_get_intial_entry_id(p_creator_id IN VARCHAR2 ,p_assignment_id IN NUMBER ) IS
63 		SELECT
64 			peef.element_entry_id
65 		FROM
66 			pay_element_entry_values_f peevf
67 			,pay_input_values_f pivf
68 			,pay_element_entries_f peef
69 		WHERE
70 			peevf.screen_entry_value = p_creator_id
71 			AND pivf.input_value_id = peevf.input_value_id
72 			AND pivf.NAME = 'CREATOR_ID'
73 			AND pivf.legislation_code = 'DK'
74 			AND peef.element_entry_id  = peevf.element_entry_id
75 	AND peef.assignment_id = p_assignment_id;
76 
77 l_start_date            date;
78 l_end_date              date;
79 l_absent_reason         number;
80 l_start_time            varchar2(20);
81 l_end_time              varchar2(20);
82 l_intial_absence        varchar2(3);
83 l_initial_abs_creator_id number;
84 
85 BEGIN
86 
87 
88  hr_utility.set_location('Entering: Element_populate ', 10);
89   hr_utility.set_location('p_absence_attendance_id'|| p_absence_attendance_id, 10);
90 
91        -- Fetch absence attendance details
92        BEGIN
93           SELECT abs.date_start
94                  ,abs.date_end
95                  ,abs.ABS_ATTENDANCE_REASON_ID
96                  ,abs.TIME_START
97                  ,abs.TIME_END
98                  ,abs.abs_information1
99                  ,abs.abs_information2
100           INTO   l_start_date
101                  ,l_end_date
102                  ,l_absent_reason
103                  ,l_start_time
104                  ,l_end_time
105                  ,l_intial_absence
106                  ,l_initial_abs_creator_id
107           FROM   per_absence_attendances      abs
108           WHERE  abs.absence_attendance_id      = p_absence_attendance_id;
109        EXCEPTION
110           WHEN OTHERS THEN
111                NULL;
112        END;
113     -- Check if absence category is S ( Sickness )
114     IF p_absence_category = 'S' THEN
115                 p_input_value_name1 := 'Start Date';
116 		p_input_value1	    := 	l_start_date;
117                 p_input_value_name2 := 'End Date';
118 		p_input_value2	    := 	l_end_date;
119                 p_input_value_name3 := 'Start Time';
120 		p_input_value3	    := 	l_start_time;
121                 p_input_value_name4 := 'End Time';
122 		p_input_value4	    := 	l_end_time;
123                 p_input_value_name5 := 'Absent Reason';
124                -- Fetch absence reason from the lookup
125     	       BEGIN
126         		    SELECT Meaning
127         		    INTO p_input_value5
128         		    FROM FND_LOOKUP_VALUES_VL LKP
129         			     ,PER_ABSENCE_ATTENDANCES PAA
130         			     ,PER_ABS_ATTENDANCE_REASONS PAR
131         		    WHERE PAA.ABSENCE_ATTENDANCE_TYPE_ID  = PAR.ABSENCE_ATTENDANCE_TYPE_ID
132         		      AND PAA.ABSENCE_ATTENDANCE_ID = p_absence_attendance_id
133         		      AND PAR.ABS_ATTENDANCE_REASON_ID = l_absent_reason
134         		      AND LKP.lookup_type = 'ABSENCE_REASON'
135         		      AND LOOKUP_CODE = PAR.NAME
136                             -- Bug No 4994835. Group by clause introduced to avoid duplicate records
137 			    GROUP BY LKP.Meaning;
138                EXCEPTION
139     		        WHEN OTHERS THEN
140     		             NULL;
141     	       END;
142                 p_input_value_name6 := 'CREATOR_ID';
143 		p_input_value6	    := 	p_absence_attendance_id;
144 
145     -- Check if absence category is V ( Vacation or Holiday )
146     ELSIF p_absence_category = 'V' THEN
147                 p_input_value_name1 := 'Start Date';
148 		p_input_value1	    := 	l_start_date;
149                 p_input_value_name2 := 'End Date';
150 		p_input_value2	    := 	l_end_date;
151                 p_input_value_name3 := 'Start Time';
152 		p_input_value3	    := 	l_start_time;
153                 p_input_value_name4 := 'End Time';
154 		p_input_value4	    := 	l_end_time;
155                 p_input_value_name5 := 'Absent Reason';
156                -- Fetch absence reason from the lookup
157     	       BEGIN
158         		    SELECT Meaning
159         		    INTO p_input_value5
160         		    FROM FND_LOOKUP_VALUES_VL LKP
161         			     ,PER_ABSENCE_ATTENDANCES PAA
162         			     ,PER_ABS_ATTENDANCE_REASONS PAR
163         		    WHERE PAA.ABSENCE_ATTENDANCE_TYPE_ID  = PAR.ABSENCE_ATTENDANCE_TYPE_ID
164         		      AND PAA.ABSENCE_ATTENDANCE_ID = p_absence_attendance_id
165         		      AND PAR.ABS_ATTENDANCE_REASON_ID = l_absent_reason
166         		      AND LKP.lookup_type = 'ABSENCE_REASON'
167         		      AND LOOKUP_CODE = PAR.NAME
168                             -- Bug No 4994835. Group by clause introduced to avoid duplicate records
169 			    GROUP BY LKP.Meaning;
170                EXCEPTION
171     		        WHEN OTHERS THEN
172     		             NULL;
173     	       END;
174                 p_input_value_name8 := 'CREATOR_ID';
175 		p_input_value8	    := 	p_absence_attendance_id;
176 
177     -- Check if absence category is M ( Maternity )
178     ELSIF p_absence_category in ('M','PA','IE_AL','IE_PL','PTM') THEN
179                     p_input_value_name1 := 'Start Date';
180     		p_input_value1	    := 	l_start_date;
181                     p_input_value_name2 := 'End Date';
182     		p_input_value2	    := 	l_end_date;
183                     p_input_value_name3 := 'Start Time';
184     		p_input_value3	    := 	l_start_time;
185                     p_input_value_name4 := 'End Time';
186     		p_input_value4	    := 	l_end_time;
187                 p_input_value_name10 := 'CREATOR_ID';
188 		p_input_value10	    := 	p_absence_attendance_id;
189 		/* Included for Maternity Linking*/
190 		If p_absence_category in ('M','PTM') then
191 	            p_input_value_name13 := 'Full or Part Time';
192 		    p_input_value13	 :=  hr_general.decode_lookup('DK_MAT_DURATION',p_absence_category);
193 		End if;
194 
195 		 IF l_intial_absence = 'N' THEN
196 		       OPEN csr_get_intial_entry_id(l_initial_abs_creator_id,p_assignment_id);
197 		       FETCH csr_get_intial_entry_id INTO p_original_entry_id;
198        			CLOSE csr_get_intial_entry_id;
199        	         End if;
200     END IF;
201 
202 
203 -- Return Y indicating to process the element for the input assignment id.
204 RETURN 'Y';
205 END Element_populate;
206 
207 FUNCTION get_override_details
208  (p_assignment_id               IN         NUMBER
209  ,p_effective_date              IN         DATE
210  ,p_abs_start_date              IN         DATE
211  ,p_abs_end_date                IN         DATE
212  ,p_pre_birth_duration          IN OUT NOCOPY NUMBER
213  ,p_post_birth_duration         IN OUT NOCOPY NUMBER
214  ,p_maternity_allowance_used    OUT NOCOPY NUMBER
215  ,p_shared_allowance_used       OUT NOCOPY NUMBER
216  ,p_holiday_override            OUT NOCOPY NUMBER
217  ,p_part_time_hours             IN OUT NOCOPY NUMBER
218  ,p_part_time_hrs_freq          IN OUT NOCOPY VARCHAR2
219  ) RETURN NUMBER IS
220   --
221   CURSOR get_details(p_assignment_id NUMBER , p_effective_date  DATE ) IS
222    SELECT ee.element_entry_id element_entry_id
223           , eev1.screen_entry_value  screen_entry_value
224           , iv1.name
225    FROM   per_all_assignments_f      asg1
226          ,per_all_assignments_f      asg2
227          ,per_all_people_f           per
228          ,pay_element_links_f        el
229          ,pay_element_types_f        et
230          ,pay_input_values_f         iv1
231          ,pay_element_entries_f      ee
232          ,pay_element_entry_values_f eev1
233    WHERE  asg1.assignment_id    = p_assignment_id
234      AND p_effective_date BETWEEN asg1.effective_start_date AND asg1.effective_end_date
235      AND p_effective_date BETWEEN asg2.effective_start_date AND asg2.effective_end_date
236      AND  per.person_id         = asg1.person_id
237      AND  asg2.person_id        = per.person_id
238      AND  et.element_name       = 'Maternity Override'
239      AND  et.legislation_code   = 'DK'
240      AND  iv1.element_type_id   = et.element_type_id
241      AND  iv1.name              in ('Start Date', 'End Date','Payment During Leave'
242      ,'Pre Birth Duration Override','Post Birth Duration Override','Part Time Hours','Part Time Hours Frequency',
243      'Maternity Weeks Used','Shared Maternity Weeks Used','Holiday Accrual to Supress')
244      AND  el.business_group_id  = per.business_group_id
245      AND  el.element_type_id    = et.element_type_id
246      AND  ee.assignment_id      = asg2.assignment_id
247      AND  ee.element_link_id    = el.element_link_id
248      AND  eev1.element_entry_id = ee.element_entry_id
249      AND  eev1.input_value_id   = iv1.input_value_id
250      AND  p_effective_date BETWEEN ee.effective_start_date AND ee.effective_end_date
251      AND  p_effective_date BETWEEN eev1.effective_start_date AND eev1.effective_end_date
252      AND  p_effective_date BETWEEN iv1.effective_start_date AND iv1.effective_end_date
253      AND  p_effective_date BETWEEN et.effective_start_date AND et.effective_end_date
254      AND  p_effective_date BETWEEN el.effective_start_date AND el.effective_end_date
255      AND  p_effective_date BETWEEN per.effective_start_date AND per.effective_end_date
256      ORDER BY ee.element_entry_id;
257   --
258   TYPE l_record is record (eeid    pay_element_entries_f.element_entry_id%TYPE,
259                            eevalue pay_element_entry_values_f.screen_entry_value%TYPE,
260                            eename  pay_input_values_f.name%TYPE );
261   l_rec l_record;
262   TYPE l_table  is table of l_record index by BINARY_INTEGER;
263   l_tab l_table;
264   l_start_date date;
265   l_end_date date;
266   l_counter number ;
267   l_bool_match boolean;
268   l_num_match number;
269   l_check_nomatch number;
270   l_start_time		      NUMBER;
271   l_end_time		      NUMBER;
272   l_pay_during_leave          VARCHAR2(40);
273   l_pre_birth_duration        NUMBER;
274   l_post_birth_duration       NUMBER;
275   l_over_ride_frequency       NUMBER;
276   l_part_time_hours           NUMBER;
277   l_part_time_hrs_frequency   VARCHAR2(40);
278   l_maternity_allowance_used  NUMBER;
279   l_shared_allowance_used     NUMBER;
280   l_holiday_override NUMBER;
281   --
282  BEGIN
283   --
284   l_counter := 1;
285   l_bool_match := FALSE;
286   l_check_nomatch := 0;
287   p_maternity_allowance_used := 0;
288   p_shared_allowance_used    := 0;
289   -- Open cursor to fetch all screen entry values of Override Holiday Duration element.
290   OPEN  get_details(p_assignment_id , p_effective_date );
291   -- Assign the values to a table type
292   FETCH get_details BULK COLLECT INTO l_tab;
293   CLOSE get_details;
294   -- Loop through each values for processing.
295   FOR l_cur in 1..l_tab.count LOOP
296         -- Assign values to local variables.
297         case l_tab(l_cur).eename
298              when 'Start Date'            		  then     l_start_date              :=to_date(l_tab(l_cur).eevalue,'yyyy/mm/dd hh24:mi:ss');
299              when 'End Date'              		  then     l_end_date                :=to_date(l_tab(l_cur).eevalue,'yyyy/mm/dd hh24:mi:ss');
300            --  when 'Start Time'            		  then     l_start_time              :=l_tab(l_cur).eevalue;
301           --   when 'End Time'              		  then     l_end_time   	     :=l_tab(l_cur).eevalue;
305             -- when 'Override Frequency'              	  then     l_over_ride_frequency     :=l_tab(l_cur).eevalue;
302              when 'Payment During Leave'                  then     l_pay_during_leave        :=l_tab(l_cur).eevalue;
303              when 'Pre Birth Duration Override'           then     l_pre_birth_duration      :=l_tab(l_cur).eevalue;
304              when 'Post Birth Duration Override'          then     l_post_birth_duration     :=l_tab(l_cur).eevalue;
306              when 'Part Time Hours'                       then     l_part_time_hours         :=l_tab(l_cur).eevalue;
307              when 'Part Time Hours Frequency'             then     l_part_time_hrs_frequency :=l_tab(l_cur).eevalue;
308              when 'Maternity Weeks Used'                  then     l_maternity_allowance_used:=l_tab(l_cur).eevalue;
309              when 'Shared Maternity Weeks Used'           then     l_shared_allowance_used   :=l_tab(l_cur).eevalue;
310 	     when 'Holiday Accrual to Supress'            then     l_holiday_override        :=l_tab(l_cur).eevalue;
311         end case;
312        -- Check no. of input values of override element is 12
313 
314         IF l_counter < 10 then
315            l_counter := l_counter + 1;
316         else
317 	   -- Check override element's start and end date matches with Absent element.
318            if l_start_date = p_abs_start_date then
319               -- Multiple entry exists with same start and end date
320               IF l_bool_match THEN
321 		--p_pre_birth_duration         := null;
322 		--p_post_birth_duration        := null;
323 		p_maternity_allowance_used   := 0;
324 		p_shared_allowance_used      := 0;
325                  return -1;
326               -- Exact match found
327               ELSE
328                  l_bool_match := True;
329               END IF;
330               -- Assign input values to output variables.
331 		p_pre_birth_duration         := nvl(l_pre_birth_duration,p_pre_birth_duration) ;
332 		p_post_birth_duration        := nvl(l_post_birth_duration,p_post_birth_duration);
333 		p_maternity_allowance_used   := nvl(l_maternity_allowance_used,0);
334 		p_shared_allowance_used      := nvl(l_shared_allowance_used,0);
335 		p_holiday_override           := l_holiday_override;
336                 p_part_time_hours            := nvl(l_part_time_hours,p_part_time_hours) ;
337 		p_part_time_hrs_freq         := nvl(l_part_time_hrs_frequency,p_part_time_hrs_freq);
338            end if;
339            l_counter := 1;
340        END if;
341   END LOOP;
342   RETURN 0;
343  END get_override_details;
344 /* Function to get Maternity Absence */
345   FUNCTION get_absence_details
346         	 (p_assignment_id               IN         NUMBER
347  		 ,p_date_earned                IN         DATE
348  		 ,p_abs_attendance_id           IN         NUMBER
349  		 ,p_expected_dob                OUT NOCOPY DATE
350  		 ,p_actual_dob                  OUT NOCOPY DATE
351  		 ,p_pre_birth_duration          OUT NOCOPY NUMBER
352  		 ,p_post_birth_duration         OUT NOCOPY NUMBER
353  		 ,p_frequency                   OUT NOCOPY VARCHAR2
354 		 ,p_normal_hours                OUT NOCOPY NUMBER
355 		 ,p_maternity_weeks_transfer    OUT NOCOPY NUMBER
356                  ,p_holiday_accrual             OUT NOCOPY VARCHAR2
357 		) Return varchar2 is
358      CURSOR csr_absence IS SELECT
359 	  fnd_date.canonical_to_date(abs_information4)  expected_dob,
360 	  fnd_date.canonical_to_date(abs_information5)  actual_dob,
361 	  abs_information8  pre_birth_duration,
362 	  abs_information9  post_birth_duration,
363 	  abs_information10 maternity_weeks_transfer,
364           abs_information6  holiday_accrual
365 	 FROM PER_ABSENCE_ATTENDANCES PAA
366      WHERE PAA.ABSENCE_ATTENDANCE_ID = p_abs_attendance_id;
367 
368      CURSOR csr_asg_le IS SELECT
369    	       nvl(asg.normal_hours,hoi.org_information3) hours
370 	      ,nvl(asg.frequency,hoi.org_information4) frequency
371 	 FROM
372 	    hr_organization_information hoi
373            ,HR_SOFT_CODING_KEYFLEX SCL
374 	   ,PER_ALL_ASSIGNMENTS_F ASG
375      WHERE ASG.ASSIGNMENT_ID = p_assignment_id
376 	 AND hoi.organization_id = scl.segment1
377      AND org_information_context = 'DK_EMPLOYMENT_DEFAULTS'
378      AND ASG.SOFT_CODING_KEYFLEX_ID = SCL.SOFT_CODING_KEYFLEX_ID
379      AND fnd_date.canonical_to_date(p_date_earned)  BETWEEN ASG.EFFECTIVE_START_DATE AND ASG.EFFECTIVE_END_DATE;
380     l_count VARCHAR2(2):='N';
381     l_duration_freq VARCHAR2(80);
382   Begin
383   hr_utility.trace('****************Inside***************');
384      FOR csr_abs_details in csr_absence
385      Loop
386         hr_utility.trace('****csr_abs_details.expected_dob**'||csr_abs_details.expected_dob);
387         p_expected_dob        := csr_abs_details.expected_dob;
388         hr_utility.trace('****p_expected_dob**'||p_expected_dob);
389  	p_actual_dob          := csr_abs_details.actual_dob;
390  	p_pre_birth_duration  := csr_abs_details.pre_birth_duration;
391  	p_post_birth_duration := csr_abs_details.post_birth_duration;
392  	p_maternity_weeks_transfer := csr_abs_details.maternity_weeks_transfer;
393 	p_holiday_accrual     := csr_abs_details.holiday_accrual;
394  	l_count := 'Y';
395      End Loop;
396      FOR csr_asg_le_details in csr_asg_le
397      Loop
398        p_normal_hours:= csr_asg_le_details.hours;
399        p_frequency:= csr_asg_le_details.frequency;
400        l_count := 'Y';
401      End Loop;
402      return l_count;
403   End get_absence_details;
404 
405 
406   FUNCTION get_assg_term_date(p_business_group_id IN NUMBER, p_assignment_id IN NUMBER)
407   RETURN DATE IS
408 
409       CURSOR csr_asg IS
410       SELECT MAX(paaf.effective_end_date) effective_end_date
411         FROM per_all_assignments_f paaf
412        WHERE paaf.business_group_id = p_business_group_id
413          AND paaf.assignment_id = p_assignment_id
414          AND paaf.assignment_status_type_id = 1;
415 
416       l_asg_trem_date DATE;
417       l_asg_status csr_asg % rowtype;
418 
419       BEGIN
420 
421         OPEN csr_asg;
422         FETCH csr_asg
423         INTO l_asg_status;
424         CLOSE csr_asg;
425         l_asg_trem_date := l_asg_status.effective_end_date;
426         RETURN l_asg_trem_date;
427 
428 END get_assg_term_date;
429 
430 /*Function to get paternity absence details*/
431 FUNCTION get_pat_abs_details
432        	 (
433 	 p_abs_attendance_id           IN NUMBER,
434 	 p_override_weeks              OUT NOCOPY NUMBER,
435  	 p_holiday_accrual	        OUT NOCOPY VARCHAR2
436 	 ) Return NUMBER IS
437 
438 		 CURSOR get_abs_details IS
439 		 SELECT
440 		 ABS.abs_information7
441                 ,ABS.abs_information5
442 		 FROM per_absence_attendances ABS
443 		 WHERE ABS.absence_attendance_id = p_abs_attendance_id;
444 		 l_abs_details get_abs_details%ROWTYPE ;
445 
446 	 BEGIN
447 
448 		 OPEN get_abs_details;
449 		 FETCH get_abs_details INTO l_abs_details;
450 		 CLOSE get_abs_details;
451 
452 		 p_override_weeks := nvl(l_abs_details.abs_information7,-999) ;
453 	         p_holiday_accrual := l_abs_details.abs_information5;
454 
455 		 RETURN 1 ;
456 	 EXCEPTION WHEN OTHERS THEN
457 		 raise_application_error(-20001,SQLERRM);
458 END get_pat_abs_details;
459 
460  FUNCTION get_paternity_override
461  (p_assignment_id               IN         NUMBER
462  ,p_effective_date              IN         DATE
463  ,p_abs_start_date              IN         DATE
464  ,p_abs_end_date                IN         DATE
465  ,p_duration_override           IN OUT NOCOPY NUMBER
466  ,p_holiday_override            OUT NOCOPY NUMBER
467  ) RETURN NUMBER IS
468   --
469   CURSOR get_details(p_assignment_id NUMBER , p_effective_date  DATE ) IS
470    SELECT ee.element_entry_id element_entry_id
471           , eev1.screen_entry_value  screen_entry_value
472           , iv1.name
473    FROM   per_all_assignments_f      asg1
474          ,per_all_assignments_f      asg2
475          ,per_all_people_f           per
476          ,pay_element_links_f        el
477          ,pay_element_types_f        et
478          ,pay_input_values_f         iv1
479          ,pay_element_entries_f      ee
480          ,pay_element_entry_values_f eev1
481    WHERE  asg1.assignment_id    = p_assignment_id
482      AND p_effective_date BETWEEN asg1.effective_start_date AND asg1.effective_end_date
483      AND p_effective_date BETWEEN asg2.effective_start_date AND asg2.effective_end_date
484      AND  per.person_id         = asg1.person_id
485      AND  asg2.person_id        = per.person_id
486      AND  et.element_name       = 'Paternity Override'
487      AND  et.legislation_code   = 'DK'
488      AND  iv1.element_type_id   = et.element_type_id
489      AND  iv1.name              in ('Start Date', 'End Date','Duration Override Weeks'
490      ,'Holiday Accrual to Supress')
491      AND  el.business_group_id  = per.business_group_id
492      AND  el.element_type_id    = et.element_type_id
493      AND  ee.assignment_id      = asg2.assignment_id
494      AND  ee.element_link_id    = el.element_link_id
495      AND  eev1.element_entry_id = ee.element_entry_id
496      AND  eev1.input_value_id   = iv1.input_value_id
497      AND  p_effective_date BETWEEN ee.effective_start_date AND ee.effective_end_date
498      AND  p_effective_date BETWEEN eev1.effective_start_date AND eev1.effective_end_date
499      AND  p_effective_date BETWEEN iv1.effective_start_date AND iv1.effective_end_date
500      AND  p_effective_date BETWEEN et.effective_start_date AND et.effective_end_date
501      AND  p_effective_date BETWEEN el.effective_start_date AND el.effective_end_date
502      AND  p_effective_date BETWEEN per.effective_start_date AND per.effective_end_date
503      ORDER BY ee.element_entry_id;
504   --
505   TYPE l_record is record (eeid    pay_element_entries_f.element_entry_id%TYPE,
506                            eevalue pay_element_entry_values_f.screen_entry_value%TYPE,
507                            eename  pay_input_values_f.name%TYPE );
508   l_rec l_record;
509   TYPE l_table  is table of l_record index by BINARY_INTEGER;
510   l_tab l_table;
511   l_start_date date;
512   l_end_date date;
513   l_counter number ;
514   l_bool_match boolean;
515   l_num_match number;
516   l_check_nomatch number;
517   l_start_time		      NUMBER;
518   l_end_time		      NUMBER;
519   l_duration_override  NUMBER;
520   l_shared_mat_allowance_used     NUMBER;
521   l_shared_adopt_allowance_used     NUMBER;
522   l_holiday_override NUMBER;
523   --
524  BEGIN
525   --
526   l_counter := 1;
527   l_bool_match := FALSE;
528   l_check_nomatch := 0;
529   --p_shared_duration := 0;
530 
531   -- Open cursor to fetch all screen entry values of Override Holiday Duration element.
532   OPEN  get_details(p_assignment_id , p_effective_date );
533   -- Assign the values to a table type
534   FETCH get_details BULK COLLECT INTO l_tab;
535   CLOSE get_details;
536   -- Loop through each values for processing.
537   FOR l_cur in 1..l_tab.count LOOP
538         -- Assign values to local variables.
539         case l_tab(l_cur).eename
540              when 'Start Date'            		  then     l_start_date                  :=to_date(l_tab(l_cur).eevalue,'yyyy/mm/dd hh24:mi:ss');
541              when 'End Date'              		  then     l_end_date                    :=to_date(l_tab(l_cur).eevalue,'yyyy/mm/dd hh24:mi:ss');
542              when 'Duration Override Weeks'                     then     l_duration_override           :=l_tab(l_cur).eevalue;
543              when 'Holiday Accrual to Supress'            then     l_holiday_override            :=l_tab(l_cur).eevalue;
544         end case;
545        -- Check no. of input values of override element is 12
546         IF l_counter < 4  then
547            l_counter := l_counter + 1;
548         else
549 	   -- Check override element's start and end date matches with Absent element.
550            if l_start_date = p_abs_start_date then
551               -- Multiple entry exists with same start and end date
552               IF l_bool_match THEN
553 		--p_shared_duration   := 0;
554 
555                  return -1;
556               -- Exact match found
557               ELSE
558                  l_bool_match := True;
559               END IF;
560               -- Assign input values to output variables.
561 		p_duration_override   := nvl(l_duration_override,p_duration_override);
562 		p_holiday_override := l_holiday_override;
563 
564            end if;
565            l_counter := 1;
566        END if;
567   END LOOP;
568 
569 
570 
571   RETURN 0;
572  END get_paternity_override;
573 
574 FUNCTION get_adopt_abs_details
575         	 (p_assignment_id               IN         NUMBER
576  		 ,p_date_earned                IN         DATE
577  		 ,p_abs_attendance_id           IN         NUMBER
578  		 ,p_expected_dob                OUT NOCOPY DATE
579  		 ,p_actual_dob                  OUT NOCOPY DATE
580  		 ,p_pre_adopt_duration          OUT NOCOPY NUMBER
581  		 ,p_post_adopt_duration         OUT NOCOPY NUMBER
582 		 ,p_adopt_weeks_transfer        OUT NOCOPY NUMBER
583  		 ,p_weeks_from_mother           OUT NOCOPY NUMBER
584 		 ,p_sex                         OUT NOCOPY VARCHAR2
585 		 ,p_holiday_accrual	        OUT NOCOPY VARCHAR2
586 		) Return NUMBER is
587      CURSOR csr_absence IS SELECT
588 	  fnd_date.canonical_to_date(abs_information4)  expected_dob,
589 	  fnd_date.canonical_to_date(abs_information5)  actual_dob,
590 	  abs_information8  pre_adopt_duration,
591 	  abs_information9  post_adopt_duration,
592 	  abs_information10 adoption_weeks_transfer,
593 	  abs_information11 weeks_from_mother,
594   	  abs_information6  hol_accrual_elig
595 	 FROM PER_ABSENCE_ATTENDANCES PAA
596      WHERE PAA.ABSENCE_ATTENDANCE_ID = p_abs_attendance_id;
597 
598      CURSOR csr_person_details IS
599       SELECT  papf.sex FROM per_all_people_f papf,per_all_assignments_f paaf
600       WHERE
601       paaf.assignment_id = p_assignment_id
602       AND p_date_earned BETWEEN paaf.effective_start_date AND paaf.effective_end_date
603       AND papf.person_id = paaf.person_id
604       AND p_date_earned BETWEEN papf.effective_start_date AND papf.effective_end_date;
605   Begin
606      FOR csr_abs_details in csr_absence
607      Loop
608         p_expected_dob        := csr_abs_details.expected_dob;
609  	p_actual_dob          := csr_abs_details.actual_dob;
610  	p_pre_adopt_duration  := csr_abs_details.pre_adopt_duration;
611  	p_post_adopt_duration := csr_abs_details.post_adopt_duration;
612  	p_adopt_weeks_transfer := nvl(csr_abs_details.adoption_weeks_transfer,0);
613 	p_weeks_from_mother    := nvl(csr_abs_details.weeks_from_mother,0);
614 	p_holiday_accrual      := csr_abs_details.hol_accrual_elig;
615      End Loop;
616 
617     OPEN csr_person_details;
618         FETCH csr_person_details INTO p_sex;
619     CLOSE csr_person_details;
620 
621      RETURN 1 ;
622     EXCEPTION WHEN OTHERS THEN
623 	 raise_application_error(-20001,SQLERRM);
624   End get_adopt_abs_details;
625 
626 
627 FUNCTION get_adopt_override_details
628  (p_assignment_id               IN         NUMBER
629  ,p_effective_date              IN         DATE
630  ,p_abs_start_date              IN         DATE
631  ,p_abs_end_date                IN         DATE
632  ,p_pre_adopt_duration          IN OUT NOCOPY NUMBER
633  ,p_post_adopt_duration         IN OUT NOCOPY NUMBER
634  ,p_adoption_allowance_used    OUT NOCOPY NUMBER
635  ,p_shared_allowance_used       OUT NOCOPY NUMBER
636   ,p_holiday_override            OUT NOCOPY NUMBER
637  ) RETURN NUMBER IS
638   --
639   CURSOR get_details(p_assignment_id NUMBER , p_effective_date  DATE ) IS
640    SELECT ee.element_entry_id element_entry_id
641           , eev1.screen_entry_value  screen_entry_value
642           , iv1.name
643    FROM   per_all_assignments_f      asg1
644          ,per_all_assignments_f      asg2
645          ,per_all_people_f           per
646          ,pay_element_links_f        el
647          ,pay_element_types_f        et
648          ,pay_input_values_f         iv1
649          ,pay_element_entries_f      ee
650          ,pay_element_entry_values_f eev1
651    WHERE  asg1.assignment_id    = p_assignment_id
652      AND p_effective_date BETWEEN asg1.effective_start_date AND asg1.effective_end_date
653      AND p_effective_date BETWEEN asg2.effective_start_date AND asg2.effective_end_date
654      AND  per.person_id         = asg1.person_id
655      AND  asg2.person_id        = per.person_id
656      AND  et.element_name       = 'Adoption Override'
657      AND  et.legislation_code   = 'DK'
658      AND  iv1.element_type_id   = et.element_type_id
659      AND  iv1.name              in ('Start Date', 'End Date','Payment During Leave'
660      ,'Pre Adopt Duration Override','Post Adopt Duration Override','Adoption Weeks Used','Shared Adoption Weeks Used','Holiday Accrual to Supress')
661      AND  el.business_group_id  = per.business_group_id
662      AND  el.element_type_id    = et.element_type_id
663      AND  ee.assignment_id      = asg2.assignment_id
664      AND  ee.element_link_id    = el.element_link_id
665      AND  eev1.element_entry_id = ee.element_entry_id
666      AND  eev1.input_value_id   = iv1.input_value_id
667      AND  p_effective_date BETWEEN ee.effective_start_date AND ee.effective_end_date
668      AND  p_effective_date BETWEEN eev1.effective_start_date AND eev1.effective_end_date
672      AND  p_effective_date BETWEEN per.effective_start_date AND per.effective_end_date
669      AND  p_effective_date BETWEEN iv1.effective_start_date AND iv1.effective_end_date
670      AND  p_effective_date BETWEEN et.effective_start_date AND et.effective_end_date
671      AND  p_effective_date BETWEEN el.effective_start_date AND el.effective_end_date
673      ORDER BY ee.element_entry_id;
674   --
675   TYPE l_record is record (eeid    pay_element_entries_f.element_entry_id%TYPE,
676                            eevalue pay_element_entry_values_f.screen_entry_value%TYPE,
677                            eename  pay_input_values_f.name%TYPE );
678   l_rec l_record;
679   TYPE l_table  is table of l_record index by BINARY_INTEGER;
680   l_tab l_table;
681   l_start_date date;
682   l_end_date date;
683   l_counter number ;
684   l_bool_match boolean;
685   l_num_match number;
686   l_check_nomatch number;
687   l_start_time		      NUMBER;
688   l_end_time		      NUMBER;
689   l_pay_during_leave          VARCHAR2(40);
690   l_pre_adopt_duration        NUMBER;
691   l_post_adopt_duration       NUMBER;
692   l_over_ride_frequency       NUMBER;
693   l_adoption_allowance_used  NUMBER;
694   l_shared_allowance_used     NUMBER;
695   l_holiday_override NUMBER;
696   --
697  BEGIN
698   --
699   l_counter := 1;
700   l_bool_match := FALSE;
701   l_check_nomatch := 0;
702   p_adoption_allowance_used := 0;
703   p_shared_allowance_used    := 0;
704   -- Open cursor to fetch all screen entry values of Override Holiday Duration element.
705   OPEN  get_details(p_assignment_id , p_effective_date );
706   -- Assign the values to a table type
707   FETCH get_details BULK COLLECT INTO l_tab;
708   CLOSE get_details;
709   -- Loop through each values for processing.
710   FOR l_cur in 1..l_tab.count LOOP
711         -- Assign values to local variables.
712         case l_tab(l_cur).eename
713              when 'Start Date'            		  then     l_start_date              :=to_date(l_tab(l_cur).eevalue,'yyyy/mm/dd hh24:mi:ss');
714              when 'End Date'              		  then     l_end_date                :=to_date(l_tab(l_cur).eevalue,'yyyy/mm/dd hh24:mi:ss');
715              when 'Payment During Leave'                  then     l_pay_during_leave        :=l_tab(l_cur).eevalue;
716              when 'Pre Adopt Duration Override'           then     l_pre_adopt_duration      :=l_tab(l_cur).eevalue;
717              when 'Post Adopt Duration Override'          then     l_post_adopt_duration     :=l_tab(l_cur).eevalue;
718              when 'Adoption Weeks Used'                   then     l_adoption_allowance_used :=l_tab(l_cur).eevalue;
719              when 'Shared Adoption Weeks Used'            then     l_shared_allowance_used   :=l_tab(l_cur).eevalue;
720              when 'Holiday Accrual to Supress'            then     l_holiday_override        :=l_tab(l_cur).eevalue;
721         end case;
722        -- Check no. of input values of override element is 12
723         IF l_counter < 8 then
724            l_counter := l_counter + 1;
725         else
726 	   -- Check override element's start and end date matches with Absent element.
727            if l_start_date = p_abs_start_date then
728               -- Multiple entry exists with same start and end date
729               IF l_bool_match THEN
730 		--p_pre_adopt_duration         := null;
731 		--p_post_adopt_duration        := null;
732 		p_adoption_allowance_used   := 0;
733 		p_shared_allowance_used      := 0;
734                  return -1;
735               -- Exact match found
736               ELSE
737                  l_bool_match := True;
738               END IF;
739               -- Assign input values to output variables.
740 		p_pre_adopt_duration         := nvl(l_pre_adopt_duration,p_pre_adopt_duration) ;
741 		p_post_adopt_duration        := nvl(l_post_adopt_duration,p_post_adopt_duration);
742 		p_adoption_allowance_used    := nvl(l_adoption_allowance_used,0);
743 		p_shared_allowance_used      := nvl(l_shared_allowance_used,0);
744 		p_holiday_override           := l_holiday_override;
745            end if;
746            l_counter := 1;
747        END if;
748   END LOOP;
749   RETURN 0;
750  EXCEPTION WHEN OTHERS THEN
751 	 raise_application_error(-20001,SQLERRM);
752  END get_adopt_override_details;
753 
754 FUNCTION get_parental_details
755         	 (p_abs_attendance_id           IN         NUMBER
756  		 ,p_actual_dob                  OUT NOCOPY DATE
757  		 ,p_duration_override           OUT NOCOPY NUMBER
758 		 ,p_parental_type               OUT NOCOPY VARCHAR2
759 		 ,p_holiday_accrual	        OUT NOCOPY VARCHAR2
760  		 ) Return varchar2 is
761      CURSOR csr_absence IS SELECT
762 	  fnd_date.canonical_to_date(abs_information4)  actual_dob,
763 	  abs_information7  duration_override,
764 	  abs_information10 parental_type,
765 	  abs_information5 holiday_accrual
766 	 FROM PER_ABSENCE_ATTENDANCES PAA
767      WHERE PAA.ABSENCE_ATTENDANCE_ID = p_abs_attendance_id;
768     l_count VARCHAR2(2):='N';
769   Begin
770      FOR csr_abs_details in csr_absence
771      Loop
772         p_actual_dob          := csr_abs_details.actual_dob;
773  	p_duration_override   := csr_abs_details.duration_override;
774 	p_parental_type       := csr_abs_details.parental_type;
775 	p_holiday_accrual     := csr_abs_details.holiday_accrual;
776  	l_count := 'Y';
777      End Loop;
778      return l_count;
779 End get_parental_details;
780 
781  FUNCTION get_parental_override
782  (p_assignment_id               IN         NUMBER
783  ,p_effective_date              IN         DATE
784  ,p_abs_start_date              IN         DATE
785  ,p_abs_end_date                IN         DATE
786  ,p_shared_duration          IN OUT NOCOPY NUMBER
787  ,p_shared_mat_allowance_used   OUT NOCOPY NUMBER
788  ,p_shared_adopt_allowance_used OUT NOCOPY NUMBER
789  ,p_holiday_override            OUT NOCOPY NUMBER
790  ) RETURN NUMBER IS
791   --
792   CURSOR get_details(p_assignment_id NUMBER , p_effective_date  DATE ) IS
793    SELECT ee.element_entry_id element_entry_id
794           , eev1.screen_entry_value  screen_entry_value
795           , iv1.name
796    FROM   per_all_assignments_f      asg1
797          ,per_all_assignments_f      asg2
798          ,per_all_people_f           per
799          ,pay_element_links_f        el
800          ,pay_element_types_f        et
801          ,pay_input_values_f         iv1
802          ,pay_element_entries_f      ee
803          ,pay_element_entry_values_f eev1
804    WHERE  asg1.assignment_id    = p_assignment_id
805      AND p_effective_date BETWEEN asg1.effective_start_date AND asg1.effective_end_date
806      AND p_effective_date BETWEEN asg2.effective_start_date AND asg2.effective_end_date
807      AND  per.person_id         = asg1.person_id
808      AND  asg2.person_id        = per.person_id
809      AND  et.element_name       = 'Parental Leave Override'
810      AND  et.legislation_code   = 'DK'
811      AND  iv1.element_type_id   = et.element_type_id
812      AND  iv1.name              in ('Start Date', 'End Date','Duration Override'
813      ,'Shared Maternity Weeks Used','Shared Adoption Weeks Used','Holiday Accrual to Supress')
814      AND  el.business_group_id  = per.business_group_id
815      AND  el.element_type_id    = et.element_type_id
816      AND  ee.assignment_id      = asg2.assignment_id
817      AND  ee.element_link_id    = el.element_link_id
818      AND  eev1.element_entry_id = ee.element_entry_id
819      AND  eev1.input_value_id   = iv1.input_value_id
820      AND  p_effective_date BETWEEN ee.effective_start_date AND ee.effective_end_date
821      AND  p_effective_date BETWEEN eev1.effective_start_date AND eev1.effective_end_date
822      AND  p_effective_date BETWEEN iv1.effective_start_date AND iv1.effective_end_date
823      AND  p_effective_date BETWEEN et.effective_start_date AND et.effective_end_date
824      AND  p_effective_date BETWEEN el.effective_start_date AND el.effective_end_date
825      AND  p_effective_date BETWEEN per.effective_start_date AND per.effective_end_date
826      ORDER BY ee.element_entry_id;
827   --
828   TYPE l_record is record (eeid    pay_element_entries_f.element_entry_id%TYPE,
829                            eevalue pay_element_entry_values_f.screen_entry_value%TYPE,
830                            eename  pay_input_values_f.name%TYPE );
831   l_rec l_record;
832   TYPE l_table  is table of l_record index by BINARY_INTEGER;
833   l_tab l_table;
834   l_start_date date;
835   l_end_date date;
836   l_counter number ;
837   l_bool_match boolean;
838   l_num_match number;
839   l_check_nomatch number;
840   l_start_time		      NUMBER;
841   l_end_time		      NUMBER;
842   l_duration_override  NUMBER;
843   l_shared_mat_allowance_used     NUMBER;
844   l_shared_adopt_allowance_used     NUMBER;
845   l_holiday_override NUMBER;
846   --
847  BEGIN
848   --
849   l_counter := 1;
850   l_bool_match := FALSE;
851   l_check_nomatch := 0;
852   --p_shared_duration := 0;
853   p_shared_mat_allowance_used := 0;
854   p_shared_adopt_allowance_used :=0;
855   -- Open cursor to fetch all screen entry values of Override Holiday Duration element.
856   OPEN  get_details(p_assignment_id , p_effective_date );
857   -- Assign the values to a table type
858   FETCH get_details BULK COLLECT INTO l_tab;
859   CLOSE get_details;
860   -- Loop through each values for processing.
861   FOR l_cur in 1..l_tab.count LOOP
862         -- Assign values to local variables.
863         case l_tab(l_cur).eename
864              when 'Start Date'            		  then     l_start_date                  :=to_date(l_tab(l_cur).eevalue,'yyyy/mm/dd hh24:mi:ss');
865              when 'End Date'              		  then     l_end_date                    :=to_date(l_tab(l_cur).eevalue,'yyyy/mm/dd hh24:mi:ss');
866              when 'Duration Override'                     then     l_duration_override           :=l_tab(l_cur).eevalue;
867              when 'Shared Maternity Weeks Used'           then     l_shared_mat_allowance_used   :=l_tab(l_cur).eevalue;
868              when 'Shared Adoption Weeks Used'            then     l_shared_adopt_allowance_used :=l_tab(l_cur).eevalue;
869              when 'Holiday Accrual to Supress'            then     l_holiday_override            :=l_tab(l_cur).eevalue;
870         end case;
871        -- Check no. of input values of override element is 12
872         IF l_counter < 6  then
873            l_counter := l_counter + 1;
874         else
875 	   -- Check override element's start and end date matches with Absent element.
876            if l_start_date = p_abs_start_date then
877               -- Multiple entry exists with same start and end date
878               IF l_bool_match THEN
879 		--p_shared_duration   := 0;
880 		p_shared_mat_allowance_used  := 0;
881                 p_shared_adopt_allowance_used := 0;
882 
883                  return -1;
884               -- Exact match found
885               ELSE
886                  l_bool_match := True;
887               END IF;
888               -- Assign input values to output variables.
889 		p_shared_duration   := nvl(l_duration_override,p_shared_duration);
890 		p_holiday_override := l_holiday_override;
891                 p_shared_mat_allowance_used  := nvl(l_shared_mat_allowance_used,0);
892                 p_shared_adopt_allowance_used := nvl(l_shared_adopt_allowance_used,0);
893            end if;
894            l_counter := 1;
895        END if;
896   END LOOP;
897 
898 
899 
900   RETURN 0;
901  END get_parental_override;
902 
903 /* Added for Holiday Accrual impact of Maternity and related absences */
904 
905 /* Function to get the effective working days based on work pattern between two given dates*/
906 FUNCTION get_wrk_days_hol_accr
907  (p_wrk_pattern                 IN         VARCHAR2
908  ,p_hrs_in_day                  IN         NUMBER
909  ,p_abs_start_date              IN         DATE
910  ,p_abs_end_date                IN         DATE
911  ,p_abs_start_time              IN         VARCHAR2
912  ,p_abs_end_time                IN         VARCHAR2
913  ) RETURN NUMBER IS
914 
915 l_time_diff NUMBER;
916 l_days_diff NUMBER;
917 l_rem_num_diff NUMBER;
918 l_start_day VARCHAR2(10);
919 l_end_day VARCHAR2(10);
920 l_start_day_num NUMBER;
921 l_end_day_num NUMBER;
922 l_no_weeks NUMBER;
923 l_count_weekend NUMBER;
924 
925 
926 BEGIN
927 
928 l_time_diff	:= 0;
929 l_days_diff	:= 0;
930 l_rem_num_diff	:= 0;
931 l_start_day	:= ' ';
932 l_end_day	:= ' ';
933 l_start_day_num := 0;
934 l_end_day_num	:= 0;
935 l_no_weeks	:= 0;
936 l_count_weekend := 0;
937 
938 l_days_diff := p_abs_end_date - p_abs_start_date + 1;
939 
940 /* Calculate the number of whole weeks involved */
941 l_no_weeks := TRUNC(l_days_diff/7);
942 
943 /* 5 Day pattern means Saturday and Sunday off */
944 /* 5 Day pattern means Sunday off */
945 
946 IF(p_wrk_pattern ='5DAY') THEN
947 l_count_weekend := l_no_weeks*2;
948 ELSIF(p_wrk_pattern ='6DAY') THEN
949 l_count_weekend := l_no_weeks;
950 END IF;
951 
952 /* Count the number of weekends between the remaining days */
953 l_start_day := to_char(p_abs_start_date,'DY','NLS_DATE_LANGUAGE = English');
954 l_end_day := to_char(p_abs_end_date,'DY','NLS_DATE_LANGUAGE = English');
955 
956 l_start_day_num := conv_day_to_num(l_start_day);
957 l_end_day_num := conv_day_to_num(l_end_day);
958 
959 l_rem_num_diff :=  l_end_day_num - l_start_day_num;
960 
961 /* If diff is -1 means one week covered*/
962 IF (l_rem_num_diff <-1 ) THEN
963 	IF(p_wrk_pattern ='5DAY') THEN
964 		IF(l_start_day_num = 7) THEN
965 		l_count_weekend := l_count_weekend + 1;
966 		ELSE
967 		l_count_weekend := l_count_weekend + 2;
968 		END IF;
969 	ELSIF(p_wrk_pattern ='6DAY') THEN
970 	l_count_weekend := l_count_weekend + 1;
971 	END IF;
972 ELSE IF( l_rem_num_diff > 0 AND l_end_day_num = 6 ) THEN
973 	IF(p_wrk_pattern ='5DAY') THEN
974 	l_count_weekend := l_count_weekend + 1;
975 	ELSIF(p_wrk_pattern ='6DAY') THEN
976 	l_count_weekend := l_count_weekend + 0;
977 	END IF;
978      ELSE IF ( l_rem_num_diff > 0 AND l_end_day_num = 7) THEN
979 		IF(p_wrk_pattern ='5DAY') THEN
980 			IF(l_start_day_num = 7) THEN
981 			l_count_weekend := l_count_weekend + 1 ;
982 			ELSE
983 			l_count_weekend := l_count_weekend + 2 ;
984 			END IF;
985 		ELSIF(p_wrk_pattern ='6DAY') THEN
986 			IF(l_start_day_num = 7) THEN
987 			l_count_weekend := l_count_weekend + 1 ;
988 			ELSE
989 			l_count_weekend := l_count_weekend + 1 ;
990 			END IF;
991 		END IF;
992 	   ELSIF (l_rem_num_diff = 0 ) THEN
993 	        IF(l_end_day_num IN(6,7)) THEN
994 		l_count_weekend := l_count_weekend + 1 ;
995 		END IF;
996 	   END IF;
997      END IF;
998 END IF;
999 
1000 
1001 RETURN (l_days_diff - l_count_weekend);
1002 
1003 END get_wrk_days_hol_accr;
1004 
1005 /* Function to convert the day of the week to a number to be used in logic processing */
1006 /* Cannot rely on to_char with format as 'D' to return the same value as dependent on NLS_TERRITORY */
1007 FUNCTION conv_day_to_num( p_day VARCHAR2) RETURN NUMBER IS
1008 l_return NUMBER;
1009 BEGIN
1010 
1011 IF (p_day ='MON') THEN
1012 l_return := 1;
1013 ELSIF (p_day ='TUE') THEN
1014 l_return := 2;
1015 ELSIF (p_day ='WED') THEN
1016 l_return := 3;
1017 ELSIF (p_day ='THU') THEN
1018 l_return := 4;
1019 ELSIF (p_day ='FRI') THEN
1020 l_return := 5;
1021 ELSIF (p_day ='SAT') THEN
1022 l_return := 6;
1023 ELSIF (p_day ='SUN') THEN
1024 l_return := 7;
1025 END IF;
1026 
1027 RETURN l_return;
1028 
1029 END conv_day_to_num;
1030 
1031 /* Function to get Part Time Maternity Details */
1032 FUNCTION get_ptm_abs_details
1033         	 (p_abs_attendance_id           IN         NUMBER
1034  		 ,p_actual_dob                  OUT NOCOPY DATE
1035  		 ,p_part_time_hours             OUT NOCOPY NUMBER
1036 		 ,p_part_time_hrs_freq          OUT NOCOPY VARCHAR2
1037 		 ,p_holiday_accrual	        OUT NOCOPY VARCHAR2
1038  		 ) Return varchar2 is
1039      CURSOR csr_absence IS SELECT
1040 	  fnd_date.canonical_to_date(abs_information4)  actual_dob,
1041 	  fnd_number.canonical_to_number(abs_information7)  part_time_hours,
1042 	  abs_information8  part_time_hrs_freq,
1043 	  abs_information5 holiday_accrual
1044 	 FROM PER_ABSENCE_ATTENDANCES PAA
1045      WHERE PAA.ABSENCE_ATTENDANCE_ID = p_abs_attendance_id;
1046     l_count VARCHAR2(2):='N';
1047   Begin
1048      FOR csr_abs_details in csr_absence
1049      Loop
1050         p_actual_dob          := csr_abs_details.actual_dob;
1051  	p_part_time_hours     := csr_abs_details.part_time_hours;
1052 	p_part_time_hrs_freq  := csr_abs_details.part_time_hrs_freq;
1053 	p_holiday_accrual     := csr_abs_details.holiday_accrual;
1054  	l_count := 'Y';
1055      End Loop;
1056      return l_count;
1057 End get_ptm_abs_details;
1058 
1059 /* End of Function to get Part Time Maternity Details */
1060 /* Function to Get worked Hrs for PTM*/
1061 Function get_part_time_worked_hrs
1062   (p_assignment_id               IN         NUMBER
1063   ,p_date_earned                 IN         DATE
1064   ,p_abs_start_date              IN         DATE
1065   ,p_abs_end_date                IN         DATE
1066   ,p_start_time                  IN         VARCHAR2
1067   ,p_end_time                    IN         VARCHAR2
1068   ,p_worked_hours                OUT NOCOPY NUMBER
1069   ,p_weekly_worked_days          OUT NOCOPY NUMBER
1070   ) return Varchar2 is
1071 
1072    CURSOR csr_asg_le IS SELECT
1073    	       fnd_number.canonical_to_number(nvl(asg.normal_hours,hoi.org_information3)) hours
1074 	      ,nvl(asg.frequency,hoi.org_information4) frequency
1075 	      ,segment10 work_pattern
1076 	 FROM
1077 	    hr_organization_information hoi
1078            ,HR_SOFT_CODING_KEYFLEX SCL
1079 	   ,PER_ALL_ASSIGNMENTS_F ASG
1080      WHERE ASG.ASSIGNMENT_ID = p_assignment_id
1081 	 AND hoi.organization_id = scl.segment1
1082      AND org_information_context = 'DK_EMPLOYMENT_DEFAULTS'
1083      AND ASG.SOFT_CODING_KEYFLEX_ID = SCL.SOFT_CODING_KEYFLEX_ID
1084      AND p_date_earned BETWEEN ASG.EFFECTIVE_START_DATE AND ASG.EFFECTIVE_END_DATE;
1085 
1086    l_count NUMBER;
1087    l_abs_start date;
1088    l_abs_end date;
1089    l_abs_hours_returned NUMBER;
1090    l_hours NUMBER;
1091    l_hours_rate NUMBER;
1092    l_mul_factor NUMBER;
1093    l_work_pattern Varchar2(40);
1094    l_freq VARCHAR2(3);
1095  Begin
1096 
1097         l_abs_start:= p_abs_start_date - to_number(to_char(p_abs_start_date,'D'))+1;
1098         l_abs_end   := l_abs_start+6;
1099 
1100 	hr_utility.trace(' l_abs_start : '||l_abs_start||'  l_abs_end :'||l_abs_end);
1101 
1102      l_count := hr_loc_work_schedule.calc_sch_based_dur(p_assignment_id,'H','N',l_abs_start,l_abs_end,'00','00',l_abs_hours_returned);
1103      l_count := hr_loc_work_schedule.calc_sch_based_dur(p_assignment_id,'D','N',l_abs_start,l_abs_end,'00','00',p_weekly_worked_days);
1104 
1105      FOR csr_asg_le_details in csr_asg_le
1106      Loop
1107            l_hours_rate:= csr_asg_le_details.hours;
1108            l_freq:= csr_asg_le_details.frequency;
1109 	   l_work_pattern := csr_asg_le_details.work_pattern;
1110      End Loop;
1111 
1112      If l_abs_hours_returned = 0 then
1113 	If l_hours_rate is not null and l_freq is not null then
1114 
1115 		IF(l_freq = 'D') THEN
1116 		   l_mul_factor:= 5;
1117 		ELSIF (l_freq = 'W') THEN
1118 		   l_mul_factor := 1;
1119 		ELSIF (l_freq = 'M') THEN
1120 		   l_mul_factor := 5/22;
1121 		ELSIF (l_freq = 'Y') THEN
1122 		   l_mul_factor :=5/260;
1123 		End if;
1124 
1125 		 /* Prorate Employee Hours for new starters and leavers in the period */
1126 		  l_hours := ROUND(l_hours_rate * l_mul_factor,2);
1127         Else
1128 	     p_worked_hours := 0;
1129 	     return 'N';
1130 	End if;
1131 
1132     Else
1133 	 l_hours := l_abs_hours_returned;
1134     End if;
1135     p_worked_hours := l_hours;
1136     return 'Y';
1137  End get_part_time_worked_hrs;
1138  /* End of Function to Get worked Hrs for PTM*/
1139 
1140 END PAY_DK_ABSENCE_USER;