{jcomments off}
Introduction
In this article we would try to understand what a fast formula is. Why is it named such way. Is it about some formula ( what kind of formula) and why is it called Fast ( is it something which is being tracked against time).
The answers to all the above question is ‘I don’t Know’.
Not sure why it is called fast formula it should be rather named as ‘Custom Code on Application UI’ or may be ‘Application Custom Code’.
So basically a Fast Formula or Application Custom Code ( if you may like to call it that way) is a way which allows you to customize a delivered / seeded solution to meet specific business needs.
Types of Fast Formulas
Most of the times Fast Formulas are used for HCM related modules ( no comments on whether they can be used for other modules that would be a separate topic and would be discussed later) some of the primary ones being :
Functional Areas
-
Payroll
-
Absence Management
Technical Areas
-
Inbound Integration ( Typical Example being Custom Logic to generate Person Number )
-
Outbound Integration ( HCM Extracts)
In this article we would discuss primarily about Fast Formulas associated with Fusion Applications Absence Management.
While there are multiple types of Fast Formulas in Absence Management some of the ones we are trying to discuss here being:
-
Global Absence Accrual
-
Global Absence Accrual Matrix
-
Global Absence Entry Validation
-
Global Absence Partial Period Accrual Rate
-
Global Absence Type Duration
-
Global Absence Vesting Period
-
Participation and Rate Eligibility Formula
Global Absence Accrual Matrix
Lets start with describing what do we mean by Global Absence Accrual Matrix. Truly speaking the name could very well have been Absence Accrual Matrix. For now lets say its Global Absence Accrual Matrix and not Absence Accrual Matrix ( for reasons not known to me ).
Absence means lack of presence and Accrual means method of accumulating. So Absence Accrual becomes ‘Method of Accumulating Lack of Presence’ or in simpler words ‘Method of Accumulating Absences’.
Matrix in simpler terms means ‘Multiple Categories / Bands ’.
Hence Global Absence Accrual Matrix will stand for Method of Accumulating Absences for Multiple Combinations / Categories / Bands. So when we have different Accrual Rules for Different Bands we need to use Accrual Matrix Formula.
Each organization may have different ways of accumulating absences like:
-
Allocate All Leaves on the First Day of the Year ( Frontloaded Accruals)
-
Allocate Leaves on regular intervals, say first day of month (Incremental Accrual).
A Sample Example
In this example the customer has a requirement where-in the customer wants to have Annual Absence Accrual based on different Bands (categories). The different Accrual Bands are classified based upon the length of Service ( SYSDATE – DATE_OF_HIRE) in Years . So the First Accrual band is for 3 years of LOS (length of Service) and corresponding Accrual Value is 15. Second band is for 6 years of LOS (lengths of Service) with accrual value of 18 and lastly Band 3 for all Individuals having LOS greater than 6, the accrual value is 21.
/*******************************************************************
FORMULA NAME: XX_ANC_XX_ACCMAT_Annual
FORMULA TYPE: Global Absence Accrual Matrix
DESCRIPTION: This sample formula will find the weighted average of the Accrual value based on the number of the days the employee was eligible in a particular band. For example, I an employee has changed from Band 1 to Band 2 on 03-Mar-2014 and accrual value for Band 1 and Band 2 is 100 and 200 respectively. The formula will return:
accrual =
(100*(number of days employee in Band1) + 200*(number of days Employee in Band 2))/365
Change History:
Name Date Comments
--------------------------------------------------------------------------------------------------------------------
Ashish Harbhajanka 12-May-2015 Initial Version
--------------------------------------------------------------------------------------------------------------------
***********************************************************************/
/*=========== DATABASE ITEM DEFAULTS BEGIN =====================*/
DEFAULT for PER_ASG_REL_ORIGINAL_DATE_OF_HIRE is '4712/12/31 00:00:00' (date)
Default for IV_BAND_CHG_DT1 is '1951/01/01 00:00' (date)
Default for IV_BAND_CHG_DT2 is '1951/01/01 00:00' (date)
DEFAULT for IV_ACCRUALPERIODSTARTDATE is '4712/12/31 00:00:00' (date)
DEFAULT for IV_ACCRUALPERIODENDDATE is '4712/12/31 00:00:00' (date)
Default for IV_BAND_CHG_BEFVAL1 is 15
Default for IV_BAND_CHG_AFTVAL1 is 18
Default for IV_BAND_CHG_AFTVAL2 is 21
DEFAULT FOR PER_ASG_PERSON_NUMBER IS 'X'
Default for IV_CEILING is 0
Default for IV_CARRYOVER is 0
Inputs are IV_ACCRUAL,IV_BAND_CHG_DT1,IV_BAND_CHG_DT2,IV_BAND_CHG_BEFVAL1,IV_BAND_CHG_AFTVAL1,IV_BAND_CHG_BEFVAL2,IV_BAND_CHG_AFTVAL2,IV_CARRYOVER,IV_CEILING,IV_ACCRUALPERIODSTARTDATE,IV_ACCRUALPERIODENDDATE
/*=========== DATABASE ITEM DEFAULTS ENDS======================*/
/*================ FORMULA SECTION BEGIN =======================*/
ld_effective_date = GET_CONTEXT(EFFECTIVE_DATE,'4712/12/31 00:00:00' (date))
ld_term_start_date = TO_DATE('01-01-'||TO_CHAR(ld_effective_date, 'rrrr'),'dd-mm-rrrr')
ld_term_end_date = TO_DATE('31-12-'||TO_CHAR(ld_effective_date, 'rrrr'),'dd-mm-rrrr')
ld_band1_end_date = ADD_YEARS(PER_ASG_REL_ORIGINAL_DATE_OF_HIRE,3)
ld_band2_end_date = ADD_YEARS(PER_ASG_REL_ORIGINAL_DATE_OF_HIRE,6)
accrual = IV_ACCRUAL
l_log = ess_log_write('***********************START********************************')
l_log = ess_log_write('PERSON_NUMBER : '|| PER_ASG_PERSON_NUMBER)
l_log = ess_log_write('ld_effective_date : '|| TO_CHAR(ld_effective_date,'DD-MM-YYYY'))
l_log = ess_log_write('ld_band1_end_date : '|| TO_CHAR(ld_band1_end_date,'DD-MM-YYYY'))
l_log = ess_log_write('ld_band2_end_date : '|| TO_CHAR(ld_band2_end_date,'DD-MM-YYYY'))
l_log = ess_log_write('IV_BAND_CHG_BEFVAL1 : '|| TO_CHAR(IV_BAND_CHG_BEFVAL1))
l_log = ess_log_write('IV_BAND_CHG_AFTVAL1 : '|| TO_CHAR(IV_BAND_CHG_AFTVAL1))
l_log = ess_log_write('IV_BAND_CHG_AFTVAL2 : '|| TO_CHAR(IV_BAND_CHG_AFTVAL2))
l_log = ess_log_write('Initial Accrual : '|| TO_CHAR(IV_ACCRUAL))
l_log = ess_log_write('Accrual Period Start Date : '|| TO_CHAR(IV_ACCRUALPERIODSTARTDATE,'DD-MON-RRRR'))
l_log = ess_log_write('Accrual Period End Date : '|| TO_CHAR(IV_ACCRUALPERIODENDDATE,'DD-MON-RRRR'))
l_log = ess_log_write('***********************END********************************')
IF (TO_CHAR(ld_effective_date,'YYYY') = TO_CHAR(ld_band1_end_date,'YYYY')) /* (TO_CHAR(ld_effective_date,'YYYY') = TO_CHAR(IV_BAND_CHG_DT1,'YYYY')) */
THEN
(
l_log = ess_log_write('Within Band 1')
l_no_of_ds1 = DAYS_BETWEEN(ld_band1_end_date,ld_term_start_date) + 1
l_log = ess_log_write('l_no_of_ds1 : '|| TO_CHAR(l_no_of_ds1))
l_no_of_ds2 = DAYS_BETWEEN(ld_term_end_date,ld_band1_end_date) + 1
l_log = ess_log_write('l_no_of_ds2 : '|| TO_CHAR(l_no_of_ds2))
l_no_of_ds3 = 0
l_log = ess_log_write('IV_BAND_CHG_BEFVAL1 : '|| TO_CHAR(IV_BAND_CHG_BEFVAL1))
l_log = ess_log_write('IV_BAND_CHG_AFTVAL1 : '|| TO_CHAR(IV_BAND_CHG_AFTVAL1))
l_log = ess_log_write('IV_BAND_CHG_AFTVAL2 : '|| TO_CHAR(IV_BAND_CHG_AFTVAL2))
accrual=(l_no_of_ds1*IV_BAND_CHG_BEFVAL1 + l_no_of_ds2 * IV_BAND_CHG_AFTVAL1 + l_no_of_ds3*IV_BAND_CHG_AFTVAL2)/ 365
l_log = ess_log_write('Accrual : '|| TO_CHAR(accrual))
)
IF (TO_CHAR(ld_effective_date,'YYYY') = TO_CHAR(ld_band2_end_date,'YYYY')) /*(TO_CHAR(ld_effective_date,'YYYY') = TO_CHAR(IV_BAND_CHG_DT2,'YYYY'))*/
THEN
(
l_log = ess_log_write('Within Band 2')
l_no_of_ds1 = 0
l_no_of_ds2 = DAYS_BETWEEN(ld_band2_end_date,ld_term_start_date) + 1
l_log = ess_log_write('l_no_of_ds2 : '|| TO_CHAR(l_no_of_ds2))
l_no_of_ds3 = DAYS_BETWEEN(ld_term_end_date,ld_band2_end_date) + 1
l_log = ess_log_write('l_no_of_ds3 : '|| TO_CHAR(l_no_of_ds3))
l_log = ess_log_write('IV_BAND_CHG_BEFVAL1 : '|| TO_CHAR(IV_BAND_CHG_BEFVAL1))
l_log = ess_log_write('IV_BAND_CHG_AFTVAL1 : '|| TO_CHAR(IV_BAND_CHG_AFTVAL1))
l_log = ess_log_write('IV_BAND_CHG_AFTVAL2 : '|| TO_CHAR(IV_BAND_CHG_AFTVAL2))
accrual=(l_no_of_ds1*IV_BAND_CHG_BEFVAL1 + l_no_of_ds2 * IV_BAND_CHG_AFTVAL1 + l_no_of_ds3*IV_BAND_CHG_AFTVAL2)/ 365
l_log = ess_log_write('Accrual : '|| TO_CHAR(accrual))
)
l_log = ess_log_write(' Prorated Accrual considered : '|| TO_CHAR(accrual))
floored_accrual = FLOOR(accrual)
decimal_accrual = accrual - floored_accrual
IF (decimal_accrual < 0.5 )
THEN
accrual = floored_accrual
IF (decimal_accrual >= 0.5)
THEN
accrual = floored_accrual + 1
l_log = ess_log_write(' Final Accrual considered : '|| TO_CHAR(accrual))
carryover = IV_CARRYOVER
ceiling = IV_CEILING
l_log = ess_log_write(' Carryover : '|| TO_CHAR(IV_CARRYOVER))
l_log = ess_log_write(' Ceiling : '|| TO_CHAR(IV_CEILING))
return accrual,ceiling,carryover
We would discuss more in details about the other Absence Fast Formula in other article.
Till then bye, do try this out.