Thursday 13 October 2016

Oracle Payroll Fast Formula Type Wise Information

Type: Oracle Payroll

/**********  IFL_ADJUSTED_GROSS_REMUNERATION    ************/


INPUTS ARE UNADJUSTED_NEGOTIATED_GROSS_REMUNERATION

LV_ADJUSTED_GROSS_REM = 0

LV_ADJUSTED_GROSS_REM = UNADJUSTED_NEGOTIATED_GROSS_REMUNERATION

RETURN  LV_ADJUSTED_GROSS_REM

-------------------------------------------------------
/***********************  ANNUAL TAXABLE INCOM AND LIABILITY ***********************/
/************************ IFL_ANNUAL_TAX_INCOM_LIABILITY ******************/

ALIAS  BASIC_SALARY_PAY_VALUE_ASG_FYTD AS BASIC_SAL_FYTD
ALIAS  DIRECTOR_BASIC_REMUNERATION_PAY_VALUE_ASG_FYTD AS DIRECTOR_BASIC_FYTD
ALIAS  ASG_SALARY AS CURR_SALARY
ALIAS  TAX_ON_COMPANY_PROVIDED_VEHICLE_VALUE_INCLUDED_IN_TAXABLE_INCOME_ASG_PTD AS VEHICLE_COST_PTD
ALIAS  ZAKAT_ZAKAT_ASG_FYTD AS ZAKAT_AMOUNT_FYTD
ALIAS  WELFARE_ALLOWANCE_PAY_VALUE_ASG_PTD AS WELFARE_ALL_PTD
ALIAS  ASG_EMPLOYMENT_CATEGORY_CODE AS EMP_CATEGORY
ALIAS ASG_SALARY_BASIS_NAME as SAL_BASIS

DEFAULT FOR EMP_CATEGORY IS 'IFL'
DEFAULT FOR BASIC_SAL_FYTD IS 0
DEFAULT FOR ZAKAT_AMOUNT_FYTD IS 0
DEFAULT FOR CURR_SALARY IS 0
DEFAULT FOR PAY_EARNED_END_DATE IS '0001/01/01 00:00:00'(DATE)
DEFAULT FOR PAY_PROC_PERIOD_END_DATE IS '0001/01/01 00:00:00'(DATE)
DEFAULT FOR WELFARE_ALL_PTD IS 0
DEFAULT FOR SAL_BASIS IS 'IFL'
DEFAULT FOR DIRECTOR_BASIC_FYTD IS 0
LV_TOTAL_BASIC_SAL = 0

IF    SAL_BASIS like '%Director%'  then 
      LV_TOTAL_BASIC_SAL = DIRECTOR_BASIC_FYTD
else       LV_TOTAL_BASIC_SAL = BASIC_SAL_FYTD

LV_TOTAL_ZAKAT  = ZAKAT_AMOUNT_FYTD
LV_CURRENT_PERIOD = PAY_PROC_PERIOD_END_DATE
LV_FIN_END_DATE =  '0001/01/01 00:00:00' (DATE)
LV_FIN_END_DATE = IFL_GET_FISCAL_YEAR_END(PAY_PROC_PERIOD_END_DATE)
LV_REM_MONTH =0
LV_REM_MONTH = MONTHS_BETWEEN(LV_FIN_END_DATE,PAY_PROC_PERIOD_END_DATE)
LV_CURR_BASIC_SAL = 0

IF  'PTC' = EMP_CATEGORY  THEN
LV_CURR_BASIC_SAL = (CURR_SALARY-WELFARE_ALL_PTD)*100/110
ELSE  LV_CURR_BASIC_SAL = CURR_SALARY*100/110
LV_TOTAL_ANNUAL_TAXABLE_BASIC_SAL=0
LV_TOTAL_ANNUAL_TAXABLE_BASIC_SAL = LV_TOTAL_BASIC_SAL+(LV_CURR_BASIC_SAL*LV_REM_MONTH)
LV_TOTAL_INCOM = 0
LV_TOTAL_INCOM = LV_TOTAL_ANNUAL_TAXABLE_BASIC_SAL+VEHICLE_COST_PTD-LV_TOTAL_ZAKAT
LV_ANNUAL_TAXABLE_INCOM = 0
LV_ANNUAL_TAXABLE_INCOM = LV_TOTAL_INCOM
LV_ANNUAL_TAX_AMOUNT = 0

IF   LV_ANNUAL_TAXABLE_INCOM<=7000000  THEN
LV_ANNUAL_TAX_AMOUNT = IFL_GET_CAL_TAX_AMT(LV_ANNUAL_TAXABLE_INCOM)
ELSE   LV_ANNUAL_TAX_AMOUNT =  ((LV_ANNUAL_TAXABLE_INCOM-7000000)*30*0.01)+1422000

RETURN LV_ANNUAL_TAX_AMOUNT,LV_ANNUAL_TAXABLE_INCOM
-------------------------------------------------------------------------------------------------------------------------
Type: Payroll Run Proration

/**********   Element Name  Negotiated Gross Salary      ********************/
/**********   Fast Formula Name  IFL_ADJUSTED_NEGOTIATED_GROSS_SALARY_PRORATION        ********************/ 

/* ------------------------------------------------------------------------   
    This formula calculates the start and end dates proration
    This formula calculates the dates between adjusted salary and unadjusted salary.    
   ---------------------------------------------------------------------*/

ALIAS  ASG_STATUS AS ASG_STAT

INPUTS ARE PRORATE_START(DATE),
PRORATE_END(DATE),
UNADJUSTED_NEGOTIATED_GROSS_SALARY

DEFAULT FOR PAY_PROC_PERIOD_START_DATE IS '01-JAN-0001' (DATE)
DEFAULT FOR PAY_PROC_PERIOD_END_DATE IS '31-JAN-4712'(DATE)
DEFAULT FOR EMP_TERM_DATE IS '31-DEC-4712' (DATE)
DEFAULT FOR UNADJUSTED_NEGOTIATED_GROSS_SALARY IS 0
DEFAULT FOR ASG_STAT IS 'ABC'


TERMINATION_DATE = EMP_TERM_DATE
L_PERIOD_START(DATE) = PAY_PROC_PERIOD_START_DATE
L_PERIOD_END(DATE) = PAY_PROC_PERIOD_END_DATE
L_TOTAL_DAYS = DAYS_BETWEEN(L_PERIOD_END,L_PERIOD_START)+1
L_WORKED_DAYS =0

LV_ASG_STATUS = ASG_STAT
LV_SUSPENDING_DAYS = 0

LV_SUSPENDING_DAYS = IFL_EMP_SUSPENDING_FF(PRORATE_START,PRORATE_END)

/*IF ( TERMINATION_DATE < L_PERIOD_END AND TERMINATION_DATE > L_PERIOD_START ) THEN
L_WORKED_DAYS = DAYS_BETWEEN(TERMINATION_DATE,L_PERIOD_START) +1

ELSE */

