Payroll Package Functions
Payroll Package Functions
XXLAM_HR_PAYROLL_ALL
APPS.XXLAM_HR_ABSENCE_DURATION
========================================================
-- ----------------------------------------------------------------------------
-- |-------------------------< get_element_entry_id >--------------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_element_entry_id (p_assignment_id IN NUMBER,
p_element_name IN VARCHAR2,
p_effective_date IN DATE)
RETURN NUMBER;
----------------------------------------------------------------------------
-- |-------------------------< get_Basic_id >--------------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_basic_at (p_assignment_id NUMBER, p_date DATE)
RETURN NUMBER;
-- ----------------------------------------------------------------------------
-- |-------------------------< get_balance >--------------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_balance (p_assignment_id IN NUMBER,
p_bal_name IN VARCHAR2,
p_bal_dim IN VARCHAR2,
p_effective_date IN DATE)
RETURN NUMBER;
-- ----------------------------------------------------------------------------
-- |-------------------------< get_salary_at >--------------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_gross_at (p_assignment_id NUMBER, p_date DATE)
RETURN NUMBER;
-- ----------------------------------------------------------------------------
-- |-------------------------< get_screen_entry_value_at >---------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_screen_entry_value_at (p_assignment_id Number,
p_element_entry_id Number,
p_element_input_name VARCHAR2,
p_effective_date DATE)
RETURN NUMBER;
-- ----------------------------------------------------------------------------
-- |-------------------------< get_otl_regular_hours >-------------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_otl_regular_hours (p_assignment_id Number,
p_effective_date DATE)
RETURN NUMBER;
-- ----------------------------------------------------------------------------
-- |-------------------------< calculate_Basic_Salary >------------------------|
-- ----------------------------------------------------------------------------
-- ----------------------------------------------------------------------------
-- |-------------------------< calculate_trans_all >---------------------------|
-- ----------------------------------------------------------------------------
-- ----------------------------------------------------------------------------
-- |-------------------------< calculate_housing_all >-------------------------|
-- ----------------------------------------------------------------------------
-- ----------------------------------------------------------------------------
-- |-------------------------< calculate_other_all >---------------------------|
-- ----------------------------------------------------------------------------
-- ----------------------------------------------------------------------------
-- |-------------------------< calculate_gratuity >--------------------------|
-- ----------------------------------------------------------------------------
--
FUNCTION calculate_gratuity (p_assignment_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE,
p_initiator IN VARCHAR2,
p_contract IN VARCHAR2,
p_service_period OUT NOCOPY VARCHAR2)
RETURN NUMBER;
-- ----------------------------------------------------------------------------
-- |-------------------------< get_ticket_value >--------------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_ticket_value_at (p_business_group_id NUMBER,
p_assignment_id NUMBER,
p_date DATE,
p_ticket_adult OUT NUMBER,
p_ticket_child OUT NUMBER)
RETURN NUMBER;
-- ----------------------------------------------------------------------------
-- |-------------------------< get_accrued_ticket >--------------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_accrued_ticket (p_business_group_id NUMBER,
p_assignment_id NUMBER,
p_start_date DATE,
p_end_date DATE,
p_accrued_ticket_a OUT NUMBER,
p_accrued_ticket_c OUT NUMBER,
p_accrued_ticket_a_dep OUT NUMBER)
RETURN NUMBER;
-- ----------------------------------------------------------------------------
-- |-------------------------< get_contract_duration
>--------------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_contract_duration (p_assignment_id NUMBER, p_date DATE)
RETURN NUMBER;
-- ----------------------------------------------------------------------------
-- |-------------------------< get_payroll_name >-----------------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_payroll_name (p_emp_no varchar2, p_date DATE)
RETURN VARCHAR2;
-- ----------------------------------------------------------------------------
-- |-------------------------< get_payroll_name - Overriding Function>--------|
-- ----------------------------------------------------------------------------
FUNCTION get_payroll_name (p_assignment_id NUMBER, p_date date)
RETURN VARCHAR2;
-- ----------------------------------------------------------------------------
-- Get Notified Date
-- ----------------------------------------------------------------------------
FUNCTION get_notified_date (p_emp_no varchar2, p_date DATE)
RETURN DATE;
-- ----------------------------------------------------------------------------
-- Get Person Type
-- ----------------------------------------------------------------------------
FUNCTION get_person_type (p_name_or_id VARCHAR2,
p_person_id NUMBER,
p_effective_date DATE DEFAULT SYSDATE )
RETURN VARCHAR2;
-- ----------------------------------------------------------------------------
-- Get Insurance Type
-- ----------------------------------------------------------------------------
FUNCTION GET_INSURANCE_TYPE (P_BUSINESS_GROUP_ID NUMBER,
P_ASSIGNMENT_ID NUMBER,
P_DATE DATE)
RETURN Varchar2;
-- ----------------------------------------------------------------------------
-- Get GL Conversion Rate
-- ----------------------------------------------------------------------------
-- ----------------------------------------------------------------------------
-- Get Person Type by Assignment_id
-- ----------------------------------------------------------------------------
FUNCTION get_person_type_ass (p_ass_id NUMBER,
p_effective_date DATE DEFAULT SYSDATE )
RETURN VARCHAR2;
-- ----------------------------------------------------------------------------
-- Get Advance Salary Flag
-- ----------------------------------------------------------------------------
FUNCTION get_adv_sal_flag (p_element_entry_id NUMBER,
p_effective_date DATE)
RETURN VARCHAR2;
--------------------------------------------------------------------------------
-- Get OTL Regular Hours Date Earned
-- ----------------------------------------------------------------------------
FUNCTION get_otl_reg_hrs_date_earned (p_element_entry_id NUMBER)
RETURN DATE;
--------------------------------------------------------------------------------
-- Get Weekoff Pay
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Get Hours Per Day
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Get Month Days
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Get the Ticket allowance to be paid monthly
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Skip Regular Hours Yes or No
--------------------------------------------------------------------------------
FUNCTION xxpay_skip_reg_hours_Y_n (p_element_entry_id IN number,
p_e_date IN date)
RETURN varchar2;
--------------------------------------------------------------------------------
-- Function to return the advance salary value based on the repective day
--------------------------------------------------------------------------------
FUNCTION calculate_advance_vac_salary (p_element_entry_id IN number,
p_payroll_id IN number,
p_date IN date)
RETURN number;
-- ----------------------------------------------------------------------------
-- |-------------------------< calculate_food_all >-------------------------|
-- ----------------------------------------------------------------------------
FUNCTION CALCULATE_SALARY_YARD (
p_assignment_id IN NUMBER,
p_element_entry_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE
--- p_month_value OUT NUMBER
)
RETURN NUMBER;
FUNCTION LEL_CALCULATE_GRATUITY (
p_assignment_id IN NUMBER,
p_element_entry_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE
)
RETURN NUMBER;
FUNCTION CALCULATE_SICK_LEAVE_SALARY (
p_assignment_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE,
p_sick_pay OUT NUMBER,
p_sick_ded OUT NUMBER,
p_sick_days OUT NUMBER
)
RETURN NUMBER;
FUNCTION CALCULATE_LEAVE_SALARY(
p_assignment_id IN NUMBER,
p_leave_name IN VARCHAR2,
p_start_date IN DATE,
p_end_date IN DATE,
p_leave_days OUT NUMBER
)
RETURN NUMBER;
FUNCTION CALCULATE_OVERTIME_HOLIDAY (p_assignment_id IN NUMBER,
p_ot_hours IN NUMBER,
p_ot_date IN DATE
)
RETURN NUMBER;
FUNCTION GET_NET_ENTITLEMENT_ANNUAL(
P_ASSG_ID IN NUMBER,
P_PAYROLL_ID IN NUMBER,
P_CALCULATION_DATE IN DATE
)
RETURN NUMBER;
FUNCTION LEL_CALCULATE_LEAVE_ENCASHMENT (
p_assignment_id IN NUMBER,
p_end_date IN DATE,
p_start_date IN DATE,
p_net_entitle IN NUMBER
)
RETURN NUMBER;
FUNCTION GET_ASSG_DFF_VAL (
P_ELEMENT_ENTRY_ID IN NUMBER,
P_ASSG_ID IN NUMBER,
P_END_DATE IN DATE
)
RETURN VARCHAR;
FUNCTION GET_DAY_STATUS (
p_assignment_id IN NUMBER,
p_plan_date IN DATE
)
RETURN VARCHAR2;
FUNCTION get_total_off_days (
p_assignment_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE
)
RETURN NUMBER;
FUNCTION get_emp_work_plan (
p_assignment_id IN NUMBER,
p_plan_date IN DATE
)
RETURN NUMBER;
FUNCTION GET_OT_VALUE (P_ASSG_ID IN NUMBER,
P_END_DATE IN DATE
)
RETURN VARCHAR;
)
RETURN VARCHAR2;
FUNCTION get_ticket_accrual_payment (
p_assignment_id NUMBER,
p_type VARCHAR2,
p_start_date DATE,
p_end_date DATE
)
RETURN NUMBER ;
FUNCTION CAL_ADV_LEAVE_SALARY(
p_assignment_id IN NUMBER,
p_leave_name IN VARCHAR2,
p_start_date IN DATE,
p_end_date IN DATE,
p_leave_days OUT NUMBER
)
RETURN NUMBER;
FUNCTION calculate_food_allowance (
p_assignment_id IN NUMBER,
p_element_entry_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE,
p_food_all IN NUMBER
)
RETURN NUMBER;
FUNCTION GET_OT_CAP(
p_assignment_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE
)
RETURN NUMBER;
FUNCTION calculate_sra_monthly_value (
p_assignment_id IN NUMBER,
p_element_entry_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE
)
RETURN NUMBER;
FUNCTION GET_FOOD_ALLOANCE_DAYS ( p_assg_id in NUMBER,
p_date_start in DATE,
p_date_end in DATE
)
RETURN Number;
FUNCTION GET_PAYSLIP_MISC_REMARK(
p_element_type_id IN NUMBER,
p_ELEMENT_ENTRY_ID IN NUMBER,
p_assignment_action_id IN NUMBER
)
RETURN CHAR;
FUNCTION GET_HSBC_PAYMENT_CODE ( p_assignment_id IN NUMBER,
P_PER_PAY_ID IN NUMBER
)
RETURN CHAR;
FUNCTION GET_CURRENCY_EXCHANGE_RATE ( P_CURRENCY IN CHAR,
P_DATE IN DATE)
RETURN NUMBER;
FUNCTION calculate_food_allo_OM_POOL (
p_assignment_id IN NUMBER,
p_element_entry_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE,
p_food_all IN NUMBER
)
RETURN NUMBER;
END XXLAM_HR_PAYROLL_ALL;
/
===================================================================================
==
Body
===================================================================================
==
CREATE OR REPLACE PACKAGE BODY APPS.xxlam_hr_payroll_all
AS
v_business_group_id number := hr_general.get_business_group_id();
--- v_business_group_id NUMBER := 81;
-- ----------------------------------------------------------------------------
-- |----------------------------< get_action_id >----------------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_action_id (p_assignment_id IN NUMBER, p_effective_date IN DATE)
RETURN NUMBER
IS
l_action_id NUMBER;
BEGIN
SELECT NVL (MAX (assignment_action_id), 0)
INTO l_action_id
FROM pay_assignment_actions paa,
pay_payroll_actions ppa,
per_time_periods ptp,
per_all_assignments_f ass
WHERE ass.assignment_id = p_assignment_id
AND p_effective_date BETWEEN ass.effective_start_date
AND ass.effective_end_date
AND ptp.time_period_id = ppa.time_period_id
AND ppa.payroll_action_id = paa.payroll_action_id
AND paa.assignment_id = p_assignment_id
AND ppa.payroll_id = ass.payroll_id
AND ass.primary_flag = 'Y'
AND action_type IN ('R', 'Q')
--and ptp.end_date <= p_effective_date -- commented this line as the
system is picking the balance based on the previous month payroll periods if quick
pay is proceed in b/w
AND ppa.date_earned <=
p_effective_date
-- added this line to take the latest assignment action id based on date_erned
;
-- ----------------------------------------------------------------------------
-- |-------------------------< get_element_entry_id >--------------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_element_entry_id (
p_assignment_id IN NUMBER,
p_element_name IN VARCHAR2,
p_effective_date IN DATE
)
RETURN NUMBER
AS
l_element_entry_id NUMBER;
BEGIN
SELECT element_entry_id
INTO l_element_entry_id
FROM pay_element_entries_f pee,
pay_element_links_f pel,
pay_element_types_f pet
WHERE 1 = 1
AND p_effective_date BETWEEN pee.effective_start_date
AND pee.effective_end_date
AND p_effective_date BETWEEN pel.effective_start_date
AND pel.effective_end_date
AND p_effective_date BETWEEN pet.effective_start_date
AND pet.effective_end_date
AND pee.element_link_id = pel.element_link_id
AND pet.element_type_id = pee.element_type_id
AND pet.element_name = p_element_name
AND pee.assignment_id = p_assignment_id;
RETURN l_element_entry_id;
EXCEPTION
WHEN OTHERS
THEN
l_element_entry_id := 0;
RETURN l_element_entry_id;
END;
----
FUNCTION get_basic_at (p_assignment_id NUMBER, p_date DATE)
RETURN NUMBER
AS
l_basic_salary NUMBER := 0;
l_gross NUMBER := 0;
l_value NUMBER := 0;
l_person_id NUMBER := 0;
l_person_type VARCHAR2 (100) := NULL;
BEGIN
SELECT MAX (NVL (fnd_number.canonical_to_number (pev.screen_entry_value),
0
)
)
INTO l_gross
FROM pay_element_types_f_vl pet,
pay_input_values_f piv,
pay_element_entry_values_f pev,
pay_element_entries_f peef
WHERE 1 = 1
AND pet.element_type_id = piv.element_type_id
AND UPPER (pet.element_name) = UPPER ('Gross Salary')
AND UPPER (piv.NAME) = UPPER ('Monthly Value')
AND piv.input_value_id = pev.input_value_id
AND peef.element_entry_id = pev.element_entry_id
AND peef.assignment_id = p_assignment_id
AND p_date BETWEEN pev.effective_start_date AND pev.effective_end_date
AND p_date BETWEEN peef.effective_start_date AND peef.effective_end_date
AND p_date BETWEEN piv.effective_start_date AND piv.effective_end_date
AND p_date BETWEEN pet.effective_start_date AND pet.effective_end_date;
-- l_person_type :=
XXLAM_HR_UTILITIES_PKG.GET_PERSON_TYPE('NAME',p_assignment_id ,p_date );
l_person_type :=
xxlam_hr_utilities_pkg.get_person_type ('NAME',
l_person_id,
p_date
);
EXCEPTION
WHEN OTHERS
THEN
l_person_type := 'Worker';
END;
RETURN l_value;
EXCEPTION
WHEN OTHERS
THEN
RETURN 0;
END get_basic_at;
--
-- ----------------------------------------------------------------------------
-- |----------------------------< get_balance >-------------------------------|
-- ----------------------------------------------------------------------------
--
FUNCTION get_balance (
p_assignment_id IN NUMBER,
p_item_name IN VARCHAR2,
p_effective_date IN DATE DEFAULT SYSDATE
)
RETURN NUMBER
IS
CURSOR csr_defined_balance
IS
SELECT TO_NUMBER (ue.creator_id)
FROM ff_database_items di, ff_user_entities ue
WHERE di.user_name = p_item_name
AND ue.user_entity_id = di.user_entity_id
AND ue.creator_type = 'B'
AND ue.business_group_id = v_business_group_id;
--
l_defined_balance_id pay_defined_balances.defined_balance_id%TYPE;
g_message_text VARCHAR2 (240); -- make global
l_balance NUMBER;
l_balance_char VARCHAR2 (12);
l_effective_date DATE;
--
BEGIN
--
OPEN csr_defined_balance;
FETCH csr_defined_balance
INTO l_defined_balance_id;
IF csr_defined_balance%NOTFOUND
THEN
CLOSE csr_defined_balance;
--
SELECT NVL (p_effective_date, effective_date)
INTO l_effective_date
FROM fnd_sessions
WHERE session_id = USERENV ('sessionid');
--
BEGIN
l_balance :=
pay_balance_pkg.get_value (l_defined_balance_id,
p_assignment_id,
l_effective_date
);
EXCEPTION
WHEN NO_DATA_FOUND
THEN
l_balance := 0;
END;
RETURN l_balance;
END get_balance;
FUNCTION get_balance (
p_assignment_id IN NUMBER,
p_bal_name IN VARCHAR2,
p_bal_dim IN VARCHAR2,
p_effective_date IN DATE
)
RETURN NUMBER
IS
l_defined_balance_id NUMBER := 0;
balance_id NUMBER := 0;
balance_value NUMBER := 0;
p_action_id NUMBER;
l_business_group_id NUMBER := 0;
l_legislation_code VARCHAR2 (10);
CURSOR dimension_relevant (
c_balance_type_id IN NUMBER,
c_db_item_suffix IN VARCHAR2
)
IS
SELECT pdb.defined_balance_id
FROM pay_defined_balances pdb, pay_balance_dimensions pbd
WHERE pdb.balance_dimension_id = pbd.balance_dimension_id
AND pbd.database_item_suffix = c_db_item_suffix
AND pdb.balance_type_id = c_balance_type_id;
BEGIN
l_business_group_id := hr_general.get_business_group_id ();
-- l_business_group_id := 81;
/*
SELECT
balance_type_id
INTO
balance_id
FROM
pay_balance_types
WHERE
balance_name = p_bal_name;
*/
BEGIN
SELECT legislation_code
INTO l_legislation_code
FROM per_business_groups
WHERE 1 = 1 AND business_group_id = l_business_group_id;
EXCEPTION
WHEN OTHERS
THEN
l_legislation_code := NULL;
END;
BEGIN
SELECT balance_type_id
INTO balance_id
FROM pay_balance_types
WHERE 1 = 1
AND balance_name = p_bal_name
AND NVL (business_group_id, l_business_group_id) =
l_business_group_id
AND NVL (legislation_code, l_legislation_code) =
l_legislation_code;
EXCEPTION
WHEN OTHERS
THEN
NULL;
END;
IF p_action_id > 0
THEN
IF p_bal_dim = 'ITD'
THEN
balance_value :=
hr_gbbal.calc_asg_itd_action (p_action_id, balance_id);
ELSIF p_bal_dim = 'YTD'
THEN
balance_value :=
hr_gbbal.calc_asg_ytd_action (p_action_id, balance_id);
ELSIF p_bal_dim = 'RUN'
THEN
balance_value :=
hr_gbbal.calc_asg_run_action (p_action_id, balance_id);
ELSIF p_bal_dim = 'PTD'
THEN
OPEN dimension_relevant (balance_id, '_ASG_PTD');
FETCH dimension_relevant
INTO l_defined_balance_id;
CLOSE dimension_relevant;
RETURN balance_value;
EXCEPTION
WHEN OTHERS
THEN
RETURN 0;
END get_balance;
--
-- ----------------------------------------------------------------------------
-- |----------------------------< get_balance - Overriding function >---------|
-- ----------------------------------------------------------------------------
--
FUNCTION get_balance (
p_assignment_id IN NUMBER,
p_business_group_id IN NUMBER,
p_bal_name IN VARCHAR2,
p_bal_dim IN VARCHAR2,
p_effective_date IN DATE
)
RETURN NUMBER
IS
l_defined_balance_id NUMBER := 0;
balance_id NUMBER := 0;
balance_value NUMBER := 0;
p_action_id NUMBER;
l_legislation_code VARCHAR2 (20);
CURSOR dimension_relevant (
c_balance_type_id IN NUMBER,
c_db_item_suffix IN VARCHAR2
)
IS
SELECT pdb.defined_balance_id
FROM pay_defined_balances pdb, pay_balance_dimensions pbd
WHERE 1 = 1
AND pdb.balance_dimension_id = pbd.balance_dimension_id
AND pbd.database_item_suffix = c_db_item_suffix
AND pdb.balance_type_id = c_balance_type_id;
BEGIN
BEGIN
SELECT legislation_code
INTO l_legislation_code
FROM per_business_groups
WHERE 1 = 1 AND business_group_id = p_business_group_id;
EXCEPTION
WHEN OTHERS
THEN
l_legislation_code := NULL;
END;
BEGIN
SELECT balance_type_id
INTObalance_id
FROMpay_balance_types
WHERE 1 = 1
ANDbalance_name = p_bal_name
ANDNVL (business_group_id, p_business_group_id) =
p_business_group_id
AND NVL (legislation_code, l_legislation_code) =
l_legislation_code;
EXCEPTION
WHEN OTHERS
THEN
NULL;
END;
IF p_action_id > 0
THEN
IF p_bal_dim = 'ITD'
THEN
balance_value :=
hr_gbbal.calc_asg_itd_action (p_action_id, balance_id);
ELSIF p_bal_dim = 'YTD'
THEN
balance_value :=
hr_gbbal.calc_asg_ytd_action (p_action_id, balance_id);
ELSIF p_bal_dim = 'RUN'
THEN
balance_value :=
hr_gbbal.calc_asg_run_action (p_action_id, balance_id);
ELSIF p_bal_dim = 'PTD'
THEN
OPEN dimension_relevant (balance_id, '_ASG_PTD');
FETCH dimension_relevant
INTO l_defined_balance_id;
CLOSE dimension_relevant;
FETCH dimension_relevant
INTO l_defined_balance_id;
CLOSE dimension_relevant;
RETURN balance_value;
EXCEPTION
WHEN OTHERS
THEN
RETURN 0;
END get_balance;
-- ----------------------------------------------------------------------------
-- |----------------------------< get_salary_at>------------------------------|
-- ----------------------------------------------------------------------------
--
FUNCTION get_gross_at (p_assignment_id NUMBER, p_date DATE)
RETURN NUMBER
AS
l_salary NUMBER;
BEGIN
SELECT MAX (NVL (fnd_number.canonical_to_number (pev.screen_entry_value),
0
)
)
INTO l_salary
FROM pay_element_types_f_vl pet,
pay_input_values_f piv,
pay_element_entry_values_f pev,
pay_element_entries_f peef
WHERE 1 = 1
AND pet.element_type_id = piv.element_type_id
AND UPPER (pet.element_name) = UPPER ('Gross Salary')
AND UPPER (piv.NAME) IN ('Monthly Value', 'PAY VALUE')
AND piv.input_value_id = pev.input_value_id
AND peef.element_entry_id = pev.element_entry_id
AND peef.assignment_id = p_assignment_id
AND p_date BETWEEN pev.effective_start_date AND pev.effective_end_date
AND p_date BETWEEN peef.effective_start_date AND peef.effective_end_date
AND p_date BETWEEN piv.effective_start_date AND piv.effective_end_date
AND p_date BETWEEN pet.effective_start_date AND pet.effective_end_date;
-- SELECT
-- ppp.proposed_salary_n
-- INTO
-- l_salary
-- FROM
-- per_pay_proposals ppp
-- WHERE
-- ppp.assignment_id = p_assignment_id
-- AND ppp.approved = 'Y'
-- AND change_date =
-- (SELECT
-- MAX (change_date)
-- FROM
-- per_pay_proposals ppp
-- WHERE
-- ppp.assignment_id = p_assignment_id
-- AND ppp.approved = 'Y'
-- ----------------------------------------------------------------------------
-- |-------------------------< get_screen_entry_value_at >---------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_screen_entry_value_at (
p_assignment_id NUMBER,
p_element_entry_id NUMBER,
p_element_input_name VARCHAR2,
p_effective_date DATE
)
RETURN NUMBER
AS
l_value NUMBER;
BEGIN
SELECT NVL (fnd_number.canonical_to_number (pev.screen_entry_value), 0)
INTO l_value
FROM pay_element_types_f_vl pet,
pay_input_values_f piv,
pay_element_entry_values_f pev,
pay_element_entries_f peef
WHERE 1 = 1
-- AND Upper(pet.element_name) = Upper(p_element_name)
AND pet.element_type_id = piv.element_type_id
AND UPPER (piv.NAME) = UPPER (p_element_input_name)
AND piv.input_value_id = pev.input_value_id
AND peef.element_entry_id = pev.element_entry_id
AND peef.element_entry_id = p_element_entry_id
AND p_effective_date BETWEEN pev.effective_start_date
AND pev.effective_end_date
AND p_effective_date BETWEEN peef.effective_start_date
AND peef.effective_end_date
AND p_effective_date BETWEEN piv.effective_start_date
AND piv.effective_end_date
AND p_effective_date BETWEEN pet.effective_start_date
AND pet.effective_end_date;
RETURN l_value;
EXCEPTION
WHEN OTHERS
THEN
l_value := 0;
RETURN l_value;
END;
-- ----------------------------------------------------------------------------
-- |-------------------------< get_otl_regular_hours >-------------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_otl_regular_hours (
p_assignment_id NUMBER,
p_effective_date DATE
)
RETURN NUMBER
IS
l_value NUMBER := 0;
v_week_off NUMBER := 0;
v_holiday NUMBER := 0;
v_person_type VARCHAR2 (30);
-----Add the below Variables
v_element_entry_id NUMBER := 0;
v_date DATE;
v_skip_y_n VARCHAR2 (100) := 'N';
v_term_person_type VARCHAR2 (100) := NULL;
BEGIN
v_person_type :=
get_person_type_ass (p_assignment_id, p_effective_date);
BEGIN
SELECT TO_DATE ( 20
|| '-'
|| TO_CHAR (p_effective_date, 'MON')
|| '-'
|| TO_CHAR (p_effective_date, 'RRRR')
)
INTO v_date
FROM DUAL;
END;
-- added the below if condition to handle the cross months payroll end date
startes here
IF p_effective_date > v_date
THEN
v_date := ADD_MONTHS (v_date, 1);
END IF;
-- added the below if condition to handle the cross months payroll end date
ends here
v_term_person_type :=
get_person_type_ass (p_assignment_id, p_effective_date);
DBMS_OUTPUT.put_line ( 'Regular hours v_term_person_type = '
|| v_term_person_type
);
----Added the below code to getting the payroll period end_date for staff for
that employee ends here
IF v_person_type = 'Worker'
THEN
--SELECT
nvl(sum(fnd_number.canonical_to_number(pev.screen_entry_value)),0)
--INTO l_value
SELECT NVL
(SUM
(fnd_number.canonical_to_number (pev.screen_entry_value)
),
0
),
MAX (peef.element_entry_id)
INTO l_value,
v_element_entry_id
FROM pay_element_types_f_vl pet,
pay_input_values_f piv,
pay_element_entry_values_f pev,
pay_element_entries_f peef
WHERE 1 = 1
AND peef.assignment_id = p_assignment_id
AND piv.NAME = 'Hours'
AND pet.element_name IN ('OTL Regular Hours', 'OTL Holiday Pay')
AND piv.element_type_id = pet.element_type_id
AND peef.element_type_id = pet.element_type_id
AND piv.input_value_id = pev.input_value_id
AND peef.element_entry_id = pev.element_entry_id
AND peef.date_earned = p_effective_date;
ELSE
--SELECT
nvl(sum(fnd_number.canonical_to_number(pev.screen_entry_value)),0)
--INTO l_value
SELECT NVL
(SUM
(fnd_number.canonical_to_number (pev.screen_entry_value)
),
0
),
MAX (peef.element_entry_id)
INTO l_value,
v_element_entry_id
FROM pay_element_types_f_vl pet,
pay_input_values_f piv,
pay_element_entry_values_f pev,
pay_element_entries_f peef
WHERE 1 = 1
AND peef.assignment_id = p_assignment_id
AND piv.NAME = 'Hours'
AND pet.element_name IN ('OTL Regular Hours')
AND piv.element_type_id = pet.element_type_id
AND peef.element_type_id = pet.element_type_id
AND piv.input_value_id = pev.input_value_id
AND peef.element_entry_id = pev.element_entry_id
AND peef.date_earned = p_effective_date;
END IF;
BEGIN
v_holiday :=
xxlam_hr_absence_duration.holidays (p_assignment_id,
p_effective_date,
p_effective_date
);
END;
IF v_person_type = 'Worker'
THEN
IF (v_week_off <> 0 OR v_holiday <> 0)
THEN
l_value := 0;
END IF;
--------Added the below code Starts here
ELSIF v_person_type = 'Staff'
THEN
IF v_skip_y_n = 'Y'
THEN
l_value := 0;
END IF;
--------Added the below code ENDs here
END IF;
,p_effective_date DATE)
RETURN NUMBER IS
l_value Number :=0;
v_week_off number := 0;
v_holiday Number := 0;
v_person_type varchar2(30);
BEGIN
v_person_type := get_person_type_ass(p_assignment_id,p_effective_date);
if v_person_type ='Worker' Then
SELECT nvl(sum(fnd_number.canonical_to_number(pev.screen_entry_value)),0)
INTO l_value
FROM
pay_element_types_f_vl pet,
pay_input_values_f piv,
pay_element_entry_values_f pev,
pay_element_entries_f peef
WHERE 1 = 1
AND peef.assignment_id = p_assignment_id
and piv.name = 'Hours'
and pet.element_name IN ('OTL Regular Hours','OTL Holiday Pay')
and piv.element_type_id = pet.element_type_id
and peef.element_type_id = pet.element_type_id
and piv.input_value_id = pev.input_value_id
and peef.element_entry_id = pev.element_entry_id
and peef.date_earned = p_effective_date;
Else
SELECT nvl(sum(fnd_number.canonical_to_number(pev.screen_entry_value)),0)
INTO l_value
FROM
pay_element_types_f_vl pet,
pay_input_values_f piv,
pay_element_entry_values_f pev,
pay_element_entries_f peef
WHERE 1 = 1
AND peef.assignment_id = p_assignment_id
and piv.name = 'Hours'
and pet.element_name IN ('OTL Regular Hours')
and piv.element_type_id = pet.element_type_id
and peef.element_type_id = pet.element_type_id
and piv.input_value_id = pev.input_value_id
and peef.element_entry_id = pev.element_entry_id
and peef.date_earned = p_effective_date;
End if;
Begin
v_week_off := xxotl_get_week_off_pay(p_assignment_id, p_effective_date,
p_effective_date);
End;
v_person_type := get_person_type_ass(p_assignment_id,p_effective_date);
Begin
v_holiday :=
XXLAM_HR_ABSENCE_DURATION.holidays(p_assignment_id,p_effective_date,p_effective_dat
e);
end;
if v_person_type ='Worker' Then
if (v_week_off <> 0 or v_holiday <> 0) then
l_value := 0;
End if;
End if;
dbms_output.put_line(l_value);
RETURN l_value;
EXCEPTION
WHEN OTHERS THEN
l_value := 0;
return l_value;
END;
*/
-- ----------------------------------------------------------------------------
-- |-------------------------< calculate_Basic_Salary >------------------------|
-- ----------------------------------------------------------------------------
FUNCTION calculate_basic_salary (
p_assignment_id IN NUMBER,
p_element_entry_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE,
p_month_value OUT NUMBER,
p_week_holi_pay OUT NUMBER,
p_maternity_pay OUT NUMBER,
p_maternity_days OUT NUMBER,
p_sick_pay OUT NUMBER,
p_sick_ded OUT NUMBER,
p_sick_days OUT NUMBER
)
RETURN NUMBER
IS
v_salary NUMBER := 0;
v_gross NUMBER := 0;
v_basic NUMBER := 0;
v_days NUMBER := (p_end_date - p_start_date);
v_date DATE;
v_mth_days NUMBER;
v_mth_value NUMBER := 0;
v_sal_per_day NUMBER := 0;
v_hrs_per_day NUMBER := 0;
v_otl_hrs NUMBER (5, 2) := 0;
v_curr_otl_hrs NUMBER (5, 2) := 0;
v_week_hrs NUMBER := 0;
v_curr_week_hrs NUMBER := 0;
v_holiday NUMBER := 0;
v_week_pay NUMBER := 0;
v_holi_pay NUMBER := 0;
v_curr_holiday NUMBER := 0;
v_curr_maternity NUMBER := 0;
v_curr_maternity_pay NUMBER := 0;
v_curr_sick NUMBER := 0;
v_curr_sick_pay NUMBER := 0;
v_curr_sick_ded NUMBER := 0;
v_total_sick_days NUMBER := 0;
v_business_group_id NUMBER := 0;
l_period_service NUMBER := 0;
v_person_type VARCHAR2 (100);
v_skip_holiday NUMBER := 0;
v_employee_number VARCHAR2 (250);
v_curr_sick_pay_p NUMBER;
v_curr_sick_ded_p NUMBER;
BEGIN
v_basic := 0;
v_mth_days := get_month_days (p_assignment_id, p_start_date);
v_person_type := get_person_type_ass (p_assignment_id, p_end_date);
DBMS_OUTPUT.put_line ('v_mth_days:' || v_mth_days);
DBMS_OUTPUT.put_line ('v_person_type:' || v_person_type);
fnd_file.put_line (fnd_file.LOG, 'v_mth_days:' || v_mth_days);
fnd_file.put_line (fnd_file.LOG, 'v_person_type:' || v_person_type);
p_month_value := 0;
p_week_holi_pay := 0;
p_month_value := 0;
p_maternity_pay := 0;
p_maternity_days := 0;
p_sick_pay := 0;
p_sick_ded := 0;
p_sick_days := 0;
v_business_group_id := hr_general.get_business_group_id ();
--v_business_group_id := 81;
FOR i IN 0 .. v_days
LOOP
v_date := p_start_date + i;
v_curr_otl_hrs := 0;
v_curr_week_hrs := 0;
v_curr_holiday := 0;
v_curr_maternity_pay := 0;
v_curr_sick_pay := 0;
v_curr_sick_ded := 0;
v_curr_sick_pay_p := 0;
v_curr_sick_ded_p := 0;
BEGIN
v_mth_value :=
get_screen_entry_value_at (p_assignment_id,
p_element_entry_id,
'Monthly Value',
v_date
);
END;
BEGIN
v_gross := get_gross_at (p_assignment_id, v_date);
END;
IF v_mth_value = 0
THEN
IF v_person_type = 'Worker'
THEN
p_month_value := v_gross;
ELSE
p_month_value := ROUND ((v_gross * .6), 2);
END IF;
BEGIN
v_hrs_per_day := xxotl_hours_day (p_assignment_id, v_date);
END;
BEGIN
v_curr_otl_hrs := get_otl_regular_hours (p_assignment_id, v_date);
END;
BEGIN
v_curr_week_hrs :=
xxotl_get_week_off_pay (p_assignment_id, v_date, v_date);
END;
IF v_curr_week_hrs <> 0
THEN
v_week_hrs := v_week_hrs + v_curr_week_hrs;
v_week_pay :=
v_week_pay
+ (p_month_value / v_mth_days) * v_curr_week_hrs;
END IF;
v_skip_holiday :=
xxlam_hr_absence_duration.get_holiday_unpaid_leaves
(v_employee_number,
v_business_group_id,
v_date
);
EXCEPTION
WHEN OTHERS
THEN
v_skip_holiday := 0;
END;
IF v_skip_holiday <> 1
THEN
BEGIN
v_curr_holiday :=
xxlam_hr_absence_duration.holidays (p_assignment_id,
v_date,
v_date
);
END;
IF v_curr_holiday <> 0
THEN
v_holiday := v_holiday + v_curr_holiday;
v_holi_pay :=
v_holi_pay
+ (p_month_value / v_mth_days) * v_curr_holiday;
END IF;
END IF;
IF v_curr_maternity > 0
THEN
IF l_period_service < 365
THEN
v_curr_maternity_pay :=
v_curr_maternity * (v_gross / v_mth_days)
* .5;
ELSE
v_curr_maternity_pay :=
v_curr_maternity
* (v_gross / v_mth_days);
END IF;
END IF;
p_sick_pay := round(p_sick_pay,2);
p_sick_ded := round(p_sick_ded,2);
*/
DBMS_OUTPUT.put_line ( 'V_basic~~'
|| v_basic
|| ' v_sal_per_day~~'
|| v_sal_per_day
|| '~~p_week_holi_pay'
|| p_week_holi_pay
);
p_sick_pay := ROUND (p_sick_pay, 2) - ROUND (p_sick_ded, 2);
p_sick_ded := 0;
p_maternity_pay := ROUND (p_maternity_pay, 2);
DBMS_OUTPUT.put_line ( v_days
|| v_mth_days
|| (v_week_hrs + v_holiday)
|| v_otl_hrs
);
RETURN v_basic;
END;
-- ----------------------------------------------------------------------------
-- |-------------------------< calculate_trans_all >---------------------------|
-- ----------------------------------------------------------------------------
FUNCTION calculate_trans_all (
p_assignment_id IN NUMBER,
p_element_entry_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE,
p_month_value OUT NUMBER
)
RETURN NUMBER
IS
v_salary NUMBER := 0;
v_gross NUMBER := 0;
v_value NUMBER := 0;
v_days NUMBER := (p_end_date - p_start_date);
v_date DATE;
v_mth_days NUMBER;
v_mth_value NUMBER := 0;
v_sal_per_day NUMBER := 0;
v_hrs_per_day NUMBER := 0;
v_otl_hrs NUMBER := 0;
v_curr_otl_hrs NUMBER := 0;
v_week_hrs NUMBER := 0;
v_curr_week_hrs NUMBER := 0;
v_holiday NUMBER := 0;
v_curr_holiday NUMBER := 0;
v_week_holi_pay NUMBER := 0;
BEGIN
-- v_mth_days := to_number(to_char(last_day(p_start_date),'DD'));
v_mth_days := get_month_days (p_assignment_id, p_start_date);
p_month_value := 0;
FOR i IN 0 .. v_days
LOOP
v_date := p_start_date + i;
v_curr_otl_hrs := 0;
v_curr_week_hrs := 0;
v_curr_holiday := 0;
BEGIN
v_mth_value :=
get_screen_entry_value_at (p_assignment_id,
p_element_entry_id,
'Monthly Value',
v_date
);
END;
BEGIN
v_gross := get_gross_at (p_assignment_id, v_date);
END;
IF v_mth_value = 0
THEN
p_month_value := ROUND ((v_gross * .15), 2);
ELSE
p_month_value := v_mth_value;
END IF;
BEGIN
v_hrs_per_day := xxotl_hours_day (p_assignment_id, v_date);
END;
BEGIN
v_curr_otl_hrs := get_otl_regular_hours (p_assignment_id, v_date);
END;
BEGIN
v_curr_week_hrs :=
xxotl_get_week_off_pay (p_assignment_id, v_date, v_date);
END;
IF v_curr_week_hrs <> 0
THEN
v_week_hrs := v_week_hrs + v_curr_week_hrs;
v_week_holi_pay :=
v_week_holi_pay
+ (p_month_value / v_mth_days) * v_curr_week_hrs;
END IF;
BEGIN
v_curr_holiday :=
xxlam_hr_absence_duration.holidays (p_assignment_id,
v_date,
v_date
);
END;
IF v_curr_holiday <> 0
THEN
v_holiday := v_holiday + v_curr_holiday;
v_week_holi_pay :=
v_week_holi_pay
+ (p_month_value / v_mth_days) * v_curr_holiday;
END IF;
DBMS_OUTPUT.put_line ( v_sal_per_day
|| 'Week:'
|| v_week_hrs
|| 'OTL:'
|| v_otl_hrs
|| 'Holiday:'
|| v_holiday
);
END LOOP;
-- ----------------------------------------------------------------------------
-- |-------------------------< calculate_housing_all >-------------------------|
-- ----------------------------------------------------------------------------
FUNCTION calculate_housing_all (
p_assignment_id IN NUMBER,
p_element_entry_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE,
p_month_value OUT NUMBER
)
RETURN NUMBER
IS
v_salary NUMBER := 0;
v_gross NUMBER := 0;
v_value NUMBER := 0;
v_days NUMBER := (p_end_date - p_start_date);
v_date DATE;
v_mth_days NUMBER;
v_mth_value NUMBER := 0;
v_sal_per_day NUMBER := 0;
v_hrs_per_day NUMBER := 0;
v_otl_hrs NUMBER := 0;
v_curr_otl_hrs NUMBER := 0;
v_week_hrs NUMBER := 0;
v_curr_week_hrs NUMBER := 0;
v_holiday NUMBER := 0;
v_curr_holiday NUMBER := 0;
v_week_holi_pay NUMBER := 0;
BEGIN
v_mth_days := get_month_days (p_assignment_id, p_start_date);
p_month_value := 0;
FOR i IN 0 .. v_days
LOOP
v_date := p_start_date + i;
v_curr_otl_hrs := 0;
v_curr_week_hrs := 0;
v_curr_holiday := 0;
BEGIN
v_mth_value :=
get_screen_entry_value_at (p_assignment_id,
p_element_entry_id,
'Monthly Value',
v_date
);
END;
BEGIN
v_gross := get_gross_at (p_assignment_id, v_date);
END;
IF v_mth_value = 0
THEN
p_month_value := ROUND ((v_gross * .25), 2);
ELSE
p_month_value := v_mth_value;
END IF;
BEGIN
v_hrs_per_day := xxotl_hours_day (p_assignment_id, v_date);
END;
BEGIN
v_curr_otl_hrs := get_otl_regular_hours (p_assignment_id, v_date);
END;
BEGIN
v_curr_week_hrs :=
xxotl_get_week_off_pay (p_assignment_id, v_date, v_date);
END;
IF v_curr_week_hrs <> 0
THEN
v_week_hrs := v_week_hrs + v_curr_week_hrs;
v_week_holi_pay :=
v_week_holi_pay
+ (p_month_value / v_mth_days) * v_curr_week_hrs;
END IF;
BEGIN
v_curr_holiday :=
xxlam_hr_absence_duration.holidays (p_assignment_id,
v_date,
v_date
);
END;
IF v_curr_holiday <> 0
THEN
v_holiday := v_holiday + v_curr_holiday;
v_week_holi_pay :=
v_week_holi_pay
+ (p_month_value / v_mth_days) * v_curr_holiday;
END IF;
DBMS_OUTPUT.put_line ( v_sal_per_day
|| 'Week:'
|| v_week_hrs
|| 'OTL:'
|| v_otl_hrs
|| 'Holiday:'
|| v_holiday
);
END LOOP;
-- ----------------------------------------------------------------------------
-- |-------------------------< calculate_other_all >-------------------------|
-- ----------------------------------------------------------------------------
FUNCTION calculate_other_all (
p_assignment_id IN NUMBER,
p_element_entry_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE,
p_month_value OUT NUMBER
)
RETURN NUMBER
IS
v_salary NUMBER := 0;
v_gross NUMBER := 0;
v_value NUMBER := 0;
v_basic NUMBER := 0;
v_trans_all NUMBER := 0;
v_housing_all NUMBER := 0;
v_days NUMBER := (p_end_date - p_start_date);
v_date DATE;
v_mth_days NUMBER;
v_mth_value NUMBER := 0;
v_sal_per_day NUMBER := 0;
v_hrs_per_day NUMBER := 0;
v_otl_hrs NUMBER := 0;
v_curr_otl_hrs NUMBER := 0;
v_week_hrs NUMBER := 0;
v_curr_week_hrs NUMBER := 0;
v_holiday NUMBER := 0;
v_curr_holiday NUMBER := 0;
v_payroll_name VARCHAR2 (100);
v_element_entry_id NUMBER := 0;
l_dummy NUMBER := 0;
v_week_holi_pay NUMBER := 0;
e NUMBER := 0;
v_basic_holiday NUMBER := 0;
v_skip_holiday NUMBER := 0;
v_business_group_id NUMBER := 0;
v_employee_number VARCHAR2 (250);
FUNCTION get_element_entry_id (
p_assignment_id NUMBER,
p_element_name VARCHAR2,
p_date DATE
)
RETURN NUMBER
IS
l_element_entry_id NUMBER := 0;
BEGIN
SELECT DISTINCT peef.element_entry_id
INTO l_element_entry_id
FROM pay_element_types_f_vl pet,
pay_element_entries_f peef
WHERE 1 = 1
AND pet.element_name = p_element_name
AND peef.element_type_id = pet.element_type_id
AND peef.assignment_id = p_assignment_id
AND TRUNC (p_date) BETWEEN peef.effective_start_date
AND peef.effective_end_date;
RETURN l_element_entry_id;
EXCEPTION
WHEN OTHERS
THEN
RETURN 0;
END;
BEGIN
v_mth_days := get_month_days (p_assignment_id, p_start_date);
FOR i IN 0 .. v_days
LOOP
v_date := p_start_date + i;
v_curr_otl_hrs := 0;
v_curr_week_hrs := 0;
v_curr_holiday := 0;
v_basic_holiday := 0;
p_month_value := 0;
BEGIN
DBMS_OUTPUT.put_line ('Entry ID:' || v_element_entry_id);
BEGIN
e :=
calculate_basic_salary (p_assignment_id,
v_element_entry_id,
TRUNC (v_date),
TRUNC (v_date),
v_basic,
v_basic_holiday,
l_dummy,
l_dummy,
l_dummy,
l_dummy,
l_dummy
);
END;
BEGIN
v_mth_value :=
get_screen_entry_value_at (p_assignment_id,
p_element_entry_id,
'Monthly Value',
v_date
);
END;
BEGIN
v_gross := get_gross_at (p_assignment_id, v_date);
END;
BEGIN
v_payroll_name :=
get_payroll_name (p_assignment_id, TRUNC (v_date));
END;
IF v_mth_value = 0
THEN
IF v_payroll_name IN
(' Admin Payroll')
THEN
/* Calculation of Transportation Allowance */
BEGIN
v_element_entry_id := 0;
BEGIN
e :=
calculate_trans_all (p_assignment_id,
v_element_entry_id,
TRUNC (v_date),
TRUNC (v_date),
v_trans_all
);
END;
-- v_element_entry_id :=
get_element_entry_id(p_assignment_id,'Housing Allowance',trunc(v_date));
SELECT DISTINCT peef.element_entry_id
INTO v_element_entry_id
FROM pay_element_types_f_vl pet,
pay_element_entries_f peef
WHERE 1 = 1
AND pet.element_name = 'Housing Allowance'
AND peef.element_type_id = pet.element_type_id
AND peef.assignment_id = p_assignment_id
AND TRUNC (v_date)
BETWEEN peef.effective_start_date
AND peef.effective_end_date;
EXCEPTION
WHEN OTHERS
THEN
v_element_entry_id := 0;
END;
BEGIN
e :=
calculate_housing_all (p_assignment_id,
v_element_entry_id,
TRUNC (v_date),
TRUNC (v_date),
v_housing_all
);
END;
p_month_value :=
ROUND (v_gross - (v_basic + v_trans_all + v_housing_all), 2);
ELSE
IF v_mth_value != 0
AND v_payroll_name IN ('Payroll')
THEN
p_month_value := v_gross - v_basic;
ELSIF v_payroll_name IN ('Payroll')
THEN
p_month_value := v_mth_value;
ELSE
p_month_value := v_gross - v_basic;
END IF;
END IF;
ELSE
p_month_value := v_mth_value;
END IF;
BEGIN
v_hrs_per_day := xxotl_hours_day (p_assignment_id, v_date);
END;
BEGIN
v_curr_otl_hrs := get_otl_regular_hours (p_assignment_id, v_date);
END;
BEGIN
v_curr_week_hrs :=
xxotl_get_week_off_pay (p_assignment_id, v_date, v_date);
END;
IF v_curr_week_hrs <> 0
THEN
v_week_hrs := v_week_hrs + v_curr_week_hrs;
v_week_holi_pay :=
v_week_holi_pay
+ (p_month_value / v_mth_days) * v_curr_week_hrs;
END IF;
v_skip_holiday :=
xxlam_hr_absence_duration.get_holiday_unpaid_leaves
(v_employee_number,
v_business_group_id,
v_date
);
EXCEPTION
WHEN OTHERS
THEN
v_skip_holiday := 0;
END;
IF v_skip_holiday <> 1
THEN
BEGIN
v_curr_holiday :=
xxlam_hr_absence_duration.holidays (p_assignment_id,
v_date,
v_date
);
END;
IF v_curr_holiday <> 0
THEN
v_holiday := v_holiday + v_curr_holiday;
v_week_holi_pay :=
v_week_holi_pay
+ (p_month_value / v_mth_days) * v_curr_holiday;
END IF;
END IF;
DBMS_OUTPUT.put_line ( v_sal_per_day
|| 'Week:'
|| v_week_hrs
|| 'OTL:'
|| v_otl_hrs
|| 'Holiday:'
|| v_holiday
);
END LOOP;
-- ----------------------------------------------------------------------------
-- |-------------------------< get_contract_duration >--------------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_contract_duration (p_assignment_id NUMBER, p_date DATE)
RETURN NUMBER
IS
l_person_id NUMBER := 0;
l_duration NUMBER := 0;
BEGIN
SELECT DISTINCT person_id
INTO l_person_id
FROM per_all_assignments_f
WHERE assignment_id = p_assignment_id;
BEGIN
SELECT DURATION
INTO l_duration
FROM per_contracts pc
WHERE person_id = l_person_id
AND p_date BETWEEN pc.effective_start_date AND pc.effective_end_date;
RETURN l_duration;
EXCEPTION
WHEN OTHERS
THEN
RETURN 0;
END;
END;
--
-- ----------------------------------------------------------------------------
-- |----------------------------< calculate_gratuity >------------------------|
-- ----------------------------------------------------------------------------
--
FUNCTION calculate_gratuity (
p_assignment_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE,
p_initiator IN VARCHAR2,
p_contract IN VARCHAR2,
p_service_period OUT NOCOPY VARCHAR2
)
RETURN NUMBER
AS
l_years NUMBER := 0;
l_months NUMBER := 0;
l_days NUMBER := 0;
l_value NUMBER := 0;
l_sal_day NUMBER;
-- := (get_salary_at (p_assignment_id, p_end_date) * .6) / 365;
l_service_days NUMBER := 0;
l_salary NUMBER := 0;
l_unpaid_leave NUMBER := 0;
l_service_years NUMBER := 0;
p_month_factor NUMBER;
l_contract_duration NUMBER;
l_salary_tmp NUMBER;
l_bg_id NUMBER;
BEGIN
SELECT business_group_id
INTO l_bg_id
FROM per_all_assignments_f
WHERE assignment_id = p_assignment_id
AND p_end_date BETWEEN effective_start_date AND effective_end_date;
l_salary_tmp :=
xxlam_hr_payroll_all.get_balance (p_assignment_id,
l_bg_id,
'Monthly Basic',
'RUN',
p_end_date
);
l_sal_day := (l_salary_tmp * 12) / 365;
p_month_factor :=
MONTHS_BETWEEN ((p_end_date - l_unpaid_leave), (p_start_date - 1));
l_service_days := ((p_end_date - p_start_date) + 1) - l_unpaid_leave;
-- ----------------------------------------------------------------------------
-- |-------------------------< get_ticket_value >--------------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_ticket_value_at (
p_business_group_id NUMBER,
p_assignment_id NUMBER,
p_date DATE,
p_ticket_adult OUT NUMBER,
p_ticket_child OUT NUMBER
)
RETURN NUMBER
AS
l_ticket_class VARCHAR2 (100);
l_ticket_to VARCHAR2 (200);
l_no_of_tickets_a NUMBER;
l_no_of_tickets_c NUMBER;
BEGIN
BEGIN
SELECT pac.segment2 ticket_class, pac.segment3 ticket_to,
pac.segment4 tickets_adult, pac.segment6 tickets_child
INTO l_ticket_class, l_ticket_to,
l_no_of_tickets_a, l_no_of_tickets_c
FROM per_analysis_criteria pac,
fnd_id_flex_structures_vl fflex,
per_person_analyses ppa,
per_all_assignments_f paf
WHERE 1 = 1
AND UPPER (fflex.id_flex_structure_code) IN UPPER
('XXHR_TICKET_DETAILS'
)
AND fflex.id_flex_num = pac.id_flex_num
AND ppa.analysis_criteria_id = pac.analysis_criteria_id
AND paf.person_id = ppa.person_id
AND p_date BETWEEN paf.effective_start_date AND paf.effective_end_date
AND p_date BETWEEN NVL (ppa.date_from, TRUNC (p_date))
AND NVL (date_to, TRUNC (p_date))
AND paf.assignment_id = p_assignment_id;
EXCEPTION
WHEN OTHERS
THEN
NULL;
END;
BEGIN
p_ticket_adult :=
NVL (hruserdt.get_table_value (p_business_group_id,
' HR Ticket Sector',
'ADULT-' || l_ticket_class,
l_ticket_to,
p_date
),
0
);
EXCEPTION
WHEN OTHERS
THEN
p_ticket_adult := 0;
END;
BEGIN
p_ticket_child :=
NVL (hruserdt.get_table_value (p_business_group_id,
' HR Ticket Sector',
'CHILD-' || l_ticket_class,
l_ticket_to,
p_date
),
0
);
EXCEPTION
WHEN OTHERS
THEN
p_ticket_child := 0;
END;
RETURN 0;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line (SQLERRM);
RETURN 1;
END;
-- ----------------------------------------------------------------------------
-- |-------------------------< get_accrued_ticket >--------------------------|
-- ----------------------------------------------------------------------------
FUNCTION get_accrued_ticket (
p_business_group_id NUMBER,
p_assignment_id NUMBER,
p_start_date DATE,
p_end_date DATE,
p_accrued_ticket_a OUT NUMBER,
p_accrued_ticket_c OUT NUMBER,
p_accrued_ticket_a_dep OUT NUMBER
)
RETURN NUMBER
AS
l_person_id NUMBER;
l_nod NUMBER := (p_end_date)
- (p_start_date);
l_date DATE;
l_days NUMBER;
l_accrual_date DATE;
l_hire_date DATE;
l_age NUMBER;
l_person_type VARCHAR2 (30);
l_family_status VARCHAR2 (10);
l_accrued_amount NUMBER := 0;
l_ticket_class VARCHAR2 (30);
l_dep_ticket_class VARCHAR2 (30);
l_ticket_to VARCHAR2 (30);
l_ticket_adult NUMBER := 0;
l_ticket_child NUMBER := 0;
l_ticket_spouse NUMBER := 0;
l_ticket_a_balance NUMBER := 0;
l_ticket_c_balance NUMBER := 0;
l_no_of_tickets_a NUMBER := 0;
l_no_of_tickets_c NUMBER := 0;
l_absence NUMBER := 0;
l_accrued_ticket_s NUMBER := 0;
l_start_date DATE;
l_end_date DATE;
l_curr_month_amt NUMBER := 0;
l_curr_mon_a NUMBER := 0;
l_curr_mon_c NUMBER := 0;
l_accrued_ticket_ca NUMBER := 0;
l_bg_id NUMBER;
l_ticket_a_dep_balance NUMBER := 0;
ln_payroll_id NUMBER := 0;
CURSOR c_rel (p_person_id IN NUMBER, p_date IN DATE)
IS
SELECT pcr.person_id, pcr.contact_person_id, pcr.contact_type,
pcr.date_start, pap.date_of_birth,
pcr.cont_attribute2 ticket_eligibility
FROM per_contact_relationships pcr, per_all_people_f pap
WHERE 1 = 1
AND pap.person_id = pcr.contact_person_id
AND pcr.person_id = p_person_id
AND pcr.contact_type IN ('S', 'C')
AND p_date BETWEEN pap.effective_start_date AND pap.effective_end_date
AND p_date BETWEEN NVL (pcr.date_start, pap.start_date)
AND NVL
(pcr.date_end, TO_DATE ('31-DEC-4712'))
--AND pcr.cont_attribute2 = 'Y'
;
BEGIN
l_date := p_end_date;
l_start_date := p_start_date;
l_end_date := p_end_date;
DBMS_OUTPUT.put_line (p_start_date);
DBMS_OUTPUT.put_line (p_end_date);
SELECT start_date
INTO l_hire_date
FROM per_all_people_f
WHERE person_id = l_person_id
AND l_date BETWEEN effective_start_date AND effective_end_date;
BEGIN
l_person_type :=
xxlam_hr_utilities_pkg.get_person_type ('NAME',
l_person_id,
l_date
);
EXCEPTION
WHEN OTHERS
THEN
NULL;
END;
BEGIN
l_ticket_a_balance :=
get_balance (p_assignment_id,
l_bg_id,
'TICKET_NO_OF_TKTS_ADULT',
'ITD',
l_start_date
);
EXCEPTION
WHEN OTHERS
THEN
l_ticket_a_balance := 0;
END;
BEGIN
l_ticket_a_dep_balance :=
get_balance (p_assignment_id,
l_bg_id,
'TICKET_NO_OF_TKTS_ADULT_DEP',
'ITD',
l_start_date
);
EXCEPTION
WHEN OTHERS
THEN
l_ticket_a_balance := 0;
END;
BEGIN
l_ticket_c_balance :=
get_balance (p_assignment_id,
l_bg_id,
'TICKET_NO_OF_TKTS_CHILD',
'ITD',
l_start_date
);
EXCEPTION
WHEN OTHERS
THEN
l_ticket_c_balance := 0;
END;
FOR i IN 0 .. l_nod
LOOP
l_date := (l_start_date) + i;
l_days := TO_NUMBER (TO_CHAR (LAST_DAY (l_date), 'DD'));
DBMS_OUTPUT.put_line ('DAYS :' || l_days);
BEGIN
-- l_no_of_tickets_a, l_no_of_tickets_c
SELECT pac.segment2 ticket_class, pac.segment3 ticket_to,
pac.segment5 dep_tickets_class
INTO l_ticket_class, l_ticket_to,
l_dep_ticket_class
FROM per_analysis_criteria pac,
fnd_id_flex_structures_vl fflex,
per_person_analyses ppa,
per_all_assignments_f paf
WHERE 1 = 1
AND UPPER (fflex.id_flex_structure_code) IN UPPER
('XXHR_TICKET_DETAILS'
)
AND fflex.id_flex_num = pac.id_flex_num
AND ppa.analysis_criteria_id = pac.analysis_criteria_id
AND paf.person_id = ppa.person_id
AND l_date BETWEEN paf.effective_start_date
AND paf.effective_end_date
AND l_date BETWEEN NVL (ppa.date_from, TRUNC (l_date))
AND NVL (date_to, TRUNC (l_date))
AND paf.assignment_id = p_assignment_id;
fnd_file.put_line (fnd_file.LOG,
'Date:'
|| p_end_date
|| ' Class:'
|| l_ticket_class
|| ' Dest:'
|| l_ticket_to
|| 'No of Ticket'
|| l_no_of_tickets_a
);
EXCEPTION
WHEN OTHERS
THEN
NULL;
END;
BEGIN
l_ticket_adult :=
NVL (hruserdt.get_table_value (p_business_group_id,
' HR Ticket Sector',
'ADULT-' || l_ticket_class,
l_ticket_to,
l_date
),
0
);
fnd_file.put_line (fnd_file.LOG,
'Ticket Adult:' || l_ticket_adult);
EXCEPTION
WHEN OTHERS
THEN
l_ticket_adult := 0;
DBMS_OUTPUT.put_line ('Ticket Adult:' || SQLERRM);
fnd_file.put_line (fnd_file.LOG, SQLERRM);
END;
DBMS_OUTPUT.put_line ('L_TICKET_ADULT' || l_ticket_adult);
BEGIN
l_ticket_child :=
NVL (hruserdt.get_table_value (p_business_group_id,
' HR Ticket Sector',
'CHILD-' || l_dep_ticket_class,
l_ticket_to,
l_date
),
0
);
EXCEPTION
WHEN OTHERS
THEN
l_ticket_child := 0;
DBMS_OUTPUT.put_line ('Child Adult:' || SQLERRM);
END;
BEGIN
l_ticket_spouse :=
NVL (hruserdt.get_table_value (p_business_group_id,
' HR Ticket Sector',
'ADULT-' || l_dep_ticket_class,
l_ticket_to,
l_date
),
0
);
fnd_file.put_line (fnd_file.LOG,
'Ticket Spouse:' || l_ticket_spouse
);
EXCEPTION
WHEN OTHERS
THEN
l_ticket_spouse := 0;
DBMS_OUTPUT.put_line ('Spouse Adult:' || SQLERRM);
fnd_file.put_line (fnd_file.LOG, SQLERRM);
END;
-- For Child
IF rec_rel.contact_type = 'C'
AND rec_rel.ticket_eligibility = 'Y'
THEN
SELECT MONTHS_BETWEEN (l_date, rec_rel.date_of_birth)
/ 12
INTO l_age
FROM DUAL;
IF l_age > 0
AND l_age <= 12
AND rec_rel.ticket_eligibility = 'Y'
THEN
p_accrued_ticket_c := p_accrued_ticket_c + NVL (1, 0);
ELSIF l_age > 12 AND rec_rel.ticket_eligibility = 'Y'
THEN
l_accrued_ticket_ca := l_accrued_ticket_ca + 1;
-- Changed
--p_accrued_ticket_a := p_accrued_ticket_a + NVL (1, 0);
END IF;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
DBMS_OUTPUT.put_line ('No Data Found');
NULL;
END;
END LOOP;
END IF;
END LOOP;
-- Changed
IF l_ticket_spouse = 0
THEN
l_accrued_ticket_s := 0;
l_accrued_ticket_ca := 0;
END IF;
IF l_ticket_child = 0
THEN
p_accrued_ticket_c := 0;
END IF;
IF l_ticket_adult = 0
THEN
p_accrued_ticket_a := 0;
END IF;
/*
Changed for PMYI-DIG workers
*/
BEGIN
SELECT payroll_id
INTO ln_payroll_id
FROM per_all_assignments_f
WHERE 1 = 1
AND assignment_id = p_assignment_id
AND primary_flag = 'Y'
AND TO_DATE ('25-MAY-2012') BETWEEN effective_start_date
AND effective_end_date;
EXCEPTION
WHEN OTHERS
THEN
ln_payroll_id := 0;
END;
IF ln_payroll_id = 67
THEN
l_ticket_a_balance := 0;
END IF;
/*
Changed for PMYI-DIG workers
*/
END IF;
-- ----------------------------------------------------------------------------
-- Get Payroll Name
-- ----------------------------------------------------------------------------
FUNCTION get_payroll_name (p_emp_no VARCHAR2, p_date DATE)
RETURN VARCHAR2
AS
PRAGMA AUTONOMOUS_TRANSACTION;
l_payroll_name VARCHAR2 (200);
BEGIN
SELECT hr_general.decode_payroll (payroll_id)
INTO l_payroll_name
FROM per_all_people_f ppf, per_all_assignments_f paf
WHERE 1 = 1
AND ppf.employee_number = p_emp_no
AND ppf.person_id = paf.person_id
AND primary_flag = 'Y'
AND TRUNC (p_date) BETWEEN ppf.effective_start_date
AND ppf.effective_end_date
AND TRUNC (p_date) BETWEEN paf.effective_start_date
AND paf.effective_end_date;
RETURN l_payroll_name;
EXCEPTION
WHEN OTHERS
THEN
RETURN NULL;
END;
-- ----------------------------------------------------------------------------
-- |-------------------------< get_payroll_name - Overriding Function>--------|
-- ----------------------------------------------------------------------------
FUNCTION get_payroll_name (p_assignment_id NUMBER, p_date DATE)
RETURN VARCHAR2
AS
PRAGMA AUTONOMOUS_TRANSACTION;
l_payroll_name VARCHAR2 (200);
BEGIN
SELECT hr_general.decode_payroll (payroll_id)
INTO l_payroll_name
FROM per_all_assignments_f paf
WHERE 1 = 1
AND paf.assignment_id = p_assignment_id
AND primary_flag = 'Y'
AND TRUNC (p_date) BETWEEN paf.effective_start_date
AND paf.effective_end_date;
RETURN l_payroll_name;
EXCEPTION
WHEN OTHERS
THEN
RETURN NULL;
END;
-- ----------------------------------------------------------------------------
-- Get Notified Date
-- ----------------------------------------------------------------------------
FUNCTION get_notified_date (p_emp_no VARCHAR2, p_date DATE)
RETURN DATE
AS
PRAGMA AUTONOMOUS_TRANSACTION;
l_notified_date DATE;
BEGIN
SELECT notified_termination_date
INTO l_notified_date
FROM per_all_people_f ppf, per_periods_of_service pps
WHERE 1 = 1
AND ppf.employee_number = p_emp_no
AND ppf.person_id = pps.person_id
AND TRUNC (p_date) BETWEEN ppf.effective_start_date
AND ppf.effective_end_date;
RETURN l_notified_date;
EXCEPTION
WHEN OTHERS
THEN
RETURN NULL;
END;
-- ----------------------------------------------------------------------------
-- Get Person Type
-- ----------------------------------------------------------------------------
FUNCTION get_person_type (
p_name_or_id VARCHAR2,
p_person_id NUMBER,
p_effective_date DATE DEFAULT SYSDATE
)
RETURN VARCHAR2
AS
PRAGMA AUTONOMOUS_TRANSACTION;
v_pereson_type VARCHAR2 (100);
v_pereson_type_id VARCHAR2 (100);
BEGIN
SELECT ppt.user_person_type, ppt.person_type_id
INTO v_pereson_type, v_pereson_type_id
FROM per_all_people_f papf,
per_person_types ppt,
per_person_type_usages_f ptu
WHERE 1 = 1
AND papf.person_id = p_person_id
AND p_effective_date BETWEEN papf.effective_start_date
AND papf.effective_end_date
AND papf.person_id = ptu.person_id
AND ppt.person_type_id = ptu.person_type_id
AND ppt.system_person_type = 'EMP'
AND ppt.business_group_id = papf.business_group_id;
-- ----------------------------------------------------------------------------
-- Get Insurance Type
-- ----------------------------------------------------------------------------
FUNCTION get_insurance_type (
p_business_group_id NUMBER,
p_assignment_id NUMBER,
p_date DATE
)
RETURN VARCHAR2
AS
l_ins_type VARCHAR2 (100);
BEGIN
SELECT ass_attribute2
INTO l_ins_type
FROM per_all_assignments_f
WHERE assignment_id = p_assignment_id
AND p_date BETWEEN effective_start_date AND effective_end_date;
RETURN l_ins_type;
EXCEPTION
WHEN OTHERS
THEN
RETURN NULL;
END;
-- ----------------------------------------------------------------------------
-- Get GL Conversion Rate
-- ----------------------------------------------------------------------------
FUNCTION get_gl_daily_rate (
p_from_curr VARCHAR2,
p_to_curr VARCHAR2,
p_date DATE
)
RETURN NUMBER
AS
l_con_rate NUMBER;
BEGIN
SELECT conversion_rate
INTO l_con_rate
FROM gl_daily_rates
WHERE from_currency = p_from_curr
AND to_currency = p_to_curr
AND conversion_type = 'Corporate'
AND conversion_date = p_date;
RETURN l_con_rate;
EXCEPTION
WHEN OTHERS
THEN
RETURN NULL;
END;
-- ----------------------------------------------------------------------------
-- Get Person Type by Assignment_id
-- ----------------------------------------------------------------------------
FUNCTION get_person_type_ass (
p_ass_id NUMBER,
p_effective_date DATE DEFAULT SYSDATE
)
RETURN VARCHAR2
AS
PRAGMA AUTONOMOUS_TRANSACTION;
v_pereson_type VARCHAR2 (100);
v_pereson_type_id VARCHAR2 (100);
BEGIN
SELECT ppt.user_person_type, ppt.person_type_id
INTO v_pereson_type, v_pereson_type_id
FROM per_all_people_f papf,
per_person_types ppt,
per_person_type_usages_f ptu,
per_all_assignments_f paaf
WHERE 1 = 1
AND paaf.assignment_id = p_ass_id
AND papf.person_id = paaf.person_id
AND p_effective_date BETWEEN papf.effective_start_date
AND papf.effective_end_date
AND p_effective_date BETWEEN paaf.effective_start_date
AND paaf.effective_end_date
AND p_effective_date BETWEEN ptu.effective_start_date
AND ptu.effective_end_date
AND papf.person_id = ptu.person_id
AND ppt.person_type_id = ptu.person_type_id
AND ppt.system_person_type = 'EMP'
AND ppt.business_group_id = papf.business_group_id;
RETURN v_pereson_type;
EXCEPTION
WHEN OTHERS
THEN
RETURN NULL;
END get_person_type_ass;
--------------------------------------------------------------------------------
-- Get Advance Salary Flag
--------------------------------------------------------------------------------
FUNCTION get_adv_sal_flag (p_element_entry_id NUMBER, p_effective_date DATE)
RETURN VARCHAR2
AS
l_adv_flag VARCHAR2 (10);
BEGIN
SELECT pev.screen_entry_value
INTO l_adv_flag
FROM pay_element_types_f_vl pet,
pay_input_values_f piv,
pay_element_entry_values_f pev,
pay_element_entries_f peef
WHERE 1 = 1
AND pet.element_name IN ('Annual Vacation')
AND pet.element_type_id = piv.element_type_id
AND piv.NAME = 'Advance Salary'
AND piv.input_value_id = pev.input_value_id
AND peef.element_entry_id = pev.element_entry_id
AND peef.element_entry_id = p_element_entry_id
AND p_effective_date BETWEEN pev.effective_start_date
AND pev.effective_end_date;
RETURN l_adv_flag;
EXCEPTION
WHEN OTHERS
THEN
RETURN 'N';
END;
--------------------------------------------------------------------------------
-- Get OTL Regular Hours Date Earned
--------------------------------------------------------------------------------
FUNCTION get_otl_reg_hrs_date_earned (p_element_entry_id NUMBER)
RETURN DATE
AS
l_date_earned DATE;
BEGIN
SELECT date_earned
INTO l_date_earned
FROM pay_element_entries_f peef
WHERE 1 = 1 AND peef.element_entry_id = p_element_entry_id;
--------------------------------------------------------------------------------
-- Get OTL get week off pay
--------------------------------------------------------------------------------
FUNCTION xxotl_get_week_off_pay (
p_assignment_id IN NUMBER,
p_period_start_date IN DATE,
p_period_end_date IN DATE
)
RETURN NUMBER
IS
v_days NUMBER;
v_cur_date DATE;
v_employee_number VARCHAR2 (30);
v_shift VARCHAR2 (30);
v_holiday_y_n VARCHAR2 (30);
v_holiday NUMBER := 0;
v_person_id NUMBER := 0;
v_leave NUMBER := 0;
v_week_off NUMBER := 0;
v_cnt NUMBER := NULL;
v_date DATE;
v_prev_shift VARCHAR2 (30);
v_next_shift VARCHAR2 (30);
v_prev_holiday VARCHAR2 (30);
v_next_holiday VARCHAR2 (30);
v_cur_worked VARCHAR2 (30);
v_pre_worked VARCHAR2 (30);
v_next_worked VARCHAR2 (30);
-- All days
BEGIN
BEGIN
SELECT p_period_end_date - p_period_start_date
INTO v_days
FROM DUAL;
EXCEPTION
WHEN OTHERS
THEN
v_days := 0;
END;
FOR i IN 0 .. v_days
LOOP
v_shift := NULL;
v_employee_number := NULL;
v_holiday_y_n := NULL;
v_cur_date := p_period_start_date + i;
v_week_off := 0;
v_holiday := 0;
v_leave := 0;
v_date := NULL;
v_prev_shift := NULL;
v_next_shift := NULL;
v_prev_holiday := NULL;
v_next_holiday := NULL;
v_cur_worked := 'N';
BEGIN
SELECT papf.employee_number, papf.person_id
INTOv_employee_number, v_person_id
FROMper_all_people_f papf, per_all_assignments_f paaf
WHERE 1 = 1
ANDpapf.person_id = paaf.person_id
ANDpaaf.assignment_id = p_assignment_id
ANDpaaf.primary_flag = 'Y'
ANDhr_general.get_user_status (paaf.assignment_status_type_id) =
'Active Assignment'
AND v_cur_date BETWEEN paaf.effective_start_date
AND paaf.effective_end_date
AND v_cur_date BETWEEN papf.effective_start_date
AND papf.effective_end_date;
EXCEPTION
WHEN OTHERS
THEN
v_employee_number := NULL;
v_person_id := NULL;
END;
BEGIN
NULL;
/* commented by khurram
SELECT xxotl_utilities.xx_shift_schedule_function (
p_assignment_id,
v_cur_date
)
INTO v_shift
FROM DUAL; */
EXCEPTION
WHEN OTHERS
THEN
v_shift := NULL;
END;
DBMS_OUTPUT.put_line ( 'v_employee_number:'
|| v_employee_number
|| 'Shift-1:'
|| v_shift
|| ' cur date-1:'
|| v_cur_date
);
IF v_shift = 'Off'
THEN
v_week_off := 1;
/* Commented the below code
BEGIN
v_holiday :=
XXLAM_HR_ABSENCE_DURATION.holidays(p_assignment_id,v_cur_date,v_cur_date);
EXCEPTION
WHEN OTHERS
THEN
v_holiday := 0;
END;
Dbms_output.put_line ( 'v_employee_number:'||
v_employee_number||'Holiday:'||v_holiday);
IF v_holiday = 0 then
BEGIN
SELECT 1
into v_leave
FROM per_absence_attendances paa
WHERE 1=1
AND paa.person_id = v_person_id
AND v_cur_date between paa.date_start and
paa.date_end;
EXCEPTION
WHEN OTHERS
THEN
v_leave := 0;
END;
Dbms_output.put_line ( 'v_employee_number:'||
v_employee_number||'Leave:'||v_leave);
End if;
*/
END IF;
DBMS_OUTPUT.put_line ( 'v_employee_number:'
|| v_employee_number
|| ':v_cnt'
|| v_cnt
);
fnd_file.put_line (fnd_file.LOG,
'v_employee_number:'
|| v_employee_number
|| 'v_cnt'
|| v_cnt
);
RETURN v_cnt;
EXCEPTION
WHEN OTHERS
THEN
v_cnt := 0;
RETURN v_cnt;
END;
--------------------------------------------------------------------------------
-- Get Hours Per Day
--------------------------------------------------------------------------------
FUNCTION xxotl_hours_day (p_assignment_id IN NUMBER, p_date IN DATE)
RETURN NUMBER
IS
v_hours NUMBER;
v_days NUMBER;
l_work_schedule VARCHAR2(200);
l_user_table_name VARCHAR2(200);
l_user_column_name VARCHAR2(200);
l_no_hours_in_Day NUMBER :=0;
BEGIN
---p_assignment_id := 141;
---p_date := to_Date('01-sep-2013');
select ASS_ATTRIBUTE1---,ASS_ATTRIBUTE1
into l_work_schedule
from per_All_Assignments_f
where assignment_id = p_assignment_id
and trunc(p_date) between effective_start_Date and effective_end_Date ;
Begin
select USER_TABLE_NAME , USER_COLUMN_NAME into
l_user_table_name , l_user_column_name
from
pay_user_tables t, pay_user_Columns c
where t.user_table_name = 'LAM_HR_WORK_SCHEDULE'
and c.user_table_id = t.user_table_id
and c.user_column_id = l_work_schedule;
DBMS_OUTPUT.put_line ('Work Schedule Assigned'||l_user_table_name||
'****** ' ||l_user_table_name );
Exception when Others then
DBMS_OUTPUT.put_line ('NO work Schedule Assigned' );
End;
BEGIN
selectNVL (HRUSERDT.GET_TABLE_VALUE ( 81,
'LAM_HR_WORK_SCHEDULE',
l_user_column_name,---- '5 Days
(Thursday, Friday off)' ,
'MONDAY',
p_date ---to_date('01-jan-1950')
),'0') into l_no_hours_in_Day
from dual;
DBMS_OUTPUT.put_line ('l_no_hours_in_Day ' || l_no_hours_in_Day );
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.put_line ('No Table value for Work Schedule');
l_no_hours_in_Day:=0;
END;
v_hours := l_no_hours_in_Day;
RETURN v_hours;
END;
--------------------------------------------------------------------------------
-- Get Month Days
--------------------------------------------------------------------------------
FUNCTION get_month_days (p_assignment_id IN NUMBER, p_date IN DATE)
RETURN NUMBER
IS
l_month_days NUMBER;
v_person_type VARCHAR2 (30);
l_off_days NUMBER := 0;
l_START_DATE DATE;
l_END_DATE DATE;
BEGIN
l_START_DATE := to_date('01-'||''||TO_CHAR(p_date,'MON-YYYY'));
l_END_DATE := LAST_DAY (p_date);
-- IF TO_CHAR (p_date, 'DD') <> '20'
-- THEN
l_off_days :=
XXLAM_HR_PAYROLL_ALL.get_total_off_days(p_assignment_id,l_START_DATE,l_END_DATE);
l_month_days := TO_NUMBER (TO_CHAR (LAST_DAY (p_date), 'DD'))- l_off_days;
-- ELSE
-- l_month_days := TO_NUMBER (TO_CHAR (LAST_DAY (p_date - 21), 'DD'));
-- END IF;
--------------------------------------------------------------------------------
-- Get the Ticket allowance to be paid monthly
--------------------------------------------------------------------------------
FUNCTION get_ticket_allowance (
p_business_group_id NUMBER,
p_assignment_id NUMBER,
p_start_date DATE,
p_end_date DATE,
p_accrued_ticket_a OUT NUMBER,
p_accrued_ticket_c OUT NUMBER,
p_accrued_ticket_a_dep OUT NUMBER
)
RETURN NUMBER
AS
l_person_id NUMBER;
l_nod NUMBER := (p_end_date) - (p_start_date);
l_date DATE;
l_days NUMBER;
l_accrual_date DATE;
l_hire_date DATE;
l_age NUMBER;
l_person_type VARCHAR2 (30);
l_family_status VARCHAR2 (10);
l_accrued_amount NUMBER := 0;
l_ticket_class VARCHAR2 (30);
l_dep_ticket_class VARCHAR2 (30);
l_ticket_to VARCHAR2 (30);
l_ticket_adult NUMBER := 0;
l_ticket_child NUMBER := 0;
l_ticket_spouse NUMBER := 0;
l_ticket_a_balance NUMBER := 0;
l_ticket_c_balance NUMBER := 0;
l_no_of_tickets_a NUMBER := 0;
l_no_of_tickets_c NUMBER := 0;
l_absence NUMBER := 0;
l_accrued_ticket_s NUMBER := 0;
l_start_date DATE;
l_end_date DATE;
l_curr_month_amt NUMBER := 0;
l_curr_mon_a NUMBER := 0;
l_curr_mon_c NUMBER := 0;
l_accrued_ticket_ca NUMBER := 0;
l_mth_days NUMBER := 0;
BEGIN
l_person_type :=
xxlam_hr_utilities_pkg.get_person_type ('NAME',
l_person_id,
l_date
);
EXCEPTION
WHEN OTHERS
THEN
NULL;
END;
p_accrued_ticket_a := 0;
p_accrued_ticket_a_dep := 0;
p_accrued_ticket_c := 0;
l_accrued_ticket_s := 0; -- Changed
l_accrued_ticket_ca := 0; -- Changed
FOR i IN 0 .. l_nod
LOOP
l_date := (l_start_date) + i;
l_days := TO_NUMBER (TO_CHAR (LAST_DAY (l_date), 'DD'));
DBMS_OUTPUT.put_line ('DAYS :' || l_days);
BEGIN
-- l_no_of_tickets_a, l_no_of_tickets_c
SELECT pac.segment2 ticket_class, pac.segment3 ticket_to,
pac.segment5 dep_tickets_class
INTO l_ticket_class, l_ticket_to,
l_dep_ticket_class
FROM per_analysis_criteria pac,
fnd_id_flex_structures_vl fflex,
per_person_analyses ppa,
per_all_assignments_f paf
WHERE 1 = 1
AND UPPER (fflex.id_flex_structure_code) IN UPPER
('XXHR_TICKET_DETAILS'
)
AND fflex.id_flex_num = pac.id_flex_num
AND ppa.analysis_criteria_id = pac.analysis_criteria_id
AND paf.person_id = ppa.person_id
AND l_date BETWEEN paf.effective_start_date
AND paf.effective_end_date
AND l_date BETWEEN NVL (ppa.date_from, TRUNC (l_date))
AND NVL (date_to, TRUNC (l_date))
AND paf.assignment_id = p_assignment_id;
fnd_file.put_line (fnd_file.LOG,
'Date:'
|| p_end_date
|| ' Class:'
|| l_ticket_class
|| ' Dest:'
|| l_ticket_to
|| 'No of Ticket'
|| l_no_of_tickets_a
);
EXCEPTION
WHEN OTHERS
THEN
NULL;
END;
IF l_dep_ticket_class = 'NA'
THEN
l_dep_ticket_class := l_ticket_class;
END IF;
BEGIN
l_ticket_adult :=
NVL (hruserdt.get_table_value (p_business_group_id,
' HR Ticket Sector',
'ADULT-' || l_ticket_class,
l_ticket_to,
l_date
),
0
);
fnd_file.put_line (fnd_file.LOG,
'Ticket Adult:' || l_ticket_adult);
EXCEPTION
WHEN OTHERS
THEN
l_ticket_adult := 0;
DBMS_OUTPUT.put_line ('Ticket Adult:' || SQLERRM);
fnd_file.put_line (fnd_file.LOG, SQLERRM);
END;
BEGIN
l_ticket_child :=
NVL (hruserdt.get_table_value (p_business_group_id,
' HR Ticket Sector',
'CHILD-' || l_dep_ticket_class,
l_ticket_to,
l_date
),
0
);
EXCEPTION
WHEN OTHERS
THEN
l_ticket_child := 0;
DBMS_OUTPUT.put_line ('Child Adult:' || SQLERRM);
END;
BEGIN
l_ticket_spouse :=
NVL (hruserdt.get_table_value (p_business_group_id,
'HR Ticket Sector',
'ADULT-' || l_dep_ticket_class,
l_ticket_to,
l_date
),
0
);
fnd_file.put_line (fnd_file.LOG,
'Ticket Spouse:' || l_ticket_spouse
);
EXCEPTION
WHEN OTHERS
THEN
l_ticket_spouse := 0;
DBMS_OUTPUT.put_line ('Spouse Adult:' || SQLERRM);
fnd_file.put_line (fnd_file.LOG, SQLERRM);
END;
-- For Child
IF rec_rel.contact_type = 'C'
AND rec_rel.ticket_eligibility = 'Y'
THEN
SELECT MONTHS_BETWEEN (l_date, rec_rel.date_of_birth)
/ 12
INTO l_age
FROM DUAL;
IF l_age >= 0
AND l_age <= 12
AND rec_rel.ticket_eligibility = 'Y'
THEN
p_accrued_ticket_c := p_accrued_ticket_c + NVL (1, 0);
ELSIF l_age > 12 AND rec_rel.ticket_eligibility = 'Y'
THEN
l_accrued_ticket_ca := l_accrued_ticket_ca + 1;
-- Changed
END IF;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
DBMS_OUTPUT.put_line ('No Data Found');
NULL;
END;
END LOOP;
END IF;
END LOOP;
-- Changed
IF l_ticket_spouse = 0
THEN
l_accrued_ticket_s := 0;
l_accrued_ticket_ca := 0;
END IF;
IF l_ticket_child = 0
THEN
p_accrued_ticket_c := 0;
END IF;
IF l_ticket_adult = 0
THEN
p_accrued_ticket_a := 0;
END IF;
--------------------------------------------------------------------------------
-- Skip Regular Hours Yes or No
--------------------------------------------------------------------------------
FUNCTION xxpay_skip_reg_hours_y_n (
p_element_entry_id IN NUMBER,
p_e_date IN DATE
)
RETURN VARCHAR2
IS
v_date_earned DATE;
v_day VARCHAR2 (30);
v_shift VARCHAR2 (500);
v_emp_no VARCHAR2 (50);
v_skip VARCHAR2 (10) := 'N';
v_start_day VARCHAR2 (30);
v_person_id NUMBER;
v_week_start_date DATE;
CURSOR cur_rec
IS
SELECT *
FROM pay_element_entries_f peef
WHERE peef.element_entry_id =
NVL (p_element_entry_id, peef.element_entry_id)
AND NVL (p_e_date, SYSDATE) BETWEEN effective_start_date
AND effective_end_date;
BEGIN
DBMS_OUTPUT.put_line ('begin');
v_date_earned := hr_general.start_of_time;
v_shift := NULL;
v_day := NULL;
v_skip := 'N';
v_start_day := NULL;
v_week_start_date := NULL;
BEGIN
SELECT TO_CHAR (p_e_date, 'DAY')
INTO v_day
FROM DUAL;
EXCEPTION
WHEN OTHERS
THEN
NULL;
END;
IF v_day = 'THURSDAY'
THEN
NULL;
ELSE
/* commented by khurram
v_shift :=
xxotl_utilities.XX_SHIFT_SCHEDULE_FUNCTION (
v_rec.assignment_id,
v_date_earned
);
*/
BEGIN
v_person_id := 0;
v_start_day := NULL;
BEGIN
SELECT person_id
INTO v_person_id
FROM per_all_assignments_f
WHERE v_date_earned BETWEEN effective_start_date
AND effective_end_date;
EXCEPTION
WHEN OTHERS
THEN
v_person_id := -1;
END;
BEGIN
v_week_start_date := NEXT_DAY (p_e_date - 7, v_start_day);
EXCEPTION
WHEN OTHERS
THEN
v_week_start_date := p_e_date - 5;
END;
--------------------------------------------------------------------------------
-- Function to return the advance salary value based on the repective day
--------------------------------------------------------------------------------
FUNCTION calculate_advance_vac_salary (
p_element_entry_id IN NUMBER,
p_payroll_id IN NUMBER,
p_date IN DATE
)
RETURN NUMBER
IS
v_leave VARCHAR2 (100);
v_leave_days NUMBER;
v_days NUMBER;
v_cur_date DATE;
v_cur_salary NUMBER;
v_cur_gross NUMBER;
v_sal_day NUMBER;
v_days_in_month NUMBER;
v_totl_sal NUMBER;
CURSOR cur_rec
IS
SELECT peef.assignment_id, paa.person_id, paa.date_start,
paa.date_end, paa.absence_days days, paa.business_group_id
FROM per_absence_attendances paa, pay_element_entries_f peef
WHERE 1 = 1
AND paa.absence_attendance_id = peef.creator_id
AND peef.element_entry_id = p_element_entry_id
AND p_date BETWEEN peef.effective_start_date
AND peef.effective_end_date;
BEGIN
FOR v_rec IN cur_rec
LOOP
v_leave := NULL;
v_days := 0;
v_cur_date := NULL;
v_cur_salary := 0;
v_cur_gross := 0;
v_sal_day := 0;
v_days_in_month := 0;
v_totl_sal := 0;
v_leave_days := 0;
v_days := (v_rec.date_end - v_rec.date_start);
DBMS_OUTPUT.put_line ('v_days = ' || v_days);
FOR i IN 0 .. v_days
LOOP
v_leave_days := 0;
v_cur_date := NULL;
v_cur_salary := 0;
v_cur_gross := 0;
v_sal_day := 0;
v_days_in_month := 0;
v_cur_date := v_rec.date_start + i;
DBMS_OUTPUT.put_line ('v_cur_date := ' || v_cur_date);
v_leave_days :=
xxlam_hr_absence_duration.get_no_of_leaves_taken_adv_sal
(v_rec.business_group_id,
v_rec.assignment_id,
'Annual Vacation With Advance',
v_cur_date,
v_cur_date
);
DBMS_OUTPUT.put_line ('v_leave_days = ' || v_leave_days);
IF v_leave_days > 0
THEN
v_cur_gross := get_gross_at (v_rec.assignment_id, v_cur_date);
DBMS_OUTPUT.put_line ('v_cur_gross = ' || v_cur_gross);
BEGIN
SELECT (end_date - start_date) + 1
INTO v_days_in_month
FROM per_time_periods
WHERE payroll_id = p_payroll_id
AND v_cur_date BETWEEN start_date AND end_date;
EXCEPTION
WHEN OTHERS
THEN
v_days_in_month := 30;
END;
FUNCTION get_vacation_pay (
p_employee_number IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE,
p_monthly_value OUT NUMBER
)
RETURN NUMBER
IS
ld_period_start_date DATE := TO_DATE ('21-JUN-2010');
ld_period_end_date DATE := TO_DATE ('20-JUL-2010');
l_start_date DATE;
l_end_date DATE;
ln_no_of_days NUMBER (10);
ln_assignment_id NUMBER (10);
ln_sal_per_day NUMBER (10, 2);
ln_vac_sal NUMBER (10, 2);
CURSOR get_absence_days
IS
SELECT paa.*, paat.NAME
FROM per_absence_attendances paa,
per_absence_attendance_types paat
WHERE 1 = 1
AND paa.absence_attendance_type_id =
paat.absence_attendance_type_id
AND paa.person_id =
(SELECT person_id
FROM per_all_people_f
WHERE 1 = 1
AND employee_number = p_employee_number
AND TRUNC (SYSDATE) BETWEEN effective_start_date
AND effective_end_date)
AND ( (paa.date_start BETWEEN ld_period_start_date
AND ld_period_end_date
)
OR (paa.date_end BETWEEN ld_period_start_date
AND ld_period_end_date
)
);
BEGIN
FOR c1 IN get_absence_days
LOOP
IF UPPER (c1.NAME) LIKE 'ANNUAL VACATION'
THEN
SELECT assignment_id
INTO ln_assignment_id
FROM per_all_assignments_f
WHERE 1 = 1
AND person_id = c1.person_id
AND TRUNC (SYSDATE) BETWEEN effective_start_date
AND effective_end_date
AND assignment_type = 'E'
AND primary_flag = 'Y';
FOR i IN 1 .. ln_no_of_days
LOOP
--ln_vac_sal:=ln_sal_per_day;
--DBMS_OUTPUT.put_line ('ln_sal_per_day:' || ln_sal_per_day );
--DBMS_OUTPUT.put_line ('ln_vac_sal1:' || ln_vac_sal ) ;
--DBMS_OUTPUT.put_line ('each Date:' || to_char(l_start_date) ||'
'||i );
ln_sal_per_day :=
xxlam_hr_payroll_all.get_gross_at (ln_assignment_id,
l_start_date
)
/ ((ld_period_end_date - ld_period_start_date) + 1);
l_start_date := l_start_date + 1;
ln_vac_sal := ln_vac_sal + ln_sal_per_day;
--DBMS_OUTPUT.put_line ('ln_vac_sal2:' || ln_vac_sal );
--DBMS_OUTPUT.put_line ('each Date:' || l_start_date + 1);
END LOOP;
ELSE
ln_vac_sal := 0;
END IF;
p_monthly_value := ln_vac_sal;
RETURN ln_vac_sal;
END;
p_basic_salary :=
xxlam_hr_payroll_all.get_balance (p_assignment_id,
p_business_group_id,
'Monthly Basic',
'RUN',
p_end_date
);
p_length_of_service := l_los;
l_sal_chg_flag := l_los;
RETURN l_sal_chg_flag;
EXCEPTION
WHEN OTHERS
THEN
p_basic_salary := 0;
p_length_of_service := 0;
RETURN l_sal_chg_flag;
END get_los_sal_chg;
FUNCTION get_flag_adj_grat_accruals (
p_assignment_id IN NUMBER,
p_period_start_date IN DATE,
p_period_end_date IN DATE,
p_amount IN VARCHAR2
)
RETURN VARCHAR2
IS
ln_assignment_id NUMBER (10);
l_period_start_date DATE;
l_period_end_date DATE;
ln_element_type_id NUMBER (10);
ln_element_link_id NUMBER (10);
ln_payroll_id NUMBER (10);
ln_business_group_id NUMBER (10);
ln_amount NUMBER (10);
ln_element_rpt_name VARCHAR2 (100)
:= 'Gratuity Accrual Adjustment';
ln_input_value_id NUMBER (10);
v_start_date DATE;
v_end_date DATE;
v_warning BOOLEAN;
v_element_entry_id NUMBER;
v_object_version_number NUMBER;
BEGIN
ln_assignment_id := p_assignment_id;
l_period_start_date := p_period_start_date;
l_period_end_date := p_period_end_date;
ln_amount := p_amount;
BEGIN
SELECT payroll_id, business_group_id
INTO ln_payroll_id, ln_business_group_id
FROM per_all_assignments_f
WHERE 1 = 1
AND assignment_id = ln_assignment_id
AND primary_flag = 'Y'
AND assignment_type = 'E'
AND TRUNC (l_period_end_date) BETWEEN effective_start_date
AND effective_end_date;
EXCEPTION
WHEN OTHERS
THEN
ln_payroll_id := 0;
END;
BEGIN
SELECT petf.element_type_id, pelf.element_link_id, input_value_id
INTO ln_element_type_id, ln_element_link_id, ln_input_value_id
FROM pay_element_types_f petf,
pay_element_links_f pelf,
pay_input_values_f pivf
WHERE 1 = 1
AND petf.element_type_id = pelf.element_type_id
AND petf.element_type_id = pivf.element_type_id
AND payroll_id = ln_payroll_id
AND TRIM (UPPER (petf.element_name)) LIKE
TRIM (UPPER (ln_element_rpt_name))
AND TRUNC (l_period_end_date) BETWEEN pivf.effective_start_date
AND pivf.effective_end_date
AND TRUNC (l_period_end_date) BETWEEN petf.effective_start_date
AND petf.effective_end_date
AND TRUNC (l_period_end_date) BETWEEN pelf.effective_start_date
AND pelf.effective_end_date;
EXCEPTION
WHEN OTHERS
THEN
ln_element_type_id := 0;
ln_element_link_id := 0;
END;
(p_period_end_date
)
+ 2,
p_business_group_id =>
ln_business_group_id,
p_assignment_id => ln_assignment_id,
p_element_link_id => ln_element_link_id,
p_entry_type => 'E',
p_cost_allocation_keyflex_id => NULL,
p_date_earned => TO_DATE
(p_period_end_date
)
+ 2,
p_input_value_id1 => ln_input_value_id,
p_entry_value1 => TO_CHAR
(ln_amount),
p_entry_information27 => 'SALARY CHG ADJ
GRAT',
p_effective_start_date => v_start_date,
p_effective_end_date => v_end_date,
p_element_entry_id => v_element_entry_id,
p_object_version_number =>
v_object_version_number,
p_create_warning => v_warning
);
RETURN 'Y';
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('Error message = ' || SQLERRM);
RETURN 'N';
END get_flag_adj_grat_accruals;
FUNCTION get_month_unpaid_days (
p_assignment_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE
)
RETURN NUMBER
IS
p_business_group_id NUMBER (10) := 81;
l_unpaid_leave NUMBER (10);
BEGIN
l_unpaid_leave :=
xxlam_hr_absence_duration.get_no_of_leaves_taken_ass_id
(p_business_group_id,
p_assignment_id,
'Unpaid Leave',
p_start_date,
p_end_date
);
RETURN l_unpaid_leave;
EXCEPTION
WHEN OTHERS
THEN
l_unpaid_leave := 0;
RETURN l_unpaid_leave;
END get_month_unpaid_days;
IF l_employee_number != 'N'
THEN
BEGIN
SELECT meaning
INTO l_value
FROM hr_lookups
WHERE 1 = 1
AND lookup_type = 'XXHR_GRAT_ADJUSTMENT'
AND start_date_active = p_start_date
AND end_date_active = p_end_date
AND TRUNC (lookup_code) = TRUNC (l_employee_number);
RETURN l_value;
DBMS_OUTPUT.put_line ('l_value: ' || l_value);
END get_grat_accrual_adj;
BEGIN
SELECT start_date_active
INTO l_fs_adj_date
FROM hr_lookups
WHERE 1 = 1
AND lookup_type = 'XXHR_FS_COMPANY_START_DATE'
AND enabled_flag = 'Y'
AND meaning = l_payroll_name;
EXCEPTION
WHEN OTHERS
THEN
l_fs_adj_date := TO_DATE ('21-NOV-2013');
RETURN 0;
--NULL;
END;
-- ----------------------------------------------------------------------------
-- |-------------------------< calculate_food_all >-------------------------|
-- ----------------------------------------------------------------------------
FUNCTION calculate_food_all (
p_assignment_id IN NUMBER,
p_element_entry_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE,
p_month_value OUT NUMBER
)
RETURN NUMBER
IS
v_salary NUMBER := 0;
v_gross NUMBER := 0;
v_value NUMBER := 0;
v_days NUMBER := (p_end_date - p_start_date);
v_date DATE;
v_mth_days NUMBER;
v_mth_value NUMBER := 0;
v_sal_per_day NUMBER := 0;
v_hrs_per_day NUMBER := 0;
v_otl_hrs NUMBER := 0;
v_curr_otl_hrs NUMBER := 0;
v_week_hrs NUMBER := 0;
v_curr_week_hrs NUMBER := 0;
v_holiday NUMBER := 0;
v_curr_holiday NUMBER := 0;
v_week_holi_pay NUMBER := 0;
v_skip_holiday NUMBER := 0;
v_employee_number NUMBER := 0;
v_business_group_id NUMBER := 81;
v_curr_sick NUMBER := 0;
v_total_sick_days NUMBER := 0;
v_holiday_flag VARCHAR2 (10);
v_leave_flag VARCHAR2 (10);
v_payroll_id NUMBER (10);
BEGIN
v_mth_days :=
xxlam_hr_payroll_all.get_month_days (p_assignment_id, p_start_date);
p_month_value := 0;
FOR i IN 0 .. v_days
LOOP
v_date := p_start_date + i;
v_curr_otl_hrs := 0;
v_curr_week_hrs := 0;
v_curr_holiday := 0;
BEGIN
v_mth_value :=
xxlam_hr_payroll_all.get_screen_entry_value_at
(p_assignment_id,
p_element_entry_id,
'Monthly Value',
v_date
);
END;
-- BEGIN
-- v_gross := get_gross_at (p_assignment_id, v_date);
-- END;
p_month_value := v_mth_value;
-- IF v_mth_value = 0
-- THEN
-- p_pay_value := v_mth_value;
-- END IF;
DBMS_OUTPUT.put_line ('p_month_value = ' || p_month_value);
BEGIN
v_hrs_per_day :=
xxlam_hr_payroll_all.xxotl_hours_day (p_assignment_id, v_date);
END;
BEGIN
v_curr_otl_hrs :=
xxlam_hr_payroll_all.get_otl_regular_hours (p_assignment_id,
v_date
);
END;
IF v_curr_sick = 0
THEN
-- v_curr_sick :=
XXLAM_HR_ABSENCE_DURATION.get_parttime_absence (p_assignment_id,'Parttime Sick
Leave',v_date)/v_hrs_per_day;
v_curr_sick :=
xxlam_hr_absence_duration.get_parttime_absence
(p_assignment_id,
'Parttime Sick Leave',
v_date
);
END IF;
IF v_curr_sick > 0
THEN
IF v_total_sick_days <= 15
THEN
v_curr_otl_hrs := 8;
ELSE
IF v_total_sick_days > 15 AND v_total_sick_days <= 45
THEN
v_curr_otl_hrs := 8 * 0.5;
ELSIF v_total_sick_days > 45 AND v_total_sick_days <= 90
THEN
v_curr_otl_hrs := 0;
END IF;
END IF;
END IF;
SELECT payroll_id
INTO v_payroll_id
FROM per_all_assignments_f
WHERE 1 = 1
AND v_date BETWEEN effective_start_date AND effective_end_date
AND assignment_id = p_assignment_id;
xxotl_utilities.XXOTL_GET_HOLIDAY_YES_NO (p_assignment_id,
v_date); */
BEGIN
v_curr_week_hrs :=
xxlam_hr_payroll_all.xxotl_get_week_off_pay (p_assignment_id,
v_date,
v_date
);
END;
IF v_curr_week_hrs <> 0
THEN
v_week_hrs := v_week_hrs + v_curr_week_hrs;
v_week_holi_pay :=
v_week_holi_pay
+ (p_month_value / v_mth_days) * v_curr_week_hrs;
END IF;
BEGIN
v_curr_holiday :=
xxlam_hr_absence_duration.holidays (p_assignment_id,
v_date,
v_date
);
END;
-- BEGIN
-- SELECT employee_number
-- INTO v_employee_number
-- FROM xxhr_emp_data_all
-- WHERE 1 = 1 AND assignment_id = p_assignment_id;
-- EXCEPTION
-- WHEN OTHERS
-- THEN
-- v_employee_number := 0;
-- END;
-- v_skip_holiday :=
-- XXLAM_HR_ABSENCE_DURATION.get_holiday_unpaid_leaves (
-- v_employee_number,
-- v_business_group_id,
-- v_date
-- );
-- IF v_skip_holiday <> 0
-- THEN
-- v_otl_hrs := 0;
-- END IF;
DBMS_OUTPUT.put_line ( v_sal_per_day
|| 'Week:'
|| v_week_hrs
|| 'OTL:'
|| v_otl_hrs
|| 'Holiday:'
|| v_holiday
);
END LOOP;
FUNCTION get_all_unpaid_days (
p_assignment_id IN NUMBER,
p_effective_date IN DATE
)
RETURN NUMBER
IS
l_person_id NUMBER (10);
l_unpaid_days_bal NUMBER (10);
l_unpaid_days NUMBER (10);
l_total NUMBER (10);
BEGIN
SELECT person_id
INTO l_person_id
FROM per_all_assignments_f
WHERE 1 = 1
AND assignment_id = p_assignment_id
AND p_effective_date BETWEEN effective_start_date AND effective_end_date;
BEGIN
SELECT NVL (SUM (pev.screen_entry_value), 0)
INTO l_unpaid_days_bal
FROM pay_element_entries_f pee,
pay_element_entry_values_f pev,
pay_element_types_f pet,
pay_input_values_f piv
WHERE 1 = 1
AND pee.element_entry_id = pev.element_entry_id
AND pet.element_type_id = pee.element_type_id
AND pet.element_name IN ('Initial Balance Upload')
--and pet.business_group_id = 81
AND pet.element_type_id = piv.element_type_id
AND pev.input_value_id = piv.input_value_id
--and piv.name in ('Unpaid Days','Sick Leave Days','Days')
AND upper(piv.NAME) like upper('%Unpaid%')
AND pee.assignment_id = p_assignment_id;
---- Ini_Unpaid_Days,
---------------------
EXCEPTION
WHEN OTHERS
THEN
l_unpaid_days_bal := 0;
END;
BEGIN
SELECT --- xed.employee_number,
NVL (SUM (absence_days), 0)
INTO l_unpaid_days
FROM --- XXHR_EMP_DATA_UAE xed,
per_absence_attendances_v paa
WHERE 1 = 1
AND paa.person_id = l_person_id
AND upper(paa.c_type_desc ) like upper('%Unpaid%');---= 'Unpaid
Leave';
---aND upper(piv.NAME) IN upper('%Unpaid%Days%');
--- and xed.employee_number in ( 2699)
EXCEPTION
WHEN OTHERS
THEN
l_unpaid_days := 0;
END;
RETURN l_staff_location;
EXCEPTION
WHEN OTHERS
THEN
RETURN 'PO';
END get_staff_work_location;
FUNCTION calculate_admin_salary (
p_assignment_id IN NUMBER,
p_element_entry_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE
---p_month_value OUT NUMBER
-- p_week_holi_pay OUT NUMBER,
-- p_maternity_pay OUT NUMBER,
-- p_maternity_days OUT NUMBER,
-- p_sick_pay OUT NUMBER,
-- p_sick_ded OUT NUMBER,
-- p_sick_days OUT NUMBER
)
RETURN NUMBER
IS
v_salary NUMBER := 0;
--- p_end_date DATE;
--- p_start_date DATE;
v_gross NUMBER := 0;
v_basic NUMBER := 0;
v_days NUMBER;
---:= (trunc(to_date('01-JAN-2013')) - trunc(to_date('31-JAN-2013')));
------------p_end_date - p_start_date);
v_date DATE;
v_mth_days NUMBER;
v_mth_value NUMBER := 0;
v_sal_per_day NUMBER := 0;
v_hrs_per_day NUMBER := 0;
v_otl_hrs NUMBER (5, 2) := 0;
v_curr_otl_hrs NUMBER (5, 2) := 0;
v_week_hrs NUMBER := 0;
v_curr_week_hrs NUMBER := 0;
v_holiday NUMBER := 0;
v_week_pay NUMBER := 0;
v_holi_pay NUMBER := 0;
v_curr_holiday NUMBER := 0;
v_curr_maternity NUMBER := 0;
v_curr_maternity_pay NUMBER := 0;
v_curr_sick NUMBER := 0;
v_curr_sick_pay NUMBER := 0;
v_curr_sick_ded NUMBER := 0;
v_total_sick_days NUMBER := 0;
v_business_group_id NUMBER := 0;
l_period_service NUMBER := 0;
v_person_type VARCHAR2 (100);
v_skip_holiday NUMBER := 0;
v_employee_number VARCHAR2 (250);
v_curr_sick_pay_p NUMBER;
v_curr_sick_ded_p NUMBER;
l_day_status VARCHAR2 (250);
l_half_day_sick_leave NUMBER := 0 ;
l_half_day_annual_leave NUMBER := 0 ;
--- p_month_value NUMBER;
--- p_assignment_id NUMBER;
---- p_element_entry_id NUMBER;
i NUMBER := 0;
BEGIN
v_basic := 0;
-- p_end_date := TO_DATE ('31-JAN-2013');
-- p_start_date := TO_DATE ('01-JAN-2013');
v_days := p_end_date - p_start_date;
v_mth_days :=
xxlam_hr_payroll_all.get_month_days (p_assignment_id, p_start_date);
DBMS_OUTPUT.put_line ('v_mth_days:' || v_mth_days);
DBMS_OUTPUT.put_line ('v_person_type:' || v_person_type);
v_business_group_id := hr_general.get_business_group_id ();
v_business_group_id := 81;
FOR i IN 0 .. v_days
LOOP
v_date := p_start_date + i;
v_curr_otl_hrs := 0;
v_curr_week_hrs := 0;
v_curr_holiday := 0;
v_curr_maternity_pay := 0;
v_curr_sick_pay := 0;
v_curr_sick_ded := 0;
v_curr_sick_pay_p := 0;
v_curr_sick_ded_p := 0;
BEGIN
l_day_status := get_day_status(p_assignment_id,v_date);
v_mth_value :=
xxlam_hr_payroll_all.get_screen_entry_value_at
(p_assignment_id,
p_element_entry_id,
'Monthly Value',
v_date
);
l_half_day_sick_leave := XXLAM_HR_ABSENCE_DURATION.get_parttime_absence
(p_assignment_id,
'Half Day Sick Leave',
v_date ) ;
l_half_day_annual_leave := XXLAM_HR_ABSENCE_DURATION.get_parttime_absence
(p_assignment_id,
'Half Day Annual Leave',
v_date ) ;
END;
BEGIN
IF l_half_day_sick_leave = 0.5
THEN
v_sal_per_day :=
ROUND (v_sal_per_day + ((v_mth_value) / v_mth_days/2),
3);
end if;
SELECTabsence_days
INTOv_curr_holiday
FROMper_absence_attendances paa1
WHERE1 = 1
ANDperson_id = (SELECT distinct person_id
FROM per_all_assignments_f paaf
WHERE paaf.assignment_id = p_assignment_id
and v_date between paaf.EFFECTIVE_START_DATE and
paaf.EFFECTIVE_END_DATE )
AND v_date BETWEEN date_start AND date_end
--- and ABSENCE_ATTENDANCE_TYPE_ID <>72 ; ----TOIL is excluded;
AND absence_attendance_type_id not in( '72','68', '1061'); ---- Toil,
Half Day toil and Paid day off
EXCEPTION
WHEN NO_DATA_FOUND
THEN
--- DBMS_OUTPUT.put_line( 'I am adding salary ' || v_date);
END IF;
WHEN OTHERS
THEN
NULL;
END;
v_hrs_per_day := 9;
-- DBMS_OUTPUT.put_line ( 'v_sal_per_day'
-- || v_sal_per_day
-- || '~'
-- || 'Date:....'
-- || v_date
-- || ' p_month_value'
-- || p_month_value
-- );
END LOOP;
RETURN v_sal_per_day;
END calculate_admin_salary;
BEGIN
----l_month_days := get_month_days(p_assignment_id,p_ot_date);
l_month_days := get_emp_work_plan(p_assignment_id,p_ot_date);
---OT_Hours := 4;
select ASS_ATTRIBUTE3,ASS_ATTRIBUTE1, NVL(ASS_ATTRIBUTE25,0)
into l_ot_elig , l_work_schedule,l_ot_cap
from per_All_Assignments_f
where assignment_id = p_assignment_id
and trunc(p_ot_date) between effective_start_Date and effective_end_Date ;
-- IF TO_NUMBER(l_ot_cap) > 0
-- then
--
-- IF Ot_Amount > TO_NUMBER(l_ot_cap)
-- THEN
--
-- Ot_Amount := TO_NUMBER(l_ot_cap);
--
-- END IF;
--
-- END IF;
RETURN round(Ot_Amount,2);
EXCEPTION
WHEN OTHERS THEN
Null;
END CALCULATE_OVERTIME;
FUNCTION GET_OTL_REGULAR_HOURS_YARD (
p_assignment_id NUMBER,
p_effective_date DATE
)
RETURN NUMBER
IS
--DECLARE
--p_assignment_id Number :=141;
--p_effective_date DATE := '01-JAN-1950';
l_value NUMBER := 0;
v_week_off NUMBER := 0;
v_holiday NUMBER := 0;
v_person_type VARCHAR2 (30);
v_element_entry_id NUMBER := 0;
v_date DATE;
v_skip_y_n VARCHAR2 (100) := 'N';
v_term_person_type VARCHAR2 (100) := NULL;
BEGIN
v_person_type := 'Yard';
IF v_person_type = 'Yard'
THEN
SELECT NVL
(SUM
(fnd_number.canonical_to_number (pev.screen_entry_value)
),
0
),
MAX (peef.element_entry_id)
INTO l_value,
v_element_entry_id
FROM pay_element_types_f_vl pet,
pay_input_values_f piv,
pay_element_entry_values_f pev,
pay_element_entries_f peef
WHERE 1 = 1
AND peef.assignment_id = p_assignment_id
AND piv.NAME = 'Hours'
AND pet.element_name IN ('Regular Hours', 'OTL Holiday Pay')
AND piv.element_type_id = pet.element_type_id
AND peef.element_type_id = pet.element_type_id
AND piv.input_value_id = pev.input_value_id
AND peef.element_entry_id = pev.element_entry_id
AND peef.date_earned = p_effective_date;
ELSE
SELECT NVL
(SUM
(fnd_number.canonical_to_number (pev.screen_entry_value)
),
0
),
MAX (peef.element_entry_id)
INTO l_value,
v_element_entry_id
FROM pay_element_types_f_vl pet,
pay_input_values_f piv,
pay_element_entry_values_f pev,
pay_element_entries_f peef
WHERE 1 = 1
AND peef.assignment_id = p_assignment_id
AND piv.NAME = 'Hours'
AND pet.element_name IN ('Regular Hours')
AND piv.element_type_id = pet.element_type_id
AND peef.element_type_id = pet.element_type_id
AND piv.input_value_id = pev.input_value_id
AND peef.element_entry_id = pev.element_entry_id
AND peef.date_earned = p_effective_date;
END IF;
BEGIN
v_holiday :=
xxlam_hr_absence_duration.holidays (p_assignment_id,
p_effective_date,
p_effective_date
);
END;
IF v_person_type = 'Yard'
THEN
IF (v_week_off <> 0 OR v_holiday <> 0)
THEN
l_value := 0;
END IF;
--------Added the below code Starts here
ELSIF v_person_type = 'Staff'
THEN
IF v_skip_y_n = 'Y'
THEN
l_value := 0;
END IF;
--------Added the below code ENDs here
END IF;
FUNCTION CALCULATE_SALARY_YARD (
p_assignment_id IN NUMBER,
p_element_entry_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE
--- p_month_value OUT NUMBER,
-- p_week_holi_pay OUT NUMBER,
-- p_maternity_pay OUT NUMBER,
-- p_maternity_days OUT NUMBER,
-- p_sick_pay OUT NUMBER,
-- p_sick_ded OUT NUMBER,
-- p_sick_days OUT NUMBER
)
RETURN NUMBER
IS
v_salary NUMBER := 0;
v_gross NUMBER := 0;
v_basic NUMBER := 0;
v_days NUMBER ;--- := (p_end_date - p_start_date);
v_date DATE;
v_mth_days NUMBER;
v_mth_value NUMBER := 0;
v_sal_per_day NUMBER := 0;
v_hrs_per_day NUMBER := 0;
v_otl_hrs NUMBER (5, 2) := 0;
v_curr_otl_hrs NUMBER (5, 2) := 0;
v_week_hrs NUMBER := 0;
v_curr_week_hrs NUMBER := 0;
v_holiday NUMBER := 0;
v_week_pay NUMBER := 0;
v_holi_pay NUMBER := 0;
v_curr_holiday NUMBER := 0;
v_curr_maternity NUMBER := 0;
v_curr_maternity_pay NUMBER := 0;
v_curr_sick NUMBER := 0;
v_curr_sick_pay NUMBER := 0;
v_curr_sick_ded NUMBER := 0;
v_total_sick_days NUMBER := 0;
v_business_group_id NUMBER := 0;
l_period_service NUMBER := 0;
v_person_type VARCHAR2 (100);
v_skip_holiday NUMBER := 0;
v_employee_number VARCHAR2 (250);
v_curr_sick_pay_p NUMBER;
v_curr_sick_ded_p NUMBER;
p_month_value NUMBER;
-- p_assignment_id NUMBER;
-- p_element_entry_id NUMBER;
-- p_start_date DATE;
-- p_end_date DATE;
BEGIN
-- p_assignment_id :=141;
-- p_element_entry_id := 1083;
-- p_start_date :=to_Date('01-SEP-2013');
-- p_end_date :=to_Date('30-SEP-2013');
v_basic := 0;
---v_days := (p_end_date - p_start_date);
v_business_group_id := 81;
FOR i IN 0 .. v_days
LOOP
v_date := p_start_date + i;
v_curr_otl_hrs := 0;
v_curr_week_hrs := 0;
v_curr_holiday := 0;
v_curr_maternity_pay := 0;
v_curr_sick_pay := 0;
v_curr_sick_ded := 0;
v_curr_sick_pay_p := 0;
v_curr_sick_ded_p := 0;
BEGIN
v_mth_value :=
xxlam_hr_payroll_all.get_screen_entry_value_at (p_assignment_id,
p_element_entry_id,
'Monthly Value',
v_date
);
END;
DBMS_OUTPUT.PUT_LINE ( ' BAsic Salary ' ||v_mth_value );
p_month_value := v_mth_value;
BEGIN
v_hrs_per_day := xxlam_hr_payroll_all.xxotl_hours_day
(p_assignment_id, v_date);
END;
DBMS_OUTPUT.PUT_LINE ( ' HOUrs per day '||v_hrs_per_day );
BEGIN
v_curr_otl_hrs := xxlam_hr_payroll_all.GET_OTL_REGULAR_HOURS_YARD
(p_assignment_id, v_date);
END;
END LOOP;
FUNCTION LEL_CALCULATE_GRATUITY (
p_assignment_id IN NUMBER,
p_element_entry_id in NUMBER,
p_start_date IN DATE,
p_end_date IN DATE
)
RETURN NUMBER
IS
l_years NUMBER := 0;
--- p_assignment_id number := 143 ;
l_months NUMBER := 0;
l_days NUMBER := 0;
l_value NUMBER := 0;
l_sal_day NUMBER;
-- := (get_salary_at (p_assignment_id, p_end_date) * .6) / 365;
l_service_days NUMBER := 0;
l_salary NUMBER := 0;
l_unpaid_leave NUMBER := 0;
l_service_years NUMBER := 0;
p_month_factor NUMBER;
l_contract_duration NUMBER;
l_salary_tmp NUMBER;
l_bg_id NUMBER;
l_days_more_five_year NUMBER := 0;
l_max_gratuity NUMBER := 0;
--- p_start_date DATE := to_date('01-jan-2009');
--- p_end_date date := to_date('01-jan-2015');
--- p_month_factor NUMBER;
BEGIN
SELECT business_group_id
INTO l_bg_id
FROM per_all_assignments_f
WHERE assignment_id = p_assignment_id
AND p_end_date BETWEEN effective_start_date AND effective_end_date;
l_salary_tmp :=
xxlam_hr_payroll_all.get_screen_entry_value_at
(p_assignment_id,
p_element_entry_id,
'Monthly Value',
p_end_date
);
l_unpaid_leave :=
xxlam_hr_payroll_all.get_all_unpaid_days (p_assignment_id,
p_end_date);
l_service_days := ((p_end_date - p_start_date) + 1) - l_unpaid_leave;
THEN
l_value :=
ROUND (1825 * (l_sal_day) * 21 / 365, 0)
+ ROUND (l_days_more_five_year * (l_sal_day) * 30 / 365, 0);
END IF;
l_value :=l_max_gratuity;
END IF;
RETURN l_value;
EXCEPTION
WHEN OTHERS
THEN
l_value := 0;
---p_service_period := NULL;
RETURN l_value;
END LEL_CALCULATE_GRATUITY;
FUNCTION CALCULATE_SICK_LEAVE_SALARY (
p_assignment_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE,
p_sick_pay OUT NUMBER,
p_sick_ded OUT NUMBER,
p_sick_days OUT NUMBER
)
RETURN NUMBER
IS
---DECLARE
--p_assignment_id NUMBER :=61;
-- p_start_date DATE := to_Date('01-JAN-2014');
-- p_end_date DATE := to_Date('31-JAN-2014');
-- p_month_value NUMBER := 0;
-- p_week_holi_pay NUMBER := 0;
-- p_month_value NUMBER := 0;
-- p_maternity_pay NUMBER := 0;
-- p_maternity_days NUMBER:= 0;
-- p_sick_pay NUMBER:= 0;
-- p_sick_ded NUMBER := 0;
-- p_sick_days NUMBER:= 0;
--
v_salary NUMBER := 0;
v_gross NUMBER := 0;
v_sick NUMBER := 0;
v_days NUMBER := (p_end_date - p_start_date);
v_date DATE;
v_mth_days NUMBER;
v_mth_value NUMBER := 0;
v_sal_per_day NUMBER := 0;
v_hrs_per_day NUMBER := 0;
v_otl_hrs NUMBER (5, 2) := 0;
v_curr_otl_hrs NUMBER (5, 2) := 0;
v_week_hrs NUMBER := 0;
v_curr_week_hrs NUMBER := 0;
v_holiday NUMBER := 0;
v_week_pay NUMBER := 0;
v_holi_pay NUMBER := 0;
v_curr_holiday NUMBER := 0;
v_curr_maternity NUMBER := 0;
v_curr_maternity_pay NUMBER := 0;
v_curr_sick NUMBER := 0;
v_curr_sick_pay NUMBER := 0;
v_curr_sick_ded NUMBER := 0;
v_total_sick_days NUMBER := 0;
v_business_group_id NUMBER := 0;
l_period_service NUMBER := 0;
v_person_type VARCHAR2 (100);
v_skip_holiday NUMBER := 0;
v_employee_number VARCHAR2 (250);
v_curr_sick_pay_p NUMBER;
v_curr_sick_ded_p NUMBER;
l_prob_date NUMBER :=0 ;
l_ini_sick_leave NUMBER :=0 ;
BEGIN
--- v_basic := 0;
v_mth_days := XXLAM_HR_PAYROLL_ALL.get_month_days (p_assignment_id,
p_start_date);
v_person_type := XXLAM_HR_PAYROLL_ALL.get_person_type_ass (p_assignment_id,
p_end_date);
--- p_month_value := 0;
-- p_week_holi_pay := 0;
-- -p_month_value := 0;
-- p_maternity_pay := 0;
-- p_maternity_days := 0;
p_sick_pay := 0;
p_sick_ded := 0;
p_sick_days := 0;
v_business_group_id := hr_general.get_business_group_id ();
v_business_group_id :=81;
DBMS_OUTPUT.put_line ('Business Grp id ' ||v_business_group_id);
-- || v_date
-- );
--v_business_group_id := 81;
l_ini_sick_leave := XXLAM_HR_ABSENCE_DURATION.INITIAL_UPLOAD_SICK_LEAVE
( 81,p_assignment_id) ;
FOR i IN 0 .. v_days
LOOP
v_date := p_start_date + i;
v_curr_otl_hrs := 0;
v_curr_week_hrs := 0;
v_curr_holiday := 0;
v_curr_maternity_pay := 0;
v_curr_sick_pay := 0;
v_curr_sick_ded := 0;
v_curr_sick_pay_p := 0;
v_curr_sick_ded_p := 0;
-- end;
--
-- /***************************************Sick leave not on Probation
************************/
-- IF l_prob_date >1 THEN
--
BEGIN
v_gross := XXLAM_HR_PAYROLL_ALL.get_gross_at (p_assignment_id, v_date);
END;
v_curr_sick :=
xxlam_hr_absence_duration.get_no_of_leaves_taken_ass_id
(v_business_group_id,
p_assignment_id,
'Sick Leave',
v_date,
v_date
) +
XXLAM_HR_ABSENCE_DURATION.get_parttime_absence (p_assignment_id,
'Half Day Sick Leave',
v_date );
IF v_curr_sick > 0
THEN
IF v_total_sick_days <= 15
THEN
v_curr_sick_pay := v_curr_sick * (v_gross / v_mth_days);
DBMS_OUTPUT.put_line ('Less than 15 days: Gross' || v_gross|| ' ***
v_mth_days' || v_mth_days);
ELSE
IF v_total_sick_days > 15 AND v_total_sick_days <= 45
THEN
v_curr_sick_pay := v_curr_sick * (v_gross / v_mth_days);
v_curr_sick_ded := v_curr_sick * (v_gross / v_mth_days)
* .5;
DBMS_OUTPUT.put_line
( 'between than 16 and 45 days: Gross'
|| v_gross
);
ELSIF v_total_sick_days > 45 AND v_total_sick_days <= 90
THEN
v_curr_sick_pay := v_curr_sick * (v_gross / v_mth_days);
v_curr_sick_ded := v_curr_sick * (v_gross / v_mth_days);
DBMS_OUTPUT.put_line
( 'between than 49 and 90 days: Gross'
|| v_gross
);
END IF;
END IF;
END IF;
FUNCTION CALCULATE_LEAVE_SALARY(
p_assignment_id IN NUMBER,
p_leave_name IN VARCHAR2,
p_start_date IN DATE,
p_end_date IN DATE,
p_leave_days OUT NUMBER
)
RETURN NUMBER
IS
----DECLARE
---p_assignment_id NUMBER :=61; --110
---p_leave_name varchar2(200);
-- p_start_date DATE := to_Date('01-jul-2013');
--- p_end_date DATE := to_Date('31-jul-2013');
p_month_value NUMBER := 0;
p_week_holi_pay NUMBER := 0;
p_month_value NUMBER := 0;
p_maternity_pay NUMBER := 0;
p_maternity_days NUMBER:= 0;
p_sick_pay NUMBER:= 0;
p_sick_ded NUMBER := 0;
p_sick_days NUMBER:= 0;
v_salary NUMBER := 0;
v_gross NUMBER := 0;
v_basic NUMBER := 0;
v_days NUMBER := (p_end_date - p_start_date);
v_date DATE;
v_mth_days NUMBER;
v_mth_value NUMBER := 0;
v_sal_per_day NUMBER := 0;
v_hrs_per_day NUMBER := 0;
v_otl_hrs NUMBER (5, 2) := 0;
v_curr_otl_hrs NUMBER (5, 2) := 0;
v_week_hrs NUMBER := 0;
v_curr_week_hrs NUMBER := 0;
v_holiday NUMBER := 0;
v_week_pay NUMBER := 0;
v_holi_pay NUMBER := 0;
v_curr_holiday NUMBER := 0;
v_curr_maternity NUMBER := 0;
v_curr_maternity_pay NUMBER := 0;
v_curr_sick NUMBER := 0;
v_curr_sick_pay NUMBER := 0;
v_curr_sick_ded NUMBER := 0;
v_total_sick_days NUMBER := 0;
v_business_group_id NUMBER := 0;
l_period_service NUMBER := 0;
v_person_type VARCHAR2 (100);
v_skip_holiday NUMBER := 0;
v_employee_number VARCHAR2 (250);
v_curr_sick_pay_p NUMBER;
v_curr_sick_ded_p NUMBER;
v_leave_salary NUMBER := 0;
t_leave_salary NUMBER := 0 ;
v_leave_days NUMBER := 0 ;
t_leave_days NUMBER := 0 ;
BEGIN
--- p_leave_name := 'Emergency Leave';---'Maternity Leave'; Compassionate Leave
---Emergency Leave
v_basic := 0;
BEGIN
v_gross := XXLAM_HR_PAYROLL_ALL.get_gross_at (p_assignment_id, v_date);
DBMS_OUTPUT.put_line ( 'Gross Salary is ' || v_gross || '--- Days in
month is ----'|| to_char( v_days+1));
END;
v_mth_days := XXLAM_HR_PAYROLL_ALL.get_month_days (p_assignment_id,
v_date);
IF v_curr_maternity > 0
THEN
IF l_period_service < 365
THEN
v_curr_maternity_pay :=
v_curr_maternity * (v_gross / v_mth_days)
* .5;
ELSE
v_curr_maternity_pay :=
v_curr_maternity
* (v_gross / v_mth_days);
END IF;
END IF;
v_leave_days :=
xxlam_hr_absence_duration.get_no_of_leaves_taken_ass_id
(v_business_group_id,
p_assignment_id,
p_leave_name, -- 'Annual
Leave',
v_date,
v_date
);
End IF;
/************************ Annual Vacation , Compassionate , Emergency ,
Garden Leave Calculation Ends ****************/
/************************ Forced Leave Calculation Starts
****************/
v_leave_days :=
xxlam_hr_absence_duration.get_no_of_leaves_taken_ass_id
(v_business_group_id,
p_assignment_id,
p_leave_name, -- 'Annual
Leave',
v_date,
v_date
);
t_leave_days := t_leave_days + v_leave_days;
End IF;
END IF;
/************************ Forced Leave, Compassionate , Emergency
Calculation Ends ****************/
END LOOP;
RETURN t_leave_salary;
END CALCULATE_LEAVE_SALARY;
FUNCTION CALCULATE_OVERTIME_HOLIDAY (p_assignment_id IN NUMBER,
p_ot_hours IN NUMBER,
p_ot_date IN DATE
)
RETURN NUMBER
IS
l_ot_elig VARCHAR2 (10) := 'N';
Basic_salary Number ;
--- OT_Hours NUMBER ;
OT_Amount NUMBER := 0;
l_user_table_name VARCHAR2 (200);
l_user_column_name VARCHAR2 (200);
l_work_schedule VARCHAR2 (200);
l_no_hours_in_Day VARCHAR2 (20);
l_month_days number;
BEGIN
---OT_Hours := 4;
select ASS_ATTRIBUTE3,ASS_ATTRIBUTE1
into l_ot_elig , l_work_schedule
from per_All_Assignments_f
where assignment_id = p_assignment_id
and trunc(p_ot_date) between effective_start_Date and effective_end_Date ;
RETURN round(Ot_Amount,2);
EXCEPTION
WHEN OTHERS THEN
Null;
END CALCULATE_OVERTIME_HOLIDAY;
/* Calculate the Net Entitlement */
FUNCTION GET_NET_ENTITLEMENT_ANNUAL(
P_ASSG_ID IN NUMBER,
P_PAYROLL_ID IN NUMBER,
P_CALCULATION_DATE IN DATE
)
RETURN NUMBER
IS
L_START_DATE DATE;
L_END_DATE DATE;
L_ACC_END_DATE DATE;
L_VALUE NUMBER := 0;
L_NET_VALUE NUMBER (15, 3);
P_PLAN_ID NUMBER;
-- P_PLAN_ID NUMBER;
BEGIN
SELECT PAP.ACCRUAL_PLAN_ID
INTO P_PLAN_ID
FROM PAY_ACCRUAL_PLANS PAP
WHERE UPPER (PAP.ACCRUAL_PLAN_NAME) LIKE
(SELECT UPPER (PETF.ELEMENT_NAME)
FROM PAY_ELEMENT_ENTRIES_F PEEF, PAY_ELEMENT_TYPES_F PETF
WHERE PEEF.ELEMENT_TYPE_ID = PETF.ELEMENT_TYPE_ID
AND UPPER (PETF.ELEMENT_NAME) LIKE '%PLAN%'
AND PETF.PROCESSING_TYPE = 'R'
AND PEEF.ASSIGNMENT_ID = P_ASSG_ID
AND P_CALCULATION_DATE BETWEEN PEEF.EFFECTIVE_START_DATE
AND PEEF.EFFECTIVE_END_DATE);
-- PER_ACCRUAL_CALC_FUNCTIONS.GET_NET_ACCRUAL
-- (P_ASSIGNMENT_ID => P_ASSG_ID,
-- P_PLAN_ID => P_PLAN_ID,
-- P_PAYROLL_ID => P_PAYROLL_ID,
-- P_BUSINESS_GROUP_ID => 0,
-- P_ASSIGNMENT_ACTION_ID => -1,
-- P_CALCULATION_DATE => TO_DATE
--
(P_CALCULATION_DATE
-- )
---- DATE YOU WANT TO CHECK THE NET ENTITLEMENT EX. TO_DATE('01-MAR-2009', 'DD-MON-
YYYY')
-- ,
-- P_ACCRUAL_START_DATE => NULL,
-- P_ACCRUAL_LATEST_BALANCE => NULL,
-- P_CALLING_POINT => 'FRM',
-- P_START_DATE => L_START_DATE,
-- P_END_DATE => L_END_DATE,
-- P_ACCRUAL_END_DATE => L_ACC_END_DATE,
-- P_ACCRUAL => L_VALUE,
-- P_NET_ENTITLEMENT => L_NET_VALUE
-- );
L_NET_VALUE:= pay_us_pto_accrual.get_net_accrual
(P_ASSG_ID,
P_CALCULATION_DATE ,
P_PLAN_ID,
---pva1.accrual_plan_id,
'V',---
pva1.accrual_category,
''
) ;
ELSE l_value := 0;
END IF;
-- IF l_value < 0
-- then
-- l_value := 0;
-- END IF;
RETURN l_value;
EXCEPTION
WHEN OTHERS
THEN
l_value := 0;
---p_service_period := NULL;
RETURN l_value;
END LEL_CALCULATE_LEAVE_ENCASHMENT;
/*---------------------------- Function get the assingnment dff value used in fast
formulas ----------------------------*/
FUNCTION GET_ASSG_DFF_VAL (
P_ELEMENT_ENTRY_ID IN NUMBER,
P_ASSG_ID IN NUMBER,
P_END_DATE IN DATE
)
RETURN VARCHAR
IS
L_ELEMENT_NAME Varchar(240);
L_ATTRIBUTE_VALUE Varchar(240);
BEGIN
Return L_ATTRIBUTE_VALUE;
EXCEPTION
WHEN OTHERS
THEN
RETURN 'NO';
END GET_ASSG_DFF_VAL;
EXCEPTION
WHEN OTHERS
THEN
SELECT ass_attribute1
INTO l_work_schedule
FROM per_all_assignments_f
WHERE assignment_id = p_assignment_id
AND TRUNC (LAST_DAY(p_plan_date)) BETWEEN effective_start_date
AND effective_end_date;
DBMS_OUTPUT.put_line
('NO work Schedule Assigned To Employee on given date');
END;
BEGIN
SELECT DISTINCT pci.VALUE
INTO l_day_value
FROM pay_user_column_instances_f pci, pay_user_rows_f pur
WHERE pci.user_column_id = l_work_schedule
AND pci.user_row_id = pur.user_row_id
AND pur.row_low_range_or_name = TRIM (l_day); --like l_day;
END;
SELECT a.DAY_STATUS
INTO l_aternate_day
FROM xxstage.xxlel_employees_shift_detail a,
per_all_assignments_f paaf
WHERE a.emp_id = paaf.assignment_number
AND a.pdate = p_plan_date
AND paaf.assignment_id = p_assignment_id
AND TRUNC (p_plan_date) BETWEEN paaf.effective_start_date
AND paaf.effective_end_date;
-----
IF l_aternate_day IN ('SAT','THU')
THEN
l_day_value := 'OFF';
else
l_day_value := '8';
END IF;
END IF;
RETURN l_day_value;
EXCEPTION
WHEN OTHERS
THEN
RETURN '0';
DBMS_OUTPUT.put_line ('In exception ' || l_day_value);
-- RETURN to_char(l_day_value);
END GET_DAY_STATUS ;
BEGIN
l_day_value :=
xxlam_hr_payroll_all.GET_DAY_STATUS (p_assignment_id, v_date);
DBMS_OUTPUT.put_line ('DAY VALUE ' || l_day_value);
END;
IF l_day_value = 'OFF'
THEN
l_off_day := 1;
ELSE
l_off_day := 0;
END IF;
END get_total_off_days;
BEGIN
begin
SELECT To_number(paaf.ASS_ATTRIBUTE2)
INTO l_leave_days
FROM per_all_assignments_f paaf
WHERE paaf.assignment_id = l_assignment_id
AND TRUNC (l_start_date) BETWEEN effective_start_date AND effective_end_date;
END;
l_annual_leave_days := xxlam_hr_absence_duration.get_no_of_leaves_taken_ass_id
(81,
l_assignment_id,
'Annual Leave',
l_start_date,
l_end_date);
l_auth_unpaid_leave_days :=
xxlam_hr_absence_duration.get_no_of_leaves_taken_ass_id (81,
l_assignment_id,
'Authorised Unpaid Leave',
l_start_date,
l_end_date);
l_unauth_unpaid_leave_days :=
xxlam_hr_absence_duration.get_no_of_leaves_taken_ass_id (81,
l_assignment_id,
'Unauthorised Unpaid Leave',
l_start_date,
l_end_date);
l_maternity_leave_days :=
xxlam_hr_absence_duration.get_no_of_leaves_taken_ass_id (81,
l_assignment_id,
'Maternity Leave',
l_start_date,
l_end_date);
l_annual_vacation_accrual := (l_current_sal *
(l_leave_days - l_annual_leave_days -
l_auth_unpaid_leave_days - l_unauth_unpaid_leave_days -l_maternity_leave_days )
) / 11 ;
--
-- DBMS_OUTPUT.put_line ('l_current_sal' || l_current_sal);
RETURN ROUND(NVL(l_annual_vacation_accrual,0));
EXCEPTION
WHEN OTHERS
THEN
RETURN 0;
END GET_ANNUAL_ACCURAL_AMT ;
FUNCTION get_emp_work_plan (
p_assignment_id IN NUMBER,
p_plan_date IN DATE
)
RETURN NUMBER
IS
l_month_days NUMBER := 0;
l_work_schedule VARCHAR2 (200);
l_user_table_name VARCHAR2 (200);
l_user_column_name VARCHAR2 (200);
BEGIN
BEGIN
SELECT ass_attribute1
INTO l_work_schedule
FROM per_all_assignments_f
WHERE assignment_id = p_assignment_id
AND TRUNC (p_plan_date) BETWEEN effective_start_date AND effective_end_date;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('NO work Schedule Assigned To Employee on given
date');
END;
BEGIN
SELECT user_table_name, user_column_name
INTO l_user_table_name, l_user_column_name
FROM pay_user_tables t, pay_user_columns c
WHERE t.user_table_name = 'LAM_HR_WORK_SCHEDULE'
AND c.user_table_id = t.user_table_id
AND c.user_column_id = l_work_schedule;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('NO work Schedule Assigned');
END;
ELSE
l_month_days := 0;
END IF;
RETURN l_month_days;
EXCEPTION
WHEN OTHERS
THEN
NULL;
DBMS_OUTPUT.put_line ('In exception ' || l_month_days);
RETURN l_month_days;
END get_emp_work_plan;
select DECODE(paaf.ASS_ATTRIBUTE3,
'Y','YES',
'N','NO',
paaf.ASS_ATTRIBUTE3)
INTO L_ATTRIBUTE_VALUE
from per_all_assignments_f paaf
where paaf.ASSIGNMENT_ID = P_ASSG_ID
and P_END_DATE BETWEEN paaf.EFFECTIVE_START_DATE and paaf.EFFECTIVE_END_DATE;
Return L_ATTRIBUTE_VALUE;
EXCEPTION
WHEN OTHERS
THEN
RETURN 'NO';
END ;
)
RETURN VARCHAR2
IS
BEGIN
l_ticket_req := 'N';
BEGIN
SELECT 'n' --- PAA.ATTRIBUTE10 ------ENABLE IT ONCE TO GIVE TICKET
INTO l_ticket_req
FROM per_all_assignments_f paaf
,per_absence_attendances paa
,per_absence_attendance_types paat
WHERE 1 = 1
AND paaf.person_id = paa.person_id
AND paa.ABSENCE_ATTENDANCE_TYPE_ID = paat.ABSENCE_ATTENDANCE_TYPE_ID
AND paat.NAME like 'Annual Leave'
---AND paa.attribute2 = 'Y'
AND paa.attribute3 = 'Y' --CHANGES DONE BY KHURAM ON 12-jan-14
AND PAA.ATTRIBUTE10 = 'Y' --CHANGES DONE BY KHURAM ON 12-jan-14
AND paaf.ASSIGNMENT_ID = p_assg_id
and paa.DATE_START between p_date_start and p_date_end
and p_date_end between paaf.EFFECTIVE_START_DATE and
paaf.EFFECTIVE_END_DATE ;
RETURN l_ticket_req ;
END ;
FUNCTION get_ticket_accrual_payment (
p_assignment_id NUMBER,
p_type VARCHAR2,
p_start_date DATE,
p_end_date DATE
)
RETURN NUMBER
AS
l_person_id NUMBER;
l_nod NUMBER := (p_end_date) - (p_start_date);
l_date DATE;
l_days NUMBER;
l_accrual_date DATE;
l_hire_date DATE;
l_age NUMBER;
l_person_type VARCHAR2 (30);
l_family_status VARCHAR2 (10);
l_ticket_amount NUMBER := 0;
l_ticket_sector VARCHAR2 (30);
l_dep_ticket_class VARCHAR2 (30);
l_ticket_to VARCHAR2 (30);
l_ticket_adult NUMBER := 0;
l_ticket_child NUMBER := 0;
l_ticket_spouse NUMBER := 0;
l_ticket_a_balance NUMBER := 0;
l_ticket_c_balance NUMBER := 0;
l_no_of_tickets_a NUMBER := 0;
l_no_of_tickets_c NUMBER := 0;
l_absence NUMBER := 0;
l_accrued_ticket_s NUMBER := 0;
l_start_date DATE;
l_end_date DATE;
l_curr_month_amt NUMBER := 0;
l_curr_mon_a NUMBER := 0;
l_curr_mon_c NUMBER := 0;
l_accrued_ticket_ca NUMBER := 0;
l_bg_id NUMBER;
l_ticket_a_dep_balance NUMBER := 0;
ln_payroll_id NUMBER := 0;
l_fare NUMBER := 0;
l_tax NUMBER := 0;
l_ticket_eligible VARCHAR2 (30) := 'T';
-- p_assignment_id NUMBER;
-- p_start_date DATE;
-- p_end_date DATE;
BEGIN
END IF ;
EXCEPTION
WHEN OTHERS
THEN
l_ticket_eligible := 'T';
DBMS_OUTPUT.put_line ('NO ticket Eligibility ' || l_ticket_eligible);
END;
IF l_ticket_eligible <> 'N' THEN
BEGIN
SELECT attribute1
INTO l_ticket_sector
FROM per_all_people_f
WHERE person_id = l_person_id
AND TRUNC (p_start_date) BETWEEN TRUNC (effective_start_date)
AND TRUNC (effective_end_date);
BEGIN
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('NO ticket Sector RATE' );
END;
IF l_family_status = 'F'
THEN
DBMS_OUTPUT.put_line ('family ststs' ||l_family_status );
('LAM_HR_MED_INS_INFO'
)
AND fflex.id_flex_num = pac.id_flex_num
AND ppa.analysis_criteria_id =
pac.analysis_criteria_id
AND l_date BETWEEN NVL (ppa.date_from,
TRUNC (l_date)
)
AND NVL (date_to, TRUNC (l_date))
AND ppa.person_id = l_person_id
AND segment1 = rec_rel.contact_person_id;
-- -- For Child
IF rec_rel.contact_type = 'C'
-- ----AND rec_rel.ticket_eligibility = 'Y'
THEN
---- DBMS_OUTPUT.put_line ('child person id is ' || l_person_id);
BEGIN
SELECT DISTINCT segment1
INTO l_ticket_child
FROM per_analysis_criteria pac,
fnd_id_flex_structures_vl fflex,
per_contact_relationships pcr,
per_person_analyses ppa
WHERE 1 = 1
AND ppa.person_id = pcr.contact_person_id
AND UPPER (fflex.id_flex_structure_code) IN UPPER
('LAM_HR_MED_INS_INFO'
)
AND fflex.id_flex_num = pac.id_flex_num
AND ppa.analysis_criteria_id =
pac.analysis_criteria_id
AND l_date BETWEEN NVL (ppa.date_from,
TRUNC (l_date)
)
AND NVL (date_to, TRUNC (l_date))
AND ppa.person_id = l_person_id
AND segment1 = rec_rel.contact_person_id;
IF l_age <= 2
THEN
l_ticket_amount :=
l_ticket_amount + (l_fare * 0.25)
+ l_tax; -- 25 % of the fare
ELSIF l_age > 2 AND l_age <= 18
-- AND rec_rel.ticket_eligibility = 'Y'
THEN
l_ticket_amount :=
l_ticket_amount + (l_fare * 0.75)
+ l_tax; -- 75 % of the fare
END IF;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('No medical record');
END;
--
-- DBMS_OUTPUT.put_line ('payment type is '||p_type );
----- Making Accrual or Payment
-- IF UPPER (p_type) = 'ACCRUAL'
-- THEN
-- l_ticket_amount := l_ticket_amount / 11;
--
-- END IF;
END IF;
END IF;
END IF ;
RETURN ROUND(l_ticket_amount,0);
--END;
END GET_TICKET_ACCRUAL_PAYMENT;
FUNCTION CAL_ADV_LEAVE_SALARY(
p_assignment_id IN NUMBER,
p_leave_name IN VARCHAR2,
p_start_date IN DATE,
p_end_date IN DATE,
p_leave_days OUT NUMBER
)
RETURN NUMBER
IS
----DECLARE
---p_assignment_id NUMBER :=61; --110
---p_leave_name varchar2(200);
-- p_start_date DATE := to_Date('01-jul-2013');
--- p_end_date DATE := to_Date('31-jul-2013');
p_month_value NUMBER := 0;
p_week_holi_pay NUMBER := 0;
p_month_value NUMBER := 0;
p_maternity_pay NUMBER := 0;
p_maternity_days NUMBER:= 0;
p_sick_pay NUMBER:= 0;
p_sick_ded NUMBER := 0;
p_sick_days NUMBER:= 0;
v_salary NUMBER := 0;
v_gross NUMBER := 0;
v_basic NUMBER := 0;
v_days NUMBER := (p_end_date - p_start_date);
v_date DATE;
v_mth_days NUMBER;
v_mth_value NUMBER := 0;
v_sal_per_day NUMBER := 0;
v_hrs_per_day NUMBER := 0;
v_otl_hrs NUMBER (5, 2) := 0;
v_curr_otl_hrs NUMBER (5, 2) := 0;
v_week_hrs NUMBER := 0;
v_curr_week_hrs NUMBER := 0;
v_holiday NUMBER := 0;
v_week_pay NUMBER := 0;
v_holi_pay NUMBER := 0;
v_curr_holiday NUMBER := 0;
v_curr_maternity NUMBER := 0;
v_curr_maternity_pay NUMBER := 0;
v_curr_sick NUMBER := 0;
v_curr_sick_pay NUMBER := 0;
v_curr_sick_ded NUMBER := 0;
v_total_sick_days NUMBER := 0;
v_business_group_id NUMBER := 0;
l_period_service NUMBER := 0;
v_person_type VARCHAR2 (100);
v_skip_holiday NUMBER := 0;
v_employee_number VARCHAR2 (250);
v_curr_sick_pay_p NUMBER;
v_curr_sick_ded_p NUMBER;
v_leave_salary NUMBER := 0;
t_leave_salary NUMBER := 0 ;
v_leave_days NUMBER := 0 ;
t_leave_days NUMBER := 0 ;
BEGIN
v_basic := 0;
--v_mth_days := XXLAM_HR_PAYROLL_ALL.get_month_days (p_assignment_id,
p_start_date);
v_person_type := XXLAM_HR_PAYROLL_ALL.get_person_type_ass (p_assignment_id,
p_end_date);
p_leave_days := 0;
p_week_holi_pay := 0;
---p_month_value := 0;
p_maternity_pay := 0;
p_maternity_days := 0;
p_sick_pay := 0;
p_sick_ded := 0;
p_sick_days := 0;
v_business_group_id := hr_general.get_business_group_id ();
v_business_group_id :=81;
DBMS_OUTPUT.put_line ('Business Grp id ' ||v_business_group_id);
-- || v_date
-- );
--v_business_group_id := 81;
FOR i IN 0 .. v_days
LOOP
v_date := p_start_date + i;
v_curr_otl_hrs := 0;
v_curr_week_hrs := 0;
v_curr_holiday := 0;
v_curr_maternity_pay := 0;
v_curr_sick_pay := 0;
v_curr_sick_ded := 0;
v_curr_sick_pay_p := 0;
v_curr_sick_ded_p := 0;
BEGIN
v_gross := XXLAM_HR_PAYROLL_ALL.get_gross_at (p_assignment_id, v_date);
DBMS_OUTPUT.put_line ( 'Gross Salary is ' || v_gross || '--- Days in
month is ----'|| to_char( v_days+1));
END;
begin
v_mth_days := XXLAM_HR_PAYROLL_ALL.get_month_days (p_assignment_id,
v_date);
v_leave_days :=
xxlam_hr_absence_duration.get_no_of_advance_leaves_taken
(v_business_group_id,
p_assignment_id,
p_leave_name, -- 'Annual
Leave',
v_date,
v_date
);
END LOOP;
RETURN t_leave_salary;
END CAL_ADV_LEAVE_SALARY;
/*-------------------------------------- Food
Allowance--------------------------------------------*/
FUNCTION calculate_food_allowance (
p_assignment_id IN NUMBER,
p_element_entry_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE,
p_food_all IN NUMBER
)
RETURN NUMBER
IS
v_salary NUMBER := 0;
v_gross NUMBER := 0;
v_basic NUMBER := 0;
v_days NUMBER;
v_date DATE;
v_mth_days NUMBER;
v_mth_value NUMBER := 0;
v_sal_per_day NUMBER := 0;
v_hrs_per_day NUMBER := 0;
v_otl_hrs NUMBER (5, 2) := 0;
v_curr_otl_hrs NUMBER (5, 2) := 0;
v_week_hrs NUMBER := 0;
v_curr_week_hrs NUMBER := 0;
v_holiday NUMBER := 0;
v_week_pay NUMBER := 0;
v_holi_pay NUMBER := 0;
v_curr_holiday NUMBER := 0;
v_curr_maternity NUMBER := 0;
v_curr_maternity_pay NUMBER := 0;
v_curr_sick NUMBER := 0;
v_curr_sick_pay NUMBER := 0;
v_curr_sick_ded NUMBER := 0;
v_total_sick_days NUMBER := 0;
v_business_group_id NUMBER := 0;
l_period_service NUMBER := 0;
v_person_type VARCHAR2 (100);
v_skip_holiday NUMBER := 0;
v_employee_number VARCHAR2 (250);
v_curr_sick_pay_p NUMBER;
v_curr_sick_ded_p NUMBER;
l_day_status VARCHAR2 (250);
i NUMBER := 0;
BEGIN
v_basic := 0;
v_days := p_end_date - p_start_date;
v_mth_days :=
xxlam_hr_payroll_all.get_month_days (p_assignment_id, p_start_date);
DBMS_OUTPUT.put_line ('v_mth_days:' || v_mth_days);
DBMS_OUTPUT.put_line ('v_person_type:' || v_person_type);
v_business_group_id := hr_general.get_business_group_id ();
v_business_group_id := 81;
v_mth_value := p_food_all;
FOR i IN 0 .. v_days
LOOP
v_date := p_start_date + i;
v_curr_otl_hrs := 0;
v_curr_week_hrs := 0;
v_curr_holiday := 0;
v_curr_maternity_pay := 0;
v_curr_sick_pay := 0;
v_curr_sick_ded := 0;
v_curr_sick_pay_p := 0;
v_curr_sick_ded_p := 0;
BEGIN
l_day_status :=
xxlam_hr_payroll_all.get_day_status (p_assignment_id, v_date);
END;
RETURN v_sal_per_day;
END;
/*====================== Function use to get the employee OT CAP
================================*/
FUNCTION GET_OT_CAP(
p_assignment_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE
)
RETURN NUMBER
is
l_OT_CAP NUMBER := 0 ;
l_OFF_DAYS NUMBER := 0 ;
l_TOT_WORK_DAYS NUMBER := 0 ;
l_TOT_MON_DAYS NUMBER := 0 ;
l_LEAVES NUMBER := 0 ;
l_P_OT_CAP NUMBER := 0 ;
BEGIN
BEGIN
select NVL(TO_NUMBER(ASS_ATTRIBUTE25),-1)
INTO l_OT_CAP
from per_all_assignments_f paaf
where 1=1
and paaf.ASSIGNMENT_ID = p_assignment_id
--- and paaf.EFFECTIVE_START_DATE between p_start_date and p_end_date
and p_end_date between paaf.EFFECTIVE_START_DATE and paaf.EFFECTIVE_end_DATE
;
EXCEPTION
WHEN OTHERS
THEN
l_OT_CAP := -1;
DBMS_OUTPUT.put_line
('NO OT CAP ASSIGN TO EMPLOYEE');
END;
IF l_OT_CAP = -1
THEN l_P_OT_CAP := -1;
ELSE
l_OFF_DAYS :=
XXLAM_HR_PAYROLL_ALL.get_total_off_days(p_assignment_id,p_start_date,p_end_date) ;
l_LEAVES := XXLAM_HR_ABSENCE_DURATION.get_no_of_leaves
(81,p_assignment_id,p_start_date,p_end_date);
END;
FUNCTION calculate_sra_monthly_value (
p_assignment_id IN NUMBER,
p_element_entry_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE
)
RETURN NUMBER
IS
v_days NUMBER;
v_date DATE;
v_mth_days NUMBER;
v_mth_value NUMBER := 0;
v_sal_per_day NUMBER := 0;
v_business_group_id NUMBER := 0;
l_day_status VARCHAR2 (250);
l_una_leave NUMBER := 0;
i NUMBER := 0;
BEGIN
v_days := p_end_date - p_start_date;
v_business_group_id := hr_general.get_business_group_id ();
v_business_group_id := 81;
FOR i IN 0 .. v_days
LOOP
v_date := p_start_date + i;
BEGIN
v_mth_days :=
xxlam_hr_payroll_all.get_month_days (p_assignment_id, v_date);
DBMS_OUTPUT.put_line ('v_mth_days:' || v_mth_days);
l_una_leave :=
xxlam_hr_absence_duration.get_no_of_leaves_taken_ass_id
(v_business_group_id,
p_assignment_id,
'Unauthorised Unpaid Leave',
v_date,
v_date
)
+ xxlam_hr_absence_duration.get_no_of_leaves_taken_ass_id
(v_business_group_id,
p_assignment_id,
'Authorised Unpaid Leave',
v_date,
v_date
);
DBMS_OUTPUT.put_line ('l_una_leave:' || l_una_leave);
l_day_status :=
xxlam_hr_payroll_all.get_day_status (p_assignment_id, v_date);
DBMS_OUTPUT.put_line ('l_day_status:' || l_day_status);
v_mth_value :=
xxlam_hr_payroll_all.get_screen_entry_value_at
(p_assignment_id,
p_element_entry_id,
'Monthly Value',
v_date
);
DBMS_OUTPUT.put_line ('v_mth_value:' || v_mth_value);
END;
BEGIN
IF (l_day_status <> 'OFF' AND l_una_leave <> 1)
THEN
v_sal_per_day :=
ROUND (v_sal_per_day + (v_mth_value) / v_mth_days,
3);
END IF;
EXCEPTION
WHEN OTHERS
THEN
NULL;
END;
END LOOP;
RETURN round(v_sal_per_day);
END;
)
RETURN Number
IS
l_FOOD_ALL_DAYS number;
BEGIN
RETURN l_FOOD_ALL_DAYS;
EXCEPTION
WHEN OTHERS
THEN RETURN 0;
END;
FUNCTION GET_PAYSLIP_MISC_REMARK(
p_element_type_id IN NUMBER,
p_ELEMENT_ENTRY_ID IN NUMBER,
p_assignment_action_id IN NUMBER
)
RETURN CHAR
is
l_REMARKS VARCHAR(100);
Begin
return l_REMARKS ;
EXCEPTION
WHEN OTHERS
THEN
RETURN NULL;
END;
L_ORG_PAY_ID NUMBER;
L_ORG_PAY_NAME VARCHAR2(200);
L_PERSONAL_PAY_ID NUMBER;
L_PERSONAL_PAY_CODE VARCHAR2(100);
l_VISA_CATA VARCHAR2(100);
L_PAYMENT_CODE VARCHAR2(100);
BEGIN
select
pppmf.ORG_PAYMENT_METHOD_ID,popmf.ORG_PAYMENT_METHOD_NAME,pppmf.PERSONAL_PAYMENT_ME
THOD_ID,pea.SEGMENT1
INTO L_ORG_PAY_ID,L_ORG_PAY_NAME,L_PERSONAL_PAY_ID,L_PERSONAL_PAY_CODE
from pay_personal_payment_methods_f pppmf
,pay_org_payment_methods_f popmf
,pay_external_accounts pea
,XXLEL_ALL_ASSIGNMENTS_V paaf
where 1=1
and pppmf.ORG_PAYMENT_METHOD_ID = popmf.ORG_PAYMENT_METHOD_ID
and pppmf.EXTERNAL_ACCOUNT_ID = pea.EXTERNAL_ACCOUNT_ID
and pppmf.ASSIGNMENT_ID = paaf.ASSIGNMENT_ID
and pppmf.ORG_PAYMENT_METHOD_ID = 83
and paaf.ASSIGNMENT_ID = p_assignment_id
and pppmf.PERSONAL_PAYMENT_METHOD_ID = P_PER_PAY_ID
and sysdate between pppmf.EFFECTIVE_START_DATE and pppmf.EFFECTIVE_END_DATE
and sysdate between popmf.EFFECTIVE_START_DATE and popmf.EFFECTIVE_END_DATE;
RETURN L_PAYMENT_CODE;
EXCEPTION WHEN
OTHERS then RETURN NULL;
END;
IS
L_COVERSION_RATE NUMBER := 1;
BEGIN
RETURN L_COVERSION_RATE;
EXCEPTION WHEN
OTHERS THEN RETURN 1;
END ;
FUNCTION calculate_food_allo_OM_POOL (
p_assignment_id IN NUMBER,
p_element_entry_id IN NUMBER,
p_start_date IN DATE,
p_end_date IN DATE,
p_food_all IN NUMBER
)
RETURN NUMBER
IS
v_salary NUMBER := 0;
v_gross NUMBER := 0;
v_basic NUMBER := 0;
v_days NUMBER;
v_date DATE;
v_mth_days NUMBER;
v_mth_value NUMBER := 0;
v_sal_per_day NUMBER := 0;
v_hrs_per_day NUMBER := 0;
v_otl_hrs NUMBER (5, 2) := 0;
v_curr_otl_hrs NUMBER (5, 2) := 0;
v_week_hrs NUMBER := 0;
v_curr_week_hrs NUMBER := 0;
v_holiday NUMBER := 0;
v_week_pay NUMBER := 0;
v_holi_pay NUMBER := 0;
v_curr_holiday NUMBER := 0;
v_curr_maternity NUMBER := 0;
v_curr_maternity_pay NUMBER := 0;
v_curr_sick NUMBER := 0;
v_curr_sick_pay NUMBER := 0;
v_curr_sick_ded NUMBER := 0;
v_total_sick_days NUMBER := 0;
v_business_group_id NUMBER := 0;
l_period_service NUMBER := 0;
v_person_type VARCHAR2 (100);
v_skip_holiday NUMBER := 0;
v_employee_number VARCHAR2 (250);
v_curr_sick_pay_p NUMBER;
v_curr_sick_ded_p NUMBER;
l_day_status VARCHAR2 (250);
i NUMBER := 0;
BEGIN
v_basic := 0;
v_days := p_end_date - p_start_date;
v_mth_days :=
xxlam_hr_payroll_all.get_month_days (p_assignment_id, p_start_date);
DBMS_OUTPUT.put_line ('v_mth_days:' || v_mth_days);
DBMS_OUTPUT.put_line ('v_person_type:' || v_person_type);
v_business_group_id := hr_general.get_business_group_id ();
v_business_group_id := 81;
v_mth_value := p_food_all;
FOR i IN 0 .. v_days
LOOP
v_date := p_start_date + i;
v_curr_otl_hrs := 0;
v_curr_week_hrs := 0;
v_curr_holiday := 0;
v_curr_maternity_pay := 0;
v_curr_sick_pay := 0;
v_curr_sick_ded := 0;
v_curr_sick_pay_p := 0;
v_curr_sick_ded_p := 0;
BEGIN
l_day_status :=
xxlam_hr_payroll_all.get_day_status (p_assignment_id, v_date);
END;
RETURN v_sal_per_day;
END;
END xxlam_hr_payroll_all;
/
===========================
select employee_number,full_name,
XXLAM_HR_PAYROLL_ALL.get_month_days (paaf.assignment_id, '28-FEB-2014')
"FEB-14 Working Days",
XXLAM_HR_PAYROLL_ALL.get_month_days (paaf.assignment_id, '31-MAR-2014')
"MAR-14 Working Days",
from per_all_people_f papf,
per_all_assignments_f paaf
where papf.person_id = paaf.person_id
and sysdate between papf.EFFECTIVE_START_DATE and papf.EFFECTIVE_END_DATE
and sysdate between paaf.EFFECTIVE_START_DATE and paaf.EFFECTIVE_END_DATE
order by employee_number