Tuesday 18 October 2016

Using Form Navigator Functionality in Oracle HRMS

Menus

  1. GLB_HRMS_NAV
  2. GLB_HRMS_PEOPLE
  3. GLB_HRMS_MAINTAIN_TEMPLATES
Go to Global HRMS Manager > Security > Form Navigator




Go to application devloper > function

Function name:
PERWSQHM_ENTER_EMPS
PERWSQHM_MAINTAIN_EMPS

User Function Name :
People Management - Enter Employees
People Management - Maintain Employees



Parameter Name : TEMPLATE_NAME="PER_ENTER_EMPS"





CNIC Format

00000"-"0000000"-"0

Thursday 13 October 2016

Define Table Structures in Oracle HRMS

Go to > Global HRMS Manager  > Other Definitions > Table Structures


Go to Tables Values >


Define Event Group Proration

Go to Global HRMS Manager > Other Definitions > Event Group





Function register in Oracle HRMS

Go to Global HRMS Manager > Define Functions




Define Elements

Go to > Global HRMS Manager > Define element





Define Balances

                     


Define Element Formula results


             

Find Oracle API


  1. Got to Responsibility Name :Integrated SOA Gateway
  2. Run SQL fixe module

select  * from  (
select * from all_objects where object_name like 'AP%' escape '\' and object_type = 'PACKAGE'
union
select * from all_objects where object_name like 'AP%' escape '\' and object_type = 'PACKAGE'
union
select * from all_objects where object_name like 'AP' escape '\' and object_type = 'PACKAGE'
) where object_name like '%INVOICE%'

Extract DB Objects SQL

SELECT object_name,object_type,DBMS_METADATA.get_ddl (object_type, object_name)
 FROM dba_objects DV
WHERE 1=1
--and object_name LIKE 'IFL%'  
AND  object_name LIKE 'CUST%'
AND OWNER= 'APPS'
  AND object_type  IN('FUNCTION','PROCEDURE','PACKAGE','SEQUENCE','VIEW','TABLE')
    AND TRUNC(DV.CREATED) >= '01-MAY-2016'
UNION ALL

SELECT object_name,object_type,DBMS_METADATA.get_ddl (object_type, object_name)
 FROM dba_objects DV
WHERE 1=1
--and object_name LIKE 'IFL%'  
AND  object_name LIKE 'IFL%'
AND OWNER= 'APPS'
  AND object_type  IN(/*'FUNCTION','PROCEDURE',*/'PROCEDURE') --0,'SEQUENCE','VIEW','TABLE')
    AND TRUNC(DV.CREATED) >= '01-MAY-2016'  
   -- AND OBJECT_NAME NOT IN ( 'IFL_WCC_WF') ---,'I_OBJ#','TAB$')
 
 
SELECT PEC.CLASSIFICATION_NAME,
       PET.ELEMENT_NAME,
       PIV.NAME INVPUT_NAME,
       PEC.CLASSIFICATION_NAME,
       PET.PROCESSING_TYPE,
       PET.PROCESSING_PRIORITY      
 FROM PAY_ELEMENT_TYPES_X PET,
              PAY_INPUT_VALUES_X PIV,
                  pay_element_classifications pec
              WHERE  PIV.ELEMENT_TYPE_ID = PET.ELEMENT_TYPE_ID
              AND    PET.CLASSIFICATION_ID = PEC.CLASSIFICATION_ID  ORDER BY 1 ASC
             
select  v.NAME,v.DATA_TYPE,fc.CONTEXT_NAME context_parameter,fc.DATA_TYPE   ,fp.NAME parameter ,fp.DATA_TYPE
from  FF_FUNCTIONS_V  v,
     FF_FUNCTION_CONTEXT_USAGES_V fc,
     FF_FUNCTION_PARAMETERS_V  fp
 where v.CREATED_BY in(1070,9877)
 and   fc.FUNCTION_ID (+) = v.FUNCTION_ID
 and   fp.FUNCTION_ID (+)= v.FUNCTION_ID
 order by 1


select  ff.FORMULA_NAME,        FF.FORMULA_TYPE_ID,
        ff.CREATED_BY ,
        ff.FORMULA_TEXT
        from      FF_FORMULAS_F ff
        where ff.CREATED_BY IN(1070,9877)
       
       

select  et.ELEMENT_NAME,
        ff.FORMULA_NAME ,
        frr.RESULT_NAME,
        piv.NAME input_name      
from    pay_element_types_f et,
        pay_input_values_f  piv,
        pay_status_processing_rules_f spr ,
        pay_formula_result_rules_f frr,
          FF_FORMULAS_F ff
where    spr.ELEMENT_TYPE_ID = et.ELEMENT_TYPE_ID
and      frr.STATUS_PROCESSING_RULE_ID = spr.STATUS_PROCESSING_RULE_ID
and      frr.ELEMENT_TYPE_ID   =  et.ELEMENT_TYPE_ID
and       spr.FORMULA_ID     = ff.FORMULA_ID
and       piv.ELEMENT_TYPE_ID  = et.ELEMENT_TYPE_ID
and       frr.INPUT_VALUE_ID   = piv.INPUT_VALUE_ID      


select  alt.ALERT_NAME,alt.ALERT_CONDITION_TYPE,fa.APPLICATION_SHORT_NAME,alt.SQL_STATEMENT_TEXT
from ALR_ALERTS  alt,
     fnd_application fa    
where alt.CREATED_BY in (1070,9877)  and alt.ENABLED_FLAG = 'Y'
and  fa.APPLICATION_ID = alt.APPLICATION_ID            
 

Oracle Workflow Mailer Configuration

Go to system administrator > Oracle Application manager > workflow manager

Click on notification mailer icon > edit >


Only change outbound ,inbound  (server name ,password ,reply to address)

Go to Advanced >

Next >  
Next >

Change inbound ,outbound  server name and password

Next > 

Next > 



Complete 8 step one by one 



Finish 


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