L_WORKED_DAYS = DAYS_BETWEEN(PRORATE_END,PRORATE_START) +1


IF    LV_ASG_STATUS = 'Suspend Assignment'   THEN 
      ADJUSTED_NEGOTIATED_GROSS_SALARY   = (UNADJUSTED_NEGOTIATED_GROSS_SALARY/L_TOTAL_DAYS) * L_WORKED_DAYS - ((UNADJUSTED_NEGOTIATED_GROSS_SALARY/(L_TOTAL_DAYS*2))*LV_SUSPENDING_DAYS)
ELSE   
     ADJUSTED_NEGOTIATED_GROSS_SALARY = (UNADJUSTED_NEGOTIATED_GROSS_SALARY/L_TOTAL_DAYS) * L_WORKED_DAYS

if  ADJUSTED_NEGOTIATED_GROSS_SALARY =0 then 
    ADJUSTED_NEGOTIATED_GROSS_SALARY =UNADJUSTED_NEGOTIATED_GROSS_SALARY

START_DATE = PRORATE_START

END_DATE = PRORATE_END

RETURN ADJUSTED_NEGOTIATED_GROSS_SALARY, START_DATE , END_DATE

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

Type: Accrual

/* ------------------------------------------------------------------------
    NAME : PTO_HD_ANNIVERSARY_BALANCE
    This formula calculates the start and end dates for a simple multiplier.
    This formula calculates the dates between which an assignment is to accrue.
   ---------------------------------------------------------------------*/

DEFAULT FOR ACP_INELIGIBILITY_PERIOD_TYPE IS 'CM'
DEFAULT FOR ACP_INELIGIBILITY_PERIOD_LENGTH IS 0
DEFAULT FOR ACP_CONTINUOUS_SERVICE_DATE IS '4712/12/31 00:00:00' (date)
DEFAULT FOR ACP_ENROLLMENT_END_DATE IS '4712/12/31 00:00:00' (date)
DEFAULT FOR ACP_TERMINATION_DATE IS '4712/12/31 00:00:00' (date)
DEFAULT FOR ACP_ENROLLMENT_START_DATE IS '4712/12/31 00:00:00' (date)
DEFAULT FOR ACP_SERVICE_START_DATE IS '4712/12/31 00:00:00' (date)

default for Accrual_Start_Date is '4712/12/31 00:00:00' (date)
default for Accrual_Latest_Balance is 0

INPUTS ARE
Calculation_Date (date),
Accrual_Start_Date (date),
Accrual_Latest_Balance

E = SET_NUMBER('CEILING', 14)
E = SET_NUMBER('ACCRUAL_RATE',0)

Accruing_Frequency = 'D'   /* Month */
Accruing_Multiplier = 1

E = SET_TEXT('ACCRUING_FREQUENCY', Accruing_Frequency)
E = SET_NUMBER('ACCRUING_MULTIPLIER', Accruing_Multiplier)

Hire_Date_Anniversary = add_months(ACP_SERVICE_START_DATE,
                                  trunc(months_between(Calculation_Date,
                                                       ACP_SERVICE_START_DATE) / 12) * 12)

LV_NO_MONTH   = trunc(months_between(Calculation_Date,
                                                       ACP_SERVICE_START_DATE) / 12)*12

IF Accrual_Start_Date < Hire_Date_Anniversary THEN
(
  Accrual_Start_Date = Hire_Date_Anniversary
)

E = SET_DATE('HIRE_DATE_ANNIVERSARY', Hire_Date_Anniversary)

E = GET_PERIOD_DATES_HD(Hire_Date_Anniversary,
                     Accruing_Frequency,
                     Hire_Date_Anniversary,
                     Accruing_Multiplier)

First_Period_SD = get_date('PERIOD_START_DATE')
First_Period_ED = get_date('PERIOD_END_DATE')

/* ------------------------------------------------------------------------
   Set the Calculation_Date to the Termination Date if not null
-------------------------------------------------------------------------- */

IF NOT (ACP_TERMINATION_DATE WAS DEFAULTED) OR
    NOT (ACP_ENROLLMENT_END_DATE WAS DEFAULTED) THEN
(
  Early_End_Date = least(ACP_TERMINATION_DATE, ACP_ENROLLMENT_END_DATE)

  IF (Early_End_Date < First_Period_ED) THEN
  (
    Total_Accrued_PTO = 0
    E = PUT_MESSAGE('HR_52794_PTO_FML_ASG_TER')
   )

  IF (Early_End_Date < Calculation_Date) THEN
  (
    Calculation_Date = Early_End_Date
  )
)

/* ------------------------------------------------------------------------
   Get the last whole period prior to the Calculation Date and ensure that it is within the
   Year (if the Calculation Date is the End of a Period then use that period)
   ------------------------------------------------------------------------ */

E = GET_PERIOD_DATES_HD(Calculation_Date,
                     Accruing_Frequency,
                     Hire_Date_Anniversary,
                     Accruing_Multiplier)

Calculation_Period_SD  = get_date('PERIOD_START_DATE')
Calculation_Period_ED = get_date('PERIOD_END_DATE')

IF (Calculation_Date <> Calculation_Period_ED) THEN
    (
     E = GET_PERIOD_DATES(ADD_DAYS(Calculation_Period_SD,-1),
                                                Accruing_Frequency,
                                                Hire_Date_Anniversary,
                                                Accruing_Multiplier)

    Calculation_Period_SD  = get_date('PERIOD_START_DATE')
    Calculation_Period_ED = get_date('PERIOD_END_DATE')
   )

If (Calculation_Period_ED < First_Period_ED) THEN
   (
    Total_Accrued_PTO = 0
    E = PUT_MESSAGE('HR_52795_PTO_FML_CALC_DATE')
    )

/* ------------------------------------------------------------------------
   Set the Continuous Service Global Variable, whilst also
   ensuring that the continuous service date is before the Calculation Period
  ------------------------------------------------------------------------ */

IF (ACP_CONTINUOUS_SERVICE_DATE WAS DEFAULTED) THEN
    (
    E = set_date('SERVICE_START_DATE', ACP_SERVICE_START_DATE)
    )
ELSE IF(ACP_CONTINUOUS_SERVICE_DATE > Calculation_Period_SD) THEN
   (
    Total_Accrued_PTO = 0
    E = PUT_MESSAGE('HR_52796_PTO_FML_CSD')
    E = set_date('SERVICE_START_DATE', ACP_CONTINUOUS_SERVICE_DATE)
   )
ELSE
  (
    E = set_date('SERVICE_START_DATE', ACP_CONTINUOUS_SERVICE_DATE)
  )

