Anda di halaman 1dari 4

/*Sick Leave Deduction Start*/

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'
)

IF(V_Sick_previous_days > V_Sick_Leave_paid_Days)


THEN
( V_Sick_Deduction_Days =
((V_Sick_Leave_Half_paid_Days- V_Sick_period_days) * 0.5 ) + ((V_Total_Days -
V_Sick_Leave_Half_paid_Days)*1)
DEBUG_MSG = DEBUG_MSG||',8')

IF(V_Sick_previous_days < V_Sick_Leave_paid_Days)


THEN
( V_Sick_Deduction_Days =
((V_Sick_Leave_paid_Days - V_Sick_previous_days) * 0 ) + (20 * 0.5 ) +
((V_Total_Days - V_Sick_Leave_Half_paid_Days)*1)
DEBUG_MSG = DEBUG_MSG||',10')
)
V_Sick_Deduction_VAL = round(V_Sick_Deduction_Days * Daily_Rate)
MSG = MSG||'
- Sick Leave: Previous Days:'+ to_text(V_Sick_previous_days) +', Period
days:'+to_text(V_Sick_period_days)||',Sick Deduction
Days:'+to_text(V_Sick_Deduction_Days)+',Sick Deduction
Value:'+to_text(V_Sick_Deduction_VAL)/*||'
-'||DEBUG_MSG*/
)
V_Sick_Deduction_VAL = V_Sick_Deduction_VAL + round(V_sick_work_unpaid_value,2)
/*Sick Leave Deduction End*/
-----------------------------------------------------------------------------------
-------------------

it used the following SQL Package:

FUNCTION Get_Abs_Within_Period_Actual(p_business_group_id IN NUMBER,


p_assignment_id IN NUMBER,
p_absence_type IN VARCHAR2,
p_period_start IN DATE,
p_period_end IN DATE)
RETURN NUMBER IS
days NUMBER;
ded_days NUMBER := 0;
v_national_from DATE;
v_national_to DATE;
v_adha_from DATE;
v_adha_to DATE;
v_fetr_from DATE;
v_fetr_to DATE;
-- Variables to be used within the cursor
sd DATE;
ed DATE;
start_date DATE;
end_date DATE;
leaves_sd DATE;
p_person_id NUMBER := get_person_id(p_assignment_id,
p_business_group_id);

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;

FOR abs IN absences LOOP

start_date := greatest(abs.sd, p_period_start);


end_date := least(abs.ed, p_period_end);

days := days +
Count_Working_Days(start_DATE, (end_DATE - start_date + 1));
END LOOP;

RETURN(nvl(days, 0) - nvl(ded_days, 0));


EXCEPTION
WHEN no_data_found THEN
RETURN(0);

END get_abs_within_period_actual;

--------------------------------

FUNCTION Count_Working_Days (starting_date DATE, total_days NUMBER)


RETURN NUMBER
IS
day_num NUMBER := 0;
count_days NUMBER := 0;
l_date DATE;
l_read_result NUMBER := 0;
BEGIN
-- find day of the week
day_num := TO_CHAR (starting_date, 'D');
l_date := TO_CHAR (starting_date, 'DD-MON-YYYY');

-- loop until end of absence


FOR i IN 1 .. (total_days)
LOOP
-- if neither Saturday nor Friday then add to counter

IF ( (day_num <> 6) AND (day_num <> 7))


THEN
l_read_result := 0;

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;

Anda mungkin juga menyukai