DEBUG_MSG = '1'
V_Sick_Deduction_Days = 0
/*Get Sick leave within this period*/
V_Sick_period_days = MZA_GET_ABSECE_WITHIN_PERIOD('Sick
Leave',PAY_PROC_PERIOD_START_DATE,PAY_PROC_PERIOD_END_DATE)
V_Sick_Leave_paid_Days = 14/*Paid Days'*/
V_Sick_Leave_Half_paid_Days = 34 /*Half Paid Days*/
if(V_Sick_period_days > 0) then
(
DEBUG_MSG = DEBUG_MSG||',2'
/*Get Sick leave from the first day of the year till the last day of
the previous period*/
V_Year_start = to_date('01-JAN-'||
to_char(PAY_PROC_PERIOD_START_DATE,'YYYY'),'DD-MON-YYYY')
V_Sick_previous_days = MZA_GET_ABSECE_WITHIN_PERIOD('Sick
Leave',V_Year_start,add_days(PAY_PROC_PERIOD_START_DATE,-1))
V_Total_Days = V_Sick_previous_days+V_Sick_period_days
/*Calculate Deduction Ratio(Days)*/
/*Case less than 14 Days -- No need to handle this case as there
no deduction*/
/*Case more than 14 and less than 34 Days*/
IF( V_Total_Days > V_Sick_Leave_paid_Days) AND (V_Total_Days <=
V_Sick_Leave_Half_paid_Days) THEN
(
DEBUG_MSG = DEBUG_MSG||',3'
IF(V_Sick_previous_days <= V_Sick_Leave_paid_Days)
THEN
(V_Sick_Deduction_Days = (V_Total_Days -
V_Sick_Leave_paid_Days) *0.5
DEBUG_MSG = DEBUG_MSG||',4')
IF(V_Sick_previous_days > V_Sick_Leave_paid_Days)
THEN
(V_Sick_Deduction_Days = V_Sick_period_days *
0.5
DEBUG_MSG = DEBUG_MSG||',5')
)
/*Case more than 34 Days*/
IF(V_Total_Days > V_Sick_Leave_Half_paid_Days) THEN
(
DEBUG_MSG = DEBUG_MSG||',6'
IF (V_Sick_previous_days >=
V_Sick_Leave_Half_paid_Days) THEN
( V_Sick_Deduction_Days = V_Sick_period_days
DEBUG_MSG = DEBUG_MSG||',7'
)
CURSOR absences IS
SELECT nvl(a.date_start, a.date_projected_start) sd,
nvl(a.date_end, a.date_projected_end) ed
FROM per_absence_attendances a, per_absence_attendance_types b
WHERE upper(b.NAME) = upper(p_absence_type)
AND a.absence_attendance_type_id = b.absence_attendance_type_id
AND a.person_id = p_person_id
AND a.business_group_id = p_business_group_id
AND nvl(a.ABS_ATTENDANCE_REASON_ID,0) not in (1063,1062) -- added to
ignore the leaves of type long leave and sick in some cases
AND ((a.date_start <= p_period_end AND
a.date_end >= p_period_start AND a.date_end IS NOT NULL) OR
(a.date_projected_start <= p_period_end AND
a.date_projected_end >= p_period_start AND
a.date_end IS NULL));
BEGIN
--P_Person_ID
days := 0;
ded_days := 0;
days := days +
Count_Working_Days(start_DATE, (end_DATE - start_date + 1));
END LOOP;
END get_abs_within_period_actual;
--------------------------------
BEGIN
SELECT DISTINCT 1
INTO l_read_result
FROM per_calendar_entries
WHERE (TO_CHAR (l_date, 'DD-MON-YYYY') BETWEEN start_date
AND end_date);
EXCEPTION
WHEN NO_DATA_FOUND
THEN
count_days := count_days + 1;
END;
END IF;
l_date := l_date + 1;
-- if Sunday then start again
IF day_num = 7
THEN
day_num := 1;
ELSE
-- else next day
day_num := day_num + 1;
END IF;
END LOOP;
RETURN count_days;
END Count_Working_Days;