/*
E = set_date('SERVICE_START_DATE', ACP_SERVICE_START_DATE)
*/
Service_Start_Date = get_date('SERVICE_START_DATE')

First_Eligible_To_Accrue_Date  = Service_Start_Date


/*------------------------------------------------------------------------
   Determine the date on which accrued PTo may first be registered, i.e the date on which the
   Ineligibility Period expires
   ------------------------------------------------------------------------ */

Accrual_Ineligibility_Expired_Date = First_Eligible_To_Accrue_Date

IF (ACP_INELIGIBILITY_PERIOD_LENGTH > 0) THEN
   (
   IF ACP_INELIGIBILITY_PERIOD_TYPE = 'BM' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH*2)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'F' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_days(Service_Start_Date,
                                                    ACP_INELIGIBILITY_PERIOD_LENGTH*14)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'CM' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'LM' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_days(Service_Start_Date,
                                                    ACP_INELIGIBILITY_PERIOD_LENGTH*28)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'Q' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH*3)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'SM' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH/2)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'SY' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH*6)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'W' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_days(Service_Start_Date,
                                                    ACP_INELIGIBILITY_PERIOD_LENGTH*7)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'Y' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH*12)
      )

   IF Accrual_Ineligibility_Expired_Date > First_Eligible_To_Accrue_Date
   AND Calculation_Date < Accrual_Ineligibility_Expired_Date THEN
      (
      First_Eligible_To_Accrue_Date = Accrual_Ineligibility_Expired_Date
      )
   )

/* ------------------------------------------------------------------------
   Get the first full period following the First_Eligible_To_Accrue_Date
   (if it falls on the beginning of the period then use that period)
------------------------------------------------------------------------- */

Latest_Balance = 0

IF (not Accrual_Start_Date was defaulted) AND
   ((Calculation_Date < Accrual_Ineligibility_Expired_Date) OR
    (Accrual_Start_Date > Accrual_Ineligibility_Expired_Date)) THEN
(
  Adjusted_Start_Date = Get_Start_Date(Accrual_Start_Date,
                                       Hire_Date_Anniversary)

  Adjusted_Start_Date = Get_Start_Date(Accrual_Start_Date,
                                       Hire_Date_Anniversary)

  /* Check whether RESET_PTO_ACCRUAL action parameter is defined */
  /* If yes, then we need to calculate from the beginning         */

  Reset_Accruals = Reset_PTO_Accruals()

  IF ((Adjusted_Start_Date < Accrual_Start_Date) OR
      (Reset_Accruals = 'TRUE'))  THEN

  (
    Process_Full_Term = 'Y'
  )
  ELSE
  (
    Process_Full_Term = 'N'
  )
)
ELSE
(
  Process_Full_Term = 'Y'
)

IF (Process_Full_Term = 'N') AND
   (Accrual_Start_Date >= First_Eligible_To_Accrue_Date) THEN
(

  E = GET_PERIOD_DATES_HD(Adjusted_Start_Date,
                       Accruing_Frequency,
                       Hire_Date_Anniversary,
                       Accruing_Multiplier)

  First_Eligible_To_Accrue_Period_SD = get_date('PERIOD_START_DATE')
  First_Eligible_To_Accrue_Period_ED = get_date('PERIOD_END_DATE')

  Latest_Balance = Accrual_Latest_Balance
  Effective_Start_Date = Accrual_Start_Date

)
ELSE IF First_Eligible_To_Accrue_Date > Hire_Date_Anniversary THEN
(
  IF (not Accrual_Start_Date was defaulted) THEN
  (
    Latest_Balance = Accrual_Latest_Balance
  )
  ELSE
  (
    Latest_Balance = 0
  )

  E = GET_PERIOD_DATES_HD(First_Eligible_To_Accrue_Date,
                       Accruing_Frequency,
                       Hire_Date_Anniversary,
                       Accruing_Multiplier)

  First_Eligible_To_Accrue_Period_SD  = get_date('PERIOD_START_DATE')
  First_Eligible_To_Accrue_Period_ED  = get_date('PERIOD_END_DATE')

  IF First_Eligible_To_Accrue_Date <> First_Eligible_To_Accrue_Period_SD THEN
      (
       E = GET_PERIOD_DATES(add_days(First_Eligible_To_Accrue_Period_ED,1),
                                                  Accruing_Frequency,
                                                  Hire_Date_Anniversary,
                                                  Accruing_Multiplier)

       First_Eligible_To_Accrue_Period_SD  = get_date('PERIOD_START_DATE')
       First_Eligible_To_Accrue_Period_ED  = get_date('PERIOD_END_DATE')
       )

  IF (First_Eligible_To_Accrue_Period_SD > Calculation_Period_ED) THEN
     (
       Total_Accrued_PTO = 0
       E = PUT_MESSAGE('HR_52793_PTO_FML_ASG_INELIG')
    )

  Effective_Start_Date = First_Eligible_To_Accrue_Date

)
ELSE
(
  IF (not Accrual_Start_Date was defaulted) THEN
  (
    Latest_Balance = Accrual_Latest_Balance
  )
  ELSE
  (
    Latest_Balance = 0
  )

  First_Eligible_To_Accrue_Period_SD  = First_Period_SD
  First_Eligible_To_Accrue_Period_ED  = First_Period_ED

  Effective_Start_Date = Hire_Date_Anniversary
)
/* ------------------------------------------------------------------------
   Determine the date on which PTO actually starts accruing based on Hire Date,
   Service Start Date and plan Enrollment Start Date.
   If this date is after the 1st period and the fisrt eligible date then
   establish the first full period after this date (if the Actual Start
   Date falls on the beginning of a period then use this period)
 ------------------------------------------------------------------------ */

Actual_Accrual_Start_Date = greatest(Service_Start_Date,
                                     ACP_ENROLLMENT_START_DATE,
                                     First_Period_SD)

/* -------------------------------------------------------------------------
       Determine the actual start of the accrual calculation
-------------------------------------------------------------------------*/
IF (Actual_Accrual_Start_Date > First_Period_SD AND
     Actual_Accrual_Start_Date > First_Eligible_To_Accrue_Period_SD) THEN
    (
     E = GET_PERIOD_DATES_HD(Actual_Accrual_Start_Date,
                          Accruing_Frequency,
                          Hire_Date_Anniversary,
                          Accruing_Multiplier)

     Accrual_Start_Period_SD = get_date('PERIOD_START_DATE')
     Accrual_Start_Period_ED = get_date('PERIOD_END_DATE')

     IF Actual_Accrual_Start_Date > Accrual_Start_Period_SD THEN
         (
          E = GET_PERIOD_DATES_HD(add_days(Accrual_Start_Period_ED,1),
                               Accruing_Frequency,
                               Hire_Date_Anniversary,
                               Accruing_Multiplier)

          Accrual_Start_Period_SD = get_date('PERIOD_START_DATE')
          Accrual_Start_Period_ED = get_date('PERIOD_END_DATE')
         )

/* -----------------------------------------------------------------
        If the Actual Acrual Period is after the Calculation Period then end the processing.
----------------------------------------------------------------- */
        IF (Accrual_Start_Period_SD > Calculation_Period_ED) THEN
            (
            Total_Accrued_PTO = 0
            E = PUT_MESSAGE('HR_52797_PTO_FML_ACT_ACCRUAL')
            )
     )

