1 PACKAGE body PAY_GB_ENROLL_PENSION
2 /* $Header: pygbpaep.pkb 120.91.12020000.9 2013/03/28 10:25:20 rsadhana noship $ */
3 AS
4
5 FUNCTION GET_PROFILE_OPTION(
6 p_profile_option_name IN VARCHAR)
7 RETURN VARCHAR
8 IS
9 l_profile_value VARCHAR2(50);
10 BEGIN
11 fnd_profile.get(p_profile_option_name,l_profile_value);
12 RETURN l_profile_value;
13 END GET_PROFILE_OPTION;
14 ----------------------------------------------------------------------------
15 FUNCTION FETCH_START_DATE(
16 P_DATE_OF_BIRTH DATE)
17 RETURN DATE
18 IS
19 L_DATE DATE;
20 BEGIN
21 -- RETURNS DATE OF BIRTH +22 YEARS
22 SELECT ADD_MONTHS(P_DATE_OF_BIRTH,(22*12))
23 INTO L_DATE
24 FROM DUAL;
25 RETURN L_DATE;
26 END FETCH_START_DATE;
27 ----------------------------------------------------------------------------
28 FUNCTION GET_AGGREGATED_EARNINGS(
29 P_ASSIGNMENT_ID IN NUMBER,
30 P_REGULAR_PAYMENT_DATE IN DATE,
31 P_PQE_ASG_RUN IN NUMBER)
32 RETURN NUMBER
33 IS
34 ----Local variables
35 L_AGGREGATION VARCHAR2(1) :='N';
36 L_MAIN_ENTRY VARCHAR2(1) :='N';
37 L_PRP_START_DATE DATE;
38 L_PRP_END_DATE DATE;
39 L_PAYROLL_ID NUMBER;
40 L_BALANCE_VALUE NUMBER :=0;
41 L_DEFINED_BALANCE_ID NUMBER;
42 L_TOTAL_QUAL_EARNINGS NUMBER;
43 L_PERIOD_TYPE PAY_PAYROLLS_F.PERIOD_TYPE%TYPE;
44 L_PERSON_ID NUMBER;
45 L_AGE NUMBER;
46 L_SEX PER_ALL_PEOPLE_F.SEX%TYPE;
47 L_DATE_OF_BIRTH DATE;
48 L_BUSINESS_GROUP_ID NUMBER;
49 L_EMPLOYEE_STATUS NUMBER;
50 L_AUTO_ENROL_DATE VARCHAR2(30);
51 L_ELIGIBLE_JOB_HOLDER_DATE VARCHAR2(30);
52 L_QUALIFYING_SCHEME_EXISTS VARCHAR2(1);
53 L_POSTPONEMENT_DATE VARCHAR2(30);
54 L_OPTOUT_DATE VARCHAR2(30);
55 L_NUM_DATE_BIRTH VARCHAR2(10);
56 N_STATE_PENSION_AGE NUMBER := 0;
57 RETIRE_DATE DATE;
58 L_AUTOTHRESHOLD NUMBER :=0;
59 L_LOWER_THRESHOLD NUMBER :=0;
60 L_ERROR NUMBER;
61 ------Cursor to get Globals
62
63 L_SERVICE_START date;
64 L_DOB_TT date;
65 L_EFFECTIVE_DATE date;
66 l_asg_start_date DATE;
67 --To Fetch the Assignment Start Date
68 Cursor c_asg_start_date is
69 select EFFECTIVE_START_DATE from per_all_assignments_f
70 where assignment_id = p_assignment_id
71 and l_prp_end_date between EFFECTIVE_START_DATE and EFFECTIVE_END_DATE;
72 ---To Fetch Service Start Date of the employee
73 CURSOR C_SERVICE_START (P_PERSON_ID PER_ALL_PEOPLE_F.PERSON_ID%TYPE)
74 IS
75 SELECT DATE_START
76 FROM PER_PERIODS_OF_SERVICE
77 WHERE PERSON_ID = P_PERSON_ID
78 AND BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID;
79
80 CURSOR C_GET_GLOBAL_VALUE(P_EFFECTIVE_DATE DATE)
81 IS
82 SELECT MAX(DECODE(GLOBAL_NAME,'QE_WEEKLY_LT', GLOBAL_VALUE ,NULL)) G_QE_WEEKLY_LT ,
83 MAX(DECODE(GLOBAL_NAME,'QE_MONTHLY_LT', GLOBAL_VALUE ,NULL)) G_QE_MONTHLY_LT ,
84 MAX(DECODE(GLOBAL_NAME,'QE_ANNUAL_LT', GLOBAL_VALUE ,NULL)) G_QE_ANNUAL_LT ,
85 MAX(DECODE(GLOBAL_NAME,'QE_WEEKLY_UT', GLOBAL_VALUE ,NULL)) G_QE_WEEKLY_UT ,
86 MAX(DECODE(GLOBAL_NAME,'QE_MONTHLY_UT', GLOBAL_VALUE ,NULL)) G_QE_MONTHLY_UT ,
87 MAX(DECODE(GLOBAL_NAME,'QE_ANNUAL_UT', GLOBAL_VALUE ,NULL)) G_QE_ANNUAL_UT ,
88 MAX(DECODE(GLOBAL_NAME,'AUTO_ENROL_TRIG_WEEKLY', GLOBAL_VALUE ,NULL)) G_AUTO_ENROL_TRIG_WEEKLY ,
89 MAX(DECODE(GLOBAL_NAME,'AUTO_ENROL_TRIG_MONTHLY', GLOBAL_VALUE ,NULL)) G_AUTO_ENROL_TRIG_MONTHLY ,
90 MAX(DECODE(GLOBAL_NAME,'AUTO_ENROL_TRIG_ANNUAL', GLOBAL_VALUE ,NULL)) G_AUTO_ENROL_TRIG_ANNUAL,
91 MAX(DECODE(GLOBAL_NAME,'QE_BIWEEK_LT', GLOBAL_VALUE ,NULL)) G_QE_BIWEEK_LT,
92 MAX(DECODE(GLOBAL_NAME,'QE_LUNAR_LT', GLOBAL_VALUE ,NULL)) G_QE_LUNAR_LT,
93 MAX(DECODE(GLOBAL_NAME,'QE_QUARTERLY_LT', GLOBAL_VALUE ,NULL)) G_QE_QUARTERLY_LT,
94 MAX(DECODE(GLOBAL_NAME,'QE_SEMIYEAR_LT', GLOBAL_VALUE ,NULL)) G_QE_SEMIYEAR_LT,
95 MAX(DECODE(GLOBAL_NAME,'QE_BIWEEK_UT', GLOBAL_VALUE ,NULL)) G_QE_BIWEEK_UT,
96 MAX(DECODE(GLOBAL_NAME,'QE_LUNAR_UT', GLOBAL_VALUE ,NULL)) G_QE_LUNAR_UT,
97 MAX(DECODE(GLOBAL_NAME,'QE_QUARTERLY_UT', GLOBAL_VALUE ,NULL)) G_QE_QUARTERLY_UT,
98 MAX(DECODE(GLOBAL_NAME,'QE_SEMIYEAR_UT', GLOBAL_VALUE ,NULL)) G_QE_SEMIYEAR_UT,
99 MAX(DECODE(GLOBAL_NAME,'AUTO_ENROL_TRIG_BIWEEK', GLOBAL_VALUE ,NULL)) G_AUTO_ENROL_TRIG_BIWEEK,
100 MAX(DECODE(GLOBAL_NAME,'AUTO_ENROL_TRIG_LUNAR', GLOBAL_VALUE ,NULL)) G_AUTO_ENROL_TRIG_LUNAR,
101 MAX(DECODE(GLOBAL_NAME,'AUTO_ENROL_TRIG_QUARTERLY', GLOBAL_VALUE ,NULL)) G_AUTO_ENROL_TRIG_QUARTERLY,
102 MAX(DECODE(GLOBAL_NAME,'AUTO_ENROL_TRIG_SEMIYEAR', GLOBAL_VALUE ,NULL)) G_AUTO_ENROL_TRIG_SEMIYEAR
103 FROM FF_GLOBALS_F FGF
104 WHERE GLOBAL_NAME IN ('QE_ANNUAL_LT', 'QE_WEEKLY_LT', 'QE_MONTHLY_LT', 'QE_ANNUAL_UT', 'QE_WEEKLY_UT', 'QE_MONTHLY_UT', 'AUTO_ENROL_TRIG_ANNUAL', 'AUTO_ENROL_TRIG_WEEKLY', 'AUTO_ENROL_TRIG_MONTHLY',
105 'QE_BIWEEK_LT','QE_LUNAR_LT','QE_QUARTERLY_LT','QE_SEMIYEAR_LT', 'QE_BIWEEK_UT','QE_LUNAR_UT','QE_QUARTERLY_UT','QE_SEMIYEAR_UT', 'AUTO_ENROL_TRIG_BIWEEK','AUTO_ENROL_TRIG_LUNAR','AUTO_ENROL_TRIG_QUARTERLY',
106 'AUTO_ENROL_TRIG_SEMIYEAR')
107 AND P_EFFECTIVE_DATE BETWEEN FGF.EFFECTIVE_START_DATE AND FGF.EFFECTIVE_END_DATE;
108 G_GLOBAL_VALUE C_GET_GLOBAL_VALUE%ROWTYPE;
109 ---Cursot to get age an Gender as on Payment Date for the payroll run
110 CURSOR C_AGE_SEX(V_PERSON_ID NUMBER)
111 IS
112 SELECT MONTHS_BETWEEN(P_REGULAR_PAYMENT_DATE,DATE_OF_BIRTH)/12,
113 SEX,
114 DATE_OF_BIRTH
115 FROM PER_ALL_PEOPLE_F
116 WHERE PERSON_ID = V_PERSON_ID
117 AND P_REGULAR_PAYMENT_DATE BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE;
118 --Cursor for aggregated case
119 CURSOR C_ASSIGNMENTS_AGG(V_PERSON_ID NUMBER)
120 IS
121 SELECT PAAF.ASSIGNMENT_ID,
122 PAAF.PAYROLL_ID
123 FROM PER_ALL_ASSIGNMENTS_F PAAF,
124 PER_ASSIGNMENT_STATUS_TYPES PAST
125 WHERE PAAF.PERSON_ID = V_PERSON_ID
126 AND PAAF.ASSIGNMENT_STATUS_TYPE_ID = PAST.ASSIGNMENT_STATUS_TYPE_ID
127 -- AND PAST.PAY_SYSTEM_STATUS='P'
128 AND PAST.PER_SYSTEM_STATUS <> 'TERM_ASSIGN'
129 AND L_PRP_END_DATE BETWEEN PAAF.EFFECTIVE_START_DATE AND PAAF.EFFECTIVE_END_DATE;
130 CURSOR C_PERSON_ID
131 IS
132 SELECT PERSON_ID
133 FROM PER_ALL_ASSIGNMENTS_F
134 WHERE ASSIGNMENT_ID =P_ASSIGNMENT_ID
135 AND L_PRP_END_DATE BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE;
136 --Remove as it is already defined in the Header
137 CURSOR C_DEF_BAL
138 IS
139 SELECT PDB.DEFINED_BALANCE_ID
140 FROM PAY_BALANCE_TYPES PBT,
141 PAY_DEFINED_BALANCES PDB,
142 PAY_BALANCE_DIMENSIONS PBD
143 WHERE PDB.BALANCE_TYPE_ID=PBT.BALANCE_TYPE_ID
144 AND PBT.BALANCE_NAME LIKE 'Pension Qualifying Earnings'
145 AND PBD.DATABASE_ITEM_SUFFIX='_ASG_RUN'
146 AND PBD.BALANCE_DIMENSION_ID=PDB.BALANCE_DIMENSION_ID;
147 --Remove as it is already defined in the Header
148 --To Get the Payroll Id of the Assignment
149 CURSOR C_PAYROLL_ID
150 IS
151 SELECT PAYROLL_ID,
152 BUSINESS_GROUP_ID
153 FROM PER_ALL_ASSIGNMENTS_F
154 WHERE ASSIGNMENT_ID=P_ASSIGNMENT_ID
155 AND P_REGULAR_PAYMENT_DATE BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE;
156 -- To get PRP Dates Corresponding to the Payroll's Date Paid
157 CURSOR C_PRP_DETAILS
158 IS
159 SELECT START_DATE,
160 END_DATE
161 FROM PER_TIME_PERIODS PTP
162 WHERE P_REGULAR_PAYMENT_DATE BETWEEN START_DATE AND END_DATE
163 AND PAYROLL_ID=L_PAYROLL_ID;
164 --To get the Period_type
165 CURSOR C_PERIOD_TYPE(V_PAYROLL_ID NUMBER)
166 IS
167 SELECT period_type
168 FROM pay_payrolls_f
169 WHERE payroll_id = V_PAYROLL_ID
170 AND L_PRP_END_DATE BETWEEN effective_start_date AND effective_end_date ;
171 --Changed for Pensions 2 - to fetch all the assignment actions for the assignment within the PRP
172 CURSOR C_ASSIGNMENT_ACTION(P_ASSIGNMENT_ID NUMBER)
173 IS
174 SELECT ASSIGNMENT_ACTION_ID,
175 PPA.EFFECTIVE_DATE DATE_PAID,
176 ptp.end_date DATE_EARNED,
177 ptp.TIME_PERIOD_ID,
178 ptp.PAYROLL_ID
179 FROM PAY_PAYROLL_ACTIONS PPA,
180 PAY_ASSIGNMENT_ACTIONS PAA,
181 PER_TIME_PERIODS PTP
182 WHERE PPA.PAYROLL_ACTION_ID=PAA.PAYROLL_ACTION_ID
183 AND REGULAR_PAYMENT_DATE = PPA.EFFECTIVE_DATE
184 AND ptp.TIME_PERIOD_ID = PPA.TIME_PERIOD_ID
185 -- AND PPA.TIME_PERIOD_ID = NVL(P_TIME_PERIOD,PPA.TIME_PERIOD_ID)
186 AND ASSIGNMENT_ID =P_ASSIGNMENT_ID
187 AND PPA.ACTION_TYPE IN ('Q','R')
188 AND PPA.EFFECTIVE_DATE BETWEEN L_PRP_START_DATE AND L_PRP_END_DATE
189 -- AND BUSINESS_GROUP_ID =G_BUSINESS_GROUP_ID
190 AND PAA.ACTION_STATUS ='C'
191 AND SOURCE_ACTION_ID IS NOT NULL
192 ORDER BY TIME_PERIOD_ID,
193 ASSIGNMENT_ACTION_ID DESC;
194 --Cursor to check for Aggregation as on PRP End date
195 CURSOR C_AGGREGATION_CHECK(V_ASSIGNMENT_ID NUMBER)
196 IS
197 SELECT MAX(DECODE(pivf.name,'Aggregate Earnings',peevf.screen_entry_value)) Agg_earnings,
198 MAX(DECODE(pivf.name,'Main Entry for Aggregation',peevf.screen_entry_value)) Main_entry
199 FROM per_all_assignments_f paaf,
200 pay_element_types_f petf,
201 pay_input_values_f pivf,
202 pay_element_entries_f peef,
203 pay_element_entry_values_f peevf
204 WHERE paaf.assignment_id = V_ASSIGNMENT_ID
205 AND petf.element_name ='Pensions Information'
206 AND petf.legislation_code = 'GB'
207 AND pivf.name IN ( 'Aggregate Earnings','Main Entry for Aggregation')
208 AND pivf.legislation_code = 'GB'
209 AND pivf.element_type_id = petf.element_type_id
210 AND peef.element_type_id = petf.element_type_id
211 AND peef.assignment_id = paaf.assignment_id
212 AND peef.element_entry_id = peevf.element_entry_id
213 AND pivf.input_value_id = peevf.input_value_id
214 AND L_PRP_END_DATE BETWEEN paaf.effective_start_date AND paaf.effective_end_date
215 AND L_PRP_END_DATE BETWEEN petf.effective_start_date AND petf.effective_end_date
216 AND L_PRP_END_DATE BETWEEN pivf.effective_start_date AND pivf.effective_end_date
217 AND L_PRP_END_DATE BETWEEN peef.effective_start_date AND peef.effective_end_date
218 AND L_PRP_END_DATE BETWEEN peevf.effective_start_date AND peevf.effective_end_date;
219 --Cursor to check if AutoEnrollment has been done already or not
220 CURSOR C_AED_CHECK(V_ASSIGNMENT_ID NUMBER)
221 IS
222 SELECT MAX(DECODE(pivf.name,'Auto Enrollment Date',peevf.screen_entry_value)) AED,
223 MAX(DECODE(pivf.name,'Qualifying scheme exists',peevf.screen_entry_value)) QSE,
224 MAX(DECODE(pivf.name,'Opt Out Date',peevf.screen_entry_value)) OPT_OUT,
225 MAX(DECODE(pivf.name,'Postponement End Date',peevf.screen_entry_value)) POSTPONEMENT,
226 MAX(DECODE(pivf.name,'Eligible Job Holder Date',peevf.screen_entry_value)) EJH
227 FROM per_all_assignments_f paaf,
228 pay_element_types_f petf,
229 pay_input_values_f pivf,
230 pay_element_entries_f peef,
231 pay_element_entry_values_f peevf
232 WHERE paaf.assignment_id = V_ASSIGNMENT_ID
233 AND petf.element_name ='Pensions Information'
234 AND petf.legislation_code = 'GB'
235 AND pivf.name IN ( 'Auto Enrollment Date', 'Opt Out Date','Postponement End Date','Qualifying scheme exists','Eligible Job Holder Date')
236 AND pivf.legislation_code = 'GB'
237 AND pivf.element_type_id = petf.element_type_id
238 AND peef.element_type_id = petf.element_type_id
239 AND peef.assignment_id = paaf.assignment_id
240 AND peef.element_entry_id = peevf.element_entry_id
241 AND pivf.input_value_id = peevf.input_value_id
242 AND L_PRP_END_DATE BETWEEN paaf.effective_start_date AND paaf.effective_end_date
243 AND L_PRP_END_DATE BETWEEN petf.effective_start_date AND petf.effective_end_date
244 AND L_PRP_END_DATE BETWEEN pivf.effective_start_date AND pivf.effective_end_date
245 AND L_PRP_END_DATE BETWEEN peef.effective_start_date AND peef.effective_end_date
246 AND L_PRP_END_DATE BETWEEN peevf.effective_start_date AND peevf.effective_end_date;
247 BEGIN
248 -- Defined Balance Id
249 OPEN C_DEF_BAL;
250 FETCH C_DEF_BAL INTO L_DEFINED_BALANCE_ID;
251 CLOSE C_DEF_BAL;
252 hr_utility.trace('Balance defined id is:'||L_DEFINED_BALANCE_ID);
253 -- hr_utility.trace('Main Entry is:'||P_MAIN_ENTRY);
254 --Payroll Id
255 OPEN C_PAYROLL_ID;
256 FETCH C_PAYROLL_ID INTO L_PAYROLL_ID,L_BUSINESS_GROUP_ID;
257 CLOSE C_PAYROLL_ID;
258 --PRP Dates
259 OPEN C_PRP_DETAILS;
260 FETCH C_PRP_DETAILS INTO L_PRP_START_DATE,L_PRP_END_DATE;
261 CLOSE C_PRP_DETAILS;
262 --Person Id
263 OPEN C_PERSON_ID;
264 FETCH C_PERSON_ID INTO L_PERSON_ID;
265 CLOSE C_PERSON_ID;
266 --Global Details
267 /*
268 OPEN C_GET_GLOBAL_VALUE;
269 FETCH C_GET_GLOBAL_VALUE INTO G_GLOBAL_VALUE;
270 CLOSE C_GET_GLOBAL_VALUE;
271 */
272 OPEN C_AGE_SEX(L_PERSON_ID);
273 FETCH C_AGE_SEX INTO L_AGE,L_SEX,L_DATE_OF_BIRTH;
274 CLOSE C_AGE_SEX;
275 /* 16409174 - PAE THRESHOLD CHANGES start*/
276 OPEN c_asg_start_date;
277 FETCH c_asg_start_date INTO l_asg_start_date ;
278 CLOSE c_asg_start_date;
279
280 OPEN C_SERVICE_START (L_PERSON_ID) ;
281 FETCH C_SERVICE_START INTO L_SERVICE_START;
282 CLOSE C_SERVICE_START;
283 -- 22nd Birthday
284 L_DOB_TT := FETCH_START_DATE(L_DATE_OF_BIRTH);
285
286 IF ((L_DOB_TT BETWEEN L_PRP_START_DATE AND L_PRP_END_DATE) OR (L_SERVICE_START BETWEEN L_PRP_START_DATE AND L_PRP_END_DATE)) THEN
287 L_EFFECTIVE_DATE := GREATEST(L_DOB_TT,L_SERVICE_START,l_asg_start_date);
288 G_GLOBAL_VALUE := NULL;
289 OPEN C_GET_GLOBAL_VALUE(L_EFFECTIVE_DATE);
290 FETCH C_GET_GLOBAL_VALUE INTO G_GLOBAL_VALUE;
291 CLOSE C_GET_GLOBAL_VALUE;
292 hr_utility.trace('C_GET_GLOBAL_VALUE fetched is:'||G_GLOBAL_VALUE.G_QE_MONTHLY_LT||'-'||G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_MONTHLY);
293 end if;
294 /* 16409174 - PAE THRESHOLD CHANGES end*/
295
296
297 ---Aggregation
298 OPEN C_AGGREGATION_CHECK(P_ASSIGNMENT_ID);
299 FETCH C_AGGREGATION_CHECK INTO L_AGGREGATION,L_MAIN_ENTRY;
300 CLOSE C_AGGREGATION_CHECK;
301 hr_utility.trace('Period Type: '||L_PERIOD_TYPE);
302 IF (NVL(L_AGGREGATION,'N') ='N') THEN
303 OPEN C_PERIOD_TYPE(L_PAYROLL_ID);
304 FETCH C_PERIOD_TYPE INTO L_PERIOD_TYPE;
305 CLOSE C_PERIOD_TYPE;
306 ELSIF NVL(L_MAIN_ENTRY,'N') = 'Y' AND NVL(L_AGGREGATION,'N') ='Y' THEN
307 OPEN C_PERIOD_TYPE(L_PAYROLL_ID);
308 FETCH C_PERIOD_TYPE INTO L_PERIOD_TYPE;
309 CLOSE C_PERIOD_TYPE;
310 END IF;
311 hr_utility.trace('L_PRP_END_DATE: '||L_PRP_END_DATE);
312 hr_utility.trace('L_PAYROLL_ID: '||L_PAYROLL_ID);
313 hr_utility.trace('Period Type: '||L_PERIOD_TYPE);
314 IF NVL(L_AGGREGATION,'N') ='N' THEN
315 FOR L_ASSIGNMENT_ACTIONS IN C_ASSIGNMENT_ACTION(P_ASSIGNMENT_ID)
316 LOOP
317 L_BALANCE_VALUE := L_BALANCE_VALUE+PAY_BALANCE_PKG.GET_VALUE ( P_DEFINED_BALANCE_ID =>L_DEFINED_BALANCE_ID ,P_ASSIGNMENT_ACTION_ID=>L_ASSIGNMENT_ACTIONS.ASSIGNMENT_ACTION_ID ,P_GET_RR_ROUTE => FALSE ,
318 P_GET_RB_ROUTE => FALSE) ;
319 END LOOP;
320 END IF;
321 IF NVL(L_AGGREGATION,'N') ='Y' THEN
322 FOR ALL_ASSGN IN C_ASSIGNMENTS_AGG(L_PERSON_ID)
323 LOOP
324 FOR V_ASSIGNMENT_ACTIONS IN C_ASSIGNMENT_ACTION(ALL_ASSGN.ASSIGNMENT_ID)
325 LOOP
326 L_BALANCE_VALUE := L_BALANCE_VALUE+PAY_BALANCE_PKG.GET_VALUE ( P_DEFINED_BALANCE_ID =>L_DEFINED_BALANCE_ID ,P_ASSIGNMENT_ACTION_ID=>V_ASSIGNMENT_ACTIONS.ASSIGNMENT_ACTION_ID ,P_GET_RR_ROUTE => FALSE ,
327 P_GET_RB_ROUTE => FALSE) ;
328 IF L_PERIOD_TYPE IS NULL THEN
329 OPEN C_AGGREGATION_CHECK(ALL_ASSGN.ASSIGNMENT_ID);
330 FETCH C_AGGREGATION_CHECK INTO L_AGGREGATION,L_MAIN_ENTRY;
331 CLOSE C_AGGREGATION_CHECK;
332 IF NVL(L_MAIN_ENTRY,'N') = 'Y' THEN
333 OPEN C_PERIOD_TYPE(ALL_ASSGN.PAYROLL_ID);
334 FETCH C_PERIOD_TYPE INTO L_PERIOD_TYPE;
335 CLOSE C_PERIOD_TYPE;
336 END IF;
337 END IF;
338 END LOOP;
339 END LOOP;
340 END IF;
341 IF L_PERIOD_TYPE IS NULL THEN
342 hr_utility.trace('No Main Entry Found for Aggregation as on '||L_PRP_END_DATE||'. Please Check');
343 END IF;
344 L_TOTAL_QUAL_EARNINGS := L_BALANCE_VALUE +NVL(P_PQE_ASG_RUN,0);
345 ------------------Earnings Calculated ----------------------------
346 IF L_AGE >= 59 THEN
347 --Pension age calculation needs to be done only if age >= 59
348 IF L_SEX = 'M' THEN
349 N_STATE_PENSION_AGE := 65;
350 ELSIF L_SEX = 'F' THEN
351 IF L_DATE_OF_BIRTH >= TO_DATE('1955/04/06','YYYY/MM/DD') THEN
352 /* The retirement age for Employees born after 6th April 1955 is 65 */
353 N_STATE_PENSION_AGE := 65;
354 ELSIF L_DATE_OF_BIRTH >= TO_DATE('1950/04/06','YYYY/MM/DD') THEN
355 /* For employee born between 6 April 1950 and 6th April 1955, the retirement date will be derived from the user table */
356 /* Convert the Birth date of the employee to YYYYMMDD format. */
357 L_NUM_DATE_BIRTH := TO_CHAR(L_DATE_OF_BIRTH,'YYYYMMDD');
358 /* Pass the birth date and get the retire date corresponding to birth date. */
359 RETIRE_DATE := TO_DATE(HRUSERDT.GET_TABLE_VALUE(L_BUSINESS_GROUP_ID,'STATE_RETIREMENT_AGE_FOR_WOMEN','STATE_PENSION_AGE',L_NUM_DATE_BIRTH,L_PRP_END_DATE),'YYYY/MM/DD');
360 N_STATE_PENSION_AGE := TRUNC((RETIRE_DATE - L_DATE_OF_BIRTH)/365);
361 END IF; --l_date_of_birth
362 END IF; -- l_sex
363 ELSE
364 N_STATE_PENSION_AGE := 65;
365 END IF; --Age >= 59
366 hr_utility.trace('N_STATE_PENSION_AGE: '||N_STATE_PENSION_AGE);
367 ---------------------------State Pension Age calculated--------------------------
368 IF L_PERIOD_TYPE = 'Week' THEN
369 L_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_WEEKLY;
370 L_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_WEEKLY_LT;
371 ELSIF L_PERIOD_TYPE = 'Calendar Month' THEN
372 L_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_MONTHLY ;
373 L_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_MONTHLY_LT ;
374 ELSIF L_PERIOD_TYPE = 'Year' THEN
375 L_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_ANNUAL;
376 L_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_ANNUAL_LT;
377 ELSIF L_PERIOD_TYPE = 'Quarter' THEN
378 L_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_QUARTERLY ;
379 L_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_QUARTERLY_LT;
380 ELSIF L_PERIOD_TYPE = 'Lunar Month' THEN
381 L_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_LUNAR ;
382 L_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_LUNAR_LT;
383 ELSIF L_PERIOD_TYPE = 'Bi-Week' THEN
384 L_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_BIWEEK;
385 L_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_BIWEEK_LT;
386 ELSIF L_PERIOD_TYPE = 'Semi-Year' THEN
387 L_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_SEMIYEAR;
388 L_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_SEMIYEAR_LT ;
389 ELSIF L_PERIOD_TYPE = 'Bi-Month' THEN -- Monthly's Threshold multiplied by 2
390 L_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_MONTHLY * 2;
391 L_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_MONTHLY_LT * 2;
392 END IF;
393 ---------------------------Threshold values -------------------------
394 IF ((L_AGE BETWEEN 22 AND N_STATE_PENSION_AGE) AND (L_TOTAL_QUAL_EARNINGS >= L_AUTOTHRESHOLD)) THEN
395 L_EMPLOYEE_STATUS := 1; --Eligible Job holder
396 ELSIF ((L_AGE BETWEEN 16 AND 75) AND (L_TOTAL_QUAL_EARNINGS >= L_LOWER_THRESHOLD AND L_TOTAL_QUAL_EARNINGS < L_AUTOTHRESHOLD)) THEN
397 L_EMPLOYEE_STATUS := 2;--Non Eligible Job holder
398 ELSIF ((L_AGE BETWEEN 16 AND 22 OR L_AGE BETWEEN N_STATE_PENSION_AGE AND 75 ) AND (L_TOTAL_QUAL_EARNINGS >= L_AUTOTHRESHOLD)) THEN
399 L_EMPLOYEE_STATUS := 2;--Non Eligible Job holder
400 ELSE
401 L_EMPLOYEE_STATUS := 3;--Worker
402 END IF;
403 ---------------------------Employee Status Calculated------------------
404 OPEN C_AED_CHECK(P_ASSIGNMENT_ID);
405 FETCH C_AED_CHECK
406 INTO L_AUTO_ENROL_DATE,
407 L_QUALIFYING_SCHEME_EXISTS,
408 L_OPTOUT_DATE,
409 L_POSTPONEMENT_DATE ,
410 L_ELIGIBLE_JOB_HOLDER_DATE ;
411 CLOSE C_AED_CHECK;
412 --IF L_AUTO_ENROL_DATE IS NOT NULL THEN
413 --L_AUTO_ENROL_DATE := L_AUTO_ENROL_DATE);
414 --END IF;
415 hr_utility.trace('L_EMPLOYEE_STATUS: '||L_EMPLOYEE_STATUS);
416 hr_utility.trace('L_AUTO_ENROL_DATE: '||L_AUTO_ENROL_DATE);
417 L_QUALIFYING_SCHEME_EXISTS := NVL(L_QUALIFYING_SCHEME_EXISTS,'N');
418 hr_utility.trace('L_QUALIFYING_SCHEME_EXISTS: '||L_QUALIFYING_SCHEME_EXISTS);
419 --Bug 15872415
420 IF (L_ELIGIBLE_JOB_HOLDER_DATE IS NULL) then
421 return 0; -- Do Nothing
422 END IF;
423 --Bug 14793919
424 -- IF (L_QUALIFYING_SCHEME_EXISTS ='Y') THEN
425 IF (L_QUALIFYING_SCHEME_EXISTS ='Y') AND L_AUTO_ENROL_DATE IS NULL THEN -- Qualifying scheme already exists.
426 RETURN 0; -- Do Nothing if Qualifying Scheme Exists Already
427 END IF;
428 --Bug 14793919
429 IF (NVL(fnd_date.canonical_to_date(L_OPTOUT_DATE),G_END_OF_TIME) > L_PRP_END_DATE) THEN
430 IF (NVL(fnd_date.canonical_to_date(L_POSTPONEMENT_DATE),L_PRP_START_DATE) < L_PRP_END_DATE) THEN
431 IF (L_EMPLOYEE_STATUS =1) THEN
432 IF L_AUTO_ENROL_DATE IS NULL THEN
433 L_ERROR :=1; -- Qualified Yet Not Automatically Enrolled - Could be any reason like Postponement or Qualifying scheme already exists.
434 ELSIF L_AUTO_ENROL_DATE IS NOT NULL AND fnd_date.canonical_to_date(L_AUTO_ENROL_DATE) BETWEEN L_PRP_START_DATE AND L_PRP_END_DATE THEN
435 L_ERROR :=3; --Qualified and Automatically Enrolled
436 END IF;
437 END IF;
438 END IF;--Postponement
439 END IF; --Opt Out
440 IF (L_EMPLOYEE_STATUS <>1) THEN
441 IF L_AUTO_ENROL_DATE IS NOT NULL AND fnd_date.canonical_to_date(L_AUTO_ENROL_DATE) BETWEEN L_PRP_START_DATE AND L_PRP_END_DATE THEN
442 L_ERROR :=2; -- Not qualified, but has been automatically enrolled.
443 END IF;
444 END IF;
445 RETURN NVL(L_ERROR,0);
446 -- RETURN L_TOTAL_QUAL_EARNINGS;
447 EXCEPTION
448 WHEN OTHERS THEN
449 hr_utility.trace('Error:'||sqlerrm);
450 -- RETURN NVL(L_ERROR,0);
451 RAISE;
452 END GET_AGGREGATED_EARNINGS;
453 ----------------------------------------------------------------------------
454 --To Get assignment Number
455 FUNCTION get_assg_number(
456 p_assignment_id NUMBER)
457 RETURN VARCHAR2
458 IS
459 l_assignment_number VARCHAR2(240);
460 BEGIN
461 OPEN get_assignment_number (p_assignment_id);
462 FETCH get_assignment_number INTO l_assignment_number;
463 CLOSE get_assignment_number;
464 RETURN l_assignment_number;
465 END;
466 ----------------------------------------------------------------------------
467
468 ---To Fetch MAX Deferment Period Start Date of the employee
469 -- 3 months
470 /*FUNCTION C_PAYROLL_MAX_DATE(
471 P_DATE DATE)
472 RETURN DATE
473 IS
474 L_DATE DATE;
475 CURSOR C_MAX_DATE
476 IS
477 SELECT (PTP.START_DATE-1)
478 FROM PER_TIME_PERIODS PTP
479 WHERE ADD_MONTHS(P_DATE,3) BETWEEN START_DATE AND END_DATE
480 AND PAYROLL_ID=G_PAYROLL_ID;
481 BEGIN
482 OPEN C_MAX_DATE;
483 FETCH C_MAX_DATE INTO L_DATE;
484 CLOSE C_MAX_DATE;
485 RETURN L_DATE;
486 END C_PAYROLL_MAX_DATE;
487 */
488
489 FUNCTION C_PAYROLL_MAX_DATE(
490 P_DATE DATE,PERIOD VARCHAR2 default null)
491 RETURN DATE
492 IS
493 L_DATE DATE;
494 L_DAY NUMBER;
495
496 CURSOR C_MAX_DATE
497 IS
498 SELECT (PTP.START_DATE-1)
499 FROM PER_TIME_PERIODS PTP
500 WHERE ADD_MONTHS(P_DATE,3) BETWEEN START_DATE AND END_DATE
501 AND PAYROLL_ID=G_PAYROLL_ID;
502
503 BEGIN
504 hr_utility.trace('P_DATE: '||P_DATE);
505 hr_utility.trace('PERIOD: '||PERIOD);
506
507 L_DATE := P_DATE;
508 if PERIOD is not null then
509 if PERIOD = 'MAX_DEFER_PERIOD_START_DATE' then
510 OPEN C_MAX_DATE;
511 FETCH C_MAX_DATE INTO L_DATE;
512 CLOSE C_MAX_DATE;
513 elsif PERIOD = 'NEXT_PAYROLL_PERIOD_START_DATE' then
514 L_DATE := G_PRP_END_DATE;
515 elsif PERIOD = 'ONE_MONTH' then
516 L_DATE := ADD_MONTHS(L_DATE,1)-1;
517 elsif PERIOD = 'TWO_MONTH' then
518 L_DATE := ADD_MONTHS(L_DATE,2)-1;
519 else
520 L_DATE := L_DATE + TO_NUMBER(PERIOD) -1;
521 end if;
522 end if;
523 hr_utility.trace('L_DATE: '||L_DATE);
524 RETURN L_DATE;
525 END C_PAYROLL_MAX_DATE;
526
527 PROCEDURE update_ni_category_pension(
528 p_assignment_id IN NUMBER,
529 p_auto_enrol_date IN DATE,
530 p_mode in VARCHAR2 --GB_VALIDATE_COMMIT
531 )
532 IS
533 /*** Local variables ***/
534 l_ni_new_category varchar2(1) := ' ';
535 l_ni_new_pension varchar2(30) := ' ';
536 l_ni_old_category varchar2(1) := ' ';
537 l_ni_old_pension varchar2(30) := ' ';
538 l_input_value_id_category number := -1;
539 l_input_value_id_pension number := -1;
540 l_element_entry_id number := -1;
541 l_input_value_name varchar2(50) := ' ';
542 l_update_flag varchar2(1) := 'N';
543
544 TYPE pen_basis_type IS TABLE OF VARCHAR2(30) INDEX BY VARCHAR2(1);
545 pen_basis pen_basis_type;
546 -- Cursor retrieves all the element entries that are to be updated.
547
548 cursor csr_element_entries_for_update
549 is
550 SELECT peevf.*
551 FROM pay_element_types_f petf
552 ,pay_input_values_f pivf
553 ,pay_element_entries_f peef
554 ,pay_element_entry_values_f peevf
555 WHERE
556 petf.element_name = 'NI'
557 AND petf.legislation_code = 'GB'
558 AND petf.element_type_id = pivf.element_type_id
559 AND peef.assignment_id = p_assignment_id
560 AND peef.element_type_id = petf.element_type_id
561 AND peef.element_entry_id = peevf.element_entry_id
562 AND peevf.input_value_id = pivf.input_value_id
563 AND pivf.name in ('Category','Pension')
564 AND p_auto_enrol_date BETWEEN peef.effective_start_date
565 AND peef.effective_end_date
566 AND p_auto_enrol_date BETWEEN peevf.effective_start_date
567 AND peevf.effective_end_date
568 AND p_auto_enrol_date BETWEEN petf.effective_start_date AND petf.effective_end_date
569 AND p_auto_enrol_date BETWEEN pivf.effective_start_date AND pivf.effective_end_date;
570
571 cursor c_get_input_value_name(l_input_value_id NUMBER)
572 is
573 select name
574 from pay_input_values_f
575 where input_value_id = l_input_value_id
576 AND LEGISLATION_CODE = 'GB';
577
578 l_rec csr_element_entries_for_update%rowtype;
579
580 BEGIN
581 hr_utility.trace('Entering ' || '.update_ni_category_pension');
582 hr_utility.trace('Auto Enrollment Date = ' || p_auto_enrol_date);
583 hr_utility.trace('Validate_mode' ||p_mode);
584
585 -- Initialization
586 pen_basis('A') := 'APP not contracted out';
587 pen_basis('C') := 'Contracted out';
588 pen_basis('M') := 'Contracted Out Money Purchase';
589 pen_basis('N') := 'Not contracted out';
590 pen_basis('X') := 'N/A for Category X';
591
592 open csr_element_entries_for_update;
593 loop
594 fetch csr_element_entries_for_update into l_rec;
595 exit when csr_element_entries_for_update%notfound;
596
597 -- get the input_value_name for element entry values.
598 open c_get_input_value_name(l_rec.input_value_id);
599 fetch c_get_input_value_name into l_input_value_name;
600 close c_get_input_value_name;
601
602 l_element_entry_id := l_rec.element_entry_id;
603 if l_input_value_name = 'Category' then
604 l_ni_old_category := l_rec.screen_entry_value ;
605 l_input_value_id_category := l_rec.input_value_id;
606 elsif l_input_value_name = 'Pension' then
607 l_ni_old_pension := l_rec.screen_entry_value ;
608 l_input_value_id_pension := l_rec.input_value_id;
609 end if;
610
611 end loop;
612 close csr_element_entries_for_update;
613
614 --Determine the new pension basis for each category.
615 /* For reference below are the lookups and their meanings.
616 Lookup Code Meaning
617 ----------- -------
618 A APP not contracted out
619 C Contracted out
620 M Contracted Out Money Purchase
621 N Not contracted out
622 X N/A for Category X
623
624 */
625
626 -- determine the new category and new pension basis for this element entry.
627 if l_ni_old_category = 'A' THEN
628 l_ni_new_category := 'D';
629 l_ni_new_pension := 'C';
630 l_update_flag := 'Y';
631 elsif l_ni_old_category = 'B' THEN
632 l_ni_new_category := 'E';
633 l_ni_new_pension := 'C';
634 l_update_flag := 'Y';
635 elsif l_ni_old_category = 'J' THEN
636 l_ni_new_category := 'L';
637 l_ni_new_pension := 'C';
638 l_update_flag := 'Y';
639 end if;
640
641
642 SAVEPOINT update_NI_element;
643 if p_mode = 'GB_VALIDATE_COMMIT' and l_update_flag = 'Y' THEN
644 -- Call the update api in UPDATE_OVERRIDE mode for updating the element entries for future entries as well.
645 hr_entry_api.update_element_entry(p_dt_update_mode => 'UPDATE_OVERRIDE',
646 p_session_date => p_auto_enrol_date,
647 p_element_entry_id => l_element_entry_id,
648 p_input_value_id1 => l_input_value_id_category,
649 p_input_value_id2 => l_input_value_id_pension,
650 p_entry_value1 => l_ni_new_category,
651 p_entry_value2 => pen_basis(l_ni_new_pension)
652 );
653
654
655
656 hr_utility.trace('Assignment_id Element_entry_id Old NI Category New NI Category Old Pension Basis New Pension Basis Eff Date');
657 hr_utility.trace('------------- ---------------- -------------- --------------- ----------------- ----------------- --------');
658
659 hr_utility.trace(p_assignment_id ||' ' || l_element_entry_id||' ' ||l_ni_old_category||' ' ||l_ni_new_category
660 ||' ' ||l_ni_old_pension||' ' ||l_ni_new_pension);
661
662
663 hr_utility.trace(p_assignment_id ||' ' || l_element_entry_id|| ' Updated Successfully');
664
665 hr_utility.trace('Leaving ' || '.update_ni_catergory_and_pension');
666 end if;
667 if not (p_mode = 'GB_VALIDATE_COMMIT') THEN
668 ROLLBACK to update_NI_element;
669 end if;
670
671 EXCEPTION
672 WHEN OTHERS THEN
673 hr_utility.trace('Error While Updating NI category');
674 hr_utility.trace('SQLERRM'||sqlerrm);
675 --RAISE_APPLICATION_ERROR(-20001, SQLCODE||' - '||SQLERRM);
676 RAISE;
677 END update_ni_category_pension;
678
679 PROCEDURE FETCH_DATA
680 IS
681 --
682 P_PAYROLL_ID NUMBER;
683 P_TIME_PERIOD_ID NUMBER;
684 -- Concurrent Program Parameters
685 CURSOR CSR_CP_INFO
686 IS
687 SELECT TO_NUMBER(PAY_GB_EOY_ARCHIVE.GET_PARAMETER(LEGISLATIVE_PARAMETERS, 'PAYROLL_ID')) PAYROLL_ID,
688 TO_NUMBER(PAY_GB_EOY_ARCHIVE.GET_PARAMETER(LEGISLATIVE_PARAMETERS, 'PERIOD_ID')) TIME_PERIOD_ID,
689 PAY_GB_EOY_ARCHIVE.GET_PARAMETER(LEGISLATIVE_PARAMETERS,'MODE') L_MODE,
690 BUSINESS_GROUP_ID
691 FROM PAY_PAYROLL_ACTIONS
692 WHERE PAYROLL_ACTION_ID = G_PAYROLL_ACTION_ID ;
693 --Tax details Reference for staging date and postponement rule.
694 CURSOR C_TAX_REF_PENSION_DETAILS
695 IS
696 SELECT UPPER(SUBSTR(TRIM(HOI.ORG_INFORMATION2),1,35)) PENSION_STAGING_DATE,
697 NVL(UPPER(SUBSTR(LTRIM(HOI.ORG_INFORMATION3),1,35)),'NONE') WORKER_POSTPONEMENT_RULE,
698 NVL(UPPER(SUBSTR(LTRIM(HOI.ORG_INFORMATION4),1,35)),'NONE') ELIGIBLE_POSPONEMENT_RULE,
699 PPF.PERIOD_TYPE
700 FROM PAY_PAYROLLS_F PPF,
701 HR_SOFT_CODING_KEYFLEX HSCF,
702 HR_ORGANIZATION_INFORMATION HOI
703 WHERE PPF.PAYROLL_ID = P_PAYROLL_ID
704 AND PPF.BUSINESS_GROUP_ID = HOI.ORGANIZATION_ID
705 AND HOI.ORG_INFORMATION_CONTEXT = 'UK Pensions'
706 AND NVL(HOI.ORG_INFORMATION10,'UK') = 'UK'
707 AND PPF.SOFT_CODING_KEYFLEX_ID = HSCF.SOFT_CODING_KEYFLEX_ID
708 AND HSCF.SEGMENT1 = HOI.ORG_INFORMATION1
709 AND G_PRP_END_DATE BETWEEN PPF.EFFECTIVE_START_DATE AND PPF.EFFECTIVE_END_DATE;
710 --To fetch Payroll Period Dates
711 CURSOR C_PAYROLL_DETAILS
712 IS
713 SELECT PAYROLL_ID,
714 START_DATE,
715 END_DATE,
716 REGULAR_PAYMENT_DATE ,
717 PERIOD_NAME
718 FROM PER_TIME_PERIODS PTP
719 WHERE PTP.TIME_PERIOD_ID = P_TIME_PERIOD_ID;
720 --To fetch PRP Period Dates
721 CURSOR C_PRP_DETAILS
722 IS
723 SELECT START_DATE,
724 END_DATE,
725 REGULAR_PAYMENT_DATE
726 FROM PER_TIME_PERIODS PTP
727 WHERE G_PAYROLL_DATE_PAID BETWEEN START_DATE AND END_DATE
728 AND PAYROLL_ID=G_PAYROLL_ID;
729 --To Fetch Payroll Name
730 CURSOR C_PAYROLL_NAME
731 IS
732 SELECT PAYROLL_NAME
733 FROM PAY_PAYROLLS_F
734 WHERE PAYROLL_ID = G_PAYROLL_ID
735 AND G_PRP_END_DATE BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE;
736 --This cursor will check whether the default Pension element entered is a QUALIFYING pension scheme or not.
737 CURSOR C_VALIDATE_PENSION_INFO(P_SCHEME_ELEMENT_NAME VARCHAR2 )
738 IS
739 SELECT 1
740 FROM DUAL
741 WHERE EXISTS
742 (SELECT PCV_INFORMATION1
743 FROM PQP_CONFIGURATION_VALUES
744 WHERE PCV_INFORMATION_CATEGORY = 'PAY_GB_QUALIFIED_PENSIONS_INFO'
745 AND BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID
746 AND PCV_INFORMATION2 = P_SCHEME_ELEMENT_NAME
747 );
748 L_TEMP NUMBER;
749 BEGIN
750 ------*********Assign all global values to null before assigning values
751 hr_utility.trace('Inside fetch data');
752 G_MODE := NULL;
753 G_PAYROLL_ID := NULL;
754 G_TIME_PERIOD_ID := NULL;
755 G_PAYROLL_START_DATE := NULL;
756 G_PAYROLL_END_DATE := NULL;
757 G_ELEMENT_DETAILS := NULL;
758 G_PENSION_STAGING_DATE := NULL;
759 G_WORKER_POSTPONEMENT_RULE := NULL;
760 G_ELIGIBLE_POSTPONEMENT_RULE:= NULL;
761 G_PAYROLL_PERIOD_TYPE := NULL;
762 G_GLOBAL_VALUE := NULL;
763 G_BUSINESS_GROUP_ID := NULL;
764 hr_utility.trace('Before Concurrent Program Info');
765 OPEN CSR_CP_INFO;
766 FETCH CSR_CP_INFO
767 INTO G_PAYROLL_ID,
768 G_TIME_PERIOD_ID,
769 G_MODE,
770 G_BUSINESS_GROUP_ID;
771 CLOSE CSR_CP_INFO;
772 --Remove Below Every Where use Global ##Just added for compiling purpose
773 P_PAYROLL_ID := G_PAYROLL_ID;
774 P_TIME_PERIOD_ID :=G_TIME_PERIOD_ID;
775 --Remove
776 hr_utility.trace('Before Defined Balance');
777 -- Defined Balance Id
778 OPEN C_DEF_BAL;
779 FETCH C_DEF_BAL INTO G_DEFINED_BALANCE_ID;
780 CLOSE C_DEF_BAL;
781 hr_utility.trace('Before payroll details');
782 -- Payroll Details
783 OPEN C_PAYROLL_DETAILS;
784 FETCH C_PAYROLL_DETAILS
785 INTO G_PAYROLL_ID,
786 G_PAYROLL_START_DATE,
787 G_PAYROLL_END_DATE,
788 G_PAYROLL_DATE_PAID ,
789 G_PERIOD_NAME ;
790 CLOSE C_PAYROLL_DETAILS;
791 ---PRP Details
792 OPEN C_PRP_DETAILS;
793 FETCH C_PRP_DETAILS INTO G_PRP_START_DATE, G_PRP_END_DATE, G_PRP_DATE_PAID ;
794 CLOSE C_PRP_DETAILS;
795 --PAYROLL NAME
796 OPEN C_PAYROLL_NAME;
797 FETCH C_PAYROLL_NAME INTO G_PAYROLL_NAME;
798 CLOSE C_PAYROLL_NAME;
799 -- EARNING PERIOD Details
800 OPEN C_EARN_PERIOD_DETAILS(G_PAYROLL_ID);
801 FETCH C_EARN_PERIOD_DETAILS
802 INTO G_TIME_PERIOD_ID,
803 G_EARN_START_DATE ,
804 G_EARN_END_DATE ,
805 G_EARN_DATE_PAID ;
806 CLOSE C_EARN_PERIOD_DETAILS;
807 hr_utility.trace('Values fetched from payroll :'||G_PAYROLL_ID||'START'||G_PAYROLL_START_DATE||'END'||G_PAYROLL_END_DATE||' G_DEFINED_BALANCE_ID'||G_DEFINED_BALANCE_ID);
808 hr_utility.trace('Values fetched for PRP :'||G_PAYROLL_ID||'START'||G_PRP_START_DATE||'END'||G_PRP_END_DATE||' G_DEFINED_BALANCE_ID'||G_DEFINED_BALANCE_ID);
809 hr_utility.trace('Values fetched for Earn :'||G_PAYROLL_ID||'START'||G_EARN_START_DATE||'END'||G_EARN_END_DATE||'PAYMENT DATE'||G_EARN_DATE_PAID);
810 hr_utility.trace('Values fetched from payroll:'||' G_PAYROLL_NAME :'||G_PAYROLL_NAME);
811 hr_utility.trace('Before C_PENSION_ELEMENT_INF details');
812 -- Element Details
813 OPEN C_PENSION_ELEMENT_INF;
814 FETCH C_PENSION_ELEMENT_INF INTO G_ELEMENT_DETAILS;
815 CLOSE C_PENSION_ELEMENT_INF;
816 hr_utility.trace('G_ELEMENT_DETAILS.G_ELEMENT_TYPE_ID:'||G_ELEMENT_DETAILS.G_ELEMENT_TYPE_ID);
817 hr_utility.trace('Before C_TAX_REF_PENSION_DETAILS details');
818 --TAX Ref Details
819 OPEN C_TAX_REF_PENSION_DETAILS;
820 FETCH C_TAX_REF_PENSION_DETAILS
821 INTO G_PENSION_STAGING_DATE,
822 G_WORKER_POSTPONEMENT_RULE,
823 G_ELIGIBLE_POSTPONEMENT_RULE,
824 G_PAYROLL_PERIOD_TYPE;
825 CLOSE C_TAX_REF_PENSION_DETAILS;
826 hr_utility.trace('Tax details fetched are:'||G_PENSION_STAGING_DATE||'-'||G_PAYROLL_PERIOD_TYPE||'-'||G_WORKER_POSTPONEMENT_RULE||'-'||G_ELIGIBLE_POSTPONEMENT_RULE);
827 hr_utility.trace('Before C_GET_GLOBAL_VALUE details');
828 --Global Details
829 OPEN C_GET_GLOBAL_VALUE(G_PRP_START_DATE);
830 FETCH C_GET_GLOBAL_VALUE INTO G_GLOBAL_VALUE;
831 CLOSE C_GET_GLOBAL_VALUE;
832 hr_utility.trace('C_GET_GLOBAL_VALUE fetched is:'||G_GLOBAL_VALUE.G_QE_MONTHLY_LT||'-'||G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_MONTHLY);
833 hr_utility.trace('Before C_GET_QUALIFYING_PENSION_INFO details');
834 EXCEPTION
835 WHEN OTHERS THEN
836 hr_utility.trace('Fetch data failed:'||SQLERRM);
837 -- END;
838 -- hr_utility.trace('End of fetch data');
839 END FETCH_DATA;
840 ------------------------------------------------------------------------------------------------
841 FUNCTION EXEC_FORMULA(
842 P_ASSIGNMENT_ID NUMBER,
843 P_ELEM_ENTRY_ID NUMBER,
844 P_STAT_PROC_RULE_ID NUMBER,
845 P_ASSACTID NUMBER,
846 P_FORMULA_ID NUMBER,
847 P_RESULT_RULE_NAME VARCHAR2 DEFAULT NULL)
848 RETURN NUMBER
849 IS
850 -- Fetch Original Entry Id for the Element Entry -- Bug 14080693
851 CURSOR C_ORIGINAL_ENTRY_ID
852 IS
853 SELECT ORIGINAL_ENTRY_ID
854 FROM pay_element_entries_f peef
855 WHERE peef.element_entry_id = P_ELEM_ENTRY_ID
856 AND g_payroll_end_date BETWEEN peef.effective_start_date AND peef.effective_end_date;
857 -- Fetch Element Type Id for the Element Entry Id -- Bug 14064422
858 CURSOR C_ELEMENT_TYPE_ID
859 IS
860 SELECT pelf.element_type_id
861 FROM pay_element_entries_f peef ,
862 pay_element_links_f pelf
863 WHERE pelf.element_link_id = peef.element_link_id
864 AND peef.element_entry_id = P_ELEM_ENTRY_ID
865 AND g_payroll_end_date BETWEEN peef.effective_start_date AND peef.effective_end_date
866 AND g_payroll_end_date BETWEEN pelf.effective_start_date AND pelf.effective_end_date;
867 -- Fetch The Latest Action Ids for the Assignment
868 CURSOR C_ACTION_IDS(P_ASSIGNMENT_ID NUMBER )
869 IS
870 SELECT PAA.ASSIGNMENT_ACTION_ID ASSIGNMENT_ACTION_ID ,
871 PPA.PAYROLL_ACTION_ID PAYROLL_ACTION_ID
872 FROM PAY_PAYROLL_ACTIONS PPA,
873 PAY_ASSIGNMENT_ACTIONS PAA
874 WHERE PPA.ACTION_TYPE IN ('Q','R')
875 AND PAA.ACTION_STATUS = 'C'
876 AND PPA.BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID
877 AND PAA.ASSIGNMENT_ID = P_ASSIGNMENT_ID
878 AND PPA.PAYROLL_ACTION_ID = PAA.PAYROLL_ACTION_ID
879 AND EFFECTIVE_DATE = G_PAYROLL_DATE_PAID--Check the date
880 ORDER BY ASSIGNMENT_ACTION_ID DESC;
881 CURSOR ELE_SCREEN_VALUE (P_ELEM_ENTRY_ID NUMBER)
882 IS
883 SELECT PEEF.SCREEN_ENTRY_VALUE,
884 PEEF.INPUT_VALUE_ID,
885 UPPER(REPLACE(PIVF.NAME,' ','_')) NAME
886 FROM PAY_ELEMENT_ENTRY_VALUES_F PEEF,
887 PAY_INPUT_VALUES_F PIVF
888 WHERE PEEF.ELEMENT_ENTRY_ID = P_ELEM_ENTRY_ID
889 AND PEEF.INPUT_VALUE_ID = PIVF.INPUT_VALUE_ID
890 AND g_payroll_end_date BETWEEN peef.EFFECTIVE_START_DATE AND peef.EFFECTIVE_END_DATE
891 AND g_payroll_end_date BETWEEN pivf.EFFECTIVE_START_DATE AND pivf.EFFECTIVE_END_DATE ;
892 CURSOR GET_PAY_VAL_RSLT_NAME(P_STAT_PROC_RULE_ID NUMBER, P_PAY_VALUE_ID NUMBER)
893 IS
894 SELECT RESULT_NAME
895 FROM PAY_FORMULA_RESULT_RULES_F FRR
896 WHERE STATUS_PROCESSING_RULE_ID = P_STAT_PROC_RULE_ID
897 AND RESULT_RULE_TYPE ='D'
898 AND INPUT_VALUE_ID = P_PAY_VALUE_ID
899 AND g_payroll_end_date BETWEEN FRR.EFFECTIVE_START_DATE AND FRR.EFFECTIVE_END_DATE ;
900 C_ACTION_IDS_ROW C_ACTION_IDS%ROWTYPE;
901 L_INPUTS FF_EXEC.INPUTS_T;
902 P_INPUTS FF_EXEC.INPUTS_T;
903 L_OUTPUTS FF_EXEC.OUTPUTS_T;
904 l_result_rule_name PAY_FORMULA_RESULT_RULES_F.RESULT_NAME%TYPE;
905 Iteration NUMBER;
906 l_pay_value_ivid NUMBER;
907 L_EARNINGS_VALUE NUMBER := 0;
908 l_element_type_id NUMBER ; -- Bug 14064422
909 l_original_entry_id NUMBER ; -- Bug 14080693
910 BEGIN
911 -- Bug 14064422
912 OPEN C_ELEMENT_TYPE_ID;
913 FETCH C_ELEMENT_TYPE_ID INTO l_element_type_id;
914 HR_UTILITY.trace('In Exec Formula - Element Type Id :'||l_element_type_id);
915 CLOSE C_ELEMENT_TYPE_ID;
916 -- Bug 14064422
917 HR_UTILITY.trace('In Exec Formula -Element Entry Id :'||P_ELEM_ENTRY_ID);
918 -- Bug 14080693
919 OPEN C_ORIGINAL_ENTRY_ID;
920 FETCH C_ORIGINAL_ENTRY_ID INTO l_original_entry_id;
921 HR_UTILITY.trace('In Exec Formula -Original Entry Id :'||l_original_entry_id);
922 CLOSE C_ORIGINAL_ENTRY_ID;
923 -- Bug 14080693
924 l_result_rule_name:=P_RESULT_RULE_NAME;
925 HR_UTILITY.trace(' Inside run Element FORMULA '||P_FORMULA_ID);
926 L_INPUTS.delete;
927 P_INPUTS.delete;
928 L_OUTPUTS.delete;
929 -- setting the contexts
930 P_INPUTS(1).name := 'ASSIGNMENT_ID';
931 P_INPUTS(1).value := P_ASSIGNMENT_ID;
932 P_INPUTS(2).name := 'DATE_EARNED';
933 P_INPUTS(2).value := FND_DATE.DATE_TO_CANONICAL(G_PAYROLL_END_DATE);
934 P_INPUTS(3).name := 'BUSINESS_GROUP_ID';
935 P_INPUTS(3).value := G_BUSINESS_GROUP_ID;
936 P_INPUTS(4).name := 'PAYROLL_ID';
937 P_INPUTS(4).value := G_PAYROLL_ID;
938 -- Bug 14064422
939 P_INPUTS(5).name := 'ELEMENT_TYPE_ID';
940 P_INPUTS(5).value := l_element_type_id;
941 -- Bug 14080693
942 P_INPUTS(6).name := 'ELEMENT_ENTRY_ID';
943 P_INPUTS(6).value := P_ELEM_ENTRY_ID;
944 P_INPUTS(7).name := 'ORIGINAL_ENTRY_ID';
945 P_INPUTS(7).value := NVL(l_original_entry_id, P_ELEM_ENTRY_ID);
946 -- Bug 14080693
947 --Bug 14615369
948 P_INPUTS(8).name := 'BALANCE_DATE';
949 P_INPUTS(8).value := FND_DATE.DATE_TO_CANONICAL(G_PAYROLL_END_DATE); -- Date Earned
950
951 --Bug 14615369
952 OPEN C_ACTION_IDS(P_ASSIGNMENT_ID);
953 FETCH C_ACTION_IDS INTO C_ACTION_IDS_ROW;
954 IF C_ACTION_IDS_ROW.ASSIGNMENT_ACTION_ID IS NOT NULL THEN
955 P_INPUTS(9).name := 'PAYROLL_ACTION_ID';
956 P_INPUTS(9).value := C_ACTION_IDS_ROW.PAYROLL_ACTION_ID;
957 P_INPUTS(10).name := 'ASSIGNMENT_ACTION_ID';
958 P_INPUTS(10).value := C_ACTION_IDS_ROW.ASSIGNMENT_ACTION_ID;
959 END IF;
960 IF C_ACTION_IDS%NOTFOUND THEN
961 HR_UTILITY.trace('No Action Ids Found for the Assignment');
962 P_INPUTS(9).name := 'PAYROLL_ACTION_ID';
963 P_INPUTS(9).value := G_PAYROLL_ACTION_ID;
964 P_INPUTS(10).name := 'ASSIGNMENT_ACTION_ID';
965 P_INPUTS(10).value := P_ASSACTID;
966 END IF;
967 CLOSE C_ACTION_IDS;
968 Iteration := 11;--Bug 14615369
969 -- Bug 14064422
970 /*
971 OPEN C_ACTION_IDS(P_ASSIGNMENT_ID);
972 FETCH C_ACTION_IDS INTO C_ACTION_IDS_ROW;
973 IF C_ACTION_IDS_ROW.ASSIGNMENT_ACTION_ID IS NOT NULL THEN
974 P_INPUTS(5).name := 'PAYROLL_ACTION_ID';
975 P_INPUTS(5).value := C_ACTION_IDS_ROW.PAYROLL_ACTION_ID;
976 P_INPUTS(6).name := 'ASSIGNMENT_ACTION_ID';
977 P_INPUTS(6).value := C_ACTION_IDS_ROW.ASSIGNMENT_ACTION_ID;
978 END IF;
979 IF C_ACTION_IDS%NOTFOUND THEN
980 HR_UTILITY.trace('No Action Ids Found for the Assignment');
981 P_INPUTS(5).name := 'PAYROLL_ACTION_ID';
982 P_INPUTS(5).value := G_PAYROLL_ACTION_ID;
983 P_INPUTS(6).name := 'ASSIGNMENT_ACTION_ID';
984 P_INPUTS(6).value := P_ASSACTID;
985 END IF;
986 CLOSE C_ACTION_IDS;
987 Iteration := 7;
988 */
989 FOR iter IN ELE_SCREEN_VALUE (P_ELEM_ENTRY_ID)
990 LOOP
991 HR_UTILITY.trace('Iteration value'||Iteration);
992 P_INPUTS(Iteration).name := iter.name;
993 P_INPUTS(Iteration).value := iter.screen_entry_value;
994 IF (iter.name = 'PAY_VALUE') THEN
995 l_pay_value_ivid := iter.input_value_id;
996 END IF;
997 Iteration := Iteration+1;
998 END LOOP;
999 IF l_result_rule_name IS NULL THEN
1000 OPEN get_pay_val_rslt_name(P_STAT_PROC_RULE_ID, l_pay_value_ivid);
1001 FETCH get_pay_val_rslt_name INTO l_result_rule_name;
1002 IF get_pay_val_rslt_name%notfound THEN
1003 HR_UTILITY.trace('Result Rule Name not Found');
1004 END IF;
1005 CLOSE get_pay_val_rslt_name;
1006 END IF;
1007 HR_UTILITY.trace(' PAYROLL_ACTION_ID '|| P_INPUTS(5).value);
1008 HR_UTILITY.trace(' ASSIGNMENT_ACTION_ID '||P_INPUTS(6).value );
1009 HR_UTILITY.trace(' p_assignment_id '||P_ASSIGNMENT_ID);
1010 HR_UTILITY.trace(' Date earned '|| FND_DATE.DATE_TO_CANONICAL(G_PRP_END_DATE));
1011 HR_UTILITY.trace(' p_payroll_id '||G_PAYROLL_ID);
1012 FF_EXEC.INIT_FORMULA(P_FORMULA_ID, G_PRP_END_DATE , L_INPUTS, L_OUTPUTS);
1013 HR_UTILITY.trace('L_INPUTS.COUNT Count:'||L_INPUTS.COUNT);
1014 HR_UTILITY.trace('P_INPUTS.COUNT Count:'||P_INPUTS.COUNT);
1015 IF L_INPUTS.COUNT > 0 AND P_INPUTS.COUNT > 0 THEN
1016 FOR I IN L_INPUTS.first..L_INPUTS.last
1017 LOOP
1018 FOR J IN P_INPUTS.first..P_INPUTS.last
1019 LOOP
1020 IF L_INPUTS(I).name = P_INPUTS(J).name THEN
1021 HR_UTILITY.trace('Inputs Name:'||L_INPUTS(I).name);
1022 HR_UTILITY.trace('Inputs value:'||L_INPUTS(I).value);
1023 HR_UTILITY.trace('---------------------------');
1024 L_INPUTS(I).value := P_INPUTS(J).value;
1025 EXIT;
1026 END IF;
1027 END LOOP;
1028 END LOOP;
1029 END IF;
1030 HR_UTILITY.trace('Inputs Count:'||L_INPUTS.count);
1031 /*
1032 FOR I IN L_INPUTS.first..L_INPUTS.last
1033 LOOP
1034 HR_UTILITY.trace(' i= '||I||' name '||L_INPUTS(I).name ||' value '||L_INPUTS(I).value);
1035 END LOOP;
1036 */
1037 --executing the formula
1038 HR_UTILITY.trace('Before Executing Formula');
1039 FF_EXEC.RUN_FORMULA(L_INPUTS,L_OUTPUTS);
1040 HR_UTILITY.trace('After Executing Formula');
1041 --UTILITY.trace(' calculated value from Element formula '||L_OUTPUTS(1).value);
1042 -- L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE + NVL(L_OUTPUTS(1).value,0);
1043 FOR iter IN L_OUTPUTS.first..L_OUTPUTS.last
1044 LOOP
1045 IF (L_OUTPUTS(iter).name = l_result_rule_name) THEN
1046 L_EARNINGS_VALUE := NVL(L_OUTPUTS(iter).value,0);
1047 EXIT;
1048 END IF;
1049 END LOOP;
1050 RETURN L_EARNINGS_VALUE;
1051 EXCEPTION
1052 WHEN OTHERS THEN
1053 HR_UTILITY.trace('EXEC_FORMULA Exception:'||sqlerrm);
1054 L_EARNINGS_VALUE := 0;
1055 RAISE;
1056 END EXEC_FORMULA;
1057 --------------------------------------------------------------------------------------------------
1058 FUNCTION CALCULATE_EARNINGS_INFO(
1059 P_ASSIGNMENT_ID NUMBER,
1060 P_EFFECTIVE_DATE DATE,
1061 P_assactid NUMBER,
1062 p_element_type_id_miss NUMBER )
1063 RETURN NUMBER
1064 IS
1065 ---Information element's Calculation
1066 CURSOR C_ELEMENT_DETAILS_INFO(P_EFFECTIVE_DATE DATE , P_ASSIGNMENT_ID NUMBER)
1067 IS
1068 SELECT PEEF.ELEMENT_ENTRY_ID,
1069 PEEF.ELEMENT_TYPE_ID
1070 FROM PAY_ELEMENT_ENTRIES_F PEEF
1071 WHERE PEEF.ASSIGNMENT_ID = P_ASSIGNMENT_ID
1072 AND PEEF.ELEMENT_TYPE_ID IN
1073 ( SELECT DISTINCT ELEMENT_TYPE_ID
1074 FROM pay_element_types_f petf ,
1075 PAY_ELEMENT_CLASSIFICATIONS PEC
1076 WHERE Petf.CLASSIFICATION_ID = PEC.CLASSIFICATION_ID
1077 AND PEC.CLASSIFICATION_NAME = 'Information'
1078 AND PETF.ELEMENT_NAME NOT IN ('NI','PAYE')
1079 AND P_EFFECTIVE_DATE BETWEEN petf.EFFECTIVE_START_DATE AND petf.EFFECTIVE_END_DATE
1080 )
1081 AND NVL(p_element_type_id_miss,PEEF.ELEMENT_TYPE_ID) =PEEF.ELEMENT_TYPE_ID
1082 AND P_EFFECTIVE_DATE BETWEEN PEEF.EFFECTIVE_START_DATE AND PEEF.EFFECTIVE_END_DATE;
1083 --Fetch Result Name from the Formula Results
1084 CURSOR C_RESULT_RULE_NAME (P_STATUS_PROCESSING_RULE_ID NUMBER,P_EFFECTIVE_DATE DATE)
1085 IS
1086 SELECT result_name
1087 FROM pay_formula_result_rules_f frr,
1088 pay_input_values_f pivf
1089 WHERE RESULT_RULE_TYPE = 'I'
1090 AND STATUS_PROCESSING_RULE_ID= P_STATUS_PROCESSING_RULE_ID
1091 AND P_EFFECTIVE_DATE BETWEEN frr.EFFECTIVE_START_DATE AND frr.EFFECTIVE_END_DATE
1092 AND P_EFFECTIVE_DATE BETWEEN pivf.EFFECTIVE_START_DATE AND pivf.EFFECTIVE_END_DATE
1093 AND frr.ELEMENT_TYPE_ID IN
1094 ( SELECT DISTINCT ELEMENT_TYPE_ID
1095 FROM pay_sub_classification_rules_f PSCR ,
1096 PAY_ELEMENT_CLASSIFICATIONS PEC
1097 WHERE PSCR.CLASSIFICATION_ID = PEC.CLASSIFICATION_ID
1098 AND PEC.CLASSIFICATION_NAME = 'Pension Qualifying Earnings'
1099 AND P_EFFECTIVE_DATE BETWEEN PSCR.EFFECTIVE_START_DATE AND PSCR.EFFECTIVE_END_DATE
1100 )
1101 AND frr.INPUT_VALUE_ID = pivf.INPUT_VALUE_ID
1102 AND pivf.name ='Pay Value';
1103 L_FORMULA_ID NUMBER;
1104 L_STATUS_PROCESSING_RULE_ID NUMBER;
1105 L_RESULT_NAME pay_formula_result_rules_f.result_name%type :=NULL;
1106 L_EARNINGS NUMBER :=0;
1107 BEGIN
1108 HR_UTILITY.trace(' Information CALCULATE_EARNINGS_INFO');
1109 HR_UTILITY.trace(' P_ASSIGNMENT_ID:'||P_ASSIGNMENT_ID);
1110 FOR I IN C_ELEMENT_DETAILS_INFO(P_EFFECTIVE_DATE,P_ASSIGNMENT_ID)
1111 LOOP
1112 OPEN C_PENSIONS_FORMULA_ID(I.ELEMENT_TYPE_ID,P_EFFECTIVE_DATE);
1113 FETCH C_PENSIONS_FORMULA_ID INTO L_FORMULA_ID,L_STATUS_PROCESSING_RULE_ID;
1114 HR_UTILITY.trace('I.ELEMENT_TYPE_ID:: '||I.ELEMENT_TYPE_ID);
1115 HR_UTILITY.trace('L_STATUS_PROCESSING_RULE_ID:: '||L_STATUS_PROCESSING_RULE_ID);
1116 CLOSE C_PENSIONS_FORMULA_ID;
1117 IF L_STATUS_PROCESSING_RULE_ID IS NOT NULL THEN
1118 HR_UTILITY.trace('Before Indirect result rules');
1119 FOR rec_result IN C_RESULT_RULE_NAME (L_STATUS_PROCESSING_RULE_ID,P_EFFECTIVE_DATE)
1120 LOOP
1121 HR_UTILITY.trace('Result Rule :'||rec_result.result_name);
1122 L_RESULT_NAME := rec_result.result_name;
1123 IF L_RESULT_NAME IS NOT NULL THEN
1124 HR_UTILITY.trace('L_EARNINGS:'||L_EARNINGS);
1125 L_EARNINGS:=L_EARNINGS+EXEC_FORMULA(P_ASSIGNMENT_ID,I.ELEMENT_ENTRY_ID,L_STATUS_PROCESSING_RULE_ID,P_ASSACTID,L_FORMULA_ID,L_RESULT_NAME);
1126 END IF;
1127 L_RESULT_NAME := NULL; -- Bug 14255540
1128 END LOOP; -- Indirect results loop
1129 END IF;
1130 --Bug 14662582
1131 L_STATUS_PROCESSING_RULE_ID := NULL;
1132 L_FORMULA_ID :=NULL;
1133 END LOOP; -- Information elements loop
1134 RETURN L_EARNINGS;
1135 END CALCULATE_EARNINGS_INFO;
1136 --------------------------------------------------------------------------------------------------
1137 --------------------------------------------------------------------------------------------------
1138 FUNCTION CALCULATE_ASG_ACTIONS(
1139 P_ASSIGNMENT_ID NUMBER,
1140 P_ASSACTID NUMBER,
1141 L_BALANCE_FLAG IN OUT NOCOPY VARCHAR2,
1142 P_TIME_PERIOD NUMBER)
1143 RETURN NUMBER
1144 IS
1145 --Changed for Pensions 2 - to fetch all the assignment actions for the assignment within the PRP
1146 CURSOR C_ASSIGNMENT_ACTION(P_ASSIGNMENT_ID NUMBER)
1147 IS
1148 SELECT ASSIGNMENT_ACTION_ID,
1149 PPA.EFFECTIVE_DATE DATE_PAID,
1150 ptp.end_date DATE_EARNED,
1151 ptp.TIME_PERIOD_ID,
1152 ptp.PAYROLL_ID,
1153 PRT.RUN_TYPE_NAME
1154 FROM PAY_PAYROLL_ACTIONS PPA,
1155 PAY_ASSIGNMENT_ACTIONS PAA,
1156 PAY_RUN_TYPES_F PRT,
1157 PER_TIME_PERIODS PTP
1158 WHERE PPA.PAYROLL_ACTION_ID=PAA.PAYROLL_ACTION_ID
1159 AND REGULAR_PAYMENT_DATE = PPA.EFFECTIVE_DATE
1160 AND ptp.TIME_PERIOD_ID = PPA.TIME_PERIOD_ID
1161 AND PPA.TIME_PERIOD_ID = NVL(P_TIME_PERIOD,PPA.TIME_PERIOD_ID)
1162 AND ASSIGNMENT_ID =P_ASSIGNMENT_ID
1163 AND PPA.ACTION_TYPE IN ('Q','R')
1164 AND PPA.EFFECTIVE_DATE BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE
1165 AND PPA.BUSINESS_GROUP_ID =G_BUSINESS_GROUP_ID
1166 AND PAA.ACTION_STATUS ='C'
1167 AND SOURCE_ACTION_ID IS NOT NULL
1168 AND PRT.LEGISLATION_CODE ='GB'
1169 AND PRT.RUN_TYPE_ID =PAA.RUN_TYPE_ID
1170 ORDER BY TIME_PERIOD_ID,
1171 ASSIGNMENT_ACTION_ID DESC;
1172 --Created for Pensions 2 - to fetch elements which have been missed out in the payroll run for that assignment_action_id
1173 CURSOR C_MISSED_ELEMENTS(P_TIME_PERIOD_ID NUMBER,P_DATE_EARNED DATE,P_ASSIGNMENT_ID NUMBER)
1174 IS
1175 SELECT DISTINCT petf.element_type_id
1176 FROM pay_element_types_f petf ,
1177 pay_element_entries_f peef ,
1178 ff_formulas_f fff,
1179 ff_formula_types fft
1180 WHERE petf.element_type_id = peef.element_type_id
1181 AND peef.element_type_id NOT IN
1182 (SELECT DISTINCT prr.ELEMENT_TYPE_ID
1183 FROM pay_run_results prr,
1184 pay_assignment_actions paa,
1185 pay_payroll_actions ppa
1186 WHERE paa.assignment_action_id = prr.assignment_action_id
1187 AND paa.payroll_action_id = ppa.payroll_action_id
1188 AND ppa.time_period_id = P_TIME_PERIOD_ID
1189 AND SOURCE_ACTION_ID IS NOT NULL
1190 AND paa.ASSIGNMENT_ID =P_ASSIGNMENT_ID
1191 AND PPA.BUSINESS_GROUP_ID =G_BUSINESS_GROUP_ID
1192 AND PPA.ACTION_TYPE IN ('Q','R')
1193 AND PAA.ACTION_STATUS ='C'
1194 AND SOURCE_TYPE = 'E'
1195 )
1196 AND NVL(petf.FORMULA_ID,fff.formula_id) = fff.formula_id
1197 AND fff.formula_type_id = fft.formula_type_id
1198 AND FORMULA_TYPE_NAME <>'Element Skip'
1199 AND P_DATE_EARNED BETWEEN fff.effective_start_date AND fff.effective_end_date
1200 AND peef.assignment_id = P_ASSIGNMENT_ID
1201 AND P_DATE_EARNED BETWEEN petf.effective_start_date AND petf.effective_end_date
1202 AND P_DATE_EARNED BETWEEN peef.effective_start_date AND peef.effective_end_date;
1203 L_SCREEN_ENTRY_VALUE PAY_ELEMENT_ENTRY_VALUES_F.SCREEN_ENTRY_VALUE%type;
1204 L_FORMULA_ID FF_FORMULAS_F.FORMULA_ID%type;
1205 L_STATUS_PROCES_ID NUMBER;
1206 L_TOTAL_EARNINGS_VALUE NUMBER :=0;
1207 L_INPUTS FF_EXEC.INPUTS_T;
1208 P_INPUTS FF_EXEC.INPUTS_T;
1209 L_OUTPUTS FF_EXEC.OUTPUTS_T;
1210 L_ASSIGNMENT_ACTION_ID NUMBER :=NULL;
1211 P_PAY_VALUE_IVID NUMBER;
1212 L_RESULT_RULE_NAME PAY_FORMULA_RESULT_RULES_F.RESULT_NAME%TYPE;
1213 Iteration NUMBER;
1214 L_TIME_PERIOD_ID NUMBER :=0;
1215 BEGIN
1216 L_BALANCE_FLAG :='N';
1217 HR_UTILITY.trace('Inside CALCULATE_ASG_ACTIONS');
1218 FOR L_ASSIGNMENT_ACTIONS IN C_ASSIGNMENT_ACTION(P_ASSIGNMENT_ID)
1219 LOOP
1220 --Fetch Value from Balance
1221 HR_UTILITY.trace('Assignment Action : '||L_ASSIGNMENT_ACTIONS.ASSIGNMENT_ACTION_ID);
1222 L_BALANCE_FLAG :='Y';
1223 L_TOTAL_EARNINGS_VALUE:=L_TOTAL_EARNINGS_VALUE + PAY_BALANCE_PKG.GET_VALUE ( P_DEFINED_BALANCE_ID =>G_DEFINED_BALANCE_ID ,P_ASSIGNMENT_ACTION_ID=>L_ASSIGNMENT_ACTIONS.ASSIGNMENT_ACTION_ID ,P_GET_RR_ROUTE => FALSE ,
1224 P_GET_RB_ROUTE => FALSE) ;
1225 HR_UTILITY.trace('L_TOTAL_EARNINGS_VALUE Balance Value : '||L_TOTAL_EARNINGS_VALUE);
1226 IF (L_TIME_PERIOD_ID = L_ASSIGNMENT_ACTIONS.TIME_PERIOD_ID) THEN
1227 -- For multiple payroll runs in the same period this will avoid multiple calculations of missed elements
1228 hr_utility.trace('- Second time occuring of the L_TIME_PERIOD_ID - Older assignment action :'||L_TIME_PERIOD_ID);
1229 ELSE --else time period
1230 --Check for element entries that have been missed out in the latest run
1231 FOR missed_ele IN C_MISSED_ELEMENTS(L_ASSIGNMENT_ACTIONS.TIME_PERIOD_ID,L_ASSIGNMENT_ACTIONS.DATE_EARNED,P_ASSIGNMENT_ID)
1232 LOOP
1233 -- Call Calculation logic for those missed elements alone
1234 HR_UTILITY.trace('Missed Ele Type Id:'||missed_ele.element_type_id);
1235 FOR I IN C_ELEMENT_DETAILS(L_ASSIGNMENT_ACTIONS.DATE_EARNED,P_ASSIGNMENT_ID,missed_ele.element_type_id)
1236 LOOP
1237 L_SCREEN_ENTRY_VALUE := NULL;
1238 L_FORMULA_ID := NULL;
1239 p_pay_value_ivid := NULL;
1240 L_STATUS_PROCES_ID := NULL;
1241 l_result_rule_name := NULL;
1242 OPEN C_SCREEN_ENTRY_VALUE(I.ELEMENT_ENTRY_ID,L_ASSIGNMENT_ACTIONS.DATE_EARNED);
1243 FETCH C_SCREEN_ENTRY_VALUE INTO L_SCREEN_ENTRY_VALUE;
1244 CLOSE C_SCREEN_ENTRY_VALUE;
1245 IF L_SCREEN_ENTRY_VALUE IS NULL THEN
1246 OPEN C_PENSIONS_FORMULA_ID(I.ELEMENT_TYPE_ID,L_ASSIGNMENT_ACTIONS.DATE_EARNED);
1247 FETCH C_PENSIONS_FORMULA_ID INTO L_FORMULA_ID,L_STATUS_PROCES_ID;
1248 CLOSE C_PENSIONS_FORMULA_ID;
1249 IF L_FORMULA_ID IS NOT NULL THEN
1250 HR_UTILITY.trace('Formula Id Not Null');
1251 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE + EXEC_FORMULA(P_ASSIGNMENT_ID, I.ELEMENT_ENTRY_ID, L_STATUS_PROCES_ID, P_assactid, L_FORMULA_ID);
1252 HR_UTILITY.trace('L_TOTAL_EARNINGS_VALUE :'||L_TOTAL_EARNINGS_VALUE);
1253 END IF;
1254 ELSE --Screen Entry Value not Null
1255 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE + NVL(L_SCREEN_ENTRY_VALUE,0);
1256 HR_UTILITY.trace(' Screen value Not Null :: L_TOTAL_EARNINGS_VALUE :'||L_TOTAL_EARNINGS_VALUE);
1257 END IF;
1258 END LOOP;--calculation logic for missed ele
1259 L_TOTAL_EARNINGS_VALUE :=L_TOTAL_EARNINGS_VALUE+ calculate_earnings_info(P_ASSIGNMENT_ID,L_ASSIGNMENT_ACTIONS.DATE_EARNED,L_ASSIGNMENT_ACTIONS.ASSIGNMENT_ACTION_ID,missed_ele.element_type_id);
1260 HR_UTILITY.trace('Information Element :: L_TOTAL_EARNINGS_VALUE :'||L_TOTAL_EARNINGS_VALUE);
1261 END LOOP;--missed ele
1262 END IF; --else time period
1263 L_TIME_PERIOD_ID := L_ASSIGNMENT_ACTIONS.TIME_PERIOD_ID;
1264 END LOOP;
1265 RETURN L_TOTAL_EARNINGS_VALUE;
1266 END CALCULATE_ASG_ACTIONS;
1267 --------------------------------------------------------------------------------------------------
1268 FUNCTION CALCULATE_EARNINGS(
1269 P_ASSIGNMENT_ID NUMBER,
1270 P_AGGR_FLAG VARCHAR2 DEFAULT 'N',
1271 P_PERSON_ID NUMBER,
1272 P_EFFECTIVE_DATE DATE,
1273 P_ASSACTID NUMBER)
1274 --P_ELEMENT_ENTRY_ID NUMBER)
1275 RETURN NUMBER
1276 IS
1277 --To fetch the dates paid which do not have a payroll/assignment action for the assignment id
1278 CURSOR C_DATES_PAID_MISSED
1279 IS
1280 SELECT TIME_PERIOD_ID,
1281 START_DATE,
1282 END_DATE,
1283 PAYROLL_ID,
1284 REGULAR_PAYMENT_DATE DATE_PAID
1285 FROM per_time_periods
1286 WHERE payroll_id IN
1287 (SELECT payroll_id
1288 FROM per_all_assignments_f paaf
1289 WHERE assignment_id = p_assignment_id
1290 AND G_PRP_END_DATE BETWEEN paaf.effective_start_date AND paaf.effective_end_date
1291 )
1292 AND regular_payment_date BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE
1293 AND regular_payment_date NOT IN
1294 (SELECT effective_date
1295 FROM pay_payroll_actions ppa ,
1296 pay_assignment_actions paa ,
1297 per_time_periods ptp
1298 WHERE ppa.action_type IN ('Q', 'R')
1299 AND ppa.payroll_action_id = paa.payroll_action_id
1300 AND paa.assignment_id = p_assignment_id
1301 AND ppa.time_period_id = ptp.time_period_id
1302 AND ppa.time_period_id IN
1303 (SELECT time_period_id
1304 FROM per_time_periods
1305 WHERE payroll_id IN
1306 (SELECT payroll_id
1307 FROM per_all_assignments_f paaf
1308 WHERE assignment_id = p_assignment_id
1309 AND G_PRP_END_DATE BETWEEN paaf.effective_start_date AND paaf.effective_end_date
1310 )
1311 AND regular_payment_date BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE
1312 )
1313 );
1314 ------------------AGGREGATED
1315 CURSOR C_ASSIGNMENTS_AGG
1316 IS
1317 SELECT PAAF.PAYROLL_ID,
1318 PAAF.ASSIGNMENT_ID,
1319 PEEF.ELEMENT_ENTRY_ID
1320 FROM PER_ALL_PEOPLE_F PAPF,
1321 PER_ALL_ASSIGNMENTS_F PAAF,
1322 PAY_ELEMENT_ENTRY_VALUES_F PEEVF,
1323 PAY_ELEMENT_ENTRIES_F PEEF,
1324 PER_ASSIGNMENT_STATUS_TYPES PAST
1325 WHERE PAAF.PERSON_ID =PAPF.PERSON_ID
1326 AND PAPF.PERSON_ID =P_PERSON_ID
1327 AND PAAF.ASSIGNMENT_STATUS_TYPE_ID = PAST.ASSIGNMENT_STATUS_TYPE_ID
1328 -- AND PAST.PAY_SYSTEM_STATUS='P'
1329 AND PAST.PER_SYSTEM_STATUS <> 'TERM_ASSIGN'
1330 AND PEEF.ASSIGNMENT_ID =PAAF.ASSIGNMENT_ID
1331 AND PEEF.ELEMENT_TYPE_ID =G_ELEMENT_DETAILS.G_ELEMENT_TYPE_ID
1332 AND PEEVF.ELEMENT_ENTRY_ID =PEEF.ELEMENT_ENTRY_ID
1333 AND PEEVF.INPUT_VALUE_ID =G_ELEMENT_DETAILS.G_AGG_EARNINGS_PENSIONS_ID
1334 AND PEEVF.SCREEN_ENTRY_VALUE ='Y'
1335 AND G_PRP_END_DATE BETWEEN PEEF.EFFECTIVE_START_DATE AND PEEF.EFFECTIVE_END_DATE
1336 AND G_PRP_END_DATE BETWEEN PEEVF.EFFECTIVE_START_DATE AND PEEVF.EFFECTIVE_END_DATE
1337 AND G_PRP_END_DATE BETWEEN PAAF.EFFECTIVE_START_DATE AND PAAF.EFFECTIVE_END_DATE
1338 AND G_PRP_END_DATE BETWEEN PAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE;
1339 -----------------------------
1340 L_SCREEN_ENTRY_VALUE PAY_ELEMENT_ENTRY_VALUES_F.SCREEN_ENTRY_VALUE%type;
1341 L_FORMULA_ID FF_FORMULAS_F.FORMULA_ID%type;
1342 L_STATUS_PROCES_ID NUMBER;
1343 L_TOTAL_EARNINGS_VALUE NUMBER :=0;
1344 L_INPUTS FF_EXEC.INPUTS_T;
1345 P_INPUTS FF_EXEC.INPUTS_T;
1346 L_OUTPUTS FF_EXEC.OUTPUTS_T;
1347 L_ASSIGNMENT_ACTION_ID NUMBER :=NULL;
1348 L_BALANCE_FLAG VARCHAR(2) := 'N';
1349 P_PAY_VALUE_IVID NUMBER;
1350 L_RESULT_RULE_NAME PAY_FORMULA_RESULT_RULES_F.RESULT_NAME%TYPE;
1351 Iteration NUMBER;
1352 L_TIME_PERIOD_ID NUMBER :=0;
1353 BEGIN
1354 hr_utility.trace('Inside CALCULATE_EARNINGS');
1355 hr_utility.trace('AGGREGATED?? '||P_AGGR_FLAG);
1356 hr_utility.trace('Person_id '||P_PERSON_ID);
1357 hr_utility.trace('P_AGGR_FLAG:'||P_AGGR_FLAG);
1358 hr_utility.trace('P_ASSIGNMENT_ID:'||P_ASSIGNMENT_ID);
1359 ---#######################################################################################################
1360 IF (P_AGGR_FLAG='N') THEN
1361 --Fetch Value from Balance
1362 L_TOTAL_EARNINGS_VALUE :=CALCULATE_ASG_ACTIONS(P_ASSIGNMENT_ID,P_ASSACTID,L_BALANCE_FLAG,NULL);
1363 HR_UTILITY.trace('L_TOTAL_EARNINGS_VALUE : '||L_TOTAL_EARNINGS_VALUE);
1364 hr_utility.trace('L_BALANCE_FLAG: '||L_BALANCE_FLAG);
1365 IF (L_BALANCE_FLAG ='Y') THEN -- Balance(s) Found --
1366 /*To handle Payroll Change and if the new payroll
1367 has no payroll-assg actions and if the previous payroll has payroll/assg
1368 actions within the PRP*/
1369 hr_utility.trace('To Fetch datepaids which donot have an assignment action');
1370 FOR L_DATE_PAID_MISSED IN C_DATES_PAID_MISSED
1371 LOOP
1372 hr_utility.trace('The Missed Date Paid :'||L_DATE_PAID_MISSED.DATE_PAID);
1373 hr_utility.trace('The Corresponding Date Earned :'||L_DATE_PAID_MISSED.END_DATE);
1374 FOR I IN C_ELEMENT_DETAILS(L_DATE_PAID_MISSED.END_DATE,P_ASSIGNMENT_ID,NULL)
1375 LOOP
1376 L_SCREEN_ENTRY_VALUE := NULL;
1377 L_FORMULA_ID := NULL;
1378 p_pay_value_ivid := NULL;
1379 L_STATUS_PROCES_ID := NULL;
1380 l_result_rule_name := NULL;
1381 OPEN C_SCREEN_ENTRY_VALUE(I.ELEMENT_ENTRY_ID,L_DATE_PAID_MISSED.END_DATE);
1382 FETCH C_SCREEN_ENTRY_VALUE INTO L_SCREEN_ENTRY_VALUE;
1383 CLOSE C_SCREEN_ENTRY_VALUE;
1384 IF L_SCREEN_ENTRY_VALUE IS NULL THEN
1385 OPEN C_PENSIONS_FORMULA_ID(I.ELEMENT_TYPE_ID,L_DATE_PAID_MISSED.END_DATE);
1386 FETCH C_PENSIONS_FORMULA_ID INTO L_FORMULA_ID,L_STATUS_PROCES_ID;
1387 CLOSE C_PENSIONS_FORMULA_ID;
1388 IF L_FORMULA_ID IS NOT NULL THEN
1389 HR_UTILITY.trace('Formula Id Not Null');
1390 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE + EXEC_FORMULA(P_ASSIGNMENT_ID, I.ELEMENT_ENTRY_ID, L_STATUS_PROCES_ID, P_assactid, L_FORMULA_ID);
1391 HR_UTILITY.trace('L_TOTAL_EARNINGS_VALUE :'||L_TOTAL_EARNINGS_VALUE);
1392 END IF;
1393 ELSE --Screen Entry Value not Null
1394 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE + NVL(L_SCREEN_ENTRY_VALUE,0);
1395 HR_UTILITY.trace(' Screen value Not Null :: L_TOTAL_EARNINGS_VALUE :'||L_TOTAL_EARNINGS_VALUE);
1396 END IF;
1397 END LOOP;
1398 L_TOTAL_EARNINGS_VALUE :=L_TOTAL_EARNINGS_VALUE+ calculate_earnings_info(P_ASSIGNMENT_ID,L_DATE_PAID_MISSED.END_DATE,P_assactid,NULL);
1399 HR_UTILITY.trace('Add Information Element :: L_TOTAL_EARNINGS_VALUE :'||L_TOTAL_EARNINGS_VALUE);
1400 END LOOP;
1401 END IF;--Balance Found
1402 --No Balance Found
1403 IF (L_BALANCE_FLAG ='N') THEN
1404 FOR I IN C_ELEMENT_DETAILS(P_EFFECTIVE_DATE,P_ASSIGNMENT_ID,NULL)
1405 LOOP
1406 L_SCREEN_ENTRY_VALUE := NULL;
1407 L_FORMULA_ID := NULL;
1408 p_pay_value_ivid := NULL;
1409 L_STATUS_PROCES_ID := NULL;
1410 l_result_rule_name := NULL;
1411 OPEN C_SCREEN_ENTRY_VALUE(I.ELEMENT_ENTRY_ID,P_EFFECTIVE_DATE);
1412 FETCH C_SCREEN_ENTRY_VALUE INTO L_SCREEN_ENTRY_VALUE;
1413 CLOSE C_SCREEN_ENTRY_VALUE;
1414 IF L_SCREEN_ENTRY_VALUE IS NULL THEN
1415 OPEN C_PENSIONS_FORMULA_ID(I.ELEMENT_TYPE_ID,P_EFFECTIVE_DATE);
1416 FETCH C_PENSIONS_FORMULA_ID INTO L_FORMULA_ID,L_STATUS_PROCES_ID;
1417 CLOSE C_PENSIONS_FORMULA_ID;
1418 IF L_FORMULA_ID IS NOT NULL THEN
1419 HR_UTILITY.trace('Formula Id Not Null');
1420 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE + EXEC_FORMULA(P_ASSIGNMENT_ID, I.ELEMENT_ENTRY_ID, L_STATUS_PROCES_ID, P_assactid, L_FORMULA_ID);
1421 HR_UTILITY.trace('L_TOTAL_EARNINGS_VALUE :'||L_TOTAL_EARNINGS_VALUE);
1422 END IF;
1423 ELSE --Screen Entry Value not Null
1424 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE + NVL(L_SCREEN_ENTRY_VALUE,0);
1425 HR_UTILITY.trace(' Screen value Not Null :: L_TOTAL_EARNINGS_VALUE :'||L_TOTAL_EARNINGS_VALUE);
1426 END IF;
1427 END LOOP;
1428 L_TOTAL_EARNINGS_VALUE :=L_TOTAL_EARNINGS_VALUE+ calculate_earnings_info(P_ASSIGNMENT_ID,P_EFFECTIVE_DATE,P_assactid,NULL);
1429 HR_UTILITY.trace('Add Information Element :: L_TOTAL_EARNINGS_VALUE :'||L_TOTAL_EARNINGS_VALUE);
1430 END IF;--Balance Flag
1431 END IF;
1432 ---#######################################################################################################
1433 --AGGREGATION
1434 ---#######################################################################################################
1435 IF (P_AGGR_FLAG='Y') THEN
1436 HR_UTILITY.trace('Aggregation Case - Calculate_earnings');
1437 FOR I IN C_ASSIGNMENTS_AGG
1438 LOOP
1439 IF (I.PAYROLL_ID =G_PAYROLL_ID) THEN
1440 L_TOTAL_EARNINGS_VALUE:=L_TOTAL_EARNINGS_VALUE+CALCULATE_EARNINGS(I.ASSIGNMENT_ID,'N',P_PERSON_ID,G_EARN_END_DATE,p_assactid);
1441 HR_UTILITY.trace('Same Payroll ID - L_TOTAL_EARNINGS_VALUE : '||L_TOTAL_EARNINGS_VALUE);
1442 ELSE --Main Entry and this asg are of different payrolls
1443 FOR J IN C_EARN_PERIOD_DETAILS(I.PAYROLL_ID)
1444 LOOP
1445 L_BALANCE_FLAG :='N'; --Reset Flag
1446 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE +CALCULATE_ASG_ACTIONS (P_ASSIGNMENT_ID ,P_ASSACTID ,L_BALANCE_FLAG ,J.TIME_PERIOD_ID );
1447 hr_utility.trace('BALANCE Flag:'||L_BALANCE_FLAG);
1448 IF (L_BALANCE_FLAG ='N') THEN-- If Balance not found
1449 FOR X IN C_ELEMENT_DETAILS(J.END_DATE,I.ASSIGNMENT_ID,NULL)
1450 LOOP
1451 hr_utility.trace('Inside Different Payroll Aggregated Case--and balance not Found');
1452 L_SCREEN_ENTRY_VALUE := NULL;
1453 L_FORMULA_ID :=NULL;
1454 p_pay_value_ivid :=NULL;
1455 L_STATUS_PROCES_ID :=NULL;
1456 l_result_rule_name :=NULL;
1457 OPEN C_SCREEN_ENTRY_VALUE(X.ELEMENT_ENTRY_ID,J.END_DATE);
1458 FETCH C_SCREEN_ENTRY_VALUE INTO L_SCREEN_ENTRY_VALUE;
1459 CLOSE C_SCREEN_ENTRY_VALUE;
1460 IF L_SCREEN_ENTRY_VALUE IS NULL THEN
1461 OPEN C_PENSIONS_FORMULA_ID(X.ELEMENT_TYPE_ID,J.END_DATE);
1462 FETCH C_PENSIONS_FORMULA_ID INTO L_FORMULA_ID,L_STATUS_PROCES_ID;
1463 CLOSE C_PENSIONS_FORMULA_ID;
1464 END IF;
1465 IF L_FORMULA_ID IS NOT NULL THEN
1466 HR_UTILITY.trace(' Inside run Element FORMULA '||L_FORMULA_ID);
1467 -- setting the contexts
1468 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE + EXEC_FORMULA(I.ASSIGNMENT_ID, X.ELEMENT_ENTRY_ID, L_STATUS_PROCES_ID, P_assactid, L_FORMULA_ID);
1469 HR_UTILITY.trace(' calculated value'||L_TOTAL_EARNINGS_VALUE);
1470 ELSE
1471 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE + NVL(L_SCREEN_ENTRY_VALUE,0);
1472 hr_utility.trace('Else part L_TOTAL_EARNINGS_VALUE:'||L_TOTAL_EARNINGS_VALUE);
1473 HR_UTILITY.trace(' calculated value'||L_TOTAL_EARNINGS_VALUE);
1474 END IF;
1475 END LOOP;
1476 L_TOTAL_EARNINGS_VALUE :=L_TOTAL_EARNINGS_VALUE+ calculate_earnings_info(I.ASSIGNMENT_ID,J.END_DATE,P_assactid,NULL);
1477 hr_utility.trace('Information part L_TOTAL_EARNINGS_VALUE:'||L_TOTAL_EARNINGS_VALUE);
1478 END IF;-- If Balance not found
1479 END LOOP;-- For every Date Paid in that Payroll
1480 END IF; -- Same Payroll Id as Main Entry
1481 END LOOP;
1482 END IF;
1483 HR_UTILITY.trace(' Total value from all Pension Element values = '||L_TOTAL_EARNINGS_VALUE);
1484 RETURN L_TOTAL_EARNINGS_VALUE;
1485 EXCEPTION
1486 WHEN OTHERS THEN
1487 HR_UTILITY.trace(SQLERRM);
1488 RAISE;
1489 END CALCULATE_EARNINGS;
1490 --------------------------------------------------------------------------------------------------
1491 FUNCTION CHECK_AGE_EARNINGS(
1492 P_PENSIONABLE_EARNINGS NUMBER ,
1493 P_ASSIGNMENT_ID NUMBER,
1494 P_PERSON_ID NUMBER,
1495 P_AGE OUT NOCOPY NUMBER,
1496 P_REASON OUT NOCOPY VARCHAR2)
1497 RETURN NUMBER
1498 IS
1499 L_SEX PER_ALL_PEOPLE_F.SEX%type;
1500 L_AGE NUMBER;
1501 L_EMPLOYEE_STATUS_FOR_PENSION NUMBER;
1502 L_DATE_OF_BIRTH PER_ALL_PEOPLE_F.DATE_OF_BIRTH%type;
1503 L_NUM_DATE_BIRTH VARCHAR2(10);
1504 CURSOR C_AGE_SEX
1505 IS
1506 SELECT months_between (least (effective_end_date, g_prp_end_date), date_of_birth) / 12
1507 , date_of_birth
1508 , sex
1509 FROM per_all_people_f papf
1510 WHERE person_id = p_person_id
1511 AND effective_start_date =
1512 (
1513 SELECT max (effective_start_date)
1514 FROM per_all_people_f
1515 WHERE person_id = papf.person_id
1516 AND effective_start_date <= g_prp_end_date
1517 AND current_employee_flag = 'Y'
1518 )
1519 AND g_prp_end_date >= effective_start_date;
1520 /*
1521 SELECT MONTHS_BETWEEN(G_PRP_END_DATE,DATE_OF_BIRTH)/12,
1522 DATE_OF_BIRTH,
1523 SEX
1524 FROM PER_ALL_PEOPLE_F
1525 WHERE PERSON_ID = P_PERSON_ID
1526 AND G_PRP_END_DATE BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE;
1527 */
1528
1529 cursor c_period_number is
1530 select NUMBER_PER_FISCAL_YEAR
1531 from per_time_period_types
1532 where PERIOD_TYPE = G_PAYROLL_PERIOD_TYPE;
1533
1534 ---To Fetch Service Start Date of the employee
1535 CURSOR C_SERVICE_START (P_PERSON_ID PER_ALL_PEOPLE_F.PERSON_ID%TYPE)
1536 IS
1537 SELECT DATE_START
1538 FROM PER_PERIODS_OF_SERVICE
1539 WHERE PERSON_ID = P_PERSON_ID
1540 AND BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID;
1541
1542 N_STATE_PENSION_AGE NUMBER := 0;
1543 RETIRE_DATE DATE;
1544 G_AUTOTHRESHOLD NUMBER :=0;
1545 G_LOWER_THRESHOLD NUMBER :=0;
1546 l_period_number number :=0;
1547 L_SERVICE_START date;
1548 L_DOB_TT date;
1549 L_EFFECTIVE_DATE date;
1550 l_asg_start_date DATE;
1551 --To Fetch the Assignment Start Date
1552 Cursor c_asg_start_date is
1553 select EFFECTIVE_START_DATE from per_all_assignments_f
1554 where assignment_id = p_assignment_id
1555 and g_prp_end_date between EFFECTIVE_START_DATE and EFFECTIVE_END_DATE;
1556 BEGIN
1557 P_REASON := ' ';
1558 OPEN C_AGE_SEX;
1559 FETCH C_AGE_SEX INTO L_AGE, L_DATE_OF_BIRTH, L_SEX ;
1560 CLOSE C_AGE_SEX;
1561 IF L_AGE >= 59 THEN
1562 --Pension age calculation needs to be done only if age >= 59
1563 IF L_SEX = 'M' THEN
1564 N_STATE_PENSION_AGE := 65;
1565 ELSIF L_SEX = 'F' THEN
1566 IF L_DATE_OF_BIRTH >= TO_DATE('1955/04/06','YYYY/MM/DD') THEN
1567 /* The retirement age for Employees born after 6th April 1955 is 65 */
1568 N_STATE_PENSION_AGE := 65;
1569 ELSIF L_DATE_OF_BIRTH >= TO_DATE('1950/04/06','YYYY/MM/DD') THEN
1570 /* For employee born between 6 April 1950 and 6th April 1955, the retirement date will be derived from the user table */
1571 /* Convert the Birth date of the employee to YYYYMMDD format. */
1572 L_NUM_DATE_BIRTH := TO_CHAR(L_DATE_OF_BIRTH,'YYYYMMDD');
1573 /* Pass the birth date and get the retire date corresponding to birth date. */
1574 -- Bug 14137856
1575 --RETIRE_DATE := HRUSERDT.GET_TABLE_VALUE(G_BUSINESS_GROUP_ID,'STATE_RETIREMENT_AGE_FOR_WOMEN','STATE_PENSION_AGE',L_NUM_DATE_BIRTH,G_PRP_END_DATE);
1576 RETIRE_DATE := TO_DATE(HRUSERDT.GET_TABLE_VALUE(G_BUSINESS_GROUP_ID,'STATE_RETIREMENT_AGE_FOR_WOMEN','STATE_PENSION_AGE',L_NUM_DATE_BIRTH,G_PRP_END_DATE),'YYYY/MM/DD');
1577 N_STATE_PENSION_AGE := ((RETIRE_DATE - L_DATE_OF_BIRTH)/365);
1578 END IF; --l_date_of_birth
1579 END IF; -- l_sex
1580 ELSE
1581 N_STATE_PENSION_AGE := 65;
1582 END IF; --Age >= 59
1583 /*
1584 Quarter
1585 Lunar Month
1586 Bi-Week
1587 Semi-Year
1588 */
1589 open c_period_number;
1590 fetch c_period_number into l_period_number;
1591 close c_period_number;
1592
1593 hr_utility.trace('l_period_number:'||l_period_number);
1594
1595 hr_utility.trace('G_PAYROLL_PERIOD_TYPE before:'||G_PAYROLL_PERIOD_TYPE);
1596
1597 IF NVL(l_period_number,0) <> 0 THEN
1598 IF l_period_number in (52,53,54,55,56) THEN
1599 G_PAYROLL_PERIOD_TYPE := 'Week';
1600 ELSIF l_period_number = 12 THEN
1601 G_PAYROLL_PERIOD_TYPE := 'Calendar Month';
1602 ELSIF l_period_number = 1 THEN
1603 G_PAYROLL_PERIOD_TYPE := 'Year' ;
1604 ELSIF l_period_number = 4 THEN
1605 G_PAYROLL_PERIOD_TYPE := 'Quarter';
1606 ELSIF l_period_number in (13,14) THEN
1607 G_PAYROLL_PERIOD_TYPE := 'Lunar Month';
1608 ELSIF l_period_number in (26,27) THEN
1609 G_PAYROLL_PERIOD_TYPE := 'Bi-Week';
1610 ELSIF l_period_number = 2 THEN
1611 G_PAYROLL_PERIOD_TYPE := 'Semi-Year' ;
1612 ELSIF l_period_number = 6 THEN
1613 G_PAYROLL_PERIOD_TYPE := 'Bi-Month' ;
1614 END IF;
1615 END IF;
1616
1617
1618 /* 16409174 - PAE THRESHOLD CHANGES start*/
1619 OPEN c_asg_start_date;
1620 FETCH c_asg_start_date INTO l_asg_start_date ;
1621 CLOSE c_asg_start_date;
1622
1623 OPEN C_SERVICE_START (P_PERSON_ID) ;
1624 FETCH C_SERVICE_START INTO L_SERVICE_START;
1625 CLOSE C_SERVICE_START;
1626 -- 22nd Birthday
1627 L_DOB_TT := FETCH_START_DATE(L_DATE_OF_BIRTH);
1628
1629 IF ((L_DOB_TT BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) OR (L_SERVICE_START BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE)) THEN
1630 L_EFFECTIVE_DATE := GREATEST(L_DOB_TT,L_SERVICE_START,l_asg_start_date);
1631 G_GLOBAL_VALUE := NULL;
1632 OPEN C_GET_GLOBAL_VALUE(L_EFFECTIVE_DATE);
1633 FETCH C_GET_GLOBAL_VALUE INTO G_GLOBAL_VALUE;
1634 CLOSE C_GET_GLOBAL_VALUE;
1635 hr_utility.trace('C_GET_GLOBAL_VALUE fetched is:'||G_GLOBAL_VALUE.G_QE_MONTHLY_LT||'-'||G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_MONTHLY);
1636 end if;
1637 /* 16409174 - PAE THRESHOLD CHANGES end*/
1638
1639
1640 hr_utility.trace('G_PAYROLL_PERIOD_TYPE after:'||G_PAYROLL_PERIOD_TYPE);
1641 IF G_PAYROLL_PERIOD_TYPE = 'Week' THEN
1642 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_WEEKLY;
1643 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_WEEKLY_LT;
1644 ELSIF G_PAYROLL_PERIOD_TYPE = 'Calendar Month' THEN
1645 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_MONTHLY ;
1646 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_MONTHLY_LT ;
1647 ELSIF G_PAYROLL_PERIOD_TYPE = 'Year' THEN
1648 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_ANNUAL;
1649 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_ANNUAL_LT;
1650 ELSIF G_PAYROLL_PERIOD_TYPE = 'Quarter' THEN
1651 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_QUARTERLY ;
1652 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_QUARTERLY_LT;
1653 ELSIF G_PAYROLL_PERIOD_TYPE = 'Lunar Month' THEN
1654 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_LUNAR ;
1655 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_LUNAR_LT;
1656 ELSIF G_PAYROLL_PERIOD_TYPE = 'Bi-Week' THEN
1657 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_BIWEEK;
1658 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_BIWEEK_LT;
1659 ELSIF G_PAYROLL_PERIOD_TYPE = 'Semi-Year' THEN
1660 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_SEMIYEAR;
1661 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_SEMIYEAR_LT ;
1662 ELSIF G_PAYROLL_PERIOD_TYPE = 'Bi-Month' THEN -- Monthly's Threshold multiplied by 2
1663 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_MONTHLY * 2;
1664 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_MONTHLY_LT * 2;
1665 END IF;
1666 hr_utility.trace('P_PENSIONABLE_EARNINGS:'||P_PENSIONABLE_EARNINGS);
1667 hr_utility.trace('G_AUTOTHRESHOLD:'||G_AUTOTHRESHOLD);
1668 hr_utility.trace('L_AGE:'||L_AGE);
1669 hr_utility.trace('N_STATE_PENSION_AGE:'||N_STATE_PENSION_AGE);
1670 /*Bug 14645724: Age check criteria modified*/
1671 IF L_AGE >= 16 AND L_AGE < 75 THEN
1672 IF ((L_AGE BETWEEN 22 AND N_STATE_PENSION_AGE) AND (P_PENSIONABLE_EARNINGS >= G_AUTOTHRESHOLD)) THEN
1673 L_EMPLOYEE_STATUS_FOR_PENSION := 1;
1674 ELSIF ((L_AGE BETWEEN 16 AND 75) AND (P_PENSIONABLE_EARNINGS >= G_LOWER_THRESHOLD AND P_PENSIONABLE_EARNINGS < G_AUTOTHRESHOLD)) THEN
1675 L_EMPLOYEE_STATUS_FOR_PENSION := 2;
1676 P_REASON := P_REASON || ' This assignment is Non Eligible Job holder';
1677 ELSIF ((L_AGE BETWEEN 16 AND 22 OR L_AGE BETWEEN N_STATE_PENSION_AGE AND 75 ) AND (P_PENSIONABLE_EARNINGS >= G_AUTOTHRESHOLD)) THEN
1678 L_EMPLOYEE_STATUS_FOR_PENSION := 2;
1679 P_REASON := P_REASON || ' This assignment is Non Eligible Job holder';
1680 ELSE
1681 L_EMPLOYEE_STATUS_FOR_PENSION := 3;
1682 P_REASON := P_REASON || ' This assignment is worker';
1683 END IF;
1684 ELSE
1685 /*This criteria means employee should not be picked for assesment*/
1686 L_EMPLOYEE_STATUS_FOR_PENSION := 4;
1687 END IF;
1688 P_AGE := L_AGE;
1689 RETURN L_EMPLOYEE_STATUS_FOR_PENSION;
1690 END CHECK_AGE_EARNINGS;
1691 --------------------------------------------------------------------------------------------------
1692 FUNCTION ASSESS_EMPLOYEE_PROCESS(
1693 P_PERSON_ID IN NUMBER ,
1694 P_ASSIGNMENT_ID IN NUMBER ,
1695 P_AGGR_FLAG IN VARCHAR2 DEFAULT 'N',
1696 P_EARNINGS OUT NOCOPY NUMBER,
1697 P_AGE OUT NOCOPY NUMBER,
1698 p_assactid IN NUMBER)
1699 RETURN NUMBER
1700 IS
1701
1702 CURSOR c_payroll_run
1703 (p_assignment_id IN number) IS
1704 SELECT ppa.payroll_action_id
1705 FROM pay_payroll_actions ppa
1706 , pay_assignment_actions paa
1707 WHERE ppa.time_period_id = nvl (g_time_period_id, ppa.time_period_id)
1708 AND paa.assignment_id = p_assignment_id
1709 AND ppa.effective_date
1710 BETWEEN g_prp_start_date
1711 AND g_prp_end_date
1712 AND ppa.action_type IN ('Q', 'R')
1713 AND ppa.business_group_id = g_business_group_id
1714 AND ppa.payroll_action_id = paa.payroll_action_id
1715 ORDER BY time_period_id
1716 , assignment_action_id DESC;
1717
1718 cursor c_get_pay_status(p_person_id number,p_assignment_id number) is
1719 SELECT past.pay_system_status
1720 FROM per_assignment_status_types past
1721 , per_all_assignments_f paaf
1722 WHERE past.assignment_status_type_id = paaf.assignment_status_type_id
1723 AND paaf.assignment_id = p_assignment_id
1724 AND paaf.person_id = p_person_id
1725 AND g_prp_end_date >= paaf.effective_start_date
1726 AND g_prp_start_date <= paaf.effective_end_date;
1727
1728 L_PENSIONABLE_EARNINGS NUMBER := 0;
1729 L_EMPLOYEE_STATUS_FOR_PENSION NUMBER;
1730 L_AGE NUMBER;
1731 L_REASON VARCHAR2(200);
1732 payroll_run c_payroll_run%ROWTYPE; -- bug 16169601
1733 L_PAY_STATUS per_assignment_status_types.pay_system_status%TYPE;-- bug 16169601
1734
1735 BEGIN
1736 HR_UTILITY.trace(' Entered ASSESS_EMPLOYEE_PROCESS');
1737 --L_PENSIONABLE_EARNINGS := CALCULATE_EARNINGS(P_ASSIGNMENT_ID,P_AGGR_FLAG,P_PERSON_ID,G_EARN_END_DATE,p_assactid); -- Bug 14015189
1738 L_PENSIONABLE_EARNINGS := TRUNC (CALCULATE_EARNINGS(P_ASSIGNMENT_ID,P_AGGR_FLAG,P_PERSON_ID,G_EARN_END_DATE,p_assactid)+ 0.004 , 2);
1739 --Check Age and earnings with threshold
1740 hr_utility.trace('After calculate earnings');
1741 L_EMPLOYEE_STATUS_FOR_PENSION := CHECK_AGE_EARNINGS(L_PENSIONABLE_EARNINGS,P_ASSIGNMENT_ID, P_PERSON_ID,L_AGE,L_REASON);
1742 hr_utility.trace('After check earnings');
1743 hr_utility.trace('L_EMPLOYEE_STATUS_FOR_PENSION'||L_EMPLOYEE_STATUS_FOR_PENSION);
1744 P_EARNINGS := L_PENSIONABLE_EARNINGS;
1745 P_AGE := L_AGE;
1746
1747 -- get pay_status of assignment -- to check if its P or D or null
1748 open c_get_pay_status(P_PERSON_ID,P_ASSIGNMENT_ID);
1749 fetch c_get_pay_status into L_PAY_STATUS;
1750 hr_utility.trace('P_PERSON_ID: '||P_PERSON_ID);
1751 hr_utility.trace('P_ASSIGNMENT_ID: '||P_ASSIGNMENT_ID);
1752 hr_utility.trace('g_prp_end_date: '||g_prp_end_date);
1753 hr_utility.trace('g_prp_start_date: '||g_prp_start_date);--G_TIME_PERIOD_ID
1754 hr_utility.trace('G_TIME_PERIOD_ID: '||G_TIME_PERIOD_ID);
1755 close c_get_pay_status;
1756 hr_utility.trace('L_PAY_STATUS: '||L_PAY_STATUS);
1757 if L_PAY_STATUS <> 'P' then
1758 -- if its not P then check if payroll run exists for that period for given assignment
1759 open c_payroll_run(P_ASSIGNMENT_ID);
1760 fetch c_payroll_run into payroll_run;
1761 if c_payroll_run%NOTFOUND THEN
1762 hr_utility.trace('No Payroll run found');
1763 L_EMPLOYEE_STATUS_FOR_PENSION := 3;
1764 P_EARNINGS := 0;
1765 END IF;
1766 close c_payroll_run;
1767 end if;
1768
1769 hr_utility.trace('L_EMPLOYEE_STATUS_FOR_PENSION is:'||L_EMPLOYEE_STATUS_FOR_PENSION);
1770 hr_utility.trace('P_EARNINGS is:'||P_EARNINGS);
1771
1772 RETURN L_EMPLOYEE_STATUS_FOR_PENSION;
1773 END ASSESS_EMPLOYEE_PROCESS;
1774 --------------------------------------------------------------------------------------------------
1775 FUNCTION check_all_null(
1776 p_rules_tab eligiblity_table )
1777 RETURN NUMBER
1778 IS
1779 BEGIN
1780 IF ( p_rules_tab('Emp Category') IS NULL AND p_rules_tab('Grade') IS NULL AND p_rules_tab('Group') IS NULL AND p_rules_tab('Job')IS NULL AND p_rules_tab('Location')IS NULL AND p_rules_tab('Organization')IS NULL
1781 AND p_rules_tab('Payroll') IS NULL AND p_rules_tab('Position') IS NULL AND p_rules_tab('Salary Basis') IS NULL) THEN
1782 RETURN 1;
1783 ELSE
1784 RETURN 0;
1785 END IF;
1786 END check_all_null;
1787 --------------------------------------------------------------------------------------------------
1788 FUNCTION others_check(
1789 p_config_values eligiblity_table,
1790 p_assignment_id NUMBER)
1791 RETURN NUMBER
1792 IS
1793 l_flag NUMBER:=0;
1794 l_test NUMBER;
1795 l_value VARCHAR2(1000);
1796 temp_num NUMBER:=0;
1797 l_position NUMBER:=0;
1798 l_seg_collect seg_collection_table;
1799 CURSOR c_location(p_location VARCHAR2)
1800 IS
1801 SELECT 1
1802 FROM per_all_assignments_f a,
1803 hr_locations_all l
1804 WHERE assignment_id=p_assignment_id
1805 AND a.LOCATION_ID = l.LOCATION_ID
1806 AND l.location_code=p_location
1807 AND G_PRP_END_DATE BETWEEN a.effective_start_date AND a.effective_end_date;
1808 CURSOR c_organization(p_org_name VARCHAR2)
1809 IS
1810 SELECT 1
1811 FROM per_all_assignments_f a,
1812 HR_ALL_ORGANIZATION_UNITS u
1813 WHERE assignment_id =p_assignment_id
1814 AND u.ORGANIZATION_ID = a.ORGANIZATION_ID
1815 AND u.business_group_id=g_business_group_id
1816 AND u.name =p_org_name
1817 AND G_PRP_END_DATE BETWEEN a.effective_start_date AND a.effective_end_date;
1818 CURSOR c_payroll(p_payroll_name VARCHAR2)
1819 IS
1820 SELECT 1
1821 FROM per_all_assignments_f a,
1822 pay_payrolls_f b
1823 WHERE assignment_id =p_assignment_id
1824 AND b.business_group_id = G_BUSINESS_GROUP_ID
1825 AND b.PAYROLL_ID = a.PAYROLL_ID
1826 AND b.payroll_name =p_payroll_name
1827 AND G_PRP_END_DATE BETWEEN a.effective_start_date AND a.effective_end_date
1828 AND G_PRP_END_DATE BETWEEN b.effective_start_date AND b.effective_end_date;
1829 CURSOR c_grade(p_grade VARCHAR2)
1830 IS
1831 SELECT 1
1832 FROM per_all_assignments_f a,
1833 per_grades g
1834 WHERE assignment_id =p_assignment_id
1835 AND g.business_group_id = G_BUSINESS_GROUP_ID
1836 AND g.GRADE_ID = a.GRADE_ID
1837 AND g.name =p_grade
1838 AND G_PRP_END_DATE BETWEEN a.effective_start_date AND a.effective_end_date;
1839 CURSOR c_job(p_job VARCHAR2)
1840 IS
1841 SELECT 1
1842 FROM per_all_assignments_f a,
1843 per_jobs j
1844 WHERE assignment_id =p_assignment_id
1845 AND j.business_group_id = G_BUSINESS_GROUP_ID
1846 AND j.JOB_ID = a.JOB_ID
1847 AND j.name =p_job
1848 AND G_PRP_END_DATE BETWEEN a.effective_start_date AND a.effective_end_date;
1849 CURSOR c_pay_basis(p_pay_basis VARCHAR2)
1850 IS
1851 SELECT 1
1852 FROM per_all_assignments_f a,
1853 per_pay_bases p
1854 WHERE assignment_id =p_assignment_id
1855 AND p.business_group_id = G_BUSINESS_GROUP_ID
1856 AND p.PAY_BASIS_ID = a.PAY_BASIS_ID
1857 AND p.name =p_pay_basis
1858 AND G_PRP_END_DATE BETWEEN a.effective_start_date AND a.effective_end_date;
1859 CURSOR c_position(p_position VARCHAR2)
1860 IS
1861 SELECT 1
1862 FROM per_all_assignments_f a,
1863 per_all_positions p
1864 WHERE assignment_id =p_assignment_id
1865 AND p.business_group_id = G_BUSINESS_GROUP_ID
1866 AND p.POSITION_ID = a.POSITION_ID
1867 AND p.name =p_position
1868 AND G_PRP_END_DATE BETWEEN a.effective_start_date AND a.effective_end_date;
1869 CURSOR c_employment_category(p_emp_category VARCHAR2)
1870 IS
1871 SELECT 1
1872 FROM hr_lookups
1873 WHERE lookup_type = 'EMP_CAT'
1874 AND meaning = p_emp_category
1875 AND lookup_code IN
1876 (SELECT EMPLOYMENT_CATEGORY
1877 FROM per_all_assignments_f
1878 WHERE assignment_id=p_assignment_id
1879 AND G_PRP_END_DATE BETWEEN effective_start_date AND effective_end_date
1880 );
1881 BEGIN
1882 l_flag:=1;
1883 ---------------------------------------Location-------------------------------------------
1884 SELECT p_config_values('Location')
1885 INTO l_value
1886 FROM dual ;
1887 hr_utility.trace('Location:: l_value:'||l_value);
1888 IF l_value IS NOT NULL THEN --If Any eligiblity criteria is set
1889 l_flag :=0;
1890 l_position :=0;
1891 temp_num :=0;
1892 l_seg_collect.delete;
1893 LOOP -- '~'
1894 temp_num:=temp_num+1;
1895 SELECT trim(SUBSTR(l_value,(l_position+1))) INTO l_value FROM dual;
1896 SELECT instr(l_value,'~') INTO l_position FROM dual;
1897 IF(l_position=0) THEN
1898 SELECT trim(SUBSTR(l_value,1)) INTO l_seg_collect(temp_num) FROM dual;
1899 END IF;
1900 EXIT
1901 WHEN l_position=0;
1902 SELECT trim(SUBSTR(l_value,1,(l_position-1)))
1903 INTO l_seg_collect(temp_num)
1904 FROM dual;
1905 END LOOP; -- '~'
1906 FOR i IN 1..l_seg_collect.count
1907 LOOP
1908 hr_utility.trace('Segment Collection:: '||i||l_seg_collect(i));
1909 OPEN c_location(l_seg_collect(i));
1910 FETCH c_location INTO l_test;
1911 IF c_location%found THEN
1912 l_flag :=1;
1913 END IF;
1914 CLOSE c_location;
1915 IF l_flag = 1 THEN
1916 EXIT;
1917 END IF;
1918 END LOOP;
1919 hr_utility.trace('L_FLAG:Location:'||l_flag);
1920 IF l_flag =0 THEN
1921 RETURN 0;-- Stop here as the location criteria has failed
1922 END IF;
1923 END IF;--
1924 ---------------------------------------Location-------------------------------------------
1925 IF l_flag =1 OR l_value IS NULL THEN
1926 SELECT p_config_values('Grade') INTO l_value FROM dual ;
1927 hr_utility.trace('Grade :: l_value:'||l_value);
1928 IF l_value IS NOT NULL THEN --If Any eligiblity criteria is set
1929 l_flag :=0;
1930 l_position :=0;
1931 temp_num :=0;
1932 l_seg_collect.delete;
1933 LOOP -- '~'
1934 temp_num:=temp_num+1;
1935 SELECT trim(SUBSTR(l_value,(l_position+1))) INTO l_value FROM dual;
1936 SELECT instr(l_value,'~') INTO l_position FROM dual;
1937 IF(l_position=0) THEN
1938 SELECT trim(SUBSTR(l_value,1)) INTO l_seg_collect(temp_num) FROM dual;
1939 END IF;
1940 EXIT
1941 WHEN l_position=0;
1942 SELECT trim(SUBSTR(l_value,1,(l_position-1)))
1943 INTO l_seg_collect(temp_num)
1944 FROM dual;
1945 END LOOP; -- '~'
1946 FOR i IN 1..l_seg_collect.count
1947 LOOP
1948 hr_utility.trace('Segment Collection:: '||i||l_seg_collect(i));
1949 OPEN c_grade(l_seg_collect(i));
1950 FETCH c_grade INTO l_test;
1951 IF c_grade%found THEN
1952 l_flag :=1;
1953 END IF;
1954 CLOSE c_grade;
1955 IF l_flag = 1 THEN
1956 EXIT;
1957 END IF;
1958 END LOOP;
1959 hr_utility.trace('L_FLAG:Grade:'||l_flag);
1960 IF l_flag =0 THEN
1961 RETURN 0;-- Stop here as the location criteria has failed
1962 END IF;
1963 END IF;
1964 END IF;--
1965 ---------------------------------------Grade-------------------------------------------
1966 IF l_flag =1 OR l_value IS NULL THEN
1967 SELECT p_config_values('Job') INTO l_value FROM dual ;
1968 hr_utility.trace('Job :: l_value:'||l_value);
1969 IF l_value IS NOT NULL THEN --If Any eligiblity criteria is set
1970 l_flag :=0;
1971 l_position :=0;
1972 temp_num :=0;
1973 l_seg_collect.delete;
1974 LOOP -- '~'
1975 temp_num:=temp_num+1;
1976 SELECT trim(SUBSTR(l_value,(l_position+1))) INTO l_value FROM dual;
1977 SELECT instr(l_value,'~') INTO l_position FROM dual;
1978 IF(l_position=0) THEN
1979 SELECT trim(SUBSTR(l_value,1)) INTO l_seg_collect(temp_num) FROM dual;
1980 END IF;
1981 EXIT
1982 WHEN l_position=0;
1983 SELECT trim(SUBSTR(l_value,1,(l_position-1)))
1984 INTO l_seg_collect(temp_num)
1985 FROM dual;
1986 END LOOP; -- '~'
1987 FOR i IN 1..l_seg_collect.count
1988 LOOP
1989 hr_utility.trace('Segment Collection:: '||i||l_seg_collect(i));
1990 OPEN c_job(l_seg_collect(i));
1991 FETCH c_job INTO l_test;
1992 IF c_job%found THEN
1993 l_flag :=1;
1994 END IF;
1995 CLOSE c_job;
1996 IF l_flag = 1 THEN
1997 EXIT;
1998 END IF;
1999 END LOOP;
2000 hr_utility.trace('L_FLAG:Job:'||l_flag);
2001 IF l_flag =0 THEN
2002 RETURN 0;-- Stop here as the location criteria has failed
2003 END IF;
2004 END IF;
2005 END IF;--
2006 ---------------------------------------Job-------------------------------------------
2007 IF l_flag =1 OR l_value IS NULL THEN
2008 SELECT p_config_values('Organization') INTO l_value FROM dual ;
2009 hr_utility.trace('Organization :: l_value:'||l_value);
2010 IF l_value IS NOT NULL THEN --If Any eligiblity criteria is set
2011 l_flag :=0;
2012 l_position :=0;
2013 temp_num :=0;
2014 l_seg_collect.delete;
2015 LOOP -- '~'
2016 temp_num:=temp_num+1;
2017 SELECT trim(SUBSTR(l_value,(l_position+1))) INTO l_value FROM dual;
2018 SELECT instr(l_value,'~') INTO l_position FROM dual;
2019 IF(l_position=0) THEN
2020 SELECT trim(SUBSTR(l_value,1)) INTO l_seg_collect(temp_num) FROM dual;
2021 END IF;
2022 EXIT
2023 WHEN l_position=0;
2024 SELECT trim(SUBSTR(l_value,1,(l_position-1)))
2025 INTO l_seg_collect(temp_num)
2026 FROM dual;
2027 END LOOP; -- '~'
2028 FOR i IN 1..l_seg_collect.count
2029 LOOP
2030 hr_utility.trace('Segment Collection:: '||i||l_seg_collect(i));
2031 OPEN c_organization(l_seg_collect(i));
2032 FETCH c_organization INTO l_test;
2033 IF c_organization%found THEN
2034 l_flag :=1;
2035 END IF;
2036 CLOSE c_organization;
2037 IF l_flag = 1 THEN
2038 EXIT;
2039 END IF;
2040 END LOOP;
2041 hr_utility.trace('L_FLAG:Organization:'||l_flag);
2042 IF l_flag =0 THEN
2043 RETURN 0;-- Stop here as the location criteria has failed
2044 END IF;
2045 END IF;
2046 END IF;--
2047 ---------------------------------------Organization-------------------------------------------
2048 IF l_flag =1 OR l_value IS NULL THEN
2049 SELECT p_config_values('Payroll') INTO l_value FROM dual ;
2050 hr_utility.trace('Payroll :: l_value:'||l_value);
2051 IF l_value IS NOT NULL THEN --If Any eligiblity criteria is set
2052 l_flag :=0;
2053 l_position :=0;
2054 temp_num :=0;
2055 l_seg_collect.delete;
2056 LOOP -- '~'
2057 temp_num:=temp_num+1;
2058 SELECT trim(SUBSTR(l_value,(l_position+1))) INTO l_value FROM dual;
2059 SELECT instr(l_value,'~') INTO l_position FROM dual;
2060 IF(l_position=0) THEN
2061 SELECT trim(SUBSTR(l_value,1)) INTO l_seg_collect(temp_num) FROM dual;
2062 END IF;
2063 EXIT
2064 WHEN l_position=0;
2065 SELECT trim(SUBSTR(l_value,1,(l_position-1)))
2066 INTO l_seg_collect(temp_num)
2067 FROM dual;
2068 END LOOP; -- '~'
2069 FOR i IN 1..l_seg_collect.count
2070 LOOP
2071 hr_utility.trace('Segment Collection:: '||i||l_seg_collect(i));
2072 OPEN c_payroll(l_seg_collect(i));
2073 FETCH c_payroll INTO l_test;
2074 IF c_payroll%found THEN
2075 l_flag :=1;
2076 END IF;
2077 CLOSE c_payroll;
2078 IF l_flag = 1 THEN
2079 EXIT;
2080 END IF;
2081 END LOOP;
2082 hr_utility.trace('L_FLAG:Payroll:'||l_flag);
2083 IF l_flag =0 THEN
2084 RETURN 0;-- Stop here as the location criteria has failed
2085 END IF;
2086 END IF;
2087 END IF;--
2088 ---------------------------------------Payroll-------------------------------------------
2089 IF l_flag =1 OR l_value IS NULL THEN
2090 SELECT p_config_values('Position') INTO l_value FROM dual ;
2091 hr_utility.trace('Position :: l_value:'||l_value);
2092 IF l_value IS NOT NULL THEN --If Any eligiblity criteria is set
2093 l_flag :=0;
2094 l_position :=0;
2095 temp_num :=0;
2096 l_seg_collect.delete;
2097 LOOP -- '~'
2098 temp_num:=temp_num+1;
2099 SELECT trim(SUBSTR(l_value,(l_position+1))) INTO l_value FROM dual;
2100 SELECT instr(l_value,'~') INTO l_position FROM dual;
2101 IF(l_position=0) THEN
2102 SELECT trim(SUBSTR(l_value,1)) INTO l_seg_collect(temp_num) FROM dual;
2103 END IF;
2104 EXIT
2105 WHEN l_position=0;
2106 SELECT trim(SUBSTR(l_value,1,(l_position-1)))
2107 INTO l_seg_collect(temp_num)
2108 FROM dual;
2109 END LOOP; -- '~'
2110 FOR i IN 1..l_seg_collect.count
2111 LOOP
2112 hr_utility.trace('Segment Collection:: '||i||l_seg_collect(i));
2113 OPEN c_position(l_seg_collect(i));
2114 FETCH c_position INTO l_test;
2115 IF c_position%found THEN
2116 l_flag :=1;
2117 END IF;
2118 CLOSE c_position;
2119 IF l_flag = 1 THEN
2120 EXIT;
2121 END IF;
2122 END LOOP;
2123 hr_utility.trace('L_FLAG:Position:'||l_flag);
2124 IF l_flag =0 THEN
2125 RETURN 0;-- Stop here as the location criteria has failed
2126 END IF;
2127 END IF;
2128 END IF;--
2129 ---------------------------------------Position-------------------------------------------
2130 IF l_flag =1 OR l_value IS NULL THEN
2131 SELECT p_config_values('Salary Basis') INTO l_value FROM dual ;
2132 hr_utility.trace('Salary Basis :: l_value:'||l_value);
2133 IF l_value IS NOT NULL THEN --If Any eligiblity criteria is set
2134 l_flag :=0;
2135 l_position :=0;
2136 temp_num :=0;
2137 l_seg_collect.delete;
2138 LOOP -- '~'
2139 temp_num:=temp_num+1;
2140 SELECT trim(SUBSTR(l_value,(l_position+1))) INTO l_value FROM dual;
2141 SELECT instr(l_value,'~') INTO l_position FROM dual;
2142 IF(l_position=0) THEN
2143 SELECT trim(SUBSTR(l_value,1)) INTO l_seg_collect(temp_num) FROM dual;
2144 END IF;
2145 EXIT
2146 WHEN l_position=0;
2147 SELECT trim(SUBSTR(l_value,1,(l_position-1)))
2148 INTO l_seg_collect(temp_num)
2149 FROM dual;
2150 END LOOP; -- '~'
2151 FOR i IN 1..l_seg_collect.count
2152 LOOP
2153 hr_utility.trace('Segment Collection:: '||i||l_seg_collect(i));
2154 OPEN c_pay_basis(l_seg_collect(i));
2155 FETCH c_pay_basis INTO l_test;
2156 IF c_pay_basis%found THEN
2157 l_flag :=1;
2158 END IF;
2159 CLOSE c_pay_basis;
2160 IF l_flag = 1 THEN
2161 EXIT;
2162 END IF;
2163 END LOOP;
2164 hr_utility.trace('L_FLAG:Salary Basis:'||l_flag);
2165 IF l_flag =0 THEN
2166 RETURN 0;-- Stop here as the location criteria has failed
2167 END IF;
2168 END IF;
2169 END IF;--
2170 ---------------------------------------Salary Basis-------------------------------------------
2171 IF l_flag =1 OR l_value IS NULL THEN
2172 SELECT p_config_values('Emp Category') INTO l_value FROM dual ;
2173 hr_utility.trace('Emp Category :: l_value:'||l_value);
2174 IF l_value IS NOT NULL THEN --If Any eligiblity criteria is set
2175 l_flag :=0;
2176 l_position :=0;
2177 temp_num :=0;
2178 LOOP -- '~'
2179 temp_num:=temp_num+1;
2180 SELECT trim(SUBSTR(l_value,(l_position+1))) INTO l_value FROM dual;
2181 SELECT instr(l_value,'~') INTO l_position FROM dual;
2182 IF(l_position=0) THEN
2183 SELECT trim(SUBSTR(l_value,1)) INTO l_seg_collect(temp_num) FROM dual;
2184 END IF;
2185 EXIT
2186 WHEN l_position=0;
2187 SELECT trim(SUBSTR(l_value,1,(l_position-1)))
2188 INTO l_seg_collect(temp_num)
2189 FROM dual;
2190 END LOOP; -- '~'
2191 FOR i IN 1..l_seg_collect.count
2192 LOOP
2193 hr_utility.trace('Segment Collection:: '||i||l_seg_collect(i));
2194 OPEN c_employment_category(l_seg_collect(i));
2195 FETCH c_employment_category INTO l_test;
2196 IF c_employment_category%found THEN
2197 l_flag :=1;
2198 END IF;
2199 CLOSE c_employment_category;
2200 IF l_flag = 1 THEN
2201 EXIT;
2202 END IF;
2203 END LOOP;
2204 hr_utility.trace('L_FLAG:Emp Category:'||l_flag);
2205 IF l_flag =0 THEN
2206 RETURN 0;-- Stop here as the location criteria has failed
2207 END IF;
2208 END IF;
2209 END IF;--
2210 ---------------------------------------Emp Category-------------------------------------------
2211 IF l_flag =1 THEN
2212 RETURN 1;--Succesful Could be The criteria has been met or every eligibility rule is null except People Group
2213 END IF;
2214 IF l_flag >1 THEN
2215 RETURN 2;--Not Mutually Exclusive
2216 END IF;
2217 RETURN 0;--Failed to meet the criteria
2218 END others_check;
2219 --------------------------------------------------------------------------------------------------
2220 PROCEDURE conv_configval_to_table
2221 IS
2222 temp NUMBER;
2223 L_rulestab eligiblity_table;
2224 CURSOR X
2225 IS
2226 SELECT trim(PCV_INFORMATION1) PCV_INFORMATION1,
2227 trim(PCV_INFORMATION2) PCV_INFORMATION2,
2228 trim(PCV_INFORMATION3) PCV_INFORMATION3,
2229 trim(PCV_INFORMATION4) PCV_INFORMATION4,
2230 trim(PCV_INFORMATION5) PCV_INFORMATION5,
2231 trim(PCV_INFORMATION6) PCV_INFORMATION6,
2232 trim(PCV_INFORMATION7) PCV_INFORMATION7,
2233 trim(PCV_INFORMATION8) PCV_INFORMATION8,
2234 trim(PCV_INFORMATION9) PCV_INFORMATION9,
2235 trim(PCV_INFORMATION10) PCV_INFORMATION10,
2236 trim(PCV_INFORMATION11) PCV_INFORMATION11,
2237 trim(PCV_INFORMATION12) PCV_INFORMATION12,
2238 trim(PCV_INFORMATION13) PCV_INFORMATION13
2239 FROM PQP_CONFIGURATION_VALUES
2240 WHERE PCV_INFORMATION_CATEGORY = 'PAY_GB_QUALIFIED_PENSIONS_INFO'
2241 AND BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID;
2242 function get_data_file(p_file_name varchar2)
2243 return varchar2
2244 is
2245 l_data varchar2(20000) := null;
2246 l_file_name varchar2(100);
2247 l_file_handle utl_file.file_type;
2248 l_location varchar2(150);
2249 e_fatal_error exception;
2250 begin
2251 l_file_name := trim(substr(p_file_name,instr(p_file_name,':') + 1));
2252 -- Get I/O Directory
2253 --
2254 fnd_profile.get('PER_DATA_EXCHANGE_DIR', l_location);
2255
2256 fnd_file.put_line(fnd_file.LOG,'directory: <'|| l_location || '>');
2257 if l_location is null then
2258 -- error : I/O directory not defined
2259 fnd_file.put_line(fnd_file.LOG,'Input directory not defined. Set PER_DATA_EXCHANGE_DIR profile (HR: Data Exchange directory).');
2260 raise e_fatal_error;
2261 end if;
2262 -- Open file
2263 l_file_handle := utl_file.fopen(l_location,l_file_name,'r');
2264 utl_file.get_line(l_file_handle,l_data);
2265 fnd_file.put_line(fnd_file.LOG,l_data);
2266 utl_file.fclose(l_file_handle);
2267 return l_data;
2268 exception
2269 when e_fatal_error then
2270 UTL_FILE.FCLOSE(l_file_handle);
2271 fnd_file.put_line(fnd_file.LOG,'Fatal Error');
2272 return null;
2273 when UTL_FILE.INVALID_OPERATION then
2274 UTL_FILE.FCLOSE(l_file_handle);
2275 fnd_file.put_line(fnd_file.LOG,'Reading NINO Reply File - Invalid Operation (file not found).');
2276 return null;
2277 when UTL_FILE.INTERNAL_ERROR then
2278 UTL_FILE.FCLOSE(l_file_handle);
2279 fnd_file.put_line(fnd_file.LOG,'Reading NINO Reply File - Internal Error.');
2280 return null;
2281 when UTL_FILE.INVALID_MODE then
2282 UTL_FILE.FCLOSE(l_file_handle);
2283 fnd_file.put_line(fnd_file.LOG,'Reading NINO Reply File - Invalid Mode.');
2284 return null;
2285 when UTL_FILE.INVALID_PATH then
2286 UTL_FILE.FCLOSE(l_file_handle);
2287 fnd_file.put_line(fnd_file.LOG,'Reading NINO Reply File - Invalid Path.');
2288 return null;
2289 when UTL_FILE.INVALID_FILEHANDLE then
2290 UTL_FILE.FCLOSE(l_file_handle);
2291 fnd_file.put_line(fnd_file.LOG,'Reading NINO Reply File - Invalid File Handle.');
2292 return null;
2293 when UTL_FILE.READ_ERROR then
2294 UTL_FILE.FCLOSE(l_file_handle);
2295 fnd_file.put_line(fnd_file.LOG,'Reading NINO Reply File - Read Error.');
2296 return null;
2297 when others then
2298 fnd_file.put_line(fnd_file.LOG,'Exception : ' || SQLERRM || ' ' || sqlcode);
2299 fnd_file.put_line(fnd_file.LOG,DBMS_UTILITY.format_error_backtrace);
2300 utl_file.fclose(l_file_handle);
2301 return null;
2302 end get_data_file;
2303
2304 PROCEDURE get_values_into_table(
2305 a VARCHAR2,
2306 c VARCHAR2)
2307 IS
2308 b varchar2(2000);
2309 BEGIN
2310
2311 /** Here if b contains a file name which is identified by 'file' string
2312 then read the data from the file and
2313 replace be with the contents of the file in b.
2314 **/
2315 if instr(lower(c),'file:') <> 0 then
2316 b :=get_data_file(trim(c));
2317 else
2318 b := c;
2319 end if;
2320 CASE a
2321 WHEN 'Emp Category' THEN
2322 L_rulestab('Emp Category'):= b ;
2323 WHEN 'Grade' THEN
2324 L_rulestab('Grade') := b ;
2325 WHEN 'Group' THEN
2326 L_rulestab('Group') := b ;
2327 WHEN 'Job' THEN
2328 L_rulestab('Job') := b ;
2329 WHEN 'Location' THEN
2330 L_rulestab('Location') := b ;
2331 WHEN 'Organization' THEN
2332 L_rulestab('Organization') := b ;
2333 WHEN 'Payroll' THEN
2334 L_rulestab('Payroll') := b ;
2335 WHEN 'Position' THEN
2336 L_rulestab('Position'):= b ;
2337 WHEN 'Salary Basis' THEN
2338 L_rulestab('Salary Basis') := b ;
2339 END CASE;
2340 END get_values_into_table;
2341 BEGIN
2342 temp :=0;
2343 FOR I IN X
2344 LOOP
2345 --Initialization
2346 L_rulestab('Emp Category') := NULL ;
2347 L_rulestab('Grade') := NULL ;
2348 L_rulestab('Group') := NULL ;
2349 L_rulestab('Job') := NULL ;
2350 L_rulestab('Location') := NULL ;
2351 L_rulestab('Organization') := NULL ;
2352 L_rulestab('Payroll') := NULL ;
2353 L_rulestab('Position') := NULL ;
2354 L_rulestab('Salary Basis') := NULL ;
2355 --Initialization
2356 temp:=temp+1;
2357 hr_utility.trace('----------------------------------------------------');
2358 hr_utility.trace('Scheme Name:: '||I.PCV_INFORMATION1 );
2359 IF I.PCV_INFORMATION4 IS NOT NULL THEN
2360 hr_utility.trace(I.PCV_INFORMATION5||'::'||I.PCV_INFORMATION4);
2361 get_values_into_table(I.PCV_INFORMATION4,I.PCV_INFORMATION5);
2362 END IF;
2363 IF I.PCV_INFORMATION6 IS NOT NULL THEN
2364 hr_utility.trace(I.PCV_INFORMATION7||'::'||I.PCV_INFORMATION6);
2365 get_values_into_table(I.PCV_INFORMATION6,I.PCV_INFORMATION7);
2366 END IF;
2367 IF I.PCV_INFORMATION8 IS NOT NULL THEN
2368 hr_utility.trace(I.PCV_INFORMATION9||'::'||I.PCV_INFORMATION8);
2369 get_values_into_table(I.PCV_INFORMATION8,I.PCV_INFORMATION9);
2370 END IF;
2371 IF I.PCV_INFORMATION10 IS NOT NULL THEN
2372 hr_utility.trace(I.PCV_INFORMATION11||'::'||I.PCV_INFORMATION10);
2373 get_values_into_table(I.PCV_INFORMATION10,I.PCV_INFORMATION11);
2374 END IF;
2375 IF I.PCV_INFORMATION12 IS NOT NULL THEN
2376 hr_utility.trace(I.PCV_INFORMATION13||'::'||I.PCV_INFORMATION12);
2377 get_values_into_table(I.PCV_INFORMATION12,I.PCV_INFORMATION13);
2378 END IF;
2379 L_rulestab('Scheme Name') :=I.PCV_INFORMATION1;
2380 L_rulestab('Employee Element Name'):=I.PCV_INFORMATION2;
2381 L_rulestab('Employer Element Name'):=I.PCV_INFORMATION3;
2382 g_collecttab(temp) :=L_rulestab;
2383 END LOOP;
2384 hr_utility.trace('value of Collective Count::'||g_collecttab.count);
2385 ---Printing Tables
2386 FOR i IN 1..g_collecttab.count
2387 LOOP
2388 hr_utility.trace('%%%%%%%%%%%%%%%%%%%%%%%%%%%%');
2389 hr_utility.trace(g_collecttab(i)('Scheme Name'));
2390 hr_utility.trace(g_collecttab(i)('Employee Element Name'));
2391 hr_utility.trace(g_collecttab(i)('Employer Element Name'));
2392 hr_utility.trace(g_collecttab(i)('Emp Category'));
2393 hr_utility.trace(g_collecttab(i)('Grade'));
2394 hr_utility.trace(g_collecttab(i)('Group'));
2395 hr_utility.trace(g_collecttab(i)('Job'));
2396 hr_utility.trace(g_collecttab(i)('Location'));
2397 hr_utility.trace(g_collecttab(i)('Organization'));
2398 hr_utility.trace(g_collecttab(i)('Payroll'));
2399 hr_utility.trace(g_collecttab(i)('Position'));
2400 hr_utility.trace(g_collecttab(i)('Salary Basis'));
2401 END LOOP;
2402 --Printing Tables
2403 END conv_configval_to_table;
2404 --------------------------------------------------------------------------------------------------
2405 FUNCTION group_check(
2406 P_ASSIGNMENT_ID NUMBER,
2407 l_er_scheme_name IN OUT NOCOPY VARCHAR2)
2408 RETURN NUMBER
2409 IS
2410 l_receive_ppl_group people_group_id_tab;
2411 stmt VARCHAR2(10000);
2412 l_test NUMBER;
2413 l_flag NUMBER;
2414 l_final_flag NUMBER;
2415 CURSOR C_ASSIGNMENT_CHECK(p_people_group_id NUMBER)
2416 IS
2417 SELECT 1
2418 FROM PER_ALL_ASSIGNMENTS_F PAAF
2419 WHERE PAAF.ASSIGNMENT_ID = P_ASSIGNMENT_ID
2420 AND p_people_group_id = people_group_id
2421 AND G_PRP_END_DATE BETWEEN PAAF.EFFECTIVE_START_DATE AND PAAF.EFFECTIVE_END_DATE;
2422 CURSOR c_group_name_check (p_group_name VARCHAR2)
2423 IS
2424 SELECT 1
2425 FROM fnd_id_flex_structures b ,
2426 fnd_id_flex_structures_tl t
2427 WHERE b.id_flex_num = t.id_flex_num
2428 AND b.id_flex_code = 'GRP'
2429 AND t.language = 'US'
2430 AND t.id_flex_structure_name = p_group_name;
2431 CURSOR c_col_name (p_group_name VARCHAR2,p_seg_name VARCHAR2)
2432 IS
2433 SELECT application_column_name,
2434 b.id_flex_num
2435 FROM fnd_id_flex_structures b ,
2436 fnd_id_flex_structures_tl t ,
2437 fnd_id_flex_segments c
2438 WHERE b.id_flex_code = 'GRP'
2439 AND t.language = 'US'
2440 AND t.id_flex_num = b.id_flex_num
2441 AND c.id_flex_num = b.id_flex_num
2442 AND t.id_flex_structure_name = p_group_name
2443 AND c.segment_name = p_seg_name;
2444 l_col_name VARCHAR2(150);
2445 l_flex_num NUMBER;
2446 PROCEDURE get_group_details(
2447 p_config_values eligiblity_table,
2448 l_people_group_id_tab IN OUT nocopy people_group_id_tab)
2449 IS
2450 type name_value
2451 IS
2452 record
2453 (
2454 name VARCHAR2(150), -- Segment Name
2455 value VARCHAR2(150)); --Segment value
2456 TYPE seg_name_value_tab
2457 IS
2458 TABLE OF name_value INDEX BY BINARY_INTEGER;
2459 l_seg_collection seg_collection_table;
2460 l_seg_name_value_tab seg_name_value_tab;
2461 l_group_name VARCHAR2(150);
2462 L_group_value VARCHAR2(1000);
2463 l_position NUMBER; -- '|'
2464 l_position_sub NUMBER; -- '~'
2465 temp_num NUMBER;
2466 temp_num_sub NUMBER;
2467 l_people_group_id NUMBER;
2468 l_temp_char VARCHAR2(150);
2469 tc sys_refcursor;
2470 BEGIN
2471 SELECT p_config_values('Group') INTO L_group_value FROM dual ;
2472 IF L_group_value IS NOT NULL THEN --If Any eligiblity criteria is set for 'GROUP'
2473 SELECT instr(L_group_value,'|') INTO l_position FROM dual;
2474 SELECT trim(SUBSTR(L_group_value,1,(l_position-1)))
2475 INTO l_group_name
2476 FROM dual;
2477 hr_utility.trace('l_group_name:'||l_group_name);
2478 OPEN c_group_name_check(l_group_name);
2479 FETCH c_group_name_check INTO l_test;
2480 IF c_group_name_check%notfound THEN
2481 hr_utility.trace('People Group Name is not valid::'||l_group_name);
2482 RAISE_APPLICATION_ERROR(-20001,'The People Group Name '||l_group_name||' entered for Eligibility Value is not valid.');
2483 END IF;
2484 CLOSE c_group_name_check;
2485 IF l_group_name IS NOT NULL THEN -- If No GROUP NAME is entered
2486 l_seg_name_value_tab(1).name :='$NAME$'; -- $ to avoid incase the same clashes with any People group Field Name
2487 l_seg_name_value_tab(1).value:=l_group_name;
2488 temp_num :=0;
2489 LOOP -- '~'
2490 temp_num:=temp_num +1;
2491 SELECT trim(SUBSTR(L_group_value,(l_position+1)))
2492 INTO L_group_value
2493 FROM dual;
2494 SELECT instr(L_group_value,'~') INTO l_position FROM dual;
2495 IF(l_position=0) THEN
2496 SELECT trim(SUBSTR(L_group_value,1))
2497 INTO l_seg_collection(temp_num)
2498 FROM dual;
2499 END IF;
2500 EXIT
2501 WHEN l_position=0;
2502 SELECT trim(SUBSTR(L_group_value,1,(l_position-1)))
2503 INTO l_seg_collection(temp_num)
2504 FROM dual;
2505 END LOOP; -- '~'
2506 FOR i IN 1..l_seg_collection.count
2507 LOOP
2508 hr_utility.trace('Seg Collection:: '||i||l_seg_collection(i));
2509 END LOOP;
2510 stmt :=NULL;
2511 FOR ii IN 1..l_seg_collection.count
2512 LOOP -- Segments Collection
2513 l_seg_name_value_tab.delete;
2514 l_seg_name_value_tab(1).name :='$NAME$';-- $ to avoid incase the same clashes with any People group Field Name
2515 l_seg_name_value_tab(1).value:=l_group_name;
2516 temp_num_sub :=0;
2517 l_position :=0;
2518 LOOP -- '|'
2519 temp_num_sub:=temp_num_sub +1;
2520 SELECT trim(SUBSTR(l_seg_collection(ii),(l_position+1)))
2521 INTO l_seg_collection(ii)
2522 FROM dual;
2523 SELECT instr(l_seg_collection(ii),'|') INTO l_position FROM dual;
2524 IF(l_position=0) THEN
2525 SELECT trim(SUBSTR(l_seg_collection(ii),1)) INTO l_temp_char FROM dual;
2526 SELECT trim(SUBSTR(l_temp_char,1,(instr(l_temp_char,'.')-1))),
2527 trim(SUBSTR(l_temp_char,(instr(l_temp_char,'.') +1)))
2528 INTO l_seg_name_value_tab(temp_num_sub).name,
2529 l_seg_name_value_tab(temp_num_sub).value
2530 FROM dual;
2531 END IF;
2532 EXIT
2533 WHEN l_position=0;
2534 SELECT trim(SUBSTR(l_seg_collection(ii),1,(l_position-1)))
2535 INTO l_temp_char
2536 FROM dual;
2537 SELECT trim(SUBSTR(l_temp_char,1,(instr(l_temp_char,'.')-1))),
2538 trim(SUBSTR(l_temp_char,(instr(l_temp_char,'.') +1)))
2539 INTO l_seg_name_value_tab(temp_num_sub).name,
2540 l_seg_name_value_tab(temp_num_sub).value
2541 FROM dual;
2542 END LOOP;-- '|'
2543 FOR i IN 1..l_seg_name_value_tab.count
2544 LOOP
2545 hr_utility.trace('For ii='||ii||'Seg val tab::'||l_seg_name_value_tab(i).name||'##'||l_seg_name_value_tab(i).value);
2546 END LOOP;
2547 IF ii =1 THEN -- Segment Collection First
2548 FOR i IN 1..l_seg_name_value_tab.count
2549 LOOP
2550 hr_utility.trace(l_seg_name_value_tab(i).name||'---'||l_seg_name_value_tab(i).value);
2551 OPEN c_col_name(l_group_name,l_seg_name_value_tab(i).name) ;
2552 FETCH c_col_name INTO l_col_name,l_flex_num;
2553 CLOSE c_col_name;
2554 hr_utility.trace('Column Name::'||l_col_name);
2555 hr_utility.trace('l_flex_num::'||l_flex_num);
2556 -- if i=2 then -- i=1 will be '$NAME$'
2557 IF l_flex_num IS NOT NULL AND l_col_name IS NOT NULL THEN
2558 IF i =1 THEN
2559 stmt := 'select PEOPLE_GROUP_ID from pay_people_groups where (ID_FLEX_NUM ='||l_flex_num||' and '|| l_col_name ||' = '||''''||l_seg_name_value_tab(i).value||'''';
2560 ELSE
2561 stmt := stmt ||' and '|| l_col_name ||' = '||''''||l_seg_name_value_tab(i).value||'''';
2562 END IF;
2563 ELSE
2564 hr_utility.trace('No Column found for the flexfield segment:: '||l_seg_name_value_tab(i).name);
2565 RAISE_APPLICATION_ERROR(-20001,'Segment Name: '||l_seg_name_value_tab(i).name||' entered for the People Group: '||l_group_name||' is not valid.');
2566 END IF;
2567 END LOOP;
2568 stmt := stmt||')';
2569 ELSE
2570 FOR i IN 1..l_seg_name_value_tab.count
2571 LOOP
2572 hr_utility.trace(l_seg_name_value_tab(i).name||'---'||l_seg_name_value_tab(i).value);
2573 OPEN c_col_name(l_group_name,l_seg_name_value_tab(i).name) ;
2574 FETCH c_col_name INTO l_col_name,l_flex_num;
2575 CLOSE c_col_name;
2576 hr_utility.trace('Column Name::'||l_col_name);
2577 hr_utility.trace('l_flex_num::'||l_flex_num);
2578 IF l_col_name IS NOT NULL THEN
2579 IF i =1 THEN
2580 stmt := stmt ||' OR ('|| l_col_name ||' = '||''''||l_seg_name_value_tab(i).value||'''';
2581 ELSE
2582 stmt := stmt ||' and '|| l_col_name ||' = '||''''||l_seg_name_value_tab(i).value||'''';
2583 END IF;
2584 ELSE
2585 hr_utility.trace('No Column found for the flexfield segment:: '||l_seg_name_value_tab(i).name);
2586 RAISE_APPLICATION_ERROR(-20001,'Segment Name: '||l_seg_name_value_tab(i).name||' entered for the People Group: '||l_group_name||' is not valid.');
2587 END IF;
2588 END LOOP;
2589 stmt := stmt||')';
2590 END IF; -- Segment Collection First
2591 END LOOP; -- Segments Collection
2592 hr_utility.trace('Final Statement : '||stmt);
2593 OPEN tc FOR stmt;
2594 LOOP
2595 FETCH tc INTO l_people_group_id;
2596 EXIT
2597 WHEN tc%notfound;
2598 hr_utility.trace('People_group_id::'||l_people_group_id);
2599 l_people_group_id_tab(l_people_group_id_tab.count+1) :=l_people_group_id;
2600 hr_utility.trace('PPPL GROUP ID into Table::'||l_people_group_id_tab(l_people_group_id_tab.count));
2601 END LOOP;
2602 CLOSE tc;
2603 END IF; -- If No GROUP NAME is entered
2604 END IF; --If Any eligiblity criteria is set for 'GROUP'
2605 END get_group_details;
2606 BEGIN
2607 --conv_configval_to_table(); -- Moved to ARCH_INIT
2608 l_flag :=0;
2609 l_final_flag :=0;
2610 FOR i IN 1..g_collecttab.count --Every Config Value
2611 LOOP
2612 l_receive_ppl_group.delete;
2613 l_flag:=0;
2614 hr_utility.trace('--------------------------------------------------------------------');
2615 hr_utility.trace('Scheme Number::: '||i);
2616 hr_utility.trace('--------------------------------------------------------------------');
2617 IF check_all_null(g_collecttab(i))=0 THEN --If Not, All values are null
2618 IF g_collecttab(i)('Group') IS NOT NULL THEN --Check for People Group and Others also If this is true
2619 get_group_details(g_collecttab(i),l_receive_ppl_group);
2620 hr_utility.trace('Count::'||l_receive_ppl_group.count);
2621 FOR j IN 1..l_receive_ppl_group.count--PPL Group ID Check
2622 LOOP
2623 hr_utility.trace(l_receive_ppl_group(j));
2624 ---Loop where all PPL Group ID are getting fetched one by one
2625 OPEN C_ASSIGNMENT_CHECK(l_receive_ppl_group(j));
2626 FETCH C_ASSIGNMENT_CHECK INTO l_test;
2627 IF C_ASSIGNMENT_CHECK%found THEN
2628 l_flag :=1;
2629 END IF;
2630 CLOSE C_ASSIGNMENT_CHECK;
2631 IF l_flag = 1 THEN
2632 EXIT;-- People group id loop
2633 END IF;
2634 END LOOP; --PPL Group ID Check
2635 END IF; --group not null
2636 IF l_flag =1 OR g_collecttab(i)('Group') IS NULL THEN --Check Only for Others
2637 l_flag := others_check(g_collecttab(i),P_ASSIGNMENT_ID);
2638 END IF;
2639 IF l_flag =1 THEN --Set Final Flag
2640 l_er_scheme_name :=g_collecttab(i)('Scheme Name');
2641 l_final_flag :=l_final_flag+1;
2642 IF (l_final_flag >1) THEN
2643 hr_utility.trace('Schemes Not Mutually Exclusive. Hence exiting group_check');
2644 RETURN 2;
2645 END IF;
2646 END IF;--Set Final Flag
2647 END IF; --If Not, All values are null
2648 END LOOP; --Every Config Value
2649 hr_utility.trace('Final criteria Flag::'||l_final_flag);
2650 IF l_final_flag =1 THEN
2651 hr_utility.trace('Criteria Met for the Scheme-'||l_er_scheme_name);
2652 RETURN 1;
2653 END IF;
2654 IF l_final_flag>1 THEN
2655 hr_utility.trace('Not Mutually Exclusive');
2656 RETURN 2;
2657 END IF;
2658 IF l_final_flag =0 THEN
2659 hr_utility.trace('No Scheme met the Criteria for the assignment');--Should throw an error
2660 RETURN 0; --No Scheme Found eligible for this assignment
2661 END IF;
2662 /*
2663 0 -- No Match
2664 1 -- Exaclty One Match
2665 2 -- More than one Match - Not Mutually Exclusive
2666 */
2667 END group_check;
2668 ---------------------------------------------------------------------------------------------------
2669 ---------------------------------------------------------------------------------------------------
2670 PROCEDURE UPDATE_INFO_ELEMENT(
2671 P_ASSIGNMENT_ID NUMBER ,
2672 P_INPUT_VALUE_ID1 NUMBER ,
2673 P_ENTRY_VALUE1 VARCHAR2 ,
2674 P_INPUT_VALUE_ID2 NUMBER ,
2675 P_ENTRY_VALUE2 VARCHAR2 ,
2676 P_INPUT_VALUE_ID3 NUMBER ,
2677 P_ENTRY_VALUE3 VARCHAR2 ,
2678 P_INPUT_VALUE_ID4 NUMBER ,
2679 P_ENTRY_VALUE4 VARCHAR2 ,
2680 P_INPUT_VALUE_ID5 NUMBER ,
2681 P_ENTRY_VALUE5 VARCHAR2 ,
2682 P_INPUT_VALUE_ID6 NUMBER ,
2683 P_ENTRY_VALUE6 VARCHAR2 ,
2684 P_INPUT_VALUE_ID7 NUMBER ,
2685 P_ENTRY_VALUE7 VARCHAR2 ,
2686 P_INPUT_VALUE_ID8 NUMBER ,
2687 P_ENTRY_VALUE8 VARCHAR2 ,
2688 P_INPUT_VALUE_ID9 NUMBER ,
2689 P_ENTRY_VALUE9 VARCHAR2 ,
2690 P_INPUT_VALUE_ID10 NUMBER ,
2691 P_ENTRY_VALUE10 VARCHAR2 ,
2692 P_INPUT_VALUE_ID11 NUMBER ,
2693 P_ENTRY_VALUE11 VARCHAR2 ,
2694 P_INPUT_VALUE_ID12 NUMBER ,
2695 P_ENTRY_VALUE12 VARCHAR2 ,
2696 P_INPUT_VALUE_ID13 NUMBER ,
2697 P_ENTRY_VALUE13 VARCHAR2 )
2698 IS
2699 -- PRAGMA AUTONOMOUS_TRANSACTION;
2700 L_ENTRY_VALUE2 VARCHAR(5):='No';
2701 L_ENTRY_VALUE4 VARCHAR(5):='No';
2702 L_ENTRY_VALUE10 VARCHAR(5):='No';
2703 CURSOR C_ELEMENT_ENTRIES
2704 IS
2705 SELECT ELEMENT_ENTRY_ID,
2706 GREATEST(EFFECTIVE_START_DATE,G_PRP_START_DATE) START_DATE
2707 FROM PAY_ELEMENT_ENTRIES_F
2708 WHERE ASSIGNMENT_ID =P_ASSIGNMENT_ID
2709 AND ELEMENT_TYPE_ID = G_ELEMENT_DETAILS.G_ELEMENT_TYPE_ID
2710 AND (G_PRP_START_DATE BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE
2711 OR EFFECTIVE_START_DATE > G_PRP_START_DATE);
2712 BEGIN
2713 hr_utility.trace('Inside Update Element Procedure with the mode :'|| G_MODE);
2714 hr_utility.trace('INput Value ID');
2715 hr_utility.trace(P_INPUT_VALUE_ID1);
2716 hr_utility.trace(P_INPUT_VALUE_ID2);
2717 hr_utility.trace(P_INPUT_VALUE_ID3);
2718 hr_utility.trace(P_INPUT_VALUE_ID4);
2719 hr_utility.trace(P_INPUT_VALUE_ID5);
2720 hr_utility.trace(P_INPUT_VALUE_ID6);
2721 hr_utility.trace(P_INPUT_VALUE_ID7);
2722 hr_utility.trace(P_INPUT_VALUE_ID8);
2723 hr_utility.trace(P_INPUT_VALUE_ID9);
2724 hr_utility.trace(P_INPUT_VALUE_ID10);
2725 hr_utility.trace(P_INPUT_VALUE_ID11);
2726 hr_utility.trace(P_INPUT_VALUE_ID12);
2727 hr_utility.trace(P_INPUT_VALUE_ID13);
2728 hr_utility.trace('Entry Values');
2729 hr_utility.trace(P_ENTRY_VALUE1);
2730 hr_utility.trace(P_ENTRY_VALUE2);
2731 hr_utility.trace(P_ENTRY_VALUE3);
2732 hr_utility.trace(P_ENTRY_VALUE4);
2733 hr_utility.trace(P_ENTRY_VALUE5);
2734 hr_utility.trace(P_ENTRY_VALUE6);
2735 hr_utility.trace(P_ENTRY_VALUE7);
2736 hr_utility.trace(P_ENTRY_VALUE8);
2737 hr_utility.trace(P_ENTRY_VALUE9);
2738 hr_utility.trace(P_ENTRY_VALUE10);
2739 hr_utility.trace(P_ENTRY_VALUE11);
2740 hr_utility.trace(P_ENTRY_VALUE12);
2741 hr_utility.trace(P_ENTRY_VALUE13);
2742 IF (P_ENTRY_VALUE2='Y') THEN
2743 L_ENTRY_VALUE2 :='Yes';
2744 ELSE
2745 L_ENTRY_VALUE2:='No';
2746 END IF;
2747 IF (P_ENTRY_VALUE4='Y') THEN
2748 L_ENTRY_VALUE4 :='Yes';
2749 ELSE
2750 L_ENTRY_VALUE4:='No';
2751 END IF;
2752 IF (P_ENTRY_VALUE10='Y') THEN
2753 L_ENTRY_VALUE10 :='Yes';
2754 ELSE
2755 L_ENTRY_VALUE10:='No';
2756 END IF;
2757 --Mode if -GB_VALIDATE Then Donot Update the Element
2758 FOR entries IN C_ELEMENT_ENTRIES
2759 LOOP
2760 SAVEPOINT update_element_transaction;
2761 HR_ENTRY_API.UPDATE_ELEMENT_ENTRY (P_DT_UPDATE_MODE =>'UPDATE', P_SESSION_DATE => entries.START_DATE, P_CHECK_FOR_UPDATE =>'N' , P_CREATOR_TYPE => 'F', P_ELEMENT_ENTRY_ID => entries.ELEMENT_ENTRY_ID ,
2762 P_INPUT_VALUE_ID1 => P_INPUT_VALUE_ID1, P_ENTRY_VALUE1 => P_ENTRY_VALUE1 , P_INPUT_VALUE_ID2 => P_INPUT_VALUE_ID2, P_ENTRY_VALUE2 => L_ENTRY_VALUE2 ,P_INPUT_VALUE_ID3 => P_INPUT_VALUE_ID3,
2763 P_ENTRY_VALUE3 => P_ENTRY_VALUE3 , P_INPUT_VALUE_ID4 => P_INPUT_VALUE_ID4, P_ENTRY_VALUE4 => L_ENTRY_VALUE4, P_INPUT_VALUE_ID5 => P_INPUT_VALUE_ID5, P_ENTRY_VALUE5 => P_ENTRY_VALUE5,
2764 P_INPUT_VALUE_ID6 => P_INPUT_VALUE_ID6, P_ENTRY_VALUE6 => P_ENTRY_VALUE6, P_INPUT_VALUE_ID7 => P_INPUT_VALUE_ID7, P_ENTRY_VALUE7 => P_ENTRY_VALUE7, P_INPUT_VALUE_ID8 => P_INPUT_VALUE_ID8,
2765 P_ENTRY_VALUE8 => P_ENTRY_VALUE8, P_INPUT_VALUE_ID9 => P_INPUT_VALUE_ID9, P_ENTRY_VALUE9 => P_ENTRY_VALUE9, P_INPUT_VALUE_ID10 => P_INPUT_VALUE_ID10, P_ENTRY_VALUE10 => L_ENTRY_VALUE10,
2766 P_INPUT_VALUE_ID11 => P_INPUT_VALUE_ID11, P_ENTRY_VALUE11 => P_ENTRY_VALUE11, P_INPUT_VALUE_ID12 => P_INPUT_VALUE_ID12, P_ENTRY_VALUE12 => P_ENTRY_VALUE12, P_INPUT_VALUE_ID13 => P_INPUT_VALUE_ID13,
2767 P_ENTRY_VALUE13 => P_ENTRY_VALUE13 );
2768 IF NOT (G_MODE='GB_VALIDATE_COMMIT') THEN
2769 ROLLBACK TO update_element_transaction;
2770 END IF;
2771 END LOOP;
2772 --Rollback to the savepoint 'update_element_transaction' if not in Commit Mode.
2773 EXCEPTION
2774 WHEN OTHERS THEN
2775 hr_utility.trace('ERROR'||SQLERRM);
2776 hr_utility.trace('Error While Updating Pensions Information Element');
2777 --ROLLBACK;
2778 RAISE;
2779 END UPDATE_INFO_ELEMENT;
2780 --------------------------------------------------------------------------------------------------
2781 --
2782 PROCEDURE populate_run_msg(
2783 p_assignment_action_id IN NUMBER ,
2784 p_message_text IN VARCHAR2 )
2785 IS
2786 PRAGMA AUTONOMOUS_TRANSACTION;
2787 BEGIN
2788 hr_utility.set_location(' Entering: populate_run_msg',111);
2789 INSERT
2790 INTO pay_message_lines
2791 (
2792 line_sequence,
2793 payroll_id,
2794 message_level,
2795 source_id,
2796 source_type,
2797 line_text
2798 )
2799 VALUES
2800 (
2801 pay_message_lines_s.nextval ,
2802 123 ,
2803 'F' ,
2804 p_assignment_action_id ,
2805 'A' ,
2806 SUBSTR(p_message_text,1,2000)
2807 );
2808 hr_utility.set_location(' Leaving: populate_run_msg',999);
2809 COMMIT;
2810 EXCEPTION
2811 WHEN OTHERS THEN
2812 hr_utility.trace('Error occured in populate_run_msg');
2813 RAISE;
2814 END populate_run_msg;
2815 -----------------------------------------------------------------------------------------------------
2816 PROCEDURE populate_warn_msg
2817 (
2818 p_assignment_action_id IN NUMBER ,
2819 p_message_text IN VARCHAR2
2820 )
2821 IS
2822 PRAGMA AUTONOMOUS_TRANSACTION;
2823 BEGIN
2824 hr_utility.set_location(' Entering: populate_warn_msg',111);
2825 INSERT
2826 INTO pay_message_lines
2827 (
2828 line_sequence,
2829 payroll_id,
2830 message_level,
2831 source_id,
2832 source_type,
2833 line_text
2834 )
2835 VALUES
2836 (
2837 pay_message_lines_s.nextval ,
2838 111 ,
2839 'W' ,
2840 p_assignment_action_id ,
2841 'A' ,
2842 SUBSTR(p_message_text,1,2000)
2843 );
2844 hr_utility.set_location(' Leaving: populate_warn_msg',999);
2845 COMMIT;
2846 EXCEPTION
2847 WHEN OTHERS THEN
2848 hr_utility.trace('Error occured in populate_run_msg');
2849 RAISE;
2850 END populate_warn_msg;
2851 PROCEDURE INSERT_PENSION_ELEMENT
2852 (
2853 V_EFF_START_DATE IN OUT NOCOPY DATE ,-- Auto Enrolment Date is passed here -- Bug 14343133
2854 V_EFF_END_DATE IN OUT NOCOPY DATE ,
2855 V_ELEMENT_ENTRY_ID IN OUT NOCOPY NUMBER ,
2856 P_ASSIGNMENT_ID NUMBER ,
2857 P_ELEMENT_TYPE_NAME VARCHAR,
2858 P_AGGREGATION_FLAG VARCHAR,
2859 P_PERSON_ID NUMBER,
2860 P_ASSIGNMENT_ACTION_ID NUMBER
2861 )
2862 IS
2863 -- PRAGMA AUTONOMOUS_TRANSACTION;
2864 L_SERVICE_START DATE;
2865 l_asg_start_date DATE;
2866 --To Fetch the Assignment Start Date
2867 Cursor c_asg_start_date is
2868 select EFFECTIVE_START_DATE from per_all_assignments_f
2869 where assignment_id = p_assignment_id
2870 and g_prp_end_date between EFFECTIVE_START_DATE and EFFECTIVE_END_DATE;
2871 ---To Fetch Service Start Date of the employee
2872 CURSOR C_SERVICE_START (P_PERSON_ID PER_ALL_PEOPLE_F.PERSON_ID%TYPE)
2873 IS
2874 SELECT DATE_START
2875 FROM PER_PERIODS_OF_SERVICE
2876 WHERE PERSON_ID = P_PERSON_ID
2877 AND BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID;
2878 -- To get the Period start date of the period - date paid immeditely after Auto-Enrolment Date
2879 CURSOR C_PENSION_ENTRY_START(P_PAYROLL_ID NUMBER,P_SERVICE_START DATE,P_ASG_START_DATE DATE)
2880 IS
2881 SELECT GREATEST(START_DATE,P_SERVICE_START,P_ASG_START_DATE)
2882 FROM PER_TIME_PERIODS
2883 WHERE REGULAR_PAYMENT_DATE >= V_EFF_START_DATE
2884 AND PAYROLL_ID = P_PAYROLL_ID
2885 ORDER BY REGULAR_PAYMENT_DATE;
2886 CURSOR C_ELEMENT_INFO
2887 IS
2888 SELECT ELEMENT_TYPE_ID
2889 FROM PAY_ELEMENT_TYPES_F
2890 WHERE ELEMENT_NAME =P_ELEMENT_TYPE_NAME
2891 AND BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID
2892 AND V_EFF_START_DATE BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE;
2893 -- Cursor to fetch all Active Aggregated assignments across payrolls
2894 CURSOR C_ALL_ASSIGNMENTS_AGG (L_PERSON_ID NUMBER)
2895 IS
2896 SELECT PAAF.PAYROLL_ID,PAAF.EFFECTIVE_START_DATE,
2897 PAAF.ASSIGNMENT_ID,
2898 PEEF.ELEMENT_ENTRY_ID,
2899 PAAF.ASSIGNMENT_NUMBER
2900 FROM PER_ALL_PEOPLE_F PAPF,
2901 PER_ALL_ASSIGNMENTS_F PAAF,
2902 PAY_ELEMENT_ENTRY_VALUES_F PEEVF,
2903 PAY_ELEMENT_ENTRIES_F PEEF,
2904 PER_ASSIGNMENT_STATUS_TYPES PAST
2905 WHERE PAAF.PERSON_ID =PAPF.PERSON_ID
2906 AND PAPF.PERSON_ID =L_PERSON_ID
2907 AND PAAF.ASSIGNMENT_STATUS_TYPE_ID = PAST.ASSIGNMENT_STATUS_TYPE_ID
2908 -- AND PAST.PAY_SYSTEM_STATUS='P'
2909 AND PAST.PER_SYSTEM_STATUS <> 'TERM_ASSIGN'
2910 AND PEEF.ASSIGNMENT_ID =PAAF.ASSIGNMENT_ID
2911 AND PEEF.ELEMENT_TYPE_ID =G_ELEMENT_DETAILS.G_ELEMENT_TYPE_ID
2912 AND PEEVF.ELEMENT_ENTRY_ID =PEEF.ELEMENT_ENTRY_ID
2913 AND PEEVF.INPUT_VALUE_ID =G_ELEMENT_DETAILS.G_AGG_EARNINGS_PENSIONS_ID
2914 AND PEEVF.SCREEN_ENTRY_VALUE ='Y'
2915 AND G_PRP_END_DATE BETWEEN PEEF.EFFECTIVE_START_DATE AND PEEF.EFFECTIVE_END_DATE
2916 AND G_PRP_END_DATE BETWEEN PEEVF.EFFECTIVE_START_DATE AND PEEVF.EFFECTIVE_END_DATE
2917 AND G_PRP_END_DATE BETWEEN PAAF.EFFECTIVE_START_DATE AND PAAF.EFFECTIVE_END_DATE
2918 AND G_PRP_END_DATE BETWEEN PAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE;
2919 L_PENSION_ENTRY_START DATE :=NULL;
2920 P_ELEMENT_LINK_ID NUMBER;
2921 P_ELEMENT_TYPE_ID NUMBER;
2922 BEGIN
2923 hr_utility.trace('Insert Pension Element');
2924 hr_utility.trace('G_BUSINESS_GROUP_ID :'||G_BUSINESS_GROUP_ID);
2925 hr_utility.trace('P_ELEMENT_TYPE_NAME:'||P_ELEMENT_TYPE_NAME);
2926 OPEN C_SERVICE_START(P_PERSON_ID);
2927 FETCH C_SERVICE_START INTO L_SERVICE_START;
2928 CLOSE C_SERVICE_START;
2929 hr_utility.trace('L_SERVICE_START : '||L_SERVICE_START);
2930
2931 OPEN c_asg_start_date;
2932 FETCH c_asg_start_date INTO l_asg_start_date;
2933 CLOSE c_asg_start_date;
2934 hr_utility.trace('l_asg_start_date : '||l_asg_start_date);
2935 OPEN C_ELEMENT_INFO ;
2936 FETCH C_ELEMENT_INFO INTO P_ELEMENT_TYPE_ID;
2937 IF C_ELEMENT_INFO%NOTFOUND THEN
2938 hr_utility.trace('No Details Found for the Pension Deduction Element: '||P_ELEMENT_TYPE_NAME);
2939 -- RAISE_APPLICATION_ERROR(-20001,'No Details Found for the Pension Deduction Element: '||P_ELEMENT_TYPE_NAME);
2940 END IF;
2941 CLOSE C_ELEMENT_INFO;
2942 hr_utility.trace('P_AGGREGATION_FLAG::'||P_AGGREGATION_FLAG);
2943 --Non Aggregated
2944 IF NVL(P_AGGREGATION_FLAG,'N')='N' THEN
2945 --To get the date where the pension element is to be attached
2946 OPEN C_PENSION_ENTRY_START(G_PAYROLL_ID,L_SERVICE_START,l_asg_start_date);
2947 FETCH C_PENSION_ENTRY_START INTO L_PENSION_ENTRY_START;
2948 CLOSE C_PENSION_ENTRY_START;
2949 hr_utility.trace('L_PENSION_ENTRY_START:'||L_PENSION_ENTRY_START);
2950 --Get Link Id
2951 P_ELEMENT_LINK_ID:=hr_entry_api.get_link( P_assignment_id => P_ASSIGNMENT_ID, P_element_type_id => P_ELEMENT_TYPE_ID, P_session_date => L_PENSION_ENTRY_START);
2952 hr_utility.trace('P_ELEMENT_LINK_ID:'||P_ELEMENT_LINK_ID);
2953 IF P_ELEMENT_LINK_ID IS NULL THEN
2954 hr_utility.trace('The Pension Element '||P_ELEMENT_TYPE_NAME||' does not have an eligible link to the Assignment ID ' ||P_ASSIGNMENT_ID ||' as on '||L_PENSION_ENTRY_START);
2955 --raise_application_error(-20001,'The Pension Element '||P_ELEMENT_TYPE_NAME||' does not have an eligible link to the Assignment ID ' ||P_ASSIGNMENT_ID||' as on '||L_PENSION_ENTRY_START);
2956 populate_run_msg(P_ASSIGNMENT_ACTION_ID,'The Pension Element '||P_ELEMENT_TYPE_NAME||' does not have an eligible link to the Assignment Number ' ||NVL(get_assg_number(P_ASSIGNMENT_ID),'N/A') ||' as on '||
2957 L_PENSION_ENTRY_START||'.');
2958 RAISE G_EXCEPTION_NO_UPDATE;-- Just Archive for Error Cases.
2959 ELSE
2960 --Insert Pension Element
2961 --Mode if -GB_VALIDATE Then Donot Insert the Element
2962 SAVEPOINT insert_element_transaction;
2963 hr_utility.trace('VAlues Before .1. Start'||L_PENSION_ENTRY_START||'.2. End '||V_EFF_END_DATE||'.3. Entry Id'||V_ELEMENT_ENTRY_ID);
2964 HR_ENTRY_API.INSERT_ELEMENT_ENTRY(P_EFFECTIVE_START_DATE => L_PENSION_ENTRY_START, P_EFFECTIVE_END_DATE => V_EFF_END_DATE, P_ELEMENT_ENTRY_ID => V_ELEMENT_ENTRY_ID, P_ASSIGNMENT_ID => P_ASSIGNMENT_ID,
2965 P_ELEMENT_LINK_ID => P_ELEMENT_LINK_ID, P_CREATOR_TYPE => 'F', P_ENTRY_TYPE => 'E' );
2966 hr_utility.trace('VAlues After .1. Start'||L_PENSION_ENTRY_START||'.2. End '||V_EFF_END_DATE||'.3. Entry Id'||V_ELEMENT_ENTRY_ID);
2967 IF NOT (G_MODE='GB_VALIDATE_COMMIT') THEN
2968 ROLLBACK TO insert_element_transaction;
2969 END IF;--Rollback to the savepoint 'insert_element_transaction' if not in Commit Mode.
2970 IF (V_EFF_END_DATE <G_END_OF_TIME) THEN
2971 hr_utility.trace('The Pension Element '||P_ELEMENT_TYPE_NAME||' is attached to the Assignment ID '||P_ASSIGNMENT_ID||' effective from '||L_PENSION_ENTRY_START||' to ' ||V_EFF_END_DATE||'.');
2972 populate_warn_msg(p_assignment_action_id,'The Pension Element '||P_ELEMENT_TYPE_NAME||' has been attached to the Assignment Number '||NVL(get_assg_number(P_ASSIGNMENT_ID),'N/A')||' effective from '||
2973 L_PENSION_ENTRY_START||' to ' ||V_EFF_END_DATE||'. Please review the reason for end date not being extended beyond '||V_EFF_END_DATE ||'.');
2974 END IF;
2975 END IF;
2976 END IF;--Non Aggregated
2977 --######################################################
2978 --Aggregated
2979 IF NVL(P_AGGREGATION_FLAG,'N')='Y' THEN
2980 FOR I IN C_ALL_ASSIGNMENTS_AGG(P_PERSON_ID)
2981 LOOP
2982 --To get the date where the pension element is to be attached
2983 OPEN C_PENSION_ENTRY_START(I.PAYROLL_ID,L_SERVICE_START,I.EFFECTIVE_START_DATE);
2984 FETCH C_PENSION_ENTRY_START INTO L_PENSION_ENTRY_START;
2985 CLOSE C_PENSION_ENTRY_START;
2986 --Get Link Id
2987 hr_utility.trace('Inside Aggregation Insert Pension Element');
2988 P_ELEMENT_LINK_ID:=hr_entry_api.get_link( P_assignment_id => I.ASSIGNMENT_ID, P_element_type_id => P_ELEMENT_TYPE_ID, P_session_date => L_PENSION_ENTRY_START);
2989 hr_utility.trace('P_ELEMENT_LINK_ID:'||P_ELEMENT_LINK_ID);
2990 IF P_ELEMENT_LINK_ID IS NULL THEN
2991 hr_utility.trace('The Pension Element '||P_ELEMENT_TYPE_NAME||' does not have an eligible link to the Assignment ID ' ||I.ASSIGNMENT_ID||' as on '||L_PENSION_ENTRY_START);
2992 -- raise_application_error(-20001,'The Pension Element '||P_ELEMENT_TYPE_NAME||' does not have an eligible link to the Assignment ID ' ||I.ASSIGNMENT_ID||' as on '||L_PENSION_ENTRY_START);
2993 populate_run_msg(p_assignment_action_id,'The Pension Element '||P_ELEMENT_TYPE_NAME||' does not have an eligible link to the Assignment Number ' ||NVL(get_assg_number(I.ASSIGNMENT_ID),'N/A')||' as on '
2994 ||L_PENSION_ENTRY_START||'.');
2995 RAISE G_EXCEPTION_NO_UPDATE;-- Just Archive for Error Cases.
2996 ELSE
2997 --Insert Pension Element
2998 --Mode if -GB_VALIDATE Then Donot Insert the Element
2999 SAVEPOINT insert_element_transaction_agg;
3000 hr_utility.trace('VAlues Before .1. Start'||L_PENSION_ENTRY_START||'.2. End '||V_EFF_END_DATE||'.3. Entry Id'||V_ELEMENT_ENTRY_ID);
3001 HR_ENTRY_API.INSERT_ELEMENT_ENTRY(P_EFFECTIVE_START_DATE => L_PENSION_ENTRY_START, P_EFFECTIVE_END_DATE => V_EFF_END_DATE, P_ELEMENT_ENTRY_ID => V_ELEMENT_ENTRY_ID, P_ASSIGNMENT_ID => I.ASSIGNMENT_ID,
3002 P_ELEMENT_LINK_ID => P_ELEMENT_LINK_ID, P_CREATOR_TYPE => 'F', P_ENTRY_TYPE => 'E' );
3003 hr_utility.trace('VAlues After .1. Start'||L_PENSION_ENTRY_START||'.2. End '||V_EFF_END_DATE||'.3. Entry Id'||V_ELEMENT_ENTRY_ID);
3004 IF NOT (G_MODE='GB_VALIDATE_COMMIT') THEN
3005 ROLLBACK TO insert_element_transaction_agg;
3006 END IF;--Rollback to the savepoint 'insert_element_transaction_agg' if not in Commit Mode.
3007 IF (V_EFF_END_DATE <G_END_OF_TIME) THEN
3008 hr_utility.trace('The Pension Element '||P_ELEMENT_TYPE_NAME||' is attached to the Assignment ID '||I.ASSIGNMENT_ID||' effective from '||L_PENSION_ENTRY_START||' to ' ||V_EFF_END_DATE||'.');
3009 populate_warn_msg(p_assignment_action_id,'The Pension Element '||P_ELEMENT_TYPE_NAME||' has been attached to the Assignment Number '||NVL(get_assg_number(I.ASSIGNMENT_ID),'N/A')||' effective from '||
3010 L_PENSION_ENTRY_START||' to ' ||V_EFF_END_DATE||'. Please review the reason for end date not being extended beyond '||V_EFF_END_DATE ||'.');
3011 END IF;
3012 END IF;
3013 END LOOP;
3014 END IF;--Aggregated
3015 --######################################################
3016 EXCEPTION
3017 WHEN OTHERS THEN
3018 hr_utility.trace('Error While Inserting Pension Element');
3019 hr_utility.trace('SQLERRM'||sqlerrm);
3020 RAISE;
3021 END INSERT_PENSION_ELEMENT;
3022 --------------------------------------------------------------------------------------------------
3023 /*
3024 (Aggregated) Active assignments under that employee will be processed in this procedure except the Main Entry.
3025 Main Entry Will be processed in the Enroll Pensions even before this Procedure is called.
3026 */
3027 PROCEDURE AGGREGATED(
3028 L_PERSON_ID PER_ALL_PEOPLE_F.PERSON_ID%TYPE,
3029 L_QUALIFYING_SCHEME_NAME PQP_GB_PENSION_SCHEMES_V.ELEMENT_NAME%TYPE ,
3030 L_AGGREGATION_FLAG VARCHAR2,
3031 L_AUTO_ENROLLMENT_DATE DATE,
3032 L_QUALIFYING_SCHEME_EXISTS VARCHAR2 ,
3033 L_POSTPONEMENT_TYPE VARCHAR2,
3034 L_POSTPONEMENT_DATE DATE ,
3035 L_EMPLOYEE_CLASS_FOR_PENSION VARCHAR2,
3036 L_OPTIN_DATE DATE ,
3037 L_OPTOUT_DATE DATE ,
3038 L_MAIN_ENTRY VARCHAR2,
3039 L_EARNINGS NUMBER,
3040 L_OPTOUT_END_DATE DATE ,
3041 L_ELIGIBLE_JH_DATE DATE )
3042 IS
3043 -- Cursor to fetch all Active Aggregated assignments across payrolls
3044 CURSOR C_ALL_ASSIGNMENTS_AGG (L_PERSON_ID NUMBER)
3045 IS
3046 SELECT PAAF.PAYROLL_ID,
3047 PAAF.ASSIGNMENT_ID,
3048 PEEF.ELEMENT_ENTRY_ID,
3049 PAAF.ASSIGNMENT_NUMBER
3050 FROM PER_ALL_PEOPLE_F PAPF,
3051 PER_ALL_ASSIGNMENTS_F PAAF,
3052 PAY_ELEMENT_ENTRY_VALUES_F PEEVF,
3053 PAY_ELEMENT_ENTRIES_F PEEF,
3054 PER_ASSIGNMENT_STATUS_TYPES PAST
3055 WHERE PAAF.PERSON_ID =PAPF.PERSON_ID
3056 AND PAPF.PERSON_ID =L_PERSON_ID
3057 AND PAAF.ASSIGNMENT_STATUS_TYPE_ID = PAST.ASSIGNMENT_STATUS_TYPE_ID
3058 -- AND PAST.PAY_SYSTEM_STATUS='P'
3059 AND PAST.PER_SYSTEM_STATUS <> 'TERM_ASSIGN'
3060 AND PEEF.ASSIGNMENT_ID =PAAF.ASSIGNMENT_ID
3061 AND PEEF.ELEMENT_TYPE_ID =G_ELEMENT_DETAILS.G_ELEMENT_TYPE_ID
3062 AND PEEVF.ELEMENT_ENTRY_ID =PEEF.ELEMENT_ENTRY_ID
3063 AND PEEVF.INPUT_VALUE_ID =G_ELEMENT_DETAILS.G_AGG_EARNINGS_PENSIONS_ID
3064 AND PEEVF.SCREEN_ENTRY_VALUE ='Y'
3065 AND G_PRP_END_DATE BETWEEN PEEF.EFFECTIVE_START_DATE AND PEEF.EFFECTIVE_END_DATE
3066 AND G_PRP_END_DATE BETWEEN PEEVF.EFFECTIVE_START_DATE AND PEEVF.EFFECTIVE_END_DATE
3067 AND G_PRP_END_DATE BETWEEN PAAF.EFFECTIVE_START_DATE AND PAAF.EFFECTIVE_END_DATE
3068 AND G_PRP_END_DATE BETWEEN PAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE;
3069 BEGIN
3070 hr_utility.trace('Inside the Procedure AGGREGATED');
3071 FOR I IN C_ALL_ASSIGNMENTS_AGG(L_PERSON_ID)
3072 LOOP
3073 P_PENSION_INPUT_VALUES_DUMMY := NULL ;
3074 hr_utility.trace('---------------------------------------------------------------------------------------------');
3075 OPEN C_PENSION_INPUT_VALUES(I.ELEMENT_ENTRY_ID);
3076 FETCH C_PENSION_INPUT_VALUES INTO P_PENSION_INPUT_VALUES_DUMMY;
3077 CLOSE C_PENSION_INPUT_VALUES;
3078 UPDATE_INFO_ELEMENT( I.ASSIGNMENT_ID , G_ELEMENT_DETAILS.G_QUALIFYING_SCHEME_NAME_ID, L_QUALIFYING_SCHEME_NAME , G_ELEMENT_DETAILS.G_AGG_EARNINGS_PENSIONS_ID, L_AGGREGATION_FLAG ,
3079 G_ELEMENT_DETAILS.G_AUTO_ENROLLMENT_DATE_ID, L_AUTO_ENROLLMENT_DATE , G_ELEMENT_DETAILS.G_QUALIFYING_PS_EXISTS_ID, L_QUALIFYING_SCHEME_EXISTS , G_ELEMENT_DETAILS.G_POSTPONEMENT_TYPE_ID,
3080 L_POSTPONEMENT_TYPE , G_ELEMENT_DETAILS.G_POSTPONEMENT_END_DATE_ID, L_POSTPONEMENT_DATE , G_ELEMENT_DETAILS.G_EMPLOYEE_CLASS_ID, L_EMPLOYEE_CLASS_FOR_PENSION , G_ELEMENT_DETAILS.G_OPT_IN_DATE_ID,
3081 L_OPTIN_DATE , G_ELEMENT_DETAILS.G_OPT_OUT_DATE_ID, L_OPTOUT_DATE , G_ELEMENT_DETAILS.G_MAIN_ENTRY_ID, P_PENSION_INPUT_VALUES_DUMMY.G_MAIN_ENTRY -- Main Entry has to be retained as before
3082 , G_ELEMENT_DETAILS.G_TOTAL_EARNING_PRP_ID, L_EARNINGS , G_ELEMENT_DETAILS.G_OPT_OUT_END_DATE_ID, L_OPTOUT_END_DATE , G_ELEMENT_DETAILS.G_ELIGIBLE_JH_DATE_ID ,
3083 /*Bug 14622818*/
3084 to_char (l_eligible_jh_date ,fnd_date.name_in_mask) );
3085 hr_utility.trace('---------------------------------------------------------------------------------------------');
3086 END LOOP;
3087 END;
3088 PROCEDURE WRITE_OUTPUT
3089 IS
3090 -- Cursor to fetch Completed records
3091 CURSOR get_asg_action_id
3092 IS
3093 SELECT DISTINCT paa.assignment_action_id asg_action_id,
3094 assignment_id
3095 FROM pay_payroll_actions ppa,
3096 pay_assignment_actions paa
3097 WHERE ppa.payroll_action_id = G_PAYROLL_ACTION_ID -- pact_id
3098 AND paa.payroll_action_id = ppa.payroll_action_id
3099 AND paa.action_status = 'C'
3100 --Bug 14492289 - Reporting EJH in separate Sections
3101 AND NOT EXISTS
3102 (SELECT 1
3103 FROM PAY_MESSAGE_LINES
3104 WHERE PAYROLL_ID = 123
3105 AND MESSAGE_LEVEL ='F'
3106 AND SOURCE_ID = PAA.ASSIGNMENT_ACTION_ID
3107 AND SOURCE_TYPE = 'A'
3108 )
3109 --Bug 14492289 - Reporting EJH in separate Sections
3110 ORDER BY assignment_id;
3111 -- Cursor to fetch Errored Records
3112 CURSOR get_asg_action_id_error
3113 IS
3114 SELECT DISTINCT paa.assignment_action_id asg_action_id,
3115 assignment_id
3116 FROM pay_payroll_actions ppa,
3117 pay_assignment_actions paa
3118 WHERE ppa.payroll_action_id = G_PAYROLL_ACTION_ID -- pact_id
3119 AND paa.payroll_action_id = ppa.payroll_action_id
3120 AND
3121 --Bug 14492289 - Reporting EJH in separate Sections
3122 ( paa.action_status = 'E'
3123 OR (paa.action_status = 'C'
3124 AND EXISTS
3125 (SELECT 1
3126 FROM PAY_MESSAGE_LINES
3127 WHERE PAYROLL_ID = 123
3128 AND MESSAGE_LEVEL ='F'
3129 AND SOURCE_ID = PAA.ASSIGNMENT_ACTION_ID
3130 AND SOURCE_TYPE = 'A'
3131 ) ) )
3132 --Bug 14492289 - Reporting EJH in separate Sections
3133 ORDER BY assignment_id;
3134 -- To Get Details for the assignment
3135 CURSOR get_assignment_info(p_assignment_id NUMBER,p_asg_actid NUMBER)
3136 IS
3137 SELECT PAI.ACTION_INFORMATION15 assignment_number,
3138 PAI.ACTION_INFORMATION14 full_name,
3139 NVL(PAI.ACTION_INFORMATION7,'NA') classification,
3140 NVL(TO_CHAR(fnd_date.canonical_to_date(PAI.ACTION_INFORMATION9)),'NA') auto_en_date
3141 FROM PAY_ACTION_INFORMATION PAI
3142 WHERE PAI.assignment_id =p_assignment_id
3143 AND PAI.ACTION_CONTEXT_ID =p_asg_actid
3144 AND PAI.ACTION_CONTEXT_TYPE='AAP';
3145 ---To Fetch Messages
3146 CURSOR get_messages(p_assignment_action_id NUMBER)
3147 IS
3148 SELECT DISTINCT line_text
3149 FROM pay_message_lines
3150 WHERE source_id = p_assignment_action_id
3151 AND payroll_id = 123;
3152 --To Fetch Warning Messages
3153 CURSOR get_warn_messages(p_assignment_action_id NUMBER)
3154 IS
3155 SELECT DISTINCT line_text
3156 FROM pay_message_lines
3157 WHERE source_id = p_assignment_action_id
3158 AND payroll_id = 111;
3159 l_assgn_number per_all_assignments_f.assignment_number%type;
3160 BEGIN
3161 fnd_file.put_line(fnd_file.OUTPUT,'ASSIGNMENTS PROCESSED SUCCESSFULLY');
3162 fnd_file.put_line(fnd_file.OUTPUT,'----------------------------------');
3163 --fnd_file.put_line(fnd_file.OUTPUT,'-----------------------------------');
3164 fnd_file.put_line(fnd_file.OUTPUT,rpad('ASSIGNMENT NUMBER',20)|| rpad('EMPLOYEE NAME',50)|| rpad('EMPLOYEE CLASSIFICATION',30)|| rpad('AUTO-ENROLMENT DATE',25));
3165 fnd_file.put_line(fnd_file.OUTPUT,'-----------------------------------------------------------------------------------------------------------------------------');
3166 FOR I IN get_asg_action_id
3167 LOOP
3168 FOR J IN get_assignment_info(I.assignment_id,I.asg_action_id)
3169 LOOP
3170 fnd_file.put_line(fnd_file.OUTPUT,rpad(J.assignment_number,20)|| rpad(J.full_name,50)|| rpad(J.classification,30)|| rpad(J.auto_en_date,25));
3171 /*FOR J IN get_warn_messages(I.asg_action_id)
3172 LOOP
3173 fnd_file.put_line(fnd_file.OUTPUT,lpad('WARNING: ',10)||J.line_text);
3174 --fnd_file.put_line(fnd_file.OUTPUT,lpad(J.line_text,125));
3175 END LOOP;
3176 */
3177 END LOOP;
3178 END LOOP;
3179 fnd_file.put_line(fnd_file.OUTPUT,' ');
3180 fnd_file.put_line(fnd_file.OUTPUT,' ');
3181 fnd_file.put_line(fnd_file.OUTPUT,'ASSIGNMENTS COMPLETED WITH WARNINGS');
3182 fnd_file.put_line(fnd_file.OUTPUT,'-----------------------------------');
3183 fnd_file.put_line(fnd_file.OUTPUT,'ASSIGNMENT NUMBER - MESSAGE');
3184 fnd_file.put_line(fnd_file.OUTPUT,'-------------------------------------');
3185 FOR I IN get_asg_action_id
3186 LOOP
3187 FOR J IN get_warn_messages(I.asg_action_id)
3188 LOOP
3189 OPEN get_assignment_number(I.assignment_id);
3190 FETCH get_assignment_number INTO l_assgn_number;
3191 CLOSE get_assignment_number;
3192 fnd_file.put_line(fnd_file.OUTPUT,rpad(NVL(l_assgn_number,'NA'),20)||J.line_text);
3193 END LOOP;
3194 END LOOP;
3195 fnd_file.put_line(fnd_file.OUTPUT,' ');
3196 fnd_file.put_line(fnd_file.OUTPUT,' ');
3197 fnd_file.put_line(fnd_file.OUTPUT,'ERRORED ASSIGNMENTS');
3198 fnd_file.put_line(fnd_file.OUTPUT,'-------------------');
3199 fnd_file.put_line(fnd_file.OUTPUT,'ASSIGNMENT NUMBER - MESSAGE');
3200 fnd_file.put_line(fnd_file.OUTPUT,'-------------------------------------');
3201 FOR I IN get_asg_action_id_error
3202 LOOP
3203 FOR J IN get_messages(I.asg_action_id)
3204 LOOP
3205 OPEN get_assignment_number(I.assignment_id);
3206 FETCH get_assignment_number INTO l_assgn_number;
3207 CLOSE get_assignment_number;
3208 fnd_file.put_line(fnd_file.OUTPUT,rpad(NVL(l_assgn_number,'NA'),20)||J.line_text);
3209 END LOOP;
3210 END LOOP;
3211 END;
3212 -----
3213 PROCEDURE archinit(
3214 p_payroll_action_id IN NUMBER)
3215 IS
3216 l_proc CONSTANT VARCHAR2(50) := ' archinit';
3217 l_payroll_id NUMBER;
3218 l_time_period_id NUMBER;
3219 ------------------------------
3220 -- Cursor to get Pension Scheme Name at Payroll Level if any
3221 CURSOR C_GET_PAYROLL_PENSION_INFO
3222 IS
3223 SELECT scl.SEGMENT19
3224 FROM pay_all_payrolls_f ppf,
3225 hr_soft_coding_keyflex scl
3226 WHERE ppf.payroll_id =G_PAYROLL_ID
3227 AND scl.soft_coding_keyflex_id = ppf.soft_coding_keyflex_id
3228 AND G_PRP_END_DATE BETWEEN ppf.effective_start_date AND ppf.effective_end_date;
3229 ------------------------------------------------------------------------------------------
3230 --Bug 14370667
3231 -- Concurrent Program Parameters
3232 CURSOR CSR_ACT_CP_INFO
3233 IS
3234 SELECT TO_NUMBER(PAY_GB_EOY_ARCHIVE.GET_PARAMETER(LEGISLATIVE_PARAMETERS, 'PAYROLL_ID')) PAYROLL_ID,
3235 TO_NUMBER(PAY_GB_EOY_ARCHIVE.GET_PARAMETER(LEGISLATIVE_PARAMETERS, 'PERIOD_ID')) TIME_PERIOD_ID,
3236 BUSINESS_GROUP_ID
3237 FROM PAY_PAYROLL_ACTIONS
3238 WHERE PAYROLL_ACTION_ID = p_payroll_action_id ;
3239 l_act_payroll_id NUMBER;
3240 l_act_time_period_id NUMBER;
3241 l_act_business_id NUMBER;
3242 --Bug 14370667
3243 BEGIN
3244 hr_utility.set_location('Entering '|| l_proc, 10);
3245 G_PAYROLL_ACTION_ID := p_payroll_action_id;
3246 FETCH_DATA();
3247 --Bug 14370667
3248 hr_utility.trace ('Debugging: Before 14370667 Updating');
3249 OPEN CSR_ACT_CP_INFO;
3250 FETCH CSR_ACT_CP_INFO
3251 INTO l_act_payroll_id,
3252 l_act_time_period_id,
3253 l_act_business_id;
3254 CLOSE CSR_ACT_CP_INFO;
3255 hr_utility.trace('Debugging - l_act_payroll_id: '||l_act_payroll_id);
3256 hr_utility.trace('Debugging - G_PAYROLL_END_DATE: '||G_PAYROLL_END_DATE);
3257 hr_utility.trace('Debugging - l_act_business_id: '||l_act_business_id);
3258 UPDATE pay_payroll_actions
3259 SET time_period_id = l_act_time_period_id ,
3260 payroll_id = l_act_payroll_id ,
3261 date_earned = G_PAYROLL_END_DATE ,
3262 effective_date = G_PAYROLL_DATE_PAID
3263 WHERE payroll_action_id = p_payroll_action_id
3264 AND BUSINESS_GROUP_ID =l_act_business_id;
3265 hr_utility.trace ('Debugging: After 14370667 Updating');
3266 --Bug 14370667
3267 -- Included Payroll Level
3268 -- Get Default Pension Scheme --Payroll Level
3269 OPEN C_GET_PAYROLL_PENSION_INFO;
3270 FETCH C_GET_PAYROLL_PENSION_INFO INTO G_DEFAULT_SCHEME_NAME;
3271 CLOSE C_GET_PAYROLL_PENSION_INFO;
3272 hr_utility.trace('PAYROLL Level Scheme Name::'||G_DEFAULT_SCHEME_NAME );
3273 --Fetch Data() would have assigned the default details to the globals
3274 --If there is any at Payroll Level it will be over-ridden here
3275 IF (G_DEFAULT_SCHEME_NAME IS NOT NULL) THEN
3276 OPEN C_GET_PENSION_ELEMENTS(G_DEFAULT_SCHEME_NAME);
3277 FETCH C_GET_PENSION_ELEMENTS
3278 INTO G_DEFAULT_SCH_ELEMENT_NAME,
3279 G_EMPLOYER_COMPONENT;
3280 CLOSE C_GET_PENSION_ELEMENTS;
3281 hr_utility.trace('PAYROLL Level Scheme Name Details ::'||G_DEFAULT_SCH_ELEMENT_NAME||' Employer::'||G_EMPLOYER_COMPONENT);
3282 END IF;
3283 -- Included Payroll Level
3284 --If Only at Default
3285 IF (G_DEFAULT_SCHEME_NAME IS NULL) THEN
3286 hr_utility.trace('No Default Scheme Found for the Payroll.');
3287 --Get the Default Pension Scheme
3288 OPEN C_GET_DEFAULT_PENSION_INFO ;
3289 FETCH C_GET_DEFAULT_PENSION_INFO
3290 INTO G_DEFAULT_SCHEME_NAME,
3291 G_DEFAULT_SCH_ELEMENT_NAME,
3292 G_EMPLOYER_COMPONENT;
3293 IF C_GET_DEFAULT_PENSION_INFO%NOTFOUND THEN
3294 G_DEF_FLAG :='Y';
3295 END IF;
3296 CLOSE C_GET_DEFAULT_PENSION_INFO;
3297 IF (G_DEF_FLAG='Y') THEN
3298 conv_configval_to_table(); -- All Configuration Values under Qualifying Schemes Will be saved into g_collecttab
3299 END IF;
3300 END IF;
3301 hr_utility.set_location('Leaving '|| l_proc, 10);
3302 EXCEPTION
3303 WHEN OTHERS THEN
3304 hr_utility.trace('Error occured in archinit');
3305 RAISE;
3306 END archinit;
3307 --
3308 PROCEDURE range_cursor(
3309 pactid IN NUMBER,
3310 sqlstr OUT NOCOPY VARCHAR2)
3311 IS
3312 l_proc CONSTANT VARCHAR2(35):= 'range_cursor';
3313 BEGIN
3314 hr_utility.set_location('Entering: '||l_proc,1);
3315 G_PAYROLL_ACTION_ID := pactid;
3316 FETCH_DATA();
3317 /* IF G_PENSION_STAGING_DATE IS NULL THEN
3318 fnd_file.put_line(fnd_file.OUTPUT,'Staging Date has not been Set.');
3319 RAISE_APPLICATION_ERROR (-20001,'Please enter a Staging Date.') ;
3320 END IF;
3321 IF (G_PRP_END_DATE < FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE)) THEN-- Staging Date
3322 fnd_file.put_line(fnd_file.OUTPUT,'Staging Date Not Yet Reached in this Pay Reference Period.');
3323 RAISE_APPLICATION_ERROR (-20001,'Please check the Staging Date / Default Pension Scheme if they are properly set up.') ;
3324 END IF;-- Staging Date
3325 bug 16178067 */
3326 /* IF G_BUSINESS_GROUP_ID IS NOT NULL AND G_PAYROLL_ID IS NOT NULL AND G_PRP_END_DATE IS NOT NULL THEN
3327 sqlstr := 'select distinct ppf.person_id ' || 'from per_people_f ppf, ' || 'pay_payroll_actions ppa, ' || 'per_all_assignments_f paaf, ' || 'per_assignment_status_types past ' ||
3328 'where ppa.payroll_action_id = :PAYROLL_ACTION_ID ' || ' and ppa.business_group_id = ' ||G_BUSINESS_GROUP_ID || ' and paaf.payroll_id = ' ||G_PAYROLL_ID || ' and paaf.person_id = ppf.person_id ' ||
3329 ' and paaf.assignment_status_type_id = past.assignment_status_type_id ' || 'and past.PER_SYSTEM_status=''ACTIVE_ASSIGN'' ' || 'and ' ||''''||
3330 G_PRP_END_DATE ||''''||' between paaf.effective_start_date and paaf.effective_end_date ' || 'order by ppf.person_id' ;
3331 ELSIF G_PAYROLL_ID IS NOT NULL THEN
3332 */ -- bug 14813352
3333 IF G_PAYROLL_ID IS NOT NULL THEN
3334 -- Payroll ID used in param, restrict by this.
3335 hr_utility.set_location(l_proc,20);
3336 sqlstr := 'select distinct paaf.person_id '|| 'from pay_payroll_actions ppa, '|| 'per_all_assignments_f paaf '|| 'where ppa.payroll_action_id = :payroll_action_id '||
3337 'and paaf.business_group_id + 0 = ppa.business_group_id '|| 'and paaf.payroll_id = '||G_PAYROLL_ID|| ' order by paaf.person_id';
3338 ELSE
3339 sqlstr := 'select distinct person_id '|| 'from per_people_f ppf, '|| 'pay_payroll_actions ppa '|| 'where ppa.payroll_action_id = :payroll_action_id '|| 'and ppa.business_group_id = ppf.business_group_id '||
3340 'order by ppf.person_id';
3341 END IF;
3342 hr_utility.trace(' Payroll Action Id : '||pactid);
3343 hr_utility.trace(' Range Cursor Statement : '||sqlstr);
3344 hr_utility.set_location(' Leaving: '||l_proc,100);
3345 /*
3346 OPEN C_GET_DEFAULT_PENSION_INFO ;
3347 FETCH C_GET_DEFAULT_PENSION_INFO
3348 INTO
3349 G_DEFAULT_SCHEME_NAME,
3350 G_DEFAULT_SCH_ELEMENT_NAME,
3351 G_EMPLOYER_COMPONENT;
3352 IF C_GET_DEFAULT_PENSION_INFO%NOTFOUND THEN
3353 --ERROR
3354 hr_utility.trace('No Default Pension Scheme has been set up.');
3355 fnd_file.put_line(fnd_file.OUTPUT,'No Default Pension Scheme has been set up.');
3356 RAISE_APPLICATION_ERROR(-20001,'No Default Pension Scheme has been set up.');
3357 END IF;
3358 CLOSE C_GET_DEFAULT_PENSION_INFO;
3359 */
3360 --Commented for the ER considering Eligiblity Rules
3361 EXCEPTION
3362 WHEN OTHERS THEN
3363 G_ERROR:='Y';
3364 RAISE;
3365 END range_cursor;
3366 --
3367 PROCEDURE action_creation(
3368 pactid IN NUMBER,
3369 stperson IN NUMBER,
3370 endperson IN NUMBER,
3371 chunk IN NUMBER)
3372 IS
3373 l_proc CONSTANT VARCHAR2(90):= 'action_creation';
3374 l_ass_act_id NUMBER;
3375 -- Cursor to fetch all Active assignments for the Payroll
3376 CURSOR C_ALL_ASSIGNMENTS_PAYROLL
3377 IS
3378 SELECT DISTINCT PAAF.ASSIGNMENT_ID
3379 FROM PER_ALL_ASSIGNMENTS_F PAAF ,
3380 PER_ASSIGNMENT_STATUS_TYPES PAST
3381 WHERE PAAF.PAYROLL_ID = G_PAYROLL_ID
3382 AND PAAF.BUSINESS_GROUP_ID=G_BUSINESS_GROUP_ID
3383 AND PAAF.PERSON_ID BETWEEN stperson AND endperson
3384 AND PAAF.ASSIGNMENT_STATUS_TYPE_ID = PAST.ASSIGNMENT_STATUS_TYPE_ID
3385 -- AND PAST.PAY_SYSTEM_STATUS='P'
3386 AND PAST.PER_SYSTEM_STATUS <> 'TERM_ASSIGN'
3387 AND PAAF.ASSIGNMENT_TYPE = 'E'
3388 -- AND G_PRP_END_DATE BETWEEN PAAF.EFFECTIVE_START_DATE AND PAAF.EFFECTIVE_END_DATE
3389 AND G_PRP_END_DATE >= PAAF.EFFECTIVE_START_DATE
3390 AND G_PRP_START_DATE <= PAAF.EFFECTIVE_END_DATE
3391 ORDER BY ASSIGNMENT_ID ;
3392 BEGIN
3393 hr_utility.set_location('Entering: '||l_proc,1);
3394 G_PAYROLL_ACTION_ID := pactid;
3395 FETCH_DATA();
3396 hr_utility.trace('stperson '||stperson ||'endperson '||endperson);
3397 /*
3398 OPEN C_GET_DEFAULT_PENSION_INFO ;
3399 FETCH C_GET_DEFAULT_PENSION_INFO
3400 INTO
3401 L_DEFAULT_SCHEME_NAME,
3402 L_DEFAULT_SCH_ELEMENT_NAME,
3403 L_EMPLOYER_COMPONENT;
3404 IF C_GET_DEFAULT_PENSION_INFO%NOTFOUND THEN
3405 hr_utility.trace('No Default Scheme has been Setup.Please Set it up And then run the process again.');
3406 RAISE L_EXCEPTION;
3407 END IF;
3408 CLOSE C_GET_DEFAULT_PENSION_INFO;
3409 */
3410 /*--- Moved to Arch Init
3411 -- Included Payroll Level
3412 -- Get Default Pension Scheme --Payroll Level
3413 OPEN C_GET_PAYROLL_PENSION_INFO;
3414 FETCH C_GET_PAYROLL_PENSION_INFO INTO L_DEFAULT_SCHEME_NAME;
3415 CLOSE C_GET_PAYROLL_PENSION_INFO;
3416 hr_utility.trace('PAYROLL Level Scheme Name::'||L_DEFAULT_SCHEME_NAME );
3417 IF (L_DEFAULT_SCHEME_NAME IS NOT NULL) THEN
3418 OPEN C_GET_PENSION_ELEMENTS(L_DEFAULT_SCHEME_NAME);
3419 FETCH C_GET_PENSION_ELEMENTS
3420 INTO
3421 L_DEFAULT_SCH_ELEMENT_NAME,
3422 L_EMPLOYER_COMPONENT;
3423 CLOSE C_GET_PENSION_ELEMENTS;
3424 hr_utility.trace('PAYROLL Level Scheme Name Details ::'||L_DEFAULT_SCH_ELEMENT_NAME||' Employer::'||L_EMPLOYER_COMPONENT);
3425 END IF;
3426 ------------------------------------------
3427 IF (L_DEFAULT_SCHEME_NAME IS NULL) THEN
3428 hr_utility.trace('No Default Scheme Found for the Payroll.');
3429 --Get the Default Pension Scheme
3430 OPEN C_GET_DEFAULT_PENSION_INFO ;
3431 FETCH C_GET_DEFAULT_PENSION_INFO
3432 INTO
3433 L_DEFAULT_SCHEME_NAME,
3434 L_DEFAULT_SCH_ELEMENT_NAME,
3435 L_EMPLOYER_COMPONENT;
3436 CLOSE C_GET_DEFAULT_PENSION_INFO;
3437 END IF;
3438 -- Included Payroll Level
3439 G_DEFAULT_SCHEME_NAME := L_DEFAULT_SCHEME_NAME;
3440 G_DEFAULT_SCH_ELEMENT_NAME := L_DEFAULT_SCH_ELEMENT_NAME;
3441 G_EMPLOYER_COMPONENT := L_EMPLOYER_COMPONENT;
3442 --- Moved to Arch Init*/
3443 FOR ASG_REC IN C_ALL_ASSIGNMENTS_PAYROLL
3444 LOOP
3445 hr_utility.set_location('Creating assignment action for ' || asg_rec.assignment_id,30);
3446 SELECT pay_assignment_actions_s.nextval INTO l_ass_act_id FROM dual;
3447 --
3448 -- insert into pay_assignment_actions.
3449 hr_nonrun_asact.insact(l_ass_act_id, asg_rec.assignment_id, pactid, chunk, NULL);
3450 END LOOP;
3451 EXCEPTION
3452 /*
3453 WHEN L_EXCEPTION THEN
3454 hr_utility.trace('Please Check the Staging Date / Default Pension Scheme if they are properly Set up.');
3455 fnd_file.put_line(fnd_file.OUTPUT,' ');
3456 RAISE_APPLICATION_ERROR (-20001,'Please Check the Staging Date / Default Pension Scheme if they are properly Set up.') ;
3457 */
3458 WHEN OTHERS THEN
3459 RAISE_APPLICATION_ERROR (-20001,'Error Occured in Action Creation');
3460 END action_creation;
3461 --
3462 PROCEDURE deinitialization_code(
3463 pactid IN NUMBER)
3464 IS
3465 l_proc CONSTANT VARCHAR2(50) := 'deinitialization_code';
3466 xml_layout BOOLEAN;
3467 l_request_id NUMBER;
3468 l_mode VARCHAR2(30);
3469 BEGIN
3470 IF G_ERROR <>'Y' THEN
3471 hr_utility.set_location('Entering: '||l_proc,1);
3472 --this is a eText report, Spawn the BI Publisher process
3473 hr_utility.trace('Spawn the BI Publisher process');
3474 WRITE_OUTPUT();
3475 /* Commented for bug 14273214 as this values are needed to be viewed in the Payroll view Form
3476 UPDATE pay_payroll_actions
3477 SET time_period_id = null
3478 , payroll_id = null
3479 , date_earned = null
3480 WHERE payroll_action_id = pactid
3481 and BUSINESS_GROUP_ID=G_BUSINESS_GROUP_ID;
3482 hr_utility.trace ('Debugging: Before 14370667 Rolling Back');
3483 */
3484 hr_utility.trace('Debugging - G_PRP_START_DATE: '||G_PRP_START_DATE);
3485 hr_utility.trace('Debugging - G_PRP_END_DATE: '||G_PRP_END_DATE);
3486 hr_utility.trace('Debugging - G_PAYROLL_START_DATE: '||G_PAYROLL_START_DATE);
3487 hr_utility.trace('Debugging - G_PAYROLL_END_DATE: '||G_PAYROLL_END_DATE);
3488 hr_utility.trace('Debugging - G_EARN_START_DATE: '||G_EARN_START_DATE);
3489 hr_utility.trace('Debugging - G_EARN_END_DATE: '||G_EARN_END_DATE);
3490 ----------------------------SPAWNING--------------------------------------------
3491 --AUTO ENROLLED REPORT
3492 xml_layout := FND_REQUEST.ADD_LAYOUT('PAY','PYGBPAER','en','US','PDF');
3493 IF xml_layout = true THEN
3494 ---'GB_VALIDATE' Then Donot Update the Element
3495 --G_MODE='GB_VALIDATE_COMMIT')
3496 SELECT DECODE(G_MODE,'GB_VALIDATE','Validate Only','GB_VALIDATE_COMMIT','Validate and Commit','NA')
3497 INTO l_mode
3498 FROM DUAL;
3499 l_request_id := fnd_request.submit_request (application => 'PAY' ,program => 'PYGBPAER' ,argument1 => pactid ,argument2 =>fnd_date.date_to_canonical( G_PAYROLL_START_DATE) ,
3500 argument3 => fnd_date.date_to_canonical(G_PAYROLL_END_DATE) ,argument4 =>fnd_date.date_to_canonical( G_PRP_START_DATE) ,argument5 => fnd_date.date_to_canonical(G_PRP_END_DATE) ,
3501 argument6 => L_MODE ,argument7 => G_PAYROLL_NAME ,argument8 => G_PERIOD_NAME );
3502 -- Commit;
3503 IF l_request_id = 0 THEN
3504 hr_utility.set_location('Error spawning new process',1);
3505 END IF;
3506 END IF;
3507 --NOT AUTO ENROLLED REPORT
3508 xml_layout :=NULL;
3509 l_request_id :=NULL;
3510 xml_layout := FND_REQUEST.ADD_LAYOUT('PAY','PYGBPAENR','en','US','PDF');
3511 IF xml_layout = true THEN
3512 ---'GB_VALIDATE' Then Donot Update the Element
3513 --G_MODE='GB_VALIDATE_COMMIT')
3514 SELECT DECODE(G_MODE,'GB_VALIDATE','Validate Only','GB_VALIDATE_COMMIT','Validate and Commit','NA')
3515 INTO l_mode
3516 FROM DUAL;
3517 l_request_id := fnd_request.submit_request (application => 'PAY' ,program => 'PYGBPAENR' ,argument1 => pactid ,argument2 =>fnd_date.date_to_canonical( G_PAYROLL_START_DATE) ,
3518 argument3 => fnd_date.date_to_canonical(G_PAYROLL_END_DATE) ,argument4 =>fnd_date.date_to_canonical( G_PRP_START_DATE) ,argument5 => fnd_date.date_to_canonical(G_PRP_END_DATE) ,
3519 argument6 => L_MODE ,argument7 => G_PAYROLL_NAME ,argument8 => G_PERIOD_NAME );
3520 -- Commit;
3521 IF l_request_id = 0 THEN
3522 hr_utility.set_location('Error spawning new process',1);
3523 END IF;
3524 END IF;
3525 --Already Enrolled Employees (Not By Auto Enrollment)
3526 --NOT AUTO ENROLLED REPORT
3527 xml_layout :=NULL;
3528 l_request_id :=NULL;
3529 xml_layout := FND_REQUEST.ADD_LAYOUT('PAY','PYGBPAEQ','en','US','PDF');
3530 IF xml_layout = true THEN
3531 ---'GB_VALIDATE' Then Donot Update the Element
3532 --G_MODE='GB_VALIDATE_COMMIT')
3533 SELECT DECODE(G_MODE,'GB_VALIDATE','Validate Only','GB_VALIDATE_COMMIT','Validate and Commit','NA')
3534 INTO l_mode
3535 FROM DUAL;
3536 l_request_id := fnd_request.submit_request (application => 'PAY' ,program => 'PYGBPAEQ' ,argument1 => pactid ,argument2 =>fnd_date.date_to_canonical( G_PAYROLL_START_DATE) ,
3537 argument3 => fnd_date.date_to_canonical(G_PAYROLL_END_DATE) ,argument4 =>fnd_date.date_to_canonical( G_PRP_START_DATE) ,argument5 => fnd_date.date_to_canonical(G_PRP_END_DATE) ,
3538 argument6 => L_MODE ,argument7 => G_PAYROLL_NAME ,argument8 => G_PERIOD_NAME );
3539 -- Commit;
3540 IF l_request_id = 0 THEN
3541 hr_utility.set_location('Error spawning new process',1);
3542 END IF;
3543 END IF;
3544 ----------------------------SPAWNING--------------------------------------------
3545 hr_utility.set_location('Leaving: '||l_proc,999);
3546 END IF;
3547 END deinitialization_code;
3548
3549 FUNCTION CAL_STAGING_DATE_EARNINGS(
3550 P_ASSIGNMENT_ID NUMBER,
3551 P_AGGR_FLAG VARCHAR2 DEFAULT 'N',
3552 P_PERSON_ID NUMBER,
3553 P_ASSACTID NUMBER)
3554 --P_ELEMENT_ENTRY_ID NUMBER)
3555 RETURN NUMBER
3556 IS
3557 --To fetch the dates paid which do not have a payroll/assignment action for the assignment id as on period in which staging date falls
3558 -- to get prp_start_date , prp_end_date and regular_payment_date of period in which staging date falls
3559 CURSOR C_STAGING_PRP_PERIOD
3560 is
3561 select start_date , end_date , REGULAR_PAYMENT_DATE from per_time_periods where payroll_id = G_PAYROLL_ID and FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE) between START_DATE and END_DATE;
3562
3563 CURSOR C_DATES_PAID_MISSED(L_PRP_END_DATE date, L_PRP_START_DATE date)
3564 IS
3565 SELECT TIME_PERIOD_ID,
3566 START_DATE,
3567 END_DATE,
3568 PAYROLL_ID,
3569 REGULAR_PAYMENT_DATE DATE_PAID
3570 FROM per_time_periods
3571 WHERE payroll_id IN
3572 (SELECT payroll_id
3573 FROM per_all_assignments_f paaf
3574 WHERE assignment_id = p_assignment_id
3575 AND L_PRP_END_DATE BETWEEN paaf.effective_start_date AND paaf.effective_end_date
3576 )
3577 AND regular_payment_date BETWEEN L_PRP_START_DATE AND L_PRP_END_DATE
3578 AND regular_payment_date NOT IN
3579 (SELECT effective_date
3580 FROM pay_payroll_actions ppa ,
3581 pay_assignment_actions paa ,
3582 per_time_periods ptp
3583 WHERE ppa.action_type IN ('Q', 'R')
3584 AND ppa.payroll_action_id = paa.payroll_action_id
3585 AND paa.assignment_id = p_assignment_id
3586 AND ppa.time_period_id = ptp.time_period_id
3587 AND ppa.time_period_id IN
3588 (SELECT time_period_id
3589 FROM per_time_periods
3590 WHERE payroll_id IN
3591 (SELECT payroll_id
3592 FROM per_all_assignments_f paaf
3593 WHERE assignment_id = p_assignment_id
3594 AND L_PRP_END_DATE BETWEEN paaf.effective_start_date AND paaf.effective_end_date
3595 )
3596 AND regular_payment_date BETWEEN L_PRP_START_DATE AND L_PRP_END_DATE
3597 )
3598 );
3599 ------------------AGGREGATED
3600 CURSOR C_ASSIGNMENTS_AGG(L_PRP_END_DATE date)
3601 IS
3602 SELECT PAAF.PAYROLL_ID,
3603 PAAF.ASSIGNMENT_ID,
3604 PEEF.ELEMENT_ENTRY_ID
3605 FROM PER_ALL_PEOPLE_F PAPF,
3606 PER_ALL_ASSIGNMENTS_F PAAF,
3607 PAY_ELEMENT_ENTRY_VALUES_F PEEVF,
3608 PAY_ELEMENT_ENTRIES_F PEEF,
3609 PER_ASSIGNMENT_STATUS_TYPES PAST
3610 WHERE PAAF.PERSON_ID =PAPF.PERSON_ID
3611 AND PAPF.PERSON_ID =P_PERSON_ID
3612 AND PAAF.ASSIGNMENT_STATUS_TYPE_ID = PAST.ASSIGNMENT_STATUS_TYPE_ID
3613 -- AND PAST.PAY_SYSTEM_STATUS='P'
3614 AND PAST.PER_SYSTEM_STATUS <> 'TERM_ASSIGN'
3615 AND PEEF.ASSIGNMENT_ID =PAAF.ASSIGNMENT_ID
3616 AND PEEF.ELEMENT_TYPE_ID =G_ELEMENT_DETAILS.G_ELEMENT_TYPE_ID
3617 AND PEEVF.ELEMENT_ENTRY_ID =PEEF.ELEMENT_ENTRY_ID
3618 AND PEEVF.INPUT_VALUE_ID =G_ELEMENT_DETAILS.G_AGG_EARNINGS_PENSIONS_ID
3619 AND PEEVF.SCREEN_ENTRY_VALUE ='Y'
3620 AND L_PRP_END_DATE BETWEEN PEEF.EFFECTIVE_START_DATE AND PEEF.EFFECTIVE_END_DATE
3621 AND L_PRP_END_DATE BETWEEN PEEVF.EFFECTIVE_START_DATE AND PEEVF.EFFECTIVE_END_DATE
3622 AND L_PRP_END_DATE BETWEEN PAAF.EFFECTIVE_START_DATE AND PAAF.EFFECTIVE_END_DATE
3623 AND L_PRP_END_DATE BETWEEN PAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE;
3624 -----------------------------
3625 L_SCREEN_ENTRY_VALUE PAY_ELEMENT_ENTRY_VALUES_F.SCREEN_ENTRY_VALUE%type;
3626 L_FORMULA_ID FF_FORMULAS_F.FORMULA_ID%type;
3627 L_STATUS_PROCES_ID NUMBER;
3628 L_TOTAL_EARNINGS_VALUE NUMBER :=0;
3629 L_INPUTS FF_EXEC.INPUTS_T;
3630 P_INPUTS FF_EXEC.INPUTS_T;
3631 L_OUTPUTS FF_EXEC.OUTPUTS_T;
3632 L_ASSIGNMENT_ACTION_ID NUMBER :=NULL;
3633 L_BALANCE_FLAG VARCHAR(2) := 'N';
3634 P_PAY_VALUE_IVID NUMBER;
3635 L_RESULT_RULE_NAME PAY_FORMULA_RESULT_RULES_F.RESULT_NAME%TYPE;
3636 Iteration NUMBER;
3637 L_TIME_PERIOD_ID NUMBER :=0;
3638 L_PRP_START_DATE date;
3639 L_PRP_END_DATE date;
3640 L_EFFECTIVE_DATE date;
3641 BEGIN
3642 hr_utility.trace('Inside CALCULATE_EARNINGS');
3643 hr_utility.trace('AGGREGATED?? '||P_AGGR_FLAG);
3644 hr_utility.trace('Person_id '||P_PERSON_ID);
3645 hr_utility.trace('P_AGGR_FLAG:'||P_AGGR_FLAG);
3646 hr_utility.trace('P_ASSIGNMENT_ID:'||P_ASSIGNMENT_ID);
3647 ---#######################################################################################################
3648 open C_STAGING_PRP_PERIOD;
3649 fetch C_STAGING_PRP_PERIOD into L_PRP_START_DATE, L_PRP_END_DATE, L_EFFECTIVE_DATE;
3650 close C_STAGING_PRP_PERIOD;
3651 IF (P_AGGR_FLAG='N') THEN
3652 --Fetch Value from Balance
3653 L_TOTAL_EARNINGS_VALUE :=CALCULATE_ASG_ACTIONS(P_ASSIGNMENT_ID,P_ASSACTID,L_BALANCE_FLAG,NULL);
3654 HR_UTILITY.trace('L_TOTAL_EARNINGS_VALUE : '||L_TOTAL_EARNINGS_VALUE);
3655 hr_utility.trace('L_BALANCE_FLAG: '||L_BALANCE_FLAG);
3656 IF (L_BALANCE_FLAG ='Y') THEN -- Balance(s) Found --
3657 /*To handle Payroll Change and if the new payroll
3658 has no payroll-assg actions and if the previous payroll has payroll/assg
3659 actions within the PRP*/
3660 hr_utility.trace('To Fetch datepaids which donot have an assignment action');
3661 FOR L_DATE_PAID_MISSED IN C_DATES_PAID_MISSED(L_PRP_END_DATE,L_PRP_START_DATE)
3662 LOOP
3663 hr_utility.trace('The Missed Date Paid :'||L_DATE_PAID_MISSED.DATE_PAID);
3664 hr_utility.trace('The Corresponding Date Earned :'||L_DATE_PAID_MISSED.END_DATE);
3665 FOR I IN C_ELEMENT_DETAILS(L_DATE_PAID_MISSED.END_DATE,P_ASSIGNMENT_ID,NULL)
3666 LOOP
3667 L_SCREEN_ENTRY_VALUE := NULL;
3668 L_FORMULA_ID := NULL;
3669 p_pay_value_ivid := NULL;
3670 L_STATUS_PROCES_ID := NULL;
3671 l_result_rule_name := NULL;
3672 OPEN C_SCREEN_ENTRY_VALUE(I.ELEMENT_ENTRY_ID,L_DATE_PAID_MISSED.END_DATE);
3673 FETCH C_SCREEN_ENTRY_VALUE INTO L_SCREEN_ENTRY_VALUE;
3674 CLOSE C_SCREEN_ENTRY_VALUE;
3675 IF L_SCREEN_ENTRY_VALUE IS NULL THEN
3676 OPEN C_PENSIONS_FORMULA_ID(I.ELEMENT_TYPE_ID,L_DATE_PAID_MISSED.END_DATE);
3677 FETCH C_PENSIONS_FORMULA_ID INTO L_FORMULA_ID,L_STATUS_PROCES_ID;
3678 CLOSE C_PENSIONS_FORMULA_ID;
3679 IF L_FORMULA_ID IS NOT NULL THEN
3680 HR_UTILITY.trace('Formula Id Not Null');
3681 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE + EXEC_FORMULA(P_ASSIGNMENT_ID, I.ELEMENT_ENTRY_ID, L_STATUS_PROCES_ID, P_assactid, L_FORMULA_ID);
3682 HR_UTILITY.trace('L_TOTAL_EARNINGS_VALUE :'||L_TOTAL_EARNINGS_VALUE);
3683 END IF;
3684 ELSE --Screen Entry Value not Null
3685 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE + NVL(L_SCREEN_ENTRY_VALUE,0);
3686 HR_UTILITY.trace(' Screen value Not Null :: L_TOTAL_EARNINGS_VALUE :'||L_TOTAL_EARNINGS_VALUE);
3687 END IF;
3688 END LOOP;
3689 L_TOTAL_EARNINGS_VALUE :=L_TOTAL_EARNINGS_VALUE+ calculate_earnings_info(P_ASSIGNMENT_ID,L_DATE_PAID_MISSED.END_DATE,P_assactid,NULL);
3690 HR_UTILITY.trace('Add Information Element :: L_TOTAL_EARNINGS_VALUE :'||L_TOTAL_EARNINGS_VALUE);
3691 END LOOP;
3692 END IF;--Balance Found
3693 --No Balance Found
3694 IF (L_BALANCE_FLAG ='N') THEN
3695 FOR I IN C_ELEMENT_DETAILS(L_EFFECTIVE_DATE,P_ASSIGNMENT_ID,NULL)
3696 LOOP
3697 L_SCREEN_ENTRY_VALUE := NULL;
3698 L_FORMULA_ID := NULL;
3699 p_pay_value_ivid := NULL;
3700 L_STATUS_PROCES_ID := NULL;
3701 l_result_rule_name := NULL;
3702 OPEN C_SCREEN_ENTRY_VALUE(I.ELEMENT_ENTRY_ID,L_EFFECTIVE_DATE);
3703 FETCH C_SCREEN_ENTRY_VALUE INTO L_SCREEN_ENTRY_VALUE;
3704 CLOSE C_SCREEN_ENTRY_VALUE;
3705 IF L_SCREEN_ENTRY_VALUE IS NULL THEN
3706 OPEN C_PENSIONS_FORMULA_ID(I.ELEMENT_TYPE_ID,L_EFFECTIVE_DATE);
3707 FETCH C_PENSIONS_FORMULA_ID INTO L_FORMULA_ID,L_STATUS_PROCES_ID;
3708 CLOSE C_PENSIONS_FORMULA_ID;
3709 IF L_FORMULA_ID IS NOT NULL THEN
3710 HR_UTILITY.trace('Formula Id Not Null');
3711 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE + EXEC_FORMULA(P_ASSIGNMENT_ID, I.ELEMENT_ENTRY_ID, L_STATUS_PROCES_ID, P_assactid, L_FORMULA_ID);
3712 HR_UTILITY.trace('L_TOTAL_EARNINGS_VALUE :'||L_TOTAL_EARNINGS_VALUE);
3713 END IF;
3714 ELSE --Screen Entry Value not Null
3715 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE + NVL(L_SCREEN_ENTRY_VALUE,0);
3716 HR_UTILITY.trace(' Screen value Not Null :: L_TOTAL_EARNINGS_VALUE :'||L_TOTAL_EARNINGS_VALUE);
3717 END IF;
3718 END LOOP;
3719 L_TOTAL_EARNINGS_VALUE :=L_TOTAL_EARNINGS_VALUE+ calculate_earnings_info(P_ASSIGNMENT_ID,L_EFFECTIVE_DATE,P_assactid,NULL);
3720 HR_UTILITY.trace('Add Information Element :: L_TOTAL_EARNINGS_VALUE :'||L_TOTAL_EARNINGS_VALUE);
3721 END IF;--Balance Flag
3722 END IF;
3723 ---#######################################################################################################
3724 --AGGREGATION
3725 ---#######################################################################################################
3726 IF (P_AGGR_FLAG='Y') THEN
3727 HR_UTILITY.trace('Aggregation Case - Calculate_earnings');
3728 FOR I IN C_ASSIGNMENTS_AGG(L_PRP_END_DATE)
3729 LOOP
3730 IF (I.PAYROLL_ID =G_PAYROLL_ID) THEN
3731 L_TOTAL_EARNINGS_VALUE:=L_TOTAL_EARNINGS_VALUE+CALCULATE_EARNINGS(I.ASSIGNMENT_ID,'N',P_PERSON_ID,G_EARN_END_DATE,p_assactid);
3732 HR_UTILITY.trace('Same Payroll ID - L_TOTAL_EARNINGS_VALUE : '||L_TOTAL_EARNINGS_VALUE);
3733 ELSE --Main Entry and this asg are of different payrolls
3734 FOR J IN C_EARN_PERIOD_DETAILS(I.PAYROLL_ID)
3735 LOOP
3736 L_BALANCE_FLAG :='N'; --Reset Flag
3737 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE +CALCULATE_ASG_ACTIONS (P_ASSIGNMENT_ID ,P_ASSACTID ,L_BALANCE_FLAG ,J.TIME_PERIOD_ID );
3738 hr_utility.trace('BALANCE Flag:'||L_BALANCE_FLAG);
3739 IF (L_BALANCE_FLAG ='N') THEN-- If Balance not found
3740 FOR X IN C_ELEMENT_DETAILS(J.END_DATE,I.ASSIGNMENT_ID,NULL)
3741 LOOP
3742 hr_utility.trace('Inside Different Payroll Aggregated Case--and balance not Found');
3743 L_SCREEN_ENTRY_VALUE := NULL;
3744 L_FORMULA_ID :=NULL;
3745 p_pay_value_ivid :=NULL;
3746 L_STATUS_PROCES_ID :=NULL;
3747 l_result_rule_name :=NULL;
3748 OPEN C_SCREEN_ENTRY_VALUE(X.ELEMENT_ENTRY_ID,J.END_DATE);
3749 FETCH C_SCREEN_ENTRY_VALUE INTO L_SCREEN_ENTRY_VALUE;
3750 CLOSE C_SCREEN_ENTRY_VALUE;
3751 IF L_SCREEN_ENTRY_VALUE IS NULL THEN
3752 OPEN C_PENSIONS_FORMULA_ID(X.ELEMENT_TYPE_ID,J.END_DATE);
3753 FETCH C_PENSIONS_FORMULA_ID INTO L_FORMULA_ID,L_STATUS_PROCES_ID;
3754 CLOSE C_PENSIONS_FORMULA_ID;
3755 END IF;
3756 IF L_FORMULA_ID IS NOT NULL THEN
3757 HR_UTILITY.trace(' Inside run Element FORMULA '||L_FORMULA_ID);
3758 -- setting the contexts
3759 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE + EXEC_FORMULA(I.ASSIGNMENT_ID, X.ELEMENT_ENTRY_ID, L_STATUS_PROCES_ID, P_assactid, L_FORMULA_ID);
3760 HR_UTILITY.trace(' calculated value'||L_TOTAL_EARNINGS_VALUE);
3761 ELSE
3762 L_TOTAL_EARNINGS_VALUE := L_TOTAL_EARNINGS_VALUE + NVL(L_SCREEN_ENTRY_VALUE,0);
3763 hr_utility.trace('Else part L_TOTAL_EARNINGS_VALUE:'||L_TOTAL_EARNINGS_VALUE);
3764 HR_UTILITY.trace(' calculated value'||L_TOTAL_EARNINGS_VALUE);
3765 END IF;
3766 END LOOP;
3767 L_TOTAL_EARNINGS_VALUE :=L_TOTAL_EARNINGS_VALUE+ calculate_earnings_info(I.ASSIGNMENT_ID,J.END_DATE,P_assactid,NULL);
3768 hr_utility.trace('Information part L_TOTAL_EARNINGS_VALUE:'||L_TOTAL_EARNINGS_VALUE);
3769 END IF;-- If Balance not found
3770 END LOOP;-- For every Date Paid in that Payroll
3771 END IF; -- Same Payroll Id as Main Entry
3772 END LOOP;
3773 END IF;
3774 HR_UTILITY.trace(' Total value from all Pension Element values = '||L_TOTAL_EARNINGS_VALUE);
3775 RETURN L_TOTAL_EARNINGS_VALUE;
3776 EXCEPTION
3777 WHEN OTHERS THEN
3778 HR_UTILITY.trace(SQLERRM);
3779 RAISE;
3780 END CAL_STAGING_DATE_EARNINGS;
3781
3782
3783 FUNCTION CHK_STAGING_DATE_EARNINGS(
3784 P_PENSIONABLE_EARNINGS NUMBER ,
3785 P_ASSIGNMENT_ID NUMBER,
3786 P_PERSON_ID NUMBER,
3787 P_AGE OUT NOCOPY NUMBER,
3788 P_REASON OUT NOCOPY VARCHAR2)
3789 RETURN NUMBER
3790 IS
3791 L_SEX PER_ALL_PEOPLE_F.SEX%type;
3792 L_AGE NUMBER;
3793 L_EMPLOYEE_STATUS_FOR_PENSION NUMBER;
3794 L_DATE_OF_BIRTH PER_ALL_PEOPLE_F.DATE_OF_BIRTH%type;
3795 L_NUM_DATE_BIRTH VARCHAR2(10);
3796 CURSOR C_AGE_SEX
3797 IS
3798 SELECT MONTHS_BETWEEN(FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE),DATE_OF_BIRTH)/12,
3799 DATE_OF_BIRTH,
3800 SEX
3801 FROM PER_ALL_PEOPLE_F
3802 WHERE PERSON_ID = P_PERSON_ID;
3803
3804 ---To Fetch Service Start Date of the employee
3805 CURSOR C_SERVICE_START (P_PERSON_ID PER_ALL_PEOPLE_F.PERSON_ID%TYPE)
3806 IS
3807 SELECT DATE_START
3808 FROM PER_PERIODS_OF_SERVICE
3809 WHERE PERSON_ID = P_PERSON_ID
3810 AND BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID;
3811
3812
3813 N_STATE_PENSION_AGE NUMBER := 0;
3814 RETIRE_DATE DATE;
3815 G_AUTOTHRESHOLD NUMBER :=0;
3816 G_LOWER_THRESHOLD NUMBER :=0;
3817 L_SERVICE_START date;
3818 L_DOB_TT date;
3819 L_EFFECTIVE_DATE date;
3820 l_asg_start_date DATE;
3821 --To Fetch the Assignment Start Date
3822 Cursor c_asg_start_date is
3823 select EFFECTIVE_START_DATE from per_all_assignments_f
3824 where assignment_id = p_assignment_id
3825 and g_prp_end_date between EFFECTIVE_START_DATE and EFFECTIVE_END_DATE;
3826 BEGIN
3827 P_REASON := ' ';
3828 OPEN C_AGE_SEX;
3829 FETCH C_AGE_SEX INTO L_AGE, L_DATE_OF_BIRTH, L_SEX ;
3830 CLOSE C_AGE_SEX;
3831 IF L_AGE >= 59 THEN
3832 --Pension age calculation needs to be done only if age >= 59
3833 IF L_SEX = 'M' THEN
3834 N_STATE_PENSION_AGE := 65;
3835 ELSIF L_SEX = 'F' THEN
3836 IF L_DATE_OF_BIRTH >= TO_DATE('1955/04/06','YYYY/MM/DD') THEN
3837 /* The retirement age for Employees born after 6th April 1955 is 65 */
3838 N_STATE_PENSION_AGE := 65;
3839 ELSIF L_DATE_OF_BIRTH >= TO_DATE('1950/04/06','YYYY/MM/DD') THEN
3840 /* For employee born between 6 April 1950 and 6th April 1955, the retirement date will be derived from the user table */
3841 /* Convert the Birth date of the employee to YYYYMMDD format. */
3842 L_NUM_DATE_BIRTH := TO_CHAR(L_DATE_OF_BIRTH,'YYYYMMDD');
3843 /* Pass the birth date and get the retire date corresponding to birth date. */
3844 -- Bug 14137856
3845 --RETIRE_DATE := HRUSERDT.GET_TABLE_VALUE(G_BUSINESS_GROUP_ID,'STATE_RETIREMENT_AGE_FOR_WOMEN','STATE_PENSION_AGE',L_NUM_DATE_BIRTH,G_PRP_END_DATE);
3846 RETIRE_DATE := TO_DATE(HRUSERDT.GET_TABLE_VALUE(G_BUSINESS_GROUP_ID,'STATE_RETIREMENT_AGE_FOR_WOMEN','STATE_PENSION_AGE',L_NUM_DATE_BIRTH,G_PRP_END_DATE),'YYYY/MM/DD');
3847 N_STATE_PENSION_AGE := ((RETIRE_DATE - L_DATE_OF_BIRTH)/365);
3848 END IF; --l_date_of_birth
3849 END IF; -- l_sex
3850 ELSE
3851 N_STATE_PENSION_AGE := 65;
3852 END IF; --Age >= 59
3853 /*
3854 Quarter
3855 Lunar Month
3856 Bi-Week
3857 Semi-Year
3858 */
3859 IF G_PAYROLL_PERIOD_TYPE = 'Week' THEN
3860 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_WEEKLY;
3861 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_WEEKLY_LT;
3862 ELSIF G_PAYROLL_PERIOD_TYPE = 'Calendar Month' THEN
3863 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_MONTHLY ;
3864 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_MONTHLY_LT ;
3865 ELSIF G_PAYROLL_PERIOD_TYPE = 'Year' THEN
3866 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_ANNUAL;
3867 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_ANNUAL_LT;
3868 ELSIF G_PAYROLL_PERIOD_TYPE = 'Quarter' THEN
3869 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_QUARTERLY ;
3870 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_QUARTERLY_LT;
3871 ELSIF G_PAYROLL_PERIOD_TYPE = 'Lunar Month' THEN
3872 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_LUNAR ;
3873 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_LUNAR_LT;
3874 ELSIF G_PAYROLL_PERIOD_TYPE = 'Bi-Week' THEN
3875 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_BIWEEK;
3876 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_BIWEEK_LT;
3877 ELSIF G_PAYROLL_PERIOD_TYPE = 'Semi-Year' THEN
3878 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_SEMIYEAR;
3879 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_SEMIYEAR_LT ;
3880 ELSIF G_PAYROLL_PERIOD_TYPE = 'Bi-Month' THEN -- Monthly's Threshold multiplied by 2
3881 G_AUTOTHRESHOLD := G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_MONTHLY * 2;
3882 G_LOWER_THRESHOLD := G_GLOBAL_VALUE.G_QE_MONTHLY_LT * 2;
3883 END IF;
3884 hr_utility.trace('P_PENSIONABLE_EARNINGS:'||P_PENSIONABLE_EARNINGS);
3885 hr_utility.trace('G_AUTOTHRESHOLD:'||G_AUTOTHRESHOLD);
3886 hr_utility.trace('L_AGE:'||L_AGE);
3887 hr_utility.trace('N_STATE_PENSION_AGE:'||N_STATE_PENSION_AGE);
3888
3889
3890 /* 16409174 - PAE THRESHOLD CHANGES start*/
3891
3892 OPEN c_asg_start_date;
3893 FETCH c_asg_start_date INTO l_asg_start_date ;
3894 CLOSE c_asg_start_date;
3895 OPEN C_SERVICE_START (P_PERSON_ID) ;
3896 FETCH C_SERVICE_START INTO L_SERVICE_START;
3897 CLOSE C_SERVICE_START;
3898 -- 22nd Birthday
3899 L_DOB_TT := FETCH_START_DATE(L_DATE_OF_BIRTH);
3900
3901 IF ((L_DOB_TT BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) OR (L_SERVICE_START BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE)) THEN
3902 L_EFFECTIVE_DATE := GREATEST(L_DOB_TT,L_SERVICE_START,l_asg_start_date);
3903 G_GLOBAL_VALUE := NULL;
3904 OPEN C_GET_GLOBAL_VALUE(L_EFFECTIVE_DATE);
3905 FETCH C_GET_GLOBAL_VALUE INTO G_GLOBAL_VALUE;
3906 CLOSE C_GET_GLOBAL_VALUE;
3907 hr_utility.trace('C_GET_GLOBAL_VALUE fetched is:'||G_GLOBAL_VALUE.G_QE_MONTHLY_LT||'-'||G_GLOBAL_VALUE.G_AUTO_ENROL_TRIG_MONTHLY);
3908 end if;
3909 /* 16409174 - PAE THRESHOLD CHANGES end*/
3910
3911 /*Bug 14645724: Age check criteria modified*/
3912 IF L_AGE >= 16 AND L_AGE < 75 THEN
3913 IF ((L_AGE BETWEEN 22 AND N_STATE_PENSION_AGE) AND (P_PENSIONABLE_EARNINGS >= G_AUTOTHRESHOLD)) THEN
3914 L_EMPLOYEE_STATUS_FOR_PENSION := 1;
3915 ELSIF ((L_AGE BETWEEN 16 AND 75) AND (P_PENSIONABLE_EARNINGS >= G_LOWER_THRESHOLD AND P_PENSIONABLE_EARNINGS < G_AUTOTHRESHOLD)) THEN
3916 L_EMPLOYEE_STATUS_FOR_PENSION := 2;
3917 P_REASON := P_REASON || ' This assignment is Non Eligible Job holder';
3918 ELSIF ((L_AGE BETWEEN 16 AND 22 OR L_AGE BETWEEN N_STATE_PENSION_AGE AND 75 ) AND (P_PENSIONABLE_EARNINGS >= G_AUTOTHRESHOLD)) THEN
3919 L_EMPLOYEE_STATUS_FOR_PENSION := 2;
3920 P_REASON := P_REASON || ' This assignment is Non Eligible Job holder';
3921 ELSE
3922 L_EMPLOYEE_STATUS_FOR_PENSION := 3;
3923 P_REASON := P_REASON || ' This assignment is worker';
3924 END IF;
3925 ELSE
3926 /*This criteria means employee should not be picked for assesment*/
3927 L_EMPLOYEE_STATUS_FOR_PENSION := 4;
3928 END IF;
3929 P_AGE := L_AGE;
3930 RETURN L_EMPLOYEE_STATUS_FOR_PENSION;
3931 END CHK_STAGING_DATE_EARNINGS;
3932
3933 --
3934 PROCEDURE archive_code(
3935 p_assactid IN NUMBER,
3936 p_effective_date IN DATE)
3937 IS
3938 l_proc CONSTANT VARCHAR2(35):= 'archive_code';
3939 ------------------------------------------------------------------------------------------
3940 ------------------------------------------------------------------------------------------
3941 ---To Fetch Service Start Date of the employee
3942 CURSOR C_SERVICE_START (P_PERSON_ID PER_ALL_PEOPLE_F.PERSON_ID%TYPE)
3943 IS
3944 SELECT DATE_START
3945 FROM PER_PERIODS_OF_SERVICE
3946 WHERE PERSON_ID = P_PERSON_ID
3947 AND BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID;
3948 ------------------------------------------------------------------------------------------
3949 ---To find If the Person reaches 22 Yrs. within the Payroll Period
3950 CURSOR C_AGE_BETWEEN_PAYROLL (P_PERSON_ID PER_ALL_PEOPLE_F.PERSON_ID%TYPE)
3951 IS
3952 SELECT DATE_OF_BIRTH
3953 FROM PER_ALL_PEOPLE_F
3954 WHERE PERSON_ID = P_PERSON_ID
3955 AND G_PRP_END_DATE >= EFFECTIVE_START_DATE
3956 AND G_PRP_START_DATE <= EFFECTIVE_END_DATE;
3957 -- AND G_PRP_END_DATE BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE;
3958 ------------------------------------------------------------------------------------------
3959 -- Cursor to Find if Any Qualifying Scheme Exists for the Employee
3960 /* -- Bug 14210213
3961 CURSOR C_QUALIFYING_SCHEME_EXISTS (P_ASSIGNMENT_ID PAY_ELEMENT_ENTRIES_F.ASSIGNMENT_ID%TYPE)
3962 IS
3963 SELECT PPSV.PENSION_SCHEME_NAME
3964 FROM PQP_GB_PENSION_SCHEMES_V PPSV ,
3965 PQP_CONFIGURATION_VALUES PCV ,
3966 PAY_ELEMENT_TYPES_F PETF ,
3967 PAY_ELEMENT_ENTRIES_F PEEF
3968 WHERE PCV_INFORMATION_CATEGORY = 'PAY_GB_QUALIFIED_PENSIONS_INFO'
3969 AND PCV.BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID
3970 AND PCV.PCV_INFORMATION2 = PPSV.ELEMENT_NAME
3971 AND PPSV.ELEMENT_TYPE_ID = PETF.ELEMENT_TYPE_ID
3972 AND PEEF.ELEMENT_TYPE_ID = PETF.ELEMENT_TYPE_ID
3973 -- AND PPSV.EMPLOYER_COMPONENT='Y'--Commented for checking
3974 AND PEEF.ASSIGNMENT_ID = P_ASSIGNMENT_ID
3975 AND G_PRP_END_DATE BETWEEN PETF.EFFECTIVE_START_DATE AND PETF.EFFECTIVE_END_DATE
3976 AND G_PRP_END_DATE BETWEEN PEEF.EFFECTIVE_START_DATE AND PEEF.EFFECTIVE_END_DATE
3977 ORDER BY PETF.EFFECTIVE_START_DATE DESC;
3978 */
3979 CURSOR C_QUALIFYING_SCHEME_EXISTS (P_ASSIGNMENT_ID PAY_ELEMENT_ENTRIES_F.ASSIGNMENT_ID%TYPE)
3980 IS
3981 SELECT PCV.PCV_INFORMATION1
3982 FROM PQP_CONFIGURATION_VALUES PCV ,
3983 PAY_ELEMENT_TYPES_F PETF ,
3984 PAY_ELEMENT_ENTRIES_F PEEF
3985 WHERE PCV_INFORMATION_CATEGORY = 'PAY_GB_QUALIFIED_PENSIONS_INFO'
3986 AND PCV.BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID
3987 AND PCV.PCV_INFORMATION2 = PETF.ELEMENT_NAME
3988 AND PETF.BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID
3989 AND PEEF.ELEMENT_TYPE_ID = PETF.ELEMENT_TYPE_ID
3990 AND PEEF.ASSIGNMENT_ID = P_ASSIGNMENT_ID
3991 -- AND G_PRP_END_DATE BETWEEN PETF.EFFECTIVE_START_DATE AND PETF.EFFECTIVE_END_DATE
3992 -- AND G_PRP_END_DATE BETWEEN PEEF.EFFECTIVE_START_DATE AND PEEF.EFFECTIVE_END_DATE
3993 AND G_PRP_END_DATE >= ALL(PETF.EFFECTIVE_START_DATE,PEEF.EFFECTIVE_START_DATE )
3994 AND G_PRP_START_DATE <= ALL(PETF.EFFECTIVE_END_DATE,PEEF.EFFECTIVE_END_DATE )
3995 ORDER BY PETF.EFFECTIVE_START_DATE DESC;
3996 ------------------------------------------------------------------------------------------
3997 -- Cursor to fetch the Assignment's Details for the Payroll
3998 CURSOR C_ASSIGNMENT_DETAILS
3999 IS
4000 SELECT PAAF.PERSON_ID ,PAAF.EFFECTIVE_START_DATE,
4001 PAAF.ASSIGNMENT_ID ,
4002 PEEF.ELEMENT_ENTRY_ID ,
4003 PAAF.ASSIGNMENT_NUMBER
4004 FROM PER_ALL_ASSIGNMENTS_F PAAF ,
4005 PAY_ELEMENT_ENTRIES_F PEEF,
4006 PAY_ASSIGNMENT_ACTIONS PAA
4007 WHERE PAAF.PAYROLL_ID = G_PAYROLL_ID
4008 AND PAAF.ASSIGNMENT_ID = PEEF.ASSIGNMENT_ID
4009 AND PAAF.ASSIGNMENT_ID = PAA.ASSIGNMENT_ID
4010 AND PEEF.ELEMENT_TYPE_ID = G_ELEMENT_DETAILS.G_ELEMENT_TYPE_ID
4011 AND PAA.ASSIGNMENT_ACTION_ID = p_assactid
4012 AND G_PRP_END_DATE >= ALL(PAAF.EFFECTIVE_START_DATE,PEEF.EFFECTIVE_START_DATE )
4013 AND G_PRP_START_DATE <= ALL(PAAF.EFFECTIVE_END_DATE,PEEF.EFFECTIVE_END_DATE );
4014 -- AND G_PRP_END_DATE BETWEEN PAAF.EFFECTIVE_START_DATE AND PAAF.EFFECTIVE_END_DATE
4015 -- AND G_PRP_END_DATE BETWEEN PEEF.EFFECTIVE_START_DATE AND PEEF.EFFECTIVE_END_DATE;
4016 ------------------------------------------------------------------------------------------
4017 -- Cursor to Fetch Person's Name
4018 CURSOR PERSON_NAME(P_PERSON_ID NUMBER)
4019 IS
4020 SELECT FULL_NAME
4021 FROM PER_ALL_PEOPLE_F
4022 WHERE PERSON_ID =P_PERSON_ID
4023 AND BUSINESS_GROUP_ID=G_BUSINESS_GROUP_ID
4024 AND G_PRP_END_DATE >= EFFECTIVE_START_DATE
4025 AND G_PRP_START_DATE <= EFFECTIVE_END_DATE;
4026 -- AND G_PRP_END_DATE BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE;
4027 --------------------------------------------------------------------------------------------
4028 /* Bug 14778657
4029 --Cursor to Check if the EJH Postponement has been applied for the assignment already
4030 CURSOR CHECK_POSTP_EJH(P_ELEMENT_ENTRY_ID NUMBER)
4031 IS
4032 SELECT 1
4033 FROM PAY_ELEMENT_ENTRY_VALUES_F
4034 WHERE ELEMENT_ENTRY_ID = P_ELEMENT_ENTRY_ID
4035 AND INPUT_VALUE_ID = G_ELEMENT_DETAILS.G_POSTPONEMENT_TYPE_ID
4036 AND EFFECTIVE_START_DATE <= G_PRP_END_DATE
4037 AND SCREEN_ENTRY_VALUE = 'Eligible Job Holder Postponement';
4038 ------------------------------------------------------------------------------------------
4039
4040 --To get Previous Period Start Date
4041 CURSOR PREV_PER_DATE
4042 IS
4043 SELECT PTP.START_DATE
4044 FROM PER_TIME_PERIODS PTP
4045 WHERE (PTP.END_DATE, PTP.PAYROLL_ID) =
4046 (SELECT START_DATE - 1 ,
4047 PAYROLL_ID
4048 FROM PER_TIME_PERIODS PTP1
4049 WHERE PTP1.START_DATE = G_PRP_START_DATE
4050 AND PTP1.END_DATE = G_PRP_END_DATE
4051 AND PTP1.PAYROLL_ID = G_PAYROLL_ID
4052 );
4053 Bug 14778657 */
4054 ------------------------------------------------------------------------------------------
4055 CURSOR C_MAIN_ENTRY_CHECK(P_PERSON_ID NUMBER,P_ASSIGNMENT_ID NUMBER)
4056 IS
4057 SELECT PAAF.ASSIGNMENT_NUMBER
4058 FROM PER_ALL_PEOPLE_F PAPF,
4059 PER_ALL_ASSIGNMENTS_F PAAF,
4060 PAY_ELEMENT_ENTRY_VALUES_F PEEVF,
4061 PAY_ELEMENT_ENTRIES_F PEEF,
4062 PER_ASSIGNMENT_STATUS_TYPES PAST
4063 WHERE PAAF.PERSON_ID =PAPF.PERSON_ID
4064 AND PAPF.PERSON_ID =P_PERSON_ID
4065 AND PAAF.ASSIGNMENT_STATUS_TYPE_ID = PAST.ASSIGNMENT_STATUS_TYPE_ID
4066 -- AND PAST.PAY_SYSTEM_STATUS='P'
4067 AND PAST.PER_SYSTEM_STATUS <>'TERM_ASSIGN'
4068 AND PEEF.ASSIGNMENT_ID =PAAF.ASSIGNMENT_ID
4069 AND PEEF.ELEMENT_TYPE_ID =G_ELEMENT_DETAILS.G_ELEMENT_TYPE_ID
4070 AND PEEVF.ELEMENT_ENTRY_ID =PEEF.ELEMENT_ENTRY_ID
4071 AND PEEVF.INPUT_VALUE_ID =G_ELEMENT_DETAILS.G_MAIN_ENTRY_ID
4072 AND PEEVF.SCREEN_ENTRY_VALUE ='Y'
4073 AND PAAF.ASSIGNMENT_ID <> P_ASSIGNMENT_ID
4074 AND G_PRP_END_DATE >= all(PAPF.EFFECTIVE_START_DATE,PAAF.EFFECTIVE_START_DATE,PEEVF.EFFECTIVE_START_DATE,PEEF.EFFECTIVE_START_DATE )
4075 AND G_PRP_START_DATE <= all(PAPF.EFFECTIVE_END_DATE,PAAF.EFFECTIVE_END_DATE,PEEVF.EFFECTIVE_END_DATE,PEEF.EFFECTIVE_END_DATE);
4076 /* AND G_PRP_END_DATE BETWEEN PEEF.EFFECTIVE_START_DATE AND PEEF.EFFECTIVE_END_DATE
4077 AND G_PRP_END_DATE BETWEEN PEEVF.EFFECTIVE_START_DATE AND PEEVF.EFFECTIVE_END_DATE
4078 AND G_PRP_END_DATE BETWEEN PAAF.EFFECTIVE_START_DATE AND PAAF.EFFECTIVE_END_DATE
4079 AND G_PRP_END_DATE BETWEEN PAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE;
4080 */
4081 ------------------------------------------------------------------------------------------
4082 CURSOR C_QUALIFYING_SCHEME_VALID (P_QUAL_SCHEME_NAME PQP_GB_PENSION_SCHEMES_V.PENSION_SCHEME_NAME%TYPE)
4083 IS
4084 SELECT 1
4085 FROM PQP_CONFIGURATION_VALUES PCV
4086 WHERE PCV_INFORMATION_CATEGORY = 'PAY_GB_QUALIFIED_PENSIONS_INFO'
4087 AND PCV.BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID
4088 AND PCV.PCV_INFORMATION1 = P_QUAL_SCHEME_NAME;
4089 ------------------------------------------------------------------------------------------
4090 /*
4091 retunrs 0 if employee has never been in Qualifying Pensions Scheme as an EJH
4092 else returns no of times he has been in PQS as EJH
4093 */
4094 cursor c_ejh_history(P_ASSIGNMENT_ID number)
4095 is
4096 SELECT count (*)
4097 FROM pay_element_entry_values_f p1
4098 , pay_element_entry_values_f p2
4099 WHERE p1.element_entry_id = p2.element_entry_id
4100 AND p1.element_entry_id IN
4101 (
4102 SELECT element_entry_id
4103 FROM pay_element_entries_f
4104 WHERE element_type_id =
4105 (
4106 SELECT element_type_id
4107 FROM pay_element_types_f
4108 WHERE element_name LIKE 'Pensions Information'
4109 )
4110 AND assignment_id = P_ASSIGNMENT_ID
4111 )
4112 AND p1.input_value_id =
4113 (
4114 SELECT input_value_id
4115 FROM pay_input_values_f
4116 WHERE element_type_id =
4117 (
4118 SELECT element_type_id
4119 FROM pay_element_types_f
4120 WHERE element_name LIKE 'Pensions Information'
4121 )
4122 AND name = 'Pension Classification'
4123 )
4124 AND p2.input_value_id =
4125 (
4126 SELECT input_value_id
4127 FROM pay_input_values_f
4128 WHERE element_type_id =
4129 (
4130 SELECT element_type_id
4131 FROM pay_element_types_f
4132 WHERE element_name LIKE 'Pensions Information'
4133 )
4134 AND name = 'Qualifying scheme exists'
4135 )
4136 AND p1.effective_start_date = p2.effective_start_date
4137 AND p1.effective_end_date = p2.effective_end_date
4138 AND p1.screen_entry_value = 'ELIGIBLE JOB HOLDER'
4139 AND p2.screen_entry_value = 'Y';
4140
4141 /*
4142 Check if Qualifying Pensions Scheme exists for an employee on Staging Date
4143 If exists then returns Scheme name else returns null
4144 */
4145 CURSOR C_QPS_EXISTS_ON_STAGING_DATE (P_ASSIGNMENT_ID PAY_ELEMENT_ENTRIES_F.ASSIGNMENT_ID%TYPE)
4146 IS
4147 SELECT PCV.PCV_INFORMATION1
4148 FROM PQP_CONFIGURATION_VALUES PCV ,
4149 PAY_ELEMENT_TYPES_F PETF ,
4150 PAY_ELEMENT_ENTRIES_F PEEF
4151 WHERE PCV_INFORMATION_CATEGORY = 'PAY_GB_QUALIFIED_PENSIONS_INFO'
4152 AND PCV.BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID
4153 AND PCV.PCV_INFORMATION2 = PETF.ELEMENT_NAME
4154 AND PETF.BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID
4155 AND PEEF.ELEMENT_TYPE_ID = PETF.ELEMENT_TYPE_ID
4156 AND PEEF.ASSIGNMENT_ID = P_ASSIGNMENT_ID
4157 AND FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE) BETWEEN PETF.EFFECTIVE_START_DATE AND PETF.EFFECTIVE_END_DATE
4158 AND FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE) BETWEEN PEEF.EFFECTIVE_START_DATE AND PEEF.EFFECTIVE_END_DATE
4159 ORDER BY PETF.EFFECTIVE_START_DATE DESC;
4160
4161 /*
4162 CURSOR C_ERROR_MSG IS
4163 SELECT SUBSTR(line_text,1,240) FROM PAY_MESSAGE_LINES
4164 WHERE PAYROLL_ID = 123 AND MESSAGE_LEVEL ='F' AND SOURCE_ID = P_ASSACTID AND SOURCE_TYPE = 'A';
4165 */
4166 ---------------------------------------------------------------------------------------------
4167 -- to get pensions staging date at Payroll level
4168 CURSOR C_PAYROLL_PENSION_STAGING_DATE
4169 IS
4170 SELECT scl.SEGMENT20
4171 FROM pay_all_payrolls_f ppf,
4172 hr_soft_coding_keyflex scl
4173 WHERE ppf.payroll_id =G_PAYROLL_ID
4174 AND scl.soft_coding_keyflex_id = ppf.soft_coding_keyflex_id
4175 AND G_PRP_END_DATE BETWEEN ppf.effective_start_date AND ppf.effective_end_date;
4176
4177 -- to get pensions staging date at Employee/Person level
4178 CURSOR C_EMP_PENSION_STAGING_DATE(P_PERSON_ID PER_ALL_PEOPLE_F.PERSON_ID%TYPE)
4179 IS
4180 SELECT pei_information1
4181 FROM per_people_extra_info
4182 WHERE pei_information_category LIKE 'GB_PENSIONS_STAGING_DATE'
4183 AND person_id = P_PERSON_ID;
4184
4185 -- to get pensions staging date at Payee/Employer level
4186 CURSOR C_PAYEE_PENSION_STAGING_DATE
4187 IS
4188 SELECT UPPER(SUBSTR(TRIM(HOI.ORG_INFORMATION2),1,35)) PENSION_STAGING_DATE
4189 FROM PAY_PAYROLLS_F PPF,
4190 HR_SOFT_CODING_KEYFLEX HSCF,
4191 HR_ORGANIZATION_INFORMATION HOI
4192 WHERE PPF.PAYROLL_ID = G_PAYROLL_ID
4193 AND PPF.BUSINESS_GROUP_ID = HOI.ORGANIZATION_ID
4194 AND HOI.ORG_INFORMATION_CONTEXT = 'UK Pensions'
4195 AND NVL(HOI.ORG_INFORMATION10,'UK') = 'UK'
4196 AND PPF.SOFT_CODING_KEYFLEX_ID = HSCF.SOFT_CODING_KEYFLEX_ID
4197 AND HSCF.SEGMENT1 = HOI.ORG_INFORMATION1;
4198
4199 -- to get custom function name for given pensions scheme
4200 CURSOR C_VALIDATE_CONFIG_VALUE(P_CONFIGURATION_TYPE VARCHAR2, P_SCHEME_NAME PQP_CONFIGURATION_VALUES.PCV_INFORMATION1%TYPE )
4201 IS
4202 SELECT PCV_INFORMATION2
4203 FROM PQP_CONFIGURATION_VALUES
4204 WHERE PCV_INFORMATION_CATEGORY = P_CONFIGURATION_TYPE -- 'PAY_GB_ENROLMENT_CUSTOM_PROC'
4205 AND PCV_INFORMATION1 = P_SCHEME_NAME
4206 AND BUSINESS_GROUP_ID = G_BUSINESS_GROUP_ID;
4207
4208 ------------------------------------------------------------------------------------------
4209 --13 Input values of Pension Info Element
4210 L_QUALIFYING_SCHEME_NAME PQP_GB_PENSION_SCHEMES_V.ELEMENT_NAME%TYPE :=NULL;
4211 L_AGGREGATION_FLAG VARCHAR2(5) :=NULL;
4212 L_AUTO_ENROLLMENT_DATE DATE :=NULL;
4213 L_QUALIFYING_SCHEME_EXISTS VARCHAR2(5) :=NULL;
4214 L_POSTPONEMENT_TYPE VARCHAR2(100) :=NULL;--New
4215 L_POSTPONEMENT_DATE DATE :=NULL;
4216 L_EMPLOYEE_CLASS_FOR_PENSION VARCHAR2(100) :=NULL;--New
4217 L_OPTIN_DATE DATE :=NULL;--New
4218 L_OPTOUT_DATE DATE :=NULL;--New
4219 L_MAIN_ENTRY VARCHAR2(5) :=NULL;--New
4220 L_EARNINGS NUMBER :=0;
4221 L_OPTOUT_END_DATE DATE :=NULL;
4222 L_ELIGIBLE_JH_DATE DATE :=NULL;
4223 -- Other Local Variables
4224 L_MAX_POSTPO_DATE DATE;
4225 L_ASSIGN_NUM_CHECK PER_ALL_ASSIGNMENTS_F.ASSIGNMENT_NUMBER%TYPE :=NULL;
4226 L_EMPLOYER_COMPONENT PQP_GB_PENSION_SCHEMES_V.ELEMENT_NAME%TYPE :=NULL;
4227 L_DEFAULT_SCHEME_NAME PQP_GB_PENSION_SCHEMES_V.ELEMENT_NAME%TYPE :=NULL;
4228 L_DEFAULT_SCH_ELEMENT_NAME PQP_GB_PENSION_SCHEMES_V.PENSION_SCHEME_NAME%TYPE :=NULL;
4229 L_AGE_START NUMBER :=0;
4230 L_AGE_END NUMBER :=0;
4231 L_DATE_OF_BIRTH DATE :=NULL;
4232 L_EMPLOYEE_STATUS_FOR_PENSION NUMBER;
4233 L_AGE NUMBER;
4234 L_REASON VARCHAR2(200);
4235 L_WORKER_POSTP_FLAG VARCHAR2(3) DEFAULT 'N';
4236 L_EJH_POSTP_FLAG VARCHAR2(3) DEFAULT 'N';
4237 L_SERVICE_START DATE :=NULL;
4238 L_TEMP VARCHAR2(30);
4239 L_PERSON_ID PER_ALL_PEOPLE_F.PERSON_ID%TYPE :=NULL;
4240 L_ASSIGNMENT_ID PER_ALL_ASSIGNMENTS_F.ASSIGNMENT_ID%TYPE :=NULL;
4241 L_ELEMENT_ENTRY_ID PAY_ELEMENT_ENTRIES_F.ELEMENT_ENTRY_ID%TYPE :=NULL;
4242 -- L_PENSION_ENTRY_START DATE; -- Bug 14343133
4243 L_PENSION_ENTRY_END DATE;
4244 L_PENSION_ENTRY_ID NUMBER;
4245 L_FULL_NAME PER_ALL_PEOPLE_F.FULL_NAME%TYPE;
4246 L_ASSIGNMENT_NUMBER VARCHAR2(30);
4247 L_NOMINAL_AUTO_ENROLL_DATE DATE;
4248 L_NOMINAL_FLAG VARCHAR(3) :='N';
4249 -- L_PREV_PER_START_DATE DATE;
4250 L_ACTION_ID NUMBER;
4251 L_OVN NUMBER;
4252 L_DOB_TT DATE;
4253 L_ER_SCHEME_NAME VARCHAR2(150);
4254 --L_ERR_MSG VARCHAR2(240);
4255 --Bug 14649941
4256 L_EARNINGS_TEMP NUMBER :=0;
4257 L_AGE_TEMP NUMBER :=0;
4258 L_FLAG_TEMP BOOLEAN := FALSE;
4259 l_history number;
4260 L_STAGING_DATE_EARNINGS number;
4261 L_PENSION_STATUS_SD number;
4262 l_qps_on_staging_date PQP_GB_PENSION_SCHEMES_V.ELEMENT_NAME%TYPE :=NULL;
4263 --Bug 14649941
4264 L_EARNINGS_OLD NUMBER :=0; -- bug 16102066
4265 L_EMPLOYEE_PENSION_CLASS_OLD VARCHAR2(100) :=NULL;--bug 16102066
4266 L_PENSION_STAGING_DATE_TEMP HR_ORGANIZATION_INFORMATION.ORG_INFORMATION2%TYPE; -- bug 16178067
4267 -- bug 14380856
4268 --Bug 16394694
4269 l_asg_start_date Date;
4270 --Bug 16394694
4271 L_CUSTOM_PROCEDURE PQP_CONFIGURATION_VALUES.PCV_INFORMATION2%type := null; -- ER 14380856
4272 L_STMT varchar2(200) := null; -- ER 14380856
4273 l_status number :=2; -- ER 14380856
4274 l_custom_eff_date date;-- ER 14380856
4275 L_EXCEPTION_NO_ERROR EXCEPTION;-- Nothing to be Done. Just Skip the Assignment
4276 L_EXCEPTION EXCEPTION;-- Unsuccessful.
4277 L_EXCEPTION_UPDATE EXCEPTION;--Update the Pension Info Element and also archive the assignment details.
4278 L_EXCEPTION_UPDATE_INFO EXCEPTION;--Updates ONLY the Pension Info Element - Does not archive the data.
4279 BEGIN
4280 hr_utility.trace('ARCHIVE CODE');
4281 BEGIN -- Inner Section
4282 --- Get The Assignment's Details
4283 OPEN C_ASSIGNMENT_DETAILS;
4284 FETCH C_ASSIGNMENT_DETAILS
4285 INTO L_PERSON_ID,l_asg_start_date,
4286 L_ASSIGNMENT_ID,
4287 L_ELEMENT_ENTRY_ID,
4288 L_ASSIGNMENT_NUMBER;
4289 IF C_ASSIGNMENT_DETAILS%NOTFOUND THEN
4290 hr_utility.trace('No Data(Element Entry) Found for Pension Information for the Assignment Action ID :'||p_assactid);
4291 populate_run_msg(p_assactid,'No Data Found for Pensions Information for the Assignment.');
4292 L_FLAG_TEMP := TRUE;
4293 END IF;
4294 CLOSE C_ASSIGNMENT_DETAILS;
4295 if L_FLAG_TEMP then
4296 RAISE L_EXCEPTION;
4297 end if;
4298
4299 -- Find Pensions Staging Date in order of -- 1.Employee 2.Payroll 3.Employer --bug 16178067
4300 open C_EMP_PENSION_STAGING_DATE(L_PERSON_ID);
4301 fetch C_EMP_PENSION_STAGING_DATE into L_PENSION_STAGING_DATE_TEMP;
4302 if C_EMP_PENSION_STAGING_DATE%FOUND and L_PENSION_STAGING_DATE_TEMP is not null then
4303 -- employee level pensions staging date
4304 G_PENSION_STAGING_DATE := L_PENSION_STAGING_DATE_TEMP;
4305 hr_utility.trace('Employee level G_PENSION_STAGING_DATE : '||G_PENSION_STAGING_DATE);
4306 else
4307 L_PENSION_STAGING_DATE_TEMP := null;
4308 open C_PAYROLL_PENSION_STAGING_DATE;
4309 fetch C_PAYROLL_PENSION_STAGING_DATE into L_PENSION_STAGING_DATE_TEMP;
4310 if C_PAYROLL_PENSION_STAGING_DATE%FOUND and L_PENSION_STAGING_DATE_TEMP is not null then
4311 -- payroll_level pensions staging date
4312 G_PENSION_STAGING_DATE := L_PENSION_STAGING_DATE_TEMP;
4313 hr_utility.trace('Payroll level G_PENSION_STAGING_DATE : '||G_PENSION_STAGING_DATE);
4314 else
4315 open C_PAYEE_PENSION_STAGING_DATE;
4316 fetch C_PAYEE_PENSION_STAGING_DATE into L_PENSION_STAGING_DATE_TEMP;
4317 if C_PAYEE_PENSION_STAGING_DATE%FOUND and L_PENSION_STAGING_DATE_TEMP is not null then
4318 -- employer level pensions staging date
4319 G_PENSION_STAGING_DATE := L_PENSION_STAGING_DATE_TEMP;
4320 hr_utility.trace('Payee level G_PENSION_STAGING_DATE : '||G_PENSION_STAGING_DATE);
4321 else
4322 -- no pensions staging date found
4323 G_PENSION_STAGING_DATE := null;
4324 end if;
4325 close C_PAYEE_PENSION_STAGING_DATE;
4326 end if;
4327 close C_PAYROLL_PENSION_STAGING_DATE;
4328 end if;
4329 close C_EMP_PENSION_STAGING_DATE;
4330
4331 hr_utility.trace('Final G_PENSION_STAGING_DATE : '||G_PENSION_STAGING_DATE);
4332
4333 IF G_PENSION_STAGING_DATE IS NULL THEN
4334 populate_run_msg(p_assactid,'Staging Date has not been set for this employee at any level, hence this assignment is being skipped.');
4335 hr_utility.trace('Staging Date has not been Set.');
4336 RAISE L_EXCEPTION_NO_ERROR;
4337 END IF;
4338 IF (G_PRP_END_DATE < FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE)) THEN-- Staging Date
4339 populate_run_msg(p_assactid,'Staging Date not yet reached for this employee, hence this assignment is being skipped.');
4340 hr_utility.trace('Staging Date Not Yet Reached for this employee.');
4341 RAISE L_EXCEPTION_NO_ERROR;
4342 END IF;
4343
4344 -- Get the Full Name of the Employee
4345 OPEN PERSON_NAME(L_PERSON_ID);
4346 FETCH PERSON_NAME INTO L_FULL_NAME;
4347 CLOSE PERSON_NAME;
4348 --Get Entry Values for the Assignment's Pension Element
4349 P_PENSION_INPUT_VALUES := NULL ;
4350 hr_utility.trace('Outside C_PENSION_INPUT_VALUES --L_ELEMENT_ENTRY_ID Value: '||L_ELEMENT_ENTRY_ID);
4351 OPEN C_PENSION_INPUT_VALUES(L_ELEMENT_ENTRY_ID);
4352 hr_utility.trace('Inside C_PENSION_INPUT_VALUES --L_ELEMENT_ENTRY_ID Value: '||L_ELEMENT_ENTRY_ID);
4353 FETCH C_PENSION_INPUT_VALUES INTO P_PENSION_INPUT_VALUES;
4354 IF C_PENSION_INPUT_VALUES%NOTFOUND THEN
4355 hr_utility.trace('No Data( Entry Values) Found for Pension Information for the Assignment Action ID :'||p_assactid);
4356 populate_run_msg(p_assactid,'No Data Found for Pensions Information for the Assignment.');
4357 L_FLAG_TEMP := TRUE;
4358 END IF;
4359 CLOSE C_PENSION_INPUT_VALUES;
4360 if L_FLAG_TEMP then
4361 RAISE L_EXCEPTION;
4362 end if;
4363 ---CHECK
4364 hr_utility.trace('For the Assignment Number :'||L_ASSIGNMENT_NUMBER);
4365 hr_utility.trace('ENTRY VALUES CHECK:::::::');
4366 hr_utility.trace('VAlUE:'||P_PENSION_INPUT_VALUES.G_QUALIFYING_SCHEME_NAME);
4367 hr_utility.trace('VAlUE:'||P_PENSION_INPUT_VALUES.G_AGG_EARNINGS_PENSIONS);
4368 hr_utility.trace('VAlUE:'||P_PENSION_INPUT_VALUES.G_AUTO_ENROLLMENT_DATE);
4369 hr_utility.trace('VAlUE:'||P_PENSION_INPUT_VALUES.G_QUALIFYING_PS_EXISTS);
4370 hr_utility.trace('VAlUE:'||P_PENSION_INPUT_VALUES.G_POSTPONEMENT_TYPE);
4371 hr_utility.trace('VAlUE:'||P_PENSION_INPUT_VALUES.G_POSTPONEMENT_END_DATE);
4372 hr_utility.trace('VAlUE:'||P_PENSION_INPUT_VALUES.G_EMPLOYEE_CLASS);
4373 hr_utility.trace('VAlUE:'||P_PENSION_INPUT_VALUES.G_OPT_IN_DATE);
4374 hr_utility.trace('VAlUE:'||P_PENSION_INPUT_VALUES.G_OPT_OUT_DATE);
4375 hr_utility.trace('VAlUE:'||P_PENSION_INPUT_VALUES.G_MAIN_ENTRY);
4376 hr_utility.trace('VAlUE:'||P_PENSION_INPUT_VALUES.G_TOTAL_EARNING_PRP);
4377 hr_utility.trace('VAlUE:'||P_PENSION_INPUT_VALUES.G_OPT_OUT_END_DATE);
4378 hr_utility.trace('VAlUE:'||P_PENSION_INPUT_VALUES.G_ELIGIBLE_JH_DATE);
4379 ---CHECK
4380 --Assignment to Local Variables
4381 L_QUALIFYING_SCHEME_NAME :=P_PENSION_INPUT_VALUES.G_QUALIFYING_SCHEME_NAME;
4382 L_AGGREGATION_FLAG :=P_PENSION_INPUT_VALUES.G_AGG_EARNINGS_PENSIONS;
4383 L_AUTO_ENROLLMENT_DATE :=fnd_date.canonical_to_date(P_PENSION_INPUT_VALUES.G_AUTO_ENROLLMENT_DATE);
4384 L_QUALIFYING_SCHEME_EXISTS :=P_PENSION_INPUT_VALUES.G_QUALIFYING_PS_EXISTS;
4385 L_POSTPONEMENT_TYPE :=P_PENSION_INPUT_VALUES.G_POSTPONEMENT_TYPE;
4386 L_POSTPONEMENT_DATE :=fnd_date.canonical_to_date(P_PENSION_INPUT_VALUES.G_POSTPONEMENT_END_DATE);
4387 L_EMPLOYEE_CLASS_FOR_PENSION :=P_PENSION_INPUT_VALUES.G_EMPLOYEE_CLASS;
4388 L_OPTIN_DATE :=fnd_date.canonical_to_date(P_PENSION_INPUT_VALUES.G_OPT_IN_DATE);
4389 L_OPTOUT_DATE :=fnd_date.canonical_to_date(P_PENSION_INPUT_VALUES.G_OPT_OUT_DATE);
4390 L_MAIN_ENTRY :=P_PENSION_INPUT_VALUES.G_MAIN_ENTRY;
4391 L_EARNINGS :=P_PENSION_INPUT_VALUES.G_TOTAL_EARNING_PRP;
4392 L_OPTOUT_END_DATE :=fnd_date.canonical_to_date(P_PENSION_INPUT_VALUES.G_OPT_OUT_END_DATE);
4393 L_ELIGIBLE_JH_DATE :=fnd_date.canonical_to_date(P_PENSION_INPUT_VALUES.G_ELIGIBLE_JH_DATE);
4394 --New Worker or Staging Date
4395 OPEN C_SERVICE_START (L_PERSON_ID) ;
4396 FETCH C_SERVICE_START INTO L_SERVICE_START;
4397 CLOSE C_SERVICE_START;
4398 -- 22nd Birthday
4399 OPEN C_AGE_BETWEEN_PAYROLL(L_PERSON_ID) ;
4400 FETCH C_AGE_BETWEEN_PAYROLL INTO L_DATE_OF_BIRTH;
4401 CLOSE C_AGE_BETWEEN_PAYROLL;
4402 L_DOB_TT := FETCH_START_DATE(L_DATE_OF_BIRTH);
4403 hr_utility.trace('Twenty Second birthday::'||L_DOB_TT );
4404 hr_utility.trace('L_ELIGIBLE_JH_DATE Value::'||L_ELIGIBLE_JH_DATE);
4405 hr_utility.trace('L_SERVICE_START Value::'||L_SERVICE_START);
4406 hr_utility.trace('L_DOB_TT Value::'||L_DOB_TT);
4407 /* Bug fix 14581138
4408 IF G_DEF_FLAG <>'Y' THEN*/
4409 hr_utility.trace('G_DEF_FLAG Value::'||NVL(G_DEF_FLAG,'Null'));
4410 IF (NVL(G_DEF_FLAG,'N') <>'Y') THEN
4411 L_DEFAULT_SCHEME_NAME := G_DEFAULT_SCHEME_NAME;
4412 L_DEFAULT_SCH_ELEMENT_NAME := G_DEFAULT_SCH_ELEMENT_NAME;
4413 L_EMPLOYER_COMPONENT := G_EMPLOYER_COMPONENT;
4414 END IF;
4415 -- VALIDATIONS
4416 -- Check if Qualifying scheme is a Valid Qualifying scheme
4417 IF L_QUALIFYING_SCHEME_NAME IS NOT NULL THEN
4418 OPEN C_QUALIFYING_SCHEME_VALID(L_QUALIFYING_SCHEME_NAME);
4419 FETCH C_QUALIFYING_SCHEME_VALID INTO L_TEMP;
4420 IF C_QUALIFYING_SCHEME_VALID%NOTFOUND THEN
4421 hr_utility.trace('Qualifying Scheme Name entered for the assignment is not valid.');
4422 populate_run_msg(p_assactid,'Qualifying Scheme Name entered for the assignment is not valid.');
4423 RAISE L_EXCEPTION;
4424 END IF;
4425 CLOSE C_QUALIFYING_SCHEME_VALID;
4426 IF (NVL(L_QUALIFYING_SCHEME_EXISTS,'N') ='N') THEN
4427 hr_utility.trace('Qualifying Scheme Name is entered for the assignment, but Qualifying Scheme Exists is not set to Yes.');
4428 populate_run_msg(p_assactid,'Qualifying Scheme Name is entered for the assignment, but Qualifying Scheme Exists is not set to Yes.');
4429 RAISE L_EXCEPTION;
4430 END IF;
4431 END IF;
4432 hr_utility.trace('L_POSTPONEMENT_TYPE: '||L_POSTPONEMENT_TYPE);
4433 --Check if PP End Date is present without the PP Type
4434 IF L_POSTPONEMENT_DATE IS NOT NULL AND L_POSTPONEMENT_TYPE IS NULL THEN
4435 hr_utility.trace('Postponement End Date is entered for the assignment, but Postponement Type is not entered.');
4436 populate_run_msg(p_assactid,'Postponement End Date is entered for the assignment, but Postponement Type is not entered.');
4437 RAISE L_EXCEPTION;
4438 END IF;
4439 -- Check if Postponement End Date is more than three months - if not DB Scheme Postponement
4440 IF L_POSTPONEMENT_TYPE <> 'DB Scheme Postponement' THEN -- if not DB Scheme Postponement
4441 /*Bug 14622818 Modified the condition*/
4442 IF (L_ELIGIBLE_JH_DATE IS NOT NULL and l_eligible_jh_date <> hr_api.g_eot) THEN
4443 L_MAX_POSTPO_DATE := L_ELIGIBLE_JH_DATE;
4444 ELSE
4445 L_MAX_POSTPO_DATE := GREATEST(L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE));
4446 END IF;
4447 hr_utility.trace('L_MAX_POSTPO_DATE Value::'||L_MAX_POSTPO_DATE);
4448 IF (ADD_MONTHS(L_MAX_POSTPO_DATE,3) - 1 ) < L_POSTPONEMENT_DATE THEN
4449 hr_utility.trace('More than three months postponement - error');
4450 hr_utility.trace('Postponement Period is longer than 3 months. Please Check the Postponement End Date of the assignment.');
4451 populate_run_msg(p_assactid,'Postponement Period is longer than 3 months.');
4452 RAISE L_EXCEPTION;
4453 ELSE
4454 hr_utility.trace('less than three months');
4455 END IF;
4456 END IF;-- if not DB Scheme Postponement
4457 --
4458 -- Check if Main Entry is set to Yes for more than one assignments for the same person
4459 IF (NVL(L_MAIN_ENTRY,'N') = 'Y') THEN
4460 OPEN C_MAIN_ENTRY_CHECK(L_PERSON_ID,L_ASSIGNMENT_ID);
4461 FETCH C_MAIN_ENTRY_CHECK INTO L_ASSIGN_NUM_CHECK;
4462 IF C_MAIN_ENTRY_CHECK%FOUND THEN
4463 hr_utility.trace('Main Entry for Aggregation is set to YES for more than one assignment for the same person.');
4464 populate_run_msg(p_assactid,'Main Entry for Aggregation is set to YES for more than one assignment for the same person.');
4465 hr_utility.trace('Assignment Number - '||L_ASSIGN_NUM_CHECK);
4466 RAISE L_EXCEPTION;
4467 END IF;
4468 CLOSE C_MAIN_ENTRY_CHECK;
4469 IF (NVL(L_AGGREGATION_FLAG,'N')='N') THEN
4470 hr_utility.trace('Main Entry for Aggregation is set to YES, but Aggregate Earnings is not set to YES.');
4471 populate_run_msg(p_assactid,'Main Entry for Aggregation is set to YES, but Aggregate Earnings is not set to YES.');
4472 RAISE L_EXCEPTION;
4473 END IF;
4474 END IF;
4475
4476
4477 --DB Scheme Postponement validation - Only for EJH -- Bug 14649941
4478
4479 IF (L_POSTPONEMENT_DATE IS NULL) AND (L_POSTPONEMENT_TYPE IS NOT NULL) THEN
4480 hr_utility.trace('Postponement Type is entered, but Postponement End Date is not entered.');
4481 populate_run_msg(p_assactid,'Postponement Type is entered, but Postponement End Date is not entered.');
4482 RAISE L_EXCEPTION;
4483 END IF;
4484
4485 IF (L_POSTPONEMENT_DATE IS NOT NULL) AND (L_POSTPONEMENT_TYPE IS NULL) THEN
4486 hr_utility.trace('Postponement End Date is entered, but Postponement Type is not entered.');
4487 populate_run_msg(p_assactid,'Postponement End Date is entered, but Postponement Type is not entered.');
4488 RAISE L_EXCEPTION;
4489 END IF;
4490
4491 IF NVL(L_ELIGIBLE_JH_DATE,G_END_OF_TIME)= G_END_OF_TIME and L_EMPLOYEE_CLASS_FOR_PENSION = 'Eligible Job Holder' THEN
4492 hr_utility.trace('Pension Classification is set to Eligible Job Holder, but Eligible Job Holder Date is not set correctly.');
4493 populate_run_msg(p_assactid,'Pension Classification is set to Eligible Job Holder, but Eligible Job Holder Date is not set correctly.');
4494 RAISE L_EXCEPTION;
4495 END IF;
4496
4497 --DB Scheme Postponement validation - Only for EJH and only if the postponement is still prevailing in the PRP
4498 -- IF the postponement is over then the validation is not required
4499 IF (L_POSTPONEMENT_TYPE = 'DB Scheme Postponement') THEN --DB Postponement
4500 IF L_ELIGIBLE_JH_DATE IS NULL AND L_POSTPONEMENT_DATE >=G_PRP_END_DATE THEN -- Never assessed before--First time run
4501
4502 IF (ASSESS_EMPLOYEE_PROCESS(L_PERSON_ID, L_ASSIGNMENT_ID,NVL(L_AGGREGATION_FLAG,'N'),L_EARNINGS_TEMP,L_AGE_TEMP,p_assactid))=1 THEN
4503 hr_utility.trace('DB Scheme Postponement is valid. Never assessed but Now assessed');
4504 -- update pensions classsification
4505 L_EMPLOYEE_CLASS_FOR_PENSION :='Eligible Job Holder';
4506 --L_ELIGIBLE_JH_DATE := HR_API.G_EOT;
4507 IF (L_DOB_TT BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) THEN
4508 L_ELIGIBLE_JH_DATE := L_DOB_TT;
4509 ELSE
4510 L_ELIGIBLE_JH_DATE := G_PRP_START_DATE;
4511 END IF;
4512 RAISE L_EXCEPTION_UPDATE_INFO;
4513 ELSE
4514 populate_run_msg(p_assactid,'DB Scheme Postponement is set, but it is invalid as the assignment is not an Eligible Job Holder.');
4515 RAISE L_EXCEPTION;
4516 END IF;
4517 END IF;-- Never assessed before--First time run
4518
4519 IF L_ELIGIBLE_JH_DATE IS NOT NULL AND L_POSTPONEMENT_DATE >=G_PRP_END_DATE THEN -- Already assessed atleast once
4520 IF L_EMPLOYEE_CLASS_FOR_PENSION = 'Eligible Job Holder' THEN
4521 hr_utility.trace('DB Scheme Postponement is valid. - Already Assessed');
4522 --L_EMPLOYEE_CLASS_FOR_PENSION :='Eligible Job Holder';
4523 RAISE L_EXCEPTION;
4524 ELSE
4525 hr_utility.trace('DB Scheme Postponement is set, but it is invalid as the assignment is not an Eligible Job Holder.');
4526 populate_run_msg(p_assactid,'DB Scheme Postponement is set, but it is invalid as the assignment is not an Eligible Job Holder.');
4527 END IF;
4528 END IF;-- Already assessed atleast once
4529 END IF;--DB Postponement
4530 --DB Scheme Postponement validation - Only for EJH -- Bug 14649941
4531 ----------- Logic STARTS
4532 hr_utility.trace('L_AGGREGATION_FLAG Value::'||L_AGGREGATION_FLAG);
4533 --A.E.D. Null
4534 IF (L_AUTO_ENROLLMENT_DATE) IS NULL THEN
4535 --OPT Out date Crossed
4536 -- IF (NVL(L_OPTOUT_DATE,G_END_OF_TIME) > G_PRP_END_DATE) THEN
4537 --Postponement Check
4538 hr_utility.trace('L_POSTPONEMENT_DATE Value::'||L_POSTPONEMENT_DATE);
4539 IF (NVL(L_POSTPONEMENT_DATE,G_PRP_START_DATE) <G_PRP_END_DATE) THEN
4540 --Main Entry
4541 hr_utility.trace('Qualifying Scheme Attached???'||L_QUALIFYING_SCHEME_EXISTS);
4542 --Check if It is a Main Entry , if not throw an warning that it has been skipped.
4543 IF (NVL(L_AGGREGATION_FLAG,'N')='Y' AND NVL(L_MAIN_ENTRY,'N') = 'N') THEN
4544 populate_warn_msg(p_assactid,'The assignment is under Aggregation. The Main Entry for Aggregation is not set to Yes, hence this assignment is being skipped.');
4545 END IF;
4546 --Check if It is a Main Entry , if not throw an warning that it has been skipped.
4547 IF (NVL(L_AGGREGATION_FLAG,'N') = 'N') OR (NVL(L_AGGREGATION_FLAG,'N')='Y' AND NVL(L_MAIN_ENTRY,'N') = 'Y') THEN
4548 --------------------
4549 --Scheme Already Exists
4550 IF (NVL(L_QUALIFYING_SCHEME_EXISTS,'N') ='N') THEN
4551 -- Find the Quailifying Scheme for the Assignment from element entries
4552 OPEN C_QUALIFYING_SCHEME_EXISTS (L_ASSIGNMENT_ID) ;
4553 FETCH C_QUALIFYING_SCHEME_EXISTS INTO L_QUALIFYING_SCHEME_NAME;
4554 IF C_QUALIFYING_SCHEME_EXISTS%FOUND THEN
4555 L_QUALIFYING_SCHEME_EXISTS := 'Y';
4556 L_NOMINAL_FLAG :='Y';
4557 -- RAISE L_EXCEPTION_UPDATE; -- Remove Later as Nominal Date of Enrollment has to be reported
4558 hr_utility.trace('The Assignment already has a Qualifying Scheme Attached');
4559 --Removed the fix for 16303795
4560 ELSE
4561 L_QUALIFYING_SCHEME_EXISTS := 'N';
4562 hr_utility.trace('The Assignment already doesnot have a Qualifying Scheme Attached');
4563 l_qps_on_staging_date := null;
4564 --chk if he was part of a QPS on staging date
4565 open C_QPS_EXISTS_ON_STAGING_DATE(L_ASSIGNMENT_ID);
4566 fetch C_QPS_EXISTS_ON_STAGING_DATE into l_qps_on_staging_date;
4567 close C_QPS_EXISTS_ON_STAGING_DATE;
4568 hr_utility.trace('chking if he was part of a QPS on staging date');
4569
4570 --if l_staging_date_pi > 0 then
4571 if (l_qps_on_staging_date is not null) then
4572 hr_utility.trace('Qualifying Pensions Scheme exists on Staging Date');
4573 L_STAGING_DATE_EARNINGS := TRUNC (CAL_STAGING_DATE_EARNINGS(L_ASSIGNMENT_ID,NVL(L_AGGREGATION_FLAG,'N'),L_PERSON_ID,p_assactid)+ 0.004 , 2);
4574 hr_utility.trace('L_STAGING_DATE_EARNINGS : '||L_STAGING_DATE_EARNINGS);
4575 L_PENSION_STATUS_SD := CHK_STAGING_DATE_EARNINGS(L_STAGING_DATE_EARNINGS,L_ASSIGNMENT_ID, L_PERSON_ID,L_AGE,L_REASON);
4576 hr_utility.trace('L_PENSION_STATUS_SD : '||L_PENSION_STATUS_SD);
4577 if (L_PENSION_STATUS_SD = 1) then
4578 hr_utility.trace('Employee was in QPS as an EJH on staging date hence not processing employee');
4579 raise l_exception;
4580 end if;
4581 end if;
4582
4583 END IF;
4584 CLOSE C_QUALIFYING_SCHEME_EXISTS;
4585 ------------------------------------------------------------------------------------------------------
4586 --New Worker or Staging Date
4587 IF (L_NOMINAL_FLAG ='N') THEN --Nominal Check
4588 --TAX REF Level
4589 /*Bug 14622818 Modified the condition*/
4590 IF l_eligible_jh_date IS NULL then
4591 hr_utility.trace ('Eligible Job Holder Date is not already set, means employee assessed for the first time');
4592 l_eligible_jh_date := hr_api.g_eot;
4593 /*IF ((FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE) BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) OR ( L_SERVICE_START BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE))THEN*/
4594 IF(NVL(G_WORKER_POSTPONEMENT_RULE,'NONE')='NONE') THEN
4595 L_WORKER_POSTP_FLAG := 'N';
4596 ELSE
4597 l_postponement_date := C_PAYROLL_MAX_DATE(GREATEST(L_SERVICE_START,l_asg_start_date,FND_DATE.canonical_to_date( G_PENSION_STAGING_DATE) ),G_WORKER_POSTPONEMENT_RULE);
4598
4599 l_worker_postp_flag := 'Y';
4600
4601 IF l_postponement_date < g_prp_end_date THEN
4602 l_worker_postp_flag := 'N';
4603 L_POSTPONEMENT_TYPE :='Worker Postponement';
4604 --l_postponement_date := NULL;
4605
4606 END IF;
4607 End if;
4608 /* ELSIF (G_WORKER_POSTPONEMENT_RULE ='MAX_DEFER_PERIOD_START_DATE') THEN
4609 L_POSTPONEMENT_DATE := ADD_MONTHS(G_PRP_START_DATE,3)-1;
4610 IF ( FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE) BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) THEN
4611 L_POSTPONEMENT_DATE := C_PAYROLL_MAX_DATE (FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE));
4612 ELSIF (L_SERVICE_START BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) THEN
4613 L_POSTPONEMENT_DATE := C_PAYROLL_MAX_DATE (L_SERVICE_START);
4614 ELSE
4615 L_POSTPONEMENT_DATE := C_PAYROLL_MAX_DATE (G_PRP_START_DATE);
4616 END IF;
4617 l_postponement_date := c_payroll_max_date (greatest (l_service_start
4618 ,fnd_date.canonical_to_date (g_pension_staging_date)));
4619 L_WORKER_POSTP_FLAG := 'Y';
4620 IF l_postponement_date < g_prp_end_date THEN --Bug 14622818
4621 l_worker_postp_flag := 'N';
4622 l_postponement_date := NULL;
4623 END IF;
4624
4625 ELSIF (G_WORKER_POSTPONEMENT_RULE ='NEXT_PAYROLL_PERIOD_START_DATE') THEN
4626 l_postponement_date := ADD_MONTHS(GREATEST(L_SERVICE_START,FND_DATE.canonical_to_date( G_PENSION_STAGING_DATE) ),1)-1;
4627 l_worker_postp_flag := 'Y';
4628
4629 IF l_postponement_date < g_prp_end_date THEN--Bug 14622818
4630 l_worker_postp_flag := 'N';
4631 l_postponement_date := NULL;
4632 END IF;
4633
4634 END IF;
4635 */
4636 hr_utility.trace('POSTPONEMENT END_DATE NEW WORKER starting '||L_POSTPONEMENT_DATE );
4637 END IF;--TAX REF Level
4638
4639
4640 IF (L_WORKER_POSTP_FLAG = 'Y') THEN
4641 L_POSTPONEMENT_TYPE :='Worker Postponement';
4642
4643 --------------------------- bug 15913417 : to classify employee even if worker postponment is applied--------------------------------------------------------
4644
4645 L_EMPLOYEE_STATUS_FOR_PENSION := ASSESS_EMPLOYEE_PROCESS(L_PERSON_ID, L_ASSIGNMENT_ID,NVL(L_AGGREGATION_FLAG,'N'),L_EARNINGS,L_AGE,p_assactid);
4646 hr_utility.trace('L_EMPLOYEE_STATUS_FOR_PENSION Value :'||L_EMPLOYEE_STATUS_FOR_PENSION);
4647 hr_utility.trace('EARNINGS :'||L_EARNINGS);
4648 hr_utility.trace('AGE :'||L_AGE);
4649 --Employee Classififcation
4650 /*Bug 14645724:This check is for employee who are >=75 years of age or less than 16 years of age*/
4651 IF (NVL(L_EMPLOYEE_STATUS_FOR_PENSION,'3')='4') THEN
4652 RETURN;
4653 ELSIF (NVL(L_EMPLOYEE_STATUS_FOR_PENSION,'3')='3') THEN
4654 hr_utility.trace('Assignment is a Worker :');
4655 L_EMPLOYEE_CLASS_FOR_PENSION:='Worker';
4656 -- RAISE L_EXCEPTION_UPDATE;
4657 ELSIF (NVL(L_EMPLOYEE_STATUS_FOR_PENSION,'3')='2') THEN
4658 L_EMPLOYEE_CLASS_FOR_PENSION :='Non Eligible Job Holder';
4659 hr_utility.trace('Assignment is a NON ELIGIBLE JOB HOLDER :');
4660 -- RAISE L_EXCEPTION_UPDATE;
4661 ELSIF (NVL(L_EMPLOYEE_STATUS_FOR_PENSION,'3')='1') THEN
4662 L_EMPLOYEE_CLASS_FOR_PENSION :='Eligible Job Holder';
4663 hr_utility.trace('Person Id'|| L_PERSON_ID);
4664 IF (L_ELIGIBLE_JH_DATE IS NULL ) THEN -- Never Found eligible
4665 IF (L_DOB_TT BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) THEN
4666 L_ELIGIBLE_JH_DATE := L_DOB_TT;
4667 ELSE
4668 L_ELIGIBLE_JH_DATE := G_PRP_START_DATE;
4669 END IF;
4670 END IF;
4671 IF (L_ELIGIBLE_JH_DATE IS NOT NULL ) THEN -- Bug 13945549
4672 IF (G_PRP_START_DATE-1)=L_POSTPONEMENT_DATE THEN -- To check if Last Period was the period when the assignment was first assessed as EJH
4673 hr_utility.trace('One Day after the postponement end date , this PRP starts.');
4674 ELSE
4675 IF (L_DOB_TT BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) THEN
4676 L_ELIGIBLE_JH_DATE := L_DOB_TT;
4677 ELSE
4678 L_ELIGIBLE_JH_DATE := G_PRP_START_DATE;
4679 END IF;
4680 END IF;
4681 END IF;
4682 END IF;
4683 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4684 RAISE L_EXCEPTION_UPDATE;
4685 END IF;
4686 END IF;--Nominal Check
4687 ---Assesment
4688 IF (L_WORKER_POSTP_FLAG ='N') THEN
4689 L_EMPLOYEE_STATUS_FOR_PENSION := ASSESS_EMPLOYEE_PROCESS(L_PERSON_ID, L_ASSIGNMENT_ID,NVL(L_AGGREGATION_FLAG,'N'),L_EARNINGS,L_AGE,p_assactid);
4690 hr_utility.trace('L_EMPLOYEE_STATUS_FOR_PENSION Value :'||L_EMPLOYEE_STATUS_FOR_PENSION);
4691 hr_utility.trace('EARNINGS :'||L_EARNINGS);
4692 hr_utility.trace('AGE :'||L_AGE);
4693 open c_ejh_history(L_ASSIGNMENT_ID);
4694 fetch c_ejh_history into l_history;
4695 close c_ejh_history;
4696 if (l_history > 0) then
4697 hr_utility.trace('Ignoring employee as he has already been in QPS as an EJH');
4698 raise l_exception;
4699 else
4700 hr_utility.trace('Processing employee as he has never been in QPS as an EJH');
4701 --Employee Classififcation
4702 /*Bug 14645724:This check is for employee who are >=75 years of age or less than 16 years of age*/
4703 IF (NVL(L_EMPLOYEE_STATUS_FOR_PENSION,'3')='4') THEN
4704 RETURN;
4705 ELSIF (NVL(L_EMPLOYEE_STATUS_FOR_PENSION,'3')='3') THEN
4706 hr_utility.trace('Assignment is a Worker :');
4707 L_EMPLOYEE_CLASS_FOR_PENSION:='Worker';
4708 RAISE L_EXCEPTION_UPDATE;
4709 ELSIF (NVL(L_EMPLOYEE_STATUS_FOR_PENSION,'3')='2') THEN
4710 L_EMPLOYEE_CLASS_FOR_PENSION :='Non Eligible Job Holder';
4711 hr_utility.trace('Assignment is a NON ELIGIBLE JOB HOLDER :');
4712 RAISE L_EXCEPTION_UPDATE;
4713 ELSIF (NVL(L_EMPLOYEE_STATUS_FOR_PENSION,'3')='1') THEN
4714 L_EMPLOYEE_CLASS_FOR_PENSION :='Eligible Job Holder';
4715 hr_utility.trace('Person Id'|| L_PERSON_ID);
4716 IF NVL(L_ELIGIBLE_JH_DATE,G_END_OF_TIME) = G_END_OF_TIME THEN -- Never Found eligible
4717 IF (L_DOB_TT BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) THEN
4718 L_ELIGIBLE_JH_DATE := GREATEST(L_DOB_TT,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE),nvl(FND_DATE.canonical_to_date(L_POSTPONEMENT_DATE)+1,to_date('0001-01-01','YYYY-MM-DD')));
4719 --L_ELIGIBLE_JH_DATE := GREATEST(L_DOB_TT,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE));
4720 ELSE
4721 L_ELIGIBLE_JH_DATE := GREATEST(G_PRP_START_DATE,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE),nvl(FND_DATE.canonical_to_date(L_POSTPONEMENT_DATE)+1,to_date('0001-01-01','YYYY-MM-DD')));
4722 --L_ELIGIBLE_JH_DATE := GREATEST(G_PRP_START_DATE,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE));
4723 END IF;
4724 END IF;
4725 -- Found Eligible previously
4726 -- IF (L_ELIGIBLE_JH_DATE IS NOT NULL ) THEN -- Bug 13945549
4727 IF NVL(L_ELIGIBLE_JH_DATE,G_END_OF_TIME) <> G_END_OF_TIME THEN
4728 -- IF (G_PRP_START_DATE-1)=L_POSTPONEMENT_DATE THEN -- To check if Last Period was the period when the assignment was first assessed as EJH
4729 IF (L_POSTPONEMENT_DATE IS NOT NULL ) AND L_POSTPONEMENT_TYPE = 'Eligible Job Holder Postponement' AND (L_POSTPONEMENT_DATE< GREATEST(G_PRP_START_DATE,L_DOB_TT,
4730 L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE))-1)THEN
4731 hr_utility.trace('One Day after the postponement end date , this PRP starts.');
4732 -- ELSE
4733 IF (L_DOB_TT BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) THEN
4734 L_ELIGIBLE_JH_DATE := GREATEST(L_DOB_TT,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE),nvl(FND_DATE.canonical_to_date(L_POSTPONEMENT_DATE)+1,to_date('0001-01-01','YYYY-MM-DD')));
4735 --L_ELIGIBLE_JH_DATE := GREATEST(L_DOB_TT,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE));
4736 ELSE
4737 L_ELIGIBLE_JH_DATE := GREATEST(G_PRP_START_DATE,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE),nvl(FND_DATE.canonical_to_date(L_POSTPONEMENT_DATE)+1,to_date('0001-01-01','YYYY-MM-DD')));
4738 --L_ELIGIBLE_JH_DATE := GREATEST(G_PRP_START_DATE,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE));
4739 END IF;
4740 END IF;
4741 END IF;
4742 IF (L_NOMINAL_FLAG ='N') THEN --Nominal Check
4743 ---------************************************************************************************
4744 --EJH POSTPONEMENT RULE
4745 --One Period Gap -- Atleast One Day Gap
4746 /*
4747 OPEN PREV_PER_DATE;
4748 FETCH PREV_PER_DATE INTO L_PREV_PER_START_DATE ;
4749 CLOSE PREV_PER_DATE;
4750 hr_utility.trace('CAREFUL!! Previous'||L_PREV_PER_START_DATE);
4751 hr_utility.trace('CAREFUL!! Postpo'||L_POSTPONEMENT_DATE);
4752 */
4753 -- IF (L_POSTPONEMENT_DATE IS NOT NULL ) AND (L_POSTPONEMENT_DATE< L_PREV_PER_START_DATE) THEN
4754 --Greatest() -- Needed in cases where EJH is retained from the previous run itself.
4755 hr_utility.trace('G_PRP_START_DATE:: '||G_PRP_START_DATE);
4756 hr_utility.trace('L_ELIGIBLE_JH_DATE:: '||L_ELIGIBLE_JH_DATE);
4757 hr_utility.trace('L_POSTPONEMENT_DATE:: '||L_POSTPONEMENT_DATE);
4758 IF (L_POSTPONEMENT_DATE IS NOT NULL ) AND (L_POSTPONEMENT_DATE< GREATEST(G_PRP_START_DATE,L_DOB_TT,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE),L_ELIGIBLE_JH_DATE)-1) THEN
4759 L_EJH_POSTP_FLAG := 'Y';
4760 hr_utility.trace('CAREFUL!! Worker Postp applied before One Day ');
4761 ELSIF L_POSTPONEMENT_DATE IS NULL THEN
4762 L_EJH_POSTP_FLAG := 'Y';
4763 hr_utility.trace('No Postponement present');
4764 END IF;
4765 --One Period gap -- Atleast One Day Gap
4766 IF (L_EJH_POSTP_FLAG = 'Y') THEN--One Month Check
4767 L_EJH_POSTP_FLAG := 'N';
4768 /*
4769 OPEN CHECK_POSTP_EJH (L_ELEMENT_ENTRY_ID);
4770 FETCH CHECK_POSTP_EJH INTO L_TEMP;
4771 IF CHECK_POSTP_EJH%NOTFOUND THEN-- Postponement Not Already Applied */
4772 IF(NVL(G_ELIGIBLE_POSTPONEMENT_RULE,'NONE')='NONE') THEN
4773 L_EJH_POSTP_FLAG := 'N';
4774 ELSIF (G_ELIGIBLE_POSTPONEMENT_RULE ='MAX_DEFER_PERIOD_START_DATE') AND (L_DOB_TT BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) THEN
4775 L_POSTPONEMENT_DATE := C_PAYROLL_MAX_DATE (GREATEST(L_DOB_TT,L_ELIGIBLE_JH_DATE,l_asg_start_date),G_ELIGIBLE_POSTPONEMENT_RULE);
4776 hr_utility.trace('Twenty Second birthday Inside'||L_DOB_TT );
4777 IF l_postponement_date >= g_prp_end_date THEN
4778 L_POSTPONEMENT_TYPE := 'Eligible Job Holder Postponement';
4779 L_EJH_POSTP_FLAG := 'Y';
4780 END IF;
4781 IF l_postponement_date < g_prp_end_date THEN
4782 L_POSTPONEMENT_TYPE := NULL;
4783 L_EJH_POSTP_FLAG := 'N';
4784 END IF;
4785 --L_POSTPONEMENT_TYPE := 'Eligible Job Holder Postponement';
4786 --L_EJH_POSTP_FLAG := 'Y';
4787 ELSE
4788 L_POSTPONEMENT_DATE := C_PAYROLL_MAX_DATE (GREATEST(G_PRP_START_DATE,L_ELIGIBLE_JH_DATE,l_asg_start_date),G_ELIGIBLE_POSTPONEMENT_RULE);
4789 IF l_postponement_date >= g_prp_end_date THEN
4790 L_POSTPONEMENT_TYPE := 'Eligible Job Holder Postponement';
4791 L_EJH_POSTP_FLAG := 'Y';
4792 --L_POSTPONEMENT_TYPE := 'Eligible Job Holder Postponement';
4793 --L_EJH_POSTP_FLAG := 'Y';
4794 END IF;
4795 IF l_postponement_date < g_prp_end_date THEN
4796 L_POSTPONEMENT_TYPE := NULL;
4797 L_EJH_POSTP_FLAG := 'N';
4798 END IF;
4799 END IF;/*
4800 ELSIF (G_ELIGIBLE_POSTPONEMENT_RULE ='MAX_DEFER_PERIOD_START_DATE') THEN
4801 -- L_POSTPONEMENT_DATE := ADD_MONTHS(G_PRP_START_DATE,3)-1;
4802 IF (L_DOB_TT BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) THEN
4803 L_POSTPONEMENT_DATE := C_PAYROLL_MAX_DATE (L_DOB_TT);
4804 hr_utility.trace('Twenty Second birthday Inside'||L_DOB_TT );
4805 ELSE
4806 L_POSTPONEMENT_DATE := C_PAYROLL_MAX_DATE (GREATEST(G_PRP_START_DATE,L_ELIGIBLE_JH_DATE));
4807 hr_utility.trace('Twenty Second birthday Outside'||L_DOB_TT );
4808 END IF;
4809 L_EJH_POSTP_FLAG := 'Y';
4810 L_POSTPONEMENT_TYPE :='Eligible Job Holder Postponement' ;
4811 ELSIF (G_ELIGIBLE_POSTPONEMENT_RULE ='NEXT_PAYROLL_PERIOD_START_DATE') THEN
4812 L_POSTPONEMENT_TYPE := 'Eligible Job Holder Postponement';
4813 L_POSTPONEMENT_DATE := G_PRP_END_DATE;
4814 L_EJH_POSTP_FLAG := 'Y';
4815 END IF;
4816 */
4817 hr_utility.trace('ELIGIBLE POSTPONEMENT END DATE '||L_POSTPONEMENT_DATE );
4818 /* END IF;-- Postponement Not Already Applied
4819 CLOSE CHECK_POSTP_EJH ; */
4820 END IF;--One Month Check
4821 --Check if it has been more than a period since Worker Postponement Ended
4822 --EJH POSTPONEMENT RULE
4823 ---------************************************************************************************
4824 END IF; --Nominal Check
4825 hr_utility.trace('NOMINAL FLAG::'||L_NOMINAL_FLAG);
4826 IF (L_NOMINAL_FLAG ='Y') THEN
4827 IF (L_DOB_TT BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) THEN
4828 L_NOMINAL_AUTO_ENROLL_DATE := GREATEST(L_DOB_TT,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE));
4829 ELSE
4830 L_NOMINAL_AUTO_ENROLL_DATE := GREATEST(G_PRP_START_DATE,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE));
4831 END IF;
4832 --Bug 14387977
4833 IF L_POSTPONEMENT_DATE IS NOT NULL THEN
4834 L_NOMINAL_AUTO_ENROLL_DATE := GREATEST(L_NOMINAL_AUTO_ENROLL_DATE,L_POSTPONEMENT_DATE+1);
4835 END IF;
4836 --Bug 14387977
4837 RAISE L_EXCEPTION_UPDATE;
4838 END IF;
4839 -- Check for Eligible Job Holder Postponement to be ADDED Here
4840 IF(L_EJH_POSTP_FLAG = 'N') AND (L_NOMINAL_FLAG ='N') THEN --EJH Postponement is not there
4841 IF (L_DOB_TT BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) THEN
4842 L_AUTO_ENROLLMENT_DATE := GREATEST(L_DOB_TT,l_asg_start_date,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE));
4843 ELSE
4844 L_AUTO_ENROLLMENT_DATE :=GREATEST(G_PRP_START_DATE,l_asg_start_date,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE));
4845 END IF;
4846 -- Bug 14387977
4847 IF L_POSTPONEMENT_DATE IS NOT NULL THEN
4848 L_AUTO_ENROLLMENT_DATE := GREATEST(L_AUTO_ENROLLMENT_DATE,L_POSTPONEMENT_DATE+1);
4849 END IF;
4850 -- Bug 14387977
4851 L_OPTOUT_END_DATE :=ADD_MONTHS(L_AUTO_ENROLLMENT_DATE,1)-1;
4852 L_QUALIFYING_SCHEME_EXISTS := 'Y';
4853 L_QUALIFYING_SCHEME_NAME :=L_DEFAULT_SCHEME_NAME;
4854 -- L_PENSION_ENTRY_START :=G_PAYROLL_START_DATE; -- Bug 14343133
4855 L_PENSION_ENTRY_END :=G_END_OF_TIME;
4856 hr_utility.trace('PENSION ELEMENT INSERTION LOGIC');
4857 hr_utility.trace('Assignment is an ELIGIBLE JOB HOLDER :');
4858 --ER
4859 IF G_DEF_FLAG='Y' THEN
4860 -- Only People Group Check
4861 hr_utility.trace('As No defautl Scheme has been Set, Considering the eligibility criteria');
4862 IF group_check(L_ASSIGNMENT_ID,L_ER_SCHEME_NAME) = 2 THEN
4863 hr_utility.trace('ER Criteria Not mutually exclusive for People Group');
4864 --RAISE_APPLICATION_ERROR(-20001,'This assignment is eligible for more than one Qualifying Scheme.');
4865 populate_run_msg(p_assactid,'This assignment is eligible for more than one Qualifying Scheme.');
4866 RAISE G_EXCEPTION_NO_UPDATE; -- Just Archive for Error Cases.
4867 ELSIF group_check(L_ASSIGNMENT_ID,L_ER_SCHEME_NAME) = 0 THEN --No Matching criteria
4868 hr_utility.trace('This Assignment is an Eligible Job Holder but not eligible for any of the Qualifying Schemes.');
4869 --RAISE_APPLICATION_ERROR(-20001,'This assignment is an eligible jobholder but not eligible for any of the Qualifying Schemes.');
4870 populate_run_msg(p_assactid,'This assignment is an eligible jobholder but not eligible for any of the Qualifying Schemes.');
4871 RAISE G_EXCEPTION_NO_UPDATE;-- Just Archive for Error Cases.
4872 ELSIF group_check(L_ASSIGNMENT_ID,L_ER_SCHEME_NAME) = 1 THEN
4873 hr_utility.trace('Group Criteria Met');
4874 hr_utility.trace('ER Scheme Name:: '||L_ER_SCHEME_NAME);
4875 L_QUALIFYING_SCHEME_NAME:=L_ER_SCHEME_NAME;
4876 IF (L_ER_SCHEME_NAME IS NOT NULL) THEN
4877 OPEN C_GET_PENSION_ELEMENTS(L_ER_SCHEME_NAME);
4878 FETCH C_GET_PENSION_ELEMENTS
4879 INTO L_DEFAULT_SCH_ELEMENT_NAME,
4880 L_EMPLOYER_COMPONENT;
4881 CLOSE C_GET_PENSION_ELEMENTS;
4882 END IF;
4883 -- Only People Group Check
4884 END IF;
4885 END IF;
4886 --ER
4887 hr_utility.trace('L_DEFAULT_SCHEME_NAME Value::'||L_DEFAULT_SCHEME_NAME);
4888 hr_utility.trace('L_DEFAULT_SCH_ELEMENT_NAME Value::'||L_DEFAULT_SCH_ELEMENT_NAME);
4889 hr_utility.trace('L_EMPLOYER_COMPONENT Value::'||L_EMPLOYER_COMPONENT);
4890
4891 ------------------------------------- bug 14380856 -------------------------------------------------
4892
4893 hr_utility.trace('L_QUALIFYING_SCHEME_NAME :'||L_QUALIFYING_SCHEME_NAME);
4894
4895 if l_postponement_date < g_prp_end_date and g_prp_start_date < l_postponement_date then
4896 l_custom_eff_date := GREATEST(l_postponement_date+1,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE));
4897 else
4898 l_custom_eff_date := GREATEST(L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE));
4899 end if;
4900
4901 open C_VALIDATE_CONFIG_VALUE('PAY_GB_ENROLMENT_CUSTOM_PROC',L_QUALIFYING_SCHEME_NAME);
4902 fetch C_VALIDATE_CONFIG_VALUE into l_custom_procedure;
4903 hr_utility.trace('l_custom_procedure :'||l_custom_procedure);
4904 if C_VALIDATE_CONFIG_VALUE%found and l_custom_procedure is not null then
4905 hr_utility.trace('Running Custom Procedure');
4906 hr_utility.trace('l_custom_eff_date : '||l_custom_eff_date);
4907 hr_utility.trace('l_assignment_id :'||l_assignment_id);
4908 begin
4909 SAVEPOINT custom_proc;
4910 l_stmt := 'BEGIN :status := '||l_custom_procedure||'( :pens_qual_scheme_name, :effective_start_date, :auto_enrollment_date, :assignment_id ); exception when others then :status := 0 ; END;' ;
4911 execute immediate l_stmt using in out l_status, l_qualifying_scheme_name, l_custom_eff_date, l_auto_enrollment_date, l_assignment_id;
4912 IF NOT (G_MODE='GB_VALIDATE_COMMIT') THEN
4913 ROLLBACK TO custom_proc;
4914 END IF;
4915 exception when others then
4916 hr_utility.trace('Error occured in execute immediate');
4917 l_status := 0;
4918 ROLLBACK TO custom_proc;
4919 end;
4920 end if;
4921 hr_utility.trace('l_status :'||l_status);
4922 if l_status = 0 then
4923 --error;
4924 hr_utility.trace('Error in custom procedure, hence skipping assignment');
4925 populate_run_msg(p_assactid,'Error in custom procedure, hence this assignment is being skipped.');
4926 elsif l_status = 2 then
4927
4928 IF(L_DEFAULT_SCH_ELEMENT_NAME IS NOT NULL) THEN
4929 --EMployee Element
4930 hr_utility.trace('EMPLOYEE ELEMENT INSERTION LOGIC');
4931 INSERT_PENSION_ELEMENT( V_EFF_START_DATE => L_AUTO_ENROLLMENT_DATE, V_EFF_END_DATE => L_PENSION_ENTRY_END, V_ELEMENT_ENTRY_ID => L_PENSION_ENTRY_ID , P_ASSIGNMENT_ID => L_ASSIGNMENT_ID,
4932 P_ELEMENT_TYPE_NAME=>L_DEFAULT_SCH_ELEMENT_NAME, P_AGGREGATION_FLAG=>L_AGGREGATION_FLAG,P_PERSON_ID=>L_PERSON_ID,P_ASSIGNMENT_ACTION_ID=>p_assactid );
4933 END IF;
4934 --Employer Element
4935 IF(L_EMPLOYER_COMPONENT IS NOT NULL) THEN
4936 hr_utility.trace('EMPLOYER ELEMENT INSERTION LOGIC');
4937 INSERT_PENSION_ELEMENT( V_EFF_START_DATE => L_AUTO_ENROLLMENT_DATE, V_EFF_END_DATE => L_PENSION_ENTRY_END, V_ELEMENT_ENTRY_ID => L_PENSION_ENTRY_ID , P_ASSIGNMENT_ID => L_ASSIGNMENT_ID,
4938 P_ELEMENT_TYPE_NAME=>L_EMPLOYER_COMPONENT, P_AGGREGATION_FLAG=>L_AGGREGATION_FLAG,P_PERSON_ID=>L_PERSON_ID,P_ASSIGNMENT_ACTION_ID=>p_assactid );
4939 ELSE
4940 hr_utility.trace('EMPLOYER ELEMENT INSERTION LOGIC - Employer Element is NULL');
4941 END IF;
4942
4943 end if;
4944
4945 update_ni_category_pension(L_ASSIGNMENT_ID,L_AUTO_ENROLLMENT_DATE,G_MODE);
4946 ----------------------------------------------------------------------------------------------
4947
4948 --Mid Period Enrolment
4949 IF (L_AUTO_ENROLLMENT_DATE > G_PRP_START_DATE AND L_AUTO_ENROLLMENT_DATE <=G_PRP_END_DATE) THEN
4950 populate_warn_msg(p_assactid,'The assignment has the Automatic Enrolment Date after the start date of the Pay Reference Period.');
4951 END IF;
4952 --Mid Period Enrolment
4953 END IF;--EJH Postponement is not there
4954 RAISE L_EXCEPTION_UPDATE;
4955 END IF;--Employee Classififcation
4956 end if;
4957 END IF;
4958 ---Assesment
4959 ------------------------------------------------------------------------------------------------------
4960 ELSIF (NVL(L_QUALIFYING_SCHEME_EXISTS,'N') ='Y') THEN --Scheme Already Exists
4961 IF (L_QUALIFYING_SCHEME_NAME IS NULL) THEN
4962 hr_utility.trace('Qualifying Scheme Exists is set to Yes, but Qualifying Scheme Name does not contain any value.');
4963 populate_run_msg(p_assactid,'Qualifying Scheme Exists is set to Yes, but Qualifying Scheme Name does not contain any value.');
4964 RAISE L_EXCEPTION;
4965 END IF;
4966 OPEN C_QUALIFYING_SCHEME_EXISTS (L_ASSIGNMENT_ID) ;
4967 FETCH C_QUALIFYING_SCHEME_EXISTS INTO L_QUALIFYING_SCHEME_NAME;
4968 IF C_QUALIFYING_SCHEME_EXISTS%NOTFOUND THEN
4969 hr_utility.trace('Assignment doesnot have a Qualifying Scheme attached, yet Qualifying Scheme Exists Flag is Set to Yes.');
4970 populate_run_msg(p_assactid,'Assignment does not have a Qualifying Scheme attached, yet Qualifying Scheme Exists flag is set to Yes.');
4971 RAISE L_EXCEPTION;
4972 END IF;
4973 CLOSE C_QUALIFYING_SCHEME_EXISTS;
4974 -- RAISE L_EXCEPTION_UPDATE; -- Remove Later as Nominal Date of Enrollment has to be reported
4975
4976
4977 hr_utility.trace('Assignment older classification to variable ');
4978 L_EMPLOYEE_PENSION_CLASS_OLD := L_EMPLOYEE_CLASS_FOR_PENSION;
4979 L_EARNINGS_OLD := L_EARNINGS ;
4980 hr_utility.trace('assessing employee again for change in status');
4981 L_EMPLOYEE_STATUS_FOR_PENSION := ASSESS_EMPLOYEE_PROCESS(L_PERSON_ID,L_ASSIGNMENT_ID,
4982 NVL(L_AGGREGATION_FLAG,'N'),L_EARNINGS,L_AGE,p_assactid);
4983 if (NVL(L_EMPLOYEE_STATUS_FOR_PENSION,'3')='3') THEN
4984 hr_utility.trace('Assignment is a Worker :');
4985 L_EMPLOYEE_CLASS_FOR_PENSION:='Worker';
4986 elsif (NVL(L_EMPLOYEE_STATUS_FOR_PENSION,'3')='2') THEN
4987 L_EMPLOYEE_CLASS_FOR_PENSION :='Non Eligible Job Holder';
4988 hr_utility.trace('Assignment is a NON ELIGIBLE JOB HOLDER :');
4989 ELSIF (NVL(L_EMPLOYEE_STATUS_FOR_PENSION,'3')='1') THEN
4990 L_EMPLOYEE_CLASS_FOR_PENSION :='Eligible Job Holder';
4991 end if;
4992 hr_utility.trace('Done assessing');
4993 if(L_EMPLOYEE_PENSION_CLASS_OLD <> L_EMPLOYEE_CLASS_FOR_PENSION) or (L_EARNINGS_OLD <> L_EARNINGS) then
4994 hr_utility.trace('Employee assessed again as there is a change in pensions classification/Earnings');
4995 if (NVL(L_EMPLOYEE_STATUS_FOR_PENSION,'3')='1') THEN
4996 IF NVL(L_ELIGIBLE_JH_DATE,G_END_OF_TIME) = G_END_OF_TIME THEN -- Never Found eligible
4997 IF (L_DOB_TT BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) THEN
4998 L_ELIGIBLE_JH_DATE := GREATEST(L_DOB_TT,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE),
4999 nvl(FND_DATE.canonical_to_date(L_POSTPONEMENT_DATE)+1,to_date('0001-01-01','YYYY-MM-DD')));
5000 ELSE
5001 L_ELIGIBLE_JH_DATE := GREATEST(G_PRP_START_DATE,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE),
5002 nvl(FND_DATE.canonical_to_date(L_POSTPONEMENT_DATE)+1,to_date('0001-01-01','YYYY-MM-DD')));
5003 END IF;
5004 END IF;
5005 -- Found Eligible previously
5006 IF NVL(L_ELIGIBLE_JH_DATE,G_END_OF_TIME) <> G_END_OF_TIME THEN
5007 IF (L_POSTPONEMENT_DATE IS NOT NULL ) AND L_POSTPONEMENT_TYPE = 'Eligible Job Holder Postponement' AND
5008 (L_POSTPONEMENT_DATE< GREATEST(G_PRP_START_DATE,L_DOB_TT,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE))-1)THEN
5009 hr_utility.trace('One Day after the postponement end date , this PRP starts.');
5010 IF (L_DOB_TT BETWEEN G_PRP_START_DATE AND G_PRP_END_DATE) THEN
5011 L_ELIGIBLE_JH_DATE := GREATEST(L_DOB_TT,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE),
5012 nvl(FND_DATE.canonical_to_date(L_POSTPONEMENT_DATE)+1,to_date('0001-01-01','YYYY-MM-DD')));
5013 ELSE
5014 L_ELIGIBLE_JH_DATE := GREATEST(G_PRP_START_DATE,L_SERVICE_START,FND_DATE.canonical_to_date(G_PENSION_STAGING_DATE),
5015 nvl(FND_DATE.canonical_to_date(L_POSTPONEMENT_DATE)+1,to_date('0001-01-01','YYYY-MM-DD')));
5016 END IF;
5017 END IF;
5018 end if;
5019 end if;
5020 RAISE L_EXCEPTION_UPDATE;
5021 else
5022 hr_utility.trace('Employee not assessed again as there is no change in pensions classification');
5023 RAISE L_EXCEPTION_NO_ERROR; -- Bug 14550021 -- Just Skip if the Q.S.Exists Flag is set to Yes.
5024 end if;
5025 END IF;--Scheme Already Exists
5026 -----------------------------------
5027 ELSE--Main Entry
5028 hr_utility.trace('Not a Main Entry');
5029 RAISE L_EXCEPTION_NO_ERROR;
5030 --Any Other Checks??
5031 END IF; --Main Entry
5032 ELSE --Postponement Check
5033 hr_utility.trace('Postponement End Date Check');
5034 RAISE L_EXCEPTION_NO_ERROR;
5035 --Any Other Checks??
5036 END IF;--Postponement Check
5037 -- ELSE --OPT Out date Crossed
5038 -- hr_utility.trace('OPT Out date Crossed');
5039 -- RAISE L_EXCEPTION_NO_ERROR;
5040 --Any Other Checks??
5041 -- NULL;
5042 -- END IF;--OPT Out date Crossed
5043 ELSE --A.E.D. Not Null
5044 hr_utility.trace('A.E.D. Not Null. Already Enrolled');
5045 RAISE L_EXCEPTION_NO_ERROR;
5046 --Any Other Checks??
5047 END IF; --A.E.D. Null
5048 EXCEPTION
5049 WHEN L_EXCEPTION_NO_ERROR THEN
5050 hr_utility.trace('INSIDE EXCEPTION: L_EXCEPTION_NO_ERROR');
5051 WHEN L_EXCEPTION_UPDATE_INFO THEN
5052 hr_utility.trace('INSIDE EXCEPTION: L_EXCEPTION_UPDATE_INFO');
5053 --Update Info Element
5054 IF (NVL(L_AGGREGATION_FLAG,'N')='N') THEN
5055 hr_utility.trace('Exception Update-- NON-AGGREGATED Case');
5056 --UPDATE_INFO_ELEMENT( L_ELEMENT_ENTRY_ID , G_ELEMENT_DETAILS.G_QUALIFYING_SCHEME_NAME_ID, L_QUALIFYING_SCHEME_NAME
5057 UPDATE_INFO_ELEMENT( L_ASSIGNMENT_ID , G_ELEMENT_DETAILS.G_QUALIFYING_SCHEME_NAME_ID, L_QUALIFYING_SCHEME_NAME , G_ELEMENT_DETAILS.G_AGG_EARNINGS_PENSIONS_ID, L_AGGREGATION_FLAG ,
5058 G_ELEMENT_DETAILS.G_AUTO_ENROLLMENT_DATE_ID, L_AUTO_ENROLLMENT_DATE , G_ELEMENT_DETAILS.G_QUALIFYING_PS_EXISTS_ID, L_QUALIFYING_SCHEME_EXISTS , G_ELEMENT_DETAILS.G_POSTPONEMENT_TYPE_ID,
5059 L_POSTPONEMENT_TYPE , G_ELEMENT_DETAILS.G_POSTPONEMENT_END_DATE_ID, L_POSTPONEMENT_DATE , G_ELEMENT_DETAILS.G_EMPLOYEE_CLASS_ID, L_EMPLOYEE_CLASS_FOR_PENSION , G_ELEMENT_DETAILS.G_OPT_IN_DATE_ID,
5060 L_OPTIN_DATE , G_ELEMENT_DETAILS.G_OPT_OUT_DATE_ID, L_OPTOUT_DATE , G_ELEMENT_DETAILS.G_MAIN_ENTRY_ID, L_MAIN_ENTRY , G_ELEMENT_DETAILS.G_TOTAL_EARNING_PRP_ID, L_EARNINGS ,
5061 G_ELEMENT_DETAILS.G_OPT_OUT_END_DATE_ID, L_OPTOUT_END_DATE , G_ELEMENT_DETAILS.G_ELIGIBLE_JH_DATE_ID , to_char (l_eligible_jh_date
5062 /*Bug 14622818*/
5063 ,fnd_date.name_in_mask) );
5064 END IF;
5065 --*****************************************************************************************
5066 --AGGREGATION
5067 IF (NVL(L_AGGREGATION_FLAG,'N')='Y') THEN
5068 hr_utility.trace('---------------------------------------------------------------------------------------------');
5069 hr_utility.trace('Exception Update-- AGGREGATED Case');
5070 -- CAll the Procedrure for Aggreagated Case
5071 AGGREGATED (L_PERSON_ID, L_QUALIFYING_SCHEME_NAME, L_AGGREGATION_FLAG, L_AUTO_ENROLLMENT_DATE, L_QUALIFYING_SCHEME_EXISTS, L_POSTPONEMENT_TYPE, L_POSTPONEMENT_DATE, L_EMPLOYEE_CLASS_FOR_PENSION, L_OPTIN_DATE,
5072 L_OPTOUT_DATE, L_MAIN_ENTRY, L_EARNINGS, L_OPTOUT_END_DATE, L_ELIGIBLE_JH_DATE );
5073 --L_AUTO_ENROLLMENT_DATE DATE,L_DEFAULT_SCHEME_NAME VARCHAR2);
5074 hr_utility.trace('---------------------------------------------------------------------------------------------');
5075 END IF;
5076 --AGGREGATION
5077 --*****************************************************************************************
5078 WHEN L_EXCEPTION_UPDATE THEN
5079 hr_utility.trace('INSIDE EXCEPTION: L_EXCEPTION_UPDATE');
5080 --*****************************************************-
5081 pay_action_information_api.create_action_information( p_action_information_id => l_action_id, p_object_version_number => l_ovn, p_action_information_category => 'GB_ENROLL_PENSIONS', p_action_context_id => p_assactid,
5082 p_action_context_type => 'AAP', p_assignment_id => L_ASSIGNMENT_ID, p_effective_date =>G_PRP_END_DATE, p_action_information1 =>L_QUALIFYING_SCHEME_NAME, p_action_information2 =>L_AGGREGATION_FLAG,
5083 p_action_information3 =>L_MAIN_ENTRY, p_action_information4 =>L_QUALIFYING_SCHEME_EXISTS, p_action_information5 =>L_POSTPONEMENT_TYPE, p_action_information6 =>FND_DATE.DATE_TO_CANONICAL(L_POSTPONEMENT_DATE),
5084 p_action_information7 =>L_EMPLOYEE_CLASS_FOR_PENSION, p_action_information8 =>FND_DATE.DATE_TO_CANONICAL(L_ELIGIBLE_JH_DATE), p_action_information9 =>FND_DATE.DATE_TO_CANONICAL(L_AUTO_ENROLLMENT_DATE),
5085 p_action_information10 =>FND_DATE.DATE_TO_CANONICAL(L_OPTOUT_END_DATE), p_action_information11 =>FND_DATE.DATE_TO_CANONICAL(L_OPTIN_DATE), p_action_information12 =>
5086 FND_DATE.DATE_TO_CANONICAL(L_OPTOUT_DATE), p_action_information13 =>L_EARNINGS, p_action_information14 =>L_FULL_NAME, p_action_information15 =>L_ASSIGNMENT_NUMBER,
5087 p_action_information16 =>FND_DATE.DATE_TO_CANONICAL(G_PRP_END_DATE), p_action_information17 =>FND_DATE.DATE_TO_CANONICAL(L_NOMINAL_AUTO_ENROLL_DATE), p_action_information18 =>floor(L_AGE) );
5088 --**************************************
5089 --Update Info Element
5090 IF (NVL(L_AGGREGATION_FLAG,'N')='N') THEN
5091 hr_utility.trace('Exception Update-- NON-AGGREGATED Case');
5092 --UPDATE_INFO_ELEMENT( L_ELEMENT_ENTRY_ID , G_ELEMENT_DETAILS.G_QUALIFYING_SCHEME_NAME_ID, L_QUALIFYING_SCHEME_NAME
5093 UPDATE_INFO_ELEMENT( L_ASSIGNMENT_ID , G_ELEMENT_DETAILS.G_QUALIFYING_SCHEME_NAME_ID, L_QUALIFYING_SCHEME_NAME , G_ELEMENT_DETAILS.G_AGG_EARNINGS_PENSIONS_ID, L_AGGREGATION_FLAG ,
5094 G_ELEMENT_DETAILS.G_AUTO_ENROLLMENT_DATE_ID, L_AUTO_ENROLLMENT_DATE , G_ELEMENT_DETAILS.G_QUALIFYING_PS_EXISTS_ID, L_QUALIFYING_SCHEME_EXISTS , G_ELEMENT_DETAILS.G_POSTPONEMENT_TYPE_ID,
5095 L_POSTPONEMENT_TYPE , G_ELEMENT_DETAILS.G_POSTPONEMENT_END_DATE_ID, L_POSTPONEMENT_DATE , G_ELEMENT_DETAILS.G_EMPLOYEE_CLASS_ID, L_EMPLOYEE_CLASS_FOR_PENSION , G_ELEMENT_DETAILS.G_OPT_IN_DATE_ID,
5096 L_OPTIN_DATE , G_ELEMENT_DETAILS.G_OPT_OUT_DATE_ID, L_OPTOUT_DATE , G_ELEMENT_DETAILS.G_MAIN_ENTRY_ID, L_MAIN_ENTRY , G_ELEMENT_DETAILS.G_TOTAL_EARNING_PRP_ID, L_EARNINGS ,
5097 G_ELEMENT_DETAILS.G_OPT_OUT_END_DATE_ID, L_OPTOUT_END_DATE , G_ELEMENT_DETAILS.G_ELIGIBLE_JH_DATE_ID , to_char (l_eligible_jh_date
5098 /*Bug 14622818*/
5099 ,fnd_date.name_in_mask) );
5100 END IF;
5101 --*****************************************************************************************
5102 --AGGREGATION
5103 IF (NVL(L_AGGREGATION_FLAG,'N')='Y') THEN
5104 hr_utility.trace('---------------------------------------------------------------------------------------------');
5105 hr_utility.trace('Exception Update-- AGGREGATED Case');
5106 -- CAll the Procedrure for Aggreagated Case
5107 AGGREGATED (L_PERSON_ID, L_QUALIFYING_SCHEME_NAME, L_AGGREGATION_FLAG, L_AUTO_ENROLLMENT_DATE, L_QUALIFYING_SCHEME_EXISTS, L_POSTPONEMENT_TYPE, L_POSTPONEMENT_DATE, L_EMPLOYEE_CLASS_FOR_PENSION, L_OPTIN_DATE,
5108 L_OPTOUT_DATE, L_MAIN_ENTRY, L_EARNINGS, L_OPTOUT_END_DATE, L_ELIGIBLE_JH_DATE );
5109 --L_AUTO_ENROLLMENT_DATE DATE,L_DEFAULT_SCHEME_NAME VARCHAR2);
5110 hr_utility.trace('---------------------------------------------------------------------------------------------');
5111 END IF;
5112 --AGGREGATION
5113 --*****************************************************************************************
5114 END ; -- Inner Section
5115 EXCEPTION -- Outer Section
5116 WHEN L_EXCEPTION THEN
5117 --RAISE_APPLICATION_ERROR(-20001,'Archive Failed for the assignment');
5118 hr_utility.trace('Archive Failed for the assignment');
5119 WHEN G_EXCEPTION_NO_UPDATE THEN
5120 hr_utility.trace('INSIDE EXCEPTION: G_EXCEPTION_NO_UPDATE');
5121 --*****************************************************-
5122 pay_action_information_api.create_action_information( p_action_information_id => l_action_id, p_object_version_number => l_ovn, p_action_information_category => 'GB_ENROLL_PENSIONS', p_action_context_id => p_assactid,
5123 p_action_context_type => 'AAP', p_assignment_id => L_ASSIGNMENT_ID, p_effective_date =>G_PRP_END_DATE, p_action_information1 =>L_QUALIFYING_SCHEME_NAME, p_action_information2 =>L_AGGREGATION_FLAG,
5124 p_action_information3 =>L_MAIN_ENTRY, p_action_information4 =>L_QUALIFYING_SCHEME_EXISTS, p_action_information5 =>L_POSTPONEMENT_TYPE, p_action_information6 =>FND_DATE.DATE_TO_CANONICAL(L_POSTPONEMENT_DATE),
5125 p_action_information7 =>L_EMPLOYEE_CLASS_FOR_PENSION, p_action_information8 =>FND_DATE.DATE_TO_CANONICAL(L_ELIGIBLE_JH_DATE), p_action_information9 =>FND_DATE.DATE_TO_CANONICAL(L_AUTO_ENROLLMENT_DATE),
5126 p_action_information10 =>FND_DATE.DATE_TO_CANONICAL(L_OPTOUT_END_DATE), p_action_information11 =>FND_DATE.DATE_TO_CANONICAL(L_OPTIN_DATE), p_action_information12 =>FND_DATE.DATE_TO_CANONICAL(L_OPTOUT_DATE),
5127 p_action_information13 =>L_EARNINGS, p_action_information14 =>L_FULL_NAME, p_action_information15 =>L_ASSIGNMENT_NUMBER, p_action_information16 =>FND_DATE.DATE_TO_CANONICAL(G_PRP_END_DATE),
5128 p_action_information17 =>FND_DATE.DATE_TO_CANONICAL(L_NOMINAL_AUTO_ENROLL_DATE), p_action_information18 =>floor (l_age) );
5129 --**************************************
5130 /*
5131 OPEN C_ERROR_MSG;
5132 FETCH C_ERROR_MSG INTO L_ERR_MSG;
5133 CLOSE C_ERROR_MSG;
5134 RAISE_APPLICATION_ERROR(-20001,L_ERR_MSG);
5135 */
5136 WHEN OTHERS THEN
5137 populate_run_msg(p_assactid,sqlerrm);
5138 raise;
5139 END archive_code;
5140 ---ONE TIME EXECUTION
5141 END PAY_GB_ENROLL_PENSION;