1 PACKAGE body per_in_perquisite_pkg as
2 /* $Header: peinperq.pkb 120.7.12010000.6 2008/08/06 09:14:47 ubhat ship $ */
3
4 --
5 -- Globals
6 --
7 g_package constant VARCHAR2(100) := 'per_in_perquisite_pkg.' ;
8 g_debug BOOLEAN ;
9
10
11
12 PROCEDURE check_element_entry(p_effective_date IN DATE
13 ,p_element_entry_id IN NUMBER
14 ,p_effective_start_date IN DATE
15 ,p_effective_end_date IN DATE
16 ,p_calling_procedure IN VARCHAR2
17 ,p_message_name OUT NOCOPY VARCHAR2
18 ,p_token_name OUT NOCOPY pay_in_utils.char_tab_type
19 ,p_token_value OUT NOCOPY pay_in_utils.char_tab_type
20 ) IS
21 /* Cursor to find the element name of the current element entry */
22
23 CURSOR c_perquisite_name IS
24 SELECT pet.element_information1
25 ,pet.element_type_id
26 ,pee.assignment_id
27 FROM pay_element_types_f pet
28 ,pay_element_entries_f pee
29 WHERE pet.element_type_id =pee.element_type_id
30 AND pee.element_entry_id =p_element_entry_id
31 AND p_effective_date BETWEEN pet.effective_start_date AND pet.effective_end_date
32 AND p_effective_date BETWEEN pee.effective_start_date AND pee.effective_end_date;
33
34
35 /* Cursor to find the Screen entry value and entry value id for the current entry on effective date and given an input value */
36 CURSOR c_curr_entry_value (p_element_entry_id NUMBER
37 ,p_input_name VARCHAR2
38 ,p_element_type_id NUMBER)
39 IS
40 SELECT peev.screen_entry_value,
41 peev.element_entry_value_id
42 FROM pay_element_entry_values_f peev
43 ,pay_input_values_f piv
44 WHERE peev.element_entry_id = p_element_entry_id
45 AND piv.name = p_input_name
46 AND peev.input_value_id = piv.input_value_id
47 AND piv.element_Type_id = p_element_type_id
48 AND p_effective_date BETWEEN peev.effective_start_date
49 AND peev.effective_end_date
50 AND p_effective_Date BETWEEN piv.effective_start_date
51 AND piv.effective_end_date;
52
53
54 /* Cursor to find the the global value as on effective date */
55 CURSOR c_global_value(l_global_name VARCHAR2) IS
56 SELECT global_value
57 from ff_globals_f ffg
58 WHERE ffg.global_name = l_global_name
59 AND p_effective_date BETWEEN ffg.effective_start_date AND ffg.effective_end_date;
60
61 /* Cursor to find input value id given the element and input value name*/
62 CURSOR c_input_value_id(p_element_type_id NUMBER
63 ,p_input_name VARCHAR2)
64 IS
65 SELECT piv.input_value_id
66 FROM pay_input_values_f piv
67 WHERE piv.element_type_id = p_element_type_id
68 AND piv.NAME = p_input_name
69 AND p_effective_date BETWEEN piv.effective_start_date AND piv.effective_end_date;
70
71
72 /* Cursor to find the number of entries with entry value as 'Motor Car' and that overlap
73 in 'Motor Car' Perquisite */
74 CURSOR c_element_entries( p_element_type_id NUMBER
75 ,p_assignment_id NUMBER
76 ,p_input_value_id NUMBER -- type of automotive
77 ,p_input_value_id_start NUMBER -- benefit start
78 ,p_input_value_id_end NUMBER -- benefit end
79 ,l_benefit_start_date DATE
80 ,l_benefit_end_date DATE)
81 IS
82 SELECT pee.element_entry_id
83 ,pee.effective_start_date
84 FROM pay_element_entries_f pee
85 ,pay_element_entry_values_f peev1
86 ,pay_element_entry_values_f peev2
87 ,pay_element_entry_values_f peev3
88 WHERE pee.assignment_id = p_assignment_id
89 AND pee.element_type_id = p_element_type_id
90 and pee.element_entry_id =peev1.element_entry_id
91 AND peev1.input_value_id = p_input_value_id
92 and peev1.screen_entry_value ='CAR'
93 and pee.element_entry_id =peev2.element_entry_id
94 AND peev2.input_value_id = p_input_value_id_start
95 and pee.element_entry_id =peev3.element_entry_id
96 AND peev3.input_value_id = p_input_value_id_end
97 AND fnd_date.canonical_to_date(peev2.screen_entry_value) <= nvl(l_benefit_end_date,to_date('31-12-4712','DD-MM-YYYY'))
98 AND nvl(fnd_date.canonical_to_date(peev3.screen_entry_value),to_date('31-12-4712','DD-MM-YYYY')) >= l_benefit_start_date
99 AND pee.element_entry_id <> p_element_entry_id -- Bugfix 4049484
100 AND p_effective_date BETWEEN pee.effective_start_date and pee.effective_end_date
101 AND p_effective_date BETWEEN peev1.effective_start_date and peev1.effective_end_date
102 AND p_effective_date BETWEEN peev2.effective_start_date and peev2.effective_end_date
103 AND p_effective_date BETWEEN peev3.effective_start_date and peev3.effective_end_date;
104
105
106 /* Cursor to find the Screen entry value for the given entry on given date and given an input value id */
107 CURSOR c_element_entry_values(p_el_entry_id NUMBER
108 ,p_inp_value_id NUMBER
109 ,p_eff_start_date DATE) IS
110 SELECT peev.screen_entry_value
111 FROM pay_element_entry_values_f peev
112 WHERE peev.element_entry_id = p_el_entry_id
113 AND peev.input_value_id = p_inp_value_id
114 AND p_eff_start_date BETWEEN peev.effective_start_date AND peev.effective_end_date;
115
116 CURSOR c_element_entry_details(p_element_entry_id NUMBER)
117 IS
118 SELECT pee.effective_start_date
119 ,pet.element_type_id
120 ,pee.assignment_id
121 FROM pay_element_entries_f pee
122 ,pay_element_types_f pet
123 ,pay_element_links_f links
124 WHERE pee.element_entry_id = p_element_entry_id
125 AND pet.element_type_id = links.element_type_id
126 AND links.element_link_id = pee.element_link_id
127 AND p_effective_date BETWEEN pet.effective_start_date AND pet.effective_end_date
128 AND p_effective_date BETWEEN pee.effective_start_date AND pee.effective_end_date;
129
130 l_get_migrator_status VARCHAR2(1);
131 l_procedure VARCHAR2(100);
132
133 l_dep_value1 pay_element_entry_values_f.screen_entry_value%TYPE;
134 l_dep_value2 pay_element_entry_values_f.screen_entry_value%TYPE;
135
136 TYPE tab_input_value_id IS TABLE OF pay_input_values_f.input_value_id%TYPE INDEX BY BINARY_INTEGER;
137 l_input_value_id tab_input_value_id;
138
139 TYPE tab_element_entry_value IS TABLE OF pay_element_entry_values_f.screen_entry_value%TYPE INDEX BY BINARY_INTEGER;
140 l_element_entry_value tab_element_entry_value;
141
142 TYPE tab_element_entry_id IS TABLE OF pay_element_entries_f.element_entry_id%TYPE INDEX BY BINARY_INTEGER;
143 l_element_entry_id tab_element_entry_id;
144
145 TYPE tab_element_type_id IS TABLE OF pay_element_types_f.element_type_id%TYPE INDEX BY BINARY_INTEGER;
146 l_element_type_id_tab tab_element_type_id;
147
148 l_entry_value_id NUMBER;
149 i NUMBER ;
150 l_exempted NUMBER;
151 l_element_name pay_element_types_f.element_name %TYPE;
152 l_element_type_id NUMBER;
153 l_assignment_id NUMBER;
154
155
156 p_input_value_id NUMBER;
157 l_gbl_value NUMBER;
158 l_entry_id NUMBER;
159
160 l_element_start_date DATE;
161 l_inputvalue_id NUMBER;
162 --
163 -- Start of private procedures
164 --
165 ---------------------------------------------------------------------------
166 -- --
167 -- Name : CHECK_BENEFIT_DATES --
168 -- Type : Procedure --
169 -- Access : Private --
170 -- Description : Procedure is the driver procedure for the validation--
171 -- of Benefit Dates of a Perquisite. --
172 -- This procedure is the hook procedure for the --
173 -- when an element entry is created --
174 -- Parameters : --
175 -- IN : l_element_entry_id IN number --
176
177 ---------------------------------------------------------------------------
178
179 PROCEDURE check_benefit_dates(l_element_entry_id number)
180 IS
181 l_benefit_start_date pay_element_entry_values_f.screen_entry_value%TYPE;
182 l_benefit_end_date pay_element_entry_values_f.screen_entry_value%TYPE;
183 l_procedure VARCHAR2(100);
184 BEGIN
185
186 g_debug := hr_utility.debug_enabled ;
187 l_procedure := g_package || 'check_benefit_dates' ;
188 pay_in_utils.set_location(g_debug,'Entering: '||l_procedure,10);
189
190 if g_debug then
191 pay_in_utils.trace('******************************','********************');
192 pay_in_utils.trace('l_element_entry_id : ',l_element_entry_id);
193 pay_in_utils.trace('******************************','********************');
194 end if;
195
196 p_message_name := 'SUCCESS';
197 pay_in_utils.null_message(p_token_name, p_token_value);
198
199 l_get_migrator_status:=hr_general.g_data_migrator_mode;
200 hr_general.g_data_migrator_mode:='Y';
201 pay_in_utils.set_location(g_debug,l_procedure,20);
202
203 /* Default the benefit Start date to element Entry Start Date */
204 OPEN c_curr_entry_value(p_element_entry_id,'Benefit Start Date',l_element_type_id);
205 FETCH c_curr_entry_value into l_benefit_start_date,l_entry_value_id;
206 if g_debug then
207 pay_in_utils.trace('l_benefit_start_date : ',l_benefit_start_date);
208 pay_in_utils.trace('l_entry_value_id : ',l_entry_value_id);
209 end if;
210 IF l_benefit_start_date IS NULL THEN
211 pay_in_utils.set_location(g_debug,l_procedure,30);
212 UPDATE pay_element_entry_values_f
213 SET screen_entry_value = to_char(p_effective_start_date,'YYYY/MM/DD HH24:MI:SS')
214 WHERE element_entry_value_id =l_entry_value_id
215 AND effective_start_date =p_effective_start_date;
216 END IF;
217 pay_in_utils.set_location(g_debug,l_procedure,40);
218 hr_general.g_data_migrator_mode:=l_get_migrator_status;
219 CLOSE c_curr_entry_value;
220
221 pay_in_utils.set_location(g_debug,l_procedure,50);
222
223 OPEN c_curr_entry_value(p_element_entry_id,'Benefit End Date',l_element_type_id);
224 FETCH c_curr_entry_value INTO l_benefit_end_date,l_entry_value_id;
225 CLOSE c_curr_entry_value;
226
227 if g_debug then
228 pay_in_utils.trace('******************************','********************');
229 pay_in_utils.trace('l_benefit_end_date : ',l_benefit_end_date);
230 pay_in_utils.trace('l_entry_value_id : ',l_entry_value_id);
231 pay_in_utils.trace('******************************','********************');
232 end if;
233
234 pay_in_utils.set_location(g_debug,l_procedure,60);
235
236 /* Check that Benefit End is not earlier than Benefit Start */
237 IF (nvl(TRUNC(to_date(l_benefit_start_date,'YYYY/MM/DD HH24:MI:SS')),p_effective_start_date)> TRUNC(to_date(l_benefit_end_date,'YYYY/MM/DD HH24:MI:SS'))) THEN
238 pay_in_utils.set_location(g_debug,'Leaving : '||l_procedure,70);
239 p_message_name := 'PER_IN_INCORRECT_DATES';
240 RETURN;
241 END IF;
242 EXCEPTION
243 WHEN OTHERS THEN
244 IF c_curr_entry_value%ISOPEN THEN CLOSE c_curr_entry_value ; END IF;
245 pay_in_utils.set_location(g_debug,'Leaving FROM Exception Block : '||l_procedure,80);
246 p_message_name := 'PER_IN_ORACLE_GENERIC_ERROR';
247 p_token_name(1) := 'FUNCTION';
248 p_token_value(1) := l_procedure;
249 p_token_name(1) := 'SQLERRMC';
250 p_token_value(1) := sqlerrm;
251 END ;
252
253 ---------------------------------------------------------------------------
254 -- --
255 -- Name : CHECK_LOAN_ENTRY --
256 -- Type : Procedure --
257 -- Access : Private --
258 -- Description : Procedure is the driver procedure for the Updating --
259 -- Taxable Flag of Loan Perquisite. --
260 -- Parameters : --
261 -- IN : l_element_name IN VARCHAR2 --
262 -- l_element_type_id IN NUMBER --
263 -- l_assignment_id IN NUMBER --
264 ---------------------------------------------------------------------------
265 PROCEDURE check_loan_entry(l_element_name VARCHAR2,
266 l_element_Type_id NUMBER,
267 l_assignment_id NUMBER) IS
268
269 CURSOR c_entries_start_tax_yr(p_tax_year_start DATE, p_assignment_id NUMBER, p_element_name varchar2) IS
270 SELECT pee.element_entry_id,pet.element_type_id
271 FROM pay_element_entries_f pee,pay_element_types_f pet
272 WHERE pee.assignment_id = p_assignment_id
273 AND pee.element_type_id = pet.element_type_id
274 AND pet.element_information1 = p_element_name
275 GROUP BY pee.element_entry_id,pet.element_type_id
276 HAVING MIN(pee.effective_start_date) >= p_tax_year_start;
277
278 l_tax_year_start DATE;
279 p_cnt number;
280 l_principal_amt_in_tax_yr NUMBER;
281 l_curr_principal_amt NUMBER;
282 l_loan_input_value_id tab_input_value_id;
283 l_tax_input_value_id tab_input_value_id;
284 l_procedure VARCHAR2(100);
285 l_loan_type pay_element_entry_values_f.screen_entry_value%TYPE;
286 l_loan_interest_type pay_element_entry_values_f.screen_entry_value%TYPE;
287
288 BEGIN
289
290 g_debug := hr_utility.debug_enabled;
291 l_procedure := g_package || 'check_loan_entry';
292 pay_in_utils.set_location(g_debug, 'Entering: ' || l_procedure, 10);
293
294 if g_debug then
295 pay_in_utils.trace('******************************',
296 '********************');
297 pay_in_utils.trace('l_element_name : ',
298 l_element_name);
299 pay_in_utils.trace('l_element_Type_id : ',
300 l_element_Type_id);
301 pay_in_utils.trace('l_assignment_id : ',
302 l_assignment_id);
303 pay_in_utils.trace('******************************',
304 '********************');
305 end if;
306
307 p_message_name := 'SUCCESS';
308 pay_in_utils.null_message(p_token_name, p_token_value);
309
310 pay_in_utils.set_location(g_debug,
311 'Effective Date: ' || p_effective_date,
312 20);
313
314 /*Check for Additional Information Begins*/
315
316 OPEN c_input_value_id(l_element_type_id, 'Additional Information');
317 FETCH c_input_value_id
318 INTO p_input_value_id;
319 CLOSE c_input_value_id;
320
321 if g_debug then
322 pay_in_utils.trace('p_input_value_id : ',
323 p_input_value_id);
324 end if;
325
326 pay_in_utils.set_location(g_debug, l_procedure, 12);
327 IF p_input_value_id IS NOT NULL THEN
328 /*Check made so that previous created elements without input value 'Additional Information' works.*/
329 OPEN c_element_entry_values(p_element_entry_id,
330 p_input_value_id,
331 p_effective_date);
332 FETCH c_element_entry_values
333 INTO l_loan_interest_type;
334 CLOSE c_element_entry_values;
335
336 if g_debug then
337 pay_in_utils.trace('l_loan_interest_type : ',
338 l_loan_interest_type);
339 end if;
340
341 OPEN c_input_value_id(l_element_type_id, 'Loan Type');
342 FETCH c_input_value_id
343 INTO p_input_value_id;
344 CLOSE c_input_value_id;
345
346 if g_debug then
347 pay_in_utils.trace('p_input_value_id : ',
348 p_input_value_id);
349 end if;
350
351 pay_in_utils.set_location(g_debug, l_procedure, 12);
352
353 OPEN c_element_entry_values(p_element_entry_id,
354 p_input_value_id,
355 p_effective_date);
356 FETCH c_element_entry_values
357 INTO l_loan_type;
358 CLOSE c_element_entry_values;
359
360 IF g_debug THEN
361 pay_in_utils.trace('l_loan_type : ', l_loan_type);
362 END IF;
363
364 IF l_loan_type = 'HOUSING' THEN
365 IF l_loan_interest_type IS NULL THEN
366 pay_in_utils.set_location(g_debug,
367 'Leaving: ' || l_procedure,
368 100);
369 p_message_name := 'PER_IN_MISSING_ENTRY_VALUE';
370 p_token_name(1) := 'TOKEN1';
371 p_token_value(1) := 'Additional Information';
372 p_token_name(2) := 'TOKEN2';
373 p_token_value(2) := 'Loan Type';
374 p_token_name(3) := 'TOKEN3';
375 p_token_value(3) := 'Housing Loan';
376 RETURN;
377 ELSIF l_loan_interest_type NOT IN
378 ('HL_FIXED_RURAL', 'HL_FIXED_URBAN', 'HL_FLOATING_RURAL',
379 'HL_FLOATING_URBAN') THEN
380 pay_in_utils.set_location(g_debug,
381 'Leaving: ' || l_procedure,
382 100);
383 p_message_name := 'PER_IN_INVALID_ELEMENT_ENTRY';
384 p_token_name(1) := 'TOKEN';
385 p_token_value(1) := 'Loan Type and Additional Information';
386 RETURN;
387 END IF;
388 ELSIF l_loan_type = 'CAR' THEN
389 IF l_loan_interest_type IS NULL THEN
390 pay_in_utils.set_location(g_debug,
391 'Leaving: ' || l_procedure,
392 100);
393 p_message_name := 'PER_IN_MISSING_ENTRY_VALUE';
394 p_token_name(1) := 'TOKEN1';
395 p_token_value(1) := 'Additional Information';
396 p_token_name(2) := 'TOKEN2';
397 p_token_value(2) := 'Loan Type';
398 p_token_name(3) := 'TOKEN3';
399 p_token_value(3) := 'Car Loan';
400 RETURN;
401 ELSIF l_loan_interest_type NOT IN ('CAR_NEW', 'CAR_USED') THEN
402 pay_in_utils.set_location(g_debug,
403 'Leaving: ' || l_procedure,
404 100);
405 p_message_name := 'PER_IN_INVALID_ELEMENT_ENTRY';
406 p_token_name(1) := 'TOKEN';
407 p_token_value(1) := 'Loan Type and Additional Information';
408 RETURN;
409 END IF;
410 ELSIF l_loan_type = 'TWOWHEELER' THEN
411 IF l_loan_interest_type IS NULL THEN
412 pay_in_utils.set_location(g_debug,
413 'Leaving: ' || l_procedure,
414 100);
415 p_message_name := 'PER_IN_MISSING_ENTRY_VALUE';
416 p_token_name(1) := 'TOKEN1';
417 p_token_value(1) := 'Additional Information';
418 p_token_name(2) := 'TOKEN2';
419 p_token_value(2) := 'Loan Type';
420 p_token_name(3) := 'TOKEN3';
421 p_token_value(3) := 'Two Wheeler Loan';
422 RETURN;
423 ELSIF l_loan_interest_type NOT IN ('TWL_FIXED', 'TWL_FLOATING') THEN
424 pay_in_utils.set_location(g_debug,
425 'Leaving: ' || l_procedure,
426 100);
427 p_message_name := 'PER_IN_INVALID_ELEMENT_ENTRY';
428 p_token_name(1) := 'TOKEN';
429 p_token_value(1) := 'Loan Type and Additional Information';
430 RETURN;
431 END IF;
432 ELSIF l_loan_type = 'MORTGAGE' THEN
433 IF p_effective_start_date >= TO_DATE('01-04-2008','DD-MM-YYYY') THEN
434 IF l_loan_interest_type IS NULL THEN
435 pay_in_utils.set_location(g_debug,
436 'Leaving: ' || l_procedure,
437 100);
438 p_message_name := 'PER_IN_MISSING_ENTRY_VALUE';
439 p_token_name(1) := 'TOKEN1';
440 p_token_value(1) := 'Additional Information';
441 p_token_name(2) := 'TOKEN2';
442 p_token_value(2) := 'Loan Type';
443 p_token_name(3) := 'TOKEN3';
444 p_token_value(3) := 'Mortgage Loan';
445 RETURN;
446 ELSIF l_loan_interest_type NOT IN ('MRTAGE_IMMOVABLE', 'MRTAGE_GOLD') THEN
447 pay_in_utils.set_location(g_debug,
448 'Leaving: ' || l_procedure,
449 100);
450 p_message_name := 'PER_IN_INVALID_ELEMENT_ENTRY';
451 p_token_name(1) := 'TOKEN';
452 p_token_value(1) := 'Loan Type and Additional Information';
453 RETURN;
454 END IF;
455 END IF;
456 END IF;
457 END IF;
458 /*Check for Additional Information Ends*/
459
460 /* Start - Get entries of loan availed in current tax year */
461 l_tax_year_start := pay_in_tax_utils.get_financial_year_start(p_effective_date);
462 pay_in_utils.set_location(g_debug,
463 'Tax Year Start: ' || l_tax_year_start,
464 30);
465
466 p_cnt := 0;
467 FOR i IN c_entries_start_tax_yr(l_tax_year_start,
468 l_assignment_id,
469 l_element_name) LOOP
470 l_element_entry_id(p_cnt) := i.element_entry_id;
471 l_element_type_id_tab (p_cnt) := i.element_type_id;
472 /*Added for the bugfix 6469684*/
473 OPEN c_input_value_id(l_element_type_id_tab (p_cnt), 'Loan Principal Amount');
474 FETCH c_input_value_id
475 INTO l_loan_input_value_id(p_cnt);
476 CLOSE c_input_value_id;
477
478 OPEN c_input_value_id(l_element_type_id_tab(p_cnt), 'Taxable Flag');
479 FETCH c_input_value_id
480 INTO l_tax_input_value_id(p_cnt);
481 CLOSE c_input_value_id;
482 p_cnt := p_cnt + 1;
483 END LOOP;
484 /* End - Get entries of loan avialed in current tax year */
485
486 pay_in_utils.set_location(g_debug, 'Entry Count: ' || p_cnt, 40);
487 l_principal_amt_in_tax_yr := 0;
488
489 /* Start - Find the sum of Loan Principal Amount*/
490 FOR j IN 0 .. p_cnt - 1 LOOP
491 pay_in_utils.set_location(g_debug,
492 'Entry id and Input value id : ' ||
493 l_element_entry_id(j) || l_loan_input_value_id(j),
494 50);
495
496 OPEN c_element_entry_values(l_element_entry_id(j),
497 l_loan_input_value_id(j),
498 p_effective_date);
499 FETCH c_element_entry_values
500 INTO l_curr_principal_amt;
501
502 l_principal_amt_in_tax_yr := l_principal_amt_in_tax_yr +
503 nvl(l_curr_principal_amt, 0);
504
505 CLOSE c_element_entry_values;
506 END LOOP;
507 /* End - Find the sum of Loan Principal Amount*/
508
509 OPEN c_global_value('IN_MAX_LOAN_AMT_EXEMPTION');
510 FETCH c_global_value
511 INTO l_gbl_value;
512 CLOSE c_global_value;
513
514 pay_in_utils.set_location(g_debug,
515 'Total Principal Amount: ' ||
516 l_principal_amt_in_tax_yr,
517 60);
518 --
519 -- start - Check if exemption limit is exceeded
520 --
521
522
523 l_get_migrator_status := hr_general.g_data_migrator_mode;
524 hr_general.g_data_migrator_mode := 'Y';
525
526 IF l_principal_amt_in_tax_yr > l_gbl_value then
527 /* Update the Taxable Flag to 'Y' when limit is exceeded */
528 FOR j IN 0 .. P_CNT - 1 LOOP
529
530 pay_in_utils.set_location(g_debug,
531 'Changing the following entries : ' ||
532 l_element_entry_id(j),
533 70);
534 UPDATE pay_element_entry_values_f peev
535 SET peev.screen_entry_value = 'Y'
536 WHERE peev.element_entry_id = l_element_entry_id(j)
537 AND peev.input_value_id = l_tax_input_value_id(j)
538 AND p_effective_date BETWEEN peev.effective_start_date and
539 peev.effective_end_date
540 AND nvl(peev.screen_entry_value, 'N') = 'N';
541 END LOOP;
542 ELSE
543 FOR j IN 0 .. P_CNT - 1 LOOP
544 /* Update the Taxable Flag to 'N' when the user accidentally enters incorrect values previously */
545 pay_in_utils.set_location(g_debug,
546 'Changing the following entries : ' ||
547 l_element_entry_id(j),
548 80);
549 UPDATE pay_element_entry_values_f peev
550 SET peev.screen_entry_value = 'N'
551 WHERE peev.element_entry_id = l_element_entry_id(j)
552 AND peev.input_value_id = l_tax_input_value_id(j)
553 AND p_effective_date BETWEEN peev.effective_start_date and
554 peev.effective_end_date
555 AND nvl(peev.screen_entry_value, 'Y') = 'Y';
556 END LOOP;
557
558 END IF;
559
560 hr_general.g_data_migrator_mode := l_get_migrator_status;
561 --
562 -- End - Check if exemption limit is exceeded
563 --
564 /* delete the PL/SQL table */
565 l_element_entry_id.delete;
566 pay_in_utils.set_location(g_debug, 'Leaving: ' || l_procedure, 90);
567 EXCEPTION
568 WHEN OTHERS THEN
569 IF c_entries_start_tax_yr%ISOPEN THEN
570 CLOSE c_entries_start_tax_yr;
571 END IF;
572 IF c_input_value_id%ISOPEN THEN
573 CLOSE c_input_value_id;
574 END IF;
575 IF c_element_entry_values%ISOPEN THEN
576 CLOSE c_element_entry_values;
577 END IF;
578 IF c_global_value%ISOPEN THEN
579 CLOSE c_global_value;
580 END IF;
581
582 pay_in_utils.set_location(g_debug,
583 'Leaving FROM Exception Block : ' ||
584 l_procedure,
585 100);
586 p_message_name := 'PER_IN_ORACLE_GENERIC_ERROR';
587 p_token_name(1) := 'FUNCTION';
588 p_token_value(1) := l_procedure;
589 p_token_name(2) := 'SQLERRMC';
590 p_token_value(2) := sqlerrm;
591 END check_loan_entry;
592
593
594 ---------------------------------------------------------------------------
595 -- --
596 -- Name : CHECK_MOTORCAR_ENTRY --
597 -- Type : Procedure --
598 -- Access : Private --
599 -- Description : Procedure is the driver procedure to validate --
600 -- Motor car entries. --
601 -- Parameters : --
602 -- IN : l_element_name IN VARCHAR2 --
603 -- : l_element_Type_id IN NUMBER --
604 -- : l_assignment_id IN NUMBER --
605
606 ---------------------------------------------------------------------------
607
608 PROCEDURE check_motorcar_entry(l_element_name VARCHAR2
609 ,l_element_Type_id NUMBER
610 ,l_assignment_id NUMBER)
611 IS
612 l_first_count NUMBER;
613 TYPE tab_input_value_name IS TABLE OF pay_input_values_f.name%TYPE INDEX BY BINARY_INTEGER;
614 l_input_value_name tab_input_value_name;
615
616 TYPE tab_effective_date IS TABLE OF DATE INDEX BY BINARY_INTEGER;
617 l_eff_start_date tab_effective_date;
618 p_cnt NUMBER;
619 l_procedure VARCHAR2(100);
620 p_input_value_id_start number;
621 p_input_value_id_end number;
622
623 l_benefit_start pay_element_entry_values_f.screen_entry_value%TYPE;
624 l_benefit_end pay_element_entry_values_f.screen_entry_value%TYPE;
625 l_benefit_start_date date;
626 l_benefit_end_date date;
627 l_type_automotive pay_element_entry_values_f.screen_entry_value%TYPE;
628
629 BEGIN
630
631 l_procedure := g_package ||'check_motorcar_entry';
632 pay_in_utils.set_location(g_debug,'Entering: '||l_procedure,10);
633
634 if g_debug then
635 pay_in_utils.trace('******************************','********************');
636 pay_in_utils.trace('l_element_name : ',l_element_name);
637 pay_in_utils.trace('l_element_Type_id : ',l_element_Type_id);
638 pay_in_utils.trace('l_assignment_id : ',l_assignment_id);
639 pay_in_utils.trace('******************************','********************');
640 end if;
641
642 p_message_name := 'SUCCESS';
643 pay_in_utils.null_message(p_token_name, p_token_value);
644
645 pay_in_utils.set_location(g_debug,l_procedure,11);
646
647 OPEN c_input_value_id(l_element_type_id
648 ,'Type of Automotive');
649 FETCH c_input_value_id INTO p_input_value_id;
650 CLOSE c_input_value_id;
651
652 if g_debug then
653 pay_in_utils.trace('p_input_value_id : ',p_input_value_id);
654 end if;
655
656 pay_in_utils.set_location(g_debug,l_procedure,12);
657
658 OPEN c_element_entry_values(p_element_entry_id
659 , p_input_value_id
660 , p_effective_date);
661 FETCH c_element_entry_values INTO l_type_automotive;
662 CLOSE c_element_entry_values;
663
664 if g_debug then
665 pay_in_utils.trace('l_type_automotive : ',l_type_automotive);
666 end if;
667
668
669 IF l_type_automotive = 'CAR' THEN -- Bugfix 4049484
670
671 OPEN c_input_value_id(l_element_type_id
672 ,'Benefit Start Date');
673 FETCH c_input_value_id INTO p_input_value_id_start;
674 CLOSE c_input_value_id;
675
676 if g_debug then
677 pay_in_utils.trace('p_input_value_id_start : ',p_input_value_id_start);
678 end if;
679
680 OPEN c_input_value_id(l_element_type_id
681 ,'Benefit End Date');
682 FETCH c_input_value_id INTO p_input_value_id_end;
683 CLOSE c_input_value_id;
684
685 if g_debug then
686 pay_in_utils.trace('p_input_value_id_end : ',p_input_value_id_end);
687 end if;
688
689 OPEN c_element_entry_values(p_element_entry_id
690 , p_input_value_id_start
691 , p_effective_date);
692 FETCH c_element_entry_values INTO l_benefit_start;
693 CLOSE c_element_entry_values;
694
695 if g_debug then
696 pay_in_utils.trace('l_benefit_start : ',l_benefit_start);
697 end if;
698
699 OPEN c_element_entry_values(p_element_entry_id
700 , p_input_value_id_end
701 , p_effective_date);
702 FETCH c_element_entry_values INTO l_benefit_end;
703 CLOSE c_element_entry_values;
704
705 if g_debug then
706 pay_in_utils.trace('l_benefit_end : ',l_benefit_end);
707 end if;
708
709 l_benefit_start_date :=fnd_Date.canonical_to_date(l_benefit_start);
710 l_benefit_end_date :=fnd_Date.canonical_to_date(l_benefit_end);
711
712 if g_debug then
713 pay_in_utils.trace('l_benefit_start_date : ',l_benefit_start_date);
714 pay_in_utils.trace('l_benefit_end_date : ',l_benefit_end_date);
715 end if;
716
717 -- Bugfix 4049484
718 i:=1;
719 l_element_entry_id(0) := p_element_entry_id;
720 l_eff_start_date(0) := l_benefit_start_date;
721
722 /* Get the entries of Motor Car that overlap with the current entry */
723 OPEN c_element_entries(l_element_Type_id,l_assignment_id,p_input_value_id,p_input_value_id_start,p_input_value_id_end,l_benefit_start_date,l_benefit_end_date);
724 LOOP
725 FETCH c_element_entries INTO l_element_entry_id(i),l_eff_start_date(i);
726 EXIT WHEN c_element_entries%NOTFOUND;
727 i :=i+1;
728 END LOOP;
729 CLOSE c_element_entries;
730
731
732 p_cnt := l_element_entry_id.COUNT;
733 /* Start - Perform the following checks when there are more than one entry for Motor Car */
734
735 IF p_cnt > 1 THEN -- Bugfix 4049484
736 pay_in_utils.set_location(g_debug,' Entry count is : '||p_cnt,40);
737
738
739 /* Get the input value id */
740 l_input_value_name(0) := 'Type of Automotive';
741 l_input_value_name(1) := 'Category of Car';
742 l_input_value_name(2) := 'Operational Expenses by';
743 l_input_value_name(3) := 'Usage of Car';
744
745 FOR i in 0..3 LOOP
746 OPEN c_input_value_id(l_element_type_id
747 ,l_input_value_name(i)) ;
748 FETCH c_input_value_id
749 INTO l_input_value_id(i);
750 CLOSE c_input_value_id;
751 END LOOP;
752
753 pay_in_utils.set_location(g_debug,l_procedure,50);
754
755 l_first_count :=0;
756
757 /* LOOP Start */
758 FOR i in 0..p_cnt-1 LOOP
759 pay_in_utils.set_location(g_debug,l_procedure,60);
760
761 IF l_element_entry_value.COUNT>0 THEN
762 l_element_entry_value.delete;
763 END IF;
764
765 pay_in_utils.set_location(g_debug,l_procedure,70);
766
767 FOR j IN 0..3 LOOP
768 OPEN c_element_entry_values(l_element_entry_id(i)
769 , l_input_value_id(j)
770 , l_eff_start_date(i));
771 FETCH c_element_entry_values INTO l_element_entry_value(j);
772 CLOSE c_element_entry_values;
773 END LOOP;
774
775 pay_in_utils.set_location(g_debug,l_procedure,80);
776
777 IF (l_element_entry_value(0) = 'CAR' AND l_element_entry_value(1) = 'OWN_EMPLOYER' AND l_element_entry_value(2) = 'EMPLOYEE' AND l_element_entry_value(3) = 'PARTIAL' )THEN
778 pay_in_utils.set_location(g_debug,l_procedure,90);
779 --
780 -- Check that no more than one entry with the above values exist
781 --
782 IF l_first_count <> 0 THEN
783 pay_in_utils.set_location(g_debug,'Invalid entry Motor Car More than one entry : '||l_procedure,100);
784 p_message_name := 'PER_IN_INVALID_ELEMENT_ENTRY';
785 p_token_name(1) := 'TOKEN';
786 p_token_value(1) := hr_general.decode_lookup('IN_MESSAGE_TOKENS','MOTOR_CAR');
787 RETURN;
788 END IF;
789 l_first_count := l_first_count +1;
790 ELSIF (l_element_entry_value(0) = 'CAR' and l_element_entry_value(1) = 'OWN_EMPLOYER' AND l_element_entry_value(2) = 'EMPLOYER' AND l_element_entry_value(3) ='PRIVATE') THEN
791 NULL;
792 ELSE
793 /* Raise an error for all other combination of values */
794 pay_in_utils.set_location(g_debug,'Invalid entry motor car : '||l_procedure,110);
795 p_message_name := 'PER_IN_INVALID_ELEMENT_ENTRY';
796 p_token_name(1) := 'TOKEN';
797 p_token_value(1) := hr_general.decode_lookup('IN_MESSAGE_TOKENS','MOTOR_CAR');
798 RETURN;
799 END IF;
800
801 END LOOP;
802 /* Loop End */
803 /* Check that exactly one entry satisfies the conditon*/
804 IF l_first_count <>1 THEN
805 pay_in_utils.set_location(g_debug,'Invalid entry in car entry : '||l_procedure,120);
806 p_message_name := 'PER_IN_INVALID_ELEMENT_ENTRY';
807 p_token_name(1) := 'TOKEN';
808 p_token_value(1) := hr_general.decode_lookup('IN_MESSAGE_TOKENS','MOTOR_CAR');
809 RETURN;
810 END IF;
811
812
813 END IF;
814 /* End - Perform the following checks when there are more than one entry for Motor Car */
815 IF l_element_entry_id.COUNT > 0 THEN l_element_entry_id.delete; END IF;
816 IF l_input_value_id.COUNT > 0 THEN l_input_value_id.delete; END IF;
817 IF l_eff_start_date.COUNT > 0 THEN l_eff_start_date.delete; END IF;
818 IF l_element_entry_value.COUNT > 0 THEN l_element_entry_value.delete; END IF;
819 END IF; /* End - Type of Automotive is Motor Car */
820
821 pay_in_utils.set_location(g_debug,'Leaving: '||l_procedure,130);
822 EXCEPTION
823 WHEN OTHERS THEN
824 IF c_input_value_id%ISOPEN THEN CLOSE c_input_value_id ; END IF;
825 IF c_global_value%ISOPEN THEN CLOSE c_global_value ; END IF;
826 pay_in_utils.set_location(g_debug,'Leaving FROM Exception Block : '||l_procedure,140);
827 p_message_name := 'PER_IN_ORACLE_GENERIC_ERROR';
828 p_token_name(1) := 'FUNCTION';
829 p_token_value(1) := l_procedure;
830 p_token_name(2) := 'SQLERRMC';
831 p_token_value(2) := sqlerrm;
832 END check_motorcar_entry;
833
834 ---------------------------------------------------------------------------
835 -- --
836 -- Name : CHECK_LTC_ENTRY --
837 -- Type : Procedure --
838 -- Access : Private --
839 -- Description : Procedure is the driver procedure to validate --
840 -- Motor car entries. --
841 -- Parameters : --
842 -- IN : l_element_name IN VARCHAR2 --
843 -- : l_element_Type_id IN NUMBER --
844 -- : l_assignment_id IN NUMBER --
845
846 ---------------------------------------------------------------------------
847 PROCEDURE check_ltc_entry(l_element_name VARCHAR2
848 ,l_element_Type_id NUMBER
849 ,l_assignment_id NUMBER)
850 IS
851 /* Cursor to find the LTC Block at the given effective Date */
852 CURSOR c_ltc_block(p_date DATE)
853 IS
854 SELECT hrl.lookup_code
855 ,hrl.meaning
856 FROM hr_lookups hrl
857 WHERE hrl.lookup_type ='IN_LTC_BLOCK'
858 AND to_number(to_char(p_date,'YYYY')) BETWEEN
859 to_number(SUBSTR(HRL.LOOKUP_CODE,1,4)) AND to_number(SUBSTR(HRL.LOOKUP_CODE,8,4)) ;
860
861 /* Cursor to find the LTC Availed in Previous employment given the LTC Block Start and End Dates */
862 CURSOR c_prev_employer_ltc_availed(p_start_date date
863 ,p_end_date date
864 ,p_assignment_id NUMBER)
865 IS
866 SELECT sum(nvl(ppm.pem_information8,0))
867 FROM per_previous_employers ppm,
868 per_all_assignments_f paa
869 WHERE paa.assignment_id = p_assignment_id
870 AND p_effective_start_date BETWEEN paa.effective_start_date AND paa.effective_end_date
871 AND paa.person_id =ppm.person_id
872 AND ppm.end_date BETWEEN p_start_date and p_end_date;
873
874 /* Cursor to Find the LTC Availed in Current Employment given the LTC Block Start and End Dates*/
875 CURSOR c_prev_blk_entry_value(p_element_Type_id NUMBER
876 ,p_start_date DATE
877 ,p_end_date DATE
878 ,p_assignment_id NUMBER
879 ,p_value_input number
880 ,p_blk_input number
881 ,p_prev_block VARCHAR2)
882 IS
883 SELECT count(*)
884 FROM pay_element_entries_f pee
885 ,pay_element_entry_values_f peev1
886 ,pay_element_entry_values_f peev2
887 WHERE pee.assignment_id = p_assignment_id
888 AND pee.element_type_id = p_element_Type_id
889 AND peev1.input_value_id = p_value_input
890 AND peev1.element_entry_id =peev2.element_entry_id
891 AND peev2.input_value_id = p_blk_input
892 AND peev2.screen_entry_value = p_prev_block
893 AND nvl(peev1.screen_entry_value,'N')='N'
894 AND peev1.element_entry_id =pee.element_entry_id
895 AND pee.effective_start_date BETWEEN p_start_date AND p_end_date
896 AND peev1.effective_start_date BETWEEN p_start_date AND p_end_date
897 AND peev2.effective_start_date BETWEEN p_start_date AND p_end_date;
898
899 /* Cursor to find if LTC Exemption is already carried Over from previous Block*/
900 CURSOR c_exemption_availed(p_element_Type_id NUMBER
901 ,p_start_date DATE
902 ,p_end_date DATE
903 ,p_assignment_id NUMBER
904 ,p_value_input NUMBER
905 ,p_blk_input NUMBER
906 ,p_curr_block VARCHAR2)
907 IS
908 SELECT count(*)
909 FROM pay_element_entries_f pee
910 ,pay_element_entry_values_f peev1
911 ,pay_element_entry_values_f peev2
912 WHERE pee.assignment_id = p_assignment_id
913 AND pee.element_type_id = p_element_Type_id
914 AND peev1.input_value_id = p_value_input
915 AND peev1.element_entry_id =peev2.element_entry_id
916 AND peev2.input_value_id = p_blk_input
917 AND peev2.screen_entry_value = p_curr_block
918 AND peev1.screen_entry_value='Y'
919 AND peev1.element_entry_id =pee.element_entry_id
920 AND pee.effective_start_date BETWEEN p_start_date AND p_end_date
921 AND peev1.effective_start_date BETWEEN p_start_date AND p_end_date
922 AND peev2.effective_start_date BETWEEN p_start_date AND p_end_date;
923
924 l_entry_value pay_element_entry_values_f.screen_entry_value%TYPE;
925
926
927 l_curr_block HR_LOOKUPS.LOOKUP_CODE%TYPE;
928 l_curr_period HR_LOOKUPS.meaning%TYPE;
929 l_current_year NUMBER;
930 l_current_blk_start NUMBER;
931
932 l_prev_blk_date DATE;
933 l_prev_block HR_LOOKUPS.LOOKUP_CODE%TYPE;
934 l_prev_period HR_LOOKUPS.meaning%TYPE;
935
936 l_carry_over_id NUMBER;
937 l_journey_block_id NUMBER;
938
939 l_cur_emplr_prev_blk NUMBER;
940 l_prev_emplr_curr_blk NUMBER;
941 l_prev_emplr_prev_blk NUMBER;
942 l_exemption NUMBER;
943 l_procedure VARCHAR2(100);
944
945
946 l_prev_start_date DATE;
947 l_prev_end_date DATE;
948 l_curr_start_date DATE;
949 l_curr_end_date DATE;
950 l_max_with_carry_over NUMBER;
951 l_max_ltc NUMBER;
952
953
954 BEGIN
955 l_procedure := g_package ||'check_ltc_entry';
956 pay_in_utils.set_location(g_debug,'Entering: '||l_procedure,10);
957
958 if g_debug then
959 pay_in_utils.trace('******************************','********************');
960 pay_in_utils.trace('l_element_name : ',l_element_name);
961 pay_in_utils.trace('l_element_Type_id : ',l_element_Type_id);
962 pay_in_utils.trace('l_assignment_id : ',l_assignment_id);
963 pay_in_utils.trace('******************************','********************');
964 end if;
965
966 p_message_name := 'SUCCESS';
967 pay_in_utils.null_message(p_token_name, p_token_value);
968
969 OPEN c_curr_entry_value(p_element_entry_id,'Carryover from Prev Block',l_element_type_id);
970 FETCH c_curr_entry_value INTO l_entry_value,l_entry_value_id;
971 CLOSE c_curr_entry_value;
972
973 if g_debug then
974 pay_in_utils.trace('l_entry_value : ',l_entry_value);
975 pay_in_utils.trace('l_entry_value_id : ',l_entry_value_id);
976 end if;
977 pay_in_utils.set_location(g_debug,l_procedure,15);
978
979 --
980 -- Find value held in globals before any further Processing
981 -- Fix 3956926
982 --
983
984 OPEN c_global_value('IN_MAX_JOURNEY_BLOCK_LTC');
985 FETCH c_global_value INTO l_max_ltc;
986 CLOSE c_global_value;
987
988 if g_debug then
989 pay_in_utils.trace('l_max_ltc : ',l_max_ltc);
990 end if;
991
992 OPEN c_global_value('IN_JOURNEY_CARRY_OVER');
993 FETCH c_global_value INTO l_max_with_carry_over;
994 CLOSE c_global_value;
995
996 if g_debug then
997 pay_in_utils.trace('l_max_with_carry_over : ',l_max_with_carry_over);
998 end if;
999 --
1000 --Start of Check the value in Carryover from Prev Block
1001 --
1002 IF nvl(l_entry_value,'N') ='Y' THEN
1003
1004 -- Check that the current year is the first year in LTC Block.Otherwise,raise an error
1005 OPEN c_ltc_block(p_effective_date);
1006 FETCH c_ltc_block INTO l_curr_block,l_curr_period;
1007 CLOSE c_ltc_block;
1008
1009 if g_debug then
1010 pay_in_utils.trace('l_curr_block : ',l_curr_block);
1011 pay_in_utils.trace('l_curr_period : ',l_curr_period);
1012 pay_in_utils.trace('p_effective_date : ',p_effective_date);
1013 end if;
1014 pay_in_utils.set_location(g_debug,l_procedure,20);
1015
1016 l_current_year := to_number(to_char(p_effective_date,'YYYY'));
1017 l_current_blk_start := to_number(substr(l_curr_block,1,4));
1018 IF l_current_year <> l_current_blk_start THEN
1019 pay_in_utils.set_location(g_debug,'Leaving.. '||l_procedure,30);
1020 p_message_name := 'PER_IN_LTC_CARRY_OVER'; -- Fix 3956926
1021 RETURN;
1022 END IF;
1023
1024 l_curr_start_date := to_date(substr(l_curr_period,1,11),'DD-MM-YYYY');
1025 l_curr_end_date := to_date(substr(l_curr_period,15,11),'DD-MM-YYYY');
1026
1027 if g_debug then
1028 pay_in_utils.trace('p_effective_start_date : ',p_effective_start_date);
1029 end if;
1030 -- Get the Previous Block start and End Dates
1031 l_prev_blk_date := ADD_MONTHS(p_effective_start_date,-48);
1032 OPEN c_ltc_block(l_prev_blk_date);
1033 FETCH c_ltc_block INTO l_prev_block,l_prev_period;
1034 close c_ltc_block;
1035
1036 if g_debug then
1037 pay_in_utils.trace('l_prev_block : ',l_prev_block);
1038 pay_in_utils.trace('l_prev_period : ',l_prev_period);
1039 end if;
1040 pay_in_utils.set_location(g_debug,l_procedure,40);
1041
1042 l_prev_start_date := to_date(substr(l_prev_period,1,11),'DD-MM-YYYY');
1043 l_prev_end_date := to_date(substr(l_prev_period,15,11),'DD-MM-YYYY');
1044
1045
1046 -- Get LTC Availed in Current employment in previous LTC Block
1047 OPEN c_input_value_id(l_element_Type_id
1048 ,'Carryover from Prev Block');
1049 FETCH c_input_value_id INTO l_carry_over_id;
1050 CLOSE c_input_value_id;
1051
1052 if g_debug then
1053 pay_in_utils.trace('l_carry_over_id : ',l_carry_over_id);
1054 end if;
1055
1056 OPEN c_input_value_id(l_element_Type_id
1057 ,'LTC Journey Block');
1058 FETCH c_input_value_id INTO l_journey_block_id;
1059 CLOSE c_input_value_id;
1060
1061 if g_debug then
1062 pay_in_utils.trace('l_journey_block_id : ',l_journey_block_id);
1063 end if;
1064
1065 pay_in_utils.set_location(g_debug,l_procedure,50);
1066
1067 OPEN c_prev_blk_entry_value(l_element_type_id
1068 ,l_prev_start_date
1069 ,l_prev_end_date
1070 ,l_assignment_id
1071 ,l_carry_over_id
1072 ,l_journey_block_id
1073 ,l_prev_block);
1074 FETCH c_prev_blk_entry_value INTO l_cur_emplr_prev_blk;
1075 CLOSE c_prev_blk_entry_value;
1076
1077 if g_debug then
1078 pay_in_utils.trace('l_cur_emplr_prev_blk : ',l_cur_emplr_prev_blk);
1079 end if;
1080
1081 OPEN c_prev_employer_ltc_availed(l_prev_start_date
1082 ,l_prev_end_date
1083 ,l_assignment_id );
1084 FETCH c_prev_employer_ltc_availed INTO
1085 l_prev_emplr_prev_blk;
1086 CLOSE c_prev_employer_ltc_availed;
1087
1088 if g_debug then
1089 pay_in_utils.trace('l_prev_emplr_prev_blk : ',l_prev_emplr_prev_blk);
1090 end if;
1091
1092 pay_in_utils.set_location(g_debug,l_procedure,60);
1093
1094
1095 /* Check if carry over is valid */
1096 IF ( nvl(l_cur_emplr_prev_blk,0) + nvl(l_prev_emplr_prev_blk,0) >=l_max_ltc) THEN
1097 pay_in_utils.set_location(g_debug,'Leaving...'||l_procedure,70);
1098 p_message_name := 'PER_IN_LTC_EXEMPTION_AVAILED';
1099 RETURN;
1100 END IF;
1101
1102
1103 OPEN c_exemption_availed(l_element_type_id
1104 ,l_curr_start_date
1105 ,l_curr_end_date
1106 ,l_assignment_id
1107 ,l_carry_over_id
1108 ,l_journey_block_id
1109 ,l_curr_block);
1110 FETCH c_exemption_availed INTO l_exemption;
1111 CLOSE c_exemption_availed;
1112
1113 if g_debug then
1114 pay_in_utils.trace('l_exemption : ',l_exemption);
1115 end if;
1116
1117 pay_in_utils.set_location(g_debug,l_procedure,80);
1118
1119 /* Check if Carry Over has already been availed */
1120 IF (nvl(l_exemption,0) > (l_max_with_carry_over - l_max_ltc) ) THEN
1121 pay_in_utils.set_location(g_debug,'Leaving... '||l_procedure,90);
1122 p_message_name := 'PER_IN_LTC_EXEMPTION_AVAILED';
1123 RETURN;
1124 END IF;
1125 pay_in_utils.set_location(g_debug,l_procedure,100);
1126
1127 END IF;
1128
1129 pay_in_utils.set_location(g_debug,'Leaving: '||l_procedure,110);
1130 EXCEPTION
1131 WHEN OTHERS THEN
1132 IF c_curr_entry_value%ISOPEN THEN CLOSE c_curr_entry_value ; END IF;
1133 IF c_ltc_block%ISOPEN THEN CLOSE c_ltc_block ; END IF;
1134 IF c_prev_blk_entry_value%ISOPEN THEN CLOSE c_prev_blk_entry_value ; END IF;
1135 IF c_exemption_availed%ISOPEN THEN CLOSE c_exemption_availed ; END IF;
1136 IF c_input_value_id%ISOPEN THEN CLOSE c_input_value_id ; END IF;
1137 IF c_prev_employer_ltc_availed%ISOPEN THEN CLOSE c_prev_employer_ltc_availed ; END IF;
1138 IF c_global_value%ISOPEN THEN CLOSE c_global_value ; END IF;
1139
1140 pay_in_utils.set_location(g_debug,'Leaving FROM Exception Block : '||l_procedure,120);
1141 p_message_name := 'PER_IN_ORACLE_GENERIC_ERROR';
1142 p_token_name(1) := 'FUNCTION';
1143 p_token_value(1) := l_procedure;
1144 p_token_name(1) := 'SQLERRMC';
1145 p_token_value(1) := sqlerrm;
1146 END check_ltc_entry;
1147 --
1148 -- End of Private Procedures
1149 --
1150
1151 BEGIN
1152
1153 l_procedure := g_package ||'check_entry_value';
1154 g_debug := hr_utility.debug_enabled;
1155 pay_in_utils.set_location(g_debug,'Entering: '||l_procedure,10);
1156
1157 p_message_name := 'SUCCESS';
1158 pay_in_utils.null_message(p_token_name, p_token_value);
1159
1160 l_get_migrator_status:=hr_general.g_data_migrator_mode;
1161 -- Get the Element Name
1162
1163 OPEN c_perquisite_name;
1164 FETCH c_perquisite_name INTO l_element_name,l_element_Type_id,l_assignment_id;
1165 CLOSE c_perquisite_name;
1166
1167 IF (l_element_name IS NULL)
1168 THEN
1169 /*
1170 Check introduced for Leave Travel Conession
1171 */
1172 OPEN c_element_entry_details(p_element_entry_id);
1173 FETCH c_element_entry_details INTO l_element_start_date,l_element_type_id,l_assignment_id;
1174 CLOSE c_element_entry_details;
1175
1176 l_inputvalue_id := pay_in_utils.get_input_value_id(l_element_start_date
1177 ,l_element_type_id
1178 ,'Component Name'
1179 );
1180
1181 OPEN c_element_entry_values(p_element_entry_id,l_inputvalue_id,l_element_start_date);
1182 FETCH c_element_entry_values INTO l_element_name;
1183 CLOSE c_element_entry_values;
1184
1185 IF (l_element_name IS NULL)
1186 THEN
1187 RETURN;
1188 END IF;
1189
1190 END IF;
1191 pay_in_utils.set_location(g_debug,'Element name is: '||l_element_name,20);
1192 pay_in_utils.set_location(g_debug,'Element_Type_id: '||l_element_Type_id,20);
1193 pay_in_utils.set_location(g_debug,'Assignment_id : '||l_assignment_id,20);
1194
1195
1196 IF l_element_name = 'Loan at Concessional Rate' THEN
1197 check_loan_entry(l_element_name,l_element_Type_id,l_assignment_id);
1198
1199 ELSIF l_element_name = 'Motor Car Perquisite' THEN
1200 check_benefit_dates(l_element_Type_id);
1201 if g_debug then
1202 pay_in_utils.trace('p_message_name : ',p_message_name);
1203 end if;
1204 IF p_message_name <>'SUCCESS' THEN RETURN; END IF;
1205 check_motorcar_entry(l_element_name,l_element_Type_id,l_assignment_id);
1206 --Bugfix 3982447 Start
1207 if g_debug then
1208 pay_in_utils.trace('p_message_name : ',p_message_name);
1209 end if;
1210 IF p_message_name <>'SUCCESS' THEN RETURN; END IF;
1211
1212 if g_debug then
1213 pay_in_utils.trace('p_element_entry_id : ',p_element_entry_id);
1214 end if;
1215
1216 OPEN c_curr_entry_value (p_element_entry_id
1217 ,'Category of Car'
1218 ,l_element_type_id );
1219 FETCH c_curr_entry_value INTO l_dep_value1,l_entry_value_id;
1220 CLOSE c_curr_entry_value;
1221
1222 if g_debug then
1223 pay_in_utils.trace('l_dep_value1 : ',l_dep_value1);
1224 pay_in_utils.trace('l_entry_value_id : ',l_entry_value_id);
1225 end if;
1226
1227 IF l_dep_value1 ='OWN_EMPLOYEE' THEN
1228 OPEN c_curr_entry_value (p_element_entry_id
1229 ,'Operational Expenses by'
1230 ,l_element_type_id );
1231 FETCH c_curr_entry_value INTO l_dep_value2,l_entry_value_id;
1232 CLOSE c_curr_entry_value;
1233
1234 if g_debug then
1235 pay_in_utils.trace('l_dep_value2 : ',l_dep_value2);
1236 pay_in_utils.trace('l_entry_value_id : ',l_entry_value_id);
1237 end if;
1238
1239
1240 IF l_dep_value2 = 'EMPLOYEE' THEN
1241 pay_in_utils.null_message(p_token_name, p_token_value);
1242 p_message_name := 'PER_IN_INVALID_PERQUISITE';
1243 pay_in_utils.set_location(g_debug,'Invalid perquisite ...'||l_procedure,25);
1244 RETURN;
1245 END IF;
1246 END IF;
1247 --Bugfix 3982447 End
1248
1249 ELSIF l_element_name = 'Company Accommodation' THEN
1250 --
1251
1252
1253 -- Start of 'Company Accommodation'
1254 --
1255 check_benefit_dates(l_element_Type_id);
1256
1257 if g_debug then
1258 pay_in_utils.trace('p_message_name : ',p_message_name);
1259 end if;
1260
1261 IF p_message_name <>'SUCCESS' THEN RETURN; END IF;
1262
1263 OPEN c_curr_entry_value (p_element_entry_id
1264 ,'Property'
1265 ,l_element_type_id );
1266 FETCH c_curr_entry_value INTO l_dep_value1,l_entry_value_id;
1267 CLOSE c_curr_entry_value;
1268
1269 if g_debug then
1270 pay_in_utils.trace('l_dep_value1 : ',l_dep_value1);
1271 pay_in_utils.trace('l_entry_value_id : ',l_entry_value_id);
1272 end if;
1273 --
1274 -- Check value interdependency Start
1275 --
1276 IF l_dep_value1 ='RENT' THEN
1277 OPEN c_curr_entry_value (p_element_entry_id
1278 ,'Rent Paid by Employer'
1279 ,l_element_type_id );
1280 FETCH c_curr_entry_value INTO l_dep_value2,l_entry_value_id;
1281 CLOSE c_curr_entry_value;
1282
1283 if g_debug then
1284 pay_in_utils.trace('l_dep_value2 : ',l_dep_value2);
1285 pay_in_utils.trace('l_entry_value_id : ',l_entry_value_id);
1286 end if;
1287
1288 IF l_dep_value2 IS NULL or l_dep_value2 = 0 THEN
1289 pay_in_utils.null_message(p_token_name, p_token_value);
1290 p_message_name := 'PER_IN_ENTRY_VALUE_ZERO';
1291 p_token_name(1) := 'TOKEN1';
1292 p_token_value(1) := hr_general.decode_lookup('IN_MESSAGE_TOKENS','RENT_EMPLOLYER');
1293 p_token_name(2) := 'TOKEN2';
1294 p_token_value(2) := hr_general.decode_lookup('IN_MESSAGE_TOKENS','PROPERTY');
1295 p_token_name(3) := 'TOKEN3';
1296 p_token_value(3) := hr_general.decode_lookup('IN_MESSAGE_TOKENS','LEASED');
1297
1298 pay_in_utils.set_location(g_debug,'Company Accommodation '||l_procedure,25);
1299 RETURN;
1300 END IF;
1301 -- Bugfix 3991117 Start
1302 ELSIF l_dep_value1 = 'OWN' THEN
1303 OPEN c_curr_entry_value (p_element_entry_id
1304 ,'Rent Paid by Employer'
1305 ,l_element_type_id );
1306 FETCH c_curr_entry_value INTO l_dep_value2,l_entry_value_id;
1307 CLOSE c_curr_entry_value;
1308
1309 if g_debug then
1310 pay_in_utils.trace('l_dep_value2 : ',l_dep_value2);
1311 pay_in_utils.trace('l_entry_value_id : ',l_entry_value_id);
1312 end if;
1313
1314 IF l_dep_value2 IS NOT NULL AND l_dep_value2 <> 0 THEN
1315 pay_in_utils.null_message(p_token_name, p_token_value);
1316 p_message_name := 'PER_IN_INVALID_ELEMENT_ENTRY';
1317 p_token_name(1) := 'TOKEN';
1318 p_token_value(1):= hr_general.decode_lookup('IN_MESSAGE_TOKENS','COMP_ACC');
1319 pay_in_utils.set_location(g_debug,'Company Accommodation '||l_procedure,28);
1320 RETURN;
1321 END IF;
1322
1323
1324 -- Bugfix 3991117 End
1325 END IF;
1326 --
1327 -- Check value interdependency End
1328 --
1329 --
1330 -- End of Company Accommodaiton
1331 --
1332 ELSIF l_element_name ='Company Movable Assets' THEN
1333 check_benefit_dates(l_element_Type_id);
1334 /* Bug Fix 4533671
1335 IF p_message_name <>'SUCCESS' THEN RETURN; END IF;
1336 --
1337 -- Start of Company Movable Assets
1338 --
1339 OPEN c_curr_entry_value (p_element_entry_id
1340 ,'Usage'
1341 ,l_element_type_id );
1342 FETCH c_curr_entry_value INTO l_dep_value1,l_entry_value_id;
1343 CLOSE c_curr_entry_value;
1344
1345 --
1346 -- Check value interdependency Start
1347 --
1348 IF l_dep_value1 ='SOLD' THEN
1349 OPEN c_curr_entry_value (p_element_entry_id
1350 ,'Date of Purchase'
1351 ,l_element_type_id );
1352 FETCH c_curr_entry_value INTO l_dep_value2,l_entry_value_id;
1353 CLOSE c_curr_entry_value;
1354
1355 IF l_dep_value2 IS NULL THEN
1356 pay_in_utils.set_location(g_debug,'ltc '||l_procedure,25);
1357 pay_in_utils.null_message(p_token_name, p_token_value);
1358 p_message_name := 'PER_IN_MISSING_ENTRY_VALUE';
1359 p_token_name(1) := 'TOKEN1';
1360 p_token_value(1) := 'Date of Purchase';
1361 p_token_name(2) := 'TOKEN2';
1362 p_token_value(2) := 'Usage';
1363 p_token_name(3) := 'TOKEN3';
1364 p_token_value(3) := 'Sold to Employee';
1365 RETURN;
1366 END IF;
1367 --
1368 -- Check value interdependency End
1369 --
1370 END IF;*/
1371 --
1372 -- End of Company Movable Assets
1373 --
1374
1375
1376 ELSIF l_element_name = 'Leave Travel Concession' THEN
1377 check_ltc_entry(l_element_name,l_element_Type_id,l_assignment_id);
1378 ELSIF l_element_name = 'Free Education' THEN
1379 check_benefit_dates(l_element_Type_id);
1380 END IF;
1381
1382 pay_in_utils.set_location(g_debug,'Leaving: '||l_procedure,30);
1383 EXCEPTION
1384 WHEN OTHERS THEN
1385 pay_in_utils.set_location(g_debug,'Leaving : '||l_procedure,50);
1386 p_message_name := 'PER_IN_ORACLE_GENERIC_ERROR';
1387 p_token_name(1) := 'FUNCTION';
1388 p_token_value(1) := l_procedure;
1389 p_token_name(2) := 'SQLERRMC';
1390 p_token_value(2) := sqlerrm;
1391 END check_element_entry;
1392
1393 END per_in_perquisite_pkg;