ELSE IF (First_Eligible_To_Accrue_Period_SD > First_Period_SD) THEN
     (
      Accrual_Start_Period_SD = First_Eligible_To_Accrue_Period_SD
      Accrual_Start_Period_ED = First_Eligible_To_Accrue_Period_ED
     )
ELSE
    (
      Accrual_Start_Period_SD = First_Period_SD
      Accrual_Start_Period_ED = First_Period_ED
    )

 /* -------------------------------------------------------------------
       Now set up the information that will be used in when looping through the periods
--------------------------------------------------------------------- */

IF Calculation_Period_ED >= Accrual_Start_Period_ED THEN
(
  E = set_date('PERIOD_SD',Accrual_Start_Period_SD)
  E = set_date('PERIOD_ED',Accrual_Start_Period_ED)
  E = set_date('LAST_PERIOD_SD',Calculation_Period_SD)
  E = set_date('LAST_PERIOD_ED',Calculation_Period_ED)

  IF (Process_Full_Term = 'N') THEN
  (
    E = set_number('TOTAL_ACCRUED_PTO', Latest_Balance)
  )
  ELSE
  (
    E = set_number('TOTAL_ACCRUED_PTO', 0)
  )

  E = LOOP_CONTROL('PTO_HD_ANNIVERSARY_PERIOD_ACCRUAL')

  Total_Accrued_PTO = get_number('TOTAL_ACCRUED_PTO') - Latest_Balance

)
ELSE
(
  Total_Accrued_PTO = 0
)


IF Accrual_Start_Period_SD <= Calculation_Period_SD THEN
(
  Accrual_end_date = Calculation_Period_ED
)

IF Process_Full_Term = 'Y' AND
   Effective_Start_Date > Actual_Accrual_Start_Date THEN
(
  Effective_Start_Date = Actual_Accrual_Start_Date
)

Effective_End_Date = Calculation_Date

IF Effective_Start_Date >= Effective_End_Date THEN
(
  Effective_Start_Date = Effective_End_Date
)

IF  LV_NO_MONTH >=12  THEN 
    Total_Accrued_PTO=Total_Accrued_PTO+14

RETURN Total_Accrued_PTO, Effective_start_date, Effective_end_date, Accrual_end_date
---------------------------------------------------------------------------------------------------------------------

/* ------------------------------------------------------------------------
    NAME : PTO_HD_ANNIVERSARY_BALANCE
    This formula calculates the start and end dates for a simple multipliers.
    This formula calculates the dates between which an assignment is to accrue.
   ---------------------------------------------------------------------*/

DEFAULT FOR ACP_INELIGIBILITY_PERIOD_TYPE IS 'CM'
DEFAULT FOR ACP_INELIGIBILITY_PERIOD_LENGTH IS 0
DEFAULT FOR ACP_CONTINUOUS_SERVICE_DATE IS '4712/12/31 00:00:00' (date)
DEFAULT FOR ACP_ENROLLMENT_END_DATE IS '4712/12/31 00:00:00' (date)
DEFAULT FOR ACP_TERMINATION_DATE IS '4712/12/31 00:00:00' (date)
DEFAULT FOR ACP_ENROLLMENT_START_DATE IS '4712/12/31 00:00:00' (date)
DEFAULT FOR ACP_SERVICE_START_DATE IS '4712/12/31 00:00:00' (date)

default for Accrual_Start_Date is '4712/12/31 00:00:00' (date)
default for Accrual_Latest_Balance is 0

INPUTS ARE
Calculation_Date (date),
Accrual_Start_Date (date),
Accrual_Latest_Balance

E = SET_NUMBER('CEILING', 10)
E = SET_NUMBER('ACCRUAL_RATE', 1/35)

/*0.0285714285714286*/

Accruing_Frequency = 'D'   /* Day */
Accruing_Multiplier = 1

E = SET_TEXT('ACCRUING_FREQUENCY', Accruing_Frequency)
E = SET_NUMBER('ACCRUING_MULTIPLIER', Accruing_Multiplier)

Hire_Date_Anniversary = add_months(ACP_SERVICE_START_DATE,
                                  trunc(months_between(Calculation_Date,
                                                       ACP_SERVICE_START_DATE) / 12) * 12)

IF Accrual_Start_Date < Hire_Date_Anniversary THEN
(
  Accrual_Start_Date = Hire_Date_Anniversary
)

E = SET_DATE('HIRE_DATE_ANNIVERSARY', Hire_Date_Anniversary)

E = GET_PERIOD_DATES_HD(Hire_Date_Anniversary,
                     Accruing_Frequency,
                     Hire_Date_Anniversary,
                     Accruing_Multiplier)

First_Period_SD = get_date('PERIOD_START_DATE')
First_Period_ED = get_date('PERIOD_END_DATE')

/* ------------------------------------------------------------------------
   Set the Calculation_Date to the Termination Date if not null
-------------------------------------------------------------------------- */

IF NOT (ACP_TERMINATION_DATE WAS DEFAULTED) OR
    NOT (ACP_ENROLLMENT_END_DATE WAS DEFAULTED) THEN
(
  Early_End_Date = least(ACP_TERMINATION_DATE, ACP_ENROLLMENT_END_DATE)

  IF (Early_End_Date < First_Period_ED) THEN
  (
    Total_Accrued_PTO = 0
    E = PUT_MESSAGE('HR_52794_PTO_FML_ASG_TER')
   )

  IF (Early_End_Date < Calculation_Date) THEN
  (
    Calculation_Date = Early_End_Date
  )
)

/* ------------------------------------------------------------------------
   Get the last whole period prior to the Calculation Date and ensure that it is within the
   Year (if the Calculation Date is the End of a Period then use that period)
   ------------------------------------------------------------------------ */

E = GET_PERIOD_DATES_HD(Calculation_Date,
                     Accruing_Frequency,
                     Hire_Date_Anniversary,
                     Accruing_Multiplier)

Calculation_Period_SD  = get_date('PERIOD_START_DATE')
Calculation_Period_ED = get_date('PERIOD_END_DATE')

IF (Calculation_Date <> Calculation_Period_ED) THEN
    (
     E = GET_PERIOD_DATES(ADD_DAYS(Calculation_Period_SD,-1),
                                                Accruing_Frequency,
                                                Hire_Date_Anniversary,
                                                Accruing_Multiplier)

    Calculation_Period_SD  = get_date('PERIOD_START_DATE')
    Calculation_Period_ED = get_date('PERIOD_END_DATE')
   )

