Sample Formula for Cycle to Work
Here's a sample formula that you can use to configure Cycle to Work.
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's created by Oracle Fusion Compensation. This formula is created by Global Earnings template.
Formula Name: XX_CYCLE_TO_WORK_EARN
Formula Type: Payroll
Formula results:
| Value | Description |
|---|---|
| l_value | Direct Result for Earnings Pay Value. |
| l_reduce | Direct Result for Earnings Reduce Regular Earnings. |
| mesg | Warning message will be issued for this assignment. |
/* Database Item Defaults */
DEFAULT FOR mesg is ' '
DEFAULT FOR ENTRY_LEVEL IS 'AP'
DEFAULT FOR PAYROLL_PERIOD_TYPE IS ' '
DEFAULT FOR PAY_EARN_PERIOD_START is '0001/01/01 00:00:00' (date)
DEFAULT FOR PAY_EARN_PERIOD_END is '4712/12/31 00:00:00' (date)
DEFAULT FOR REDUCE_REGULAR_EARNINGS_ASG_RUN is 0
DEFAULT FOR REDUCE_REGULAR_EARNINGS_TRM_RUN IS 0
DEFAULT FOR IE_REDUCE_REGULAR_ABSENCE_EARNINGS_ASG_RUN is 0
DEFAULT FOR IE_REDUCE_REGULAR_ABSENCE_HOURS_ASG_RUN is 0
DEFAULT FOR XX_CYCLE_TO_WORK_SECONDARY_CLASSIFICATION IS ' '
DEFAULT FOR ASG_HR_ASG_ID is 0
DEFAULT FOR TERM_HR_TERM_ID is 0
DEFAULT FOR pay_value is 0
DEFAULT FOR ENTRY_CREATOR_TYPE IS ' '
DEFAULT FOR NET is 0
DEFAULT FOR PRORATION_METHOD IS 'X'
DEFAULT FOR PRORATION_CONVERSION_RULE IS 'X'
DEFAULT FOR PRORATE_START is '0001/01/01 00:00:00' (date)
DEFAULT FOR PRORATE_END is '0001/01/01 00:00:00' (date)
DEFAULT FOR reporting_unit IS 'X'
DEFAULT FOR WORK_UNITS_CONVERSION_RULE IS 'ANNUALIZED RATE CONVERSION'
DEFAULT FOR PERIODICITY_CONVERSION_RULE IS 'ANNUALIZED RATE CONVERSION'
DEFAULT FOR purchase_cost is 0
DEFAULT FOR Number_of_Recovery_Periods is 1
DEFAULT FOR Unique_Reference is '0'
DEFAULT FOR XX_CYCLE_TO_WORK_OPENING_BALANCE_ASG_RC_ITD is 0
DEFAULT FOR XX_CYCLE_TO_WORK_ASG_ITD is 0
DEFAULT FOR GROSS_PAY_REL_TU_RUN is 0
DEFAULT FOR XX_CYCLE_TO_WORK_SALARY_SACRIFICE_REL_TU_RUN is 0
DEFAULT FOR GET_PLED_LSED is '4712/12/31 00:00:00' (date)
/* Inputs */
INPUTS ARE purchase_cost (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
, Unique_Reference(text)
, Number_of_Recovery_Periods
l_opening_bal = 0
l_repaid = 0
l_initial_debt = 0
l_stop = 'N'
l_cb_id = GET_CONTEXT(CALC_BREAKDOWN_ID, 1)
l_gross_pay = 0
l_salsac = 0
l_log = PAY_INTERNAL_LOG_WRITE('XX Cycle to Work Entering...')
if (net = 0 and net was defaulted) THEN (
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN)Initializing the Flat Amount Earnings Formula')
l_log = PAY_INTERNAL_LOG_WRITE(' Inputs:')
l_log = PAY_INTERNAL_LOG_WRITE(' Purchase Cost: '||to_char(purchase_cost))
l_log = PAY_INTERNAL_LOG_WRITE(' Number of Periods: '||to_char(Number_of_Recovery_Periods))
l_log = PAY_INTERNAL_LOG_WRITE(' Unique Ref: '||Unique_Reference)
l_log = PAY_INTERNAL_LOG_WRITE(' Calc Breakdown ID: '||to_char(l_cb_id))
l_log = PAY_INTERNAL_LOG_WRITE(' GET_PLED_LSED: '||to_char(GET_PLED_LSED))
l_amount = purchase_cost
CHANGE_CONTEXTS (REFERENCE_CODE = Unique_Reference)
(
l_opening_bal = XX_CYCLE_TO_WORK_OPENING_BALANCE_ASG_RC_ITD
l_repaid_bal = XX_CYCLE_TO_WORK_ASG_ITD * -1
)
CHANGE_CONTEXTS (CALC_BREAKDOWN_ID = l_cb_id)
(
l_gross_pay = GROSS_PAY_REL_TU_RUN
l_salsac = XX_CYCLE_TO_WORK_SALARY_SACRIFICE_REL_TU_RUN
)
if l_opening_bal = 0 THEN
l_initial_debt = l_amount
else
l_amount = l_opening_bal
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
/* Assigning the Values to the local variables*/
l_actual_start_date = PAY_EARN_PERIOD_START
l_actual_end_date = PAY_EARN_PERIOD_END
l_secondary_classification = XX_CYCLE_TO_WORK_SECONDARY_CLASSIFICATION
l_source_periodicity = periodicity
l_payroll_rel_action_id = 0
l_report_unit= reporting_unit
l_target_periodicity=PAYROLL_PERIOD_TYPE
/* Key Variable values retrival*/
l_element_entry_id = GET_CONTEXT(ELEMENT_ENTRY_ID, 0)
l_payroll_rel_action_id = GET_CONTEXT(PAYROLL_REL_ACTION_ID, 0)
l_date_earned = GET_CONTEXT(DATE_EARNED, PAY_EARN_PERIOD_END)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) l_date_earned = '|| to_char(l_date_earned))
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 */
)
/* avoid unnecessary conversion to Workhour Workday*/
IF ( l_source_periodicity = 'ORA_WORKHOUR') THEN
(
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) set source periodicity Workhour')
l_source_periodicity = 'Workhour'
)
ELSE IF ( l_source_periodicity = 'ORA_WEEKDAY') THEN (
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) set source periodicity Workday')
l_source_periodicity = 'Workday'
)
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) )
/* for ADD REPORT WORK UNIT CHECK BEFORE REDUCE REGULAR */
GLB_REPORT_UNIT_KEY = 'REPORT_UNIT_'||ENTRY_LEVEL||'-'||TO_CHAR(l_element_entry_id)||'-'|| TO_CHAR(l_payroll_rel_action_id)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) GLB_REPORT_UNIT_KEY ' ||GLB_REPORT_UNIT_KEY)
if( was_payroll_rel_action_id <> l_payroll_rel_action_id )THEN
(
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Payroll Rel Action ID in WAS : '||TO_CHAR(was_payroll_rel_action_id))
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Payroll Rel Action ID in Current run : '||TO_CHAR(l_payroll_rel_action_id))
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 (proration_method was not defaulted) THEN (
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 (PRORATION_CONVERSION_RULE ='X') THEN (
PRORATION_CONVERSION_RULE=WORK_UNITS_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)
/* Element Template will convert hourly/daily into workhour/workday*/
if (l_source_periodicity='Hourly') THEN (
l_source_periodicity='WORKHOUR'
)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) ENTRY LEVEL IS ' ||ENTRY_LEVEL)
IF ( ENTRY_LEVEL = 'AP') THEN
(
l_term_assignment_id = TERM_HR_TERM_ID
SET_INPUT('HR_ASSIGN_ID',l_term_assignment_id)
)
ELSE IF ( ENTRY_LEVEL = 'PA') THEN (
l_term_assignment_id = ASG_HR_ASG_ID
SET_INPUT('HR_ASSIGN_ID',l_term_assignment_id)
)
/** if it is 1$ per Unit, THEN how many $$ for Pay Period.. The $$ amount is the number of Units Worked **/
if (l_report_unit = 'ORA_WORKDAYS') THEN (
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) rate conversion formula is :'||WORK_UNITS_CONVERSION_RULE)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) target periodicity is :'||l_target_periodicity)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) reporting unit :'||l_report_unit)
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
)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) reporting unit is days :'||TO_CHAR(l_days))
)
else if (l_report_unit='ORA_HOURSWORK') THEN (
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) rate conversion formula is :'||WORK_UNITS_CONVERSION_RULE)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) target periodicity is :'||l_target_periodicity)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) reporting unit :'||l_report_unit)
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
)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) reporting unit is hours :'||TO_CHAR(l_hours))
)
IF (l_source_periodicity = 'PRD') THEN
(
l_value = l_amount
)
else
(
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Amount : '||TO_CHAR(l_amount))
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN)Source Periodicity : '||l_source_periodicity)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN)Target periodicity : '||l_target_periodicity)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Parameter Initialization for Rate Converter Call')
/*CALL_FORMULA('RATE_CONVERTER',
l_amount > 'SOURCE_AMOUNT',
PERIODICITY_CONVERSION_RULE> 'method',
l_source_periodicity > 'SOURCE_PERIODICITY',
l_target_periodicity > 'TARGET_PERIODICITY',
l_date_earned > 'effdate',
l_actual_start_date > 'start_date',
l_actual_end_date > 'end_date',
l_convert_amount < 'TARGET_AMOUNT' DEFAULT 0
)*/
l_convert_amount = (l_opening_bal + l_initial_debt) / Number_of_Recovery_Periods
l_value=l_convert_amount
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Convert amount :'||TO_CHAR(l_convert_amount))
)
) /* 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))
/* Reduce Regular earnings due to Absence payments - Processing begins */
IF (ENTRY_CREATOR_TYPE = 'SP') THEN
(
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) IE_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 = IE_REDUCE_REGULAR_ABSENCE_DAYS_ASG_RUN
l_reduce_abs_hours = IE_REDUCE_REGULAR_ABSENCE_HOURS_ASG_RUN
l_reduce_abs = IE_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)
/* Setting Payvalue and hours in WSA*/
WSA_SET(GLB_ABS_EARN_REDUCE_EARNING_KEY,l_reduce_abs)
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.
****************************************************************************/
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) REDUCE_REGULAR_EARNINGS_ASG_RUN before: ')
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Secondary classification = ' || l_secondary_classification )
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) creator_type = ' || ENTRY_CREATOR_TYPE )
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Reduce Regular Calculation Begins')
IF (l_secondary_classification <> 'Standard Earnings Regular Not Worked' AND ENTRY_CREATOR_TYPE = 'SP') THEN
(
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) REDUCE_REGULAR_EARNINGS_ASG_RUN entered: ')
/* Use the appropriate balance based on the employment level for the given element.*/
IF ( ENTRY_LEVEL = 'PA') THEN
(
l_reduce_days = REDUCE_REGULAR_DAYS_ASG_RUN
l_reduce_hours = REDUCE_REGULAR_HOURS_ASG_RUN
l_reduce = REDUCE_REGULAR_EARNINGS_ASG_RUN
)
ELSE IF ( ENTRY_LEVEL = 'AP') THEN
(
l_reduce_days = REDUCE_REGULAR_DAYS_TRM_RUN
l_reduce_hours = REDUCE_REGULAR_HOURS_TRM_RUN
l_reduce = REDUCE_REGULAR_EARNINGS_TRM_RUN
)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Reduce ='||to_char(l_reduce))
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Reduce hours='||to_char(l_reduce_hours))
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Reduce days='||to_char(l_reduce_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 Reduce Earnings and Hours */
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)
GLB_EARN_REDUCE_HOURS_KEY = 'HOUR_'|| GLB_EARN_REDUCE_KEY
l_log =PAY_INTERNAL_LOG_WRITE('(GLBEARN) GLB_EARN_REDUCE_HOURS_KEY ' ||GLB_EARN_REDUCE_HOURS_KEY)
GLB_EARN_REDUCE_DAYS_KEY = 'DAY_'|| GLB_EARN_REDUCE_KEY
l_log =PAY_INTERNAL_LOG_WRITE('(GLBEARN) GLB_EARN_REDUCE_DAYS_KEY ' ||GLB_EARN_REDUCE_DAYS_KEY)
/* Setting Payvalue and hours in WSA*/
WSA_SET(GLB_EARN_REDUCE_EARNING_KEY,l_reduce)
WSA_SET(GLB_EARN_REDUCE_HOURS_KEY,l_reduce_hours)
WSA_SET(GLB_EARN_REDUCE_DAYS_KEY,l_reduce_days)
)
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)
l_log = PAY_INTERNAL_LOG_WRITE('(GLBEARN) Derived value : '||TO_CHAR(l_value))
if GET_PLED_LSED <= PAY_EARN_PERIOD_END THEN
l_value = l_opening_bal + l_initial_debt - l_repaid_bal
if l_value > l_gross_pay + l_salsac THEN
(
l_value = l_gross_pay + l_salsac
mesg = 'Not enough earnings, so Cycle to Work (Ref: '||Unique_Reference||') deducted partially'
)
l_log = PAY_INTERNAL_LOG_WRITE('l_value v1: '||TO_CHAR(l_value))
if l_value + l_repaid_bal > l_opening_bal + l_initial_debt THEN
(
l_value = l_opening_bal + l_initial_debt - l_repaid_bal
)
if l_value + l_repaid_bal = l_opening_bal + l_initial_debt THEN
(
l_stop = 'Y'
mesg = 'Cycle to Work (Ref: '||Unique_Reference||') has been fully repaid'
)
else if GET_PLED_LSED <= PAY_EARN_PERIOD_END and l_value + l_repaid_bal < l_opening_bal + l_initial_debt THEN
(
mesg = 'Employee terminated, please process outstanding Cycle to Work (Ref: '||Unique_Reference||') amount offline'
)
l_log = PAY_INTERNAL_LOG_WRITE('l_value v2: '||TO_CHAR(l_value))
l_value = l_value * -1
l_log = PAY_INTERNAL_LOG_WRITE('l_value v3: '||TO_CHAR(l_value))
l_log = PAY_INTERNAL_LOG_WRITE('XX Cycle to Work Leaving...')
if l_stop = 'Y' and l_initial_debt <> 0 THEN
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, l_stop, l_initial_debt
if l_stop = 'Y' THEN
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, l_stop
if l_initial_debt <> 0 THEN
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, l_initial_debt
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
)
ELSE /* Grossup Processing Begin */
(
l_log = PAY_INTERNAL_LOG_WRITE('(GLBGRUP) Entering GrossupMode ')
l_value = 0
if (first_run = 1) THEN
( result2 = new_guess )
else
(result2 = guess + additional_amount )
guess = result2
l_value = result2
L_LOG = PAY_INTERNAL_LOG_WRITE('(GLBGRUP) EXITING FLAT AMOUNT FORMULA ')
return l_value
)
/* End Formula Text */