You are on page 1of 7

Mohamed Salah Kandil: Msalah600@Gmail.

Com
Senior Oracle HCM Techno Functional Consultant

Absence Integration with OTL Projects Layout Part 1


As per Doc ID 1285890.1 OTL-Absence Integration and Self Service Projects and Payroll Timecard layout
is not supported. In this document I had developed work around for this functionality.
Goal:
Prevent Timekeeper to enter timesheet in a day which has approved absence in HR (Part 1 )
Prevent HR to create absence in a day which has working hours in OTL module ( Part 2 )

Prevent Timekeeper to enter timesheet in a day which has approved absence in HR.
Create the following package:
CREATE OR REPLACE PACKAGE APPS.XX_OTL_PACKAGE
IS
FUNCTION OTL_CHECK_LEAVE_IN_DAY (p_resource_id NUMBER,P_DATE DATE)RETURN
NUMBER;
FUNCTION OTL_PREV_ABSENCE_DAYS (p_resource_id NUMBER) RETURN number;
END XXNAP_OTL_PACKAGE;
/

CREATE OR REPLACE PACKAGE BODY APPS.XX_OTL_PACKAGE


IS
FUNCTION OTL_CHECK_LEAVE_IN_DAY (p_resource_id NUMBER,P_DATE DATE)
RETURN NUMBER
IS
L_COUNT
NUMBER :=0;
--L_DATE
DATE
;
BEGIN
SELECT NVL ((SELECT COUNT(*)
FROM PER_ABSENCE_ATTENDANCES PAA
WHERE PAA.PERSON_ID = p_resource_id
AND (
(PAA.DATE_END BETWEEN P_DATE AND P_DATE
)
OR (PAA.DATE_START BETWEEN P_DATE AND P_DATE
)
OR (P_DATE BETWEEN PAA.DATE_START AND PAA.DATE_END
)
OR (P_DATE <= PAA.DATE_START AND P_DATE >= PAA.DATE_END
)
)),0) INTO L_COUNT FROM DUAL ;

RETURN L_COUNT;
END OTL_CHECK_LEAVE_IN_DAY;
FUNCTION OTL_PREV_ABSENCE_DAYS (p_resource_id NUMBER)
RETURN number

IS
l_return_rule_status number := 0;
L_LEAVE_OVERLAB
number := 0;
L_WORKING_HOURS
number := 0;
l_timecard_info hxc_self_service_time_deposit.timecard_info;
l_tbb_array HXC_BLOCK_TABLE_TYPE;
BEGIN
l_timecard_info := hxc_self_service_time_deposit.get_building_blocks;
l_tbb_array
:= hxc_deposit_wrapper_utilities.blocks_to_array(p_blocks =>
l_timecard_info);
IF l_tbb_array.FIRST IS NOT NULL THEN

FOR i IN l_tbb_array.FIRST .. l_tbb_array.LAST


LOOP
IF l_tbb_array(i).SCOPE = 'DETAIL' THEN
L_WORKING_HOURS := NVL (l_tbb_array(i).MEASURE,0);

FOR c IN l_tbb_array.FIRST .. l_tbb_array.LAST

LOOP
IF l_tbb_array(c).SCOPE = 'DAY' and
l_tbb_array(c).TIME_BUILDING_BLOCK_ID =
l_tbb_array(i).PARENT_BUILDING_BLOCK_ID THEN

L_LEAVE_OVERLAB :=
XXNAP_OTL_PACKAGE.OTL_CHECK_LEAVE_IN_DAY(p_resource_id,FND_DATE.CANONICAL_TO_D
ATE(l_tbb_array(C).START_TIME));
INSERT INTO XX_OTL_DEBUG VALUES
(p_resource_id,FND_DATE.CANONICAL_TO_DATE(l_tbb_array(c).START_TIME),L_LEAVE_O
VERLAB,L_WORKING_HOURS,l_tbb_array(c).TIME_BUILDING_BLOCK_ID,l_tbb_array(i).PA
RENT_BUILDING_BLOCK_ID);

IF L_WORKING_HOURS > 0 and L_LEAVE_OVERLAB > 0 THEN


l_return_rule_status := l_return_rule_status+1;
END IF;
END IF;
END LOOP;
END IF;
END LOOP;
END IF;
RETURN l_return_rule_status;
END OTL_PREV_ABSENCE_DAYS;

END XXNAP_OTL_PACKAGE;
/

Create formula function:

Create formula:

Formula Text:
/******************************************************************
Formula Name: XX_OTL_PREVENT_LEAVE_OVERLAB
Author: Mohamed Salah Kandil
Description :Prevent timesheet for registered leave days in HR
Contexts: None
*****************************************************************
*/
/*
Initialize Variables which can be null
*****************************************************************
*/
Default for db_pre_period_start is ' '
Default for db_pre_period_end is ' '
Default for db_post_period_start is ' '
Default for db_post_period_end is ' '
Default for db_ref_period_start is ' '
Default for db_ref_period_end is ' '
Default for timecard_hrs is 0
/* ******************************************************************
READ IN INPUT VARIABLES
****************************************************************** */
INPUTS ARE resource_id
(number)
,
submission_date (text)
,
db_pre_period_start (text)
,
db_pre_period_end (text)
,
db_post_period_start (text)
,
db_post_period_end (text)
,
db_ref_period_start (text)
,
db_ref_period_end
(text)
,
timecard_hrs
(number)
IF ( OTL_PREV_ABSENCE_DAYS(resource_id) >0 )
THEN
(rule_status = 'E'
message1 = 'OTL_PREV_ABSENCE_DAYS'
return rule_status,message1)
ELSE
(rule_status = 'S'
return rule_status)

Create Error Message > Application Developer > Application > Messages:

Create Time Entry Rule


Global OTL Application Developer > Time Entry Rules > Define Time Entry Rules

Create Time Entry Rule Group


Global OTL Application Developer > Time Entry Rules > Define Time Entry Rule Groups

Assign Time Entry Rule Group to Preferences

Test Case
1. Create an absence for employee

2. Create timesheet for him in the same day and try to save:

You might also like