If (Calculation_Period_ED < First_Period_ED) THEN
   (
    Total_Accrued_PTO = 0
    E = PUT_MESSAGE('HR_52795_PTO_FML_CALC_DATE')
    )

/* ------------------------------------------------------------------------
   Set the Continuous Service Global Variable, whilst also
   ensuring that the continuous service date is before the Calculation Period
  ------------------------------------------------------------------------ */

IF (ACP_CONTINUOUS_SERVICE_DATE WAS DEFAULTED) THEN
    (
    E = set_date('SERVICE_START_DATE', ACP_SERVICE_START_DATE)
    )
ELSE IF(ACP_CONTINUOUS_SERVICE_DATE > Calculation_Period_SD) THEN
   (
    Total_Accrued_PTO = 0
    E = PUT_MESSAGE('HR_52796_PTO_FML_CSD')
    E = set_date('SERVICE_START_DATE', ACP_CONTINUOUS_SERVICE_DATE)
   )
ELSE
  (
    E = set_date('SERVICE_START_DATE', ACP_CONTINUOUS_SERVICE_DATE)
  )

/*
E = set_date('SERVICE_START_DATE', ACP_SERVICE_START_DATE)
*/
Service_Start_Date = get_date('SERVICE_START_DATE')

First_Eligible_To_Accrue_Date  = Service_Start_Date


/*------------------------------------------------------------------------
   Determine the date on which accrued PTo may first be registered, i.e the date on which the
   Ineligibility Period expires
   ------------------------------------------------------------------------ */

Accrual_Ineligibility_Expired_Date = First_Eligible_To_Accrue_Date

IF (ACP_INELIGIBILITY_PERIOD_LENGTH > 0) THEN
   (
   IF ACP_INELIGIBILITY_PERIOD_TYPE = 'BM' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH*2)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'F' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_days(Service_Start_Date,
                                                    ACP_INELIGIBILITY_PERIOD_LENGTH*14)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'CM' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'LM' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_days(Service_Start_Date,
                                                    ACP_INELIGIBILITY_PERIOD_LENGTH*28)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'Q' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH*3)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'SM' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH/2)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'SY' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH*6)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'W' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_days(Service_Start_Date,
                                                    ACP_INELIGIBILITY_PERIOD_LENGTH*7)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'Y' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH*12)
      )

   IF Accrual_Ineligibility_Expired_Date > First_Eligible_To_Accrue_Date
   AND Calculation_Date < Accrual_Ineligibility_Expired_Date THEN
      (
      First_Eligible_To_Accrue_Date = Accrual_Ineligibility_Expired_Date
      )
   )

/* ------------------------------------------------------------------------
   Get the first full period following the First_Eligible_To_Accrue_Date
   (if it falls on the beginning of the period then use that period)
------------------------------------------------------------------------- */

Latest_Balance = 0

IF (not Accrual_Start_Date was defaulted) AND
   ((Calculation_Date < Accrual_Ineligibility_Expired_Date) OR
    (Accrual_Start_Date > Accrual_Ineligibility_Expired_Date)) THEN
(
  Adjusted_Start_Date = Get_Start_Date(Accrual_Start_Date,
                                       Hire_Date_Anniversary)

  Adjusted_Start_Date = Get_Start_Date(Accrual_Start_Date,
                                       Hire_Date_Anniversary)

  /* Check whether RESET_PTO_ACCRUAL action parameter is defined */
  /* If yes, then we need to calculate from the beginning         */

  Reset_Accruals = Reset_PTO_Accruals()

  IF ((Adjusted_Start_Date < Accrual_Start_Date) OR
      (Reset_Accruals = 'TRUE'))  THEN

  (
    Process_Full_Term = 'Y'
  )
  ELSE
  (
    Process_Full_Term = 'N'
  )
)
ELSE
(
  Process_Full_Term = 'Y'
)

IF (Process_Full_Term = 'N') AND
   (Accrual_Start_Date >= First_Eligible_To_Accrue_Date) THEN
(

  E = GET_PERIOD_DATES_HD(Adjusted_Start_Date,
                       Accruing_Frequency,
                       Hire_Date_Anniversary,
                       Accruing_Multiplier)

  First_Eligible_To_Accrue_Period_SD = get_date('PERIOD_START_DATE')
  First_Eligible_To_Accrue_Period_ED = get_date('PERIOD_END_DATE')

  Latest_Balance = Accrual_Latest_Balance
  Effective_Start_Date = Accrual_Start_Date

)
ELSE IF First_Eligible_To_Accrue_Date > Hire_Date_Anniversary THEN
(
  IF (not Accrual_Start_Date was defaulted) THEN
  (
    Latest_Balance = Accrual_Latest_Balance
  )
  ELSE
  (
    Latest_Balance = 0
  )

  E = GET_PERIOD_DATES_HD(First_Eligible_To_Accrue_Date,
                       Accruing_Frequency,
                       Hire_Date_Anniversary,
                       Accruing_Multiplier)

  First_Eligible_To_Accrue_Period_SD  = get_date('PERIOD_START_DATE')
  First_Eligible_To_Accrue_Period_ED  = get_date('PERIOD_END_DATE')

  IF First_Eligible_To_Accrue_Date <> First_Eligible_To_Accrue_Period_SD THEN
      (
       E = GET_PERIOD_DATES(add_days(First_Eligible_To_Accrue_Period_ED,1),
                                                  Accruing_Frequency,
                                                  Hire_Date_Anniversary,
                                                  Accruing_Multiplier)

       First_Eligible_To_Accrue_Period_SD  = get_date('PERIOD_START_DATE')
       First_Eligible_To_Accrue_Period_ED  = get_date('PERIOD_END_DATE')
       )

  IF (First_Eligible_To_Accrue_Period_SD > Calculation_Period_ED) THEN
     (
       Total_Accrued_PTO = 0
       E = PUT_MESSAGE('HR_52793_PTO_FML_ASG_INELIG')
    )

  Effective_Start_Date = First_Eligible_To_Accrue_Date

)
ELSE
(
  IF (not Accrual_Start_Date was defaulted) THEN
  (
    Latest_Balance = Accrual_Latest_Balance
  )
  ELSE
  (
    Latest_Balance = 0
  )

  First_Eligible_To_Accrue_Period_SD  = First_Period_SD
  First_Eligible_To_Accrue_Period_ED  = First_Period_ED

  Effective_Start_Date = Hire_Date_Anniversary
)
/* ------------------------------------------------------------------------
   Determine the date on which PTO actually starts accruing based on Hire Date,
   Service Start Date and plan Enrollment Start Date.
   If this date is after the 1st period and the fisrt eligible date then
   establish the first full period after this date (if the Actual Start
   Date falls on the beginning of a period then use this period)
 ------------------------------------------------------------------------ */

