Professional Documents
Culture Documents
DESCRIPTION:
This is the formula for processing a flat amount earning element. The formula
assumes that the amounts and periodicity are available in element entries.
For a Salary element, the Salary and Periodicity are available in element entry,
that is created by Oracle Fusion Compensation.
This formula is created by Global Earnings template.
Formula Results :
*******************************************************************************/
/* Evosys Customization */
DEFAULT FOR ACP_TERMINATION_DATE is'4712/12/31 00:00:00' (date)
DEFAULT FOR ACP_HIRE_DATE IS '0001/01/01 00:00:00' (date)
DEFAULT FOR mesg3 is ' '
DEFAULT FOR mesg4 is ' '
Default for PER_ASG_REL_ATTRIBUTE_NUMBER1 is 0
Default for PER_ASG_REL_ATTRIBUTE1 is 'XX'
Default for ANNUAL_LEAVE_ENTITLEMENT_DAYS_ASG_MTD is 0
Default for Total_working_days_in_a_Month is 0
/* Evosys Customization */
/* Inputs */
INPUTS ARE amount (number),
periodicity (text),
reduce_regular (text),
pay_value(number),
new_guess(number),
additional_amount(number),
guess(number),
first_run(number),
net(number),
proration_method(text),
WORK_UNITS_CONVERSION_RULE(text),
PRORATION_CONVERSION_RULE(text),
PERIODICITY_CONVERSION_RULE(text),
reporting_unit(text),
prorate_start,
prorate_end
l_amount = amount
l_value = 0
l_reduce = 0
l_reduce_hours = 0
l_reduce_abs = 0
l_reduce_hours_abs = 0
l_reduce_abs_hours = 0
l_hours = 0
l_days =0
l_actual_amount = 0
l_actual_start_date = '0001/01/01 00:00:00' (Date)
l_actual_end_date = '0001/01/01 00:00:00' (Date)
l_fte=1
l_prorate_start = prorate_start
l_prorate_end = prorate_end
l_payroll_rel_action_id = 0
l_report_unit= reporting_unit
l_target_periodicity=PAYROLL_PERIOD_TYPE
l_payroll_rel_action_id = GET_CONTEXT(PAYROLL_REL_ACTION_ID, 0)
IF l_payroll_rel_action_id = 0 THEN
(
l_msg =
GET_MESG('HRX','HRX_USETE_CONTEXT_NOT_SET','CONTEXT','PAYROLL_REL_ACTION_ID')
l_log = PAY_LOG_ERROR(l_msg)
/* dummy = 1 */
/* Formula must error out at this point */
)
IF l_element_entry_id = 0 THEN
(
l_msg =
GET_MESG('HRX','HRX_USETE_CONTEXT_NOT_SET','CONTEXT','ELEMENT_ENTRY_ID')
l_log = PAY_LOG_ERROR( l_msg)
/* dummy = 1 */
/* Formula must error out at this point */
)
was_payroll_rel_action_id=0
If wsa_exists('WAS_REL_ACTION_ID','NUMBER' ) then
( was_payroll_rel_action_id = WSA_GET('WAS_REL_ACTION_ID',0) )
WSA_DELETE('proration_method')
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Clear proration_method in WSA')
/* for ADD REPORT WORK UNIT CHECK BEFORE REDUCE REGULAR */
WSA_DELETE(GLB_REPORT_UNIT_KEY)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Clear l_report_unit in WSA')
WSA_DELETE('WORK_UNITS_CONVERSION_RULE')
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Clear WORK_UNITS_CONVERSION_RULE in
WSA')
WSA_DELETE('PERIODICITY_CONVERSION_RULE')
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Clear PERIODICITY_CONVERSION_RULE in
WSA')
WSA_DELETE('PRORATION_CONVERSION_RULE')
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Clear PRORATION_CONVERSION_RULE in
WSA')
WSA_DELETE('source_periodicity')
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Clear source_periodicity in WSA')
WSA_DELETE('target_periodicity')
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Clear target_periodicity in WSA')
wsa_set('WAS_REL_ACTION_ID' ,GET_CONTEXT(PAYROLL_REL_ACTION_ID, 0))
)
IF (WSA_EXISTS('proration_method','TEXT_NUMBER')) THEN
(
log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) - Array found for proration_method')
wsa_proration_method = WSA_GET('proration_method', EMPTY_TEXT_NUMBER)
)
wsa_proration_method[l_element_entry_id] = proration_method
WSA_SET('proration_method',wsa_proration_method)
)
/* for ADD REPORT WORK UNIT CHECK BEFORE REDUCE REGULAR */
WSA_SET(GLB_REPORT_UNIT_KEY, l_report_unit)
IF (WSA_EXISTS('WORK_UNITS_CONVERSION_RULE','TEXT_NUMBER')) THEN
(
log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) - Array found for
WORK_UNITS_CONVERSION_RULE')
was_WORK_UNITS_CONVERSION_RULE = WSA_GET('WORK_UNITS_CONVERSION_RULE',
EMPTY_TEXT_NUMBER)
)
was_WORK_UNITS_CONVERSION_RULE[l_element_entry_id] = WORK_UNITS_CONVERSION_RULE
WSA_SET('WORK_UNITS_CONVERSION_RULE',was_WORK_UNITS_CONVERSION_RULE)
IF (WSA_EXISTS('PERIODICITY_CONVERSION_RULE','TEXT_NUMBER')) THEN
(
log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) - Array found for
PERIODICITY_CONVERSION_RULE')
was_PERIODICITY_CONVERSION_RULE = WSA_GET('PERIODICITY_CONVERSION_RULE',
EMPTY_TEXT_NUMBER)
)
was_PERIODICITY_CONVERSION_RULE[l_element_entry_id] = PERIODICITY_CONVERSION_RULE
WSA_SET('PERIODICITY_CONVERSION_RULE',was_PERIODICITY_CONVERSION_RULE)
IF (WSA_EXISTS('PRORATION_CONVERSION_RULE','TEXT_NUMBER')) THEN
(
log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) - Array found for
PRORATION_CONVERSION_RULE')
was_proration_rate_formula = WSA_GET('PRORATION_CONVERSION_RULE',
EMPTY_TEXT_NUMBER)
)
was_proration_rate_formula[l_element_entry_id] = PRORATION_CONVERSION_RULE
WSA_SET('PRORATION_CONVERSION_RULE',was_proration_rate_formula)
/* If pay value is already set, no further processing required for pay value */
IF (pay_value = 0 and pay_value was defaulted ) THEN
(
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) l_source_periodicity :'||
l_source_periodicity)
/** if it is 1$ per Unit, then how many $$ for Pay Period.. The $$ amount is the
number of Units Worked **/
CALL_FORMULA('RATE_CONVERTER',
1 > 'SOURCE_AMOUNT',
WORK_UNITS_CONVERSION_RULE> 'method',
'WORKDAY' > 'SOURCE_PERIODICITY',
l_target_periodicity > 'TARGET_PERIODICITY',
l_date_earned > 'effdate',
l_actual_start_date > 'start_date',
l_actual_end_date > 'end_date',
l_days < 'TARGET_AMOUNT' DEFAULT 0
)
CALL_FORMULA('RATE_CONVERTER',
1 > 'SOURCE_AMOUNT',
WORK_UNITS_CONVERSION_RULE> 'method',
'WORKHOUR' > 'SOURCE_PERIODICITY',
l_target_periodicity > 'TARGET_PERIODICITY',
l_date_earned > 'effdate',
l_actual_start_date > 'start_date',
l_actual_end_date > 'end_date',
l_hours < 'TARGET_AMOUNT' DEFAULT 0
)
) /* for IF of pay_value = 0 */
else
(
l_value = pay_value
)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Value : '||TO_CHAR(l_value))
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) l_hours : '||TO_CHAR(l_hours))
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) l_days : '||TO_CHAR(l_days))
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN)
KW_REDUCE_REGULAR_ABSENCE_EARNINGS_ASG_RUN entered: ')
/* Use the appropriate balance based on the employment level for the given
element.*/
IF ( ENTRY_LEVEL = 'PA') THEN
(
l_reduce_abs_days = KW_REDUCE_REGULAR_ABSENCE_DAYS_ASG_RUN
l_reduce_abs_hours = KW_REDUCE_REGULAR_ABSENCE_HOURS_ASG_RUN
l_reduce_abs = KW_REDUCE_REGULAR_ABSENCE_EARNINGS_ASG_RUN
)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Reduce_abs ='||
to_char(l_reduce_abs))
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Reduce abs hours='||
to_char(l_reduce_abs_hours))
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Reduce abs days='||
to_char(l_reduce_abs_days))
/* Check prorate start date and prorate end date to decide if there is a proration
event. If there is a event, Reduce regular will be processed in the proration
formula and will be skipped in base formula */
IF ((prorate_start was not defaulted or prorate_end was not defaulted) and
(prorate_start<>PAY_EARN_PERIOD_START or prorate_end <>PAY_EARN_PERIOD_END)) then
(
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) This Element have proration,
Reduce Regular moved to Proration Formula')
/* Preparing Key for Absence Reduce Earnings and Absence Reduce Hours */
GLB_ABS_EARN_REDUCE_KEY = ENTRY_LEVEL||'-'||TO_CHAR(l_element_entry_id)||'-'||
TO_CHAR(l_payroll_rel_action_id)||'_ABSENCE'
l_log =PAY_INTERNAL_LOG_WRITE('(GLBEARN) GLB_ABS_EARN_REDUCE_KEY '||
GLB_ABS_EARN_REDUCE_KEY)
GLB_ABS_EARN_REDUCE_EARNING_KEY = 'EARNING_'||GLB_ABS_EARN_REDUCE_KEY
l_log =PAY_INTERNAL_LOG_WRITE('(GLBEARN) GLB_ABS_EARN_REDUCE_EARNING_KEY ' ||
GLB_ABS_EARN_REDUCE_EARNING_KEY)
GLB_ABS_EARN_REDUCE_EARNING_DAYS_KEY = 'DAY_'||GLB_ABS_EARN_REDUCE_KEY
l_log =PAY_INTERNAL_LOG_WRITE('(GLBEARN) GLB_ABS_EARN_REDUCE_EARNING_DAYS_KEY '
||GLB_ABS_EARN_REDUCE_EARNING_DAYS_KEY)
GLB_ABS_EARN_REDUCE_EARNING_HOURS_KEY = 'HOUR_'||GLB_ABS_EARN_REDUCE_KEY
l_log =PAY_INTERNAL_LOG_WRITE('(GLBEARN) GLB_ABS_EARN_REDUCE_EARNING_HOURS_KEY
' ||GLB_ABS_EARN_REDUCE_EARNING_HOURS_KEY)
WSA_SET(GLB_ABS_EARN_REDUCE_EARNING_HOURS_KEY,l_reduce_abs_hours)
WSA_SET(GLB_ABS_EARN_REDUCE_EARNING_DAYS_KEY,l_reduce_abs_days)
)
else
(
if (l_report_unit='ORA_HOURSWORK') then
(
If l_reduce_abs_hours <= l_hours Then
(
l_hours = l_hours - l_reduce_abs_hours
)
Else
(
l_reduce_abs_hours = l_hours
l_hours = 0
/* mesg = 'Insufficient hours to reduce for Absence hours' */
mesg = GET_MESG('PAY','PAY_RED_REG_LIMIT')
l_log = PAY_LOG_WARNING('PAY:PAY_RED_REG_LIMIT')
)
)
if (l_report_unit = 'ORA_WORKDAYS') then
(
If l_reduce_abs_days <= l_days Then
(
l_days = l_days - l_reduce_abs_days
)
Else
(
l_reduce_abs_days = l_days
l_days = 0
/* mesg = 'Insufficient days to reduce for Absence days' */
mesg = GET_MESG('PAY','PAY_RED_REG_LIMIT')
l_log = PAY_LOG_WARNING('PAY:PAY_RED_REG_LIMIT')
)
)
If l_reduce_abs <= l_value then
(
l_value = l_value - l_reduce_abs
)
Else
(
l_reduce_abs = l_value
l_value = 0
/* mesg = 'Insufficient earnings to reduce for Absence Payment' */
mesg = GET_MESG('PAY','PAY_RED_REG_LIMIT')
l_log = PAY_LOG_WARNING('PAY:PAY_RED_REG_LIMIT')
)
)
)
/* Reduce Regular Absences processing ends */
/* Reduce Regular earnings by Vacation element (created using a earning
classfication) */
/****************************************************************************
This logic will be executed when the employee's regular salary needs
to be reduced. For example, this may happen when employee might have taken
Vacation Pay or Sick Pay and it reduces the regular salary.
The regular salary element being reduced, is created via Compensation and in
addition
it's secondary classification cannot be REGULAR_NOT_WORKED, for
the formula to pick up for reducing it. The vacation element(reducing element) is
typically
Units X Rate earning element. Reducing due to Absences element is covered below
this section.
****************************************************************************/
GLB_EARN_REDUCE_KEY = ENTRY_LEVEL||'-'||TO_CHAR(l_element_entry_id)||'-'||
TO_CHAR(l_payroll_rel_action_id)
l_log =PAY_INTERNAL_LOG_WRITE('(GLBEARN) GLB_EARN_REDUCE_KEY '||
GLB_EARN_REDUCE_KEY)
GLB_EARN_REDUCE_EARNING_KEY = 'EARNING_'||GLB_EARN_REDUCE_KEY
l_log =PAY_INTERNAL_LOG_WRITE('(GLBEARN) GLB_EARN_REDUCE_EARNING_KEY ' ||
GLB_EARN_REDUCE_EARNING_KEY)
)
else
(
if (l_report_unit='ORA_HOURSWORK') then
(
If l_reduce_hours <= l_hours Then
(
l_hours = l_hours - l_reduce_hours
)
Else
(
l_reduce_hours = l_hours
l_hours = 0
/* mesg = 'Insufficient hours to reduce' */
mesg = GET_MESG('PAY','PAY_RED_REG_LIMIT')
l_log = PAY_LOG_WARNING('PAY:PAY_RED_REG_LIMIT')
)
)
if (l_report_unit = 'ORA_WORKDAYS') then
(
If l_reduce_days <= l_days Then
(
l_days = l_days - l_reduce_days
)
Else
(
l_reduce_days = l_days
l_days = 0
/* mesg = 'Insufficient days to reduce ' */
mesg = GET_MESG('PAY','PAY_RED_REG_LIMIT')
l_log = PAY_LOG_WARNING('PAY:PAY_RED_REG_LIMIT')
)
)
If l_reduce <= l_value then
(
l_value = l_value - l_reduce
)
Else
(
l_reduce = l_value
l_value = 0
/* mesg = 'Insufficient earnings to reduce' */
mesg = GET_MESG('PAY','PAY_RED_REG_LIMIT')
l_log = PAY_LOG_WARNING('PAY:PAY_RED_REG_LIMIT')
)
)
)
/*
** Before setting each array in the Working Storage Area
** We need to first check if each one already exists, and if so, retrieve it to
add the new values.
*/
IF (WSA_EXISTS('source_periodicity','TEXT_NUMBER')) THEN
(
log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) - Array found for
source_periodicity')
wsa_source_periodicity = WSA_GET('source_periodicity', EMPTY_TEXT_NUMBER)
)
wsa_source_periodicity[l_element_entry_id] = l_source_periodicity
WSA_SET('source_periodicity',wsa_source_periodicity)
IF (WSA_EXISTS('target_periodicity','TEXT_NUMBER')) THEN
(
log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) - Array found for
target_periodicity')
wsa_target_periodicity = WSA_GET('target_periodicity', EMPTY_TEXT_NUMBER)
)
wsa_target_periodicity[l_element_entry_id] = l_target_periodicity
WSA_SET('target_periodicity',wsa_target_periodicity)
/*IF (prorate_start was not defaulted or prorate_end was not defaulted) then
(*/
l_hr_term_id = ASG_HR_ASG_ID
SET_INPUT ('hr_id', l_hr_term_id)
SET_INPUT ('eff_date',PAY_EARN_PERIOD_END)
SET_INPUT ('mode','PER_ASG_PEOPLE_GROUP_SEGMENT11')
EXECUTE('XX_GET_HR_DATA')
weekly_off = GET_OUTPUT('X_OUTPUT_TEXT', l_text)
weekly_off = UPPER(substr(weekly_off, 0, 3))
pro_days = days_between(prorate_end,prorate_start)
w_count = 0
start_date = PAY_EARN_PERIOD_START
p_diff = days_between(prorate_end,start_date) + 1
p1 = (l_value/26) * p_days1
l_log6726= ess_log_write('p1 1st half --> '+to_Char(p1))
p_days_old = p_days1
l_hr_term_id = ASG_HR_ASG_ID
SET_INPUT ('hr_id', l_hr_term_id)
SET_INPUT ('eff_date',l_start_date)
SET_INPUT ('mode','GET_PAY_AVAILABILITY_ANNUAL')
EXECUTE('XX_GET_HR_DATA')
l_day_duration = GET_OUTPUT('X_OUTPUT_NUMBER', -2)
l_log111356 = ess_log_write('l_day_duration ----> ' +
to_char(l_day_duration))
L_P_DATE = To_char(l_start_date,'YYYY/MM/DD')
L_flag = GET_VALUE_SET('XXDH_PUBLIC_HOLIDAY_VS','|=P_DATE='''||
L_P_DATE||'''')
l_log1113576 = ess_log_write('PUBLIC HOLIDAY L_flag ----> ' + L_flag)
*/
l_Month_End = PAY_EARN_PERIOD_END
log353=ess_log_write('l_Month_End -----> ' + to_Char(l_Month_End))
pay_days = 0
p_reference = prorate_end
log676921=Ess_log_write(' p_reference CASE2 --> ' +
to_char(p_reference))
pro2_days = days_between(p_reference,prorate_start) + 1
log67692=Ess_log_write(' pro2_days CASE2 --> ' + to_char(pro2_days))
pro_start = prorate_start
log67639=Ess_log_write(' pro_start CASE2 --> ' + to_char(pro_start))
w_count = 0
Total_working_days_in_a_Month = 0
p1 = (l_value/26) * pay_days
log67629=Ess_log_write(' p1 CASE2 --> ' + to_char(p1))
mesg4 = mesg4 + 'p1--' + to_char(ROUND(p1,2))
L_value = p1
mesg4 = mesg4 + 'L_value--' + to_char(ROUND(L_value,2))
mesg4 = mesg4 + '_l_value_' || to_char(p1)||'days2'||to_char(pay_days) +
'weekly_off' + weekly_off
mesg4 = mesg4 + 'p_ref--' +to_char(p_reference) + 'pro2_days--' +
to_char(pro2_days) + 'w_count--' + to_char(w_count)
)
mesg4 = mesg4 + 'main if'
/*)*/
l_hr_term_id = ASG_HR_ASG_ID
/* this IF condition checks for PRORATIOIN CASE 1 and CASE 2 for WEEK OFF COUNT Ans
Annual */
if(prorate_start was not defaulted OR prorate_end was not defaulted) then
(
l_start_date = prorate_start
l_end_date = prorate_end
l_hr_term_id = ASG_HR_ASG_ID
SET_INPUT ('hr_id', l_hr_term_id)
SET_INPUT ('eff_date',l_pay_start_date)
SET_INPUT ('mode','GET_PAY_AVAILABILITY_ANNUAL')
EXECUTE('XX_GET_HR_DATA')
l_day_duration = GET_OUTPUT('X_OUTPUT_NUMBER', -2)
l_log11135 = ess_log_write('l_day_duration ----> ' +
to_char(l_day_duration))
L_P_DATE = To_char(l_pay_start_date,'YYYY/MM/DD')
L_flag = GET_VALUE_SET('XXDH_PUBLIC_HOLIDAY_VS','|=P_DATE='''||
L_P_DATE||'''')
l_log111357 = ess_log_write('PUBLIC HOLIDAY L_flag ----> ' + L_flag)
l_hr_term_id = ASG_HR_ASG_ID
SET_INPUT ('hr_id', l_hr_term_id)
SET_INPUT ('eff_date',l_start_date)
SET_INPUT ('mode','GET_PAY_AVAILABILITY_ANNUAL')
EXECUTE('XX_GET_HR_DATA')
l_day_duration = GET_OUTPUT('X_OUTPUT_NUMBER', -2)
l_log11135 = ess_log_write('l_day_duration ----> ' +
to_char(l_day_duration))
L_P_DATE = To_char(l_start_date,'YYYY/MM/DD')
L_flag = GET_VALUE_SET('XXDH_PUBLIC_HOLIDAY_VS','|=P_DATE='''||
L_P_DATE||'''')
l_log111357 = ess_log_write('PUBLIC HOLIDAY L_flag ----> ' + L_flag)
l_annual_days = l_abs_count
l_log1113577897 = ess_log_write('l_annual_days after the while loop ----> ' +
to_char(l_annual_days))
)
ELSE /* this ELSE condition checks for NO PRORATIOIN ANNUAL DAYS IN MONTH COUNT
*/
(
l_annual_days = ANNUAL_LEAVE_ENTITLEMENT_DAYS_ASG_MTD
work_days = 26
dow = ' '
l_date_start_index = PAY_EARN_PERIOD_START
/* this IF condition checks for HIRE DATE DURING CURRENT PAY PERIOD */
If (ACP_HIRE_DATE >= PAY_EARN_PERIOD_START AND ACP_HIRE_DATE <=
PAY_EARN_PERIOD_END) then
(
/* this IF condition checks for PRORATION AND DEDUCT ANNUAL LEAVES PAY */
)
)
Else /* this ELSE condition checks for NO PRORATION ANNUAL LEAVE DEDUCTION
*/
(
log5654 = ess_log_write (' Entered the last ELSEs ELSE NORMAL CASE ')
l_value = ((amount)/12/26) /*daily rate for 26 days*/
L_log179812 = ess_log_write ('L_value NO PORRATION l_value =
((amount)/12/26) DAILY RATE --> ' +to_Char(L_value))
full_month_amount = (l_value * 26)
l_value = full_month_amount
L_log17129876 = ess_log_write ('L_value NO PORRATION l_value
full_month_amount --> ' +to_Char(l_value))
working_days = 26 - l_annual_days
)
l_annual_leave_days_paid = l_annual_days
RETURN l_value ,
l_hours ,
l_days ,
l_reduce ,
l_reduce_hours ,
l_reduce_days ,
l_reduce_abs ,
l_reduce_abs_hours ,
l_reduce_abs_days ,
mesg ,
full_month_amount ,
l_annual_leave_days_paid,
mesg3,
working_days,
mesg4,
Final_Full_Month
)