DBA Data[Home] [Help]

PACKAGE BODY: APPS.PER_IN_PERQUISITE_PKG

Source


1 PACKAGE body per_in_perquisite_pkg as
2 /* $Header: peinperq.pkb 120.15 2012/01/19 09:17:53 rpahune 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 = 'EDUCATION' THEN
433           IF p_effective_start_date >= TO_DATE('01-04-2009','DD-MM-YYYY') THEN
434           IF l_loan_interest_type NOT IN ('EL_BOYS','EL_GIRLS','SBI_EL_BOYS','SBI_EL_GIRLS') THEN
435             pay_in_utils.set_location(g_debug,
436                                       'Leaving: ' || l_procedure,
437                                       100);
438             p_message_name := 'PER_IN_INVALID_ELEMENT_ENTRY';
439             p_token_name(1) := 'TOKEN';
440             p_token_value(1) := 'Loan Type and Additional Information';
441             RETURN;
442           END IF;
443           END IF;
444         ELSIF l_loan_type = 'MORTGAGE' THEN
445 	  IF p_effective_start_date >= TO_DATE('01-04-2008','DD-MM-YYYY') THEN
446           IF l_loan_interest_type IS NULL THEN
447             pay_in_utils.set_location(g_debug,
448                                       'Leaving: ' || l_procedure,
449                                       100);
450             p_message_name := 'PER_IN_MISSING_ENTRY_VALUE';
451             p_token_name(1) := 'TOKEN1';
452             p_token_value(1) := 'Additional Information';
453             p_token_name(2) := 'TOKEN2';
454             p_token_value(2) := 'Loan Type';
455             p_token_name(3) := 'TOKEN3';
456             p_token_value(3) := 'Mortgage Loan';
457             RETURN;
458         ELSIF l_loan_interest_type NOT IN ('MRTAGE_IMMOVABLE', 'MRTAGE_GOLD') THEN
459             pay_in_utils.set_location(g_debug,
460                                       'Leaving: ' || l_procedure,
461                                       100);
462             p_message_name := 'PER_IN_INVALID_ELEMENT_ENTRY';
463             p_token_name(1) := 'TOKEN';
464             p_token_value(1) := 'Loan Type and Additional Information';
465             RETURN;
466           END IF;
467 	  END IF;
468         END IF;
469       END IF;
470       /*Check for Additional Information Ends*/
471 
472       /* Start - Get entries of loan availed in current tax year */
473       l_tax_year_start := pay_in_tax_utils.get_financial_year_start(p_effective_date);
474       pay_in_utils.set_location(g_debug,
475                                 'Tax Year Start: ' || l_tax_year_start,
476                                 30);
477 
478       p_cnt := 0;
479       FOR i IN c_entries_start_tax_yr(l_tax_year_start,
480                                       l_assignment_id,
481                                       l_element_name) LOOP
482         l_element_entry_id(p_cnt) := i.element_entry_id;
483         l_element_type_id_tab (p_cnt) := i.element_type_id;
484        /*Added for the bugfix 6469684*/
485        OPEN  c_input_value_id(l_element_type_id_tab (p_cnt), 'Loan Principal Amount');
486        FETCH c_input_value_id
487         INTO l_loan_input_value_id(p_cnt);
488        CLOSE c_input_value_id;
489 
490       OPEN  c_input_value_id(l_element_type_id_tab(p_cnt), 'Taxable Flag');
491       FETCH c_input_value_id
492        INTO l_tax_input_value_id(p_cnt);
493       CLOSE c_input_value_id;
494         p_cnt := p_cnt + 1;
495       END LOOP;
496       /* End - Get entries of loan avialed in current tax year */
497 
498       pay_in_utils.set_location(g_debug, 'Entry Count: ' || p_cnt, 40);
499       l_principal_amt_in_tax_yr := 0;
500 
501       /* Start - Find the sum of Loan Principal Amount*/
502       FOR j IN 0 .. p_cnt - 1 LOOP
503         pay_in_utils.set_location(g_debug,
504                                   'Entry id  and Input value id : ' ||
505                                   l_element_entry_id(j) || l_loan_input_value_id(j),
506                                   50);
507 
508         OPEN c_element_entry_values(l_element_entry_id(j),
509                                     l_loan_input_value_id(j),
510                                     p_effective_date);
511         FETCH c_element_entry_values
512           INTO l_curr_principal_amt;
513 
514         l_principal_amt_in_tax_yr := l_principal_amt_in_tax_yr +
515                                      nvl(l_curr_principal_amt, 0);
516 
517         CLOSE c_element_entry_values;
518       END LOOP;
519       /* End - Find the sum of Loan Principal Amount*/
520 
521       OPEN c_global_value('IN_MAX_LOAN_AMT_EXEMPTION');
522       FETCH c_global_value
523         INTO l_gbl_value;
524       CLOSE c_global_value;
525 
526       pay_in_utils.set_location(g_debug,
527                                 'Total Principal Amount: ' ||
528                                 l_principal_amt_in_tax_yr,
529                                 60);
530       --
531       --  start - Check if exemption limit is exceeded
532       --
533 
534 
535       l_get_migrator_status           := hr_general.g_data_migrator_mode;
536       hr_general.g_data_migrator_mode := 'Y';
537 
538       IF l_principal_amt_in_tax_yr > l_gbl_value then
539         /* Update the Taxable Flag to 'Y' when limit is exceeded */
540         FOR j IN 0 .. P_CNT - 1 LOOP
541 
542           pay_in_utils.set_location(g_debug,
543                                     'Changing the following entries : ' ||
544                                     l_element_entry_id(j),
545                                     70);
546           UPDATE pay_element_entry_values_f peev
547              SET peev.screen_entry_value = 'Y'
548            WHERE peev.element_entry_id = l_element_entry_id(j)
549              AND peev.input_value_id = l_tax_input_value_id(j)
550              AND p_effective_date BETWEEN peev.effective_start_date and
551                  peev.effective_end_date
552              AND nvl(peev.screen_entry_value, 'N') = 'N';
553         END LOOP;
554       ELSE
555         FOR j IN 0 .. P_CNT - 1 LOOP
556           /* Update the Taxable Flag to 'N' when the user accidentally enters incorrect values previously */
557           pay_in_utils.set_location(g_debug,
558                                     'Changing the following entries : ' ||
559                                     l_element_entry_id(j),
560                                     80);
561           UPDATE pay_element_entry_values_f peev
562              SET peev.screen_entry_value = 'N'
563            WHERE peev.element_entry_id = l_element_entry_id(j)
564              AND peev.input_value_id = l_tax_input_value_id(j)
565              AND p_effective_date BETWEEN peev.effective_start_date and
566                  peev.effective_end_date
567              AND nvl(peev.screen_entry_value, 'Y') = 'Y';
568         END LOOP;
569 
570       END IF;
571 
572       hr_general.g_data_migrator_mode := l_get_migrator_status;
573       --
574       --  End - Check if exemption limit is exceeded
575       --
576       /* delete the PL/SQL table */
577       l_element_entry_id.delete;
578       pay_in_utils.set_location(g_debug, 'Leaving: ' || l_procedure, 90);
579     EXCEPTION
580       WHEN OTHERS THEN
581         IF c_entries_start_tax_yr%ISOPEN THEN
582           CLOSE c_entries_start_tax_yr;
583         END IF;
584         IF c_input_value_id%ISOPEN THEN
585           CLOSE c_input_value_id;
586         END IF;
587         IF c_element_entry_values%ISOPEN THEN
588           CLOSE c_element_entry_values;
589         END IF;
590         IF c_global_value%ISOPEN THEN
591           CLOSE c_global_value;
592         END IF;
593 
594         pay_in_utils.set_location(g_debug,
595                                   'Leaving FROM Exception Block : ' ||
596                                   l_procedure,
597                                   100);
598         p_message_name := 'PER_IN_ORACLE_GENERIC_ERROR';
599         p_token_name(1) := 'FUNCTION';
600         p_token_value(1) := l_procedure;
601         p_token_name(2) := 'SQLERRMC';
602         p_token_value(2) := sqlerrm;
603     END check_loan_entry;
604 
605 
606 ---------------------------------------------------------------------------
607  --                                                                      --
608  -- Name           : CHECK_MOTORCAR_ENTRY                                --
609  -- Type           : Procedure                                           --
610  -- Access         : Private                                             --
611  -- Description    : Procedure is the driver procedure to validate       --
612  --                  Motor car entries.                                  --
613  -- Parameters     :                                                     --
614  --             IN :       l_element_name        IN   VARCHAR2           --
615  --                :       l_element_Type_id     IN   NUMBER             --
616  --                :       l_assignment_id       IN   NUMBER             --
617 
618 ---------------------------------------------------------------------------
619 
620 PROCEDURE check_motorcar_entry(l_element_name VARCHAR2
621                               ,l_element_Type_id NUMBER
622 			      ,l_assignment_id NUMBER)
623    IS
624     l_first_count NUMBER;
625     TYPE tab_input_value_name IS TABLE OF pay_input_values_f.name%TYPE INDEX BY BINARY_INTEGER;
626     l_input_value_name  tab_input_value_name;
627 
628     TYPE tab_effective_date IS TABLE OF DATE INDEX BY BINARY_INTEGER;
629     l_eff_start_date  tab_effective_date;
630     p_cnt NUMBER;
631     l_procedure VARCHAR2(100);
632     p_input_value_id_start number;
633     p_input_value_id_end number;
634 
635     l_benefit_start pay_element_entry_values_f.screen_entry_value%TYPE;
636     l_benefit_end pay_element_entry_values_f.screen_entry_value%TYPE;
637     l_benefit_start_date date;
638     l_benefit_end_date date;
639     l_type_automotive pay_element_entry_values_f.screen_entry_value%TYPE;
640 
641 BEGIN
642 
643   l_procedure := g_package ||'check_motorcar_entry';
644   pay_in_utils.set_location(g_debug,'Entering: '||l_procedure,10);
645 
646 if g_debug then
647   pay_in_utils.trace('******************************','********************');
648   pay_in_utils.trace('l_element_name                  : ',l_element_name);
649   pay_in_utils.trace('l_element_Type_id               : ',l_element_Type_id);
650   pay_in_utils.trace('l_assignment_id                 : ',l_assignment_id);
651   pay_in_utils.trace('******************************','********************');
652 end if;
653 
654   p_message_name := 'SUCCESS';
655   pay_in_utils.null_message(p_token_name, p_token_value);
656 
657  pay_in_utils.set_location(g_debug,l_procedure,11);
658 
659   OPEN c_input_value_id(l_element_type_id
660                        ,'Type of Automotive');
661   FETCH c_input_value_id INTO p_input_value_id;
662   CLOSE c_input_value_id;
663 
664   if g_debug then
665     pay_in_utils.trace('p_input_value_id                 : ',p_input_value_id);
666   end if;
667 
668   pay_in_utils.set_location(g_debug,l_procedure,12);
669 
670   OPEN c_element_entry_values(p_element_entry_id
671                             , p_input_value_id
672 	                    , p_effective_date);
673   FETCH c_element_entry_values INTO l_type_automotive;
674   CLOSE c_element_entry_values;
675 
676   if g_debug then
677     pay_in_utils.trace('l_type_automotive                 : ',l_type_automotive);
678   end if;
679 
680 
681  IF l_type_automotive = 'CAR' THEN   -- Bugfix 4049484
682 
683   OPEN c_input_value_id(l_element_type_id
684                        ,'Benefit Start Date');
685   FETCH c_input_value_id INTO p_input_value_id_start;
686   CLOSE c_input_value_id;
687 
688   if g_debug then
689     pay_in_utils.trace('p_input_value_id_start                 : ',p_input_value_id_start);
690   end if;
691 
692   OPEN c_input_value_id(l_element_type_id
693                        ,'Benefit End Date');
694   FETCH c_input_value_id INTO p_input_value_id_end;
695   CLOSE c_input_value_id;
696 
697   if g_debug then
698     pay_in_utils.trace('p_input_value_id_end                 : ',p_input_value_id_end);
699   end if;
700 
701   OPEN c_element_entry_values(p_element_entry_id
702                             , p_input_value_id_start
703 	                    , p_effective_date);
704   FETCH c_element_entry_values INTO l_benefit_start;
705   CLOSE c_element_entry_values;
706 
707   if g_debug then
708     pay_in_utils.trace('l_benefit_start                 : ',l_benefit_start);
709   end if;
710 
711   OPEN c_element_entry_values(p_element_entry_id
712                             , p_input_value_id_end
713 			    , p_effective_date);
714   FETCH c_element_entry_values INTO l_benefit_end;
715   CLOSE c_element_entry_values;
716 
717   if g_debug then
718     pay_in_utils.trace('l_benefit_end                 : ',l_benefit_end);
719   end if;
720 
721 l_benefit_start_date :=fnd_Date.canonical_to_date(l_benefit_start);
722 l_benefit_end_date :=fnd_Date.canonical_to_date(l_benefit_end);
723 
724   if g_debug then
725     pay_in_utils.trace('l_benefit_start_date                 : ',l_benefit_start_date);
726     pay_in_utils.trace('l_benefit_end_date                   : ',l_benefit_end_date);
727   end if;
728 
729   -- Bugfix 4049484
730    i:=1;
731    l_element_entry_id(0) := p_element_entry_id;
732    l_eff_start_date(0) := l_benefit_start_date;
733 
734   /* Get the  entries of Motor Car that overlap with the current entry */
735   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);
736    LOOP
737      FETCH c_element_entries INTO l_element_entry_id(i),l_eff_start_date(i);
738      EXIT WHEN c_element_entries%NOTFOUND;
739        i :=i+1;
740     END LOOP;
741   CLOSE c_element_entries;
742 
743 
744    p_cnt := l_element_entry_id.COUNT;
745 /* Start - Perform the following checks when there are more than one entry for Motor Car */
746 
747   IF p_cnt > 1 THEN  -- Bugfix 4049484
748     pay_in_utils.set_location(g_debug,' Entry count  is : '||p_cnt,40);
749 
750 
751   /* Get the input value id */
752   l_input_value_name(0) := 'Type of Automotive';
753   l_input_value_name(1) := 'Category of Car';
754   l_input_value_name(2) := 'Operational Expenses by';
755   l_input_value_name(3) := 'Usage of Car';
756 
757    FOR  i in 0..3 LOOP
758      OPEN c_input_value_id(l_element_type_id
759                           ,l_input_value_name(i)) ;
760      FETCH c_input_value_id
761       INTO l_input_value_id(i);
762      CLOSE c_input_value_id;
763    END LOOP;
764 
765   pay_in_utils.set_location(g_debug,l_procedure,50);
766 
767   l_first_count :=0;
768 
769     /* LOOP Start */
770     FOR i in 0..p_cnt-1 LOOP
771       pay_in_utils.set_location(g_debug,l_procedure,60);
772 
773       IF l_element_entry_value.COUNT>0 THEN
774         l_element_entry_value.delete;
775       END IF;
776 
777       pay_in_utils.set_location(g_debug,l_procedure,70);
778 
779       FOR j IN 0..3 LOOP
780         OPEN c_element_entry_values(l_element_entry_id(i)
781                                   , l_input_value_id(j)
782 	                        , l_eff_start_date(i));
783         FETCH c_element_entry_values INTO l_element_entry_value(j);
784         CLOSE c_element_entry_values;
785       END LOOP;
786 
787       pay_in_utils.set_location(g_debug,l_procedure,80);
788 
789       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
790          pay_in_utils.set_location(g_debug,l_procedure,90);
791          --
792 	 -- Check that no more than one entry with the above values exist
793 	 --
794 	 IF l_first_count <> 0 THEN
795 	   pay_in_utils.set_location(g_debug,'Invalid entry Motor Car More than one entry : '||l_procedure,100);
796            p_message_name := 'PER_IN_INVALID_ELEMENT_ENTRY';
797 	   p_token_name(1) := 'TOKEN';
798            p_token_value(1) := hr_general.decode_lookup('IN_MESSAGE_TOKENS','MOTOR_CAR');
799            RETURN;
800          END IF;
801 	 l_first_count := l_first_count +1;
802       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
803 	  NULL;
804       ELSE
805         /* Raise an error for all other combination of values */
806       	pay_in_utils.set_location(g_debug,'Invalid entry motor car : '||l_procedure,110);
807         p_message_name := 'PER_IN_INVALID_ELEMENT_ENTRY';
808 	p_token_name(1) := 'TOKEN';
809         p_token_value(1) := hr_general.decode_lookup('IN_MESSAGE_TOKENS','MOTOR_CAR');
810         RETURN;
811        END IF;
812 
813     END LOOP;
814     /* Loop End */
815     /*  Check that exactly one entry satisfies the conditon*/
816     IF l_first_count <>1 THEN
817       pay_in_utils.set_location(g_debug,'Invalid entry in car entry : '||l_procedure,120);
818       p_message_name := 'PER_IN_INVALID_ELEMENT_ENTRY';
819       p_token_name(1) := 'TOKEN';
820       p_token_value(1) := hr_general.decode_lookup('IN_MESSAGE_TOKENS','MOTOR_CAR');
821       RETURN;
822     END IF;
823 
824 
825   END IF;
826   /* End - Perform the following checks when there are more than one entry for Motor Car */
827   IF  l_element_entry_id.COUNT > 0 THEN l_element_entry_id.delete; END IF;
828   IF  l_input_value_id.COUNT > 0 THEN l_input_value_id.delete; END IF;
829   IF l_eff_start_date.COUNT > 0 THEN  l_eff_start_date.delete; END IF;
830   IF l_element_entry_value.COUNT > 0 THEN l_element_entry_value.delete;  END IF;
831  END IF; /* End - Type of Automotive is Motor Car */
832 
833   pay_in_utils.set_location(g_debug,'Leaving: '||l_procedure,130);
834 EXCEPTION
835   WHEN OTHERS THEN
836       IF c_input_value_id%ISOPEN THEN CLOSE c_input_value_id ; END IF;
837       IF c_global_value%ISOPEN THEN CLOSE c_global_value ; END IF;
838       pay_in_utils.set_location(g_debug,'Leaving FROM Exception Block : '||l_procedure,140);
839       p_message_name := 'PER_IN_ORACLE_GENERIC_ERROR';
840       p_token_name(1) := 'FUNCTION';
841       p_token_value(1) := l_procedure;
842       p_token_name(2) := 'SQLERRMC';
843       p_token_value(2) := sqlerrm;
844 END check_motorcar_entry;
845 
846 ---------------------------------------------------------------------------
847  --                                                                      --
848  -- Name           : CHECK_LTC_ENTRY                                     --
849  -- Type           : Procedure                                           --
850  -- Access         : Private                                             --
851  -- Description    : Procedure is the driver procedure to validate       --
852  --                  Motor car entries.                                  --
853  -- Parameters     :                                                     --
854  --             IN :       l_element_name        IN   VARCHAR2           --
855  --                :       l_element_Type_id     IN   NUMBER             --
856  --                :       l_assignment_id       IN   NUMBER             --
857 
858 ---------------------------------------------------------------------------
859 PROCEDURE check_ltc_entry(l_element_name VARCHAR2
860                          ,l_element_Type_id NUMBER
861 			 ,l_assignment_id NUMBER)
862 IS
863  /* Cursor to find the LTC Block at the given effective Date */
864   CURSOR c_ltc_block(p_date DATE)
865       IS
866   SELECT hrl.lookup_code
867         ,hrl.meaning
868     FROM hr_lookups hrl
869    WHERE hrl.lookup_type ='IN_LTC_BLOCK'
870      AND to_number(to_char(p_date,'YYYY')) BETWEEN
871         to_number(SUBSTR(HRL.LOOKUP_CODE,1,4)) AND  to_number(SUBSTR(HRL.LOOKUP_CODE,8,4)) ;
872 
873   /* Cursor to find the LTC Availed in Previous employment given the  LTC Block Start and End Dates */
874   CURSOR c_prev_employer_ltc_availed(p_start_date date
875                                     ,p_end_date date
876 			            ,p_assignment_id NUMBER)
877       IS
878   SELECT sum(nvl(ppm.pem_information8,0))
879     FROM per_previous_employers ppm,
880          per_all_assignments_f paa
881    WHERE paa.assignment_id = p_assignment_id
882      AND p_effective_start_date BETWEEN paa.effective_start_date AND paa.effective_end_date
883      AND paa.person_id =ppm.person_id
884      AND ppm.end_date BETWEEN p_start_date and p_end_date;
885 
886  /* Cursor to Find the  LTC Availed in Current Employment given the LTC Block Start and End Dates*/
887   CURSOR c_prev_blk_entry_value(p_element_Type_id NUMBER
888                                ,p_start_date DATE
889                                ,p_end_date   DATE
890 	      		       ,p_assignment_id NUMBER
891 			       ,p_value_input number
892 			       ,p_blk_input number
893 			       ,p_prev_block VARCHAR2)
894       IS
895    SELECT count(*)
896      FROM pay_element_entries_f pee
897          ,pay_element_entry_values_f peev1
898          ,pay_element_entry_values_f peev2
899     WHERE pee.assignment_id = p_assignment_id
900       AND pee.element_type_id = p_element_Type_id
901       AND peev1.input_value_id = p_value_input
902       AND peev1.element_entry_id =peev2.element_entry_id
903       AND peev2.input_value_id = p_blk_input
904       AND peev2.screen_entry_value = p_prev_block
905       AND nvl(peev1.screen_entry_value,'N')='N'
906       AND peev1.element_entry_id =pee.element_entry_id
907       AND pee.effective_start_date BETWEEN p_start_date AND p_end_date
908       AND peev1.effective_start_date BETWEEN p_start_date AND p_end_date
909       AND peev2.effective_start_date BETWEEN p_start_date AND p_end_date;
910 
911   /* Cursor to find if LTC Exemption is already carried Over from previous Block*/
912   CURSOR c_exemption_availed(p_element_Type_id NUMBER
913                             ,p_start_date DATE
914 			    ,p_end_date   DATE
915 			    ,p_assignment_id NUMBER
916 			    ,p_value_input NUMBER
917 			    ,p_blk_input NUMBER
918 			    ,p_curr_block VARCHAR2)
919       IS
920   SELECT count(*)
921     FROM pay_element_entries_f pee
922         ,pay_element_entry_values_f peev1
923         ,pay_element_entry_values_f peev2
924    WHERE pee.assignment_id = p_assignment_id
925      AND pee.element_type_id = p_element_Type_id
926      AND peev1.input_value_id = p_value_input
927      AND peev1.element_entry_id =peev2.element_entry_id
928      AND peev2.input_value_id = p_blk_input
929      AND peev2.screen_entry_value = p_curr_block
930      AND peev1.screen_entry_value='Y'
931      AND peev1.element_entry_id =pee.element_entry_id
932      AND pee.effective_start_date BETWEEN p_start_date AND p_end_date
933      AND peev1.effective_start_date BETWEEN p_start_date AND p_end_date
934      AND peev2.effective_start_date BETWEEN p_start_date AND p_end_date;
935 
936   l_entry_value  pay_element_entry_values_f.screen_entry_value%TYPE;
937 
938 
939   l_curr_block HR_LOOKUPS.LOOKUP_CODE%TYPE;
940   l_curr_period HR_LOOKUPS.meaning%TYPE;
941   l_current_year NUMBER;
942   l_current_blk_start NUMBER;
943 
944   l_prev_blk_date DATE;
945   l_prev_block HR_LOOKUPS.LOOKUP_CODE%TYPE;
946   l_prev_period HR_LOOKUPS.meaning%TYPE;
947 
948   l_carry_over_id NUMBER;
949   l_journey_block_id NUMBER;
950 
951   l_cur_emplr_prev_blk NUMBER;
952   l_prev_emplr_curr_blk NUMBER;
953   l_prev_emplr_prev_blk NUMBER;
954   l_exemption NUMBER;
955   l_procedure VARCHAR2(100);
956 
957 
958   l_prev_start_date DATE;
959   l_prev_end_date DATE;
960   l_curr_start_date DATE;
961   l_curr_end_date DATE;
962   l_max_with_carry_over NUMBER;
963   l_max_ltc NUMBER;
964 
965 
966 BEGIN
967   l_procedure := g_package ||'check_ltc_entry';
968   pay_in_utils.set_location(g_debug,'Entering: '||l_procedure,10);
969 
970 if g_debug then
971   pay_in_utils.trace('******************************','********************');
972   pay_in_utils.trace('l_element_name                  : ',l_element_name);
973   pay_in_utils.trace('l_element_Type_id               : ',l_element_Type_id);
974   pay_in_utils.trace('l_assignment_id                 : ',l_assignment_id);
975   pay_in_utils.trace('******************************','********************');
976 end if;
977 
978   p_message_name := 'SUCCESS';
979   pay_in_utils.null_message(p_token_name, p_token_value);
980 
981   OPEN c_curr_entry_value(p_element_entry_id,'Carryover from Prev Block',l_element_type_id);
982   FETCH c_curr_entry_value INTO l_entry_value,l_entry_value_id;
983   CLOSE c_curr_entry_value;
984 
985   if g_debug then
986     pay_in_utils.trace('l_entry_value                 : ',l_entry_value);
987     pay_in_utils.trace('l_entry_value_id              : ',l_entry_value_id);
988   end if;
989   pay_in_utils.set_location(g_debug,l_procedure,15);
990 
991   --
992   -- Find value held in globals before any further Processing
993   -- Fix 3956926
994   --
995 
996   OPEN c_global_value('IN_MAX_JOURNEY_BLOCK_LTC');
997   FETCH c_global_value INTO l_max_ltc;
998   CLOSE c_global_value;
999 
1000   if g_debug then
1001     pay_in_utils.trace('l_max_ltc                 : ',l_max_ltc);
1002   end if;
1003 
1004   OPEN c_global_value('IN_JOURNEY_CARRY_OVER');
1005   FETCH c_global_value INTO l_max_with_carry_over;
1006   CLOSE c_global_value;
1007 
1008   if g_debug then
1009     pay_in_utils.trace('l_max_with_carry_over                 : ',l_max_with_carry_over);
1010   end if;
1011   --
1012   --Start of Check the value in Carryover from Prev Block
1013   --
1014   IF nvl(l_entry_value,'N') ='Y' THEN
1015 
1016     -- Check that the current year is the first year in LTC Block.Otherwise,raise an error
1017     OPEN c_ltc_block(p_effective_date);
1018     FETCH c_ltc_block INTO l_curr_block,l_curr_period;
1019     CLOSE c_ltc_block;
1020 
1021     if g_debug then
1022       pay_in_utils.trace('l_curr_block                  : ',l_curr_block);
1023       pay_in_utils.trace('l_curr_period                 : ',l_curr_period);
1024       pay_in_utils.trace('p_effective_date              : ',p_effective_date);
1025     end if;
1026     pay_in_utils.set_location(g_debug,l_procedure,20);
1027 
1028     l_current_year := to_number(to_char(p_effective_date,'YYYY'));
1029     l_current_blk_start := to_number(substr(l_curr_block,1,4));
1030     IF l_current_year <> l_current_blk_start THEN
1031       pay_in_utils.set_location(g_debug,'Leaving.. '||l_procedure,30);
1032       p_message_name := 'PER_IN_LTC_CARRY_OVER';  -- Fix 3956926
1033       RETURN;
1034     END IF;
1035 
1036     l_curr_start_date := to_date(substr(l_curr_period,1,11),'DD-MM-YYYY');
1037     l_curr_end_date   := to_date(substr(l_curr_period,15,11),'DD-MM-YYYY');
1038 
1039     if g_debug then
1040       pay_in_utils.trace('p_effective_start_date              : ',p_effective_start_date);
1041     end if;
1042     -- Get the Previous Block start and End Dates
1043     l_prev_blk_date := ADD_MONTHS(p_effective_start_date,-48);
1044     OPEN c_ltc_block(l_prev_blk_date);
1045     FETCH c_ltc_block INTO l_prev_block,l_prev_period;
1046     close c_ltc_block;
1047 
1048     if g_debug then
1049       pay_in_utils.trace('l_prev_block              : ',l_prev_block);
1050       pay_in_utils.trace('l_prev_period             : ',l_prev_period);
1051     end if;
1052     pay_in_utils.set_location(g_debug,l_procedure,40);
1053 
1054     l_prev_start_date := to_date(substr(l_prev_period,1,11),'DD-MM-YYYY');
1055     l_prev_end_date   := to_date(substr(l_prev_period,15,11),'DD-MM-YYYY');
1056 
1057 
1058     -- Get LTC Availed in Current employment in previous LTC Block
1059     OPEN c_input_value_id(l_element_Type_id
1060                          ,'Carryover from Prev Block');
1061     FETCH c_input_value_id INTO l_carry_over_id;
1062     CLOSE c_input_value_id;
1063 
1064     if g_debug then
1065       pay_in_utils.trace('l_carry_over_id             : ',l_carry_over_id);
1066     end if;
1067 
1068     OPEN c_input_value_id(l_element_Type_id
1069                          ,'LTC Journey Block');
1070     FETCH c_input_value_id INTO l_journey_block_id;
1071     CLOSE c_input_value_id;
1072 
1073     if g_debug then
1074       pay_in_utils.trace('l_journey_block_id             : ',l_journey_block_id);
1075     end if;
1076 
1077     pay_in_utils.set_location(g_debug,l_procedure,50);
1078 
1079     OPEN c_prev_blk_entry_value(l_element_type_id
1080                                ,l_prev_start_date
1081                                ,l_prev_end_date
1082 	    		       ,l_assignment_id
1083   			       ,l_carry_over_id
1084 			       ,l_journey_block_id
1085 			       ,l_prev_block);
1086     FETCH c_prev_blk_entry_value INTO l_cur_emplr_prev_blk;
1087     CLOSE c_prev_blk_entry_value;
1088 
1089     if g_debug then
1090       pay_in_utils.trace('l_cur_emplr_prev_blk             : ',l_cur_emplr_prev_blk);
1091     end if;
1092 
1093     OPEN c_prev_employer_ltc_availed(l_prev_start_date
1094                                     ,l_prev_end_date
1095 				    ,l_assignment_id );
1096     FETCH c_prev_employer_ltc_availed INTO
1097           l_prev_emplr_prev_blk;
1098     CLOSE c_prev_employer_ltc_availed;
1099 
1100     if g_debug then
1101       pay_in_utils.trace('l_prev_emplr_prev_blk             : ',l_prev_emplr_prev_blk);
1102     end if;
1103 
1104     pay_in_utils.set_location(g_debug,l_procedure,60);
1105 
1106 
1107     /* Check if carry over is valid */
1108     IF ( nvl(l_cur_emplr_prev_blk,0) + nvl(l_prev_emplr_prev_blk,0)  >=l_max_ltc) THEN
1109       pay_in_utils.set_location(g_debug,'Leaving...'||l_procedure,70);
1110       p_message_name := 'PER_IN_LTC_EXEMPTION_AVAILED';
1111       RETURN;
1112     END IF;
1113 
1114 
1115     OPEN c_exemption_availed(l_element_type_id
1116                             ,l_curr_start_date
1117 			    ,l_curr_end_date
1118 			    ,l_assignment_id
1119 			    ,l_carry_over_id
1120 			    ,l_journey_block_id
1121 			    ,l_curr_block);
1122     FETCH c_exemption_availed INTO l_exemption;
1123     CLOSE c_exemption_availed;
1124 
1125     if g_debug then
1126       pay_in_utils.trace('l_exemption             : ',l_exemption);
1127     end if;
1128 
1129     pay_in_utils.set_location(g_debug,l_procedure,80);
1130 
1131     /* Check if Carry Over has already been availed */
1132     IF (nvl(l_exemption,0) > (l_max_with_carry_over - l_max_ltc) ) THEN
1133       pay_in_utils.set_location(g_debug,'Leaving... '||l_procedure,90);
1134       p_message_name := 'PER_IN_LTC_EXEMPTION_AVAILED';
1135       RETURN;
1136     END IF;
1137     pay_in_utils.set_location(g_debug,l_procedure,100);
1138 
1139   END IF;
1140 
1141  pay_in_utils.set_location(g_debug,'Leaving: '||l_procedure,110);
1142 EXCEPTION
1143   WHEN OTHERS THEN
1144      IF c_curr_entry_value%ISOPEN THEN CLOSE c_curr_entry_value ; END IF;
1145      IF c_ltc_block%ISOPEN THEN CLOSE c_ltc_block ; END IF;
1146      IF c_prev_blk_entry_value%ISOPEN THEN CLOSE c_prev_blk_entry_value ; END IF;
1147      IF c_exemption_availed%ISOPEN THEN CLOSE c_exemption_availed ; END IF;
1148      IF c_input_value_id%ISOPEN THEN CLOSE c_input_value_id ; END IF;
1149      IF c_prev_employer_ltc_availed%ISOPEN THEN CLOSE c_prev_employer_ltc_availed ; END IF;
1150      IF c_global_value%ISOPEN THEN CLOSE c_global_value ; END IF;
1151 
1152      pay_in_utils.set_location(g_debug,'Leaving FROM Exception Block : '||l_procedure,120);
1153      p_message_name := 'PER_IN_ORACLE_GENERIC_ERROR';
1154      p_token_name(1) := 'FUNCTION';
1155      p_token_value(1) := l_procedure;
1156      p_token_name(1) := 'SQLERRMC';
1157      p_token_value(1) := sqlerrm;
1158 END check_ltc_entry;
1159 --
1160 -- End of Private Procedures
1161 --
1162 
1163 BEGIN
1164 
1165     l_procedure := g_package ||'check_entry_value';
1166     g_debug := hr_utility.debug_enabled;
1167     pay_in_utils.set_location(g_debug,'Entering: '||l_procedure,10);
1168 
1169     p_message_name := 'SUCCESS';
1170     pay_in_utils.null_message(p_token_name, p_token_value);
1171 
1172     l_get_migrator_status:=hr_general.g_data_migrator_mode;
1173     -- Get the Element Name
1174 
1175     OPEN c_perquisite_name;
1176     FETCH c_perquisite_name INTO l_element_name,l_element_Type_id,l_assignment_id;
1177     CLOSE c_perquisite_name;
1178 
1179     IF (l_element_name IS NULL)
1180     THEN
1181         /*
1182          Check introduced for Leave Travel Conession
1183         */
1184         OPEN  c_element_entry_details(p_element_entry_id);
1185         FETCH c_element_entry_details INTO l_element_start_date,l_element_type_id,l_assignment_id;
1186         CLOSE c_element_entry_details;
1187 
1188         l_inputvalue_id  :=  pay_in_utils.get_input_value_id(l_element_start_date
1189                                                             ,l_element_type_id
1190                                                             ,'Component Name'
1191                                                             );
1192 
1193         OPEN  c_element_entry_values(p_element_entry_id,l_inputvalue_id,l_element_start_date);
1194         FETCH c_element_entry_values INTO l_element_name;
1195         CLOSE c_element_entry_values;
1196 
1197         IF (l_element_name IS NULL)
1198         THEN
1199                 RETURN;
1200         END IF;
1201 
1202     END IF;
1203     pay_in_utils.set_location(g_debug,'Element name is: '||l_element_name,20);
1204     pay_in_utils.set_location(g_debug,'Element_Type_id: '||l_element_Type_id,20);
1205     pay_in_utils.set_location(g_debug,'Assignment_id  : '||l_assignment_id,20);
1206 
1207 
1208     IF l_element_name = 'Loan at Concessional Rate' THEN
1209       check_loan_entry(l_element_name,l_element_Type_id,l_assignment_id);
1210 
1211     ELSIF l_element_name = 'Motor Car Perquisite' THEN
1212       check_benefit_dates(l_element_Type_id);
1213         if g_debug then
1214           pay_in_utils.trace('p_message_name             : ',p_message_name);
1215         end if;
1216       IF p_message_name <>'SUCCESS' THEN  RETURN;  END IF;
1217       check_motorcar_entry(l_element_name,l_element_Type_id,l_assignment_id);
1218        --Bugfix 3982447 Start
1219         if g_debug then
1220           pay_in_utils.trace('p_message_name             : ',p_message_name);
1221         end if;
1222       IF p_message_name <>'SUCCESS' THEN  RETURN;  END IF;
1223 
1224       if g_debug then
1225         pay_in_utils.trace('p_element_entry_id         : ',p_element_entry_id);
1226       end if;
1227 
1228       OPEN c_curr_entry_value  (p_element_entry_id
1229                               ,'Category of Car'
1230 			      ,l_element_type_id );
1231       FETCH c_curr_entry_value INTO  l_dep_value1,l_entry_value_id;
1232       CLOSE c_curr_entry_value;
1233 
1234       if g_debug then
1235         pay_in_utils.trace('l_dep_value1             : ',l_dep_value1);
1236         pay_in_utils.trace('l_entry_value_id         : ',l_entry_value_id);
1237       end if;
1238 
1239       IF l_dep_value1 ='OWN_EMPLOYEE' THEN
1240         OPEN c_curr_entry_value  (p_element_entry_id
1241                                 ,'Operational Expenses by'
1242 		   	        ,l_element_type_id );
1243         FETCH c_curr_entry_value INTO  l_dep_value2,l_entry_value_id;
1244         CLOSE c_curr_entry_value;
1245 
1246       if g_debug then
1247         pay_in_utils.trace('l_dep_value2             : ',l_dep_value2);
1248         pay_in_utils.trace('l_entry_value_id         : ',l_entry_value_id);
1249       end if;
1250 
1251 
1252 	IF l_dep_value2 = 'EMPLOYEE'  THEN
1253           pay_in_utils.null_message(p_token_name, p_token_value);
1254           p_message_name := 'PER_IN_INVALID_PERQUISITE';
1255           pay_in_utils.set_location(g_debug,'Invalid perquisite ...'||l_procedure,25);
1256           RETURN;
1257         END IF;
1258       END IF;
1259       --Bugfix 3982447 End
1260 
1261     ELSIF l_element_name  =  'Company Accommodation' THEN
1262       --
1263 
1264 
1265       -- Start of 'Company Accommodation'
1266       --
1267       check_benefit_dates(l_element_Type_id);
1268 
1269       if g_debug then
1270         pay_in_utils.trace('p_message_name             : ',p_message_name);
1271       end if;
1272 
1273       IF p_message_name <>'SUCCESS' THEN  RETURN;  END IF;
1274 
1275       OPEN c_curr_entry_value  (p_element_entry_id
1276                               ,'Property'
1277 			      ,l_element_type_id );
1278       FETCH c_curr_entry_value INTO  l_dep_value1,l_entry_value_id;
1279       CLOSE c_curr_entry_value;
1280 
1281       if g_debug then
1282         pay_in_utils.trace('l_dep_value1             : ',l_dep_value1);
1283         pay_in_utils.trace('l_entry_value_id         : ',l_entry_value_id);
1284       end if;
1285       --
1286       -- Check value interdependency Start
1287       --
1288       IF l_dep_value1 ='RENT' THEN
1289         OPEN c_curr_entry_value  (p_element_entry_id
1290                                 ,'Rent Paid by Employer'
1291 		   	        ,l_element_type_id );
1292         FETCH c_curr_entry_value INTO  l_dep_value2,l_entry_value_id;
1293         CLOSE c_curr_entry_value;
1294 
1295       if g_debug then
1296         pay_in_utils.trace('l_dep_value2             : ',l_dep_value2);
1297         pay_in_utils.trace('l_entry_value_id         : ',l_entry_value_id);
1298       end if;
1299 
1300 	IF l_dep_value2 IS NULL or l_dep_value2 = 0 THEN
1301           pay_in_utils.null_message(p_token_name, p_token_value);
1302           p_message_name := 'PER_IN_ENTRY_VALUE_ZERO';
1303           p_token_name(1) := 'TOKEN1';
1304           p_token_value(1) := hr_general.decode_lookup('IN_MESSAGE_TOKENS','RENT_EMPLOLYER');
1305 	  p_token_name(2) := 'TOKEN2';
1306           p_token_value(2) := hr_general.decode_lookup('IN_MESSAGE_TOKENS','PROPERTY');
1307 	  p_token_name(3) := 'TOKEN3';
1308           p_token_value(3) := hr_general.decode_lookup('IN_MESSAGE_TOKENS','LEASED');
1309 
1310           pay_in_utils.set_location(g_debug,'Company Accommodation '||l_procedure,25);
1311           RETURN;
1312         END IF;
1313 	-- Bugfix 3991117 Start
1314       ELSIF l_dep_value1 = 'OWN' THEN
1315         OPEN c_curr_entry_value  (p_element_entry_id
1316                                 ,'Rent Paid by Employer'
1317 		   	        ,l_element_type_id );
1318         FETCH c_curr_entry_value INTO  l_dep_value2,l_entry_value_id;
1319         CLOSE c_curr_entry_value;
1320 
1321         if g_debug then
1322           pay_in_utils.trace('l_dep_value2             : ',l_dep_value2);
1323           pay_in_utils.trace('l_entry_value_id         : ',l_entry_value_id);
1324         end if;
1325 
1326 	IF  l_dep_value2 IS NOT NULL AND l_dep_value2 <> 0 THEN
1327           pay_in_utils.null_message(p_token_name, p_token_value);
1328 	  p_message_name  := 'PER_IN_INVALID_ELEMENT_ENTRY';
1329           p_token_name(1) := 'TOKEN';
1330           p_token_value(1):= hr_general.decode_lookup('IN_MESSAGE_TOKENS','COMP_ACC');
1331           pay_in_utils.set_location(g_debug,'Company Accommodation '||l_procedure,28);
1332           RETURN;
1333         END IF;
1334 
1335 
1336       -- Bugfix 3991117 End
1337       END IF;
1338       --
1339       -- Check value interdependency End
1340       --
1341       --
1342       -- End of Company Accommodaiton
1343       --
1344    ELSIF l_element_name ='Company Movable Assets' THEN
1345       check_benefit_dates(l_element_Type_id);
1346 /* Bug Fix 4533671
1347       IF p_message_name <>'SUCCESS' THEN  RETURN;  END IF;
1348       --
1349       --  Start of Company Movable Assets
1350       --
1351       OPEN c_curr_entry_value  (p_element_entry_id
1352                                ,'Usage'
1353 			       ,l_element_type_id );
1354       FETCH c_curr_entry_value INTO  l_dep_value1,l_entry_value_id;
1355       CLOSE c_curr_entry_value;
1356 
1357       --
1358       -- Check value interdependency Start
1359       --
1360       IF l_dep_value1 ='SOLD' THEN
1361         OPEN c_curr_entry_value  (p_element_entry_id
1362                                 ,'Date of Purchase'
1363 			       ,l_element_type_id );
1364         FETCH c_curr_entry_value INTO  l_dep_value2,l_entry_value_id;
1365         CLOSE c_curr_entry_value;
1366 
1367         IF l_dep_value2 IS NULL THEN
1368           pay_in_utils.set_location(g_debug,'ltc '||l_procedure,25);
1369           pay_in_utils.null_message(p_token_name, p_token_value);
1370 	  p_message_name := 'PER_IN_MISSING_ENTRY_VALUE';
1371           p_token_name(1) := 'TOKEN1';
1372           p_token_value(1) := 'Date of Purchase';
1373           p_token_name(2) := 'TOKEN2';
1374           p_token_value(2) := 'Usage';
1375 	  p_token_name(3) := 'TOKEN3';
1376           p_token_value(3) := 'Sold to Employee';
1377           RETURN;
1378         END IF;
1379 	--
1380         -- Check value interdependency End
1381         --
1382       END IF;*/
1383       --
1384       --  End of  Company Movable Assets
1385       --
1386 
1387 
1388     ELSIF l_element_name = 'Leave Travel Concession' THEN
1389       check_ltc_entry(l_element_name,l_element_Type_id,l_assignment_id);
1390     ELSIF l_element_name = 'Free Education' THEN
1391         check_benefit_dates(l_element_Type_id);
1392     END IF;
1393 
1394   pay_in_utils.set_location(g_debug,'Leaving: '||l_procedure,30);
1395   EXCEPTION
1396     WHEN OTHERS THEN
1397      pay_in_utils.set_location(g_debug,'Leaving : '||l_procedure,50);
1398       p_message_name := 'PER_IN_ORACLE_GENERIC_ERROR';
1399       p_token_name(1) := 'FUNCTION';
1400       p_token_value(1) := l_procedure;
1401       p_token_name(2) := 'SQLERRMC';
1402       p_token_value(2) := sqlerrm;
1403    END check_element_entry;
1404 
1405   END per_in_perquisite_pkg;