Actual_Accrual_Start_Date = greatest(Service_Start_Date,
                                     ACP_ENROLLMENT_START_DATE,
                                     First_Period_SD)

/* -------------------------------------------------------------------------
       Determine the actual start of the accrual calculation
-------------------------------------------------------------------------*/
IF (Actual_Accrual_Start_Date > First_Period_SD AND
     Actual_Accrual_Start_Date > First_Eligible_To_Accrue_Period_SD) THEN
    (
     E = GET_PERIOD_DATES_HD(Actual_Accrual_Start_Date,
                          Accruing_Frequency,
                          Hire_Date_Anniversary,
                          Accruing_Multiplier)

     Accrual_Start_Period_SD = get_date('PERIOD_START_DATE')
     Accrual_Start_Period_ED = get_date('PERIOD_END_DATE')

     IF Actual_Accrual_Start_Date > Accrual_Start_Period_SD THEN
         (
          E = GET_PERIOD_DATES_HD(add_days(Accrual_Start_Period_ED,1),
                               Accruing_Frequency,
                               Hire_Date_Anniversary,
                               Accruing_Multiplier)

          Accrual_Start_Period_SD = get_date('PERIOD_START_DATE')
          Accrual_Start_Period_ED = get_date('PERIOD_END_DATE')
         )

/* -----------------------------------------------------------------
        If the Actual Acrual Period is after the Calculation Period then end the processing.
----------------------------------------------------------------- */
        IF (Accrual_Start_Period_SD > Calculation_Period_ED) THEN
            (
            Total_Accrued_PTO = 0
            E = PUT_MESSAGE('HR_52797_PTO_FML_ACT_ACCRUAL')
            )
     )

ELSE IF (First_Eligible_To_Accrue_Period_SD > First_Period_SD) THEN
     (
      Accrual_Start_Period_SD = First_Eligible_To_Accrue_Period_SD
      Accrual_Start_Period_ED = First_Eligible_To_Accrue_Period_ED
     )
ELSE
    (
      Accrual_Start_Period_SD = First_Period_SD
      Accrual_Start_Period_ED = First_Period_ED
    )

 /* -------------------------------------------------------------------
       Now set up the information that will be used in when looping through the periods
--------------------------------------------------------------------- */

IF Calculation_Period_ED >= Accrual_Start_Period_ED THEN
(
  E = set_date('PERIOD_SD',Accrual_Start_Period_SD)
  E = set_date('PERIOD_ED',Accrual_Start_Period_ED)
  E = set_date('LAST_PERIOD_SD',Calculation_Period_SD)
  E = set_date('LAST_PERIOD_ED',Calculation_Period_ED)

  IF (Process_Full_Term = 'N') THEN
  (
    E = set_number('TOTAL_ACCRUED_PTO', Latest_Balance)
  )
  ELSE
  (
    E = set_number('TOTAL_ACCRUED_PTO', 0)
  )

  E = LOOP_CONTROL('PTO_HD_ANNIVERSARY_PERIOD_ACCRUAL')

  Total_Accrued_PTO = get_number('TOTAL_ACCRUED_PTO') - Latest_Balance

)
ELSE
(
  Total_Accrued_PTO = 0
)


IF Accrual_Start_Period_SD <= Calculation_Period_SD THEN
(
  Accrual_end_date = Calculation_Period_ED
)

IF Process_Full_Term = 'Y' AND
   Effective_Start_Date > Actual_Accrual_Start_Date THEN
(
  Effective_Start_Date = Actual_Accrual_Start_Date
)

Effective_End_Date = Calculation_Date

IF Effective_Start_Date >= Effective_End_Date THEN
(
  Effective_Start_Date = Effective_End_Date
)

RETURN Total_Accrued_PTO, Effective_start_date, Effective_end_date, Accrual_end_date
-----------------------------------------------------------------


/* ------------------------------------------------------------------------
    NAME : PTO_HD_ANNIVERSARY_BALANCE
    This formula calculates the start and end dates for a simple multiplier.
    This formula calculates the dates between which an assignment is to accrue.
   ---------------------------------------------------------------------*/

DEFAULT FOR ACP_INELIGIBILITY_PERIOD_TYPE IS 'CM'
DEFAULT FOR ACP_INELIGIBILITY_PERIOD_LENGTH IS 0
DEFAULT FOR ACP_CONTINUOUS_SERVICE_DATE IS '4712/12/31 00:00:00' (date)
DEFAULT FOR ACP_ENROLLMENT_END_DATE IS '4712/12/31 00:00:00' (date)
DEFAULT FOR ACP_TERMINATION_DATE IS '4712/12/31 00:00:00' (date)
DEFAULT FOR ACP_ENROLLMENT_START_DATE IS '4712/12/31 00:00:00' (date)
DEFAULT FOR ACP_SERVICE_START_DATE IS '4712/12/31 00:00:00' (date)

default for Accrual_Start_Date is '4712/12/31 00:00:00' (date)
default for Accrual_Latest_Balance is 0

INPUTS ARE
Calculation_Date (date),
Accrual_Start_Date (date),
Accrual_Latest_Balance

E = SET_NUMBER('CEILING',8)
E = SET_NUMBER('ACCRUAL_RATE',0.0222222222222222)

Accruing_Frequency = 'D'   /* Day */
Accruing_Multiplier = 1

E = SET_TEXT('ACCRUING_FREQUENCY', Accruing_Frequency)
E = SET_NUMBER('ACCRUING_MULTIPLIER', Accruing_Multiplier)

Hire_Date_Anniversary = add_months(ACP_SERVICE_START_DATE,
                                  trunc(months_between(Calculation_Date,
                                                       ACP_SERVICE_START_DATE) / 12) * 12)

IF Accrual_Start_Date < Hire_Date_Anniversary THEN
(
  Accrual_Start_Date = Hire_Date_Anniversary
)

E = SET_DATE('HIRE_DATE_ANNIVERSARY', Hire_Date_Anniversary)

E = GET_PERIOD_DATES_HD(Hire_Date_Anniversary,
                     Accruing_Frequency,
                     Hire_Date_Anniversary,
                     Accruing_Multiplier)

First_Period_SD = get_date('PERIOD_START_DATE')
First_Period_ED = get_date('PERIOD_END_DATE')

/* ------------------------------------------------------------------------
   Set the Calculation_Date to the Termination Date if not null
-------------------------------------------------------------------------- */

IF NOT (ACP_TERMINATION_DATE WAS DEFAULTED) OR
    NOT (ACP_ENROLLMENT_END_DATE WAS DEFAULTED) THEN
