[Home] [Help]
PACKAGE BODY: APPS.PAY_PYEPFREQ_PKG
Source
1 PACKAGE BODY pay_pyepfreq_pkg AS
2 /* $Header: pyepf01t.pkb 120.2 2005/06/15 06:36:21 susivasu noship $ */
3 --
4 PROCEDURE hr_ele_pay_freq_rules (
5 p_context IN VARCHAR2,
6 p_eletype_id IN NUMBER,
7 p_payroll_id IN NUMBER,
8 p_period_type IN VARCHAR2,
9 p_bg_id IN NUMBER,
10 p_period_1 IN OUT NOCOPY VARCHAR2,
11 p_period_2 IN OUT NOCOPY VARCHAR2,
12 p_period_3 IN OUT NOCOPY VARCHAR2,
13 p_period_4 IN OUT NOCOPY VARCHAR2,
14 p_period_5 IN OUT NOCOPY VARCHAR2,
15 p_period_6 IN OUT NOCOPY VARCHAR2,
16 p_eff_date IN DATE DEFAULT NULL,
17 p_rule_date_code IN VARCHAR2 DEFAULT NULL,
18 p_leg_code IN VARCHAR2 DEFAULT NULL) IS
19 -- local constants
20 c_months_per_fiscal_yr NUMBER(3) := 12;
21 c_max_freq_periods NUMBER(3) := 5;
22 -- local vars
23 v_ele_pay_freq_rule_id NUMBER(9);
24 v_freq_rule_period_id NUMBER(9);
25 v_freq_rule_start_date DATE := TO_DATE('01-01-1900', 'DD-MM-YYYY');
26 v_reset_periods NUMBER(3) := 1;
27 v_reset_period_type VARCHAR2(30);
28 v_number_per_fy NUMBER(3);
29 v_eff_start_date DATE;
30 --
31 -- Local procedure
32 --
33 PROCEDURE ins_freq_rule_period(
34 p_ele_freqrule_id IN NUMBER,
35 p_period_no_in_reset_period IN NUMBER,
36 p_bus_grp_id IN NUMBER,
37 p_eff_start_date IN DATE) IS
38 -- local proc local vars
39 v_freq_rule_pd_id NUMBER(9);
40
41 BEGIN
42 --
43 SELECT pay_freq_rule_periods_s.nextval
44 INTO v_freq_rule_pd_id
45 FROM sys.dual;
46 --
47 INSERT INTO pay_freq_rule_periods (
48 freq_rule_period_id,
49 ele_payroll_freq_rule_id,
50 business_group_id,
51 period_no_in_reset_period,
52 creation_date,
53 created_by,
54 last_update_date,
55 last_updated_by,
56 last_update_login)
57 VALUES (
58 v_freq_rule_pd_id,
59 p_ele_freqrule_id,
60 p_bus_grp_id,
61 p_period_no_in_reset_period,
62 p_eff_start_date,
63 -1,
64 NULL,
65 NULL,
66 NULL);
67 --
68 END ins_freq_rule_period;
69 --
70 -- Local Function
71 --
72 FUNCTION chk_freq_rule_exists ( p_ele_id IN NUMBER,
73 p_pay_id IN NUMBER,
74 p_bus_grp_id IN NUMBER,
75 p_period_num IN NUMBER)
76 RETURN VARCHAR2 IS
77 -- local fn vars
78 v_freq_rule_exists VARCHAR2(1);
79 --
80 BEGIN
81 --
82 v_freq_rule_exists := 'N';
83 begin
84 --
85 SELECT 'Y'
86 INTO v_freq_rule_exists
87 FROM pay_ele_payroll_freq_rules EPF,
88 pay_freq_rule_periods FRP
89 WHERE FRP.period_no_in_reset_period = p_period_num
90 AND FRP.ele_payroll_freq_rule_id = EPF.ele_payroll_freq_rule_id
91 AND EPF.business_group_id + 0 = p_bus_grp_id
92 AND EPF.payroll_id = p_pay_id
93 AND EPF.element_type_id = p_ele_id;
94 --
95 RETURN v_freq_rule_exists;
96 --
97 exception
98 WHEN NO_DATA_FOUND THEN
99 RETURN v_freq_rule_exists;
100 end;
101 --
102 END chk_freq_rule_exists;
103 --
104 BEGIN -- main procedure, hr_ele_freq_rules
105 --
106 IF UPPER(p_context) = 'ON-UPDATE' THEN
107 v_eff_start_date := nvl(p_eff_date, sysdate);
108 --
109 -- Clear the cache.
110 --
111 remove_freq_rule_period(p_ele_type_id => p_eletype_id
112 ,p_payroll_id => p_payroll_id);
113 --
114 --
115 -- Delete existing frequency rules:
116 --
117 begin
118
119 hr_utility.set_location('pay_pyepfreq_pkg', 10);
120
121 SELECT ele_payroll_freq_rule_id
122 INTO v_ele_pay_freq_rule_id
123 FROM pay_ele_payroll_freq_rules
124 WHERE element_type_id = p_eletype_id
125 AND payroll_id = p_payroll_id
126 AND business_group_id + 0 = p_bg_id;
127 --
128 hr_utility.set_location('pay_pyepfreq_pkg', 20);
129 DELETE FROM pay_ele_payroll_freq_rules
130 WHERE ele_payroll_freq_rule_id = v_ele_pay_freq_rule_id;
131 --
132 hr_utility.set_location('pay_pyepfreq_pkg', 30);
133 DELETE FROM pay_freq_rule_periods
134 WHERE ele_payroll_freq_rule_id = v_ele_pay_freq_rule_id;
135 --
136 -- If either of the above fail, then it's ok, we're just cleaning up
137 -- before insertion of "new" rule.
138 --
139 exception
140 WHEN NO_DATA_FOUND THEN NULL;
141 end;
142 --
143 -- Insert new frequency rules:
144 --
145 -- set reset period type: if pay period is <= Month, then reset period = Month;
146 -- if pay pd > Month then reset period = Year;
147 -- Note, if pay pd = Month, then freq rules defined by Deductions form do not
148 -- really make sense; would need a new interface to define a deduction freq
149 -- of, say, every other month or every third month.
150 --
151 begin
152
153 hr_utility.set_location('pay_pyepfreq_pkg', 40);
154 SELECT number_per_fiscal_year
155 INTO v_number_per_fy
156 FROM per_time_period_types
157 WHERE period_type = p_period_type;
158 --
159 IF v_number_per_fy >= c_months_per_fiscal_yr THEN
160 v_reset_period_type := 'Calendar Month';
161 ELSE
162 v_reset_period_type := 'Year';
163 END IF;
164 --
165 exception
166 WHEN NO_DATA_FOUND THEN
167 hr_utility.set_message('PAY', 'HR_COULD_NOT_FIND_PERIOD_TYPE');
168 hr_utility.raise_error;
169 end;
170 --
171 -- Now, insertion:
172 --
173 if (UPPER(p_period_1) = 'Y' or
174 UPPER(p_period_2) = 'Y' or
175 UPPER(p_period_3) = 'Y' or
176 UPPER(p_period_4) = 'Y' or
177 UPPER(p_period_5) = 'Y' )
178 then
179 hr_utility.set_location('pay_pyepfreq_pkg', 50);
180 SELECT pay_ele_payroll_freq_rules_s.nextval
181 INTO v_ele_pay_freq_rule_id
182 FROM sys.dual;
183 --
184 hr_utility.set_location('pay_pyepfreq_pkg', 60);
185 INSERT INTO pay_ele_payroll_freq_rules (
186 ele_payroll_freq_rule_id,
187 element_type_id,
188 payroll_id,
189 business_group_id,
190 start_date,
191 reset_no_of_periods,
192 reset_period_type,
193 rule_date_code,
194 creation_date,
195 created_by,
196 last_update_date,
197 last_updated_by,
198 last_update_login)
199 VALUES (
200 v_ele_pay_freq_rule_id,
201 p_eletype_id,
202 p_payroll_id,
203 p_bg_id,
204 v_freq_rule_start_date,
205 v_reset_periods,
206 v_reset_period_type,
207 p_rule_date_code,
208 v_eff_start_date,
209 -1,
210 NULL,
211 NULL,
212 NULL
213 );
214 end if;
215 --
216 -- insert freq rule period where period_n = 'Y'
217 --
218 IF UPPER(p_period_1) = 'Y' THEN
219 hr_utility.set_location('pay_pyepfreq_pkg', 70);
220 ins_freq_rule_period( v_ele_pay_freq_rule_id,
221 1,
222 p_bg_id,
223 v_eff_start_date);
224 END IF;
225 IF UPPER(p_period_2) = 'Y' THEN
226 hr_utility.set_location('pay_pyepfreq_pkg', 80);
227 ins_freq_rule_period( v_ele_pay_freq_rule_id,
228 2,
229 p_bg_id,
230 v_eff_start_date);
231 END IF;
232 IF UPPER(p_period_3) = 'Y' THEN
233 hr_utility.set_location('pay_pyepfreq_pkg', 90);
234 ins_freq_rule_period( v_ele_pay_freq_rule_id,
235 3,
236 p_bg_id,
237 v_eff_start_date);
238 END IF;
239 IF UPPER(p_period_4) = 'Y' THEN
240 hr_utility.set_location('pay_pyepfreq_pkg', 100);
241 ins_freq_rule_period( v_ele_pay_freq_rule_id,
242 4,
243 p_bg_id,
244 v_eff_start_date);
245 END IF;
246 IF UPPER(p_period_5) = 'Y' THEN
247 hr_utility.set_location('pay_pyepfreq_pkg', 110);
248 ins_freq_rule_period( v_ele_pay_freq_rule_id,
249 5,
250 p_bg_id,
251 v_eff_start_date);
252 END IF;
253 IF UPPER(p_period_6) = 'Y' THEN
254 hr_utility.set_location('pay_pyepfreq_pkg', 120);
255 ins_freq_rule_period( v_ele_pay_freq_rule_id,
256 6,
257 p_bg_id,
258 v_eff_start_date);
259 END IF;
260
261 --
262 ELSIF upper(p_context) = 'POST-QUERY' THEN
263 -- We need to populate the 5 period params and pass them back.
264 p_period_1 := get_freq_rule_period( p_eletype_id,
265 p_payroll_id,
266 p_bg_id,
267 1);
268
269 p_period_2 := get_freq_rule_period( p_eletype_id,
270 p_payroll_id,
271 p_bg_id,
272 2);
273
274 p_period_3 := get_freq_rule_period( p_eletype_id,
275 p_payroll_id,
276 p_bg_id,
277 3);
278
279 p_period_4 := get_freq_rule_period( p_eletype_id,
280 p_payroll_id,
281 p_bg_id,
282 4);
283
284 p_period_5 := get_freq_rule_period( p_eletype_id,
285 p_payroll_id,
286 p_bg_id,
287 5);
288
289 p_period_6 := get_freq_rule_period( p_eletype_id,
290 p_payroll_id,
291 p_bg_id,
292 6);
293
294 --
295 END IF; -- context
296 --
297 END hr_ele_pay_freq_rules;
298 --
299
300 /*
301 Name : get_freq_rule_period
302 Purpose : This function will populate the frequency rule data for all
303 periods in the first call and stores in plsql table.
304 Arguments : p_ele_type_id, p_payroll_id, p_bus_grp_id, p_period_num.
305 Notes :
306 */
307
308 FUNCTION get_freq_rule_period( p_ele_type_id IN NUMBER,
309 p_payroll_id IN NUMBER,
310 p_bus_grp_id IN NUMBER,
311 p_period_num IN NUMBER)
312 RETURN VARCHAR2 IS
313
314 ln_rec_index NUMBER;
315
316 -- local procedure
317 FUNCTION populate_freq_rule_table(p_element_type_id NUMBER,
318 p_payroll_id NUMBER,
319 p_bg_id NUMBER)
320 RETURN NUMBER IS
321
322 CURSOR c_get_freq_rule_period(cp_ele_type_id number,
323 cp_payroll_id number,
324 cp_bg_id number,
325 cp_period_num number)
326 IS
327 SELECT 'Y', EPF.rule_date_code
328 FROM pay_ele_payroll_freq_rules EPF,
329 pay_freq_rule_periods FRP
330 WHERE FRP.period_no_in_reset_period = cp_period_num
331 AND FRP.ele_payroll_freq_rule_id = EPF.ele_payroll_freq_rule_id
332 AND EPF.business_group_id + 0 = cp_bg_id
333 AND EPF.payroll_id = cp_payroll_id
334 AND EPF.element_type_id = cp_ele_type_id;
335
336 -- local populate_freq_rule_table procedure vars
337
338 lv_freq_rule_exists VARCHAR2(1);
339 lv_rule_date_code VARCHAR2(1);
340 ln_index2 number;
341 lv_record_found VARCHAR2(1);
342
343 -- start of populate_freq_rule_table procedure
344 BEGIN
345 lv_record_found := 'N';
346 hr_utility.trace('start of populate_freq_rule_table ');
347 hr_utility.trace('table rec ln_index2 = '||to_char(ln_index2));
348 hr_utility.trace('element_type_id = '||to_char(p_element_type_id));
349 hr_utility.trace('payroll_id = '||to_char(p_payroll_id));
350 hr_utility.trace('business_group_id = '||to_char(p_bg_id));
351
352 if pay_pyepfreq_pkg.g_freq_rule_table.count > 0 then
353 hr_utility.trace('g_freq_rule_table.count > 0 satisfied ');
354 for i in g_freq_rule_table.first..g_freq_rule_table.last
355 loop
356 hr_utility.trace('record i = '||to_char(i));
357 if g_freq_rule_table(i).element_type_id = p_ele_type_id and
358 g_freq_rule_table(i).payroll_id = p_payroll_id then
359
360 hr_utility.trace('record found in g_freq_rule_table ');
361 lv_record_found := 'Y';
362 ln_index2 := i;
363 exit;
364
365 end if;
366
367 end loop; -- g_freq_rule_table.first..g_freq_rule_table.last
368 end if; --pay_pyepfreq_pkg.g_freq_rule_table.count > 0
369
370 if lv_record_found = 'N' then
371 ln_index2 := pay_pyepfreq_pkg.g_freq_rule_table.count;
372 pay_pyepfreq_pkg.g_freq_rule_table(ln_index2).element_type_id :=
373 p_element_type_id;
374 pay_pyepfreq_pkg.g_freq_rule_table(ln_index2).payroll_id :=
375 p_payroll_id;
376 pay_pyepfreq_pkg.g_freq_rule_table(ln_index2).business_group_id :=
377 p_bg_id;
378
379 for i in 1..6 loop
380 lv_freq_rule_exists := null;
381 hr_utility.trace('for loop to get all period values i = '||
382 to_char(i));
383 open c_get_freq_rule_period(p_element_type_id, p_payroll_id,
384 p_bg_id, i);
385 fetch c_get_freq_rule_period into lv_freq_rule_exists,
386 lv_rule_date_code;
387 close c_get_freq_rule_period;
388
389 hr_utility.trace('period i value = '||lv_freq_rule_exists);
390 if lv_freq_rule_exists is null then
391 hr_utility.trace('period i values is null satisfied ');
392 lv_freq_rule_exists := 'N';
393 end if;
394
395 if i = 1 then
396 hr_utility.trace('period 1 = '||lv_freq_rule_exists);
397 pay_pyepfreq_pkg.g_freq_rule_table(ln_index2).period_1 :=
398 lv_freq_rule_exists;
399 pay_pyepfreq_pkg.g_freq_rule_table(ln_index2).rule_date_code :=
400 lv_rule_date_code;
401 elsif i = 2 then
402 hr_utility.trace('period 2 = '||lv_freq_rule_exists);
403 pay_pyepfreq_pkg.g_freq_rule_table(ln_index2).period_2 :=
404 lv_freq_rule_exists;
405 elsif i = 3 then
406 hr_utility.trace('period 3 = '||lv_freq_rule_exists);
407 pay_pyepfreq_pkg.g_freq_rule_table(ln_index2).period_3 :=
408 lv_freq_rule_exists;
409 elsif i = 4 then
410 hr_utility.trace('period 4 = '||lv_freq_rule_exists);
411 pay_pyepfreq_pkg.g_freq_rule_table(ln_index2).period_4 :=
412 lv_freq_rule_exists;
413 elsif i = 5 then
414 hr_utility.trace('period 5 = '||lv_freq_rule_exists);
415 pay_pyepfreq_pkg.g_freq_rule_table(ln_index2).period_5 :=
416 lv_freq_rule_exists;
417 elsif i = 6 then
418 hr_utility.trace('period 6 = '||lv_freq_rule_exists);
419 pay_pyepfreq_pkg.g_freq_rule_table(ln_index2).period_6 :=
420 lv_freq_rule_exists;
421 end if;
422
423 end loop;
424 hr_utility.trace('End of populate_freq_rule_table function');
425
426 end if; -- lv_record_found = 'N'
427
428 return ln_index2;
429 END populate_freq_rule_table;
430 -- end of populate_freq_rule_table procedure
431
432 -- start of get_freq_rule_period function
433 BEGIN
434 hr_utility.trace('Start of get_freq_rule_period function');
435 hr_utility.trace('Element type id: '||to_char(p_ele_type_id));
436 hr_utility.trace('Payroll id: '||to_char(p_payroll_id));
437 hr_utility.trace('Business Group id: '||to_char(p_bus_grp_id));
438 hr_utility.trace('Period Number: '||to_char(p_period_num));
439
440 ln_rec_index := populate_freq_rule_table(p_ele_type_id,
441 p_payroll_id,
442 p_bus_grp_id);
443 if p_period_num = 1 then
444 return g_freq_rule_table(ln_rec_index).period_1;
445 elsif p_period_num = 2 then
446 return g_freq_rule_table(ln_rec_index).period_2;
447 elsif p_period_num = 3 then
448 return g_freq_rule_table(ln_rec_index).period_3;
449 elsif p_period_num = 4 then
450 return g_freq_rule_table(ln_rec_index).period_4;
451 elsif p_period_num = 5 then
452 return g_freq_rule_table(ln_rec_index).period_5;
456 return g_freq_rule_table(ln_rec_index).rule_date_code;
453 elsif p_period_num = 6 then
454 return g_freq_rule_table(ln_rec_index).period_6;
455 elsif p_period_num = 0 then
457 end if;
458
459 hr_utility.trace('End of get_freq_rule_period function');
460
461 END get_freq_rule_period;
462 --
463 PROCEDURE remove_freq_rule_period(p_ele_type_id IN NUMBER,
464 p_payroll_id IN NUMBER) is
465
466 begin
467 if pay_pyepfreq_pkg.g_freq_rule_table.count > 0 then
468 for i in g_freq_rule_table.first..g_freq_rule_table.last
469 loop
470 if (g_freq_rule_table(i).element_type_id = p_ele_type_id
471 and g_freq_rule_table(i).payroll_id = p_payroll_id) then
472 --
473 g_freq_rule_table(i).element_type_id := NULL;
474 g_freq_rule_table(i).payroll_id := NULL;
475 exit;
476 --
477 end if;
478 end loop;
479 end if;
480 end remove_freq_rule_period;
481 --
482
483 /*
484 Name : initialise_freqrule_table
485 Purpose : This procedure will delete the plsql tables used for
486 frequency rule data.
487 Arguments :
488 Notes :
489 */
490
491 procedure initialise_freqrule_table is
492
493 BEGIN
494
495 hr_utility.trace('deleting g_freq_rule_table plsql table');
496
497 pay_pyepfreq_pkg.g_freq_rule_table.delete;
498
499 END initialise_freqrule_table;
500
501 END pay_pyepfreq_pkg;