(
  Early_End_Date = least(ACP_TERMINATION_DATE, ACP_ENROLLMENT_END_DATE)

  IF (Early_End_Date < First_Period_ED) THEN
  (
    Total_Accrued_PTO = 0
    E = PUT_MESSAGE('HR_52794_PTO_FML_ASG_TER')
   )

  IF (Early_End_Date < Calculation_Date) THEN
  (
    Calculation_Date = Early_End_Date
  )
)

/* ------------------------------------------------------------------------
   Get the last whole period prior to the Calculation Date and ensure that it is within the
   Year (if the Calculation Date is the End of a Period then use that period)
   ------------------------------------------------------------------------ */

E = GET_PERIOD_DATES_HD(Calculation_Date,
                     Accruing_Frequency,
                     Hire_Date_Anniversary,
                     Accruing_Multiplier)

Calculation_Period_SD  = get_date('PERIOD_START_DATE')
Calculation_Period_ED = get_date('PERIOD_END_DATE')

IF (Calculation_Date <> Calculation_Period_ED) THEN
    (
     E = GET_PERIOD_DATES(ADD_DAYS(Calculation_Period_SD,-1),
                                                Accruing_Frequency,
                                                Hire_Date_Anniversary,
                                                Accruing_Multiplier)

    Calculation_Period_SD  = get_date('PERIOD_START_DATE')
    Calculation_Period_ED = get_date('PERIOD_END_DATE')
   )

If (Calculation_Period_ED < First_Period_ED) THEN
   (
    Total_Accrued_PTO = 0
    E = PUT_MESSAGE('HR_52795_PTO_FML_CALC_DATE')
    )

/* ------------------------------------------------------------------------
   Set the Continuous Service Global Variable, whilst also
   ensuring that the continuous service date is before the Calculation Period
  ------------------------------------------------------------------------ */

IF (ACP_CONTINUOUS_SERVICE_DATE WAS DEFAULTED) THEN
    (
    E = set_date('SERVICE_START_DATE', ACP_SERVICE_START_DATE)
    )
ELSE IF(ACP_CONTINUOUS_SERVICE_DATE > Calculation_Period_SD) THEN
   (
    Total_Accrued_PTO = 0
    E = PUT_MESSAGE('HR_52796_PTO_FML_CSD')
    E = set_date('SERVICE_START_DATE', ACP_CONTINUOUS_SERVICE_DATE)
   )
ELSE
  (
    E = set_date('SERVICE_START_DATE', ACP_CONTINUOUS_SERVICE_DATE)
  )

/*
E = set_date('SERVICE_START_DATE', ACP_SERVICE_START_DATE)
*/
Service_Start_Date = get_date('SERVICE_START_DATE')

First_Eligible_To_Accrue_Date  = Service_Start_Date


/*------------------------------------------------------------------------
   Determine the date on which accrued PTo may first be registered, i.e the date on which the
   Ineligibility Period expires
   ------------------------------------------------------------------------ */

Accrual_Ineligibility_Expired_Date = First_Eligible_To_Accrue_Date

IF (ACP_INELIGIBILITY_PERIOD_LENGTH > 0) THEN
   (
   IF ACP_INELIGIBILITY_PERIOD_TYPE = 'BM' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH*2)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'F' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_days(Service_Start_Date,
                                                    ACP_INELIGIBILITY_PERIOD_LENGTH*14)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'CM' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'LM' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_days(Service_Start_Date,
                                                    ACP_INELIGIBILITY_PERIOD_LENGTH*28)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'Q' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH*3)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'SM' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH/2)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'SY' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH*6)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'W' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_days(Service_Start_Date,
                                                    ACP_INELIGIBILITY_PERIOD_LENGTH*7)
      )
   ELSE IF ACP_INELIGIBILITY_PERIOD_TYPE = 'Y' THEN
      (
      Accrual_Ineligibility_Expired_Date = add_months(Service_Start_Date,
                                                      ACP_INELIGIBILITY_PERIOD_LENGTH*12)
      )

   IF Accrual_Ineligibility_Expired_Date > First_Eligible_To_Accrue_Date
   AND Calculation_Date < Accrual_Ineligibility_Expired_Date THEN
      (
      First_Eligible_To_Accrue_Date = Accrual_Ineligibility_Expired_Date
      )
   )

/* ------------------------------------------------------------------------
   Get the first full period following the First_Eligible_To_Accrue_Date
   (if it falls on the beginning of the period then use that period)
------------------------------------------------------------------------- */

Latest_Balance = 0

IF (not Accrual_Start_Date was defaulted) AND
   ((Calculation_Date < Accrual_Ineligibility_Expired_Date) OR
    (Accrual_Start_Date > Accrual_Ineligibility_Expired_Date)) THEN
(
  Adjusted_Start_Date = Get_Start_Date(Accrual_Start_Date,
                                       Hire_Date_Anniversary)

  Adjusted_Start_Date = Get_Start_Date(Accrual_Start_Date,
                                       Hire_Date_Anniversary)

  /* Check whether RESET_PTO_ACCRUAL action parameter is defined */
  /* If yes, then we need to calculate from the beginning         */

  Reset_Accruals = Reset_PTO_Accruals()

  IF ((Adjusted_Start_Date < Accrual_Start_Date) OR
      (Reset_Accruals = 'TRUE'))  THEN

  (
    Process_Full_Term = 'Y'
  )
  ELSE
  (
    Process_Full_Term = 'N'
  )
)
ELSE
(
  Process_Full_Term = 'Y'
)

IF (Process_Full_Term = 'N') AND
   (Accrual_Start_Date >= First_Eligible_To_Accrue_Date) THEN
(

  E = GET_PERIOD_DATES_HD(Adjusted_Start_Date,
                       Accruing_Frequency,
                       Hire_Date_Anniversary,
                       Accruing_Multiplier)

  First_Eligible_To_Accrue_Period_SD = get_date('PERIOD_START_DATE')
  First_Eligible_To_Accrue_Period_ED = get_date('PERIOD_END_DATE')

  Latest_Balance = Accrual_Latest_Balance
  Effective_Start_Date = Accrual_Start_Date

)
ELSE IF First_Eligible_To_Accrue_Date > Hire_Date_Anniversary THEN
(
  IF (not Accrual_Start_Date was defaulted) THEN
  (
    Latest_Balance = Accrual_Latest_Balance
  )
  ELSE
  (
    Latest_Balance = 0
  )

  E = GET_PERIOD_DATES_HD(First_Eligible_To_Accrue_Date,
                       Accruing_Frequency,
                       Hire_Date_Anniversary,
                       Accruing_Multiplier)

  First_Eligible_To_Accrue_Period_SD  = get_date('PERIOD_START_DATE')
  First_Eligible_To_Accrue_Period_ED  = get_date('PERIOD_END_DATE')

  IF First_Eligible_To_Accrue_Date <> First_Eligible_To_Accrue_Period_SD THEN
      (
       E = GET_PERIOD_DATES(add_days(First_Eligible_To_Accrue_Period_ED,1),
                                                  Accruing_Frequency,
                                                  Hire_Date_Anniversary,
                                                  Accruing_Multiplier)

       First_Eligible_To_Accrue_Period_SD  = get_date('PERIOD_START_DATE')
       First_Eligible_To_Accrue_Period_ED  = get_date('PERIOD_END_DATE')
       )

  IF (First_Eligible_To_Accrue_Period_SD > Calculation_Period_ED) THEN
     (
       Total_Accrued_PTO = 0
       E = PUT_MESSAGE('HR_52793_PTO_FML_ASG_INELIG')
    )

  Effective_Start_Date = First_Eligible_To_Accrue_Date

)
ELSE
(
  IF (not Accrual_Start_Date was defaulted) THEN
  (
    Latest_Balance = Accrual_Latest_Balance
  )
  ELSE
  (
    Latest_Balance = 0
  )

  First_Eligible_To_Accrue_Period_SD  = First_Period_SD
  First_Eligible_To_Accrue_Period_ED  = First_Period_ED

  Effective_Start_Date = Hire_Date_Anniversary
)
/* ------------------------------------------------------------------------
   Determine the date on which PTO actually starts accruing based on Hire Date,
   Service Start Date and plan Enrollment Start Date.
   If this date is after the 1st period and the fisrt eligible date then
   establish the first full period after this date (if the Actual Start
   Date falls on the beginning of a period then use this period)
 ------------------------------------------------------------------------ */

Actual_Accrual_Start_Date = greatest(Service_Start_Date,
                                     ACP_ENROLLMENT_START_DATE,
                                     First_Period_SD)

/* -------------------------------------------------------------------------
       Determine the actual start of the accrual calculation
-------------------------------------------------------------------------*/
IF (Actual_Accrual_Start_Date > First_Period_SD AND
     Actual_Accrual_Start_Date > First_Eligible_To_Accrue_Period_SD) THEN
    (
     E = GET_PERIOD_DATES_HD(Actual_Accrual_Start_Date,
                          Accruing_Frequency,
                          Hire_Date_Anniversary,
                          Accruing_Multiplier)

     Accrual_Start_Period_SD = get_date('PERIOD_START_DATE')
     Accrual_Start_Period_ED = get_date('PERIOD_END_DATE')

     IF Actual_Accrual_Start_Date > Accrual_Start_Period_SD THEN
         (
          E = GET_PERIOD_DATES_HD(add_days(Accrual_Start_Period_ED,1),
                               Accruing_Frequency,
                               Hire_Date_Anniversary,
                               Accruing_Multiplier)

          Accrual_Start_Period_SD = get_date('PERIOD_START_DATE')
          Accrual_Start_Period_ED = get_date('PERIOD_END_DATE')
         )

/* -----------------------------------------------------------------
        If the Actual Acrual Period is after the Calculation Period then end the processing.
----------------------------------------------------------------- */
        IF (Accrual_Start_Period_SD > Calculation_Period_ED) THEN
            (
            Total_Accrued_PTO = 0
            E = PUT_MESSAGE('HR_52797_PTO_FML_ACT_ACCRUAL')
            )
     )

ELSE IF (First_Eligible_To_Accrue_Period_SD > First_Period_SD) THEN
     (
      Accrual_Start_Period_SD = First_Eligible_To_Accrue_Period_SD
      Accrual_Start_Period_ED = First_Eligible_To_Accrue_Period_ED
     )
ELSE
    (
      Accrual_Start_Period_SD = First_Period_SD
      Accrual_Start_Period_ED = First_Period_ED
    )

 /* -------------------------------------------------------------------
       Now set up the information that will be used in when looping through the periods
--------------------------------------------------------------------- */

IF Calculation_Period_ED >= Accrual_Start_Period_ED THEN
(
  E = set_date('PERIOD_SD',Accrual_Start_Period_SD)
  E = set_date('PERIOD_ED',Accrual_Start_Period_ED)
  E = set_date('LAST_PERIOD_SD',Calculation_Period_SD)
  E = set_date('LAST_PERIOD_ED',Calculation_Period_ED)

  IF (Process_Full_Term = 'N') THEN
  (
    E = set_number('TOTAL_ACCRUED_PTO', Latest_Balance)
  )
  ELSE
  (
    E = set_number('TOTAL_ACCRUED_PTO', 0)
  )

  E = LOOP_CONTROL('PTO_HD_ANNIVERSARY_PERIOD_ACCRUAL')

  Total_Accrued_PTO = get_number('TOTAL_ACCRUED_PTO') - Latest_Balance

)
ELSE
(
  Total_Accrued_PTO = 0
)


IF Accrual_Start_Period_SD <= Calculation_Period_SD THEN
(
  Accrual_end_date = Calculation_Period_ED
)

IF Process_Full_Term = 'Y' AND
   Effective_Start_Date > Actual_Accrual_Start_Date THEN
(
  Effective_Start_Date = Actual_Accrual_Start_Date
)

Effective_End_Date = Calculation_Date

IF Effective_Start_Date >= Effective_End_Date THEN
(
  Effective_Start_Date = Effective_End_Date
)

RETURN Total_Accrued_PTO, Effective_start_date, Effective_end_date, Accrual_end_date
------------------------------------------------------------
/* ------------------------------------------------------------------------
    NAME : PTO_HD_ANNIVERSARY_CARRYOVER
    This formula is the seeded carryover formula for our
    hire date anniversary accrual plan
   ---------------------------------------------------------------------*/

DEFAULT FOR ACP_SERVICE_START_DATE IS '4712/12/31 00:00:00' (date)

INPUTS ARE
Calculation_Date (date),
Accrual_term (text)

leap_month = to_number (to_char(ACP_SERVICE_START_DATE,'ddmm'))

IF ACP_SERVICE_START_DATE WAS NOT DEFAULTED THEN
(
Effective_Date = add_months(ACP_SERVICE_START_DATE,
                            trunc(months_between(Calculation_Date,
                                                 ACP_SERVICE_START_DATE) / 24) * 12)

cal_for_LEAP_year = to_number (to_char(Effective_Date,'ddmm'))

IF (Accrual_Term = 'CURRENT') THEN
(
  Effective_date = ADD_YEARS(Effective_Date, 1)
)

Effective_Date = add_days(Effective_Date, -1)
Expiry_Date = add_years(effective_date, 1)
Max_carryover = 14
if cal_for_LEAP_year=2902 and leap_month=2802 then
(Effective_Date = add_days(Effective_Date, -1)
Expiry_Date = add_days(Expiry_Date, -1)
)
)

Process = 'YES'

RETURN Max_Carryover, Effective_date, Expiry_Date, Process


1 comment: