DBA Data[Home] [Help]

PACKAGE BODY: APPS.BEN_DERIVE_PART_AND_RATE_CACHE

Source


1 PACKAGE BODY ben_derive_part_and_rate_cache AS
2 /* $Header: bendrpac.pkb 120.1 2005/08/05 11:44:59 mmudigon noship $ */
3 --------------------------------------------------------------------------------
4 /*
5 +==============================================================================+
6 |			Copyright (c) 1997 Oracle Corporation		       |
7 |			   Redwood Shores, California, USA		       |
8 |			        All rights reserved.			       |
9 +==============================================================================+
10 --
11 Name
12 	Derive Participation and Rate Cache Routine
13 Purpose
14         This package is used to return or retrieve information that is
15         needed for rates and or factors.
16 History
17         Date             Who        Version    What?
18         ----             ---        -------    -----
19         23 Nov 98        G Perry    115.0      Created.
20         20 Dec 98        G Perry    115.1      Support for hours worked.
21         17 Feb 99        G Perry    115.2      Changed hours worked cursor so
22                                                it selects once_r_cntug_cd.
23         04 May 99        G Perry    115.3      Cache support for PTIP, PLIP.
24                                                Added in hashing utility.
25         06 May 99        G Perry    115.4      Backport for Fidelity.
26         06 May 99        G Perry    115.5      Leapfrog from 115.3
27         04 Aug 99        T Guy      115.6      Enhanced Base Age calc to take
28                                                into account spouse/child DOB
29         23 Aug 99        G Perry    115.6      Added nocopy compiler directive.
30                                                Removed trace messages.
31                                                Hashing done locally.
32         06 Oct 99        mhoyes     115.8    - Tuned c1 cursors in,
33                                                - get_age_plip_rate
34                                                - get_age_ptip_rate
35         10 Jan 00        pbodla     115.9    - Added los_calc_rl to c1 cursor in
36                                                get_los_pgm_elig, get_los_pl_elig
37                                                get_los_plip_elig, get_los_ptip_elig,
38                                                get_los_pgm_elig ,
39                                                get_los_stated   , get_los_pgm_rate ,
40                                                get_los_pl_rate  , get_los_oipl_rate,
41                                                get_los_plip_rate, get_los_ptip_rate
42         24 Jan 00        lmcdonal   115.10     Add hrs_wkd_calc_rl to hwf and
43                                                comp_calc_rl to clf.  Bugs
44                                                1118118, 1118113.
45         07 Mar 00        gperry     115.11     Fixes for WWBUG 1195803.
46         31 Mar 00        gperry     115.12     Added oiplip support.
47         13 May 00        mhoyes     115.13   - CBO tuning. Removed business group
48                                                restrictions from get_age_???_elig
49                                                get_comp_???_elig cursors.
50                                              - Replaced all binary_integer datatypes
51                                                with pls_integer datatyps.
52         26 Jun 00        gperry     115.14     Added age_calc_rl support.
53         03 Aug 00        mhoyes     115.15   - General tuning. Removed business
54                                                group restrictions.
55         17-jan-01        tilak      115.16     derive factor maximaum validated with < max +  1
56         16-Nov-01        ikasire    115.17     Bug 2101937 - Fixed the error in the ceil
57                                                condition of version 116.2 in all cursors.
58         08-Oct-02        kmahendr   115.18     Added parameters to get_los_elig,get_los_pgm_elig
59                                                get_los_ptip_elig, get_los_plip_elig, get_los_pl_elig
60                                                get_los_oipl_elig and modified cursor c1
61         08-Oct-02        kmahendr   115.19     Added dbdrv lines
62         09-Oct-02        kmahendr   115.20     added parameters in call to get_los_pl_elig,
63                                                get_los_plip_elig, get_los_ptip_elig
64         18-Oct-02        kmahendr   115.21     Added old_val, new_val parameters to other
65                                                derived factors
66         22-Oct-02        ikasire    115.22     Bug 2502763 added more parameters to clf routines
67         16-Mar-02        tjesumic   115.23     bug 2853140 age factor changes.
68         18-Mar-02        ikasire    115.24     Bug 2853140 Modifed the cursors to get
69                                                a row when both old and new values also
70                                                in the same range.
71                                                Added validation to update only first time for
72                                                each comp object with N in exist.
73         19-May-2003      ikasire    115.25     Option Level Rates Enhancements
74         30-Jun-2003      ikasire    115.27     Elpro Vapro Data model changes
75         19-Aug-2003      mmudigon   115.28     gscc fix
76         16-Oct-2003      rpgupta    115.29     Bug 3188198
77         				       Uncommented 'and p_old_val < lsf.mn_los_num'
78         				       in cursor c1 at all levels
79         				       Now the cursor would return only one row and
80         				       hence the ptnl le would be detected at all
81         				       stages.
82 
83         28-Jul-2004     bmanyam     115.30      Bug 3761038. Split UNIONed queryies into 2.
84                                                 Search Text "PERFNEW".
85         05-Aug-2005     mmudigon    115.31      Bug 4518047. Removed hr_utility
86                                                 statements at lines 305,306 and
87                                                 307
88 */
89 --------------------------------------------------------------------------------
90 --
91   g_package   VARCHAR2(80) := 'ben_derive_part_and_rate_cache';
92   g_hash_key  NUMBER       := ben_hash_utility.get_hash_key;
93   g_hash_jump NUMBER       := ben_hash_utility.get_hash_jump;
94   --
95   --Private function to get opt_id from the oipl_id
96   --Option level rates enhancements
97   --
98   FUNCTION get_opt_id(p_oipl_id number,p_effective_date date) return number
99     is
100       --
101       l_opt_id number ;
102       cursor c_opt(p_oipl_id number,p_effective_date date) is
103         select opt_id
104         from ben_oipl_f otp
105         where otp.oipl_id = p_oipl_id
106         and   p_effective_date between otp.effective_start_date
107                                   and otp.effective_end_date ;
108       --
109     begin
110      --
111      open c_opt(p_oipl_id,p_effective_date) ;
112        --
113        fetch c_opt into l_opt_id ;
114        --
115      close c_opt;
116      --
117      return l_opt_id ;
118      --
119   END get_opt_id;
120   --
121   --
122   PROCEDURE get_los_pgm_elig(
123     p_pgm_id            IN            NUMBER
124    ,p_old_val           in            number  default null
125    ,p_new_val           in            number  default null
126    ,p_business_group_id IN            NUMBER
127    ,p_effective_date    IN            DATE
128    ,p_rec               OUT NOCOPY    g_cache_los_rec_obj) IS
129     --
130     l_package        VARCHAR2(80) := g_package || '.get_los_pgm_elig';
131     --
132     -- Define Cursor
133     --
134     CURSOR c1 IS
135       SELECT   p_pgm_id
136               ,'Y'
137               ,lsf.los_det_cd
138               ,lsf.los_dt_to_use_cd
139               ,lsf.use_overid_svc_dt_flag
140               ,lsf.los_uom
141               ,lsf.los_det_rl
142               ,lsf.los_dt_to_use_rl
143               ,lsf.los_calc_rl
144               ,lsf.rndg_cd
145               ,lsf.rndg_rl
146               ,lsf.mn_los_num
147               ,lsf.mx_los_num
148       FROM     ben_los_fctr lsf
149               ,ben_elig_los_prte_f els
150               ,ben_eligy_prfl_f elp
151               ,ben_prtn_elig_prfl_f cep
152               ,ben_prtn_elig_f epa
153       WHERE    epa.pgm_id = p_pgm_id
154       AND      p_effective_date BETWEEN epa.effective_start_date
155                    AND epa.effective_end_date
156       AND      epa.prtn_elig_id = cep.prtn_elig_id
157       AND      p_effective_date BETWEEN cep.effective_start_date
158                    AND cep.effective_end_date
159       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
160       AND      p_effective_date BETWEEN elp.effective_start_date
161                    AND elp.effective_end_date
162       AND      els.eligy_prfl_id = elp.eligy_prfl_id
163       AND      p_effective_date BETWEEN els.effective_start_date
164                    AND els.effective_end_date
165       AND      els.los_fctr_id = lsf.los_fctr_id
166       AND     (
167                  (
168                    p_new_val IS NOT NULL
169                    AND p_old_val IS NOT NULL
170                    AND p_new_val >= NVL(lsf.mn_los_num ,p_new_val)
171                    and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
172                                     trunc(nvl(lsf.mx_los_num,p_new_val))
173                  ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
174                   nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
175                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )
176                    and p_old_val < lsf.mn_los_num -- uncommented this -- bug 3188198
177                   )
178                  OR
179                  (
180                    p_new_val IS NOT NULL
181                    AND p_old_val IS NOT NULL
182                    AND
183                    (
184                     p_new_val < NVL(lsf.mn_los_num,p_new_val)
185                     OR
186                     p_new_val >=   decode(nvl(lsf.mx_los_num,p_new_val) ,
187                                     trunc(nvl(lsf.mx_los_num,p_new_val))
188                    ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
189                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
190                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )
191                      )
192                     AND p_old_val >= NVL(lsf.mn_los_num ,p_old_val)
193                     and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
194                                     trunc(nvl(lsf.mx_los_num,p_old_val))
195                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
196                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
197                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )
198                   )
199                  OR
200                   (  p_new_val IS NULL
201                      AND p_old_val IS NULL
202                    )
203             ) ;
204     --
205     l_index          PLS_INTEGER;
206     l_not_hash_found BOOLEAN;
207     l_prev_index     PLS_INTEGER;
208   --
209   BEGIN
210     --
211     hr_utility.set_location ('Entering '||l_package,10);
212     hr_utility.set_location ('p_old_val '||p_old_val,10);
213     hr_utility.set_location ('p_new_val '||p_new_val,10);
214 
215     --
216     -- Steps to do process
217     --
218     -- 1) Try and get value from cache
219     -- 2) If can get from cache then copy to output record
220     -- 3) If can't get from cache do db hit and then
221     --    copy to cache record and then copy to output record.
222     --
223     -- Get hashed index value
224     --
225     l_index  := MOD(p_pgm_id
226                  ,g_hash_key);
227     --
228     IF NOT g_cache_pgm_los_el_rec.EXISTS(l_index) THEN
229       --
230       -- Lets store the hash value in this index
231       hr_utility.set_location ('raise ndf ',10);
232       --
233       RAISE NO_DATA_FOUND;
234     --
235     ELSE
236       --
237       -- If it does exist make sure its the right one
238       --
239       IF g_cache_pgm_los_el_rec(l_index).id <> p_pgm_id THEN
240         --
241         -- Loop through the hash using the jump routine to check further
242         -- indexes
243         --
244         l_not_hash_found  := FALSE;
245         --
246         WHILE NOT l_not_hash_found LOOP
247           --
248           l_index  := l_index + g_hash_jump;
249           --
250           -- Check if the hash index exists, if not we can use it
251           --
252           IF NOT g_cache_pgm_los_el_rec.EXISTS(l_index) THEN
253             --
254             -- Lets store the hash value in the index
255             hr_utility.set_location ('raise ndf ',20);
256             --
257             RAISE NO_DATA_FOUND;
258           --
259           ELSE
260             --
261             -- Make sure the index is the correct one
262             --
263             IF g_cache_pgm_los_el_rec(l_index).id = p_pgm_id THEN
264               --
265               -- We have a match so the hashed value  has been stored before
266               --
267               l_not_hash_found  := TRUE;
268             --
269             END IF;
270           --
271           END IF;
272         --
273         END LOOP;
274       --
275       END IF;
276     --
277     END IF;
278     --
279     IF     p_old_val IS NOT NULL
280        AND p_new_val IS NOT NULL THEN
281       --
282       hr_utility.set_location ('raise ndf ',30);
283       RAISE NO_DATA_FOUND;
284     --
285     END IF;
286 
287     p_rec    := g_cache_pgm_los_el_rec(l_index);
288   --
289    hr_utility.set_location ('Leaving '||l_package,10);
290   --
291   EXCEPTION
292     --
293     WHEN NO_DATA_FOUND THEN
294       --
295       -- The record has not been cached yet so lets cache it
296       --
297       OPEN c1;
298       --
299       FETCH c1 INTO g_cache_pgm_los_el_rec(l_index);
300 
301       IF c1%NOTFOUND THEN
302         --
303         -- We store the value of the PK in the id so we know that there is
304         -- no value for this PK.
308         --
305         -- Bug 2853140 This needs to be set only called first time.
306         -- If found once with p_old_val and p_new_val both passed as
307         -- null, we should not reset this to N again.
309         if NOT g_cache_pgm_los_el_rec.EXISTS(l_index) then
310           --
311           g_cache_pgm_los_el_rec(l_index).id     := p_pgm_id;
312           g_cache_pgm_los_el_rec(l_index).exist  := 'N';
313           --
314         end if;
315         --
316       END IF;
317       --
318       p_rec  := g_cache_pgm_los_el_rec(l_index);
319       --
320       CLOSE c1;
321   --
322   END get_los_pgm_elig;
323 --
324   PROCEDURE get_los_pl_elig(
325     p_pl_id             IN            NUMBER
326    ,p_old_val           in            number  default null
327    ,p_new_val           in            number  default null
328    ,p_business_group_id IN            NUMBER
329    ,p_effective_date    IN            DATE
330    ,p_rec               OUT NOCOPY    g_cache_los_rec_obj) IS
331     --
332     l_package        VARCHAR2(80) := g_package || '.get_los_pl_elig';
333     --
334     -- Define Cursor
335     --
336     CURSOR c1 IS
337       SELECT   p_pl_id
338               ,'Y'
339               ,lsf.los_det_cd
340               ,lsf.los_dt_to_use_cd
341               ,lsf.use_overid_svc_dt_flag
342               ,lsf.los_uom
343               ,lsf.los_det_rl
344               ,lsf.los_dt_to_use_rl
345               ,lsf.los_calc_rl
346               ,lsf.rndg_cd
347               ,lsf.rndg_rl
348               ,lsf.mn_los_num
349               ,lsf.mx_los_num
350       FROM     ben_los_fctr lsf
351               ,ben_elig_los_prte_f els
352               ,ben_eligy_prfl_f elp
353               ,ben_prtn_elig_prfl_f cep
354               ,ben_prtn_elig_f epa
355       WHERE    epa.pl_id = p_pl_id
356       AND      p_effective_date BETWEEN epa.effective_start_date
357                    AND epa.effective_end_date
358       AND      epa.prtn_elig_id = cep.prtn_elig_id
359       AND      p_effective_date BETWEEN cep.effective_start_date
360                    AND cep.effective_end_date
361       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
362       AND      p_effective_date BETWEEN elp.effective_start_date
363                    AND elp.effective_end_date
364       AND      els.eligy_prfl_id = elp.eligy_prfl_id
365       AND      p_effective_date BETWEEN els.effective_start_date
366                    AND els.effective_end_date
367       AND      els.los_fctr_id = lsf.los_fctr_id
368       AND     (
369                  (
370                    p_new_val IS NOT NULL
371                    AND p_old_val IS NOT NULL
372                    AND p_new_val >= NVL(lsf.mn_los_num ,p_new_val)
373                    and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
374                                     trunc(nvl(lsf.mx_los_num,p_new_val))
375                  ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
376                   nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
377                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )
378                    and p_old_val < lsf.mn_los_num -- uncommented this -- bug 3188198
379                   )
380                  OR
381                  (
382                    p_new_val IS NOT NULL
383                    AND p_old_val IS NOT NULL
384                    AND
385                    (
386                     p_new_val < NVL(lsf.mn_los_num,p_new_val)
387                     OR
388                     p_new_val >=   decode(nvl(lsf.mx_los_num,p_new_val) ,
389                                     trunc(nvl(lsf.mx_los_num,p_new_val))
390                    ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
391                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
392                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )
393                      )
394                     AND p_old_val >= NVL(lsf.mn_los_num ,p_old_val)
395                     and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
396                                     trunc(nvl(lsf.mx_los_num,p_old_val))
397                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
398                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
399                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )
400      )
401                  OR
402                   (  p_new_val IS NULL
403                      AND p_old_val IS NULL
404                    )
405             ) ;
406     --
407     l_index          PLS_INTEGER;
408     l_not_hash_found BOOLEAN;
409   --
410   BEGIN
411     --
412     -- hr_utility.set_location ('Entering '||l_package,10);
413     --
414     -- Steps to do process
415     --
416     -- 1) Try and get value from cache
417     -- 2) If can get from cache then copy to output record
418     -- 3) If can't get from cache do db hit and then
419     --    copy to cache record and then copy to output record.
420     --
421     -- Get hashed index value
422     --
423     l_index  := MOD(p_pl_id
424                  ,g_hash_key);
425     --
426     IF NOT g_cache_pl_los_el_rec.EXISTS(l_index) THEN
427       --
428       -- Lets store the hash value in this index
432     ELSE
429       --
430       RAISE NO_DATA_FOUND;
431     --
433       --
434       -- If it does exist make sure its the right one
435       --
436       IF g_cache_pl_los_el_rec(l_index).id <> p_pl_id THEN
437         --
438         -- Loop through the hash using the jump routine to check further
439         -- indexes
440         --
441         l_not_hash_found  := FALSE;
442         --
443         WHILE NOT l_not_hash_found LOOP
444           --
445           l_index  := l_index + g_hash_jump;
446           --
447           -- Check if the hash index exists, if not we can use it
448           --
449           IF NOT g_cache_pl_los_el_rec.EXISTS(l_index) THEN
450             --
451             -- Lets store the hash value in the index
452             --
453             RAISE NO_DATA_FOUND;
454           --
455           ELSE
456             --
457             -- Make sure the index is the correct one
458             --
459             IF g_cache_pl_los_el_rec(l_index).id = p_pl_id THEN
460               --
461               -- We have a match so the hashed value  has been stored before
462               --
463               l_not_hash_found  := TRUE;
464             --
465             END IF;
466           --
467           END IF;
468         --
469         END LOOP;
470       --
471       END IF;
472     --
473     END IF;
474     --
475     IF  p_old_val IS NOT NULL
476            AND p_new_val IS NOT NULL THEN
477       --
478       RAISE NO_DATA_FOUND;
479     --
480     END IF;
481     p_rec    := g_cache_pl_los_el_rec(l_index);
482   --
483   -- hr_utility.set_location ('Leaving '||l_package,10);
484   --
485   EXCEPTION
486     --
487     WHEN NO_DATA_FOUND THEN
488       --
489       -- The record has not been cached yet so lets cache it
490       --
491       OPEN c1;
492       --
493       FETCH c1 INTO g_cache_pl_los_el_rec(l_index);
494       IF c1%NOTFOUND THEN
495         --
496         -- Bug 2853140 This needs to be set only called first time.
497         -- If found once with p_old_val and p_new_val both passed as
498         -- null, we should not reset this to N again.
499         if NOT g_cache_pl_los_el_rec.EXISTS(l_index) then
500           --
501           g_cache_pl_los_el_rec(l_index).id     := p_pl_id;
502           g_cache_pl_los_el_rec(l_index).exist  := 'N';
503           --
504         end if ;
505       --
506       END IF;
507       --
508       p_rec  := g_cache_pl_los_el_rec(l_index);
509       --
510       CLOSE c1;
511   --
512   END get_los_pl_elig;
513 --
514   PROCEDURE get_los_oipl_elig(
515     p_oipl_id           IN            NUMBER
516    ,p_old_val           in            number  default null
517    ,p_new_val           in            number  default null
518    ,p_business_group_id IN            NUMBER
519    ,p_effective_date    IN            DATE
520    ,p_rec               OUT NOCOPY    g_cache_los_rec_obj) IS
521     --
522     l_package        VARCHAR2(80) := g_package || '.get_los_oipl_elig';
523     --
524     -- Define Cursor
525     --
526     CURSOR c1 IS
527       SELECT   p_oipl_id
528               ,'Y'
529               ,lsf.los_det_cd
530               ,lsf.los_dt_to_use_cd
531               ,lsf.use_overid_svc_dt_flag
532               ,lsf.los_uom
533               ,lsf.los_det_rl
534               ,lsf.los_dt_to_use_rl
535               ,lsf.los_calc_rl
536               ,lsf.rndg_cd
537               ,lsf.rndg_rl
538               ,lsf.mn_los_num
539               ,lsf.mx_los_num
540       FROM     ben_los_fctr lsf
541               ,ben_elig_los_prte_f els
542               ,ben_eligy_prfl_f elp
543               ,ben_prtn_elig_prfl_f cep
544               ,ben_prtn_elig_f epa
545       WHERE    epa.oipl_id = p_oipl_id
546       AND      p_effective_date BETWEEN epa.effective_start_date
547                    AND epa.effective_end_date
548       AND      epa.prtn_elig_id = cep.prtn_elig_id
549       AND      p_effective_date BETWEEN cep.effective_start_date
550                    AND cep.effective_end_date
551       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
552       AND      p_effective_date BETWEEN elp.effective_start_date
553                    AND elp.effective_end_date
554       AND      els.eligy_prfl_id = elp.eligy_prfl_id
555       AND      p_effective_date BETWEEN els.effective_start_date
556                    AND els.effective_end_date
557       AND      els.los_fctr_id = lsf.los_fctr_id
558       AND     (
559                  (
560                    p_new_val IS NOT NULL
561                    AND p_old_val IS NOT NULL
562                    AND p_new_val >= NVL(lsf.mn_los_num ,p_new_val)
563                    and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
564                                     trunc(nvl(lsf.mx_los_num,p_new_val))
565                  ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
566                   nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
567                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )
568                    and p_old_val < lsf.mn_los_num -- uncommented this -- bug 3188198
569                   )
570                  OR
571                  (
572                    p_new_val IS NOT NULL
576                     p_new_val < NVL(lsf.mn_los_num,p_new_val)
573                    AND p_old_val IS NOT NULL
574                    AND
575                    (
577                     OR
578                     p_new_val >=   decode(nvl(lsf.mx_los_num,p_new_val) ,
579                                     trunc(nvl(lsf.mx_los_num,p_new_val))
580                    ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
581                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
582                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )
583                      )
584                     AND p_old_val >= NVL(lsf.mn_los_num ,p_old_val)
585                     and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
586                                     trunc(nvl(lsf.mx_los_num,p_old_val))
587                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
588                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
589                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )
590      )
591                  OR
592                   (  p_new_val IS NULL
593                      AND p_old_val IS NULL
594                    )
595             ) ;
596     --
597     l_index          PLS_INTEGER;
598     l_not_hash_found BOOLEAN;
599   --
600   BEGIN
601     --
602     -- hr_utility.set_location ('Entering '||l_package,10);
603     --
604     -- Steps to do process
605     --
606     -- 1) Try and get value from cache
607     -- 2) If can get from cache then copy to output record
608     -- 3) If can't get from cache do db hit and then
609     --    copy to cache record and then copy to output record.
610     --
611     -- Get hashed index value
612     --
613     l_index  := MOD(p_oipl_id
614                  ,g_hash_key);
615     --
616     IF NOT g_cache_oipl_los_el_rec.EXISTS(l_index) THEN
617       --
618       -- Lets store the hash value in this index
619       --
620       RAISE NO_DATA_FOUND;
621     --
622     ELSE
623       --
624       -- If it does exist make sure its the right one
625       --
626       IF g_cache_oipl_los_el_rec(l_index).id <> p_oipl_id THEN
627         --
628         -- Loop through the hash using the jump routine to check further
629         -- indexes
630         --
631         l_not_hash_found  := FALSE;
632         --
633         WHILE NOT l_not_hash_found LOOP
634           --
635           l_index  := l_index + g_hash_jump;
636           --
637           -- Check if the hash index exists, if not we can use it
638           --
639           IF NOT g_cache_oipl_los_el_rec.EXISTS(l_index) THEN
640             --
641             -- Lets store the hash value in the index
642             --
643             RAISE NO_DATA_FOUND;
644           --
645           ELSE
646             --
647             -- Make sure the index is the correct one
648             --
649             IF g_cache_oipl_los_el_rec(l_index).id = p_oipl_id THEN
650               --
651               -- We have a match so the hashed value has been stored before
652               --
653               l_not_hash_found  := TRUE;
654             --
655             END IF;
656           --
657           END IF;
658         --
659         END LOOP;
660       --
661       END IF;
662     --
663     END IF;
664     --
665      IF     p_old_val IS NOT NULL
666        AND p_new_val IS NOT NULL THEN
667       --
668       RAISE NO_DATA_FOUND;
669     --
670     END IF;
671 
672     p_rec    := g_cache_oipl_los_el_rec(l_index);
673   --
674   -- hr_utility.set_location ('Leaving '||l_package,10);
675   --
676   EXCEPTION
677     --
678     WHEN NO_DATA_FOUND THEN
679       --
680       -- The record has not been cached yet so lets cache it
681       --
682       OPEN c1;
683       --
684       FETCH c1 INTO g_cache_oipl_los_el_rec(l_index);
685       IF c1%NOTFOUND THEN
686         --
687         -- We store the value of the PK in the id so we know that there is
688         -- no value for this PK.
689         --
690         -- Bug 2853140 This needs to be set only called first time.
691         -- If found once with p_old_val and p_new_val both passed as
692         -- null, we should not reset this to N again.
693         if NOT g_cache_oipl_los_el_rec.EXISTS(l_index) then
694           --
695           g_cache_oipl_los_el_rec(l_index).id     := p_oipl_id;
696           g_cache_oipl_los_el_rec(l_index).exist  := 'N';
697           --
698         end if;
699       --
700       END IF;
701       --
702       p_rec  := g_cache_oipl_los_el_rec(l_index);
703       --
704       CLOSE c1;
705   --
706   END get_los_oipl_elig;
707 --
708   PROCEDURE get_los_plip_elig(
709     p_plip_id           IN            NUMBER
710    ,p_old_val           in            number  default null
711    ,p_new_val           in            number  default null
712    ,p_business_group_id IN            NUMBER
713    ,p_effective_date    IN            DATE
714    ,p_rec               OUT NOCOPY    g_cache_los_rec_obj) IS
715     --
719     --
716     l_package        VARCHAR2(80) := g_package || '.get_los_plip_elig';
717     --
718     -- Define Cursor
720     CURSOR c1 IS
721       SELECT   p_plip_id
722               ,'Y'
723               ,lsf.los_det_cd
724               ,lsf.los_dt_to_use_cd
725               ,lsf.use_overid_svc_dt_flag
726               ,lsf.los_uom
727               ,lsf.los_det_rl
728               ,lsf.los_dt_to_use_rl
729               ,lsf.los_calc_rl
730               ,lsf.rndg_cd
731               ,lsf.rndg_rl
732               ,lsf.mn_los_num
733               ,lsf.mx_los_num
734       FROM     ben_los_fctr lsf
735               ,ben_elig_los_prte_f els
736               ,ben_eligy_prfl_f elp
737               ,ben_prtn_elig_prfl_f cep
738               ,ben_prtn_elig_f epa
739       WHERE    epa.plip_id = p_plip_id
740       AND      p_effective_date BETWEEN epa.effective_start_date
741                    AND epa.effective_end_date
742       AND      epa.prtn_elig_id = cep.prtn_elig_id
743       AND      p_effective_date BETWEEN cep.effective_start_date
744                    AND cep.effective_end_date
745       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
746       AND      p_effective_date BETWEEN elp.effective_start_date
747                    AND elp.effective_end_date
748       AND      els.eligy_prfl_id = elp.eligy_prfl_id
749       AND      p_effective_date BETWEEN els.effective_start_date
750                    AND els.effective_end_date
751       AND      els.los_fctr_id = lsf.los_fctr_id
752       AND     (
753                  (
754                    p_new_val IS NOT NULL
755                    AND p_old_val IS NOT NULL
756                    AND p_new_val >= NVL(lsf.mn_los_num ,p_new_val)
757                    and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
758                                     trunc(nvl(lsf.mx_los_num,p_new_val))
759                  ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
760                   nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
761                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )
762                    and p_old_val < lsf.mn_los_num -- uncommented this -- bug 3188198
763                   )
764                  OR
765                  (
766                    p_new_val IS NOT NULL
767                    AND p_old_val IS NOT NULL
768                    AND
769                    (
770                     p_new_val < NVL(lsf.mn_los_num,p_new_val)
771                     OR
772                     p_new_val >=   decode(nvl(lsf.mx_los_num,p_new_val) ,
773                                     trunc(nvl(lsf.mx_los_num,p_new_val))
774                    ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
775                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
776                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )
777                      )
778                     AND p_old_val >= NVL(lsf.mn_los_num ,p_old_val)
779                     and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
780                                     trunc(nvl(lsf.mx_los_num,p_old_val))
781                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
782                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
783                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )
784      )
785                  OR
786                   (  p_new_val IS NULL
787                      AND p_old_val IS NULL
788                    )
789             );
790 
791     --
792     l_index          PLS_INTEGER;
793     l_not_hash_found BOOLEAN;
794   --
795   BEGIN
796     --
797     -- hr_utility.set_location ('Entering '||l_package,10);
798     --
799     -- Steps to do process
800     --
801     -- 1) Try and get value from cache
802     -- 2) If can get from cache then copy to output record
803     -- 3) If can't get from cache do db hit and then
804     --    copy to cache record and then copy to output record.
805     --
806     -- Get hashed index value
807     --
808     l_index  := MOD(p_plip_id
809                  ,g_hash_key);
810     --
811     IF NOT g_cache_plip_los_el_rec.EXISTS(l_index) THEN
812       --
813       -- Lets store the hash value in this index
814       --
815       RAISE NO_DATA_FOUND;
816     --
817     ELSE
818       --
819       -- If it does exist make sure its the right one
820       --
821       IF g_cache_plip_los_el_rec(l_index).id <> p_plip_id THEN
822         --
823         -- Loop through the hash using the jump routine to check further
824         -- indexes
825         --
826         l_not_hash_found  := FALSE;
827         --
828         WHILE NOT l_not_hash_found LOOP
829           --
830           l_index  := l_index + g_hash_jump;
831           --
832           -- Check if the hash index exists, if not we can use it
833           --
834           IF NOT g_cache_plip_los_el_rec.EXISTS(l_index) THEN
835             --
836             -- Lets store the hash value in the index
837             --
838             RAISE NO_DATA_FOUND;
839           --
840           ELSE
841             --
842             -- Make sure the index is the correct one
843             --
847               --
844             IF g_cache_plip_los_el_rec(l_index).id = p_plip_id THEN
845               --
846               -- We have a match so the hashed value  has been stored before
848               l_not_hash_found  := TRUE;
849             --
850             END IF;
851           --
852           END IF;
853         --
854         END LOOP;
855       --
856       END IF;
857     --
858     END IF;
859     --
860      IF     p_old_val IS NOT NULL
861        AND p_new_val IS NOT NULL THEN
862       --
863       RAISE NO_DATA_FOUND;
864     --
865     END IF;
866     p_rec    := g_cache_plip_los_el_rec(l_index);
867   --
868   -- hr_utility.set_location ('Leaving '||l_package,10);
869   --
870   EXCEPTION
871     --
872     WHEN NO_DATA_FOUND THEN
873       --
874       -- The record has not been cached yet so lets cache it
875       --
876       OPEN c1;
877       --
878       FETCH c1 INTO g_cache_plip_los_el_rec(l_index);
879       IF c1%NOTFOUND THEN
880         --
881         -- Bug 2853140 This needs to be set only called first time.
882         -- If found once with p_old_val and p_new_val both passed as
883         -- null, we should not reset this to N again.
884         if NOT g_cache_plip_los_el_rec.EXISTS(l_index) then
885           g_cache_plip_los_el_rec(l_index).id     := p_plip_id;
886           g_cache_plip_los_el_rec(l_index).exist  := 'N';
887         end if;
888       --
889       END IF;
890       --
891       p_rec  := g_cache_plip_los_el_rec(l_index);
892       --
893       CLOSE c1;
894   --
895   END get_los_plip_elig;
896 --
897   PROCEDURE get_los_ptip_elig(
898     p_ptip_id           IN            NUMBER
899    ,p_old_val           in            number  default null
900    ,p_new_val           in            number  default null
901    ,p_business_group_id IN            NUMBER
902    ,p_effective_date    IN            DATE
903    ,p_rec               OUT NOCOPY    g_cache_los_rec_obj) IS
904     --
905     l_package        VARCHAR2(80) := g_package || '.get_los_ptip_elig';
906     --
907     -- Define Cursor
908     --
909     CURSOR c1 IS
910       SELECT   p_ptip_id
911               ,'Y'
912               ,lsf.los_det_cd
913               ,lsf.los_dt_to_use_cd
914               ,lsf.use_overid_svc_dt_flag
915               ,lsf.los_uom
916               ,lsf.los_det_rl
917               ,lsf.los_dt_to_use_rl
918               ,lsf.los_calc_rl
919               ,lsf.rndg_cd
920               ,lsf.rndg_rl
921               ,lsf.mn_los_num
922               ,lsf.mx_los_num
923       FROM     ben_los_fctr lsf
924               ,ben_elig_los_prte_f els
925               ,ben_eligy_prfl_f elp
926               ,ben_prtn_elig_prfl_f cep
927               ,ben_prtn_elig_f epa
928       WHERE    epa.ptip_id = p_ptip_id
929       AND      p_effective_date BETWEEN epa.effective_start_date
930                    AND epa.effective_end_date
931       AND      epa.prtn_elig_id = cep.prtn_elig_id
932       AND      p_effective_date BETWEEN cep.effective_start_date
933                    AND cep.effective_end_date
934       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
935       AND      p_effective_date BETWEEN elp.effective_start_date
936                    AND elp.effective_end_date
937       AND      els.eligy_prfl_id = elp.eligy_prfl_id
938       AND      p_effective_date BETWEEN els.effective_start_date
939                    AND els.effective_end_date
940       AND      els.los_fctr_id = lsf.los_fctr_id
941       AND     (
942                  (
943                    p_new_val IS NOT NULL
944                    AND p_old_val IS NOT NULL
945                    AND p_new_val >= NVL(lsf.mn_los_num ,p_new_val)
946                    and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
947                                     trunc(nvl(lsf.mx_los_num,p_new_val))
948                  ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
949                   nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
950                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )
951                    and p_old_val < lsf.mn_los_num -- uncommented this -- bug 3188198
952                   )
953                  OR
954                  (
955                    p_new_val IS NOT NULL
956                    AND p_old_val IS NOT NULL
957                    AND
958                    (
959                     p_new_val < NVL(lsf.mn_los_num,p_new_val)
960                     OR
961                     p_new_val >=   decode(nvl(lsf.mx_los_num,p_new_val) ,
962                                     trunc(nvl(lsf.mx_los_num,p_new_val))
963                    ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
964                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
965                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )
966                      )
967                     AND p_old_val >= NVL(lsf.mn_los_num ,p_old_val)
968                     and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
969                                     trunc(nvl(lsf.mx_los_num,p_old_val))
970                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
974                  OR
971                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
972                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )
973      )
975                   (  p_new_val IS NULL
976                      AND p_old_val IS NULL
977                    )
978             );
979 
980     --
981     l_index          PLS_INTEGER;
982     l_not_hash_found BOOLEAN;
983   --
984   BEGIN
985     --
986     -- hr_utility.set_location ('Entering '||l_package,10);
987     --
988     -- Steps to do process
989     --
990     -- 1) Try and get value from cache
991     -- 2) If can get from cache then copy to output record
992     -- 3) If can't get from cache do db hit and then
993     --    copy to cache record and then copy to output record.
994     --
995     -- Get hashed index value
996     --
997     l_index  := MOD(p_ptip_id
998                  ,g_hash_key);
999     --
1000     IF NOT g_cache_ptip_los_el_rec.EXISTS(l_index) THEN
1001       --
1002       -- Lets store the hash value in this index
1003       --
1004       RAISE NO_DATA_FOUND;
1005     --
1006     ELSE
1007       --
1008       -- If it does exist make sure its the right one
1009       --
1010       IF g_cache_ptip_los_el_rec(l_index).id <> p_ptip_id THEN
1011         --
1012         -- Loop through the hash using the jump routine to check further
1013         -- indexes
1014         --
1015         l_not_hash_found  := FALSE;
1016         --
1017         WHILE NOT l_not_hash_found LOOP
1018           --
1019           l_index  := l_index + g_hash_jump;
1020           --
1021           -- Check if the hash index exists, if not we can use it
1022           --
1023           IF NOT g_cache_ptip_los_el_rec.EXISTS(l_index) THEN
1024             --
1025             -- Lets store the hash value in the index
1026             --
1027             RAISE NO_DATA_FOUND;
1028           --
1029           ELSE
1030             --
1031             -- Make sure the index is the correct one
1032             --
1033             IF g_cache_ptip_los_el_rec(l_index).id = p_ptip_id THEN
1034               --
1035               -- We have a match so the hashed value  has been stored before
1036               --
1037               l_not_hash_found  := TRUE;
1038             --
1039             END IF;
1040           --
1041           END IF;
1042         --
1043         END LOOP;
1044       --
1045       END IF;
1046     --
1047     END IF;
1048     --
1049      IF     p_old_val IS NOT NULL
1050        AND p_new_val IS NOT NULL THEN
1051       --
1052       RAISE NO_DATA_FOUND;
1053     --
1054     END IF;
1055     p_rec    := g_cache_ptip_los_el_rec(l_index);
1056   --
1057   -- hr_utility.set_location ('Leaving '||l_package,10);
1058   --
1059   EXCEPTION
1060     --
1061     WHEN NO_DATA_FOUND THEN
1062       --
1063       -- The record has not been cached yet so lets cache it
1064       --
1065       OPEN c1;
1066       --
1067       FETCH c1 INTO g_cache_ptip_los_el_rec(l_index);
1068       IF c1%NOTFOUND THEN
1069         --
1070         -- Bug 2853140 This needs to be set only called first time.
1071         -- If found once with p_old_val and p_new_val both passed as
1072         -- null, we should not reset this to N again.
1073         if NOT g_cache_ptip_los_el_rec.EXISTS(l_index) then
1074           g_cache_ptip_los_el_rec(l_index).id     := p_ptip_id;
1075           g_cache_ptip_los_el_rec(l_index).exist  := 'N';
1076         end if;
1077       --
1078       END IF;
1079       --
1080       p_rec  := g_cache_ptip_los_el_rec(l_index);
1081       --
1082       CLOSE c1;
1083   --
1084   END get_los_ptip_elig;
1085 --
1086   PROCEDURE get_los_elig(
1087     p_pgm_id            IN            NUMBER
1088    ,p_pl_id             IN            NUMBER
1089    ,p_oipl_id           IN            NUMBER
1090    ,p_plip_id           IN            NUMBER
1091    ,p_ptip_id           IN            NUMBER
1092    ,p_old_val           in            number
1093    ,p_new_val           in            number
1094    ,p_business_group_id IN            NUMBER
1095    ,p_effective_date    IN            DATE
1096    ,p_rec               OUT NOCOPY    g_cache_los_rec_obj) IS
1097     --
1098     l_package VARCHAR2(80) := g_package || '.get_los_elig';
1099   --
1100   BEGIN
1101     --
1102     -- hr_utility.set_location ('Entering '||l_package,10);
1103     --
1104     -- Derive which data type we are dealing with
1105     --
1106     IF p_pgm_id IS NOT NULL THEN
1107       --
1108       get_los_pgm_elig(p_pgm_id=> p_pgm_id
1109        ,p_old_val           => p_old_val
1110        ,p_new_val           => p_new_val
1111        ,p_business_group_id => p_business_group_id
1112        ,p_effective_date    => p_effective_date
1113        ,p_rec               => p_rec);
1114     --
1115     ELSIF p_pl_id IS NOT NULL THEN
1116       --
1117       get_los_pl_elig(p_pl_id=> p_pl_id
1118        ,p_old_val           => p_old_val
1119        ,p_new_val           => p_new_val
1120        ,p_business_group_id => p_business_group_id
1121        ,p_effective_date    => p_effective_date
1125       --
1122        ,p_rec               => p_rec);
1123     --
1124     ELSIF p_oipl_id IS NOT NULL THEN
1126       get_los_oipl_elig(p_oipl_id=> p_oipl_id
1127        ,p_old_val           => p_old_val
1128        ,p_new_val           => p_new_val
1129        ,p_business_group_id => p_business_group_id
1130        ,p_effective_date    => p_effective_date
1131        ,p_rec               => p_rec);
1132     --
1133     ELSIF p_plip_id IS NOT NULL THEN
1134       --
1135       get_los_plip_elig(p_plip_id=> p_plip_id
1136        ,p_old_val           => p_old_val
1137        ,p_new_val           => p_new_val
1138        ,p_business_group_id => p_business_group_id
1139        ,p_effective_date    => p_effective_date
1140        ,p_rec               => p_rec);
1141     --
1142     ELSIF p_ptip_id IS NOT NULL THEN
1143       --
1144       get_los_ptip_elig(p_ptip_id=> p_ptip_id
1145        ,p_old_val           => p_old_val
1146        ,p_new_val           => p_new_val
1147        ,p_business_group_id => p_business_group_id
1148        ,p_effective_date    => p_effective_date
1149        ,p_rec               => p_rec);
1150     --
1151     END IF;
1152   --
1153   -- hr_utility.set_location ('Leaving '||l_package,10);
1154   --
1155   END get_los_elig;
1156 --
1157   PROCEDURE get_los_stated(
1158     p_los_fctr_id       IN            NUMBER
1159    ,p_business_group_id IN            NUMBER
1160    ,p_rec               OUT NOCOPY    g_cache_los_rec_obj) IS
1161     --
1162     l_package        VARCHAR2(80) := g_package || '.get_los_stated';
1163     --
1164     CURSOR c1 IS
1165       SELECT   p_los_fctr_id
1166               ,'Y'
1167               ,lsf.los_det_cd
1168               ,lsf.los_dt_to_use_cd
1169               ,lsf.use_overid_svc_dt_flag
1170               ,lsf.los_uom
1171               ,lsf.los_det_rl
1172               ,lsf.los_dt_to_use_rl
1173               ,lsf.los_calc_rl
1174               ,lsf.rndg_cd
1175               ,lsf.rndg_rl
1176               ,lsf.mn_los_num
1177               ,lsf.mx_los_num
1178       FROM     ben_los_fctr lsf
1179       WHERE    lsf.los_fctr_id = p_los_fctr_id;
1180     --
1181     l_index          PLS_INTEGER;
1182     l_not_hash_found BOOLEAN;
1183   --
1184   BEGIN
1185     --
1186     -- hr_utility.set_location ('Entering '||l_package,10);
1187     --
1188     -- Steps to do process
1189     --
1190     -- 1) Try and get value from cache
1191     -- 2) If can get from cache then copy to output record
1192     -- 3) If can't get from cache do db hit and then
1193     --    copy to cache record and then copy to output record.
1194     --
1195     -- Get hashed index value
1196     --
1197     l_index  := MOD(p_los_fctr_id
1198                  ,g_hash_key);
1199     --
1200     IF NOT g_cache_stated_los_rec.EXISTS(l_index) THEN
1201       --
1202       -- Lets store the hash value in this index
1203       --
1204       RAISE NO_DATA_FOUND;
1205     --
1206     ELSE
1207       --
1208       -- If it does exist make sure its the right one
1209       --
1210       IF g_cache_stated_los_rec(l_index).id <> p_los_fctr_id THEN
1211         --
1212         -- Loop through the hash using the jump routine to check further
1213         -- indexes
1214         --
1215         l_not_hash_found  := FALSE;
1216         --
1217         WHILE NOT l_not_hash_found LOOP
1218           --
1219           l_index  := l_index + g_hash_jump;
1220           --
1221           -- Check if the hash index exists, if not we can use it
1222           --
1223           IF NOT g_cache_stated_los_rec.EXISTS(l_index) THEN
1224             --
1225             -- Lets store the hash value in the index
1226             --
1227             RAISE NO_DATA_FOUND;
1228           --
1229           ELSE
1230             --
1231             -- Make sure the index is the correct one
1232             --
1233             IF g_cache_stated_los_rec(l_index).id = p_los_fctr_id THEN
1234               --
1235               -- We have a match so the hashed value  has been stored before
1236               --
1237               l_not_hash_found  := TRUE;
1238             --
1239             END IF;
1240           --
1241           END IF;
1242         --
1243         END LOOP;
1244       --
1245       END IF;
1246     --
1247     END IF;
1248     --
1249     p_rec    := g_cache_stated_los_rec(l_index);
1250   --
1251   -- hr_utility.set_location ('Leaving '||l_package,10);
1252   --
1253   EXCEPTION
1254     --
1255     WHEN NO_DATA_FOUND THEN
1256       --
1257       -- The record has not been cached yet so lets cache it
1258       --
1259       OPEN c1;
1260       --
1261       FETCH c1 INTO g_cache_stated_los_rec(l_index);
1262       IF c1%NOTFOUND THEN
1263         --
1264         if NOT g_cache_stated_los_rec.EXISTS(l_index) then
1265           g_cache_stated_los_rec(l_index).id     := p_los_fctr_id;
1266           g_cache_stated_los_rec(l_index).exist  := 'N';
1267         end if;
1268       --
1269       END IF;
1270       --
1271       p_rec  := g_cache_stated_los_rec(l_index);
1272       --
1273       CLOSE c1;
1274   --
1275   END get_los_stated;
1276 --
1277   PROCEDURE get_los_pgm_rate(
1278     p_pgm_id            IN            NUMBER
1282    ,p_effective_date    IN            DATE
1279    ,p_old_val           IN            NUMBER DEFAULT NULL
1280    ,p_new_val           IN            NUMBER DEFAULT NULL
1281    ,p_business_group_id IN            NUMBER
1283    ,p_rec               OUT NOCOPY    g_cache_los_rec_obj) IS
1284     --
1285     l_package        VARCHAR2(80) := g_package || '.get_los_pgm_rate';
1286     --
1287     l_old_val_1 NUMBER := p_old_val + 1;
1288     l_new_val_1 NUMBER := p_new_val + 1;
1289     --
1290     -- Define Cursor
1291     --
1292     CURSOR c1 IS
1293       SELECT   p_pgm_id
1294               ,'Y'
1295               ,lsf.los_det_cd
1296               ,lsf.los_dt_to_use_cd
1297               ,lsf.use_overid_svc_dt_flag
1298               ,lsf.los_uom
1299               ,lsf.los_det_rl
1300               ,lsf.los_dt_to_use_rl
1301               ,lsf.los_calc_rl
1302               ,lsf.rndg_cd
1303               ,lsf.rndg_rl
1304               ,lsf.mn_los_num
1305               ,lsf.mx_los_num
1306       FROM     ben_los_fctr lsf
1307               ,ben_los_rt_f lsr
1308               ,ben_vrbl_rt_prfl_f vpf
1309               ,ben_acty_vrbl_rt_f avr
1310               ,ben_acty_base_rt_f abr
1311       WHERE    abr.pgm_id = p_pgm_id
1312       AND      p_effective_date BETWEEN abr.effective_start_date
1313                    AND abr.effective_end_date
1314       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
1315       AND      p_effective_date BETWEEN avr.effective_start_date
1316                    AND avr.effective_end_date
1317       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
1318       AND      p_effective_date BETWEEN vpf.effective_start_date
1319                    AND vpf.effective_end_date
1320       AND      vpf.vrbl_rt_prfl_id = lsr.vrbl_rt_prfl_id
1321       AND      p_effective_date BETWEEN lsr.effective_start_date
1322                    AND lsr.effective_end_date
1323       AND      lsr.los_fctr_id = lsf.los_fctr_id
1324       AND      (
1325                  (
1326                           p_new_val IS NOT NULL
1327                       AND p_old_val IS NOT NULL
1328                       AND p_new_val >= NVL(lsf.mn_los_num
1329                                         ,p_new_val)
1330                      -- AND p_new_val < ceil( NVL(lsf.mx_los_num ,p_new_val) + 0.001)
1331                  and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
1332                                     trunc(nvl(lsf.mx_los_num,p_new_val))
1333                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
1334                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
1335                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
1336                  OR (
1337                           p_new_val IS NOT NULL
1338                       AND p_old_val IS NOT NULL
1339                       AND (
1340                                p_new_val < NVL(lsf.mn_los_num
1341                                             ,p_new_val)
1342                  --           OR p_new_val >= ceil( NVL(lsf.mx_los_num
1343                  --                            ,p_new_val )) + 0.001 )
1344                  OR p_new_val >=   decode(nvl(lsf.mx_los_num,p_new_val) ,
1345                                     trunc(nvl(lsf.mx_los_num,p_new_val))
1346                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
1347                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
1348                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
1349                       AND p_old_val >= NVL(lsf.mn_los_num
1350                                         ,p_old_val)
1351                   --    AND p_old_val < ceil( NVL(lsf.mx_los_num
1352                   --                     ,p_old_val)) + 0.001 )
1353                 and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
1354                                     trunc(nvl(lsf.mx_los_num,p_old_val))
1355                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
1356                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
1357                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )  )
1358                  OR (    p_new_val IS NULL
1359                      AND p_old_val IS NULL));
1360     /*  UNION ALL  PERFNEW - Following part should become the cursor c2 */
1361     CURSOR c2 IS
1362       SELECT   p_pgm_id
1363               ,'Y'
1364               ,lsf.los_det_cd
1365               ,lsf.los_dt_to_use_cd
1366               ,lsf.use_overid_svc_dt_flag
1367               ,lsf.los_uom
1368               ,lsf.los_det_rl
1369               ,lsf.los_dt_to_use_rl
1370               ,lsf.los_calc_rl
1374               ,lsf.mx_los_num
1371               ,lsf.rndg_cd
1372               ,lsf.rndg_rl
1373               ,lsf.mn_los_num
1375       FROM    ben_los_fctr lsf
1376               --NEW
1377               --,ben_los_rt_f lsr
1378               ,ben_elig_los_prte_f els
1379               ,ben_eligy_prfl_f elp
1380               ,ben_vrbl_rt_elig_prfl_f vep
1381               --NEW
1382               ,ben_vrbl_rt_prfl_f vpf
1383               ,ben_acty_vrbl_rt_f avr
1384               ,ben_acty_base_rt_f abr
1385       WHERE    abr.pgm_id = p_pgm_id
1386       AND      p_effective_date BETWEEN abr.effective_start_date
1387                    AND abr.effective_end_date
1388       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
1389       AND      p_effective_date BETWEEN avr.effective_start_date
1390                    AND avr.effective_end_date
1391       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
1392       AND      p_effective_date BETWEEN vpf.effective_start_date
1393                    AND vpf.effective_end_date
1394       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
1395       AND      p_effective_date BETWEEN vep.effective_start_date
1396                    AND vep.effective_end_date
1397       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
1398       AND      p_effective_date BETWEEN elp.effective_start_date
1399                    AND elp.effective_end_date
1400       AND      els.eligy_prfl_id = elp.eligy_prfl_id
1401       AND      p_effective_date BETWEEN els.effective_start_date
1402                    AND els.effective_end_date
1403       AND      els.los_fctr_id = lsf.los_fctr_id
1404       AND      (
1405                  (
1406                           p_new_val IS NOT NULL
1407                       AND p_old_val IS NOT NULL
1408                       AND p_new_val >= NVL(lsf.mn_los_num
1409                                         ,p_new_val)
1410                      -- AND p_new_val < ceil( NVL(lsf.mx_los_num ,p_new_val) + 0.001)
1411                  and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
1412                                     trunc(nvl(lsf.mx_los_num,p_new_val))
1413                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
1414                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
1415                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
1416                  OR (
1417                           p_new_val IS NOT NULL
1418                       AND p_old_val IS NOT NULL
1419                       AND (
1420                                p_new_val < NVL(lsf.mn_los_num
1421                                             ,p_new_val)
1422                  --           OR p_new_val >= ceil( NVL(lsf.mx_los_num
1423                  --                            ,p_new_val )) + 0.001 )
1424                  OR p_new_val >=   decode(nvl(lsf.mx_los_num,p_new_val) ,
1425                                     trunc(nvl(lsf.mx_los_num,p_new_val))
1426                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
1427                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
1428                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
1429                       AND p_old_val >= NVL(lsf.mn_los_num
1430                                         ,p_old_val)
1431                   --    AND p_old_val < ceil( NVL(lsf.mx_los_num
1432                   --                     ,p_old_val)) + 0.001 )
1433                 and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
1434                                     trunc(nvl(lsf.mx_los_num,p_old_val))
1435                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
1436                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
1437                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )  )
1438                  OR (    p_new_val IS NULL
1439                      AND p_old_val IS NULL));
1440     --
1441     l_index          PLS_INTEGER;
1442     l_not_hash_found BOOLEAN;
1443     l_c2notfound       BOOLEAN;
1444   --
1445   BEGIN
1446     --
1447     -- hr_utility.set_location ('Entering '||l_package,10);
1448     --
1449     -- Steps to do process
1450     --
1451     -- 1) Try and get value from cache
1452     -- 2) If can get from cache then copy to output record
1453     -- 3) If can't get from cache do db hit and then
1454     --    copy to cache record and then copy to output record.
1455     --
1456     -- Get hashed index value
1457     --
1458     l_index  := MOD(p_pgm_id
1459                  ,g_hash_key);
1460     --
1461     IF NOT g_cache_pgm_los_rt_rec.EXISTS(l_index) THEN
1462       --
1463       -- Lets store the hash value in this index
1464       --
1465       RAISE NO_DATA_FOUND;
1466     --
1467     ELSE
1468       --
1469       -- If it does exist make sure its the right one
1470       --
1471       IF g_cache_pgm_los_rt_rec(l_index).id <> p_pgm_id THEN
1472         --
1473         -- Loop through the hash using the jump routine to check further
1474         -- indexes
1475         --
1476         l_not_hash_found  := FALSE;
1477         --
1478         WHILE NOT l_not_hash_found LOOP
1479           --
1480           l_index  := l_index + g_hash_jump;
1481           --
1482           -- Check if the hash index exists, if not we can use it
1483           --
1484           IF NOT g_cache_pgm_los_rt_rec.EXISTS(l_index) THEN
1485             --
1489           --
1486             -- Lets store the hash value in the index
1487             --
1488             RAISE NO_DATA_FOUND;
1490           ELSE
1491             --
1492             -- Make sure the index is the correct one
1493             --
1494             IF g_cache_pgm_los_rt_rec(l_index).id = p_pgm_id THEN
1495               --
1496               -- We have a match so the hashed value  has been stored before
1497               --
1498               l_not_hash_found  := TRUE;
1499             --
1500             END IF;
1501           --
1502           END IF;
1503         --
1504         END LOOP;
1505       --
1506       END IF;
1507     --
1508     END IF;
1509     --
1510     -- If p_new_val and p_old_val set this means we are trying to retrieve
1511     -- the correct rate for the calculated value. Previously we just cached
1512     -- the first rate we found since we needed the determination code, the
1513     -- correct age,los code,etc
1514     -- By killing the cache and forcing the value to be removed we cache the
1515     -- correct rate profile for the case we need.
1516     --
1517     IF     p_old_val IS NOT NULL
1518        AND p_new_val IS NOT NULL THEN
1519       --
1520       RAISE NO_DATA_FOUND;
1521     --
1522     END IF;
1523     --
1524     p_rec    := g_cache_pgm_los_rt_rec(l_index);
1525   --
1526   -- hr_utility.set_location ('Leaving '||l_package,10);
1527   --
1528   EXCEPTION
1529     --
1530     WHEN NO_DATA_FOUND THEN
1531       --
1532       -- The record has not been cached yet so lets cache it
1533       --
1534       OPEN c1;
1535       --
1536       FETCH c1 INTO g_cache_pgm_los_rt_rec(l_index);
1537       -- PERFNEW
1538       IF c1%NOTFOUND THEN
1539          --
1540          l_c2notfound := false;
1541          OPEN c2;
1542          FETCH c2 INTO g_cache_pgm_los_rt_rec(l_index);
1543          IF c2%NOTFOUND THEN
1544             --
1545             l_c2notfound := true;
1546             --
1547          END IF;
1548          CLOSE c2;
1549          --
1550       END IF;
1551       -- PERFNEW
1552       IF     p_old_val IS NULL
1553          AND p_new_val IS NULL THEN
1554         --
1555         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
1556           --
1557           if NOT g_cache_pgm_los_rt_rec.EXISTS(l_index) then
1558             g_cache_pgm_los_rt_rec(l_index).id     := p_pgm_id;
1559             g_cache_pgm_los_rt_rec(l_index).exist  := 'N';
1560           end if;
1561         --
1562         END IF;
1563       --
1564       END IF;
1565       --
1566       p_rec  := g_cache_pgm_los_rt_rec(l_index);
1567       --
1568       CLOSE c1;
1569   --
1570   END get_los_pgm_rate;
1571 --
1572   PROCEDURE get_los_pl_rate(
1573     p_pl_id             IN            NUMBER
1574    ,p_old_val           IN            NUMBER DEFAULT NULL
1575    ,p_new_val           IN            NUMBER DEFAULT NULL
1576    ,p_business_group_id IN            NUMBER
1577    ,p_effective_date    IN            DATE
1578    ,p_rec               OUT NOCOPY    g_cache_los_rec_obj) IS
1579     --
1583     l_new_val_1 NUMBER := p_new_val + 1;
1580     l_package        VARCHAR2(80) := g_package || '.get_los_pl_rate';
1581     --
1582     l_old_val_1 NUMBER := p_old_val + 1;
1584     --
1585     -- Define Cursor
1586     --
1587     CURSOR c1 IS
1588       SELECT   p_pl_id
1589               ,'Y'
1590               ,lsf.los_det_cd
1591               ,lsf.los_dt_to_use_cd
1592               ,lsf.use_overid_svc_dt_flag
1593               ,lsf.los_uom
1594               ,lsf.los_det_rl
1595               ,lsf.los_dt_to_use_rl
1596               ,lsf.los_calc_rl
1597               ,lsf.rndg_cd
1598               ,lsf.rndg_rl
1599               ,lsf.mn_los_num
1600               ,lsf.mx_los_num
1601       FROM     ben_los_fctr lsf
1602               ,ben_los_rt_f lsr
1603               ,ben_vrbl_rt_prfl_f vpf
1604               ,ben_acty_vrbl_rt_f avr
1605               ,ben_acty_base_rt_f abr
1606       WHERE    abr.pl_id = p_pl_id
1607       AND      p_effective_date BETWEEN abr.effective_start_date
1608                    AND abr.effective_end_date
1609       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
1610       AND      p_effective_date BETWEEN avr.effective_start_date
1611                    AND avr.effective_end_date
1612       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
1613       AND      p_effective_date BETWEEN vpf.effective_start_date
1614                    AND vpf.effective_end_date
1615       AND      vpf.vrbl_rt_prfl_id = lsr.vrbl_rt_prfl_id
1616       AND      p_effective_date BETWEEN lsr.effective_start_date
1617                    AND lsr.effective_end_date
1618       AND      lsr.los_fctr_id = lsf.los_fctr_id
1619       AND      (
1620                     (
1621                           p_new_val IS NOT NULL
1622                       AND p_old_val IS NOT NULL
1623                       AND p_new_val >= NVL(lsf.mn_los_num
1624                                         ,p_new_val)
1625                 --      AND p_new_val < ceil( NVL(lsf.mx_los_num
1626                 --                       ,p_new_val ) + 0.001) )
1627                  and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
1628                                     trunc(nvl(lsf.mx_los_num,p_new_val))
1629                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
1630                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
1631                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
1632 
1633                  OR (
1634                           p_new_val IS NOT NULL
1635                       AND p_old_val IS NOT NULL
1636                       AND (
1637                                p_new_val < NVL(lsf.mn_los_num
1638                                             ,p_new_val)
1639                  --           OR p_new_val >=  ceil( NVL(lsf.mx_los_num
1640                  --                            , p_new_val )) + 0.001 )
1641                               OR p_new_val >=    decode(nvl(lsf.mx_los_num,p_new_val) ,
1642                                     trunc(nvl(lsf.mx_los_num,p_new_val))
1643                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
1644                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
1645                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
1646 
1647                       AND p_old_val >= NVL(lsf.mn_los_num
1648                                         ,p_old_val)
1649                  --     AND p_old_val < ceil( NVL(lsf.mx_los_num
1650                  --                      ,p_old_val)) + 0.001 )
1651                  and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
1652                                     trunc(nvl(lsf.mx_los_num,p_old_val))
1653                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
1654                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
1655                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )  )
1656 
1657                  OR (    p_new_val IS NULL
1658                      AND p_old_val IS NULL));
1659     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
1663               ,'Y'
1660     -- UNION ALL
1661     CURSOR c2 IS
1662     SELECT   p_pl_id
1664               ,lsf.los_det_cd
1665               ,lsf.los_dt_to_use_cd
1666               ,lsf.use_overid_svc_dt_flag
1667               ,lsf.los_uom
1668               ,lsf.los_det_rl
1669               ,lsf.los_dt_to_use_rl
1670               ,lsf.los_calc_rl
1671               ,lsf.rndg_cd
1672               ,lsf.rndg_rl
1673               ,lsf.mn_los_num
1674               ,lsf.mx_los_num
1675       FROM     ben_los_fctr lsf
1676               -- ,ben_los_rt_f lsr
1677               ,ben_elig_los_prte_f els
1678               ,ben_eligy_prfl_f elp
1679               ,ben_vrbl_rt_elig_prfl_f vep
1680               --
1681               ,ben_vrbl_rt_prfl_f vpf
1682               ,ben_acty_vrbl_rt_f avr
1683               ,ben_acty_base_rt_f abr
1684       WHERE    abr.pl_id = p_pl_id
1685       AND      p_effective_date BETWEEN abr.effective_start_date
1686                    AND abr.effective_end_date
1687       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
1688       AND      p_effective_date BETWEEN avr.effective_start_date
1689                    AND avr.effective_end_date
1690       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
1691       AND      p_effective_date BETWEEN vpf.effective_start_date
1692                    AND vpf.effective_end_date
1693       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
1694       AND      p_effective_date BETWEEN vep.effective_start_date
1695                    AND vep.effective_end_date
1696       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
1697       AND      p_effective_date BETWEEN elp.effective_start_date
1698                    AND elp.effective_end_date
1699       AND      els.eligy_prfl_id = elp.eligy_prfl_id
1700       AND      p_effective_date BETWEEN els.effective_start_date
1701                    AND els.effective_end_date
1702       AND      els.los_fctr_id = lsf.los_fctr_id
1703       AND      (
1704                     (
1705                           p_new_val IS NOT NULL
1706                       AND p_old_val IS NOT NULL
1707                       AND p_new_val >= NVL(lsf.mn_los_num
1708                                         ,p_new_val)
1709                 --      AND p_new_val < ceil( NVL(lsf.mx_los_num
1710                 --                       ,p_new_val ) + 0.001) )
1711                  and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
1712                                     trunc(nvl(lsf.mx_los_num,p_new_val))
1713                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
1714                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
1715                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
1716 
1717                  OR (
1718                           p_new_val IS NOT NULL
1719                       AND p_old_val IS NOT NULL
1720                       AND (
1721                                p_new_val < NVL(lsf.mn_los_num
1722                                             ,p_new_val)
1723                  --           OR p_new_val >=  ceil( NVL(lsf.mx_los_num
1724                  --                            , p_new_val )) + 0.001 )
1725                               OR p_new_val >=    decode(nvl(lsf.mx_los_num,p_new_val) ,
1726                                     trunc(nvl(lsf.mx_los_num,p_new_val))
1730 
1727                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
1728                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
1729                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
1731                       AND p_old_val >= NVL(lsf.mn_los_num
1732                                         ,p_old_val)
1733                  --     AND p_old_val < ceil( NVL(lsf.mx_los_num
1734                  --                      ,p_old_val)) + 0.001 )
1735                  and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
1736                                     trunc(nvl(lsf.mx_los_num,p_old_val))
1737                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
1738                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
1739                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )  )
1740 
1741                  OR (    p_new_val IS NULL
1742                      AND p_old_val IS NULL));
1743     --
1744     l_index          PLS_INTEGER;
1745     l_not_hash_found BOOLEAN;
1746     l_c2notfound       BOOLEAN;
1747 
1748   --
1749   BEGIN
1750     --
1751     -- hr_utility.set_location ('Entering '||l_package,10);
1752     --
1753     -- Steps to do process
1754     --
1755     -- 1) Try and get value from cache
1756     -- 2) If can get from cache then copy to output record
1757     -- 3) If can't get from cache do db hit and then
1758     --    copy to cache record and then copy to output record.
1759     --
1760     -- Get hashed index value
1761     --
1762     l_index  := MOD(p_pl_id
1763                  ,g_hash_key);
1764     --
1765     IF NOT g_cache_pl_los_rt_rec.EXISTS(l_index) THEN
1766       --
1767       -- Lets store the hash value in this index
1768       --
1769       RAISE NO_DATA_FOUND;
1770     --
1771     ELSE
1772       --
1773       -- If it does exist make sure its the right one
1774       --
1775       IF g_cache_pl_los_rt_rec(l_index).id <> p_pl_id THEN
1776         --
1777         -- Loop through the hash using the jump routine to check further
1778         -- indexes
1779         --
1780         l_not_hash_found  := FALSE;
1781         --
1782         WHILE NOT l_not_hash_found LOOP
1783           --
1784           l_index  := l_index + g_hash_jump;
1785           --
1786           -- Check if the hash index exists, if not we can use it
1787           --
1788           IF NOT g_cache_pl_los_rt_rec.EXISTS(l_index) THEN
1789             --
1790             -- Lets store the hash value in the index
1791             --
1792             RAISE NO_DATA_FOUND;
1793           --
1794           ELSE
1795             --
1796             -- Make sure the index is the correct one
1797             --
1798             IF g_cache_pl_los_rt_rec(l_index).id = p_pl_id THEN
1799               --
1803             --
1800               -- We have a match so the hashed value  has been stored before
1801               --
1802               l_not_hash_found  := TRUE;
1804             END IF;
1805           --
1806           END IF;
1807         --
1808         END LOOP;
1809       --
1810       END IF;
1811     --
1812     END IF;
1813     --
1814     -- If p_old_val and p_new_val is set this means we are trying to retrieve
1815     -- the correct rate for the calculated value.
1816     -- Previously we just cached the first rate we
1817     -- found since we needed the determination code, the correct age,los code,etc
1818     -- By killing the cache and forcing the value to be removed we cache the
1819     -- correct rate profile for the case we need.
1820     --
1821     IF     p_old_val IS NOT NULL
1822        AND p_new_val IS NOT NULL THEN
1823       --
1824       RAISE NO_DATA_FOUND;
1825     --
1826     END IF;
1827     --
1828     p_rec    := g_cache_pl_los_rt_rec(l_index);
1829   --
1830   EXCEPTION
1831     --
1832     WHEN NO_DATA_FOUND THEN
1833       --
1834       -- The record has not been cached yet so lets cache it
1835       --
1836       OPEN c1;
1837       --
1838       FETCH c1 INTO g_cache_pl_los_rt_rec(l_index);
1839       -- PERFNEW
1840       IF c1%NOTFOUND THEN
1841          --
1842          l_c2notfound := false;
1843          OPEN c2;
1844          FETCH c2 INTO g_cache_pl_los_rt_rec(l_index);
1845          IF c2%NOTFOUND THEN
1846             --
1847             l_c2notfound := true;
1848             --
1849          END IF;
1850          CLOSE c2;
1851          --
1852       END IF;
1853       -- PERFNEW
1854       IF     p_old_val IS NULL
1855          AND p_new_val IS NULL THEN
1856         --
1857         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
1858           --
1859           if NOT g_cache_pl_los_rt_rec.EXISTS(l_index) then
1860             g_cache_pl_los_rt_rec(l_index).id     := p_pl_id;
1861             g_cache_pl_los_rt_rec(l_index).exist  := 'N';
1862           end if;
1863         --
1864         END IF;
1865       --
1866       END IF;
1867       --
1868       p_rec  := g_cache_pl_los_rt_rec(l_index);
1869       --
1870       CLOSE c1;
1871   --
1872   END get_los_pl_rate;
1873 --
1874   PROCEDURE get_los_oipl_rate(
1875     p_oipl_id           IN            NUMBER
1876    ,p_old_val           IN            NUMBER DEFAULT NULL
1877    ,p_new_val           IN            NUMBER DEFAULT NULL
1878    ,p_business_group_id IN            NUMBER
1879    ,p_effective_date    IN            DATE
1880    ,p_rec               OUT NOCOPY    g_cache_los_rec_obj) IS
1881     --
1882     l_package        VARCHAR2(80) := g_package || '.get_los_oipl_rate';
1883     --
1884     l_old_val_1 NUMBER := p_old_val + 1;
1885     l_new_val_1 NUMBER := p_new_val + 1;
1886     --
1887     l_opt_id    NUMBER;
1888     -- Define Cursor
1889     --
1890     CURSOR c1 IS
1891       SELECT   p_oipl_id
1892               ,'Y'
1893               ,lsf.los_det_cd
1894               ,lsf.los_dt_to_use_cd
1895               ,lsf.use_overid_svc_dt_flag
1896               ,lsf.los_uom
1897               ,lsf.los_det_rl
1898               ,lsf.los_dt_to_use_rl
1899               ,lsf.los_calc_rl
1900               ,lsf.rndg_cd
1901               ,lsf.rndg_rl
1902               ,lsf.mn_los_num
1903               ,lsf.mx_los_num
1904       FROM     ben_los_fctr lsf
1905               ,ben_los_rt_f lsr
1906               ,ben_vrbl_rt_prfl_f vpf
1907               ,ben_acty_vrbl_rt_f avr
1908               ,ben_acty_base_rt_f abr
1909       WHERE    ( abr.oipl_id = p_oipl_id
1910       --
1911       --START Option level Rates Enhancements
1912                or ( abr.opt_id = l_opt_id and
1913                      not exists (select null from ben_acty_base_rt_f abr1
1914                      where abr1.oipl_id = p_oipl_id )))
1915       --END Option level Rates Enhancements
1916       --
1917       AND      p_effective_date BETWEEN abr.effective_start_date
1918                    AND abr.effective_end_date
1919       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
1920       AND      p_effective_date BETWEEN avr.effective_start_date
1924                    AND vpf.effective_end_date
1921                    AND avr.effective_end_date
1922       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
1923       AND      p_effective_date BETWEEN vpf.effective_start_date
1925       AND      vpf.vrbl_rt_prfl_id = lsr.vrbl_rt_prfl_id
1926       AND      p_effective_date BETWEEN lsr.effective_start_date
1927                    AND lsr.effective_end_date
1928       AND      lsr.los_fctr_id = lsf.los_fctr_id
1929       AND      (
1930                     (
1931                           p_new_val IS NOT NULL
1932                       AND p_old_val IS NOT NULL
1933                       AND p_new_val >= NVL(lsf.mn_los_num
1934                                         ,p_new_val)
1935                 --      AND p_new_val < ceil( NVL(lsf.mx_los_num
1936                 --                       ,p_new_val) + 0.001 ))
1937                  and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
1938                                     trunc(nvl(lsf.mx_los_num,p_new_val))
1939                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
1940                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
1941                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
1942                  OR (
1943                           p_new_val IS NOT NULL
1944                       AND p_old_val IS NOT NULL
1945                       AND (
1946                                p_new_val < NVL(lsf.mn_los_num
1947                                             ,p_new_val)
1948                 --            OR p_new_val >= ceil( NVL(lsf.mx_los_num
1949                 --                             , p_new_val)) + 0.001)
1950                               OR p_new_val >= decode(nvl(lsf.mx_los_num,p_new_val) ,
1951                                     trunc(nvl(lsf.mx_los_num,p_new_val))
1952                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
1953                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
1954                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
1955                       AND p_old_val >= NVL(lsf.mn_los_num
1956                                         ,p_old_val)
1957                 --      AND p_old_val < ceil( NVL(lsf.mx_los_num
1958                 --                       ,p_old_val)) + 0.001)
1959                  and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
1960                                     trunc(nvl(lsf.mx_los_num,p_old_val))
1961                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
1962                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
1963                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )  )
1964                  OR (    p_new_val IS NULL
1965                      AND p_old_val IS NULL));
1966     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
1967     --UNION ALL
1968     CURSOR c2 IS
1969     SELECT   p_oipl_id
1970               ,'Y'
1971               ,lsf.los_det_cd
1972               ,lsf.los_dt_to_use_cd
1973               ,lsf.use_overid_svc_dt_flag
1974               ,lsf.los_uom
1975               ,lsf.los_det_rl
1976               ,lsf.los_dt_to_use_rl
1977               ,lsf.los_calc_rl
1978               ,lsf.rndg_cd
1979               ,lsf.rndg_rl
1980               ,lsf.mn_los_num
1981               ,lsf.mx_los_num
1982       FROM    ben_los_fctr lsf
1983               --,ben_los_rt_f lsr
1984               ,ben_elig_los_prte_f els
1985               ,ben_eligy_prfl_f elp
1986               ,ben_vrbl_rt_elig_prfl_f vep
1987               ,ben_vrbl_rt_prfl_f vpf
1988               ,ben_acty_vrbl_rt_f avr
1989               ,ben_acty_base_rt_f abr
1990       WHERE    ( abr.oipl_id = p_oipl_id
1991       --
1992       --START Option level Rates Enhancements
1993                or ( abr.opt_id = l_opt_id and
1994                      not exists (select null from ben_acty_base_rt_f abr1
1995                      where abr1.oipl_id = p_oipl_id )))
1996       --END Option level Rates Enhancements
1997       --
1998       AND      p_effective_date BETWEEN abr.effective_start_date
1999                    AND abr.effective_end_date
2000       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
2001       AND      p_effective_date BETWEEN avr.effective_start_date
2002                    AND avr.effective_end_date
2003       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
2004       AND      p_effective_date BETWEEN vpf.effective_start_date
2005                    AND vpf.effective_end_date
2006       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
2007       AND      p_effective_date BETWEEN vep.effective_start_date
2008                    AND vep.effective_end_date
2009       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
2010       AND      p_effective_date BETWEEN elp.effective_start_date
2011                    AND elp.effective_end_date
2012       AND      els.eligy_prfl_id = elp.eligy_prfl_id
2013       AND      p_effective_date BETWEEN els.effective_start_date
2014                    AND els.effective_end_date
2015 --      AND      vpf.vrbl_rt_prfl_id = els.vrbl_rt_prfl_id
2016       AND      p_effective_date BETWEEN els.effective_start_date
2017                    AND els.effective_end_date
2018       AND      els.los_fctr_id = lsf.los_fctr_id
2019       AND      (
2020                     (
2021                           p_new_val IS NOT NULL
2022                       AND p_old_val IS NOT NULL
2026                 --                       ,p_new_val) + 0.001 ))
2023                       AND p_new_val >= NVL(lsf.mn_los_num
2024                                         ,p_new_val)
2025                 --      AND p_new_val < ceil( NVL(lsf.mx_los_num
2027                  and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
2028                                     trunc(nvl(lsf.mx_los_num,p_new_val))
2029                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
2030                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
2031                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
2032                  OR (
2033                           p_new_val IS NOT NULL
2034                       AND p_old_val IS NOT NULL
2035                       AND (
2036                                p_new_val < NVL(lsf.mn_los_num
2037                                             ,p_new_val)
2038                 --            OR p_new_val >= ceil( NVL(lsf.mx_los_num
2039                 --                             , p_new_val)) + 0.001)
2040                               OR p_new_val >= decode(nvl(lsf.mx_los_num,p_new_val) ,
2041                                     trunc(nvl(lsf.mx_los_num,p_new_val))
2042                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
2043                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
2044                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
2045                       AND p_old_val >= NVL(lsf.mn_los_num
2046                                         ,p_old_val)
2047                 --      AND p_old_val < ceil( NVL(lsf.mx_los_num
2048                 --                       ,p_old_val)) + 0.001)
2049                  and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
2050                                     trunc(nvl(lsf.mx_los_num,p_old_val))
2051                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
2052                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
2053                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )  )
2054                  OR (    p_new_val IS NULL
2055                      AND p_old_val IS NULL));
2056     --
2057     --
2058     l_index          PLS_INTEGER;
2059     l_not_hash_found BOOLEAN;
2060     l_c2notfound       BOOLEAN;
2061   --
2062   BEGIN
2063     --
2064     -- hr_utility.set_location ('Entering '||l_package,10);
2065     --
2066     -- Steps to do process
2067     --
2068     -- 1) Try and get value from cache
2069     -- 2) If can get from cache then copy to output record
2070     -- 3) If can't get from cache do db hit and then
2071     --    copy to cache record and then copy to output record.
2072     --
2073     -- Get hashed index value
2074     --
2075     l_index  := MOD(p_oipl_id
2076                  ,g_hash_key);
2077     --
2078     IF NOT g_cache_oipl_los_rt_rec.EXISTS(l_index) THEN
2079       --
2080       -- Lets store the hash value in this index
2081       --
2082       RAISE NO_DATA_FOUND;
2083     --
2084     ELSE
2085       --
2086       -- If it does exist make sure its the right one
2087       --
2088       IF g_cache_oipl_los_rt_rec(l_index).id <> p_oipl_id THEN
2089         --
2090         -- Loop through the hash using the jump routine to check further
2091         -- indexes
2092         --
2093         l_not_hash_found  := FALSE;
2094         --
2095         WHILE NOT l_not_hash_found LOOP
2096           --
2097           l_index  := l_index + g_hash_jump;
2098           --
2099           -- Check if the hash index exists, if not we can use it
2100           --
2101           IF NOT g_cache_oipl_los_rt_rec.EXISTS(l_index) THEN
2102             --
2106           --
2103             -- Lets store the hash value in the index
2104             --
2105             RAISE NO_DATA_FOUND;
2107           ELSE
2108             --
2109             -- Make sure the index is the correct one
2110             --
2111             IF g_cache_oipl_los_rt_rec(l_index).id = p_oipl_id THEN
2112               --
2113               -- We have a match so the hashed value  has been stored before
2114               --
2115               l_not_hash_found  := TRUE;
2116             --
2117             END IF;
2118           --
2119           END IF;
2120         --
2121         END LOOP;
2122       --
2123       END IF;
2124     --
2125     END IF;
2126     --
2127     -- If p_old_val and p_new_val is set this means we are trying to retrieve
2128     -- the correct rate for the calculated value.
2129     -- Previously we just cached the first rate we
2130     -- found since we needed the determination code, the correct age,los code,etc
2131     -- By killing the cache and forcing the value to be removed we cache the
2132     -- correct rate profile for the case we need.
2133     --
2134     IF     p_old_val IS NOT NULL
2135        AND p_new_val IS NOT NULL THEN
2136       --
2137       RAISE NO_DATA_FOUND;
2138     --
2139     END IF;
2140     --
2141     p_rec    := g_cache_oipl_los_rt_rec(l_index);
2142   --
2143   -- hr_utility.set_location ('Leaving '||l_package,10);
2144   --
2145   EXCEPTION
2146     --
2147     WHEN NO_DATA_FOUND THEN
2148       --
2149       -- The record has not been cached yet so lets cache it
2150       -- Option level rates enhancement
2151       l_opt_id := get_opt_id(p_oipl_id,p_effective_date);
2152       --
2153       OPEN c1;
2154       --
2155       FETCH c1 INTO g_cache_oipl_los_rt_rec(l_index);
2156       -- PERFNEW
2157       IF c1%NOTFOUND THEN
2158          --
2159          l_c2notfound := false;
2160          OPEN c2;
2161          FETCH c2 INTO g_cache_oipl_los_rt_rec(l_index);
2162          IF c2%NOTFOUND THEN
2163             --
2164             l_c2notfound := true;
2165             --
2166          END IF;
2167          CLOSE c2;
2168          --
2169       END IF;
2170       -- PERFNEW
2171       IF     p_old_val IS NULL
2172          AND p_new_val IS NULL THEN
2173         --
2174         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
2175           --
2176           if NOT g_cache_oipl_los_rt_rec.EXISTS(l_index) then
2177             g_cache_oipl_los_rt_rec(l_index).id     := p_oipl_id;
2178             g_cache_oipl_los_rt_rec(l_index).exist  := 'N';
2179           end if;
2180         --
2181         END IF;
2182       --
2183       END IF;
2184       --
2185       p_rec  := g_cache_oipl_los_rt_rec(l_index);
2186       --
2187       CLOSE c1;
2188   --
2189   END get_los_oipl_rate;
2190 --
2191   PROCEDURE get_los_plip_rate(
2192     p_plip_id           IN            NUMBER
2193    ,p_old_val           IN            NUMBER DEFAULT NULL
2194    ,p_new_val           IN            NUMBER DEFAULT NULL
2195    ,p_business_group_id IN            NUMBER
2196    ,p_effective_date    IN            DATE
2197    ,p_rec               OUT NOCOPY    g_cache_los_rec_obj) IS
2198     --
2199     l_package        VARCHAR2(80) := g_package || '.get_los_plip_rate';
2200     l_old_val_1 NUMBER := p_old_val + 1;
2204     --
2201     l_new_val_1 NUMBER := p_new_val + 1;
2202     --
2203     -- Define Cursor
2205     CURSOR c1 IS
2206       SELECT   p_plip_id
2207               ,'Y'
2208               ,lsf.los_det_cd
2209               ,lsf.los_dt_to_use_cd
2210               ,lsf.use_overid_svc_dt_flag
2211               ,lsf.los_uom
2212               ,lsf.los_det_rl
2213               ,lsf.los_dt_to_use_rl
2214               ,lsf.los_calc_rl
2215               ,lsf.rndg_cd
2216               ,lsf.rndg_rl
2217               ,lsf.mn_los_num
2218               ,lsf.mx_los_num
2219       FROM     ben_los_fctr lsf
2220               ,ben_los_rt_f lsr
2221               ,ben_vrbl_rt_prfl_f vpf
2222               ,ben_acty_vrbl_rt_f avr
2223               ,ben_acty_base_rt_f abr
2224       WHERE    abr.plip_id = p_plip_id
2225       AND      p_effective_date BETWEEN abr.effective_start_date
2226                    AND abr.effective_end_date
2227       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
2228       AND      p_effective_date BETWEEN avr.effective_start_date
2229                    AND avr.effective_end_date
2230       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
2231       AND      p_effective_date BETWEEN vpf.effective_start_date
2232                    AND vpf.effective_end_date
2233       AND      vpf.vrbl_rt_prfl_id = lsr.vrbl_rt_prfl_id
2234       AND      p_effective_date BETWEEN lsr.effective_start_date
2235                    AND lsr.effective_end_date
2236       AND      lsr.los_fctr_id = lsf.los_fctr_id
2237       AND      (
2238                     (
2239                           p_new_val IS NOT NULL
2240                       AND p_old_val IS NOT NULL
2241                       AND p_new_val >= NVL(lsf.mn_los_num
2242                                         ,p_new_val)
2243                 --      AND p_new_val < ceil( NVL(lsf.mx_los_num
2244                 --                       ,p_new_val) + 0.001))
2245                  and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
2246                                     trunc(nvl(lsf.mx_los_num,p_new_val))
2247                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
2248                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
2249                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
2250                  OR (
2251                           p_new_val IS NOT NULL
2252                       AND p_old_val IS NOT NULL
2253                       AND (
2254                                p_new_val < NVL(lsf.mn_los_num
2255                                             ,p_new_val)
2256                 --            OR p_new_val >= ceil( NVL(lsf.mx_los_num
2257                 --                             ,p_new_val )) + 0.001 )
2258                               OR p_new_val >= decode(nvl(lsf.mx_los_num,p_new_val) ,
2259                                     trunc(nvl(lsf.mx_los_num,p_new_val))
2260                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
2261                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
2262                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
2263                       AND p_old_val >= NVL(lsf.mn_los_num
2264                                         ,p_old_val)
2265                 --      AND p_old_val < ceil( NVL(lsf.mx_los_num
2266                 --                       ,p_old_val)) + 0.001 )
2267                  and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
2268                                     trunc(nvl(lsf.mx_los_num,p_old_val))
2269                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
2270                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
2271                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )  )
2272                  OR (    p_new_val IS NULL
2273                      AND p_old_val IS NULL));
2274     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
2275     --UNION ALL
2276     CURSOR c2 IS
2277     SELECT   p_plip_id
2278               ,'Y'
2279               ,lsf.los_det_cd
2280               ,lsf.los_dt_to_use_cd
2281               ,lsf.use_overid_svc_dt_flag
2282               ,lsf.los_uom
2283               ,lsf.los_det_rl
2284               ,lsf.los_dt_to_use_rl
2285               ,lsf.los_calc_rl
2289               ,lsf.mx_los_num
2286               ,lsf.rndg_cd
2287               ,lsf.rndg_rl
2288               ,lsf.mn_los_num
2290       FROM     ben_los_fctr lsf
2291               --,ben_los_rt_f lsr
2292               ,ben_elig_los_prte_f els
2293               ,ben_eligy_prfl_f elp
2294               ,ben_vrbl_rt_elig_prfl_f vep
2295               ,ben_vrbl_rt_prfl_f vpf
2296               ,ben_acty_vrbl_rt_f avr
2297               ,ben_acty_base_rt_f abr
2298       WHERE    abr.plip_id = p_plip_id
2299       AND      p_effective_date BETWEEN abr.effective_start_date
2300                    AND abr.effective_end_date
2301       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
2302       AND      p_effective_date BETWEEN avr.effective_start_date
2303                    AND avr.effective_end_date
2304       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
2305       AND      p_effective_date BETWEEN vpf.effective_start_date
2306                    AND vpf.effective_end_date
2307 --      AND      vpf.vrbl_rt_prfl_id = els.vrbl_rt_prfl_id
2308       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
2309       AND      p_effective_date BETWEEN vep.effective_start_date
2310                    AND vep.effective_end_date
2311       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
2312       AND      p_effective_date BETWEEN elp.effective_start_date
2313                    AND elp.effective_end_date
2314       AND      els.eligy_prfl_id = elp.eligy_prfl_id
2315       AND      p_effective_date BETWEEN els.effective_start_date
2316                    AND els.effective_end_date
2317       AND      p_effective_date BETWEEN els.effective_start_date
2318                    AND els.effective_end_date
2319       AND      els.los_fctr_id = lsf.los_fctr_id
2320       AND      (
2321                     (
2322                           p_new_val IS NOT NULL
2323                       AND p_old_val IS NOT NULL
2324                       AND p_new_val >= NVL(lsf.mn_los_num
2325                                         ,p_new_val)
2326                 --      AND p_new_val < ceil( NVL(lsf.mx_los_num
2327                 --                       ,p_new_val) + 0.001))
2328                  and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
2329                                     trunc(nvl(lsf.mx_los_num,p_new_val))
2330                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
2331                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
2332                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
2333                  OR (
2334                           p_new_val IS NOT NULL
2335                       AND p_old_val IS NOT NULL
2336                       AND (
2337                                p_new_val < NVL(lsf.mn_los_num
2338                                             ,p_new_val)
2339                 --            OR p_new_val >= ceil( NVL(lsf.mx_los_num
2340                 --                             ,p_new_val )) + 0.001 )
2341                               OR p_new_val >= decode(nvl(lsf.mx_los_num,p_new_val) ,
2342                                     trunc(nvl(lsf.mx_los_num,p_new_val))
2343                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
2344                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
2345                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
2346                       AND p_old_val >= NVL(lsf.mn_los_num
2347                                         ,p_old_val)
2348                 --      AND p_old_val < ceil( NVL(lsf.mx_los_num
2349                 --                       ,p_old_val)) + 0.001 )
2350                  and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
2351                                     trunc(nvl(lsf.mx_los_num,p_old_val))
2352                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
2353                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
2354                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )  )
2355                  OR (    p_new_val IS NULL
2356                      AND p_old_val IS NULL));
2357     --
2358     --
2359     l_index          PLS_INTEGER;
2360     l_not_hash_found BOOLEAN;
2361     l_c2notfound       BOOLEAN;
2362   --
2363   BEGIN
2364     --
2365     -- hr_utility.set_location ('Entering '||l_package,10);
2366     --
2367     -- Steps to do process
2368     --
2369     -- 1) Try and get value from cache
2370     -- 2) If can get from cache then copy to output record
2371     -- 3) If can't get from cache do db hit and then
2372     --    copy to cache record and then copy to output record.
2373     --
2374     -- Get hashed index value
2375     --
2376     l_index  := MOD(p_plip_id
2377                  ,g_hash_key);
2378     --
2379     IF NOT g_cache_plip_los_rt_rec.EXISTS(l_index) THEN
2380       --
2381       -- Lets store the hash value in this index
2382       --
2383       RAISE NO_DATA_FOUND;
2384     --
2385     ELSE
2386       --
2387       -- If it does exist make sure its the right one
2388       --
2389       IF g_cache_plip_los_rt_rec(l_index).id <> p_plip_id THEN
2390         --
2391         -- Loop through the hash using the jump routine to check further
2392         -- indexes
2393         --
2394         l_not_hash_found  := FALSE;
2395         --
2396         WHILE NOT l_not_hash_found LOOP
2397           --
2398           l_index  := l_index + g_hash_jump;
2399           --
2400           -- Check if the hash index exists, if not we can use it
2401           --
2405             --
2402           IF NOT g_cache_plip_los_rt_rec.EXISTS(l_index) THEN
2403             --
2404             -- Lets store the hash value in the index
2406             RAISE NO_DATA_FOUND;
2407           --
2408           ELSE
2409             --
2410             -- Make sure the index is the correct one
2411             --
2412             IF g_cache_plip_los_rt_rec(l_index).id = p_plip_id THEN
2413               --
2414               -- We have a match so the hashed value  has been stored before
2415               --
2416               l_not_hash_found  := TRUE;
2417             --
2418             END IF;
2419           --
2420           END IF;
2421         --
2422         END LOOP;
2423       --
2424       END IF;
2425     --
2426     END IF;
2427     --
2428     -- If p_old_val and p_new_val is set this means we are trying to retrieve
2429     -- the correct rate for the calculated value.
2430     -- Previously we just cached the first rate we
2431     -- found since we needed the determination code, the correct age,los code,etc
2432     -- By killing the cache and forcing the value to be removed we cache the
2433     -- correct rate profile for the case we need.
2434     --
2435     IF     p_old_val IS NOT NULL
2436        AND p_new_val IS NOT NULL THEN
2437       --
2438       RAISE NO_DATA_FOUND;
2439     --
2440     END IF;
2441     --
2442     p_rec    := g_cache_plip_los_rt_rec(l_index);
2443   --
2444   -- hr_utility.set_location ('Leaving '||l_package,10);
2445   --
2446   EXCEPTION
2447     --
2448     WHEN NO_DATA_FOUND THEN
2449       --
2450       -- The record has not been cached yet so lets cache it
2451       --
2452       OPEN c1;
2453       --
2454       FETCH c1 INTO g_cache_plip_los_rt_rec(l_index);
2455       -- PERFNEW
2456       IF c1%NOTFOUND THEN
2457          --
2458          l_c2notfound := false;
2459          OPEN c2;
2460          FETCH c2 INTO g_cache_plip_los_rt_rec(l_index);
2461          IF c2%NOTFOUND THEN
2462             --
2463             l_c2notfound := true;
2464             --
2465          END IF;
2466          CLOSE c2;
2467          --
2468       END IF;
2469       -- PERFNEW
2470       IF     p_old_val IS NULL
2471          AND p_new_val IS NULL THEN
2472         --
2473         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
2474           --
2475           if NOT g_cache_plip_los_rt_rec.EXISTS(l_index) then
2476             g_cache_plip_los_rt_rec(l_index).id     := p_plip_id;
2477             g_cache_plip_los_rt_rec(l_index).exist  := 'N';
2478           end if;
2479         --
2480         END IF;
2481       --
2482       END IF;
2483       --
2484       p_rec  := g_cache_plip_los_rt_rec(l_index);
2485       --
2486       CLOSE c1;
2487   --
2488   END get_los_plip_rate;
2489 --
2490   PROCEDURE get_los_ptip_rate(
2491     p_ptip_id           IN            NUMBER
2492    ,p_old_val           IN            NUMBER DEFAULT NULL
2493    ,p_new_val           IN            NUMBER DEFAULT NULL
2494    ,p_business_group_id IN            NUMBER
2495    ,p_effective_date    IN            DATE
2496    ,p_rec               OUT NOCOPY    g_cache_los_rec_obj) IS
2497     --
2498     l_package        VARCHAR2(80) := g_package || '.get_los_ptip_rate';
2499     l_old_val_1 NUMBER := p_old_val + 1;
2500     l_new_val_1 NUMBER := p_new_val + 1;
2501     --
2502     -- Define Cursor
2503     --
2504     CURSOR c1 IS
2505       SELECT   p_ptip_id
2506               ,'Y'
2507               ,lsf.los_det_cd
2508               ,lsf.los_dt_to_use_cd
2509               ,lsf.use_overid_svc_dt_flag
2510               ,lsf.los_uom
2511               ,lsf.los_det_rl
2512               ,lsf.los_dt_to_use_rl
2513               ,lsf.los_calc_rl
2514               ,lsf.rndg_cd
2515               ,lsf.rndg_rl
2516               ,lsf.mn_los_num
2517               ,lsf.mx_los_num
2518       FROM     ben_los_fctr lsf
2519               ,ben_los_rt_f lsr
2520               ,ben_vrbl_rt_prfl_f vpf
2521               ,ben_acty_vrbl_rt_f avr
2522               ,ben_acty_base_rt_f abr
2523       WHERE    abr.ptip_id = p_ptip_id
2524       AND      p_effective_date BETWEEN abr.effective_start_date
2525                    AND abr.effective_end_date
2526       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
2527       AND      p_effective_date BETWEEN avr.effective_start_date
2528                    AND avr.effective_end_date
2529       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
2530       AND      p_effective_date BETWEEN vpf.effective_start_date
2531                    AND vpf.effective_end_date
2535       AND      lsr.los_fctr_id = lsf.los_fctr_id
2532       AND      vpf.vrbl_rt_prfl_id = lsr.vrbl_rt_prfl_id
2533       AND      p_effective_date BETWEEN lsr.effective_start_date
2534                    AND lsr.effective_end_date
2536       AND      (
2537                     (
2538                           p_new_val IS NOT NULL
2539                       AND p_old_val IS NOT NULL
2540                       AND p_new_val >= NVL(lsf.mn_los_num
2541                                         ,p_new_val)
2542                 --      AND p_new_val < ceil( NVL(lsf.mx_los_num
2543                 --                       ,p_new_val) + 0.001) )
2544                  and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
2545                                     trunc(nvl(lsf.mx_los_num,p_new_val))
2546                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
2547                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
2548                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
2549                  OR (
2550                           p_new_val IS NOT NULL
2551                       AND p_old_val IS NOT NULL
2552                       AND (
2553                                p_new_val < NVL(lsf.mn_los_num
2554                                             ,p_new_val)
2555                 --            OR p_new_val >= ceil( NVL(lsf.mx_los_num
2556                 --                             ,p_new_val)) + 0.001 )
2557                               OR p_new_val >= decode(nvl(lsf.mx_los_num,p_new_val) ,
2558                                     trunc(nvl(lsf.mx_los_num,p_new_val))
2559                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
2560                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
2561                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
2562                       AND p_old_val >= NVL(lsf.mn_los_num
2563                                         ,p_old_val)
2564                 --      AND p_old_val < ceil( NVL(lsf.mx_los_num
2565                 --                       ,p_old_val )) + 0.001 )
2566                  and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
2567                                     trunc(nvl(lsf.mx_los_num,p_old_val))
2568                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
2569                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
2570                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )  )
2571                  OR (    p_new_val IS NULL
2572                      AND p_old_val IS NULL));
2573     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
2574     --UNION ALL
2575     CURSOR c2 IS
2576       SELECT   p_ptip_id
2577               ,'Y'
2578               ,lsf.los_det_cd
2579               ,lsf.los_dt_to_use_cd
2580               ,lsf.use_overid_svc_dt_flag
2581               ,lsf.los_uom
2582               ,lsf.los_det_rl
2583               ,lsf.los_dt_to_use_rl
2584               ,lsf.los_calc_rl
2585               ,lsf.rndg_cd
2586               ,lsf.rndg_rl
2587               ,lsf.mn_los_num
2588               ,lsf.mx_los_num
2589       FROM     ben_los_fctr lsf
2590               --,ben_los_rt_f lsr
2591               ,ben_elig_los_prte_f els
2592               ,ben_eligy_prfl_f elp
2593               ,ben_vrbl_rt_elig_prfl_f vep
2594               ,ben_vrbl_rt_prfl_f vpf
2595               ,ben_acty_vrbl_rt_f avr
2596               ,ben_acty_base_rt_f abr
2597       WHERE    abr.ptip_id = p_ptip_id
2598       AND      p_effective_date BETWEEN abr.effective_start_date
2599                    AND abr.effective_end_date
2600       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
2601       AND      p_effective_date BETWEEN avr.effective_start_date
2602                    AND avr.effective_end_date
2603       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
2604       AND      p_effective_date BETWEEN vpf.effective_start_date
2605                    AND vpf.effective_end_date
2606 --      AND      vpf.vrbl_rt_prfl_id = els.vrbl_rt_prfl_id
2607       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
2608       AND      p_effective_date BETWEEN vep.effective_start_date
2609                    AND vep.effective_end_date
2610       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
2611       AND      p_effective_date BETWEEN elp.effective_start_date
2612                    AND elp.effective_end_date
2613       AND      els.eligy_prfl_id = elp.eligy_prfl_id
2614       AND      p_effective_date BETWEEN els.effective_start_date
2615                    AND els.effective_end_date
2616       AND      p_effective_date BETWEEN els.effective_start_date
2617                    AND els.effective_end_date
2618       AND      els.los_fctr_id = lsf.los_fctr_id
2619       AND      (
2620                     (
2621                           p_new_val IS NOT NULL
2622                       AND p_old_val IS NOT NULL
2623                       AND p_new_val >= NVL(lsf.mn_los_num
2624                                         ,p_new_val)
2625                 --      AND p_new_val < ceil( NVL(lsf.mx_los_num
2626                 --                       ,p_new_val) + 0.001) )
2627                  and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
2628                                     trunc(nvl(lsf.mx_los_num,p_new_val))
2629                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
2630                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
2631                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
2632                  OR (
2633                           p_new_val IS NOT NULL
2634                       AND p_old_val IS NOT NULL
2638                 --            OR p_new_val >= ceil( NVL(lsf.mx_los_num
2635                       AND (
2636                                p_new_val < NVL(lsf.mn_los_num
2637                                             ,p_new_val)
2639                 --                             ,p_new_val)) + 0.001 )
2640                               OR p_new_val >= decode(nvl(lsf.mx_los_num,p_new_val) ,
2641                                     trunc(nvl(lsf.mx_los_num,p_new_val))
2642                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
2643                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
2644                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
2645                       AND p_old_val >= NVL(lsf.mn_los_num
2646                                         ,p_old_val)
2647                 --      AND p_old_val < ceil( NVL(lsf.mx_los_num
2648                 --                       ,p_old_val )) + 0.001 )
2649                  and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
2650                                     trunc(nvl(lsf.mx_los_num,p_old_val))
2651                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
2652                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
2653                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )  )
2654                  OR (    p_new_val IS NULL
2655                      AND p_old_val IS NULL));
2656     --
2657     --
2658     l_index          PLS_INTEGER;
2659     l_not_hash_found BOOLEAN;
2660     l_c2notfound       BOOLEAN;
2661   --
2662   BEGIN
2663     --
2664     -- hr_utility.set_location ('Entering '||l_package,10);
2665     --
2666     -- Steps to do process
2667     --
2668     -- 1) Try and get value from cache
2669     -- 2) If can get from cache then copy to output record
2670     -- 3) If can't get from cache do db hit and then
2671     --    copy to cache record and then copy to output record.
2672     --
2673     -- Get hashed index value
2674     --
2675     l_index  := MOD(p_ptip_id
2676                  ,g_hash_key);
2677     --
2678     IF NOT g_cache_ptip_los_rt_rec.EXISTS(l_index) THEN
2679       --
2680       -- Lets store the hash value in this index
2681       --
2682       RAISE NO_DATA_FOUND;
2683     --
2684     ELSE
2685       --
2686       -- If it does exist make sure its the right one
2687       --
2688       IF g_cache_ptip_los_rt_rec(l_index).id <> p_ptip_id THEN
2689         --
2690         -- Loop through the hash using the jump routine to check further
2691         -- indexes
2692         --
2693         l_not_hash_found  := FALSE;
2694         --
2695         WHILE NOT l_not_hash_found LOOP
2696           --
2697           l_index  := l_index + g_hash_jump;
2698           --
2699           -- Check if the hash index exists, if not we can use it
2700           --
2701           IF NOT g_cache_ptip_los_rt_rec.EXISTS(l_index) THEN
2702             --
2703             -- Lets store the hash value in the index
2704             --
2705             RAISE NO_DATA_FOUND;
2706           --
2707           ELSE
2708             --
2709             -- Make sure the index is the correct one
2710             --
2711             IF g_cache_ptip_los_rt_rec(l_index).id = p_ptip_id THEN
2712               --
2713               -- We have a match so the hashed value  has been stored before
2714               --
2715               l_not_hash_found  := TRUE;
2716             --
2717             END IF;
2718           --
2719           END IF;
2720         --
2721         END LOOP;
2722       --
2723       END IF;
2724     --
2725     END IF;
2726     --
2727     -- If p_old_val and p_new_val is set this means we are trying to retrieve
2728     -- the correct rate for the calculated value.
2729     -- Previously we just cached the first rate we
2730     -- found since we needed the determination code, the correct age,los code,etc
2731     -- By killing the cache and forcing the value to be removed we cache the
2732     -- correct rate profile for the case we need.
2733     --
2734     IF     p_old_val IS NOT NULL
2735        AND p_new_val IS NOT NULL THEN
2736       --
2737       RAISE NO_DATA_FOUND;
2738     --
2739     END IF;
2740     --
2741     p_rec    := g_cache_ptip_los_rt_rec(l_index);
2742   --
2743   -- hr_utility.set_location ('Leaving '||l_package,10);
2744   --
2745   EXCEPTION
2746     --
2747     WHEN NO_DATA_FOUND THEN
2748       --
2749       -- The record has not been cached yet so lets cache it
2750       --
2751       OPEN c1;
2752       --
2753       FETCH c1 INTO g_cache_ptip_los_rt_rec(l_index);
2754       -- PERFNEW
2755       IF c1%NOTFOUND THEN
2756          --
2757          l_c2notfound := false;
2758          OPEN c2;
2759          FETCH c2 INTO g_cache_ptip_los_rt_rec(l_index);
2760          IF c2%NOTFOUND THEN
2761             --
2762             l_c2notfound := true;
2763             --
2764          END IF;
2765          CLOSE c2;
2766          --
2767       END IF;
2768       -- PERFNEW
2769       IF     p_old_val IS NULL
2770          AND p_new_val IS NULL THEN
2771         --
2772         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
2773           --
2774           if NOT g_cache_ptip_los_rt_rec.EXISTS(l_index) then
2775             g_cache_ptip_los_rt_rec(l_index).id     := p_ptip_id;
2779         END IF;
2776             g_cache_ptip_los_rt_rec(l_index).exist  := 'N';
2777           end if;
2778         --
2780       --
2781       END IF;
2782       --
2783       p_rec  := g_cache_ptip_los_rt_rec(l_index);
2784       --
2785       CLOSE c1;
2786   --
2787   END get_los_ptip_rate;
2788 --
2789   PROCEDURE get_los_oiplip_rate(
2790     p_oiplip_id         IN            NUMBER
2791    ,p_old_val           IN            NUMBER DEFAULT NULL
2792    ,p_new_val           IN            NUMBER DEFAULT NULL
2793    ,p_business_group_id IN            NUMBER
2794    ,p_effective_date    IN            DATE
2795    ,p_rec               OUT NOCOPY    g_cache_los_rec_obj) IS
2796     --
2797     l_package        VARCHAR2(80) := g_package || '.get_los_oiplip_rate';
2798     l_old_val_1 NUMBER := p_old_val + 1;
2799     l_new_val_1 NUMBER := p_new_val + 1;
2800     --
2801     -- Define Cursor
2802     --
2803     CURSOR c1 IS
2804       SELECT   p_oiplip_id
2805               ,'Y'
2806               ,lsf.los_det_cd
2807               ,lsf.los_dt_to_use_cd
2808               ,lsf.use_overid_svc_dt_flag
2809               ,lsf.los_uom
2810               ,lsf.los_det_rl
2811               ,lsf.los_dt_to_use_rl
2812               ,lsf.los_calc_rl
2813               ,lsf.rndg_cd
2814               ,lsf.rndg_rl
2815               ,lsf.mn_los_num
2816               ,lsf.mx_los_num
2817       FROM     ben_los_fctr lsf
2818               ,ben_los_rt_f lsr
2819               ,ben_vrbl_rt_prfl_f vpf
2820               ,ben_acty_vrbl_rt_f avr
2821               ,ben_acty_base_rt_f abr
2822       WHERE    abr.oiplip_id = p_oiplip_id
2823       AND      p_effective_date BETWEEN abr.effective_start_date
2824                    AND abr.effective_end_date
2825       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
2826       AND      p_effective_date BETWEEN avr.effective_start_date
2827                    AND avr.effective_end_date
2828       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
2829       AND      p_effective_date BETWEEN vpf.effective_start_date
2830                    AND vpf.effective_end_date
2831       AND      vpf.vrbl_rt_prfl_id = lsr.vrbl_rt_prfl_id
2832       AND      p_effective_date BETWEEN lsr.effective_start_date
2833                    AND lsr.effective_end_date
2834       AND      lsr.los_fctr_id = lsf.los_fctr_id
2835       AND      (
2836                     (
2837                           p_new_val IS NOT NULL
2838                       AND p_old_val IS NOT NULL
2839                       AND p_new_val >= NVL(lsf.mn_los_num
2840                                         ,p_new_val)
2841                  --     AND p_new_val < ceil( NVL(lsf.mx_los_num
2842                  --                      ,p_new_val) + 0.001) )
2843                  and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
2844                                     trunc(nvl(lsf.mx_los_num,p_new_val))
2845                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
2846                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
2847                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
2848                  OR (
2849                           p_new_val IS NOT NULL
2850                       AND p_old_val IS NOT NULL
2851                       AND (
2852                                p_new_val < NVL(lsf.mn_los_num
2853                                             ,p_new_val)
2854                  --           OR p_new_val >= ceil( NVL(lsf.mx_los_num
2855                  --                            ,p_new_val))+ 0.001)
2856                               OR p_new_val >= decode(nvl(lsf.mx_los_num,p_new_val) ,
2857                                     trunc(nvl(lsf.mx_los_num,p_new_val))
2858                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
2859                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
2860                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
2861                       AND p_old_val >= NVL(lsf.mn_los_num
2862                                         ,p_old_val)
2863                  --     AND p_old_val < ceil( NVL(lsf.mx_los_num
2864                  --                      ,p_old_val)) + 0.001 )
2865                  and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
2866                                     trunc(nvl(lsf.mx_los_num,p_old_val))
2867                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
2868                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
2869                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )  )
2870                  OR (    p_new_val IS NULL
2871                      AND p_old_val IS NULL));
2872     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
2873     --UNION ALL
2874     CURSOR c2 IS
2875       SELECT   p_oiplip_id
2876               ,'Y'
2877               ,lsf.los_det_cd
2878               ,lsf.los_dt_to_use_cd
2879               ,lsf.use_overid_svc_dt_flag
2880               ,lsf.los_uom
2881               ,lsf.los_det_rl
2882               ,lsf.los_dt_to_use_rl
2883               ,lsf.los_calc_rl
2884               ,lsf.rndg_cd
2885               ,lsf.rndg_rl
2886               ,lsf.mn_los_num
2887               ,lsf.mx_los_num
2888       FROM     ben_los_fctr lsf
2889               --,ben_los_rt_f lsr
2893               ,ben_vrbl_rt_prfl_f vpf
2890               ,ben_elig_los_prte_f els
2891               ,ben_eligy_prfl_f elp
2892               ,ben_vrbl_rt_elig_prfl_f vep
2894               ,ben_acty_vrbl_rt_f avr
2895               ,ben_acty_base_rt_f abr
2896       WHERE    abr.oiplip_id = p_oiplip_id
2897       AND      p_effective_date BETWEEN abr.effective_start_date
2898                    AND abr.effective_end_date
2899       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
2900       AND      p_effective_date BETWEEN avr.effective_start_date
2901                    AND avr.effective_end_date
2902       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
2903       AND      p_effective_date BETWEEN vpf.effective_start_date
2904                    AND vpf.effective_end_date
2905 --      AND      vpf.vrbl_rt_prfl_id = els.vrbl_rt_prfl_id
2906       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
2907       AND      p_effective_date BETWEEN vep.effective_start_date
2908                    AND vep.effective_end_date
2909       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
2910       AND      p_effective_date BETWEEN elp.effective_start_date
2911                    AND elp.effective_end_date
2912       AND      els.eligy_prfl_id = elp.eligy_prfl_id
2913       AND      p_effective_date BETWEEN els.effective_start_date
2914                    AND els.effective_end_date
2915       AND      p_effective_date BETWEEN els.effective_start_date
2916                    AND els.effective_end_date
2917       AND      els.los_fctr_id = lsf.los_fctr_id
2918       AND      (
2919                     (
2920                           p_new_val IS NOT NULL
2921                       AND p_old_val IS NOT NULL
2922                       AND p_new_val >= NVL(lsf.mn_los_num
2923                                         ,p_new_val)
2924                  --     AND p_new_val < ceil( NVL(lsf.mx_los_num
2925                  --                      ,p_new_val) + 0.001) )
2926                  and p_new_val <  decode(nvl(lsf.mx_los_num,p_new_val) ,
2927                                     trunc(nvl(lsf.mx_los_num,p_new_val))
2928                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
2929                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
2930                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
2931                  OR (
2932                           p_new_val IS NOT NULL
2933                       AND p_old_val IS NOT NULL
2934                       AND (
2935                                p_new_val < NVL(lsf.mn_los_num
2936                                             ,p_new_val)
2937                  --           OR p_new_val >= ceil( NVL(lsf.mx_los_num
2938                  --                            ,p_new_val))+ 0.001)
2939                               OR p_new_val >= decode(nvl(lsf.mx_los_num,p_new_val) ,
2940                                     trunc(nvl(lsf.mx_los_num,p_new_val))
2941                      ,decode(nvl(lsf.mn_los_num,p_new_val), trunc(nvl(lsf.mn_los_num,p_new_val)),
2942                       nvl(lsf.mx_los_num,p_new_val)+1,nvl(lsf.mx_los_num,p_new_val)+0.000000001),
2943                       nvl(lsf.mx_los_num,p_new_val)+0.000000001 )  )
2944                       AND p_old_val >= NVL(lsf.mn_los_num
2945                                         ,p_old_val)
2946                  --     AND p_old_val < ceil( NVL(lsf.mx_los_num
2947                  --                      ,p_old_val)) + 0.001 )
2948                  and p_old_val <  decode(nvl(lsf.mx_los_num,p_old_val) ,
2949                                     trunc(nvl(lsf.mx_los_num,p_old_val))
2950                      ,decode(nvl(lsf.mn_los_num,p_old_val), trunc(nvl(lsf.mn_los_num,p_old_val)),
2951                       nvl(lsf.mx_los_num,p_old_val)+1,nvl(lsf.mx_los_num,p_old_val)+0.000000001),
2952                       nvl(lsf.mx_los_num,p_old_val)+0.000000001 )  )
2953                  OR (    p_new_val IS NULL
2954                      AND p_old_val IS NULL));
2955     --
2956     --
2957     l_index          PLS_INTEGER;
2958     l_not_hash_found BOOLEAN;
2962     --
2959     l_c2notfound       BOOLEAN;
2960   --
2961   BEGIN
2963     -- hr_utility.set_location ('Entering '||l_package,10);
2964     --
2965     -- Steps to do process
2966     --
2967     -- 1) Try and get value from cache
2968     -- 2) If can get from cache then copy to output record
2969     -- 3) If can't get from cache do db hit and then
2970     --    copy to cache record and then copy to output record.
2971     --
2972     -- Get hashed index value
2973     --
2974     l_index  := MOD(p_oiplip_id
2975                  ,g_hash_key);
2976     --
2977     IF NOT g_cache_oiplip_los_rt_rec.EXISTS(l_index) THEN
2978       --
2979       -- Lets store the hash value in this index
2980       --
2981       RAISE NO_DATA_FOUND;
2982     --
2983     ELSE
2984       --
2985       -- If it does exist make sure its the right one
2986       --
2987       IF g_cache_oiplip_los_rt_rec(l_index).id <> p_oiplip_id THEN
2988         --
2989         -- Loop through the hash using the jump routine to check further
2990         -- indexes
2991         --
2992         l_not_hash_found  := FALSE;
2993         --
2994         WHILE NOT l_not_hash_found LOOP
2995           --
2996           l_index  := l_index + g_hash_jump;
2997           --
2998           -- Check if the hash index exists, if not we can use it
2999           --
3000           IF NOT g_cache_oiplip_los_rt_rec.EXISTS(l_index) THEN
3001             --
3002             -- Lets store the hash value in the index
3003             --
3004             RAISE NO_DATA_FOUND;
3005           --
3006           ELSE
3007             --
3008             -- Make sure the index is the correct one
3009             --
3010             IF g_cache_oiplip_los_rt_rec(l_index).id = p_oiplip_id THEN
3011               --
3012               -- We have a match so the hashed value  has been stored before
3013               --
3014               l_not_hash_found  := TRUE;
3015             --
3016             END IF;
3017           --
3018           END IF;
3019         --
3020         END LOOP;
3021       --
3022       END IF;
3023     --
3024     END IF;
3025     --
3026     -- If p_old_val and p_new_val is set this means we are trying to retrieve
3027     -- the correct rate for the calculated value.
3028     -- Previously we just cached the first rate we
3029     -- found since we needed the determination code, the correct age,los code,etc
3030     -- By killing the cache and forcing the value to be removed we cache the
3031     -- correct rate profile for the case we need.
3032     --
3033     IF     p_old_val IS NOT NULL
3034        AND p_new_val IS NOT NULL THEN
3035       --
3036       RAISE NO_DATA_FOUND;
3037     --
3038     END IF;
3039     --
3040     p_rec    := g_cache_oiplip_los_rt_rec(l_index);
3041   --
3042   -- hr_utility.set_location ('Leaving '||l_package,10);
3043   --
3044   EXCEPTION
3045     --
3046     WHEN NO_DATA_FOUND THEN
3047       --
3048       -- The record has not been cached yet so lets cache it
3049       --
3050       OPEN c1;
3051       --
3052       FETCH c1 INTO g_cache_oiplip_los_rt_rec(l_index);
3053       -- PERFNEW
3054       IF c1%NOTFOUND THEN
3055          --
3056          l_c2notfound := false;
3057          OPEN c2;
3058          FETCH c2 INTO g_cache_oiplip_los_rt_rec(l_index);
3059          IF c2%NOTFOUND THEN
3060             --
3061             l_c2notfound := true;
3062             --
3063          END IF;
3064          CLOSE c2;
3065          --
3066       END IF;
3067       -- PERFNEW
3068       IF     p_old_val IS NULL
3069          AND p_new_val IS NULL THEN
3070         --
3071         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
3072           --
3073           if NOT g_cache_oiplip_los_rt_rec.EXISTS(l_index) then
3074             g_cache_oiplip_los_rt_rec(l_index).id     := p_oiplip_id;
3075             g_cache_oiplip_los_rt_rec(l_index).exist  := 'N';
3076           end if;
3077         --
3078         END IF;
3079       --
3080       END IF;
3081       --
3082       p_rec  := g_cache_oiplip_los_rt_rec(l_index);
3083       --
3084       CLOSE c1;
3085   --
3086   END get_los_oiplip_rate;
3087 --
3088   PROCEDURE get_los_rate(
3089     p_pgm_id            IN            NUMBER
3093    ,p_ptip_id           IN            NUMBER
3090    ,p_pl_id             IN            NUMBER
3091    ,p_oipl_id           IN            NUMBER
3092    ,p_plip_id           IN            NUMBER
3094    ,p_oiplip_id         IN            NUMBER
3095    ,p_old_val           IN            NUMBER DEFAULT NULL
3096    ,p_new_val           IN            NUMBER DEFAULT NULL
3097    ,p_business_group_id IN            NUMBER
3098    ,p_effective_date    IN            DATE
3099    ,p_rec               OUT NOCOPY    g_cache_los_rec_obj) IS
3100     --
3101     l_package VARCHAR2(80) := g_package || '.get_los_rate';
3102   --
3103   BEGIN
3104     --
3105     -- hr_utility.set_location ('Entering '||l_package,10);
3106     --
3107     -- Derive which data type we are dealing with
3108     --
3109     IF p_pgm_id IS NOT NULL THEN
3110       --
3111       get_los_pgm_rate(p_pgm_id=> p_pgm_id
3112        ,p_old_val           => p_old_val
3113        ,p_new_val           => p_new_val
3114        ,p_business_group_id => p_business_group_id
3115        ,p_effective_date    => p_effective_date
3116        ,p_rec               => p_rec);
3117     --
3118     ELSIF p_pl_id IS NOT NULL THEN
3119       --
3120       get_los_pl_rate(p_pl_id=> p_pl_id
3121        ,p_old_val           => p_old_val
3122        ,p_new_val           => p_new_val
3123        ,p_business_group_id => p_business_group_id
3124        ,p_effective_date    => p_effective_date
3125        ,p_rec               => p_rec);
3126     --
3127     ELSIF p_oipl_id IS NOT NULL THEN
3128       --
3129       get_los_oipl_rate(p_oipl_id=> p_oipl_id
3130        ,p_old_val           => p_old_val
3131        ,p_new_val           => p_new_val
3132        ,p_business_group_id => p_business_group_id
3133        ,p_effective_date    => p_effective_date
3134        ,p_rec               => p_rec);
3135     --
3136     ELSIF p_plip_id IS NOT NULL THEN
3137       --
3138       get_los_plip_rate(p_plip_id=> p_plip_id
3139        ,p_old_val           => p_old_val
3140        ,p_new_val           => p_new_val
3141        ,p_business_group_id => p_business_group_id
3142        ,p_effective_date    => p_effective_date
3143        ,p_rec               => p_rec);
3144     --
3145     ELSIF p_ptip_id IS NOT NULL THEN
3146       --
3147       get_los_ptip_rate(p_ptip_id=> p_ptip_id
3148        ,p_old_val           => p_old_val
3149        ,p_new_val           => p_new_val
3150        ,p_business_group_id => p_business_group_id
3151        ,p_effective_date    => p_effective_date
3152        ,p_rec               => p_rec);
3153     --
3154     ELSIF p_oiplip_id IS NOT NULL THEN
3155       --
3156       get_los_oiplip_rate(p_oiplip_id=> p_oiplip_id
3157        ,p_old_val           => p_old_val
3158        ,p_new_val           => p_new_val
3159        ,p_business_group_id => p_business_group_id
3160        ,p_effective_date    => p_effective_date
3161        ,p_rec               => p_rec);
3162     --
3163     END IF;
3164   --
3165   -- hr_utility.set_location ('Leaving '||l_package,10);
3166   --
3167   END get_los_rate;
3168 --
3169   PROCEDURE get_age_pgm_elig(
3170     p_pgm_id            IN            NUMBER
3174    ,p_effective_date    IN            DATE
3171    ,p_old_val           in            number  default null
3172    ,p_new_val           in            number  default null
3173    ,p_business_group_id IN            NUMBER
3175    ,p_rec               OUT NOCOPY    g_cache_age_rec_obj) IS
3176     --
3177     l_package        VARCHAR2(80) := g_package || '.get_age_pgm_elig';
3178     --
3179     -- Define Cursor
3180     --
3181     CURSOR c1 IS
3182       SELECT   p_pgm_id
3183               ,'Y'
3184               ,agf.age_det_cd
3185               ,agf.age_to_use_cd
3186               ,agf.age_uom
3187               ,agf.age_det_rl
3188               ,agf.rndg_cd
3189               ,agf.rndg_rl
3190               ,agf.age_calc_rl
3191               ,agf.mn_age_num
3192               ,agf.mx_age_num
3193       FROM     ben_age_fctr agf
3194               ,ben_elig_age_prte_f eap
3195               ,ben_eligy_prfl_f elp
3196               ,ben_prtn_elig_prfl_f cep
3197               ,ben_prtn_elig_f epa
3198       WHERE    epa.pgm_id = p_pgm_id
3199       AND      p_effective_date BETWEEN epa.effective_start_date
3200                    AND epa.effective_end_date
3201       AND      epa.prtn_elig_id = cep.prtn_elig_id
3202       AND      p_effective_date BETWEEN cep.effective_start_date
3203                    AND cep.effective_end_date
3204       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
3205       AND      p_effective_date BETWEEN elp.effective_start_date
3206                    AND elp.effective_end_date
3207       AND      eap.eligy_prfl_id = elp.eligy_prfl_id
3208       AND      p_effective_date BETWEEN eap.effective_start_date
3209                    AND eap.effective_end_date
3210       AND      eap.age_fctr_id = agf.age_fctr_id
3211       AND     (
3212                  (
3213                    p_new_val IS NOT NULL
3214                    AND p_old_val IS NOT NULL
3215                    AND p_new_val >= NVL(agf.mn_age_num ,p_new_val)
3216                    and p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
3217                                     trunc(nvl(agf.mx_age_num,p_new_val))
3218                  ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
3219                   nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
3220                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )
3221                   -- and p_old_val < agf.mn_age_num
3222                   )
3223                  OR
3224                  (
3225                    p_new_val IS NOT NULL
3226                    AND p_old_val IS NOT NULL
3227                    AND
3228                    (
3229                     p_new_val < NVL(agf.mn_age_num,p_new_val)
3230                     OR
3231                     p_new_val >=   decode(nvl(agf.mx_age_num,p_new_val) ,
3232                                     trunc(nvl(agf.mx_age_num,p_new_val))
3233                    ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
3234                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
3235                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )
3236                      )
3237                     AND p_old_val >= NVL(agf.mn_age_num ,p_old_val)
3238                     and p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
3239                                     trunc(nvl(agf.mx_age_num,p_old_val))
3240                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
3241                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
3242                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )
3243                   )
3244                  OR
3245                   (  p_new_val IS NULL
3246                      AND p_old_val IS NULL
3247                    )
3248             );
3249 
3250     --
3251     l_index          PLS_INTEGER;
3252     l_not_hash_found BOOLEAN;
3253   --
3254   BEGIN
3255     --
3256     -- hr_utility.set_location ('Entering '||l_package,10);
3257     --
3258     -- Steps to do process
3259     --
3260     -- 1) Try and get value from cache
3261     -- 2) If can get from cache then copy to output record
3262     -- 3) If can't get from cache do db hit and then
3263     --    copy to cache record and then copy to output record.
3264     --
3265     -- Get hashed index value
3266     --
3267     l_index  := MOD(p_pgm_id
3268                  ,g_hash_key);
3269     --
3270     IF NOT g_cache_pgm_age_el_rec.EXISTS(l_index) THEN
3271       --
3272       -- Lets store the hash value in this index
3273       --
3274       RAISE NO_DATA_FOUND;
3275     --
3276     ELSE
3277       --
3278       -- If it does exist make sure its the right one
3279       --
3280       IF g_cache_pgm_age_el_rec(l_index).id <> p_pgm_id THEN
3281         --
3282         -- Loop through the hash using the jump routine to check further
3283         -- indexes
3284         --
3285         l_not_hash_found  := FALSE;
3286         --
3287         WHILE NOT l_not_hash_found LOOP
3288           --
3289           l_index  := l_index + g_hash_jump;
3290           --
3291           -- Check if the hash index exists, if not we can use it
3292           --
3293           IF NOT g_cache_pgm_age_el_rec.EXISTS(l_index) THEN
3294             --
3298           --
3295             -- Lets store the hash value in the index
3296             --
3297             RAISE NO_DATA_FOUND;
3299           ELSE
3300             --
3301             -- Make sure the index is the correct one
3302             --
3303             IF g_cache_pgm_age_el_rec(l_index).id = p_pgm_id THEN
3304               --
3305               -- We have a match so the hashed value  has been stored before
3306               --
3307               l_not_hash_found  := TRUE;
3308             --
3309             END IF;
3310           --
3311           END IF;
3312         --
3313         END LOOP;
3314       --
3315       END IF;
3316     --
3317     END IF;
3318     --
3319      IF     p_old_val IS NOT NULL
3320        AND p_new_val IS NOT NULL THEN
3321       --
3322       RAISE NO_DATA_FOUND;
3323     --
3324     END IF;
3325 
3326     p_rec    := g_cache_pgm_age_el_rec(l_index);
3327   --
3328   -- hr_utility.set_location ('Leaving '||l_package,10);
3329   --
3330   EXCEPTION
3331     --
3332     WHEN NO_DATA_FOUND THEN
3333       --
3334       -- The record has not been cached yet so lets cache it
3335       --
3336       OPEN c1;
3337       --
3338       FETCH c1 INTO g_cache_pgm_age_el_rec(l_index);
3339       IF c1%NOTFOUND THEN
3340         --
3341         if NOT g_cache_pgm_age_el_rec.EXISTS(l_index) then
3342           g_cache_pgm_age_el_rec(l_index).id     := p_pgm_id;
3343           g_cache_pgm_age_el_rec(l_index).exist  := 'N';
3344         end if;
3345       --
3346       END IF;
3347       --
3348       p_rec  := g_cache_pgm_age_el_rec(l_index);
3349       --
3350       CLOSE c1;
3351   --
3352   END get_age_pgm_elig;
3353 --
3354   PROCEDURE get_age_pl_elig(
3355     p_pl_id             IN            NUMBER
3356    ,p_old_val           in            number  default null
3357    ,p_new_val           in            number  default null
3358    ,p_business_group_id IN            NUMBER
3359    ,p_effective_date    IN            DATE
3360    ,p_rec               OUT NOCOPY    g_cache_age_rec_obj) IS
3361     --
3362     l_package        VARCHAR2(80) := g_package || '.get_age_pl_elig';
3363     --
3364     -- Define Cursor
3365     --
3366     CURSOR c1 IS
3367       SELECT   p_pl_id
3368               ,'Y'
3369               ,agf.age_det_cd
3370               ,agf.age_to_use_cd
3371               ,agf.age_uom
3372               ,agf.age_det_rl
3373               ,agf.rndg_cd
3374               ,agf.rndg_rl
3375               ,agf.age_calc_rl
3376               ,agf.mn_age_num
3377               ,agf.mx_age_num
3378       FROM     ben_age_fctr agf
3379               ,ben_elig_age_prte_f eap
3380               ,ben_eligy_prfl_f elp
3381               ,ben_prtn_elig_prfl_f cep
3382               ,ben_prtn_elig_f epa
3383       WHERE    epa.pl_id = p_pl_id
3384       AND      p_effective_date BETWEEN epa.effective_start_date
3385                    AND epa.effective_end_date
3386       AND      epa.prtn_elig_id = cep.prtn_elig_id
3387       AND      p_effective_date BETWEEN cep.effective_start_date
3388                    AND cep.effective_end_date
3389       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
3390       AND      p_effective_date BETWEEN elp.effective_start_date
3391                    AND elp.effective_end_date
3392       AND      eap.eligy_prfl_id = elp.eligy_prfl_id
3393       AND      p_effective_date BETWEEN eap.effective_start_date
3394                    AND eap.effective_end_date
3395       AND      eap.age_fctr_id = agf.age_fctr_id
3396       AND     (
3397                  (
3398                    p_new_val IS NOT NULL
3399                    AND p_old_val IS NOT NULL
3400                    AND p_new_val >= NVL(agf.mn_age_num ,p_new_val)
3401                    and p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
3402                                     trunc(nvl(agf.mx_age_num,p_new_val))
3403                  ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
3404                   nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
3405                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )
3406                   -- and p_old_val < agf.mn_age_num
3407                   )
3408                  OR
3409                  (
3410                    p_new_val IS NOT NULL
3411                    AND p_old_val IS NOT NULL
3412                    AND
3413                    (
3414                     p_new_val < NVL(agf.mn_age_num,p_new_val)
3415                     OR
3416                     p_new_val >=   decode(nvl(agf.mx_age_num,p_new_val) ,
3417                                     trunc(nvl(agf.mx_age_num,p_new_val))
3418                    ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
3419                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
3420                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )
3421                      )
3422                     AND p_old_val >= NVL(agf.mn_age_num ,p_old_val)
3423                     and p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
3424                                     trunc(nvl(agf.mx_age_num,p_old_val))
3425                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
3426                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
3430                   (  p_new_val IS NULL
3427                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )
3428                   )
3429                  OR
3431                      AND p_old_val IS NULL
3432                    )
3433             );
3434 
3435     --
3436     l_index          PLS_INTEGER;
3437     l_not_hash_found BOOLEAN;
3438   --
3439   BEGIN
3440     --
3441     -- hr_utility.set_location ('Entering '||l_package,10);
3442     --
3443     -- Steps to do process
3444     --
3445     -- 1) Try and get value from cache
3446     -- 2) If can get from cache then copy to output record
3447     -- 3) If can't get from cache do db hit and then
3448     --    copy to cache record and then copy to output record.
3449     --
3450     -- Get hashed index value
3451     --
3452     l_index  := MOD(p_pl_id
3453                  ,g_hash_key);
3454     --
3455     IF NOT g_cache_pl_age_el_rec.EXISTS(l_index) THEN
3456       --
3457       -- Lets store the hash value in this index
3458       --
3459       RAISE NO_DATA_FOUND;
3460     --
3461     ELSE
3462       --
3463       -- If it does exist make sure its the right one
3464       --
3465       IF g_cache_pl_age_el_rec(l_index).id <> p_pl_id THEN
3466         --
3467         -- Loop through the hash using the jump routine to check further
3468         -- indexes
3469         --
3470         l_not_hash_found  := FALSE;
3471         --
3472         WHILE NOT l_not_hash_found LOOP
3473           --
3474           l_index  := l_index + g_hash_jump;
3475           --
3476           -- Check if the hash index exists, if not we can use it
3477           --
3478           IF NOT g_cache_pl_age_el_rec.EXISTS(l_index) THEN
3479             --
3480             -- Lets store the hash value in the index
3481             --
3482             RAISE NO_DATA_FOUND;
3483           --
3484           ELSE
3485             --
3486             -- Make sure the index is the correct one
3487             --
3488             IF g_cache_pl_age_el_rec(l_index).id = p_pl_id THEN
3489               --
3490               -- We have a match so the hashed value  has been stored before
3491               --
3492               l_not_hash_found  := TRUE;
3493             --
3494             END IF;
3495           --
3496           END IF;
3497         --
3498         END LOOP;
3499       --
3500       END IF;
3501     --
3502     END IF;
3503     --
3504      IF     p_old_val IS NOT NULL
3505        AND p_new_val IS NOT NULL THEN
3506       --
3507       RAISE NO_DATA_FOUND;
3508     --
3509     END IF;
3510     p_rec    := g_cache_pl_age_el_rec(l_index);
3511   --
3512   -- hr_utility.set_location ('Leaving '||l_package,10);
3513   --
3514   EXCEPTION
3515     --
3516     WHEN NO_DATA_FOUND THEN
3517       --
3518       -- The record has not been cached yet so lets cache it
3519       --
3520       OPEN c1;
3521       --
3522       FETCH c1 INTO g_cache_pl_age_el_rec(l_index);
3523       IF c1%NOTFOUND THEN
3524         --
3525         if NOT g_cache_pl_age_el_rec.EXISTS(l_index) then
3526           g_cache_pl_age_el_rec(l_index).id     := p_pl_id;
3527           g_cache_pl_age_el_rec(l_index).exist  := 'N';
3528         end if;
3529       --
3530       END IF;
3531       --
3532       p_rec  := g_cache_pl_age_el_rec(l_index);
3533       --
3534       CLOSE c1;
3535   --
3536   END get_age_pl_elig;
3537 --
3538   PROCEDURE get_age_oipl_elig(
3539     p_oipl_id           IN            NUMBER
3540    ,p_old_val           in            number  default null
3541    ,p_new_val           in            number  default null
3542    ,p_business_group_id IN            NUMBER
3543    ,p_effective_date    IN            DATE
3544    ,p_rec               OUT NOCOPY    g_cache_age_rec_obj) IS
3545     --
3546     l_package        VARCHAR2(80) := g_package || '.get_age_oipl_elig';
3547     --
3548     -- Define Cursor
3549     --
3550     CURSOR c1 IS
3551       SELECT   p_oipl_id
3552               ,'Y'
3553               ,agf.age_det_cd
3554               ,agf.age_to_use_cd
3555               ,agf.age_uom
3556               ,agf.age_det_rl
3557               ,agf.rndg_cd
3558               ,agf.rndg_rl
3559               ,agf.age_calc_rl
3560               ,agf.mn_age_num
3561               ,agf.mx_age_num
3562       FROM     ben_age_fctr agf
3563               ,ben_elig_age_prte_f eap
3564               ,ben_eligy_prfl_f elp
3565               ,ben_prtn_elig_prfl_f cep
3566               ,ben_prtn_elig_f epa
3567       WHERE    epa.oipl_id = p_oipl_id
3568       AND      p_effective_date BETWEEN epa.effective_start_date
3569                    AND epa.effective_end_date
3570       AND      epa.prtn_elig_id = cep.prtn_elig_id
3571       AND      p_effective_date BETWEEN cep.effective_start_date
3572                    AND cep.effective_end_date
3573       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
3574       AND      p_effective_date BETWEEN elp.effective_start_date
3575                    AND elp.effective_end_date
3576       AND      eap.eligy_prfl_id = elp.eligy_prfl_id
3577       AND      p_effective_date BETWEEN eap.effective_start_date
3581                  (
3578                    AND eap.effective_end_date
3579       AND      eap.age_fctr_id = agf.age_fctr_id
3580       AND     (
3582                    p_new_val IS NOT NULL
3583                    AND p_old_val IS NOT NULL
3584                    AND p_new_val >= NVL(agf.mn_age_num ,p_new_val)
3585                    and p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
3586                                     trunc(nvl(agf.mx_age_num,p_new_val))
3587                  ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
3588                   nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
3589                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )
3590                   -- and p_old_val < agf.mn_age_num
3591                   )
3592                  OR
3593                  (
3594                    p_new_val IS NOT NULL
3595                    AND p_old_val IS NOT NULL
3596                    AND
3597                    (
3598                     p_new_val < NVL(agf.mn_age_num,p_new_val)
3599                     OR
3600                     p_new_val >=   decode(nvl(agf.mx_age_num,p_new_val) ,
3601                                     trunc(nvl(agf.mx_age_num,p_new_val))
3602                    ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
3603                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
3604                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )
3605                      )
3606                     AND p_old_val >= NVL(agf.mn_age_num ,p_old_val)
3607                     and p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
3608                                     trunc(nvl(agf.mx_age_num,p_old_val))
3609                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
3610                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
3611                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )
3612                   )
3613                  OR
3614                   (  p_new_val IS NULL
3615                      AND p_old_val IS NULL
3616                    )
3617             );
3618 
3619     --
3620     l_index          PLS_INTEGER;
3621     l_not_hash_found BOOLEAN;
3622   --
3623   BEGIN
3624     --
3625     -- hr_utility.set_location ('Entering '||l_package,10);
3626     --
3627     -- Steps to do process
3628     --
3629     -- 1) Try and get value from cache
3630     -- 2) If can get from cache then copy to output record
3631     -- 3) If can't get from cache do db hit and then
3632     --    copy to cache record and then copy to output record.
3633     --
3634     -- Get hashed index value
3635     --
3636     l_index  := MOD(p_oipl_id
3637                  ,g_hash_key);
3638     --
3639     IF NOT g_cache_oipl_age_el_rec.EXISTS(l_index) THEN
3640       --
3641       -- Lets store the hash value in this index
3642       --
3643       RAISE NO_DATA_FOUND;
3644     --
3645     ELSE
3646       --
3647       -- If it does exist make sure its the right one
3648       --
3649       IF g_cache_oipl_age_el_rec(l_index).id <> p_oipl_id THEN
3650         --
3651         -- Loop through the hash using the jump routine to check further
3652         -- indexes
3653         --
3654         l_not_hash_found  := FALSE;
3655         --
3656         WHILE NOT l_not_hash_found LOOP
3657           --
3658           l_index  := l_index + g_hash_jump;
3659           --
3660           -- Check if the hash index exists, if not we can use it
3661           --
3662           IF NOT g_cache_oipl_age_el_rec.EXISTS(l_index) THEN
3663             --
3664             -- Lets store the hash value in the index
3665             --
3666             RAISE NO_DATA_FOUND;
3667           --
3668           ELSE
3669             --
3670             -- Make sure the index is the correct one
3671             --
3672             IF g_cache_oipl_age_el_rec(l_index).id = p_oipl_id THEN
3673               --
3674               -- We have a match so the hashed value  has been stored before
3675               --
3676               l_not_hash_found  := TRUE;
3677             --
3678             END IF;
3679           --
3680           END IF;
3681         --
3682         END LOOP;
3683       --
3684       END IF;
3685     --
3686     END IF;
3687     --
3688      IF     p_old_val IS NOT NULL
3689        AND p_new_val IS NOT NULL THEN
3690       --
3691       RAISE NO_DATA_FOUND;
3692     --
3693     END IF;
3694     p_rec    := g_cache_oipl_age_el_rec(l_index);
3695   --
3696   -- hr_utility.set_location ('Leaving '||l_package,10);
3697   --
3698   EXCEPTION
3699     --
3700     WHEN NO_DATA_FOUND THEN
3701       --
3702       -- The record has not been cached yet so lets cache it
3703       --
3704       OPEN c1;
3705       --
3706       FETCH c1 INTO g_cache_oipl_age_el_rec(l_index);
3707       IF c1%NOTFOUND THEN
3708         --
3709         if NOT g_cache_oipl_age_el_rec.EXISTS(l_index) then
3710           g_cache_oipl_age_el_rec(l_index).id     := p_oipl_id;
3711           g_cache_oipl_age_el_rec(l_index).exist  := 'N';
3712         end if;
3713       --
3714       END IF;
3715       --
3719   --
3716       p_rec  := g_cache_oipl_age_el_rec(l_index);
3717       --
3718       CLOSE c1;
3720   END get_age_oipl_elig;
3721 --
3722   PROCEDURE get_age_plip_elig(
3723     p_plip_id           IN            NUMBER
3724    ,p_old_val           in            number  default null
3725    ,p_new_val           in            number  default null
3726    ,p_business_group_id IN            NUMBER
3727    ,p_effective_date    IN            DATE
3728    ,p_rec               OUT NOCOPY    g_cache_age_rec_obj) IS
3729     --
3730     l_package        VARCHAR2(80) := g_package || '.get_age_plip_elig';
3731     --
3732     -- Define Cursor
3733     --
3734     CURSOR c1 IS
3735       SELECT   p_plip_id
3736               ,'Y'
3737               ,agf.age_det_cd
3738               ,agf.age_to_use_cd
3739               ,agf.age_uom
3740               ,agf.age_det_rl
3741               ,agf.rndg_cd
3742               ,agf.rndg_rl
3743               ,agf.age_calc_rl
3744               ,agf.mn_age_num
3745               ,agf.mx_age_num
3746       FROM     ben_age_fctr agf
3747               ,ben_elig_age_prte_f eap
3748               ,ben_eligy_prfl_f elp
3749               ,ben_prtn_elig_prfl_f cep
3750               ,ben_prtn_elig_f epa
3751       WHERE    epa.plip_id = p_plip_id
3752       AND      p_effective_date BETWEEN epa.effective_start_date
3753                    AND epa.effective_end_date
3754       AND      epa.prtn_elig_id = cep.prtn_elig_id
3755       AND      p_effective_date BETWEEN cep.effective_start_date
3756                    AND cep.effective_end_date
3757       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
3758       AND      p_effective_date BETWEEN elp.effective_start_date
3759                    AND elp.effective_end_date
3760       AND      eap.eligy_prfl_id = elp.eligy_prfl_id
3761       AND      p_effective_date BETWEEN eap.effective_start_date
3762                    AND eap.effective_end_date
3763       AND      eap.age_fctr_id = agf.age_fctr_id
3764       AND     (
3765                  (
3766                    p_new_val IS NOT NULL
3767                    AND p_old_val IS NOT NULL
3768                    AND p_new_val >= NVL(agf.mn_age_num ,p_new_val)
3769                    and p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
3770                                     trunc(nvl(agf.mx_age_num,p_new_val))
3771                  ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
3772                   nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
3773                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )
3774                   -- and p_old_val < agf.mn_age_num
3775                   )
3776                  OR
3777                  (
3778                    p_new_val IS NOT NULL
3779                    AND p_old_val IS NOT NULL
3780                    AND
3781                    (
3782                     p_new_val < NVL(agf.mn_age_num,p_new_val)
3783                     OR
3784                     p_new_val >=   decode(nvl(agf.mx_age_num,p_new_val) ,
3785                                     trunc(nvl(agf.mx_age_num,p_new_val))
3786                    ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
3787                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
3788                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )
3789                      )
3790                     AND p_old_val >= NVL(agf.mn_age_num ,p_old_val)
3791                     and p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
3792                                     trunc(nvl(agf.mx_age_num,p_old_val))
3793                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
3794                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
3795                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )
3796                   )
3797                  OR
3798                   (  p_new_val IS NULL
3799                      AND p_old_val IS NULL
3800                    )
3801             );
3802 
3803     --
3804     l_index          PLS_INTEGER;
3805     l_not_hash_found BOOLEAN;
3806   --
3807   BEGIN
3808     --
3809     -- hr_utility.set_location ('Entering '||l_package,10);
3810     --
3811     -- Steps to do process
3812     --
3813     -- 1) Try and get value from cache
3814     -- 2) If can get from cache then copy to output record
3815     -- 3) If can't get from cache do db hit and then
3816     --    copy to cache record and then copy to output record.
3817     --
3818     -- Get hashed index value
3819     --
3820     l_index  := MOD(p_plip_id
3821                  ,g_hash_key);
3822     --
3823     IF NOT g_cache_plip_age_el_rec.EXISTS(l_index) THEN
3824       --
3825       -- Lets store the hash value in this index
3826       --
3827       RAISE NO_DATA_FOUND;
3828     --
3829     ELSE
3830       --
3831       -- If it does exist make sure its the right one
3832       --
3833       IF g_cache_plip_age_el_rec(l_index).id <> p_plip_id THEN
3834         --
3835         -- Loop through the hash using the jump routine to check further
3836         -- indexes
3837         --
3838         l_not_hash_found  := FALSE;
3839         --
3840         WHILE NOT l_not_hash_found LOOP
3844           -- Check if the hash index exists, if not we can use it
3841           --
3842           l_index  := l_index + g_hash_jump;
3843           --
3845           --
3846           IF NOT g_cache_plip_age_el_rec.EXISTS(l_index) THEN
3847             --
3848             -- Lets store the hash value in the index
3849             --
3850             RAISE NO_DATA_FOUND;
3851           --
3852           ELSE
3853             --
3854             -- Make sure the index is the correct one
3855             --
3856             IF g_cache_plip_age_el_rec(l_index).id = p_plip_id THEN
3857               --
3858               -- We have a match so the hashed value  has been stored before
3859               --
3860               l_not_hash_found  := TRUE;
3861             --
3862             END IF;
3863           --
3864           END IF;
3865         --
3866         END LOOP;
3867       --
3868       END IF;
3869     --
3870     END IF;
3871     --
3872      IF     p_old_val IS NOT NULL
3873        AND p_new_val IS NOT NULL THEN
3874       --
3875       RAISE NO_DATA_FOUND;
3876     --
3877     END IF;
3878     p_rec    := g_cache_plip_age_el_rec(l_index);
3879   --
3880   -- hr_utility.set_location ('Leaving '||l_package,10);
3881   --
3882   EXCEPTION
3883     --
3884     WHEN NO_DATA_FOUND THEN
3885       --
3886       -- The record has not been cached yet so lets cache it
3887       --
3888       OPEN c1;
3889       --
3890       FETCH c1 INTO g_cache_plip_age_el_rec(l_index);
3891       IF c1%NOTFOUND THEN
3892         --
3893         if NOT g_cache_plip_age_el_rec.EXISTS(l_index) then
3894           g_cache_plip_age_el_rec(l_index).id     := p_plip_id;
3895           g_cache_plip_age_el_rec(l_index).exist  := 'N';
3896         end if;
3897       --
3898       END IF;
3899       --
3900       p_rec  := g_cache_plip_age_el_rec(l_index);
3901       --
3902       CLOSE c1;
3903   --
3904   END get_age_plip_elig;
3905 --
3906   PROCEDURE get_age_ptip_elig(
3907     p_ptip_id           IN            NUMBER
3908    ,p_old_val           in            number  default null
3909    ,p_new_val           in            number  default null
3910    ,p_business_group_id IN            NUMBER
3911    ,p_effective_date    IN            DATE
3912    ,p_rec               OUT NOCOPY    g_cache_age_rec_obj) IS
3913     --
3914     l_package        VARCHAR2(80) := g_package || '.get_age_ptip_elig';
3915     --
3916     -- Define Cursor
3917     --
3918     CURSOR c1 IS
3919       SELECT   p_ptip_id
3920               ,'Y'
3921               ,agf.age_det_cd
3922               ,agf.age_to_use_cd
3923               ,agf.age_uom
3924               ,agf.age_det_rl
3925               ,agf.rndg_cd
3926               ,agf.rndg_rl
3927               ,agf.age_calc_rl
3928               ,agf.mn_age_num
3929               ,agf.mx_age_num
3930       FROM     ben_age_fctr agf
3931               ,ben_elig_age_prte_f eap
3932               ,ben_eligy_prfl_f elp
3933               ,ben_prtn_elig_prfl_f cep
3934               ,ben_prtn_elig_f epa
3935       WHERE    epa.ptip_id = p_ptip_id
3936       AND      p_effective_date BETWEEN epa.effective_start_date
3937                    AND epa.effective_end_date
3938       AND      epa.prtn_elig_id = cep.prtn_elig_id
3939       AND      p_effective_date BETWEEN cep.effective_start_date
3940                    AND cep.effective_end_date
3941       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
3942       AND      p_effective_date BETWEEN elp.effective_start_date
3943                    AND elp.effective_end_date
3944       AND      eap.eligy_prfl_id = elp.eligy_prfl_id
3945       AND      p_effective_date BETWEEN eap.effective_start_date
3946                    AND eap.effective_end_date
3947       AND      eap.age_fctr_id = agf.age_fctr_id
3948       AND     (
3949                  (
3950                    p_new_val IS NOT NULL
3951                    AND p_old_val IS NOT NULL
3952                    AND p_new_val >= NVL(agf.mn_age_num ,p_new_val)
3953                    and p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
3954                                     trunc(nvl(agf.mx_age_num,p_new_val))
3955                  ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
3956                   nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
3957                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )
3958                   -- and p_old_val < agf.mn_age_num
3959                   )
3960                  OR
3961                  (
3962                    p_new_val IS NOT NULL
3963                    AND p_old_val IS NOT NULL
3964                    AND
3965                    (
3966                     p_new_val < NVL(agf.mn_age_num,p_new_val)
3967                     OR
3968                     p_new_val >=   decode(nvl(agf.mx_age_num,p_new_val) ,
3969                                     trunc(nvl(agf.mx_age_num,p_new_val))
3970                    ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
3971                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
3972                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )
3973                      )
3974                     AND p_old_val >= NVL(agf.mn_age_num ,p_old_val)
3978                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
3975                     and p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
3976                                     trunc(nvl(agf.mx_age_num,p_old_val))
3977                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
3979                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )
3980                   )
3981                  OR
3982                   (  p_new_val IS NULL
3983                      AND p_old_val IS NULL
3984                    )
3985             );
3986 
3987     --
3988     l_index          PLS_INTEGER;
3989     l_not_hash_found BOOLEAN;
3990   --
3991   BEGIN
3992     --
3993     -- hr_utility.set_location ('Entering '||l_package,10);
3994     --
3995     -- Steps to do process
3996     --
3997     -- 1) Try and get value from cache
3998     -- 2) If can get from cache then copy to output record
3999     -- 3) If can't get from cache do db hit and then
4000     --    copy to cache record and then copy to output record.
4001     --
4002     -- Get hashed index value
4003     --
4004     l_index  := MOD(p_ptip_id
4005                  ,g_hash_key);
4006     --
4007     IF NOT g_cache_ptip_age_el_rec.EXISTS(l_index) THEN
4008       --
4009       -- Lets store the hash value in this index
4010       --
4011       RAISE NO_DATA_FOUND;
4012     --
4013     ELSE
4014       --
4015       -- If it does exist make sure its the right one
4016       --
4017       IF g_cache_ptip_age_el_rec(l_index).id <> p_ptip_id THEN
4018         --
4019         -- Loop through the hash using the jump routine to check further
4020         -- indexes
4021         --
4022         l_not_hash_found  := FALSE;
4023         --
4024         WHILE NOT l_not_hash_found LOOP
4025           --
4026           l_index  := l_index + g_hash_jump;
4027           --
4028           -- Check if the hash index exists, if not we can use it
4029           --
4030           IF NOT g_cache_ptip_age_el_rec.EXISTS(l_index) THEN
4031             --
4032             -- Lets store the hash value in the index
4033             --
4034             RAISE NO_DATA_FOUND;
4035           --
4036           ELSE
4037             --
4038             -- Make sure the index is the correct one
4039             --
4040             IF g_cache_ptip_age_el_rec(l_index).id = p_ptip_id THEN
4041               --
4042               -- We have a match so the hashed value  has been stored before
4043               --
4044               l_not_hash_found  := TRUE;
4045             --
4046             END IF;
4047           --
4048           END IF;
4049         --
4050         END LOOP;
4051       --
4052       END IF;
4053     --
4054     END IF;
4055     --
4056      IF     p_old_val IS NOT NULL
4057        AND p_new_val IS NOT NULL THEN
4058       --
4059       RAISE NO_DATA_FOUND;
4060     --
4061     END IF;
4062     p_rec    := g_cache_ptip_age_el_rec(l_index);
4063   --
4064   -- hr_utility.set_location ('Leaving '||l_package,10);
4065   --
4066   EXCEPTION
4067     --
4068     WHEN NO_DATA_FOUND THEN
4069       --
4070       -- The record has not been cached yet so lets cache it
4071       --
4072       OPEN c1;
4073       --
4074       FETCH c1 INTO g_cache_ptip_age_el_rec(l_index);
4075       IF c1%NOTFOUND THEN
4076         --
4077         if NOT g_cache_ptip_age_el_rec.EXISTS(l_index) then
4078           g_cache_ptip_age_el_rec(l_index).id     := p_ptip_id;
4079           g_cache_ptip_age_el_rec(l_index).exist  := 'N';
4080         end if;
4081       --
4082       END IF;
4083       --
4084       p_rec  := g_cache_ptip_age_el_rec(l_index);
4085       --
4086       CLOSE c1;
4087   --
4088   END get_age_ptip_elig;
4089 --
4090   PROCEDURE get_age_stated(
4091     p_age_fctr_id       IN            NUMBER
4092    ,p_business_group_id IN            NUMBER
4093    ,p_rec               OUT NOCOPY    g_cache_age_rec_obj) IS
4094     --
4095     l_package        VARCHAR2(80) := g_package || '.get_age_stated';
4096     --
4097     CURSOR c1 IS
4098       SELECT   p_age_fctr_id
4099               ,'Y'
4100               ,agf.age_det_cd
4101               ,agf.age_to_use_cd
4102               ,agf.age_uom
4103               ,agf.age_det_rl
4104               ,agf.rndg_cd
4105               ,agf.rndg_rl
4106               ,agf.age_calc_rl
4107               ,agf.mn_age_num
4108               ,agf.mx_age_num
4109       FROM     ben_age_fctr agf
4110       WHERE    agf.age_fctr_id = p_age_fctr_id;
4111     --
4112     l_index          PLS_INTEGER;
4113     l_not_hash_found BOOLEAN;
4114   --
4115   BEGIN
4116     --
4117     -- hr_utility.set_location ('Entering '||l_package,10);
4118     --
4119     -- Steps to do process
4120     --
4121     -- 1) Try and get value from cache
4122     -- 2) If can get from cache then copy to output record
4123     -- 3) If can't get from cache do db hit and then
4124     --    copy to cache record and then copy to output record.
4125     --
4126     -- Get hashed index value
4127     --
4128     l_index  := MOD(p_age_fctr_id
4129                  ,g_hash_key);
4130     --
4134       --
4131     IF NOT g_cache_stated_age_rec.EXISTS(l_index) THEN
4132       --
4133       -- Lets store the hash value in this index
4135       RAISE NO_DATA_FOUND;
4136     --
4137     ELSE
4138       --
4139       -- If it does exist make sure its the right one
4140       --
4141       IF g_cache_stated_age_rec(l_index).id <> p_age_fctr_id THEN
4142         --
4143         -- Loop through the hash using the jump routine to check further
4144         -- indexes
4145         --
4146         l_not_hash_found  := FALSE;
4147         --
4148         WHILE NOT l_not_hash_found LOOP
4149           --
4150           l_index  := l_index + g_hash_jump;
4151           --
4152           -- Check if the hash index exists, if not we can use it
4153           --
4154           IF NOT g_cache_stated_age_rec.EXISTS(l_index) THEN
4155             --
4156             -- Lets store the hash value in the index
4157             --
4158             RAISE NO_DATA_FOUND;
4159           --
4160           ELSE
4161             --
4162             -- Make sure the index is the correct one
4163             --
4164             IF g_cache_stated_age_rec(l_index).id = p_age_fctr_id THEN
4165               --
4166               -- We have a match so the hashed value  has been stored before
4167               --
4168               l_not_hash_found  := TRUE;
4169             --
4170             END IF;
4171           --
4172           END IF;
4173         --
4174         END LOOP;
4175       --
4176       END IF;
4177     --
4178     END IF;
4179     --
4180     p_rec    := g_cache_stated_age_rec(l_index);
4181   --
4182   -- hr_utility.set_location ('Leaving '||l_package,10);
4183   --
4184   EXCEPTION
4185     --
4186     WHEN NO_DATA_FOUND THEN
4187       --
4188       -- The record has not been cached yet so lets cache it
4189       --
4190       OPEN c1;
4191       --
4192       FETCH c1 INTO g_cache_stated_age_rec(l_index);
4193       IF c1%NOTFOUND THEN
4194         --
4195         if NOT g_cache_stated_age_rec.EXISTS(l_index) then
4196           g_cache_stated_age_rec(l_index).id     := p_age_fctr_id;
4197           g_cache_stated_age_rec(l_index).exist  := 'N';
4198         end if;
4199       --
4200       END IF;
4201       --
4202       p_rec  := g_cache_stated_age_rec(l_index);
4203       --
4204       CLOSE c1;
4205   --
4206   END get_age_stated;
4207 --
4208   PROCEDURE get_age_elig(
4209     p_pgm_id            IN            NUMBER
4210    ,p_pl_id             IN            NUMBER
4211    ,p_oipl_id           IN            NUMBER
4212    ,p_plip_id           IN            NUMBER
4213    ,p_ptip_id           IN            NUMBER
4214    ,p_old_val           in            number  default null
4215    ,p_new_val           in            number  default null
4216    ,p_business_group_id IN            NUMBER
4217    ,p_effective_date    IN            DATE
4218    ,p_rec               OUT NOCOPY    g_cache_age_rec_obj) IS
4219     --
4220     l_package VARCHAR2(80) := g_package || '.get_age_elig';
4221   --
4222   BEGIN
4223     --
4224     -- hr_utility.set_location ('Entering '||l_package,10);
4225     --
4226     -- Derive which data type we are dealing with
4227     --
4228     IF p_pgm_id IS NOT NULL THEN
4229       --
4230       get_age_pgm_elig(p_pgm_id=> p_pgm_id
4231        ,p_old_val           => p_old_val
4232        ,p_new_val           => p_new_val
4233        ,p_business_group_id => p_business_group_id
4234        ,p_effective_date    => p_effective_date
4235        ,p_rec               => p_rec);
4236     --
4237     ELSIF p_pl_id IS NOT NULL THEN
4238       --
4239       get_age_pl_elig(p_pl_id=> p_pl_id
4240         ,p_old_val           => p_old_val
4241        ,p_new_val           => p_new_val
4242        ,p_business_group_id => p_business_group_id
4243        ,p_effective_date    => p_effective_date
4244        ,p_rec               => p_rec);
4245     --
4246     ELSIF p_oipl_id IS NOT NULL THEN
4247       --
4248       get_age_oipl_elig(p_oipl_id=> p_oipl_id
4249         ,p_old_val           => p_old_val
4250        ,p_new_val           => p_new_val
4251        ,p_business_group_id => p_business_group_id
4252        ,p_effective_date    => p_effective_date
4253        ,p_rec               => p_rec);
4254     --
4255     ELSIF p_plip_id IS NOT NULL THEN
4256       --
4257       get_age_plip_elig(p_plip_id=> p_plip_id
4258         ,p_old_val           => p_old_val
4259        ,p_new_val           => p_new_val
4260        ,p_business_group_id => p_business_group_id
4261        ,p_effective_date    => p_effective_date
4262        ,p_rec               => p_rec);
4263     --
4264     ELSIF p_ptip_id IS NOT NULL THEN
4265       --
4266       get_age_ptip_elig(p_ptip_id=> p_ptip_id
4267         ,p_old_val           => p_old_val
4268        ,p_new_val           => p_new_val
4269        ,p_business_group_id => p_business_group_id
4270        ,p_effective_date    => p_effective_date
4271        ,p_rec               => p_rec);
4272     --
4273     END IF;
4274   --
4275   -- hr_utility.set_location ('Leaving '||l_package,10);
4276   --
4277   END get_age_elig;
4278 --
4279   PROCEDURE get_age_pgm_rate(
4283    ,p_business_group_id IN            NUMBER
4280     p_pgm_id            IN            NUMBER
4281    ,p_old_val           IN            NUMBER DEFAULT NULL
4282    ,p_new_val           IN            NUMBER DEFAULT NULL
4284    ,p_effective_date    IN            DATE
4285    ,p_rec               OUT NOCOPY    g_cache_age_rec_obj) IS
4286     --
4287     l_package        VARCHAR2(80) := g_package || '.get_age_pgm_rate';
4288     l_old_val_1 NUMBER := p_old_val + 1;
4289     l_new_val_1 NUMBER := p_new_val + 1;
4290     --
4291     -- Define Cursor
4292     --
4293     CURSOR c1 IS
4294       SELECT   p_pgm_id
4295               ,'Y'
4296               ,agf.age_det_cd
4297               ,agf.age_to_use_cd
4298               ,agf.age_uom
4299               ,agf.age_det_rl
4300               ,agf.rndg_cd
4301               ,agf.rndg_rl
4302               ,agf.age_calc_rl
4303               ,agf.mn_age_num
4304               ,agf.mx_age_num
4305       FROM     ben_age_fctr agf
4306               ,ben_age_rt_f art
4307               ,ben_vrbl_rt_prfl_f vpf
4308               ,ben_acty_vrbl_rt_f avr
4309               ,ben_acty_base_rt_f abr
4310       WHERE    abr.pgm_id = p_pgm_id
4311       AND      p_effective_date BETWEEN abr.effective_start_date
4312                    AND abr.effective_end_date
4313       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
4314       AND      p_effective_date BETWEEN avr.effective_start_date
4315                    AND avr.effective_end_date
4316       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
4317       AND      p_effective_date BETWEEN vpf.effective_start_date
4318                    AND vpf.effective_end_date
4319       AND      vpf.vrbl_rt_prfl_id = art.vrbl_rt_prfl_id
4320       AND      p_effective_date BETWEEN art.effective_start_date
4321                    AND art.effective_end_date
4322       AND      art.age_fctr_id = agf.age_fctr_id
4323       AND      (
4324                     (
4325                           p_new_val IS NOT NULL
4326                       AND p_old_val IS NOT NULL
4327                       AND p_new_val >= NVL(agf.mn_age_num
4328                                         ,p_new_val)
4329                 --      AND p_new_val < ceil( NVL(agf.mx_age_num
4330                 --                       ,p_new_val ) + 0.001))
4331                  and p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
4332                                     trunc(nvl(agf.mx_age_num,p_new_val))
4333                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
4334                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
4335                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
4336                  OR (
4337                           p_new_val IS NOT NULL
4338                       AND p_old_val IS NOT NULL
4339                       AND (
4340                                p_new_val < NVL(agf.mn_age_num
4341                                             ,p_new_val)
4342                 --            OR p_new_val >= ceil( NVL(agf.mx_age_num
4343                 --                             ,p_new_val)) + 0.001)
4344                               OR p_new_val >=  decode(nvl(agf.mx_age_num,p_new_val) ,
4345                                     trunc(nvl(agf.mx_age_num,p_new_val))
4346                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
4347                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
4348                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
4349                       AND p_old_val >= NVL(agf.mn_age_num
4350                                         ,p_old_val)
4351                 --      AND p_old_val < ceil( NVL(agf.mx_age_num
4352                 --                       ,p_old_val)) + 0.001 )
4353                  and p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
4354                                     trunc(nvl(agf.mx_age_num,p_old_val))
4355                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
4356                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
4357                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )  )
4358                  OR (    p_new_val IS NULL
4359                      AND p_old_val IS NULL));
4360     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
4361     --UNION ALL
4362     CURSOR c2 IS
4363       SELECT   p_pgm_id
4364               ,'Y'
4365               ,agf.age_det_cd
4366               ,agf.age_to_use_cd
4367               ,agf.age_uom
4368               ,agf.age_det_rl
4369               ,agf.rndg_cd
4370               ,agf.rndg_rl
4371               ,agf.age_calc_rl
4372               ,agf.mn_age_num
4373               ,agf.mx_age_num
4374       FROM     ben_age_fctr agf
4375               --,ben_age_rt_f art
4376               ,ben_elig_age_prte_f eap
4377               ,ben_eligy_prfl_f elp
4378               ,ben_vrbl_rt_elig_prfl_f vep
4379               ,ben_vrbl_rt_prfl_f vpf
4380               ,ben_acty_vrbl_rt_f avr
4381               ,ben_acty_base_rt_f abr
4382       WHERE    abr.pgm_id = p_pgm_id
4383       AND      p_effective_date BETWEEN abr.effective_start_date
4384                    AND abr.effective_end_date
4385       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
4389       AND      p_effective_date BETWEEN vpf.effective_start_date
4386       AND      p_effective_date BETWEEN avr.effective_start_date
4387                    AND avr.effective_end_date
4388       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
4390                    AND vpf.effective_end_date
4391 --      AND      vpf.vrbl_rt_prfl_id = eap.vrbl_rt_prfl_id
4392       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
4393       AND      p_effective_date BETWEEN vep.effective_start_date
4394                    AND vep.effective_end_date
4395       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
4396       AND      p_effective_date BETWEEN elp.effective_start_date
4397                    AND elp.effective_end_date
4398       AND      eap.eligy_prfl_id = elp.eligy_prfl_id
4399       AND      p_effective_date BETWEEN eap.effective_start_date
4400                    AND eap.effective_end_date
4401       AND      eap.age_fctr_id = agf.age_fctr_id
4402       AND      (
4403                     (
4404                           p_new_val IS NOT NULL
4405                       AND p_old_val IS NOT NULL
4406                       AND p_new_val >= NVL(agf.mn_age_num
4407                                         ,p_new_val)
4408                 --      AND p_new_val < ceil( NVL(agf.mx_age_num
4409                 --                       ,p_new_val ) + 0.001))
4410                  and p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
4411                                     trunc(nvl(agf.mx_age_num,p_new_val))
4412                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
4413                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
4414                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
4415                  OR (
4416                           p_new_val IS NOT NULL
4417                       AND p_old_val IS NOT NULL
4418                       AND (
4419                                p_new_val < NVL(agf.mn_age_num
4420                                             ,p_new_val)
4421                 --            OR p_new_val >= ceil( NVL(agf.mx_age_num
4422                 --                             ,p_new_val)) + 0.001)
4423                               OR p_new_val >=  decode(nvl(agf.mx_age_num,p_new_val) ,
4424                                     trunc(nvl(agf.mx_age_num,p_new_val))
4425                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
4426                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
4427                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
4428                       AND p_old_val >= NVL(agf.mn_age_num
4429                                         ,p_old_val)
4430                 --      AND p_old_val < ceil( NVL(agf.mx_age_num
4431                 --                       ,p_old_val)) + 0.001 )
4432                  and p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
4433                                     trunc(nvl(agf.mx_age_num,p_old_val))
4434                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
4435                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
4436                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )  )
4437                  OR (    p_new_val IS NULL
4438                      AND p_old_val IS NULL));
4439     --
4440     --
4441     l_index          PLS_INTEGER;
4442     l_not_hash_found BOOLEAN;
4443     l_c2notfound       BOOLEAN;
4444   --
4445   BEGIN
4446     --
4447     -- hr_utility.set_location ('Entering '||l_package,10);
4448     --
4449     -- Steps to do process
4450     --
4451     -- 1) Try and get value from cache
4452     -- 2) If can get from cache then copy to output record
4453     -- 3) If can't get from cache do db hit and then
4454     --    copy to cache record and then copy to output record.
4455     --
4456     -- Get hashed index value
4457     --
4458     l_index  := MOD(p_pgm_id
4459                  ,g_hash_key);
4460     --
4461     IF NOT g_cache_pgm_age_rt_rec.EXISTS(l_index) THEN
4462       --
4463       -- Lets store the hash value in this index
4464       --
4465       RAISE NO_DATA_FOUND;
4466     --
4467     ELSE
4468       --
4469       -- If it does exist make sure its the right one
4470       --
4471       IF g_cache_pgm_age_rt_rec(l_index).id <> p_pgm_id THEN
4472         --
4473         -- Loop through the hash using the jump routine to check further
4474         -- indexes
4475         --
4476         l_not_hash_found  := FALSE;
4477         --
4478         WHILE NOT l_not_hash_found LOOP
4479           --
4480           l_index  := l_index + g_hash_jump;
4481           --
4482           -- Check if the hash index exists, if not we can use it
4483           --
4484           IF NOT g_cache_pgm_age_rt_rec.EXISTS(l_index) THEN
4485             --
4486             -- Lets store the hash value in the index
4487             --
4488             RAISE NO_DATA_FOUND;
4489           --
4490           ELSE
4491             --
4492             -- Make sure the index is the correct one
4493             --
4494             IF g_cache_pgm_age_rt_rec(l_index).id = p_pgm_id THEN
4495               --
4496               -- We have a match so the hashed value  has been stored before
4497               --
4498               l_not_hash_found  := TRUE;
4499             --
4500             END IF;
4501           --
4502           END IF;
4503         --
4507     --
4504         END LOOP;
4505       --
4506       END IF;
4508     END IF;
4509     --
4510     -- If p_old_val iand p_new_val is set this means we are trying to retrieve
4511     -- the correct rate for the calculated value.
4512     -- Previously we just cached the first rate we
4513     -- found since we needed the determination code, the correct age,los code,etc
4514     -- By killing the cache and forcing the value to be removed we cache the
4515     -- correct rate profile for the case we need.
4516     --
4517     IF     p_old_val IS NOT NULL
4518        AND p_new_val IS NOT NULL THEN
4519       --
4520       RAISE NO_DATA_FOUND;
4521     --
4522     END IF;
4523     --
4524     p_rec    := g_cache_pgm_age_rt_rec(l_index);
4525   --
4526   -- hr_utility.set_location ('Leaving '||l_package,10);
4527   --
4528   EXCEPTION
4529     --
4530     WHEN NO_DATA_FOUND THEN
4531       --
4532       -- The record has not been cached yet so lets cache it
4533       --
4534       OPEN c1;
4535       --
4536       FETCH c1 INTO g_cache_pgm_age_rt_rec(l_index);
4537       -- PERFNEW
4538       IF c1%NOTFOUND THEN
4539          --
4540          l_c2notfound := false;
4541          OPEN c2;
4542          FETCH c2 INTO g_cache_pgm_age_rt_rec(l_index);
4543          IF c2%NOTFOUND THEN
4544             --
4545             l_c2notfound := true;
4546             --
4547          END IF;
4548          CLOSE c2;
4549          --
4550       END IF;
4551       -- PERFNEW
4552       IF     p_old_val IS NULL
4553          AND p_new_val IS NULL THEN
4554         --
4555         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
4556           --
4557           if NOT g_cache_pgm_age_rt_rec.EXISTS(l_index) then
4558             g_cache_pgm_age_rt_rec(l_index).id     := p_pgm_id;
4559             g_cache_pgm_age_rt_rec(l_index).exist  := 'N';
4560           end if;
4561         --
4562         END IF;
4563       --
4564       END IF;
4565       --
4566       p_rec  := g_cache_pgm_age_rt_rec(l_index);
4567       --
4568       CLOSE c1;
4569   --
4570   END get_age_pgm_rate;
4571 --
4572   PROCEDURE get_age_pl_rate(
4573     p_pl_id             IN            NUMBER
4574    ,p_old_val           IN            NUMBER DEFAULT NULL
4575    ,p_new_val           IN            NUMBER DEFAULT NULL
4576    ,p_business_group_id IN            NUMBER
4577    ,p_effective_date    IN            DATE
4578    ,p_rec               OUT NOCOPY    g_cache_age_rec_obj) IS
4579     --
4580     l_package        VARCHAR2(80) := g_package || '.get_age_pl_rate';
4581     l_old_val_1 NUMBER := p_old_val + 1;
4582     l_new_val_1 NUMBER := p_new_val + 1;
4583     --
4584     -- Define Cursor
4585     --
4586     CURSOR c1 IS
4587       SELECT   p_pl_id
4588               ,'Y'
4589               ,agf.age_det_cd
4590               ,agf.age_to_use_cd
4591               ,agf.age_uom
4592               ,agf.age_det_rl
4593               ,agf.rndg_cd
4594               ,agf.rndg_rl
4595               ,agf.age_calc_rl
4596               ,agf.mn_age_num
4597               ,agf.mx_age_num
4598       FROM     ben_age_fctr agf
4599               ,ben_age_rt_f art
4600               ,ben_vrbl_rt_prfl_f vpf
4601               ,ben_acty_vrbl_rt_f avr
4602               ,ben_acty_base_rt_f abr
4603       WHERE    abr.pl_id = p_pl_id
4604       AND      p_effective_date BETWEEN abr.effective_start_date
4605                    AND abr.effective_end_date
4606       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
4607       AND      p_effective_date BETWEEN avr.effective_start_date
4608                    AND avr.effective_end_date
4609       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
4610       AND      p_effective_date BETWEEN vpf.effective_start_date
4611                    AND vpf.effective_end_date
4612       AND      vpf.vrbl_rt_prfl_id = art.vrbl_rt_prfl_id
4613       AND      p_effective_date BETWEEN art.effective_start_date
4614                    AND art.effective_end_date
4615       AND      art.age_fctr_id = agf.age_fctr_id
4616       AND      (
4617                     (
4618                           p_new_val IS NOT NULL
4619                       AND p_old_val IS NOT NULL
4620                       AND p_new_val >= NVL(agf.mn_age_num
4621                                         ,p_new_val)
4622                  --     AND p_new_val < ceil( NVL(agf.mx_age_num
4623                  --                      ,p_new_val)+ 0.001 ))
4624                  and p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
4625                                     trunc(nvl(agf.mx_age_num,p_new_val))
4626                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
4627                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
4628                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
4629                  OR (
4630                           p_new_val IS NOT NULL
4631                       AND p_old_val IS NOT NULL
4632                       AND (
4633                                p_new_val < NVL(agf.mn_age_num
4634                                             ,p_new_val)
4635                  --           OR p_new_val >= ceil( NVL(agf.mx_age_num
4639                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
4636                  --                            ,p_new_val)) + 0.001)
4637                               OR p_new_val >= decode(nvl(agf.mx_age_num,p_new_val) ,
4638                                     trunc(nvl(agf.mx_age_num,p_new_val))
4640                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
4641                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
4642                       AND p_old_val >= NVL(agf.mn_age_num
4643                                         ,p_old_val)
4644                  --     AND p_old_val < ceil( NVL(agf.mx_age_num
4645                  --                      ,p_old_val))  + 0.001)
4646                  and p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
4647                                     trunc(nvl(agf.mx_age_num,p_old_val))
4648                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
4649                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
4650                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )  )
4651                  OR (    p_new_val IS NULL
4652                      AND p_old_val IS NULL));
4653     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
4654     --UNION ALL
4655     CURSOR c2 IS
4656     SELECT   p_pl_id
4657               ,'Y'
4658               ,agf.age_det_cd
4659               ,agf.age_to_use_cd
4660               ,agf.age_uom
4661               ,agf.age_det_rl
4662               ,agf.rndg_cd
4663               ,agf.rndg_rl
4664               ,agf.age_calc_rl
4665               ,agf.mn_age_num
4666               ,agf.mx_age_num
4667       FROM     ben_age_fctr agf
4668               --,ben_age_rt_f art
4669               ,ben_elig_age_prte_f eap
4670               ,ben_eligy_prfl_f elp
4671               ,ben_vrbl_rt_elig_prfl_f vep
4672               ,ben_vrbl_rt_prfl_f vpf
4673               ,ben_acty_vrbl_rt_f avr
4674               ,ben_acty_base_rt_f abr
4675       WHERE    abr.pl_id = p_pl_id
4676       AND      p_effective_date BETWEEN abr.effective_start_date
4677                    AND abr.effective_end_date
4678       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
4679       AND      p_effective_date BETWEEN avr.effective_start_date
4680                    AND avr.effective_end_date
4681       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
4682       AND      p_effective_date BETWEEN vpf.effective_start_date
4683                    AND vpf.effective_end_date
4684 --      AND      vpf.vrbl_rt_prfl_id = eap.vrbl_rt_prfl_id
4685       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
4686       AND      p_effective_date BETWEEN vep.effective_start_date
4687                    AND vep.effective_end_date
4688       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
4689       AND      p_effective_date BETWEEN elp.effective_start_date
4690                    AND elp.effective_end_date
4691       AND      eap.eligy_prfl_id = elp.eligy_prfl_id
4692       AND      p_effective_date BETWEEN eap.effective_start_date
4693                    AND eap.effective_end_date
4694       AND      eap.age_fctr_id = agf.age_fctr_id
4695       AND      (
4696                     (
4697                           p_new_val IS NOT NULL
4698                       AND p_old_val IS NOT NULL
4699                       AND p_new_val >= NVL(agf.mn_age_num
4700                                         ,p_new_val)
4701                  --     AND p_new_val < ceil( NVL(agf.mx_age_num
4702                  --                      ,p_new_val)+ 0.001 ))
4703                  and p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
4704                                     trunc(nvl(agf.mx_age_num,p_new_val))
4705                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
4706                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
4707                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
4708                  OR (
4709                           p_new_val IS NOT NULL
4710                       AND p_old_val IS NOT NULL
4711                       AND (
4712                                p_new_val < NVL(agf.mn_age_num
4713                                             ,p_new_val)
4714                  --           OR p_new_val >= ceil( NVL(agf.mx_age_num
4715                  --                            ,p_new_val)) + 0.001)
4716                               OR p_new_val >= decode(nvl(agf.mx_age_num,p_new_val) ,
4717                                     trunc(nvl(agf.mx_age_num,p_new_val))
4718                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
4719                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
4720                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
4721                       AND p_old_val >= NVL(agf.mn_age_num
4722                                         ,p_old_val)
4723                  --     AND p_old_val < ceil( NVL(agf.mx_age_num
4724                  --                      ,p_old_val))  + 0.001)
4725                  and p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
4726                                     trunc(nvl(agf.mx_age_num,p_old_val))
4727                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
4728                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
4729                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )  )
4730                  OR (    p_new_val IS NULL
4731                      AND p_old_val IS NULL));
4732     --
4733     --
4734     l_index          PLS_INTEGER;
4738   BEGIN
4735     l_not_hash_found BOOLEAN;
4736     l_c2notfound       BOOLEAN;
4737   --
4739     --
4740     -- hr_utility.set_location ('Entering '||l_package,10);
4741     --
4742     -- Steps to do process
4743     --
4744     -- 1) Try and get value from cache
4745     -- 2) If can get from cache then copy to output record
4746     -- 3) If can't get from cache do db hit and then
4747     --    copy to cache record and then copy to output record.
4748     --
4749     -- Get hashed index value
4750     --
4751     l_index  := MOD(p_pl_id
4752                  ,g_hash_key);
4753     --
4754     IF NOT g_cache_pl_age_rt_rec.EXISTS(l_index) THEN
4755       --
4756       -- Lets store the hash value in this index
4757       --
4758       RAISE NO_DATA_FOUND;
4759     --
4760     ELSE
4761       --
4762       -- If it does exist make sure its the right one
4763       --
4764       IF g_cache_pl_age_rt_rec(l_index).id <> p_pl_id THEN
4765         --
4766         -- Loop through the hash using the jump routine to check further
4767         -- indexes
4768         --
4769         l_not_hash_found  := FALSE;
4770         --
4771         WHILE NOT l_not_hash_found LOOP
4772           --
4773           l_index  := l_index + g_hash_jump;
4774           --
4775           -- Check if the hash index exists, if not we can use it
4776           --
4777           IF NOT g_cache_pl_age_rt_rec.EXISTS(l_index) THEN
4778             --
4779             -- Lets store the hash value in the index
4780             --
4781             RAISE NO_DATA_FOUND;
4782           --
4783           ELSE
4784             --
4785             -- Make sure the index is the correct one
4786             --
4787             IF g_cache_pl_age_rt_rec(l_index).id = p_pl_id THEN
4788               --
4789               -- We have a match so the hashed value  has been stored before
4790               --
4791               l_not_hash_found  := TRUE;
4792             --
4793             END IF;
4794           --
4795           END IF;
4796         --
4797         END LOOP;
4798       --
4799       END IF;
4800     --
4801     END IF;
4802     --
4803     -- If p_old_val ind p_new_val is set this means we are trying to retrieve
4804     -- the correct rate for the calculated value.
4805     -- Previously we just cached the first rate we
4806     -- found since we needed the determination code, the correct age,los code,etc
4807     -- By killing the cache and forcing the value to be removed we cache the
4808     -- correct rate profile for the case we need.
4809     --
4810     IF     p_old_val IS NOT NULL
4811        AND p_new_val IS NOT NULL THEN
4812       --
4813       RAISE NO_DATA_FOUND;
4814     --
4815     END IF;
4816     --
4817     p_rec    := g_cache_pl_age_rt_rec(l_index);
4818   --
4819   -- hr_utility.set_location ('Leaving '||l_package,10);
4820   --
4821   EXCEPTION
4822     --
4823     WHEN NO_DATA_FOUND THEN
4824       --
4825       -- The record has not been cached yet so lets cache it
4826       --
4827       OPEN c1;
4828       --
4829       FETCH c1 INTO g_cache_pl_age_rt_rec(l_index);
4830       -- PERFNEW
4831       IF c1%NOTFOUND THEN
4832          --
4833          l_c2notfound := false;
4834          OPEN c2;
4835          FETCH c2 INTO g_cache_pl_age_rt_rec(l_index);
4836          IF c2%NOTFOUND THEN
4837             --
4838             l_c2notfound := true;
4839             --
4840          END IF;
4841          CLOSE c2;
4842          --
4843       END IF;
4844       -- PERFNEW
4845       IF     p_old_val IS NULL
4846          AND p_new_val IS NULL THEN
4847         --
4848         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
4849           --
4850           if NOT g_cache_pl_age_rt_rec.EXISTS(l_index) then
4851             g_cache_pl_age_rt_rec(l_index).id     := p_pl_id;
4852             g_cache_pl_age_rt_rec(l_index).exist  := 'N';
4853           end if;
4854         --
4855         END IF;
4856       --
4857       END IF;
4858       --
4859       p_rec  := g_cache_pl_age_rt_rec(l_index);
4860       --
4861       CLOSE c1;
4862   --
4863   END get_age_pl_rate;
4864 --
4865   PROCEDURE get_age_oipl_rate(
4866     p_oipl_id           IN            NUMBER
4867    ,p_old_val           IN            NUMBER DEFAULT NULL
4868    ,p_new_val           IN            NUMBER DEFAULT NULL
4869    ,p_business_group_id IN            NUMBER
4870    ,p_effective_date    IN            DATE
4871    ,p_rec               OUT NOCOPY    g_cache_age_rec_obj) IS
4872     --
4873     l_package        VARCHAR2(80) := g_package || '.get_age_oipl_rate';
4874     l_old_val_1 NUMBER := p_old_val + 1;
4875     l_new_val_1 NUMBER := p_new_val + 1;
4876     --
4877     l_opt_id  number ;
4878     -- Define Cursor
4879     --
4880     CURSOR c1 IS
4881       SELECT   p_oipl_id
4882               ,'Y'
4883               ,agf.age_det_cd
4884               ,agf.age_to_use_cd
4885               ,agf.age_uom
4886               ,agf.age_det_rl
4887               ,agf.rndg_cd
4888               ,agf.rndg_rl
4889               ,agf.age_calc_rl
4890               ,agf.mn_age_num
4891               ,agf.mx_age_num
4892       FROM     ben_age_fctr agf
4896               ,ben_acty_base_rt_f abr
4893               ,ben_age_rt_f art
4894               ,ben_vrbl_rt_prfl_f vpf
4895               ,ben_acty_vrbl_rt_f avr
4897       WHERE    ( abr.oipl_id = p_oipl_id
4898       --
4899       --START Option level Rates Enhancements
4900                or ( abr.opt_id = l_opt_id and
4901                      not exists (select null from ben_acty_base_rt_f abr1
4902                      where abr1.oipl_id = p_oipl_id )))
4903       --END Option level Rates Enhancements
4904       --
4905       AND      p_effective_date BETWEEN abr.effective_start_date
4906                    AND abr.effective_end_date
4907       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
4908       AND      p_effective_date BETWEEN avr.effective_start_date
4909                    AND avr.effective_end_date
4910       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
4911       AND      p_effective_date BETWEEN vpf.effective_start_date
4912                    AND vpf.effective_end_date
4913       AND      vpf.vrbl_rt_prfl_id = art.vrbl_rt_prfl_id
4914       AND      p_effective_date BETWEEN art.effective_start_date
4915                    AND art.effective_end_date
4916       AND      art.age_fctr_id = agf.age_fctr_id
4917       AND      (
4918                     (
4919                           p_new_val IS NOT NULL
4920                       AND p_old_val IS NOT NULL
4921                       AND p_new_val >= NVL(agf.mn_age_num
4922                                         ,p_new_val)
4923                  --     AND p_new_val < ceil( NVL(agf.mx_age_num
4924                  --                      ,p_new_val)+ 0.001 ))
4925                  and p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
4926                                     trunc(nvl(agf.mx_age_num,p_new_val))
4927                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
4928                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
4929                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
4930                  OR (
4931                           p_new_val IS NOT NULL
4932                       AND p_old_val IS NOT NULL
4933                       AND (
4934                                p_new_val < NVL(agf.mn_age_num
4935                                             ,p_new_val)
4936                  --           OR p_new_val >= ceil( NVL(agf.mx_age_num
4937                  --                            ,p_new_val)) + 0.001 )
4938                               OR p_new_val >=  decode(nvl(agf.mx_age_num,p_new_val) ,
4939                                     trunc(nvl(agf.mx_age_num,p_new_val))
4940                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
4941                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
4942                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
4943                       AND p_old_val >= NVL(agf.mn_age_num
4944                                         ,p_old_val)
4945                 --      AND p_old_val < ceil( NVL(agf.mx_age_num
4946                 --                       ,p_old_val)) + 0.001 )
4947                  and p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
4948                                     trunc(nvl(agf.mx_age_num,p_old_val))
4949                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
4950                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
4951                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )  )
4952                  OR (    p_new_val IS NULL
4953                      AND p_old_val IS NULL));
4954     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
4955     --UNION ALL
4956     CURSOR c2 IS
4957       SELECT   p_oipl_id
4958               ,'Y'
4959               ,agf.age_det_cd
4960               ,agf.age_to_use_cd
4961               ,agf.age_uom
4962               ,agf.age_det_rl
4963               ,agf.rndg_cd
4964               ,agf.rndg_rl
4965               ,agf.age_calc_rl
4966               ,agf.mn_age_num
4967               ,agf.mx_age_num
4968       FROM     ben_age_fctr agf
4969               --,ben_age_rt_f art
4970               ,ben_elig_age_prte_f eap
4971               ,ben_eligy_prfl_f elp
4972               ,ben_vrbl_rt_elig_prfl_f vep
4973               ,ben_vrbl_rt_prfl_f vpf
4974               ,ben_acty_vrbl_rt_f avr
4975               ,ben_acty_base_rt_f abr
4976       WHERE    ( abr.oipl_id = p_oipl_id
4977       --
4978       --START Option level Rates Enhancements
4979                or ( abr.opt_id = l_opt_id and
4980                      not exists (select null from ben_acty_base_rt_f abr1
4981                      where abr1.oipl_id = p_oipl_id )))
4982       --END Option level Rates Enhancements
4983       --
4984       AND      p_effective_date BETWEEN abr.effective_start_date
4985                    AND abr.effective_end_date
4986       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
4987       AND      p_effective_date BETWEEN avr.effective_start_date
4988                    AND avr.effective_end_date
4989       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
4990       AND      p_effective_date BETWEEN vpf.effective_start_date
4991                    AND vpf.effective_end_date
4992 --      AND      vpf.vrbl_rt_prfl_id = eap.vrbl_rt_prfl_id
4993       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
4994       AND      p_effective_date BETWEEN vep.effective_start_date
4995                    AND vep.effective_end_date
4996       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
5000       AND      p_effective_date BETWEEN eap.effective_start_date
4997       AND      p_effective_date BETWEEN elp.effective_start_date
4998                    AND elp.effective_end_date
4999       AND      eap.eligy_prfl_id = elp.eligy_prfl_id
5001                    AND eap.effective_end_date
5002       AND      eap.age_fctr_id = agf.age_fctr_id
5003       AND      (
5004                     (
5005                           p_new_val IS NOT NULL
5006                       AND p_old_val IS NOT NULL
5007                       AND p_new_val >= NVL(agf.mn_age_num
5008                                         ,p_new_val)
5009                  --     AND p_new_val < ceil( NVL(agf.mx_age_num
5010                  --                      ,p_new_val)+ 0.001 ))
5011                  and p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
5012                                     trunc(nvl(agf.mx_age_num,p_new_val))
5013                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
5014                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
5015                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
5016                  OR (
5017                           p_new_val IS NOT NULL
5018                       AND p_old_val IS NOT NULL
5019                       AND (
5020                                p_new_val < NVL(agf.mn_age_num
5021                                             ,p_new_val)
5022                  --           OR p_new_val >= ceil( NVL(agf.mx_age_num
5023                  --                            ,p_new_val)) + 0.001 )
5024                               OR p_new_val >=  decode(nvl(agf.mx_age_num,p_new_val) ,
5025                                     trunc(nvl(agf.mx_age_num,p_new_val))
5026                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
5027                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
5028                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
5029                       AND p_old_val >= NVL(agf.mn_age_num
5030                                         ,p_old_val)
5031                 --      AND p_old_val < ceil( NVL(agf.mx_age_num
5032                 --                       ,p_old_val)) + 0.001 )
5033                  and p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
5034                                     trunc(nvl(agf.mx_age_num,p_old_val))
5035                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
5036                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
5037                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )  )
5038                  OR (    p_new_val IS NULL
5039                      AND p_old_val IS NULL));
5040     --
5041     --
5042     l_index          PLS_INTEGER;
5043     l_not_hash_found BOOLEAN;
5044     l_c2notfound       BOOLEAN;
5045   --
5046   BEGIN
5047     --
5048     -- hr_utility.set_location ('Entering '||l_package,10);
5049     --
5050     -- Steps to do process
5051     --
5052     -- 1) Try and get value from cache
5053     -- 2) If can get from cache then copy to output record
5054     -- 3) If can't get from cache do db hit and then
5055     --    copy to cache record and then copy to output record.
5056     --
5057     -- Get hashed index value
5058     --
5059     l_index  := MOD(p_oipl_id
5060                  ,g_hash_key);
5061     --
5062     IF NOT g_cache_oipl_age_rt_rec.EXISTS(l_index) THEN
5063       --
5064       -- Lets store the hash value in this index
5065       --
5066       RAISE NO_DATA_FOUND;
5067     --
5068     ELSE
5069       --
5070       -- If it does exist make sure its the right one
5071       --
5072       IF g_cache_oipl_age_rt_rec(l_index).id <> p_oipl_id THEN
5073         --
5074         -- Loop through the hash using the jump routine to check further
5075         -- indexes
5076         --
5077         l_not_hash_found  := FALSE;
5078         --
5079         WHILE NOT l_not_hash_found LOOP
5080           --
5081           l_index  := l_index + g_hash_jump;
5082           --
5083           -- Check if the hash index exists, if not we can use it
5084           --
5085           IF NOT g_cache_oipl_age_rt_rec.EXISTS(l_index) THEN
5086             --
5087             -- Lets store the hash value in the index
5088             --
5089             RAISE NO_DATA_FOUND;
5090           --
5091           ELSE
5092             --
5093             -- Make sure the index is the correct one
5094             --
5095             IF g_cache_oipl_age_rt_rec(l_index).id = p_oipl_id THEN
5096               --
5097               -- We have a match so the hashed value  has been stored before
5098               --
5099               l_not_hash_found  := TRUE;
5100             --
5101             END IF;
5102           --
5103           END IF;
5104         --
5105         END LOOP;
5106       --
5107       END IF;
5108     --
5109     END IF;
5110     --
5111     -- If p_old_val and p_new_val is set this means we are trying to retrieve
5112     -- the correct rate for the calculated value.
5113     -- Previously we just cached the first rate we
5114     -- found since we needed the determination code, the correct age,los code,etc
5115     -- By killing the cache and forcing the value to be removed we cache the
5116     -- correct rate profile for the case we need.
5117     --
5118     IF     p_old_val IS NOT NULL
5119        AND p_new_val IS NOT NULL THEN
5120       --
5124     --
5121       RAISE NO_DATA_FOUND;
5122     --
5123     END IF;
5125     p_rec    := g_cache_oipl_age_rt_rec(l_index);
5126   --
5127   -- hr_utility.set_location ('Leaving '||l_package,10);
5128   --
5129   EXCEPTION
5130     --
5131     WHEN NO_DATA_FOUND THEN
5132       --
5133       -- The record has not been cached yet so lets cache it
5134       -- Option level rates enhancement
5135       l_opt_id := get_opt_id(p_oipl_id,p_effective_date);
5136       --
5137       OPEN c1;
5138       --
5139       FETCH c1 INTO g_cache_oipl_age_rt_rec(l_index);
5140       -- PERFNEW
5141       IF c1%NOTFOUND THEN
5142          --
5143          l_c2notfound := false;
5144          OPEN c2;
5145          FETCH c2 INTO g_cache_oipl_age_rt_rec(l_index);
5146          IF c2%NOTFOUND THEN
5147             --
5148             l_c2notfound := true;
5149             --
5150          END IF;
5151          CLOSE c2;
5152          --
5153       END IF;
5154       -- PERFNEW
5155       IF     p_old_val IS NULL
5156          AND p_new_val IS NULL THEN
5157         --
5158         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
5159           --
5160           if NOT g_cache_oipl_age_rt_rec.EXISTS(l_index) then
5161             g_cache_oipl_age_rt_rec(l_index).id     := p_oipl_id;
5162             g_cache_oipl_age_rt_rec(l_index).exist  := 'N';
5163           end if;
5164         --
5165         END IF;
5166       --
5167       END IF;
5168       --
5169       p_rec  := g_cache_oipl_age_rt_rec(l_index);
5170       --
5171       CLOSE c1;
5172   --
5173   END get_age_oipl_rate;
5174 --
5175   PROCEDURE get_age_plip_rate(
5176     p_plip_id           IN            NUMBER
5177    ,p_old_val           IN            NUMBER DEFAULT NULL
5178    ,p_new_val           IN            NUMBER DEFAULT NULL
5179    ,p_business_group_id IN            NUMBER
5180    ,p_effective_date    IN            DATE
5181    ,p_rec               OUT NOCOPY    g_cache_age_rec_obj) IS
5182     --
5183     l_package        VARCHAR2(80) := g_package || '.get_age_plip_rate';
5184     l_old_val_1 NUMBER := p_old_val + 1;
5185     l_new_val_1 NUMBER := p_new_val + 1;
5186     --
5187     -- Define Cursor
5188     --
5189     CURSOR c1 IS
5190       SELECT   p_plip_id
5191               ,'Y'
5192               ,agf.age_det_cd
5193               ,agf.age_to_use_cd
5194               ,agf.age_uom
5195               ,agf.age_det_rl
5196               ,agf.rndg_cd
5197               ,agf.rndg_rl
5198               ,agf.age_calc_rl
5199               ,agf.mn_age_num
5200               ,agf.mx_age_num
5201       FROM     ben_acty_base_rt_f abr
5202               ,ben_acty_vrbl_rt_f avr
5203               ,ben_vrbl_rt_prfl_f vpf
5204               ,ben_age_rt_f art
5205               ,ben_age_fctr agf
5206       WHERE    abr.plip_id = p_plip_id
5207       AND      p_effective_date BETWEEN abr.effective_start_date
5208                    AND abr.effective_end_date
5209       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
5210       AND      p_effective_date BETWEEN avr.effective_start_date
5211                    AND avr.effective_end_date
5212       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
5213       AND      p_effective_date BETWEEN vpf.effective_start_date
5214                    AND vpf.effective_end_date
5215       AND      vpf.vrbl_rt_prfl_id = art.vrbl_rt_prfl_id
5216       AND      p_effective_date BETWEEN art.effective_start_date
5217                    AND art.effective_end_date
5218       AND      art.age_fctr_id = agf.age_fctr_id
5219       AND      (
5220                     (
5221                           p_new_val IS NOT NULL
5222                       AND p_old_val IS NOT NULL
5223                       AND p_new_val >= NVL(agf.mn_age_num
5224                                         ,p_new_val)
5225                       AND p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
5226                                     trunc(nvl(agf.mx_age_num,p_new_val))
5227                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
5228                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
5229                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
5230                                     --   ceil( NVL(agf.mx_age_num
5231                                     --   ,p_new_val) + 0.001 ))
5232                  OR (
5233                           p_new_val IS NOT NULL
5234                       AND p_old_val IS NOT NULL
5235                       AND (
5236                                p_new_val < NVL(agf.mn_age_num
5237                                             ,p_new_val)
5238                             OR p_new_val >=  decode(nvl(agf.mx_age_num,p_new_val) ,
5239                                     trunc(nvl(agf.mx_age_num,p_new_val))
5240                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
5241                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
5242                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
5243 
5244                                      -- ceil( NVL(agf.mx_age_num
5245                                      --         , p_new_val))  + 0.001 )
5246                       AND p_old_val >= NVL(agf.mn_age_num
5250                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
5247                                         ,p_old_val)
5248                       AND p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
5249                                     trunc(nvl(agf.mx_age_num,p_old_val))
5251                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
5252                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )  )
5253                                      --ceil( NVL(agf.mx_age_num
5254                                      --  ,p_old_val)) + 0.001 )
5255                  OR (    p_new_val IS NULL
5256                      AND p_old_val IS NULL));
5257     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
5258     --UNION ALL
5259     CURSOR c2 IS
5260       SELECT   p_plip_id
5261               ,'Y'
5262               ,agf.age_det_cd
5263               ,agf.age_to_use_cd
5264               ,agf.age_uom
5265               ,agf.age_det_rl
5266               ,agf.rndg_cd
5267               ,agf.rndg_rl
5268               ,agf.age_calc_rl
5269               ,agf.mn_age_num
5270               ,agf.mx_age_num
5271       FROM     ben_acty_base_rt_f abr
5272               ,ben_acty_vrbl_rt_f avr
5273               ,ben_eligy_prfl_f elp
5274               ,ben_vrbl_rt_elig_prfl_f vep
5275               ,ben_vrbl_rt_prfl_f vpf
5276               ,ben_elig_age_prte_f eap
5277               --,ben_age_rt_f art
5278               ,ben_age_fctr agf
5279       WHERE    abr.plip_id = p_plip_id
5280       AND      p_effective_date BETWEEN abr.effective_start_date
5281                    AND abr.effective_end_date
5282       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
5283       AND      p_effective_date BETWEEN avr.effective_start_date
5284                    AND avr.effective_end_date
5285       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
5286       AND      p_effective_date BETWEEN vpf.effective_start_date
5287                    AND vpf.effective_end_date
5288 --      AND      vpf.vrbl_rt_prfl_id = eap.vrbl_rt_prfl_id
5289       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
5290       AND      p_effective_date BETWEEN vep.effective_start_date
5291                    AND vep.effective_end_date
5292       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
5293       AND      p_effective_date BETWEEN elp.effective_start_date
5294                    AND elp.effective_end_date
5295       AND      eap.eligy_prfl_id = elp.eligy_prfl_id
5296       AND      p_effective_date BETWEEN eap.effective_start_date
5297                    AND eap.effective_end_date
5298       AND      eap.age_fctr_id = agf.age_fctr_id
5299       AND      (
5300                     (
5301                           p_new_val IS NOT NULL
5302                       AND p_old_val IS NOT NULL
5303                       AND p_new_val >= NVL(agf.mn_age_num
5304                                         ,p_new_val)
5305                       AND p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
5306                                     trunc(nvl(agf.mx_age_num,p_new_val))
5307                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
5308                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
5309                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
5310                                     --   ceil( NVL(agf.mx_age_num
5311                                     --   ,p_new_val) + 0.001 ))
5312                  OR (
5313                           p_new_val IS NOT NULL
5314                       AND p_old_val IS NOT NULL
5315                       AND (
5316                                p_new_val < NVL(agf.mn_age_num
5317                                             ,p_new_val)
5318                             OR p_new_val >=  decode(nvl(agf.mx_age_num,p_new_val) ,
5319                                     trunc(nvl(agf.mx_age_num,p_new_val))
5320                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
5321                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
5322                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
5323 
5324                                      -- ceil( NVL(agf.mx_age_num
5325                                      --         , p_new_val))  + 0.001 )
5326                       AND p_old_val >= NVL(agf.mn_age_num
5327                                         ,p_old_val)
5328                       AND p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
5329                                     trunc(nvl(agf.mx_age_num,p_old_val))
5330                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
5331                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
5332                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )  )
5333                                      --ceil( NVL(agf.mx_age_num
5334                                      --  ,p_old_val)) + 0.001 )
5335                  OR (    p_new_val IS NULL
5336                      AND p_old_val IS NULL));
5337     --
5338     --
5339     l_index          PLS_INTEGER;
5340     l_not_hash_found BOOLEAN;
5341     l_c2notfound       BOOLEAN;
5342   --
5343   BEGIN
5344     --
5345     -- hr_utility.set_location ('Entering '||l_package,10);
5346     --
5347     -- Steps to do process
5348     --
5349     -- 1) Try and get value from cache
5350     -- 2) If can get from cache then copy to output record
5351     -- 3) If can't get from cache do db hit and then
5352     --    copy to cache record and then copy to output record.
5353     --
5354     -- Get hashed index value
5358     --
5355     --
5356     l_index  := MOD(p_plip_id
5357                  ,g_hash_key);
5359     IF NOT g_cache_plip_age_rt_rec.EXISTS(l_index) THEN
5360       --
5361       -- Lets store the hash value in this index
5362       --
5363       RAISE NO_DATA_FOUND;
5364     --
5365     ELSE
5366       --
5367       -- If it does exist make sure its the right one
5368       --
5369       IF g_cache_plip_age_rt_rec(l_index).id <> p_plip_id THEN
5370         --
5371         -- Loop through the hash using the jump routine to check further
5372         -- indexes
5373         --
5374         l_not_hash_found  := FALSE;
5375         --
5376         WHILE NOT l_not_hash_found LOOP
5377           --
5378           l_index  := l_index + g_hash_jump;
5379           --
5380           -- Check if the hash index exists, if not we can use it
5381           --
5382           IF NOT g_cache_plip_age_rt_rec.EXISTS(l_index) THEN
5383             --
5384             -- Lets store the hash value in the index
5385             --
5386             RAISE NO_DATA_FOUND;
5387           --
5388           ELSE
5389             --
5390             -- Make sure the index is the correct one
5391             --
5392             IF g_cache_plip_age_rt_rec(l_index).id = p_plip_id THEN
5393               --
5394               -- We have a match so the hashed value  has been stored before
5395               --
5396               l_not_hash_found  := TRUE;
5397             --
5398             END IF;
5399           --
5400           END IF;
5401         --
5402         END LOOP;
5403       --
5404       END IF;
5405     --
5406     END IF;
5407     --
5408     -- If p_old_val and p_new_val is set this means we are trying to retrieve
5409     -- the correct rate for the calculated value.
5410     -- Previously we just cached the first rate we
5411     -- found since we needed the determination code, the correct age,los code,etc
5412     -- By killing the cache and forcing the value to be removed we cache the
5413     -- correct rate profile for the case we need.
5414     --
5415     IF     p_old_val IS NOT NULL
5416        AND p_new_val IS NOT NULL THEN
5417       --
5418       RAISE NO_DATA_FOUND;
5419     --
5420     END IF;
5421     --
5422     p_rec    := g_cache_plip_age_rt_rec(l_index);
5423   --
5424   -- hr_utility.set_location ('Leaving '||l_package,10);
5425   --
5426   EXCEPTION
5427     --
5428     WHEN NO_DATA_FOUND THEN
5429       --
5430       -- The record has not been cached yet so lets cache it
5431       --
5432       OPEN c1;
5433       --
5434       FETCH c1 INTO g_cache_plip_age_rt_rec(l_index);
5435       -- PERFNEW
5436       IF c1%NOTFOUND THEN
5437          --
5438          l_c2notfound := false;
5439          OPEN c2;
5440          FETCH c2 INTO g_cache_plip_age_rt_rec(l_index);
5441          IF c2%NOTFOUND THEN
5442             --
5443             l_c2notfound := true;
5444             --
5445          END IF;
5446          CLOSE c2;
5447          --
5448       END IF;
5449       -- PERFNEW
5450       IF     p_old_val IS NULL
5451          AND p_new_val IS NULL THEN
5452         --
5453         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
5454           --
5455           if NOT g_cache_plip_age_rt_rec.EXISTS(l_index) then
5456             g_cache_plip_age_rt_rec(l_index).id     := p_plip_id;
5457             g_cache_plip_age_rt_rec(l_index).exist  := 'N';
5458           end if;
5459         --
5460         END IF;
5461       --
5462       END IF;
5463       --
5464       p_rec  := g_cache_plip_age_rt_rec(l_index);
5465       --
5466       CLOSE c1;
5467   --
5468   END get_age_plip_rate;
5469 --
5470   PROCEDURE get_age_ptip_rate(
5471     p_ptip_id           IN            NUMBER
5472    ,p_old_val           IN            NUMBER DEFAULT NULL
5473    ,p_new_val           IN            NUMBER DEFAULT NULL
5474    ,p_business_group_id IN            NUMBER
5475    ,p_effective_date    IN            DATE
5476    ,p_rec               OUT NOCOPY    g_cache_age_rec_obj) IS
5477     --
5478     l_package        VARCHAR2(80) := g_package || '.get_age_ptip_rate';
5479     l_old_val_1 NUMBER := p_old_val + 1;
5480     l_new_val_1 NUMBER := p_new_val + 1;
5481     --
5482     -- Define Cursor
5483     --
5484     CURSOR c1 IS
5485       SELECT   p_ptip_id
5486               ,'Y'
5487               ,agf.age_det_cd
5488               ,agf.age_to_use_cd
5489               ,agf.age_uom
5490               ,agf.age_det_rl
5491               ,agf.rndg_cd
5492               ,agf.rndg_rl
5493               ,agf.age_calc_rl
5494               ,agf.mn_age_num
5495               ,agf.mx_age_num
5496       FROM     ben_acty_base_rt_f abr
5497               ,ben_acty_vrbl_rt_f avr
5498               ,ben_vrbl_rt_prfl_f vpf
5499               ,ben_age_rt_f art
5500               ,ben_age_fctr agf
5501       WHERE    abr.ptip_id = p_ptip_id
5502       AND      p_effective_date BETWEEN abr.effective_start_date
5503                    AND abr.effective_end_date
5504       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
5505       AND      p_effective_date BETWEEN avr.effective_start_date
5506                    AND avr.effective_end_date
5510       AND      vpf.vrbl_rt_prfl_id = art.vrbl_rt_prfl_id
5507       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
5508       AND      p_effective_date BETWEEN vpf.effective_start_date
5509                    AND vpf.effective_end_date
5511       AND      p_effective_date BETWEEN art.effective_start_date
5512                    AND art.effective_end_date
5513       AND      art.age_fctr_id = agf.age_fctr_id
5514       AND      (
5515                     (
5516                           p_new_val IS NOT NULL
5517                       AND p_old_val IS NOT NULL
5518                       AND p_new_val >= NVL(agf.mn_age_num
5519                                         ,p_new_val)
5520                       AND p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
5521                                     trunc(nvl(agf.mx_age_num,p_new_val))
5522                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
5523                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
5524                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
5525                                     -- ceil( NVL(agf.mx_age_num
5526                                     --   ,p_new_val) + 0.001 ))
5527                  OR (
5528                           p_new_val IS NOT NULL
5529                       AND p_old_val IS NOT NULL
5530                       AND (
5531                                p_new_val < NVL(agf.mn_age_num
5532                                             ,p_new_val)
5533                             OR p_new_val >=  decode(nvl(agf.mx_age_num,p_new_val) ,
5534                                     trunc(nvl(agf.mx_age_num,p_new_val))
5535                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
5536                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
5537                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
5538                                     -- ceil( NVL(agf.mx_age_num
5539                                     --         ,p_new_val)) + 0.001)
5540                       AND p_old_val >= NVL(agf.mn_age_num
5541                                         ,p_old_val)
5542                       AND p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
5543                                     trunc(nvl(agf.mx_age_num,p_old_val))
5544                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
5545                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
5546                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )  )
5547                                     -- ceil( NVL(agf.mx_age_num
5548                                     --   ,p_old_val)) + 0.001)
5549                  OR (    p_new_val IS NULL
5550                      AND p_old_val IS NULL));
5551     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
5552     --UNION ALL
5553     CURSOR c2 IS
5554       SELECT   p_ptip_id
5555               ,'Y'
5556               ,agf.age_det_cd
5557               ,agf.age_to_use_cd
5558               ,agf.age_uom
5559               ,agf.age_det_rl
5560               ,agf.rndg_cd
5561               ,agf.rndg_rl
5562               ,agf.age_calc_rl
5563               ,agf.mn_age_num
5564               ,agf.mx_age_num
5565       FROM     ben_acty_base_rt_f abr
5566               ,ben_acty_vrbl_rt_f avr
5567               ,ben_eligy_prfl_f elp
5568               ,ben_vrbl_rt_elig_prfl_f vep
5569               ,ben_vrbl_rt_prfl_f vpf
5570               ,ben_elig_age_prte_f eap
5571               --,ben_age_rt_f art
5572               ,ben_age_fctr agf
5573       WHERE    abr.ptip_id = p_ptip_id
5574       AND      p_effective_date BETWEEN abr.effective_start_date
5575                    AND abr.effective_end_date
5576       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
5577       AND      p_effective_date BETWEEN avr.effective_start_date
5578                    AND avr.effective_end_date
5579       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
5580       AND      p_effective_date BETWEEN vpf.effective_start_date
5581                    AND vpf.effective_end_date
5582 --      AND      vpf.vrbl_rt_prfl_id = eap.vrbl_rt_prfl_id
5583       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
5584       AND      p_effective_date BETWEEN vep.effective_start_date
5585                    AND vep.effective_end_date
5586       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
5587       AND      p_effective_date BETWEEN elp.effective_start_date
5588                    AND elp.effective_end_date
5589       AND      eap.eligy_prfl_id = elp.eligy_prfl_id
5590       AND      p_effective_date BETWEEN eap.effective_start_date
5591                    AND eap.effective_end_date
5592       AND      eap.age_fctr_id = agf.age_fctr_id
5593       AND      (
5594                     (
5595                           p_new_val IS NOT NULL
5596                       AND p_old_val IS NOT NULL
5597                       AND p_new_val >= NVL(agf.mn_age_num
5598                                         ,p_new_val)
5599                       AND p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
5600                                     trunc(nvl(agf.mx_age_num,p_new_val))
5601                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
5602                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
5603                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
5604                                     -- ceil( NVL(agf.mx_age_num
5605                                     --   ,p_new_val) + 0.001 ))
5606                  OR (
5610                                p_new_val < NVL(agf.mn_age_num
5607                           p_new_val IS NOT NULL
5608                       AND p_old_val IS NOT NULL
5609                       AND (
5611                                             ,p_new_val)
5612                             OR p_new_val >=  decode(nvl(agf.mx_age_num,p_new_val) ,
5613                                     trunc(nvl(agf.mx_age_num,p_new_val))
5614                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
5615                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
5616                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
5617                                     -- ceil( NVL(agf.mx_age_num
5618                                     --         ,p_new_val)) + 0.001)
5619                       AND p_old_val >= NVL(agf.mn_age_num
5620                                         ,p_old_val)
5621                       AND p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
5622                                     trunc(nvl(agf.mx_age_num,p_old_val))
5623                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
5624                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
5625                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )  )
5626                                     -- ceil( NVL(agf.mx_age_num
5627                                     --   ,p_old_val)) + 0.001)
5628                  OR (    p_new_val IS NULL
5629                      AND p_old_val IS NULL));
5630     --
5631     --
5632     l_index          PLS_INTEGER;
5633     l_not_hash_found BOOLEAN;
5634     l_c2notfound       BOOLEAN;
5635   --
5636   BEGIN
5637     --
5638     -- hr_utility.set_location ('Entering '||l_package,10);
5639     --
5640     -- Steps to do process
5641     --
5642     -- 1) Try and get value from cache
5643     -- 2) If can get from cache then copy to output record
5644     -- 3) If can't get from cache do db hit and then
5645     --    copy to cache record and then copy to output record.
5646     --
5647     -- Get hashed index value
5648     --
5649     l_index  := MOD(p_ptip_id
5650                  ,g_hash_key);
5651     --
5652     IF NOT g_cache_ptip_age_rt_rec.EXISTS(l_index) THEN
5653       --
5654       -- Lets store the hash value in this index
5655       --
5656       RAISE NO_DATA_FOUND;
5657     --
5658     ELSE
5659       --
5660       -- If it does exist make sure its the right one
5661       --
5662       IF g_cache_ptip_age_rt_rec(l_index).id <> p_ptip_id THEN
5663         --
5664         -- Loop through the hash using the jump routine to check further
5665         -- indexes
5666         --
5667         l_not_hash_found  := FALSE;
5668         --
5669         WHILE NOT l_not_hash_found LOOP
5670           --
5671           l_index  := l_index + g_hash_jump;
5672           --
5673           -- Check if the hash index exists, if not we can use it
5674           --
5675           IF NOT g_cache_ptip_age_rt_rec.EXISTS(l_index) THEN
5676             --
5677             -- Lets store the hash value in the index
5678             --
5679             RAISE NO_DATA_FOUND;
5680           --
5681           ELSE
5682             --
5683             -- Make sure the index is the correct one
5684             --
5685             IF g_cache_ptip_age_rt_rec(l_index).id = p_ptip_id THEN
5686               --
5687               -- We have a match so the hashed value  has been stored before
5688               --
5689               l_not_hash_found  := TRUE;
5690             --
5691             END IF;
5692           --
5693           END IF;
5694         --
5695         END LOOP;
5696       --
5697       END IF;
5698     --
5699     END IF;
5700     --
5701     -- If p_old_val and p_new_val is set this means we are trying to retrieve
5702     -- the correct rate for the calculated value.
5703     -- Previously we just cached the first rate we
5704     -- found since we needed the determination code, the correct age,los code,etc
5705     -- By killing the cache and forcing the value to be removed we cache the
5706     -- correct rate profile for the case we need.
5707     --
5708     IF     p_old_val IS NOT NULL
5709        AND p_new_val IS NOT NULL THEN
5710       --
5711       RAISE NO_DATA_FOUND;
5712     --
5713     END IF;
5714     --
5715     p_rec    := g_cache_ptip_age_rt_rec(l_index);
5716   --
5717   -- hr_utility.set_location ('Leaving '||l_package,10);
5718   --
5719   EXCEPTION
5720     --
5721     WHEN NO_DATA_FOUND THEN
5722       --
5723       -- The record has not been cached yet so lets cache it
5724       --
5725       OPEN c1;
5726       --
5727       FETCH c1 INTO g_cache_ptip_age_rt_rec(l_index);
5728       -- PERFNEW
5729       IF c1%NOTFOUND THEN
5730          --
5731          l_c2notfound := false;
5732          OPEN c2;
5733          FETCH c2 INTO g_cache_ptip_age_rt_rec(l_index);
5734          IF c2%NOTFOUND THEN
5735             --
5736             l_c2notfound := true;
5737             --
5738          END IF;
5739          CLOSE c2;
5740          --
5741       END IF;
5742       -- PERFNEW
5743       IF     p_old_val IS NULL
5744          AND p_new_val IS NULL THEN
5745         --
5746         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
5747           --
5751           end if;
5748           if NOT g_cache_ptip_age_rt_rec.EXISTS(l_index) then
5749             g_cache_ptip_age_rt_rec(l_index).id     := p_ptip_id;
5750             g_cache_ptip_age_rt_rec(l_index).exist  := 'N';
5752         --
5753         END IF;
5754       --
5755       END IF;
5756       --
5757       p_rec  := g_cache_ptip_age_rt_rec(l_index);
5758       --
5759       CLOSE c1;
5760   --
5761   END get_age_ptip_rate;
5762 --
5763   PROCEDURE get_age_oiplip_rate(
5764     p_oiplip_id         IN            NUMBER
5765    ,p_old_val           IN            NUMBER DEFAULT NULL
5766    ,p_new_val           IN            NUMBER DEFAULT NULL
5767    ,p_business_group_id IN            NUMBER
5768    ,p_effective_date    IN            DATE
5769    ,p_rec               OUT NOCOPY    g_cache_age_rec_obj) IS
5770     --
5771     l_package        VARCHAR2(80) := g_package || '.get_age_oiplip_rate';
5772     l_old_val_1 NUMBER := p_old_val + 1;
5773     l_new_val_1 NUMBER := p_new_val + 1;
5774     --
5775     -- Define Cursor
5776     --
5777     CURSOR c1 IS
5778       SELECT   p_oiplip_id
5779               ,'Y'
5780               ,agf.age_det_cd
5781               ,agf.age_to_use_cd
5782               ,agf.age_uom
5783               ,agf.age_det_rl
5784               ,agf.rndg_cd
5785               ,agf.rndg_rl
5786               ,agf.age_calc_rl
5787               ,agf.mn_age_num
5788               ,agf.mx_age_num
5789       FROM     ben_acty_base_rt_f abr
5790               ,ben_acty_vrbl_rt_f avr
5791               ,ben_vrbl_rt_prfl_f vpf
5792               ,ben_age_rt_f art
5793               ,ben_age_fctr agf
5794       WHERE    abr.oiplip_id = p_oiplip_id
5795       AND      p_effective_date BETWEEN abr.effective_start_date
5796                    AND abr.effective_end_date
5797       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
5798       AND      p_effective_date BETWEEN avr.effective_start_date
5799                    AND avr.effective_end_date
5800       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
5801       AND      p_effective_date BETWEEN vpf.effective_start_date
5802                    AND vpf.effective_end_date
5803       AND      vpf.vrbl_rt_prfl_id = art.vrbl_rt_prfl_id
5804       AND      p_effective_date BETWEEN art.effective_start_date
5805                    AND art.effective_end_date
5806       AND      art.age_fctr_id = agf.age_fctr_id
5807       AND      (
5808                     (
5809                           p_new_val IS NOT NULL
5810                       AND p_old_val IS NOT NULL
5811                       AND p_new_val >= NVL(agf.mn_age_num
5812                                         ,p_new_val)
5813                       AND p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
5814                                     trunc(nvl(agf.mx_age_num,p_new_val))
5815                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
5816                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
5817                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
5818                                    --  ceil( NVL(agf.mx_age_num
5819                                    --    , p_new_val) + 0.001 ))
5820                  OR (
5821                           p_new_val IS NOT NULL
5822                       AND p_old_val IS NOT NULL
5823                       AND (
5824                                p_new_val < NVL(agf.mn_age_num
5825                                             ,p_new_val)
5826                             OR p_new_val >=  decode(nvl(agf.mx_age_num,p_new_val) ,
5827                                     trunc(nvl(agf.mx_age_num,p_new_val))
5828                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
5829                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
5830                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
5831                                        --    ceil( NVL(agf.mx_age_num
5832                                        --      ,p_new_val)) + 0.001 )
5833                       AND p_old_val >= NVL(agf.mn_age_num
5834                                         ,p_old_val)
5835                       AND p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
5836                                     trunc(nvl(agf.mx_age_num,p_old_val))
5837                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
5838                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
5839                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )  )
5840                                        --  ceil( NVL(agf.mx_age_num
5841                                        --   ,p_old_val)) +  0.001 )
5842                  OR (    p_new_val IS NULL
5843                      AND p_old_val IS NULL));
5844     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
5845     --UNION ALL
5846     CURSOR c2 IS
5847       SELECT   p_oiplip_id
5848               ,'Y'
5849               ,agf.age_det_cd
5850               ,agf.age_to_use_cd
5851               ,agf.age_uom
5852               ,agf.age_det_rl
5853               ,agf.rndg_cd
5854               ,agf.rndg_rl
5855               ,agf.age_calc_rl
5856               ,agf.mn_age_num
5857               ,agf.mx_age_num
5858       FROM     ben_acty_base_rt_f abr
5862               ,ben_vrbl_rt_prfl_f vpf
5859               ,ben_acty_vrbl_rt_f avr
5860               ,ben_eligy_prfl_f elp
5861               ,ben_vrbl_rt_elig_prfl_f vep
5863               ,ben_elig_age_prte_f eap
5864               --,ben_age_rt_f art
5865               ,ben_age_fctr agf
5866       WHERE    abr.oiplip_id = p_oiplip_id
5867       AND      p_effective_date BETWEEN abr.effective_start_date
5868                    AND abr.effective_end_date
5869       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
5870       AND      p_effective_date BETWEEN avr.effective_start_date
5871                    AND avr.effective_end_date
5872       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
5873       AND      p_effective_date BETWEEN vpf.effective_start_date
5874                    AND vpf.effective_end_date
5875 --      AND      vpf.vrbl_rt_prfl_id = eap.vrbl_rt_prfl_id
5876       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
5877       AND      p_effective_date BETWEEN vep.effective_start_date
5878                    AND vep.effective_end_date
5879       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
5880       AND      p_effective_date BETWEEN elp.effective_start_date
5881                    AND elp.effective_end_date
5882       AND      eap.eligy_prfl_id = elp.eligy_prfl_id
5883       AND      p_effective_date BETWEEN eap.effective_start_date
5884                    AND eap.effective_end_date
5885       AND      eap.age_fctr_id = agf.age_fctr_id
5886       AND      (
5887                     (
5888                           p_new_val IS NOT NULL
5889                       AND p_old_val IS NOT NULL
5890                       AND p_new_val >= NVL(agf.mn_age_num
5891                                         ,p_new_val)
5892                       AND p_new_val <  decode(nvl(agf.mx_age_num,p_new_val) ,
5893                                     trunc(nvl(agf.mx_age_num,p_new_val))
5894                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
5895                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
5896                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
5897                                    --  ceil( NVL(agf.mx_age_num
5898                                    --    , p_new_val) + 0.001 ))
5899                  OR (
5900                           p_new_val IS NOT NULL
5901                       AND p_old_val IS NOT NULL
5902                       AND (
5903                                p_new_val < NVL(agf.mn_age_num
5904                                             ,p_new_val)
5905                             OR p_new_val >=  decode(nvl(agf.mx_age_num,p_new_val) ,
5906                                     trunc(nvl(agf.mx_age_num,p_new_val))
5907                      ,decode(nvl(agf.mn_age_num,p_new_val), trunc(nvl(agf.mn_age_num,p_new_val)),
5908                       nvl(agf.mx_age_num,p_new_val)+1,nvl(agf.mx_age_num,p_new_val)+0.000000001),
5909                       nvl(agf.mx_age_num,p_new_val)+0.000000001 )  )
5910                                        --    ceil( NVL(agf.mx_age_num
5911                                        --      ,p_new_val)) + 0.001 )
5912                       AND p_old_val >= NVL(agf.mn_age_num
5913                                         ,p_old_val)
5914                       AND p_old_val <  decode(nvl(agf.mx_age_num,p_old_val) ,
5915                                     trunc(nvl(agf.mx_age_num,p_old_val))
5916                      ,decode(nvl(agf.mn_age_num,p_old_val), trunc(nvl(agf.mn_age_num,p_old_val)),
5917                       nvl(agf.mx_age_num,p_old_val)+1,nvl(agf.mx_age_num,p_old_val)+0.000000001),
5918                       nvl(agf.mx_age_num,p_old_val)+0.000000001 )  )
5919                                        --  ceil( NVL(agf.mx_age_num
5920                                        --   ,p_old_val)) +  0.001 )
5921                  OR (    p_new_val IS NULL
5922                      AND p_old_val IS NULL));
5923     --
5924     --
5925     l_index          PLS_INTEGER;
5926     l_not_hash_found BOOLEAN;
5927     l_c2notfound       BOOLEAN;
5928   --
5929   BEGIN
5930     --
5931     -- hr_utility.set_location ('Entering '||l_package,10);
5932     --
5933     -- Steps to do process
5934     --
5935     -- 1) Try and get value from cache
5936     -- 2) If can get from cache then copy to output record
5937     -- 3) If can't get from cache do db hit and then
5938     --    copy to cache record and then copy to output record.
5939     --
5940     -- Get hashed index value
5941     --
5942     l_index  := MOD(p_oiplip_id
5943                  ,g_hash_key);
5944     --
5945     IF NOT g_cache_oiplip_age_rt_rec.EXISTS(l_index) THEN
5946       --
5947       -- Lets store the hash value in this index
5948       --
5949       RAISE NO_DATA_FOUND;
5950     --
5951     ELSE
5952       --
5953       -- If it does exist make sure its the right one
5954       --
5955       IF g_cache_oiplip_age_rt_rec(l_index).id <> p_oiplip_id THEN
5956         --
5957         -- Loop through the hash using the jump routine to check further
5958         -- indexes
5959         --
5960         l_not_hash_found  := FALSE;
5961         --
5962         WHILE NOT l_not_hash_found LOOP
5963           --
5964           l_index  := l_index + g_hash_jump;
5965           --
5966           -- Check if the hash index exists, if not we can use it
5967           --
5968           IF NOT g_cache_oiplip_age_rt_rec.EXISTS(l_index) THEN
5969             --
5970             -- Lets store the hash value in the index
5971             --
5972             RAISE NO_DATA_FOUND;
5973           --
5974           ELSE
5975             --
5979               --
5976             -- Make sure the index is the correct one
5977             --
5978             IF g_cache_oiplip_age_rt_rec(l_index).id = p_oiplip_id THEN
5980               -- We have a match so the hashed value  has been stored before
5981               --
5982               l_not_hash_found  := TRUE;
5983             --
5984             END IF;
5985           --
5986           END IF;
5987         --
5988         END LOOP;
5989       --
5990       END IF;
5991     --
5992     END IF;
5993     --
5994     -- If p_old_val and p_new_val is set this means we are trying to retrieve
5995     -- the correct rate for the calculated value.
5996     -- Previously we just cached the first rate we
5997     -- found since we needed the determination code, the correct age,los code,etc
5998     -- By killing the cache and forcing the value to be removed we cache the
5999     -- correct rate profile for the case we need.
6000     --
6001     IF     p_old_val IS NOT NULL
6002        AND p_new_val IS NOT NULL THEN
6003       --
6004       RAISE NO_DATA_FOUND;
6005     --
6006     END IF;
6007     --
6008     p_rec    := g_cache_oiplip_age_rt_rec(l_index);
6009   --
6010   -- hr_utility.set_location ('Leaving '||l_package,10);
6011   --
6012   EXCEPTION
6013     --
6014     WHEN NO_DATA_FOUND THEN
6015       --
6016       -- The record has not been cached yet so lets cache it
6017       --
6018       OPEN c1;
6019       --
6020       FETCH c1 INTO g_cache_oiplip_age_rt_rec(l_index);
6021       -- PERFNEW
6022       IF c1%NOTFOUND THEN
6023          --
6024          l_c2notfound := false;
6025          OPEN c2;
6026          FETCH c2 INTO g_cache_oiplip_age_rt_rec(l_index);
6027          IF c2%NOTFOUND THEN
6028             --
6029             l_c2notfound := true;
6030             --
6031          END IF;
6032          CLOSE c2;
6033          --
6034       END IF;
6035       -- PERFNEW
6036       IF     p_old_val IS NULL
6037          AND p_new_val IS NULL THEN
6038         --
6039         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
6040           --
6041           if NOT g_cache_oiplip_age_rt_rec.EXISTS(l_index) then
6042             g_cache_oiplip_age_rt_rec(l_index).id     := p_oiplip_id;
6043             g_cache_oiplip_age_rt_rec(l_index).exist  := 'N';
6044           end if;
6045         --
6046         END IF;
6047       --
6048       END IF;
6049       --
6050       p_rec  := g_cache_oiplip_age_rt_rec(l_index);
6051       --
6052       CLOSE c1;
6053   --
6054   END get_age_oiplip_rate;
6055 --
6056   PROCEDURE get_age_rate(
6057     p_pgm_id            IN            NUMBER
6058    ,p_pl_id             IN            NUMBER
6059    ,p_oipl_id           IN            NUMBER
6060    ,p_plip_id           IN            NUMBER
6061    ,p_ptip_id           IN            NUMBER
6062    ,p_oiplip_id         IN            NUMBER
6063    ,p_old_val           IN            NUMBER DEFAULT NULL
6064    ,p_new_val           IN            NUMBER DEFAULT NULL
6065    ,p_business_group_id IN            NUMBER
6066    ,p_effective_date    IN            DATE
6067    ,p_rec               OUT NOCOPY    g_cache_age_rec_obj) IS
6068     --
6069     l_package VARCHAR2(80) := g_package || '.get_age_rate';
6070   --
6071   BEGIN
6072     --
6073     -- hr_utility.set_location ('Entering '||l_package,10);
6074     --
6075     -- Derive which data type we are dealing with
6076     --
6077     IF p_pgm_id IS NOT NULL THEN
6078       --
6079       get_age_pgm_rate(p_pgm_id=> p_pgm_id
6080        ,p_old_val           => p_old_val
6081        ,p_new_val           => p_new_val
6082        ,p_business_group_id => p_business_group_id
6083        ,p_effective_date    => p_effective_date
6084        ,p_rec               => p_rec);
6085     --
6086     ELSIF p_pl_id IS NOT NULL THEN
6087       --
6088       get_age_pl_rate(p_pl_id=> p_pl_id
6089        ,p_old_val           => p_old_val
6090        ,p_new_val           => p_new_val
6091        ,p_business_group_id => p_business_group_id
6092        ,p_effective_date    => p_effective_date
6093        ,p_rec               => p_rec);
6094     --
6095     ELSIF p_oipl_id IS NOT NULL THEN
6096       --
6097       get_age_oipl_rate(p_oipl_id=> p_oipl_id
6098        ,p_old_val           => p_old_val
6099        ,p_new_val           => p_new_val
6100        ,p_business_group_id => p_business_group_id
6101        ,p_effective_date    => p_effective_date
6102        ,p_rec               => p_rec);
6103     --
6104     ELSIF p_plip_id IS NOT NULL THEN
6105       --
6106       get_age_plip_rate(p_plip_id=> p_plip_id
6107        ,p_old_val           => p_old_val
6108        ,p_new_val           => p_new_val
6109        ,p_business_group_id => p_business_group_id
6110        ,p_effective_date    => p_effective_date
6111        ,p_rec               => p_rec);
6112     --
6113     ELSIF p_ptip_id IS NOT NULL THEN
6114       --
6115       get_age_ptip_rate(p_ptip_id=> p_ptip_id
6116        ,p_old_val           => p_old_val
6117        ,p_new_val           => p_new_val
6118        ,p_business_group_id => p_business_group_id
6119        ,p_effective_date    => p_effective_date
6120        ,p_rec               => p_rec);
6121     --
6122     ELSIF p_oiplip_id IS NOT NULL THEN
6123       --
6127        ,p_business_group_id => p_business_group_id
6124       get_age_oiplip_rate(p_oiplip_id=> p_oiplip_id
6125        ,p_old_val           => p_old_val
6126        ,p_new_val           => p_new_val
6128        ,p_effective_date    => p_effective_date
6129        ,p_rec               => p_rec);
6130     --
6131     END IF;
6132   --
6133   -- hr_utility.set_location ('Leaving '||l_package,10);
6134   --
6135   END get_age_rate;
6136 --
6137   PROCEDURE get_comp_pgm_elig(
6138     p_pgm_id            IN            NUMBER
6139    ,p_old_val           in            number  default null
6140    ,p_new_val           in            number  default null
6141    ,p_business_group_id IN            NUMBER
6142    ,p_effective_date    IN            DATE
6143    ,p_rec               OUT NOCOPY    g_cache_clf_rec_obj) IS
6144     --
6145     l_package        VARCHAR2(80) := g_package || '.get_comp_pgm_elig';
6146     --
6147     -- Define Cursor
6148     --
6149     CURSOR c1 IS
6150       SELECT   p_pgm_id
6151               ,'Y'
6152               ,clf.comp_lvl_uom
6153               ,clf.comp_src_cd
6154               ,clf.comp_lvl_det_cd
6155               ,clf.comp_lvl_det_rl
6156               ,clf.rndg_cd
6157               ,clf.rndg_rl
6158               ,clf.mn_comp_val
6159               ,clf.mx_comp_val
6160               ,clf.bnfts_bal_id
6161               ,clf.defined_balance_id
6162               ,clf.sttd_sal_prdcty_cd
6163               ,clf.comp_lvl_fctr_id
6164               ,clf.comp_calc_rl
6165       FROM     ben_comp_lvl_fctr clf
6166               ,ben_elig_comp_lvl_prte_f ecl
6167               ,ben_eligy_prfl_f elp
6168               ,ben_prtn_elig_prfl_f cep
6169               ,ben_prtn_elig_f epa
6170       WHERE    epa.pgm_id = p_pgm_id
6171       AND      p_effective_date BETWEEN epa.effective_start_date
6172                    AND epa.effective_end_date
6173       AND      epa.prtn_elig_id = cep.prtn_elig_id
6174       AND      p_effective_date BETWEEN cep.effective_start_date
6175                    AND cep.effective_end_date
6176       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
6177       AND      p_effective_date BETWEEN elp.effective_start_date
6178                    AND elp.effective_end_date
6179       AND      ecl.eligy_prfl_id = elp.eligy_prfl_id
6180       AND      p_effective_date BETWEEN ecl.effective_start_date
6181                    AND ecl.effective_end_date
6182       AND      ecl.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
6183       AND     (
6184                  (
6185                    p_new_val IS NOT NULL
6186                    AND p_old_val IS NOT NULL
6187                    AND p_new_val >= NVL(clf.mn_comp_val ,p_new_val)
6188                    and p_new_val <  decode(nvl(clf.mx_comp_val,p_new_val) ,
6189                                     trunc(nvl(clf.mx_comp_val,p_new_val))
6190                  ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
6191                   nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
6192                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )
6193                   -- and p_old_val < clf.mn_comp_val
6194                   )
6195                  OR
6196                  (
6197                    p_new_val IS NOT NULL
6198                    AND p_old_val IS NOT NULL
6199                    AND
6200                    (
6201                     p_new_val < NVL(clf.mn_comp_val,p_new_val)
6202                     OR
6203                     p_new_val >=   decode(nvl(clf.mx_comp_val,p_new_val) ,
6204                                     trunc(nvl(clf.mx_comp_val,p_new_val))
6205                    ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
6206                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
6207                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )
6208                      )
6209                     AND p_old_val >= NVL(clf.mn_comp_val ,p_old_val)
6210                     and p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
6211                                     trunc(nvl(clf.mx_comp_val,p_old_val))
6212                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
6213                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
6214                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )
6215                   )
6216                  OR
6217                   (  p_new_val IS NULL
6218                      AND p_old_val IS NULL
6219                    )
6220             );
6221 
6222     --
6223     l_index          PLS_INTEGER;
6224     l_not_hash_found BOOLEAN;
6225   --
6226   BEGIN
6227     --
6228     -- hr_utility.set_location ('Entering '||l_package,10);
6229     --
6230     -- Steps to do process
6231     --
6232     -- 1) Try and get value from cache
6233     -- 2) If can get from cache then copy to output record
6234     -- 3) If can't get from cache do db hit and then
6235     --    copy to cache record and then copy to output record.
6236     --
6237     -- Get hashed index value
6238     --
6239     l_index  := MOD(p_pgm_id
6240                  ,g_hash_key);
6241     --
6242     IF NOT g_cache_pgm_clf_el_rec.EXISTS(l_index) THEN
6243       --
6244       -- Lets store the hash value in this index
6245       --
6246       RAISE NO_DATA_FOUND;
6247     --
6248     ELSE
6249       --
6253         --
6250       -- If it does exist make sure its the right one
6251       --
6252       IF g_cache_pgm_clf_el_rec(l_index).id <> p_pgm_id THEN
6254         -- Loop through the hash using the jump routine to check further
6255         -- indexes
6256         --
6257         l_not_hash_found  := FALSE;
6258         --
6259         WHILE NOT l_not_hash_found LOOP
6260           --
6261           l_index  := l_index + g_hash_jump;
6262           --
6263           -- Check if the hash index exists, if not we can use it
6264           --
6265           IF NOT g_cache_pgm_clf_el_rec.EXISTS(l_index) THEN
6266             --
6267             -- Lets store the hash value in the index
6268             --
6269             RAISE NO_DATA_FOUND;
6270           --
6271           ELSE
6272             --
6273             -- Make sure the index is the correct one
6274             --
6275             IF g_cache_pgm_clf_el_rec(l_index).id = p_pgm_id THEN
6276               --
6277               -- We have a match so the hashed value  has been stored before
6278               --
6279               l_not_hash_found  := TRUE;
6280             --
6281             END IF;
6282           --
6283           END IF;
6284         --
6285         END LOOP;
6286       --
6287       END IF;
6288     --
6289     END IF;
6290     --
6291      IF     p_old_val IS NOT NULL
6292        AND p_new_val IS NOT NULL THEN
6293       --
6294       RAISE NO_DATA_FOUND;
6295     --
6296     END IF;
6297 
6298     p_rec    := g_cache_pgm_clf_el_rec(l_index);
6299   --
6300   -- hr_utility.set_location ('Leaving '||l_package,10);
6301   --
6302   EXCEPTION
6303     --
6304     WHEN NO_DATA_FOUND THEN
6305       --
6306       -- The record has not been cached yet so lets cache it
6307       --
6308       OPEN c1;
6309       --
6310       FETCH c1 INTO g_cache_pgm_clf_el_rec(l_index);
6311       IF c1%NOTFOUND THEN
6312         --
6313         if NOT g_cache_pgm_clf_el_rec.EXISTS(l_index) then
6314           g_cache_pgm_clf_el_rec(l_index).id     := p_pgm_id;
6315           g_cache_pgm_clf_el_rec(l_index).exist  := 'N';
6316         end if;
6317       --
6318       END IF;
6319       --
6320       p_rec  := g_cache_pgm_clf_el_rec(l_index);
6321       --
6322       CLOSE c1;
6323   --
6324   END get_comp_pgm_elig;
6325 --
6326   PROCEDURE get_comp_pl_elig(
6327     p_pl_id             IN            NUMBER
6328    ,p_old_val           in            number  default null
6329    ,p_new_val           in            number  default null
6330    ,p_business_group_id IN            NUMBER
6331    ,p_effective_date    IN            DATE
6332    ,p_rec               OUT NOCOPY    g_cache_clf_rec_obj) IS
6333     --
6334     l_package        VARCHAR2(80) := g_package || '.get_comp_pl_elig';
6335     --
6336     -- Define Cursor
6337     --
6338     CURSOR c1 IS
6339       SELECT   p_pl_id
6340               ,'Y'
6341               ,clf.comp_lvl_uom
6342               ,clf.comp_src_cd
6343               ,clf.comp_lvl_det_cd
6344               ,clf.comp_lvl_det_rl
6345               ,clf.rndg_cd
6346               ,clf.rndg_rl
6347               ,clf.mn_comp_val
6348               ,clf.mx_comp_val
6349               ,clf.bnfts_bal_id
6350               ,clf.defined_balance_id
6351               ,clf.sttd_sal_prdcty_cd
6352               ,clf.comp_lvl_fctr_id
6353               ,clf.comp_calc_rl
6354       FROM     ben_comp_lvl_fctr clf
6355               ,ben_elig_comp_lvl_prte_f ecl
6356               ,ben_eligy_prfl_f elp
6357               ,ben_prtn_elig_prfl_f cep
6358               ,ben_prtn_elig_f epa
6359       WHERE    epa.pl_id = p_pl_id
6360       AND      p_effective_date BETWEEN epa.effective_start_date
6361                    AND epa.effective_end_date
6362       AND      epa.prtn_elig_id = cep.prtn_elig_id
6363       AND      p_effective_date BETWEEN cep.effective_start_date
6364                    AND cep.effective_end_date
6365       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
6366       AND      p_effective_date BETWEEN elp.effective_start_date
6367                    AND elp.effective_end_date
6368       AND      ecl.eligy_prfl_id = elp.eligy_prfl_id
6369       AND      p_effective_date BETWEEN ecl.effective_start_date
6370                    AND ecl.effective_end_date
6371       AND      ecl.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
6372       AND     (
6373                  (
6374                    p_new_val IS NOT NULL
6375                    AND p_old_val IS NOT NULL
6376                    AND p_new_val >= NVL(clf.mn_comp_val ,p_new_val)
6377                    and p_new_val <  decode(nvl(clf.mx_comp_val,p_new_val) ,
6378                                     trunc(nvl(clf.mx_comp_val,p_new_val))
6379                  ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
6380                   nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
6381                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )
6382                   -- and p_old_val < clf.mn_comp_val
6383                   )
6384                  OR
6385                  (
6386                    p_new_val IS NOT NULL
6387                    AND p_old_val IS NOT NULL
6388                    AND
6389                    (
6390                     p_new_val < NVL(clf.mn_comp_val,p_new_val)
6391                     OR
6395                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
6392                     p_new_val >=   decode(nvl(clf.mx_comp_val,p_new_val) ,
6393                                     trunc(nvl(clf.mx_comp_val,p_new_val))
6394                    ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
6396                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )
6397                      )
6398                     AND p_old_val >= NVL(clf.mn_comp_val ,p_old_val)
6399                     and p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
6400                                     trunc(nvl(clf.mx_comp_val,p_old_val))
6401                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
6402                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
6403                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )
6404                   )
6405                  OR
6406                   (  p_new_val IS NULL
6407                      AND p_old_val IS NULL
6408                    )
6409             );
6410 
6411     --
6412     l_index          PLS_INTEGER;
6413     l_not_hash_found BOOLEAN;
6414   --
6415   BEGIN
6416     --
6417     -- hr_utility.set_location ('Entering '||l_package,10);
6418     --
6419     -- Steps to do process
6420     --
6421     -- 1) Try and get value from cache
6422     -- 2) If can get from cache then copy to output record
6423     -- 3) If can't get from cache do db hit and then
6424     --    copy to cache record and then copy to output record.
6425     --
6426     -- Get hashed index value
6427     --
6428     l_index  := MOD(p_pl_id
6429                  ,g_hash_key);
6430     --
6431     IF NOT g_cache_pl_clf_el_rec.EXISTS(l_index) THEN
6432       --
6433       -- Lets store the hash value in this index
6434       --
6435       RAISE NO_DATA_FOUND;
6436     --
6437     ELSE
6438       --
6439       -- If it does exist make sure its the right one
6440       --
6441       IF g_cache_pl_clf_el_rec(l_index).id <> p_pl_id THEN
6442         --
6443         -- Loop through the hash using the jump routine to check further
6444         -- indexes
6445         --
6446         l_not_hash_found  := FALSE;
6447         --
6448         WHILE NOT l_not_hash_found LOOP
6449           --
6450           l_index  := l_index + g_hash_jump;
6451           --
6452           -- Check if the hash index exists, if not we can use it
6453           --
6454           IF NOT g_cache_pl_clf_el_rec.EXISTS(l_index) THEN
6455             --
6456             -- Lets store the hash value in the index
6457             --
6458             RAISE NO_DATA_FOUND;
6459           --
6460           ELSE
6461             --
6462             -- Make sure the index is the correct one
6463             --
6464             IF g_cache_pl_clf_el_rec(l_index).id = p_pl_id THEN
6465               --
6466               -- We have a match so the hashed value  has been stored before
6467               --
6468               l_not_hash_found  := TRUE;
6469             --
6470             END IF;
6471           --
6472           END IF;
6473         --
6474         END LOOP;
6475       --
6476       END IF;
6477     --
6478     END IF;
6479     --
6480      IF     p_old_val IS NOT NULL
6481        AND p_new_val IS NOT NULL THEN
6482       --
6483       RAISE NO_DATA_FOUND;
6484     --
6485     END IF;
6486     p_rec    := g_cache_pl_clf_el_rec(l_index);
6487   --
6488   -- hr_utility.set_location ('Leaving '||l_package,10);
6489   --
6490   EXCEPTION
6491     --
6492     WHEN NO_DATA_FOUND THEN
6493       --
6494       -- The record has not been cached yet so lets cache it
6495       --
6496       OPEN c1;
6497       --
6498       FETCH c1 INTO g_cache_pl_clf_el_rec(l_index);
6499       IF c1%NOTFOUND THEN
6500         --
6501         if NOT g_cache_pl_clf_el_rec.EXISTS(l_index) then
6502           g_cache_pl_clf_el_rec(l_index).id     := p_pl_id;
6503           g_cache_pl_clf_el_rec(l_index).exist  := 'N';
6504         end if;
6505       --
6506       END IF;
6507       --
6508       p_rec  := g_cache_pl_clf_el_rec(l_index);
6509       --
6510       CLOSE c1;
6511   --
6512   END get_comp_pl_elig;
6513 --
6514   PROCEDURE get_comp_oipl_elig(
6515     p_oipl_id           IN            NUMBER
6516    ,p_old_val           in            number  default null
6517    ,p_new_val           in            number  default null
6518    ,p_business_group_id IN            NUMBER
6519    ,p_effective_date    IN            DATE
6520    ,p_rec               OUT NOCOPY    g_cache_clf_rec_obj) IS
6521     --
6522     l_package        VARCHAR2(80) := g_package || '.get_comp_oipl_elig';
6523     --
6524     -- Define Cursor
6525     --
6526     CURSOR c1 IS
6527       SELECT   p_oipl_id
6528               ,'Y'
6529               ,clf.comp_lvl_uom
6530               ,clf.comp_src_cd
6531               ,clf.comp_lvl_det_cd
6532               ,clf.comp_lvl_det_rl
6533               ,clf.rndg_cd
6534               ,clf.rndg_rl
6535               ,clf.mn_comp_val
6536               ,clf.mx_comp_val
6537               ,clf.bnfts_bal_id
6541               ,clf.comp_calc_rl
6538               ,clf.defined_balance_id
6539               ,clf.sttd_sal_prdcty_cd
6540               ,clf.comp_lvl_fctr_id
6542       FROM     ben_comp_lvl_fctr clf
6543               ,ben_elig_comp_lvl_prte_f ecl
6544               ,ben_eligy_prfl_f elp
6545               ,ben_prtn_elig_prfl_f cep
6546               ,ben_prtn_elig_f epa
6547       WHERE    epa.oipl_id = p_oipl_id
6548       AND      p_effective_date BETWEEN epa.effective_start_date
6549                    AND epa.effective_end_date
6550       AND      epa.prtn_elig_id = cep.prtn_elig_id
6551       AND      p_effective_date BETWEEN cep.effective_start_date
6552                    AND cep.effective_end_date
6553       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
6554       AND      p_effective_date BETWEEN elp.effective_start_date
6555                    AND elp.effective_end_date
6556       AND      ecl.eligy_prfl_id = elp.eligy_prfl_id
6557       AND      p_effective_date BETWEEN ecl.effective_start_date
6558                    AND ecl.effective_end_date
6559       AND      ecl.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
6560       AND     (
6561                  (
6562                    p_new_val IS NOT NULL
6563                    AND p_old_val IS NOT NULL
6564                    AND p_new_val >= NVL(clf.mn_comp_val ,p_new_val)
6565                    and p_new_val <  decode(nvl(clf.mx_comp_val,p_new_val) ,
6566                                     trunc(nvl(clf.mx_comp_val,p_new_val))
6567                  ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
6568                   nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
6569                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )
6570                   -- and p_old_val < clf.mn_comp_val
6571                   )
6572                  OR
6573                  (
6574                    p_new_val IS NOT NULL
6575                    AND p_old_val IS NOT NULL
6576                    AND
6577                    (
6578                     p_new_val < NVL(clf.mn_comp_val,p_new_val)
6579                     OR
6580                     p_new_val >=   decode(nvl(clf.mx_comp_val,p_new_val) ,
6581                                     trunc(nvl(clf.mx_comp_val,p_new_val))
6582                    ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
6583                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
6584                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )
6585                      )
6586                     AND p_old_val >= NVL(clf.mn_comp_val ,p_old_val)
6587                     and p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
6588                                     trunc(nvl(clf.mx_comp_val,p_old_val))
6589                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
6590                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
6591                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )
6592                   )
6593                  OR
6594                   (  p_new_val IS NULL
6595                      AND p_old_val IS NULL
6596                    )
6597             );
6598 
6599     --
6600     l_index          PLS_INTEGER;
6601     l_not_hash_found BOOLEAN;
6602   --
6603   BEGIN
6604     --
6605     -- hr_utility.set_location ('Entering '||l_package,10);
6606     --
6607     -- Steps to do process
6608     --
6609     -- 1) Try and get value from cache
6610     -- 2) If can get from cache then copy to output record
6611     -- 3) If can't get from cache do db hit and then
6612     --    copy to cache record and then copy to output record.
6613     --
6614     -- Get hashed index value
6615     --
6616     l_index  := MOD(p_oipl_id
6617                  ,g_hash_key);
6618     --
6619     IF NOT g_cache_oipl_clf_el_rec.EXISTS(l_index) THEN
6620       --
6621       -- Lets store the hash value in this index
6622       --
6623       RAISE NO_DATA_FOUND;
6624     --
6625     ELSE
6626       --
6627       -- If it does exist make sure its the right one
6628       --
6629       IF g_cache_oipl_clf_el_rec(l_index).id <> p_oipl_id THEN
6630         --
6631         -- Loop through the hash using the jump routine to check further
6632         -- indexes
6633         --
6634         l_not_hash_found  := FALSE;
6635         --
6636         WHILE NOT l_not_hash_found LOOP
6637           --
6638           l_index  := l_index + g_hash_jump;
6639           --
6640           -- Check if the hash index exists, if not we can use it
6641           --
6642           IF NOT g_cache_oipl_clf_el_rec.EXISTS(l_index) THEN
6643             --
6644             -- Lets store the hash value in the index
6645             --
6646             RAISE NO_DATA_FOUND;
6647           --
6648           ELSE
6649             --
6650             -- Make sure the index is the correct one
6651             --
6652             IF g_cache_oipl_clf_el_rec(l_index).id = p_oipl_id THEN
6653               --
6654               -- We have a match so the hashed value  has been stored before
6655               --
6656               l_not_hash_found  := TRUE;
6657             --
6658             END IF;
6659           --
6660           END IF;
6661         --
6662         END LOOP;
6663       --
6664       END IF;
6665     --
6666     END IF;
6670       --
6667     --
6668      IF     p_old_val IS NOT NULL
6669        AND p_new_val IS NOT NULL THEN
6671       RAISE NO_DATA_FOUND;
6672     --
6673     END IF;
6674     p_rec    := g_cache_oipl_clf_el_rec(l_index);
6675   --
6676   -- hr_utility.set_location ('Leaving '||l_package,10);
6677   --
6678   EXCEPTION
6679     --
6680     WHEN NO_DATA_FOUND THEN
6681       --
6682       -- The record has not been cached yet so lets cache it
6683       --
6684       OPEN c1;
6685       --
6686       FETCH c1 INTO g_cache_oipl_clf_el_rec(l_index);
6687       IF c1%NOTFOUND THEN
6688         --
6689         if NOT g_cache_oipl_clf_el_rec.EXISTS(l_index) then
6690           g_cache_oipl_clf_el_rec(l_index).id     := p_oipl_id;
6691           g_cache_oipl_clf_el_rec(l_index).exist  := 'N';
6692         end if;
6693       --
6694       END IF;
6695       --
6696       p_rec  := g_cache_oipl_clf_el_rec(l_index);
6697       --
6698       CLOSE c1;
6699   --
6700   END get_comp_oipl_elig;
6701 --
6702   PROCEDURE get_comp_plip_elig(
6703     p_plip_id           IN            NUMBER
6704    ,p_old_val           in            number  default null
6705    ,p_new_val           in            number  default null
6706    ,p_business_group_id IN            NUMBER
6707    ,p_effective_date    IN            DATE
6708    ,p_rec               OUT NOCOPY    g_cache_clf_rec_obj) IS
6709     --
6710     l_package        VARCHAR2(80) := g_package || '.get_comp_plip_elig';
6711     --
6712     -- Define Cursor
6713     --
6714     CURSOR c1 IS
6715       SELECT   p_plip_id
6716               ,'Y'
6717               ,clf.comp_lvl_uom
6718               ,clf.comp_src_cd
6719               ,clf.comp_lvl_det_cd
6720               ,clf.comp_lvl_det_rl
6721               ,clf.rndg_cd
6722               ,clf.rndg_rl
6723               ,clf.mn_comp_val
6724               ,clf.mx_comp_val
6725               ,clf.bnfts_bal_id
6726               ,clf.defined_balance_id
6727               ,clf.sttd_sal_prdcty_cd
6728               ,clf.comp_lvl_fctr_id
6729               ,clf.comp_calc_rl
6730       FROM     ben_comp_lvl_fctr clf
6731               ,ben_elig_comp_lvl_prte_f ecl
6732               ,ben_eligy_prfl_f elp
6733               ,ben_prtn_elig_prfl_f cep
6734               ,ben_prtn_elig_f epa
6735       WHERE    epa.plip_id = p_plip_id
6736       AND      p_effective_date BETWEEN epa.effective_start_date
6737                    AND epa.effective_end_date
6738       AND      epa.prtn_elig_id = cep.prtn_elig_id
6739       AND      p_effective_date BETWEEN cep.effective_start_date
6740                    AND cep.effective_end_date
6741       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
6742       AND      p_effective_date BETWEEN elp.effective_start_date
6743                    AND elp.effective_end_date
6744       AND      ecl.eligy_prfl_id = elp.eligy_prfl_id
6745       AND      p_effective_date BETWEEN ecl.effective_start_date
6746                    AND ecl.effective_end_date
6747       AND      ecl.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
6748       AND     (
6749                  (
6750                    p_new_val IS NOT NULL
6751                    AND p_old_val IS NOT NULL
6752                    AND p_new_val >= NVL(clf.mn_comp_val ,p_new_val)
6753                    and p_new_val <  decode(nvl(clf.mx_comp_val,p_new_val) ,
6754                                     trunc(nvl(clf.mx_comp_val,p_new_val))
6755                  ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
6756                   nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
6757                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )
6758                   -- and p_old_val < clf.mn_comp_val
6759                   )
6760                  OR
6761                  (
6762                    p_new_val IS NOT NULL
6763                    AND p_old_val IS NOT NULL
6764                    AND
6765                    (
6766                     p_new_val < NVL(clf.mn_comp_val,p_new_val)
6767                     OR
6768                     p_new_val >=   decode(nvl(clf.mx_comp_val,p_new_val) ,
6769                                     trunc(nvl(clf.mx_comp_val,p_new_val))
6770                    ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
6771                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
6772                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )
6773                      )
6774                     AND p_old_val >= NVL(clf.mn_comp_val ,p_old_val)
6775                     and p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
6776                                     trunc(nvl(clf.mx_comp_val,p_old_val))
6777                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
6778                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
6779                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )
6780                   )
6781                  OR
6782                   (  p_new_val IS NULL
6783                      AND p_old_val IS NULL
6784                    )
6785             );
6786 
6787     --
6788     l_index          PLS_INTEGER;
6789     l_not_hash_found BOOLEAN;
6790   --
6791   BEGIN
6792     --
6793     -- hr_utility.set_location ('Entering '||l_package,10);
6797     -- 1) Try and get value from cache
6794     --
6795     -- Steps to do process
6796     --
6798     -- 2) If can get from cache then copy to output record
6799     -- 3) If can't get from cache do db hit and then
6800     --    copy to cache record and then copy to output record.
6801     --
6802     -- Get hashed index value
6803     --
6804     l_index  := MOD(p_plip_id
6805                  ,g_hash_key);
6806     --
6807     IF NOT g_cache_plip_clf_el_rec.EXISTS(l_index) THEN
6808       --
6809       -- Lets store the hash value in this index
6810       --
6811       RAISE NO_DATA_FOUND;
6812     --
6813     ELSE
6814       --
6815       -- If it does exist make sure its the right one
6816       --
6817       IF g_cache_plip_clf_el_rec(l_index).id <> p_plip_id THEN
6818         --
6819         -- Loop through the hash using the jump routine to check further
6820         -- indexes
6821         --
6822         l_not_hash_found  := FALSE;
6823         --
6824         WHILE NOT l_not_hash_found LOOP
6825           --
6826           l_index  := l_index + g_hash_jump;
6827           --
6828           -- Check if the hash index exists, if not we can use it
6829           --
6830           IF NOT g_cache_plip_clf_el_rec.EXISTS(l_index) THEN
6831             --
6832             -- Lets store the hash value in the index
6833             --
6834             RAISE NO_DATA_FOUND;
6835           --
6836           ELSE
6837             --
6838             -- Make sure the index is the correct one
6839             --
6840             IF g_cache_plip_clf_el_rec(l_index).id = p_plip_id THEN
6841               --
6842               -- We have a match so the hashed value  has been stored before
6843               --
6844               l_not_hash_found  := TRUE;
6845             --
6846             END IF;
6847           --
6848           END IF;
6849         --
6850         END LOOP;
6851       --
6852       END IF;
6853     --
6854     END IF;
6855     --
6856      IF     p_old_val IS NOT NULL
6857        AND p_new_val IS NOT NULL THEN
6858       --
6859       RAISE NO_DATA_FOUND;
6860     --
6861     END IF;
6862     p_rec    := g_cache_plip_clf_el_rec(l_index);
6863   --
6864   -- hr_utility.set_location ('Leaving '||l_package,10);
6865   --
6866   EXCEPTION
6867     --
6868     WHEN NO_DATA_FOUND THEN
6869       --
6870       -- The record has not been cached yet so lets cache it
6871       --
6872       OPEN c1;
6873       --
6874       FETCH c1 INTO g_cache_plip_clf_el_rec(l_index);
6875       IF c1%NOTFOUND THEN
6876         --
6877         if NOT g_cache_plip_clf_el_rec.EXISTS(l_index) then
6878           g_cache_plip_clf_el_rec(l_index).id     := p_plip_id;
6879           g_cache_plip_clf_el_rec(l_index).exist  := 'N';
6880         end if;
6881       --
6882       END IF;
6883       --
6884       p_rec  := g_cache_plip_clf_el_rec(l_index);
6885       --
6886       CLOSE c1;
6887   --
6888   END get_comp_plip_elig;
6889 --
6890   PROCEDURE get_comp_ptip_elig(
6891     p_ptip_id           IN            NUMBER
6892    ,p_old_val           in            number  default null
6893    ,p_new_val           in            number  default null
6894    ,p_business_group_id IN            NUMBER
6895    ,p_effective_date    IN            DATE
6896    ,p_rec               OUT NOCOPY    g_cache_clf_rec_obj) IS
6897     --
6898     l_package        VARCHAR2(80) := g_package || '.get_comp_ptip_elig';
6899     --
6900     -- Define Cursor
6901     --
6902     CURSOR c1 IS
6903       SELECT   p_ptip_id
6904               ,'Y'
6905               ,clf.comp_lvl_uom
6906               ,clf.comp_src_cd
6907               ,clf.comp_lvl_det_cd
6908               ,clf.comp_lvl_det_rl
6909               ,clf.rndg_cd
6910               ,clf.rndg_rl
6911               ,clf.mn_comp_val
6912               ,clf.mx_comp_val
6913               ,clf.bnfts_bal_id
6914               ,clf.defined_balance_id
6915               ,clf.sttd_sal_prdcty_cd
6916               ,clf.comp_lvl_fctr_id
6917               ,clf.comp_calc_rl
6918       FROM     ben_comp_lvl_fctr clf
6919               ,ben_elig_comp_lvl_prte_f ecl
6920               ,ben_eligy_prfl_f elp
6921               ,ben_prtn_elig_prfl_f cep
6922               ,ben_prtn_elig_f epa
6923       WHERE    epa.ptip_id = p_ptip_id
6924       AND      p_effective_date BETWEEN epa.effective_start_date
6925                    AND epa.effective_end_date
6926       AND      epa.prtn_elig_id = cep.prtn_elig_id
6927       AND      p_effective_date BETWEEN cep.effective_start_date
6928                    AND cep.effective_end_date
6929       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
6930       AND      p_effective_date BETWEEN elp.effective_start_date
6931                    AND elp.effective_end_date
6932       AND      ecl.eligy_prfl_id = elp.eligy_prfl_id
6933       AND      p_effective_date BETWEEN ecl.effective_start_date
6934                    AND ecl.effective_end_date
6935       AND      ecl.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
6936       AND     (
6937                  (
6938                    p_new_val IS NOT NULL
6939                    AND p_old_val IS NOT NULL
6943                  ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
6940                    AND p_new_val >= NVL(clf.mn_comp_val ,p_new_val)
6941                    and p_new_val <  decode(nvl(clf.mx_comp_val,p_new_val) ,
6942                                     trunc(nvl(clf.mx_comp_val,p_new_val))
6944                   nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
6945                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )
6946                   -- and p_old_val < clf.mn_comp_val
6947                   )
6948                  OR
6949                  (
6950                    p_new_val IS NOT NULL
6951                    AND p_old_val IS NOT NULL
6952                    AND
6953                    (
6954                     p_new_val < NVL(clf.mn_comp_val,p_new_val)
6955                     OR
6956                     p_new_val >=   decode(nvl(clf.mx_comp_val,p_new_val) ,
6957                                     trunc(nvl(clf.mx_comp_val,p_new_val))
6958                    ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
6959                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
6960                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )
6961                      )
6962                     AND p_old_val >= NVL(clf.mn_comp_val ,p_old_val)
6963                     and p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
6964                                     trunc(nvl(clf.mx_comp_val,p_old_val))
6965                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
6966                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
6967                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )
6968                   )
6969                  OR
6970                   (  p_new_val IS NULL
6971                      AND p_old_val IS NULL
6972                    )
6973             );
6974 
6975     --
6976     l_index          PLS_INTEGER;
6977     l_not_hash_found BOOLEAN;
6978   --
6979   BEGIN
6980     --
6981     -- hr_utility.set_location ('Entering '||l_package,10);
6982     --
6983     -- Steps to do process
6984     --
6985     -- 1) Try and get value from cache
6986     -- 2) If can get from cache then copy to output record
6987     -- 3) If can't get from cache do db hit and then
6988     --    copy to cache record and then copy to output record.
6989     --
6990     -- Get hashed index value
6991     --
6992     l_index  := MOD(p_ptip_id
6993                  ,g_hash_key);
6994     --
6995     IF NOT g_cache_ptip_clf_el_rec.EXISTS(l_index) THEN
6996       --
6997       -- Lets store the hash value in this index
6998       --
6999       RAISE NO_DATA_FOUND;
7000     --
7001     ELSE
7002       --
7003       -- If it does exist make sure its the right one
7004       --
7005       IF g_cache_ptip_clf_el_rec(l_index).id <> p_ptip_id THEN
7006         --
7007         -- Loop through the hash using the jump routine to check further
7008         -- indexes
7009         --
7010         l_not_hash_found  := FALSE;
7011         --
7012         WHILE NOT l_not_hash_found LOOP
7013           --
7014           l_index  := l_index + g_hash_jump;
7015           --
7016           -- Check if the hash index exists, if not we can use it
7017           --
7018           IF NOT g_cache_ptip_clf_el_rec.EXISTS(l_index) THEN
7019             --
7020             -- Lets store the hash value in the index
7021             --
7022             RAISE NO_DATA_FOUND;
7023           --
7024           ELSE
7025             --
7026             -- Make sure the index is the correct one
7027             --
7028             IF g_cache_ptip_clf_el_rec(l_index).id = p_ptip_id THEN
7029               --
7030               -- We have a match so the hashed value  has been stored before
7031               --
7032               l_not_hash_found  := TRUE;
7033             --
7034             END IF;
7035           --
7036           END IF;
7037         --
7038         END LOOP;
7039       --
7040       END IF;
7041     --
7042     END IF;
7043     --
7044      IF     p_old_val IS NOT NULL
7045        AND p_new_val IS NOT NULL THEN
7046       --
7047       RAISE NO_DATA_FOUND;
7048     --
7049     END IF;
7050     p_rec    := g_cache_ptip_clf_el_rec(l_index);
7051   --
7052   -- hr_utility.set_location ('Leaving '||l_package,10);
7053   --
7054   EXCEPTION
7055     --
7056     WHEN NO_DATA_FOUND THEN
7057       --
7058       -- The record has not been cached yet so lets cache it
7059       --
7060       OPEN c1;
7061       --
7062       FETCH c1 INTO g_cache_ptip_clf_el_rec(l_index);
7063       IF c1%NOTFOUND THEN
7064         --
7065         if NOT g_cache_ptip_clf_el_rec.EXISTS(l_index) then
7066           g_cache_ptip_clf_el_rec(l_index).id     := p_ptip_id;
7067           g_cache_ptip_clf_el_rec(l_index).exist  := 'N';
7068         end if;
7069       --
7070       END IF;
7071       --
7072       p_rec  := g_cache_ptip_clf_el_rec(l_index);
7073       --
7074       CLOSE c1;
7075   --
7076   END get_comp_ptip_elig;
7077 --
7078   PROCEDURE get_comp_elig(
7079     p_pgm_id            IN            NUMBER
7083    ,p_ptip_id           IN            NUMBER
7080    ,p_pl_id             IN            NUMBER
7081    ,p_oipl_id           IN            NUMBER
7082    ,p_plip_id           IN            NUMBER
7084    ,p_old_val           in            number  default null
7085    ,p_new_val           in            number  default null
7086    ,p_business_group_id IN            NUMBER
7087    ,p_effective_date    IN            DATE
7088    ,p_rec               OUT NOCOPY    g_cache_clf_rec_obj) IS
7089     --
7090     l_package VARCHAR2(80) := g_package || '.get_comp_elig';
7091   --
7092   BEGIN
7093     --
7094     -- hr_utility.set_location ('Entering '||l_package,10);
7095     --
7096     -- Derive which data type we are dealing with
7097     --
7098     IF p_pgm_id IS NOT NULL THEN
7099       --
7100       get_comp_pgm_elig(p_pgm_id=> p_pgm_id
7101        ,p_old_val           => p_old_val
7102        ,p_new_val           => p_new_val
7103        ,p_business_group_id => p_business_group_id
7104        ,p_effective_date    => p_effective_date
7105        ,p_rec               => p_rec);
7106     --
7107     ELSIF p_pl_id IS NOT NULL THEN
7108       --
7109       get_comp_pl_elig(p_pl_id=> p_pl_id
7110         ,p_old_val           => p_old_val
7111        ,p_new_val           => p_new_val
7112        ,p_business_group_id => p_business_group_id
7113        ,p_effective_date    => p_effective_date
7114        ,p_rec               => p_rec);
7115     --
7116     ELSIF p_oipl_id IS NOT NULL THEN
7117       --
7118       get_comp_oipl_elig(p_oipl_id=> p_oipl_id
7119         ,p_old_val           => p_old_val
7120        ,p_new_val           => p_new_val
7121        ,p_business_group_id => p_business_group_id
7122        ,p_effective_date    => p_effective_date
7123        ,p_rec               => p_rec);
7124     --
7125     ELSIF p_plip_id IS NOT NULL THEN
7126       --
7127       get_comp_plip_elig(p_plip_id=> p_plip_id
7128         ,p_old_val           => p_old_val
7129        ,p_new_val           => p_new_val
7130        ,p_business_group_id => p_business_group_id
7131        ,p_effective_date    => p_effective_date
7132        ,p_rec               => p_rec);
7133     --
7134     ELSIF p_ptip_id IS NOT NULL THEN
7135       --
7136       get_comp_ptip_elig(p_ptip_id=> p_ptip_id
7137         ,p_old_val           => p_old_val
7138        ,p_new_val           => p_new_val
7139        ,p_business_group_id => p_business_group_id
7140        ,p_effective_date    => p_effective_date
7141        ,p_rec               => p_rec);
7142     --
7143     END IF;
7144   --
7145   -- hr_utility.set_location ('Leaving '||l_package,10);
7146   --
7147   END get_comp_elig;
7148 --
7149   PROCEDURE get_comp_pgm_rate(
7150     p_pgm_id            IN            NUMBER
7151    ,p_old_val           IN            NUMBER DEFAULT NULL
7152    ,p_new_val           IN            NUMBER DEFAULT NULL
7153    ,p_business_group_id IN            NUMBER
7154    ,p_effective_date    IN            DATE
7155    ,p_rec               OUT NOCOPY    g_cache_clf_rec_obj) IS
7156     --
7157     l_package        VARCHAR2(80) := g_package || '.get_comp_pgm_rate';
7158     l_old_val_1 NUMBER := p_old_val + 1;
7159     l_new_val_1 NUMBER := p_new_val + 1;
7160     --
7161     -- Define Cursor
7162     --
7163     CURSOR c1 IS
7164       SELECT   p_pgm_id
7165               ,'Y'
7166               ,clf.comp_lvl_uom
7167               ,clf.comp_src_cd
7168               ,clf.comp_lvl_det_cd
7169               ,clf.comp_lvl_det_rl
7170               ,clf.rndg_cd
7171               ,clf.rndg_rl
7172               ,clf.mn_comp_val
7173               ,clf.mx_comp_val
7174               ,clf.bnfts_bal_id
7175               ,clf.defined_balance_id
7176               ,clf.sttd_sal_prdcty_cd
7177               ,clf.comp_lvl_fctr_id
7178               ,clf.comp_calc_rl
7179       FROM     ben_comp_lvl_fctr clf
7180               ,ben_comp_lvl_rt_f clr
7181               ,ben_vrbl_rt_prfl_f vpf
7182               ,ben_acty_vrbl_rt_f avr
7183               ,ben_acty_base_rt_f abr
7184       WHERE    abr.pgm_id = p_pgm_id
7185       AND      p_effective_date BETWEEN abr.effective_start_date
7186                    AND abr.effective_end_date
7187       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
7188       AND      p_effective_date BETWEEN avr.effective_start_date
7189                    AND avr.effective_end_date
7190       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
7191       AND      p_effective_date BETWEEN vpf.effective_start_date
7192                    AND vpf.effective_end_date
7193       AND      vpf.vrbl_rt_prfl_id = clr.vrbl_rt_prfl_id
7194       AND      p_effective_date BETWEEN clr.effective_start_date
7195                    AND clr.effective_end_date
7196       AND      clr.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
7197       AND      (
7198                     (
7199                           p_new_val IS NOT NULL
7200                       AND p_old_val IS NOT NULL
7201                       AND p_new_val >= NVL(clf.mn_comp_val
7202                                         ,p_new_val)
7203                       AND p_new_val <  decode(nvl(clf.mx_comp_val,p_new_val) ,
7204                                     trunc(nvl(clf.mx_comp_val,p_new_val))
7205                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
7206                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
7210                  OR (
7207                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
7208                                     -- ceil( NVL(clf.mx_comp_val
7209                                     --    ,p_new_val) + 0.001 ))
7211                           p_new_val IS NOT NULL
7212                       AND p_old_val IS NOT NULL
7213                       AND (
7214                                p_new_val < NVL(clf.mn_comp_val
7215                                             ,p_new_val)
7216                             OR p_new_val >=  decode(nvl(clf.mx_comp_val,p_new_val) ,
7217                                     trunc(nvl(clf.mx_comp_val,p_new_val))
7218                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
7219                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
7220                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
7221                                         --   ceil( NVL(clf.mx_comp_val
7222                                         --    ,p_new_val)) + 0.001 )
7223                       AND p_old_val >= NVL(clf.mn_comp_val
7224                                         ,p_old_val)
7225                       AND p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
7226                                     trunc(nvl(clf.mx_comp_val,p_old_val))
7227                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
7228                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
7229                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )  )
7230                                     -- ceil( NVL(clf.mx_comp_val
7231                                     --   ,p_old_val))  + 0.001 )
7232                  OR (    p_new_val IS NULL
7233                      AND p_old_val IS NULL));
7234     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
7235     --UNION ALL
7236     CURSOR c2 IS
7237       SELECT   p_pgm_id
7238               ,'Y'
7239               ,clf.comp_lvl_uom
7240               ,clf.comp_src_cd
7241               ,clf.comp_lvl_det_cd
7242               ,clf.comp_lvl_det_rl
7243               ,clf.rndg_cd
7244               ,clf.rndg_rl
7245               ,clf.mn_comp_val
7246               ,clf.mx_comp_val
7247               ,clf.bnfts_bal_id
7248               ,clf.defined_balance_id
7249               ,clf.sttd_sal_prdcty_cd
7250               ,clf.comp_lvl_fctr_id
7251               ,clf.comp_calc_rl
7252       FROM     ben_comp_lvl_fctr clf
7253               --,ben_comp_lvl_rt_f clr
7254               ,ben_elig_comp_lvl_prte_f ecl
7255               ,ben_eligy_prfl_f elp
7256               ,ben_vrbl_rt_elig_prfl_f vep
7257               ,ben_vrbl_rt_prfl_f vpf
7258               ,ben_acty_vrbl_rt_f avr
7259               ,ben_acty_base_rt_f abr
7260       WHERE    abr.pgm_id = p_pgm_id
7261       AND      p_effective_date BETWEEN abr.effective_start_date
7262                    AND abr.effective_end_date
7263       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
7264       AND      p_effective_date BETWEEN avr.effective_start_date
7265                    AND avr.effective_end_date
7266       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
7267       AND      p_effective_date BETWEEN vpf.effective_start_date
7268                    AND vpf.effective_end_date
7269 --      AND      vpf.vrbl_rt_prfl_id = ecl.vrbl_rt_prfl_id
7270       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
7271       AND      p_effective_date BETWEEN vep.effective_start_date
7272                    AND vep.effective_end_date
7273       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
7274       AND      p_effective_date BETWEEN elp.effective_start_date
7275                    AND elp.effective_end_date
7276       AND      ecl.eligy_prfl_id = elp.eligy_prfl_id
7277       AND      p_effective_date BETWEEN ecl.effective_start_date
7278                    AND ecl.effective_end_date
7279       AND      ecl.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
7280       AND      (
7281                     (
7282                           p_new_val IS NOT NULL
7283                       AND p_old_val IS NOT NULL
7284                       AND p_new_val >= NVL(clf.mn_comp_val
7285                                         ,p_new_val)
7286                       AND p_new_val <  decode(nvl(clf.mx_comp_val,p_new_val) ,
7287                                     trunc(nvl(clf.mx_comp_val,p_new_val))
7288                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
7289                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
7290                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
7291                                     -- ceil( NVL(clf.mx_comp_val
7292                                     --    ,p_new_val) + 0.001 ))
7293                  OR (
7294                           p_new_val IS NOT NULL
7295                       AND p_old_val IS NOT NULL
7296                       AND (
7297                                p_new_val < NVL(clf.mn_comp_val
7298                                             ,p_new_val)
7299                             OR p_new_val >=  decode(nvl(clf.mx_comp_val,p_new_val) ,
7300                                     trunc(nvl(clf.mx_comp_val,p_new_val))
7301                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
7302                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
7306                       AND p_old_val >= NVL(clf.mn_comp_val
7303                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
7304                                         --   ceil( NVL(clf.mx_comp_val
7305                                         --    ,p_new_val)) + 0.001 )
7307                                         ,p_old_val)
7308                       AND p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
7309                                     trunc(nvl(clf.mx_comp_val,p_old_val))
7310                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
7311                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
7312                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )  )
7313                                     -- ceil( NVL(clf.mx_comp_val
7314                                     --   ,p_old_val))  + 0.001 )
7315                  OR (    p_new_val IS NULL
7316                      AND p_old_val IS NULL));
7317     --
7318     --
7319     l_index          PLS_INTEGER;
7320     l_not_hash_found BOOLEAN;
7321     l_c2notfound       BOOLEAN;
7322   --
7323   BEGIN
7324     --
7325     -- hr_utility.set_location ('Entering '||l_package,10);
7326     --
7327     -- Steps to do process
7328     --
7329     -- 1) Try and get value from cache
7330     -- 2) If can get from cache then copy to output record
7331     -- 3) If can't get from cache do db hit and then
7332     --    copy to cache record and then copy to output record.
7333     --
7334     -- Get hashed index value
7335     --
7336     l_index  := MOD(p_pgm_id
7337                  ,g_hash_key);
7338     --
7339     IF NOT g_cache_pgm_clf_rt_rec.EXISTS(l_index) THEN
7340       --
7341       -- Lets store the hash value in this index
7342       --
7343       RAISE NO_DATA_FOUND;
7344     --
7345     ELSE
7346       --
7347       -- If it does exist make sure its the right one
7348       --
7349       IF g_cache_pgm_clf_rt_rec(l_index).id <> p_pgm_id THEN
7350         --
7351         -- Loop through the hash using the jump routine to check further
7352         -- indexes
7353         --
7354         l_not_hash_found  := FALSE;
7355         --
7356         WHILE NOT l_not_hash_found LOOP
7357           --
7358           l_index  := l_index + g_hash_jump;
7359           --
7360           -- Check if the hash index exists, if not we can use it
7361           --
7362           IF NOT g_cache_pgm_clf_rt_rec.EXISTS(l_index) THEN
7363             --
7364             -- Lets store the hash value in the index
7365             --
7366             RAISE NO_DATA_FOUND;
7367           --
7368           ELSE
7369             --
7370             -- Make sure the index is the correct one
7371             --
7372             IF g_cache_pgm_clf_rt_rec(l_index).id = p_pgm_id THEN
7373               --
7374               -- We have a match so the hashed value  has been stored before
7375               --
7376               l_not_hash_found  := TRUE;
7377             --
7378             END IF;
7379           --
7380           END IF;
7381         --
7382         END LOOP;
7383       --
7384       END IF;
7385     --
7386     END IF;
7387     --
7388     -- If p_old_val and p_new_val is set this means we are trying to retrieve
7389     -- the correct rate for the calculated value.
7390     -- Previously we just cached the first rate we
7391     -- found since we needed the determination code, the correct age,los code,etc
7392     -- By killing the cache and forcing the value to be removed we cache the
7393     -- correct rate profile for the case we need.
7394     --
7395     IF     p_old_val IS NOT NULL
7396        AND p_new_val IS NOT NULL THEN
7397       --
7398       RAISE NO_DATA_FOUND;
7399     --
7400     END IF;
7401     --
7402     p_rec    := g_cache_pgm_clf_rt_rec(l_index);
7403   --
7404   -- hr_utility.set_location ('Leaving '||l_package,10);
7405   --
7406   EXCEPTION
7407     --
7408     WHEN NO_DATA_FOUND THEN
7409       --
7410       -- The record has not been cached yet so lets cache it
7411       --
7412       OPEN c1;
7413       --
7414       FETCH c1 INTO g_cache_pgm_clf_rt_rec(l_index);
7415       -- PERFNEW
7416       IF c1%NOTFOUND THEN
7417          --
7418          l_c2notfound := false;
7419          OPEN c2;
7420          FETCH c2 INTO g_cache_pgm_clf_rt_rec(l_index);
7421          IF c2%NOTFOUND THEN
7422             --
7423             l_c2notfound := true;
7424             --
7425          END IF;
7426          CLOSE c2;
7427          --
7428       END IF;
7429       -- PERFNEW
7430       IF     p_old_val IS NULL
7431          AND p_new_val IS NULL THEN
7432         --
7433         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
7434           --
7435           if NOT g_cache_pgm_clf_rt_rec.EXISTS(l_index) then
7436             g_cache_pgm_clf_rt_rec(l_index).id     := p_pgm_id;
7437             g_cache_pgm_clf_rt_rec(l_index).exist  := 'N';
7438           end if;
7439         --
7440         END IF;
7441       --
7442       END IF;
7443       --
7444       p_rec  := g_cache_pgm_clf_rt_rec(l_index);
7445       --
7446       CLOSE c1;
7447   --
7448   END get_comp_pgm_rate;
7449 --
7453    ,p_new_val           IN            NUMBER DEFAULT NULL
7450   PROCEDURE get_comp_pl_rate(
7451     p_pl_id             IN            NUMBER
7452    ,p_old_val           IN            NUMBER DEFAULT NULL
7454    ,p_business_group_id IN            NUMBER
7455    ,p_effective_date    IN            DATE
7456    ,p_rec               OUT NOCOPY    g_cache_clf_rec_obj) IS
7457     --
7458     l_package        VARCHAR2(80) := g_package || '.get_comp_pl_rate';
7459     l_old_val_1 NUMBER := p_old_val + 1;
7460     l_new_val_1 NUMBER := p_new_val + 1;
7461     --
7462     -- Define Cursor
7463     --
7464     CURSOR c1 IS
7465       SELECT   p_pl_id
7466               ,'Y'
7467               ,clf.comp_lvl_uom
7468               ,clf.comp_src_cd
7469               ,clf.comp_lvl_det_cd
7470               ,clf.comp_lvl_det_rl
7471               ,clf.rndg_cd
7472               ,clf.rndg_rl
7473               ,clf.mn_comp_val
7474               ,clf.mx_comp_val
7475               ,clf.bnfts_bal_id
7476               ,clf.defined_balance_id
7477               ,clf.sttd_sal_prdcty_cd
7478               ,clf.comp_lvl_fctr_id
7479               ,clf.comp_calc_rl
7480       FROM     ben_comp_lvl_fctr clf
7481               ,ben_comp_lvl_rt_f clr
7482               ,ben_vrbl_rt_prfl_f vpf
7483               ,ben_acty_vrbl_rt_f avr
7484               ,ben_acty_base_rt_f abr
7485       WHERE    abr.pl_id = p_pl_id
7486       AND      p_effective_date BETWEEN abr.effective_start_date
7487                    AND abr.effective_end_date
7488       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
7489       AND      p_effective_date BETWEEN avr.effective_start_date
7490                    AND avr.effective_end_date
7491       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
7492       AND      p_effective_date BETWEEN vpf.effective_start_date
7493                    AND vpf.effective_end_date
7494       AND      vpf.vrbl_rt_prfl_id = clr.vrbl_rt_prfl_id
7495       AND      p_effective_date BETWEEN clr.effective_start_date
7496                    AND clr.effective_end_date
7497       AND      clr.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
7498       AND      (
7499                     (
7500                           p_new_val IS NOT NULL
7501                       AND p_old_val IS NOT NULL
7502                       AND p_new_val >= NVL(clf.mn_comp_val
7503                                         ,p_new_val)
7504                       AND p_new_val <  decode(nvl(clf.mx_comp_val,p_new_val) ,
7505                                     trunc(nvl(clf.mx_comp_val,p_new_val))
7506                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
7507                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
7508                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
7509                                     -- ceil( NVL(clf.mx_comp_val
7510                                     --    ,p_new_val) + 0.001 ))
7511                  OR (
7512                           p_new_val IS NOT NULL
7513                       AND p_old_val IS NOT NULL
7514                       AND (
7515                                p_new_val < NVL(clf.mn_comp_val
7516                                             ,p_new_val)
7517                             OR p_new_val >=  decode(nvl(clf.mx_comp_val,p_new_val) ,
7518                                     trunc(nvl(clf.mx_comp_val,p_new_val))
7519                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
7520                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
7521                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
7522                                         --  ceil( NVL(clf.mx_comp_val
7523                                         --   ,p_new_val)) + 0.001)
7524                       AND p_old_val >= NVL(clf.mn_comp_val
7525                                         ,p_old_val)
7526                       AND p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
7527                                     trunc(nvl(clf.mx_comp_val,p_old_val))
7528                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
7529                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
7530                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )  )
7531                                        -- ceil( NVL(clf.mx_comp_val
7532                                        -- ,p_old_val))+ 0.001)
7533                  OR (    p_new_val IS NULL
7534                      AND p_old_val IS NULL));
7535     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
7536     --UNION ALL
7537     CURSOR c2 IS
7538       SELECT   p_pl_id
7539               ,'Y'
7540               ,clf.comp_lvl_uom
7541               ,clf.comp_src_cd
7542               ,clf.comp_lvl_det_cd
7543               ,clf.comp_lvl_det_rl
7544               ,clf.rndg_cd
7545               ,clf.rndg_rl
7546               ,clf.mn_comp_val
7547               ,clf.mx_comp_val
7548               ,clf.bnfts_bal_id
7549               ,clf.defined_balance_id
7550               ,clf.sttd_sal_prdcty_cd
7551               ,clf.comp_lvl_fctr_id
7552               ,clf.comp_calc_rl
7553       FROM     ben_comp_lvl_fctr clf
7554               --,ben_comp_lvl_rt_f clr
7555               ,ben_elig_comp_lvl_prte_f ecl
7556               ,ben_eligy_prfl_f elp
7557               ,ben_vrbl_rt_elig_prfl_f vep
7558               ,ben_vrbl_rt_prfl_f vpf
7562       AND      p_effective_date BETWEEN abr.effective_start_date
7559               ,ben_acty_vrbl_rt_f avr
7560               ,ben_acty_base_rt_f abr
7561       WHERE    abr.pl_id = p_pl_id
7563                    AND abr.effective_end_date
7564       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
7565       AND      p_effective_date BETWEEN avr.effective_start_date
7566                    AND avr.effective_end_date
7567       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
7568       AND      p_effective_date BETWEEN vpf.effective_start_date
7569                    AND vpf.effective_end_date
7570 --      AND      vpf.vrbl_rt_prfl_id = ecl.vrbl_rt_prfl_id
7571       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
7572       AND      p_effective_date BETWEEN vep.effective_start_date
7573                    AND vep.effective_end_date
7574       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
7575       AND      p_effective_date BETWEEN elp.effective_start_date
7576                    AND elp.effective_end_date
7577       AND      ecl.eligy_prfl_id = elp.eligy_prfl_id
7578       AND      p_effective_date BETWEEN ecl.effective_start_date
7579                    AND ecl.effective_end_date
7580       AND      ecl.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
7581       AND      (
7582                     (
7583                           p_new_val IS NOT NULL
7584                       AND p_old_val IS NOT NULL
7585                       AND p_new_val >= NVL(clf.mn_comp_val
7586                                         ,p_new_val)
7587                       AND p_new_val <  decode(nvl(clf.mx_comp_val,p_new_val) ,
7588                                     trunc(nvl(clf.mx_comp_val,p_new_val))
7589                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
7590                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
7591                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
7592                                     -- ceil( NVL(clf.mx_comp_val
7593                                     --    ,p_new_val) + 0.001 ))
7594                  OR (
7595                           p_new_val IS NOT NULL
7596                       AND p_old_val IS NOT NULL
7597                       AND (
7598                                p_new_val < NVL(clf.mn_comp_val
7599                                             ,p_new_val)
7600                             OR p_new_val >=  decode(nvl(clf.mx_comp_val,p_new_val) ,
7601                                     trunc(nvl(clf.mx_comp_val,p_new_val))
7602                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
7603                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
7604                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
7605                                         --  ceil( NVL(clf.mx_comp_val
7606                                         --   ,p_new_val)) + 0.001)
7607                       AND p_old_val >= NVL(clf.mn_comp_val
7608                                         ,p_old_val)
7609                       AND p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
7610                                     trunc(nvl(clf.mx_comp_val,p_old_val))
7611                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
7612                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
7613                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )  )
7614                                        -- ceil( NVL(clf.mx_comp_val
7615                                        -- ,p_old_val))+ 0.001)
7616                  OR (    p_new_val IS NULL
7617                      AND p_old_val IS NULL));
7618     --
7619     --
7620     l_index          PLS_INTEGER;
7621     l_not_hash_found BOOLEAN;
7622     l_c2notfound       BOOLEAN;
7623   --
7624   BEGIN
7625     --
7626     -- hr_utility.set_location ('Entering '||l_package,10);
7627     --
7628     -- Steps to do process
7629     --
7630     -- 1) Try and get value from cache
7631     -- 2) If can get from cache then copy to output record
7632     -- 3) If can't get from cache do db hit and then
7633     --    copy to cache record and then copy to output record.
7634     --
7635     -- Get hashed index value
7636     --
7637     l_index  := MOD(p_pl_id
7638                  ,g_hash_key);
7639     --
7640     IF NOT g_cache_pl_clf_rt_rec.EXISTS(l_index) THEN
7641       --
7642       -- Lets store the hash value in this index
7643       --
7644       RAISE NO_DATA_FOUND;
7645     --
7646     ELSE
7647       --
7648       -- If it does exist make sure its the right one
7649       --
7650       IF g_cache_pl_clf_rt_rec(l_index).id <> p_pl_id THEN
7651         --
7652         -- Loop through the hash using the jump routine to check further
7653         -- indexes
7654         --
7655         l_not_hash_found  := FALSE;
7656         --
7657         WHILE NOT l_not_hash_found LOOP
7658           --
7659           l_index  := l_index + g_hash_jump;
7660           --
7661           -- Check if the hash index exists, if not we can use it
7662           --
7663           IF NOT g_cache_pl_clf_rt_rec.EXISTS(l_index) THEN
7664             --
7665             -- Lets store the hash value in the index
7666             --
7667             RAISE NO_DATA_FOUND;
7668           --
7669           ELSE
7670             --
7671             -- Make sure the index is the correct one
7672             --
7673             IF g_cache_pl_clf_rt_rec(l_index).id = p_pl_id THEN
7674               --
7678             --
7675               -- We have a match so the hashed value  has been stored before
7676               --
7677               l_not_hash_found  := TRUE;
7679             END IF;
7680           --
7681           END IF;
7682         --
7683         END LOOP;
7684       --
7685       END IF;
7686     --
7687     END IF;
7688     --
7689     -- If p_old_val and p_new_val is set this means we are trying to retrieve
7690     -- the correct rate for the calculated value.
7691     -- Previously we just cached the first rate we
7692     -- found since we needed the determination code, the correct age,los code,etc
7693     -- By killing the cache and forcing the value to be removed we cache the
7694     -- correct rate profile for the case we need.
7695     --
7696     IF     p_old_val IS NOT NULL
7697        AND p_new_val IS NOT NULL THEN
7698       --
7699       RAISE NO_DATA_FOUND;
7700     --
7701     END IF;
7702     --
7703     p_rec    := g_cache_pl_clf_rt_rec(l_index);
7704   --
7705   -- hr_utility.set_location ('Leaving '||l_package,10);
7706   --
7707   EXCEPTION
7708     --
7709     WHEN NO_DATA_FOUND THEN
7710       --
7711       -- The record has not been cached yet so lets cache it
7712       --
7713       OPEN c1;
7714       --
7715       FETCH c1 INTO g_cache_pl_clf_rt_rec(l_index);
7716       -- PERFNEW
7717       IF c1%NOTFOUND THEN
7718          --
7719          l_c2notfound := false;
7720          OPEN c2;
7721          FETCH c2 INTO g_cache_pl_clf_rt_rec(l_index);
7722          IF c2%NOTFOUND THEN
7723             --
7724             l_c2notfound := true;
7725             --
7726          END IF;
7727          CLOSE c2;
7728          --
7729       END IF;
7730       -- PERFNEW
7731       IF     p_old_val IS NULL
7732          AND p_new_val IS NULL THEN
7733         --
7734         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
7735           --
7736           if NOT g_cache_pl_clf_rt_rec.EXISTS(l_index) then
7737             g_cache_pl_clf_rt_rec(l_index).id     := p_pl_id;
7738             g_cache_pl_clf_rt_rec(l_index).exist  := 'N';
7739           end if;
7740         --
7741         END IF;
7742       --
7743       END IF;
7744       --
7745       p_rec  := g_cache_pl_clf_rt_rec(l_index);
7746       --
7747       CLOSE c1;
7748   --
7749   END get_comp_pl_rate;
7750 --
7751   PROCEDURE get_comp_oipl_rate(
7752     p_oipl_id           IN            NUMBER
7753    ,p_old_val           IN            NUMBER DEFAULT NULL
7754    ,p_new_val           IN            NUMBER DEFAULT NULL
7755    ,p_business_group_id IN            NUMBER
7756    ,p_effective_date    IN            DATE
7757    ,p_rec               OUT NOCOPY    g_cache_clf_rec_obj) IS
7758     --
7759     l_package        VARCHAR2(80) := g_package || '.get_comp_oipl_rate';
7760     l_old_val_1 NUMBER := p_old_val + 1;
7761     l_new_val_1 NUMBER := p_new_val + 1;
7762     --
7763     l_opt_id    NUMBER;
7764     --
7765     -- Define Cursor
7766     --
7767     CURSOR c1 IS
7768       SELECT   p_oipl_id
7769               ,'Y'
7770               ,clf.comp_lvl_uom
7771               ,clf.comp_src_cd
7772               ,clf.comp_lvl_det_cd
7773               ,clf.comp_lvl_det_rl
7774               ,clf.rndg_cd
7775               ,clf.rndg_rl
7776               ,clf.mn_comp_val
7777               ,clf.mx_comp_val
7778               ,clf.bnfts_bal_id
7779               ,clf.defined_balance_id
7780               ,clf.sttd_sal_prdcty_cd
7781               ,clf.comp_lvl_fctr_id
7782               ,clf.comp_calc_rl
7783       FROM     ben_comp_lvl_fctr clf
7784               ,ben_comp_lvl_rt_f clr
7785               ,ben_vrbl_rt_prfl_f vpf
7786               ,ben_acty_vrbl_rt_f avr
7787               ,ben_acty_base_rt_f abr
7788       WHERE    ( abr.oipl_id = p_oipl_id
7789       --
7790       --START Option level Rates Enhancements
7791                or ( abr.opt_id = l_opt_id and
7792                      not exists (select null from ben_acty_base_rt_f abr1
7793                      where abr1.oipl_id = p_oipl_id )))
7794       --END Option level Rates Enhancements
7795       --
7796       AND      p_effective_date BETWEEN abr.effective_start_date
7797                    AND abr.effective_end_date
7798       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
7799       AND      p_effective_date BETWEEN avr.effective_start_date
7800                    AND avr.effective_end_date
7801       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
7802       AND      p_effective_date BETWEEN vpf.effective_start_date
7803                    AND vpf.effective_end_date
7804       AND      vpf.vrbl_rt_prfl_id = clr.vrbl_rt_prfl_id
7805       AND      p_effective_date BETWEEN clr.effective_start_date
7806                    AND clr.effective_end_date
7807       AND      clr.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
7808       AND      (
7809                     (
7810                           p_new_val IS NOT NULL
7811                       AND p_old_val IS NOT NULL
7812                       AND p_new_val >= NVL(clf.mn_comp_val
7813                                         ,p_new_val)
7814                       AND p_new_val <  decode(nvl(clf.mx_comp_val,p_new_val) ,
7818                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
7815                                     trunc(nvl(clf.mx_comp_val,p_new_val))
7816                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
7817                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
7819                                      -- ceil( NVL(clf.mx_comp_val
7820                                      --   ,p_new_val) + 0.001 ))
7821                  OR (
7822                           p_new_val IS NOT NULL
7823                       AND p_old_val IS NOT NULL
7824                       AND (
7825                                p_new_val < NVL(clf.mn_comp_val
7826                                             ,p_new_val)
7827                             OR p_new_val >=  decode(nvl(clf.mx_comp_val,p_new_val) ,
7828                                     trunc(nvl(clf.mx_comp_val,p_new_val))
7829                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
7830                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
7831                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
7832                                           -- ceil( NVL(clf.mx_comp_val
7833                                           --  ,p_new_val))+ 0.001 )
7834                       AND p_old_val >= NVL(clf.mn_comp_val
7835                                         ,p_old_val)
7836                       AND p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
7837                                     trunc(nvl(clf.mx_comp_val,p_old_val))
7838                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
7839                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
7840                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )  )
7841                                           -- ceil( NVL(clf.mx_comp_val
7842                                           -- ,p_old_val)) + 0.001 )
7843                  OR (    p_new_val IS NULL
7844                      AND p_old_val IS NULL));
7845     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
7846     --UNION ALL
7847     CURSOR c2 IS
7848     SELECT   p_oipl_id
7849               ,'Y'
7850               ,clf.comp_lvl_uom
7851               ,clf.comp_src_cd
7852               ,clf.comp_lvl_det_cd
7853               ,clf.comp_lvl_det_rl
7854               ,clf.rndg_cd
7855               ,clf.rndg_rl
7856               ,clf.mn_comp_val
7857               ,clf.mx_comp_val
7858               ,clf.bnfts_bal_id
7859               ,clf.defined_balance_id
7860               ,clf.sttd_sal_prdcty_cd
7861               ,clf.comp_lvl_fctr_id
7862               ,clf.comp_calc_rl
7863       FROM     ben_comp_lvl_fctr clf
7864               --,ben_comp_lvl_rt_f clr
7865               ,ben_elig_comp_lvl_prte_f ecl
7866               ,ben_eligy_prfl_f elp
7867               ,ben_vrbl_rt_elig_prfl_f vep
7868               ,ben_vrbl_rt_prfl_f vpf
7869               ,ben_acty_vrbl_rt_f avr
7870               ,ben_acty_base_rt_f abr
7871       WHERE    ( abr.oipl_id = p_oipl_id
7872       --
7873       --START Option level Rates Enhancements
7874                or ( abr.opt_id = l_opt_id and
7875                      not exists (select null from ben_acty_base_rt_f abr1
7876                      where abr1.oipl_id = p_oipl_id )))
7877       --END Option level Rates Enhancements
7878       --
7879       AND      p_effective_date BETWEEN abr.effective_start_date
7880                    AND abr.effective_end_date
7881       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
7882       AND      p_effective_date BETWEEN avr.effective_start_date
7883                    AND avr.effective_end_date
7884       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
7885       AND      p_effective_date BETWEEN vpf.effective_start_date
7886                    AND vpf.effective_end_date
7887 --      AND      vpf.vrbl_rt_prfl_id = ecl.vrbl_rt_prfl_id
7888       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
7889       AND      p_effective_date BETWEEN vep.effective_start_date
7890                    AND vep.effective_end_date
7891       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
7892       AND      p_effective_date BETWEEN elp.effective_start_date
7893                    AND elp.effective_end_date
7894       AND      ecl.eligy_prfl_id = elp.eligy_prfl_id
7895       AND      p_effective_date BETWEEN ecl.effective_start_date
7896                    AND ecl.effective_end_date
7897       AND      ecl.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
7898       AND      (
7899                     (
7900                           p_new_val IS NOT NULL
7901                       AND p_old_val IS NOT NULL
7902                       AND p_new_val >= NVL(clf.mn_comp_val
7903                                         ,p_new_val)
7904                       AND p_new_val <  decode(nvl(clf.mx_comp_val,p_new_val) ,
7905                                     trunc(nvl(clf.mx_comp_val,p_new_val))
7906                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
7907                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
7908                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
7909                                      -- ceil( NVL(clf.mx_comp_val
7910                                      --   ,p_new_val) + 0.001 ))
7911                  OR (
7912                           p_new_val IS NOT NULL
7913                       AND p_old_val IS NOT NULL
7914                       AND (
7915                                p_new_val < NVL(clf.mn_comp_val
7919                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
7916                                             ,p_new_val)
7917                             OR p_new_val >=  decode(nvl(clf.mx_comp_val,p_new_val) ,
7918                                     trunc(nvl(clf.mx_comp_val,p_new_val))
7920                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
7921                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
7922                                           -- ceil( NVL(clf.mx_comp_val
7923                                           --  ,p_new_val))+ 0.001 )
7924                       AND p_old_val >= NVL(clf.mn_comp_val
7925                                         ,p_old_val)
7926                       AND p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
7927                                     trunc(nvl(clf.mx_comp_val,p_old_val))
7928                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
7929                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
7930                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )  )
7931                                           -- ceil( NVL(clf.mx_comp_val
7932                                           -- ,p_old_val)) + 0.001 )
7933                  OR (    p_new_val IS NULL
7934                      AND p_old_val IS NULL));
7935     --
7936     --
7937     l_index          PLS_INTEGER;
7938     l_not_hash_found BOOLEAN;
7939     l_c2notfound       BOOLEAN;
7940   --
7941   BEGIN
7942     --
7943     -- hr_utility.set_location ('Entering '||l_package,10);
7944     --
7945     -- Steps to do process
7946     --
7947     -- 1) Try and get value from cache
7948     -- 2) If can get from cache then copy to output record
7949     -- 3) If can't get from cache do db hit and then
7950     --    copy to cache record and then copy to output record.
7951     --
7952     -- Get hashed index value
7953     --
7954     l_index  := MOD(p_oipl_id
7955                  ,g_hash_key);
7956     --
7957     IF NOT g_cache_oipl_clf_rt_rec.EXISTS(l_index) THEN
7958       --
7959       -- Lets store the hash value in this index
7960       --
7961       RAISE NO_DATA_FOUND;
7962     --
7963     ELSE
7964       --
7965       -- If it does exist make sure its the right one
7966       --
7967       IF g_cache_oipl_clf_rt_rec(l_index).id <> p_oipl_id THEN
7968         --
7969         -- Loop through the hash using the jump routine to check further
7970         -- indexes
7971         --
7972         l_not_hash_found  := FALSE;
7973         --
7974         WHILE NOT l_not_hash_found LOOP
7975           --
7976           l_index  := l_index + g_hash_jump;
7977           --
7978           -- Check if the hash index exists, if not we can use it
7979           --
7980           IF NOT g_cache_oipl_clf_rt_rec.EXISTS(l_index) THEN
7981             --
7982             -- Lets store the hash value in the index
7983             --
7984             RAISE NO_DATA_FOUND;
7985           --
7986           ELSE
7987             --
7988             -- Make sure the index is the correct one
7989             --
7990             IF g_cache_oipl_clf_rt_rec(l_index).id = p_oipl_id THEN
7991               --
7992               -- We have a match so the hashed value  has been stored before
7993               --
7994               l_not_hash_found  := TRUE;
7995             --
7996             END IF;
7997           --
7998           END IF;
7999         --
8000         END LOOP;
8001       --
8002       END IF;
8003     --
8004     END IF;
8005     --
8006     -- If p_old_val and p_new_val is set this means we are trying to retrieve
8007     -- the correct rate for the calculated value.
8008     -- Previously we just cached the first rate we
8009     -- found since we needed the determination code, the correct age,los code,etc
8010     -- By killing the cache and forcing the value to be removed we cache the
8011     -- correct rate profile for the case we need.
8012     --
8013     IF     p_old_val IS NOT NULL
8014        AND p_new_val IS NOT NULL THEN
8015       --
8016       RAISE NO_DATA_FOUND;
8017     --
8018     END IF;
8019     --
8020     p_rec    := g_cache_oipl_clf_rt_rec(l_index);
8021   --
8022   -- hr_utility.set_location ('Leaving '||l_package,10);
8023   --
8024   EXCEPTION
8025     --
8026     WHEN NO_DATA_FOUND THEN
8027       --
8028       -- The record has not been cached yet so lets cache it
8029       -- Option level rates enhancement
8030       l_opt_id := get_opt_id(p_oipl_id,p_effective_date);
8031       --
8032       OPEN c1;
8033       --
8034       FETCH c1 INTO g_cache_oipl_clf_rt_rec(l_index);
8035       -- PERFNEW
8036       IF c1%NOTFOUND THEN
8037          --
8038          l_c2notfound := false;
8039          OPEN c2;
8040          FETCH c2 INTO g_cache_oipl_clf_rt_rec(l_index);
8041          IF c2%NOTFOUND THEN
8042             --
8043             l_c2notfound := true;
8044             --
8045          END IF;
8046          CLOSE c2;
8047          --
8048       END IF;
8049       -- PERFNEW
8050       IF     p_old_val IS NULL
8051          AND p_new_val IS NULL THEN
8052         --
8053         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
8054           --
8058           end if;
8055           if NOT g_cache_oipl_clf_rt_rec.EXISTS(l_index) then
8056             g_cache_oipl_clf_rt_rec(l_index).id     := p_oipl_id;
8057             g_cache_oipl_clf_rt_rec(l_index).exist  := 'N';
8059         --
8060         END IF;
8061       --
8062       END IF;
8063       --
8064       p_rec  := g_cache_oipl_clf_rt_rec(l_index);
8065       --
8066       CLOSE c1;
8067   --
8068   END get_comp_oipl_rate;
8069 --
8070   PROCEDURE get_comp_plip_rate(
8071     p_plip_id           IN            NUMBER
8072    ,p_old_val           IN            NUMBER DEFAULT NULL
8073    ,p_new_val           IN            NUMBER DEFAULT NULL
8074    ,p_business_group_id IN            NUMBER
8075    ,p_effective_date    IN            DATE
8076    ,p_rec               OUT NOCOPY    g_cache_clf_rec_obj) IS
8077     --
8078     l_package        VARCHAR2(80) := g_package || '.get_comp_plip_rate';
8079     l_old_val_1 NUMBER := p_old_val + 1;
8080     l_new_val_1 NUMBER := p_new_val + 1;
8081     --
8082     -- Define Cursor
8083     --
8084     CURSOR c1 IS
8085       SELECT   p_plip_id
8086               ,'Y'
8087               ,clf.comp_lvl_uom
8088               ,clf.comp_src_cd
8089               ,clf.comp_lvl_det_cd
8090               ,clf.comp_lvl_det_rl
8091               ,clf.rndg_cd
8092               ,clf.rndg_rl
8093               ,clf.mn_comp_val
8094               ,clf.mx_comp_val
8095               ,clf.bnfts_bal_id
8096               ,clf.defined_balance_id
8097               ,clf.sttd_sal_prdcty_cd
8098               ,clf.comp_lvl_fctr_id
8099               ,clf.comp_calc_rl
8100       FROM     ben_comp_lvl_fctr clf
8101               ,ben_comp_lvl_rt_f clr
8102               ,ben_vrbl_rt_prfl_f vpf
8103               ,ben_acty_vrbl_rt_f avr
8104               ,ben_acty_base_rt_f abr
8105       WHERE    abr.plip_id = p_plip_id
8106       AND      p_effective_date BETWEEN abr.effective_start_date
8107                    AND abr.effective_end_date
8108       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
8109       AND      p_effective_date BETWEEN avr.effective_start_date
8110                    AND avr.effective_end_date
8111       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
8112       AND      p_effective_date BETWEEN vpf.effective_start_date
8113                    AND vpf.effective_end_date
8114       AND      vpf.vrbl_rt_prfl_id = clr.vrbl_rt_prfl_id
8115       AND      p_effective_date BETWEEN clr.effective_start_date
8116                    AND clr.effective_end_date
8117       AND      clr.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
8118       AND      (
8119                     (
8120                           p_new_val IS NOT NULL
8121                       AND p_old_val IS NOT NULL
8122                       AND p_new_val >= NVL(clf.mn_comp_val
8123                                         ,p_new_val)
8124                       AND p_new_val < decode(nvl(clf.mx_comp_val,p_new_val) ,
8125                                     trunc(nvl(clf.mx_comp_val,p_new_val))
8126                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
8127                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
8128                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
8129                                    -- ceil( NVL(clf.mx_comp_val
8130                                    --    ,p_new_val) + 0.001))
8131                  OR (
8132                           p_new_val IS NOT NULL
8133                       AND p_old_val IS NOT NULL
8134                       AND (
8135                                p_new_val < NVL(clf.mn_comp_val
8136                                             ,p_new_val)
8137                             OR p_new_val >= decode(nvl(clf.mx_comp_val,p_new_val) ,
8138                                     trunc(nvl(clf.mx_comp_val,p_new_val))
8139                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
8140                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
8141                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
8142                                           -- ceil( NVL(clf.mx_comp_val
8143                                           -- ,p_new_val))  + 0.001)
8144                       AND p_old_val >= NVL(clf.mn_comp_val
8145                                         ,p_old_val)
8146                       AND p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
8147                                     trunc(nvl(clf.mx_comp_val,p_old_val))
8148                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
8149                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
8150                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )  )
8151                                    --ceil( NVL(clf.mx_comp_val
8152                                    --    ,p_old_val)) + 0.001)
8153                  OR (    p_new_val IS NULL
8154                      AND p_old_val IS NULL));
8155     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
8156     --UNION ALL
8157     CURSOR c2 IS
8158       SELECT   p_plip_id
8159               ,'Y'
8160               ,clf.comp_lvl_uom
8161               ,clf.comp_src_cd
8162               ,clf.comp_lvl_det_cd
8163               ,clf.comp_lvl_det_rl
8164               ,clf.rndg_cd
8165               ,clf.rndg_rl
8166               ,clf.mn_comp_val
8170               ,clf.sttd_sal_prdcty_cd
8167               ,clf.mx_comp_val
8168               ,clf.bnfts_bal_id
8169               ,clf.defined_balance_id
8171               ,clf.comp_lvl_fctr_id
8172               ,clf.comp_calc_rl
8173       FROM     ben_comp_lvl_fctr clf
8174               --,ben_comp_lvl_rt_f clr
8175               ,ben_elig_comp_lvl_prte_f ecl
8176               ,ben_eligy_prfl_f elp
8177               ,ben_vrbl_rt_elig_prfl_f vep
8178               ,ben_vrbl_rt_prfl_f vpf
8179               ,ben_acty_vrbl_rt_f avr
8180               ,ben_acty_base_rt_f abr
8181       WHERE    abr.plip_id = p_plip_id
8182       AND      p_effective_date BETWEEN abr.effective_start_date
8183                    AND abr.effective_end_date
8184       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
8185       AND      p_effective_date BETWEEN avr.effective_start_date
8186                    AND avr.effective_end_date
8187       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
8188       AND      p_effective_date BETWEEN vpf.effective_start_date
8189                    AND vpf.effective_end_date
8190 --      AND      vpf.vrbl_rt_prfl_id = ecl.vrbl_rt_prfl_id
8191       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
8192       AND      p_effective_date BETWEEN vep.effective_start_date
8193                    AND vep.effective_end_date
8194       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
8195       AND      p_effective_date BETWEEN elp.effective_start_date
8196                    AND elp.effective_end_date
8197       AND      ecl.eligy_prfl_id = elp.eligy_prfl_id
8198       AND      p_effective_date BETWEEN ecl.effective_start_date
8199                    AND ecl.effective_end_date
8200       AND      ecl.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
8201       AND      (
8202                     (
8203                           p_new_val IS NOT NULL
8204                       AND p_old_val IS NOT NULL
8205                       AND p_new_val >= NVL(clf.mn_comp_val
8206                                         ,p_new_val)
8207                       AND p_new_val < decode(nvl(clf.mx_comp_val,p_new_val) ,
8208                                     trunc(nvl(clf.mx_comp_val,p_new_val))
8209                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
8210                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
8211                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
8212                                    -- ceil( NVL(clf.mx_comp_val
8213                                    --    ,p_new_val) + 0.001))
8214                  OR (
8215                           p_new_val IS NOT NULL
8216                       AND p_old_val IS NOT NULL
8217                       AND (
8218                                p_new_val < NVL(clf.mn_comp_val
8219                                             ,p_new_val)
8220                             OR p_new_val >= decode(nvl(clf.mx_comp_val,p_new_val) ,
8221                                     trunc(nvl(clf.mx_comp_val,p_new_val))
8222                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
8223                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
8224                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
8225                                           -- ceil( NVL(clf.mx_comp_val
8226                                           -- ,p_new_val))  + 0.001)
8227                       AND p_old_val >= NVL(clf.mn_comp_val
8228                                         ,p_old_val)
8229                       AND p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
8230                                     trunc(nvl(clf.mx_comp_val,p_old_val))
8231                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
8232                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
8233                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )  )
8234                                    --ceil( NVL(clf.mx_comp_val
8235                                    --    ,p_old_val)) + 0.001)
8236                  OR (    p_new_val IS NULL
8237                      AND p_old_val IS NULL));
8238     --
8239     --
8240     l_index          PLS_INTEGER;
8241     l_not_hash_found BOOLEAN;
8242     l_c2notfound       BOOLEAN;
8243   --
8244   BEGIN
8245     --
8246     -- hr_utility.set_location ('Entering '||l_package,10);
8247     --
8248     -- Steps to do process
8249     --
8250     -- 1) Try and get value from cache
8251     -- 2) If can get from cache then copy to output record
8252     -- 3) If can't get from cache do db hit and then
8253     --    copy to cache record and then copy to output record.
8254     --
8255     -- Get hashed index value
8256     --
8257     l_index  := MOD(p_plip_id
8258                  ,g_hash_key);
8259     --
8260     IF NOT g_cache_plip_clf_rt_rec.EXISTS(l_index) THEN
8261       --
8262       -- Lets store the hash value in this index
8263       --
8264       RAISE NO_DATA_FOUND;
8265     --
8266     ELSE
8267       --
8268       -- If it does exist make sure its the right one
8269       --
8270       IF g_cache_plip_clf_rt_rec(l_index).id <> p_plip_id THEN
8271         --
8272         -- Loop through the hash using the jump routine to check further
8273         -- indexes
8274         --
8275         l_not_hash_found  := FALSE;
8276         --
8277         WHILE NOT l_not_hash_found LOOP
8278           --
8279           l_index  := l_index + g_hash_jump;
8283           IF NOT g_cache_plip_clf_rt_rec.EXISTS(l_index) THEN
8280           --
8281           -- Check if the hash index exists, if not we can use it
8282           --
8284             --
8285             -- Lets store the hash value in the index
8286             --
8287             RAISE NO_DATA_FOUND;
8288           --
8289           ELSE
8290             --
8291             -- Make sure the index is the correct one
8292             --
8293             IF g_cache_plip_clf_rt_rec(l_index).id = p_plip_id THEN
8294               --
8295               -- We have a match so the hashed value  has been stored before
8296               --
8297               l_not_hash_found  := TRUE;
8298             --
8299             END IF;
8300           --
8301           END IF;
8302         --
8303         END LOOP;
8304       --
8305       END IF;
8306     --
8307     END IF;
8308     --
8309     -- If p_old_val and p_new_val is set this means we are trying to retrieve
8310     -- the correct rate for the calculated value.
8311     -- Previously we just cached the first rate we
8312     -- found since we needed the determination code, the correct age,los code,etc
8313     -- By killing the cache and forcing the value to be removed we cache the
8314     -- correct rate profile for the case we need.
8315     --
8316     IF     p_old_val IS NOT NULL
8317        AND p_new_val IS NOT NULL THEN
8318       --
8319       RAISE NO_DATA_FOUND;
8320     --
8321     END IF;
8322     --
8323     p_rec    := g_cache_plip_clf_rt_rec(l_index);
8324   --
8325   -- hr_utility.set_location ('Leaving '||l_package,10);
8326   --
8327   EXCEPTION
8328     --
8329     WHEN NO_DATA_FOUND THEN
8330       --
8331       -- The record has not been cached yet so lets cache it
8332       --
8333       OPEN c1;
8334       --
8335       FETCH c1 INTO g_cache_plip_clf_rt_rec(l_index);
8336       -- PERFNEW
8337       IF c1%NOTFOUND THEN
8338          --
8339          l_c2notfound := false;
8340          OPEN c2;
8341          FETCH c2 INTO g_cache_plip_clf_rt_rec(l_index);
8342          IF c2%NOTFOUND THEN
8343             --
8344             l_c2notfound := true;
8345             --
8346          END IF;
8347          CLOSE c2;
8348          --
8349       END IF;
8350       -- PERFNEW
8351       IF     p_old_val IS NULL
8352          AND p_new_val IS NULL THEN
8353         --
8354         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
8355           --
8356           if NOT g_cache_plip_clf_rt_rec.EXISTS(l_index) then
8357             g_cache_plip_clf_rt_rec(l_index).id     := p_plip_id;
8358             g_cache_plip_clf_rt_rec(l_index).exist  := 'N';
8359           end if;
8360         --
8361         END IF;
8362       --
8363       END IF;
8364       --
8365       p_rec  := g_cache_plip_clf_rt_rec(l_index);
8366       --
8367       CLOSE c1;
8368   --
8369   END get_comp_plip_rate;
8370 --
8371   PROCEDURE get_comp_ptip_rate(
8372     p_ptip_id           IN            NUMBER
8373    ,p_old_val           IN            NUMBER DEFAULT NULL
8374    ,p_new_val           IN            NUMBER DEFAULT NULL
8375    ,p_business_group_id IN            NUMBER
8376    ,p_effective_date    IN            DATE
8377    ,p_rec               OUT NOCOPY    g_cache_clf_rec_obj) IS
8378     --
8379     l_package        VARCHAR2(80) := g_package || '.get_comp_ptip_rate';
8380     l_old_val_1 NUMBER := p_old_val + 1;
8381     l_new_val_1 NUMBER := p_new_val + 1;
8382     --
8383     -- Define Cursor
8384     --
8385     CURSOR c1 IS
8386       SELECT   p_ptip_id
8387               ,'Y'
8388               ,clf.comp_lvl_uom
8389               ,clf.comp_src_cd
8390               ,clf.comp_lvl_det_cd
8391               ,clf.comp_lvl_det_rl
8392               ,clf.rndg_cd
8393               ,clf.rndg_rl
8394               ,clf.mn_comp_val
8395               ,clf.mx_comp_val
8396               ,clf.bnfts_bal_id
8397               ,clf.defined_balance_id
8398               ,clf.sttd_sal_prdcty_cd
8399               ,clf.comp_lvl_fctr_id
8400               ,clf.comp_calc_rl
8401       FROM     ben_comp_lvl_fctr clf
8402               ,ben_comp_lvl_rt_f clr
8403               ,ben_vrbl_rt_prfl_f vpf
8404               ,ben_acty_vrbl_rt_f avr
8405               ,ben_acty_base_rt_f abr
8406       WHERE    abr.ptip_id = p_ptip_id
8407       AND      p_effective_date BETWEEN abr.effective_start_date
8408                    AND abr.effective_end_date
8409       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
8410       AND      p_effective_date BETWEEN avr.effective_start_date
8411                    AND avr.effective_end_date
8412       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
8413       AND      p_effective_date BETWEEN vpf.effective_start_date
8414                    AND vpf.effective_end_date
8415       AND      vpf.vrbl_rt_prfl_id = clr.vrbl_rt_prfl_id
8416       AND      p_effective_date BETWEEN clr.effective_start_date
8417                    AND clr.effective_end_date
8418       AND      clr.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
8419       AND      (
8420                     (
8421                           p_new_val IS NOT NULL
8422                       AND p_old_val IS NOT NULL
8426                                     trunc(nvl(clf.mx_comp_val,p_new_val))
8423                       AND p_new_val >= NVL(clf.mn_comp_val
8424                                         ,p_new_val)
8425                       AND p_new_val <  decode(nvl(clf.mx_comp_val,p_new_val) ,
8427                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
8428                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
8429                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
8430                                     -- ceil( NVL(clf.mx_comp_val
8431                                     --   ,p_new_val) + 0.001 ))
8432                  OR (
8433                           p_new_val IS NOT NULL
8434                       AND p_old_val IS NOT NULL
8435                       AND (
8436                                p_new_val < NVL(clf.mn_comp_val
8437                                             ,p_new_val)
8438                             OR p_new_val >=  decode(nvl(clf.mx_comp_val,p_new_val) ,
8439                                     trunc(nvl(clf.mx_comp_val,p_new_val))
8440                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
8441                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
8442                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
8443                                        --   ceil( NVL(clf.mx_comp_val
8444                                        --    ,p_new_val)) + 0.001 )
8445                       AND p_old_val >= NVL(clf.mn_comp_val
8446                                         ,p_old_val)
8447                       AND p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
8448                                     trunc(nvl(clf.mx_comp_val,p_old_val))
8449                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
8450                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
8451                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )  )
8452                                       -- ceil( NVL(clf.mx_comp_val
8453                                       --  ,p_old_val)) + 0.001 )
8454                  OR (    p_new_val IS NULL
8455                      AND p_old_val IS NULL));
8456     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
8457     --UNION ALL
8458     CURSOR c2 IS
8459     SELECT   p_ptip_id
8460               ,'Y'
8461               ,clf.comp_lvl_uom
8462               ,clf.comp_src_cd
8463               ,clf.comp_lvl_det_cd
8464               ,clf.comp_lvl_det_rl
8465               ,clf.rndg_cd
8466               ,clf.rndg_rl
8467               ,clf.mn_comp_val
8468               ,clf.mx_comp_val
8469               ,clf.bnfts_bal_id
8470               ,clf.defined_balance_id
8471               ,clf.sttd_sal_prdcty_cd
8472               ,clf.comp_lvl_fctr_id
8473               ,clf.comp_calc_rl
8474       FROM     ben_comp_lvl_fctr clf
8475               --,ben_comp_lvl_rt_f clr
8476               ,ben_elig_comp_lvl_prte_f ecl
8477               ,ben_eligy_prfl_f elp
8478               ,ben_vrbl_rt_elig_prfl_f vep
8479               ,ben_vrbl_rt_prfl_f vpf
8480               ,ben_acty_vrbl_rt_f avr
8481               ,ben_acty_base_rt_f abr
8482       WHERE    abr.ptip_id = p_ptip_id
8483       AND      p_effective_date BETWEEN abr.effective_start_date
8484                    AND abr.effective_end_date
8485       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
8486       AND      p_effective_date BETWEEN avr.effective_start_date
8487                    AND avr.effective_end_date
8488       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
8489       AND      p_effective_date BETWEEN vpf.effective_start_date
8490                    AND vpf.effective_end_date
8491 --      AND      vpf.vrbl_rt_prfl_id = ecl.vrbl_rt_prfl_id
8492       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
8493       AND      p_effective_date BETWEEN vep.effective_start_date
8494                    AND vep.effective_end_date
8495       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
8496       AND      p_effective_date BETWEEN elp.effective_start_date
8497                    AND elp.effective_end_date
8498       AND      ecl.eligy_prfl_id = elp.eligy_prfl_id
8499       AND      p_effective_date BETWEEN ecl.effective_start_date
8500                    AND ecl.effective_end_date
8501       AND      ecl.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
8502       AND      (
8503                     (
8504                           p_new_val IS NOT NULL
8505                       AND p_old_val IS NOT NULL
8506                       AND p_new_val >= NVL(clf.mn_comp_val
8507                                         ,p_new_val)
8508                       AND p_new_val <  decode(nvl(clf.mx_comp_val,p_new_val) ,
8509                                     trunc(nvl(clf.mx_comp_val,p_new_val))
8510                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
8511                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
8512                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
8513                                     -- ceil( NVL(clf.mx_comp_val
8514                                     --   ,p_new_val) + 0.001 ))
8515                  OR (
8516                           p_new_val IS NOT NULL
8517                       AND p_old_val IS NOT NULL
8518                       AND (
8519                                p_new_val < NVL(clf.mn_comp_val
8520                                             ,p_new_val)
8524                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
8521                             OR p_new_val >=  decode(nvl(clf.mx_comp_val,p_new_val) ,
8522                                     trunc(nvl(clf.mx_comp_val,p_new_val))
8523                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
8525                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
8526                                        --   ceil( NVL(clf.mx_comp_val
8527                                        --    ,p_new_val)) + 0.001 )
8528                       AND p_old_val >= NVL(clf.mn_comp_val
8529                                         ,p_old_val)
8530                       AND p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
8531                                     trunc(nvl(clf.mx_comp_val,p_old_val))
8532                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
8533                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
8534                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )  )
8535                                       -- ceil( NVL(clf.mx_comp_val
8536                                       --  ,p_old_val)) + 0.001 )
8537                  OR (    p_new_val IS NULL
8538                      AND p_old_val IS NULL));
8539     --
8540     --
8541     l_index          PLS_INTEGER;
8542     l_not_hash_found BOOLEAN;
8543     l_c2notfound       BOOLEAN;
8544   --
8545   BEGIN
8546     --
8547     -- hr_utility.set_location ('Entering '||l_package,10);
8548     --
8549     -- Steps to do process
8550     --
8551     -- 1) Try and get value from cache
8552     -- 2) If can get from cache then copy to output record
8553     -- 3) If can't get from cache do db hit and then
8554     --    copy to cache record and then copy to output record.
8555     --
8556     -- Get hashed index value
8557     --
8558     l_index  := MOD(p_ptip_id
8559                  ,g_hash_key);
8560     --
8561     IF NOT g_cache_ptip_clf_rt_rec.EXISTS(l_index) THEN
8562       --
8563       -- Lets store the hash value in this index
8564       --
8565       RAISE NO_DATA_FOUND;
8566     --
8567     ELSE
8568       --
8569       -- If it does exist make sure its the right one
8570       --
8571       IF g_cache_ptip_clf_rt_rec(l_index).id <> p_ptip_id THEN
8572         --
8573         -- Loop through the hash using the jump routine to check further
8574         -- indexes
8575         --
8576         l_not_hash_found  := FALSE;
8577         --
8578         WHILE NOT l_not_hash_found LOOP
8579           --
8580           l_index  := l_index + g_hash_jump;
8581           --
8582           -- Check if the hash index exists, if not we can use it
8583           --
8584           IF NOT g_cache_ptip_clf_rt_rec.EXISTS(l_index) THEN
8585             --
8586             -- Lets store the hash value in the index
8587             --
8588             RAISE NO_DATA_FOUND;
8589           --
8590           ELSE
8591             --
8592             -- Make sure the index is the correct one
8593             --
8594             IF g_cache_ptip_clf_rt_rec(l_index).id = p_ptip_id THEN
8595               --
8596               -- We have a match so the hashed value  has been stored before
8597               --
8598               l_not_hash_found  := TRUE;
8599             --
8600             END IF;
8601           --
8602           END IF;
8603         --
8604         END LOOP;
8605       --
8606       END IF;
8607     --
8608     END IF;
8609     --
8610     -- If p_old_val and p_new_val is set this means we are trying to retrieve
8611     -- the correct rate for the calculated value.
8612     -- Previously we just cached the first rate we
8613     -- found since we needed the determination code, the correct age,los code,etc
8614     -- By killing the cache and forcing the value to be removed we cache the
8615     -- correct rate profile for the case we need.
8616     --
8617     IF     p_old_val IS NOT NULL
8618        AND p_new_val IS NOT NULL THEN
8619       --
8620       RAISE NO_DATA_FOUND;
8621     --
8622     END IF;
8623     --
8624     p_rec    := g_cache_ptip_clf_rt_rec(l_index);
8625   --
8626   -- hr_utility.set_location ('Leaving '||l_package,10);
8627   --
8628   EXCEPTION
8629     --
8630     WHEN NO_DATA_FOUND THEN
8631       --
8632       -- The record has not been cached yet so lets cache it
8633       --
8634       OPEN c1;
8635       --
8636       FETCH c1 INTO g_cache_ptip_clf_rt_rec(l_index);
8637       -- PERFNEW
8638       IF c1%NOTFOUND THEN
8639          --
8640          l_c2notfound := false;
8641          OPEN c2;
8642          FETCH c2 INTO g_cache_ptip_clf_rt_rec(l_index);
8643          IF c2%NOTFOUND THEN
8644             --
8645             l_c2notfound := true;
8646             --
8647          END IF;
8648          CLOSE c2;
8649          --
8650       END IF;
8651       -- PERFNEW
8652       IF     p_old_val IS NULL
8653          AND p_new_val IS NULL THEN
8654         --
8655         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
8656           --
8657           if NOT g_cache_ptip_clf_rt_rec.EXISTS(l_index) then
8658             g_cache_ptip_clf_rt_rec(l_index).id     := p_ptip_id;
8659             g_cache_ptip_clf_rt_rec(l_index).exist  := 'N';
8660           end if;
8661         --
8665       --
8662         END IF;
8663       --
8664       END IF;
8666       p_rec  := g_cache_ptip_clf_rt_rec(l_index);
8667       --
8668       CLOSE c1;
8669   --
8670   END get_comp_ptip_rate;
8671 --
8672   PROCEDURE get_comp_oiplip_rate(
8673     p_oiplip_id         IN            NUMBER
8674    ,p_old_val           IN            NUMBER DEFAULT NULL
8675    ,p_new_val           IN            NUMBER DEFAULT NULL
8676    ,p_business_group_id IN            NUMBER
8677    ,p_effective_date    IN            DATE
8678    ,p_rec               OUT NOCOPY    g_cache_clf_rec_obj) IS
8679     --
8680     l_package        VARCHAR2(80) := g_package || '.get_comp_oiplip_rate';
8681     l_old_val_1 NUMBER := p_old_val + 1;
8682     l_new_val_1 NUMBER := p_new_val + 1;
8683     --
8684     -- Define Cursor
8685     --
8686     CURSOR c1 IS
8687       SELECT   p_oiplip_id
8688               ,'Y'
8689               ,clf.comp_lvl_uom
8690               ,clf.comp_src_cd
8691               ,clf.comp_lvl_det_cd
8692               ,clf.comp_lvl_det_rl
8693               ,clf.rndg_cd
8694               ,clf.rndg_rl
8695               ,clf.mn_comp_val
8696               ,clf.mx_comp_val
8697               ,clf.bnfts_bal_id
8698               ,clf.defined_balance_id
8699               ,clf.sttd_sal_prdcty_cd
8700               ,clf.comp_lvl_fctr_id
8701               ,clf.comp_calc_rl
8702       FROM     ben_comp_lvl_fctr clf
8703               ,ben_comp_lvl_rt_f clr
8704               ,ben_vrbl_rt_prfl_f vpf
8705               ,ben_acty_vrbl_rt_f avr
8706               ,ben_acty_base_rt_f abr
8707       WHERE    abr.oiplip_id = p_oiplip_id
8708       AND      p_effective_date BETWEEN abr.effective_start_date
8709                    AND abr.effective_end_date
8710       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
8711       AND      p_effective_date BETWEEN avr.effective_start_date
8712                    AND avr.effective_end_date
8713       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
8714       AND      p_effective_date BETWEEN vpf.effective_start_date
8715                    AND vpf.effective_end_date
8716       AND      vpf.vrbl_rt_prfl_id = clr.vrbl_rt_prfl_id
8717       AND      p_effective_date BETWEEN clr.effective_start_date
8718                    AND clr.effective_end_date
8719       AND      clr.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
8720       AND      (
8721                     (
8722                           p_new_val IS NOT NULL
8723                       AND p_old_val IS NOT NULL
8724                       AND p_new_val >= NVL(clf.mn_comp_val
8725                                         ,p_new_val)
8726                       AND p_new_val <  decode(nvl(clf.mx_comp_val,p_new_val) ,
8727                                     trunc(nvl(clf.mx_comp_val,p_new_val))
8728                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
8729                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
8730                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
8731                                   -- ceil( NVL(clf.mx_comp_val
8732                                   --     ,p_new_val) + 0.001 ))
8733                  OR (
8734                           p_new_val IS NOT NULL
8735                       AND p_old_val IS NOT NULL
8736                       AND (
8737                                p_new_val < NVL(clf.mn_comp_val
8738                                             ,p_new_val)
8739                             OR p_new_val >=  decode(nvl(clf.mx_comp_val,p_new_val) ,
8740                                     trunc(nvl(clf.mx_comp_val,p_new_val))
8741                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
8742                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
8743                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
8744                                        --   ceil( NVL(clf.mx_comp_val
8745                                        --    , p_new_val))+ 0.001 )
8746                       AND p_old_val >= NVL(clf.mn_comp_val
8747                                         ,p_old_val)
8748                       AND p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
8749                                     trunc(nvl(clf.mx_comp_val,p_old_val))
8750                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
8751                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
8752                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )  )
8753                                        -- ceil( NVL(clf.mx_comp_val
8754                                        -- ,p_old_val)) + 0.001 )
8755                  OR (    p_new_val IS NULL
8756                      AND p_old_val IS NULL));
8757     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
8758     --UNION ALL
8759     CURSOR c2 IS
8760       SELECT   p_oiplip_id
8761               ,'Y'
8762               ,clf.comp_lvl_uom
8763               ,clf.comp_src_cd
8764               ,clf.comp_lvl_det_cd
8765               ,clf.comp_lvl_det_rl
8766               ,clf.rndg_cd
8767               ,clf.rndg_rl
8768               ,clf.mn_comp_val
8769               ,clf.mx_comp_val
8770               ,clf.bnfts_bal_id
8771               ,clf.defined_balance_id
8772               ,clf.sttd_sal_prdcty_cd
8776               --,ben_comp_lvl_rt_f clr
8773               ,clf.comp_lvl_fctr_id
8774               ,clf.comp_calc_rl
8775       FROM     ben_comp_lvl_fctr clf
8777               ,ben_elig_comp_lvl_prte_f ecl
8778               ,ben_eligy_prfl_f elp
8779               ,ben_vrbl_rt_elig_prfl_f vep
8780               ,ben_vrbl_rt_prfl_f vpf
8781               ,ben_acty_vrbl_rt_f avr
8782               ,ben_acty_base_rt_f abr
8783       WHERE    abr.oiplip_id = p_oiplip_id
8784       AND      p_effective_date BETWEEN abr.effective_start_date
8785                    AND abr.effective_end_date
8786       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
8787       AND      p_effective_date BETWEEN avr.effective_start_date
8788                    AND avr.effective_end_date
8789       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
8790       AND      p_effective_date BETWEEN vpf.effective_start_date
8791                    AND vpf.effective_end_date
8792 --      AND      vpf.vrbl_rt_prfl_id = ecl.vrbl_rt_prfl_id
8793       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
8794       AND      p_effective_date BETWEEN vep.effective_start_date
8795                    AND vep.effective_end_date
8796       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
8797       AND      p_effective_date BETWEEN elp.effective_start_date
8798                    AND elp.effective_end_date
8799       AND      ecl.eligy_prfl_id = elp.eligy_prfl_id
8800       AND      p_effective_date BETWEEN ecl.effective_start_date
8801                    AND ecl.effective_end_date
8802       AND      ecl.comp_lvl_fctr_id = clf.comp_lvl_fctr_id
8803       AND      (
8804                     (
8805                           p_new_val IS NOT NULL
8806                       AND p_old_val IS NOT NULL
8807                       AND p_new_val >= NVL(clf.mn_comp_val
8808                                         ,p_new_val)
8809                       AND p_new_val <  decode(nvl(clf.mx_comp_val,p_new_val) ,
8810                                     trunc(nvl(clf.mx_comp_val,p_new_val))
8811                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
8812                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
8813                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
8814                                   -- ceil( NVL(clf.mx_comp_val
8815                                   --     ,p_new_val) + 0.001 ))
8816                  OR (
8817                           p_new_val IS NOT NULL
8818                       AND p_old_val IS NOT NULL
8819                       AND (
8820                                p_new_val < NVL(clf.mn_comp_val
8821                                             ,p_new_val)
8822                             OR p_new_val >=  decode(nvl(clf.mx_comp_val,p_new_val) ,
8823                                     trunc(nvl(clf.mx_comp_val,p_new_val))
8824                      ,decode(nvl(clf.mn_comp_val,p_new_val), trunc(nvl(clf.mn_comp_val,p_new_val)),
8825                       nvl(clf.mx_comp_val,p_new_val)+1,nvl(clf.mx_comp_val,p_new_val)+0.000000001),
8826                       nvl(clf.mx_comp_val,p_new_val)+0.000000001 )  )
8827                                        --   ceil( NVL(clf.mx_comp_val
8828                                        --    , p_new_val))+ 0.001 )
8829                       AND p_old_val >= NVL(clf.mn_comp_val
8830                                         ,p_old_val)
8831                       AND p_old_val <  decode(nvl(clf.mx_comp_val,p_old_val) ,
8832                                     trunc(nvl(clf.mx_comp_val,p_old_val))
8833                      ,decode(nvl(clf.mn_comp_val,p_old_val), trunc(nvl(clf.mn_comp_val,p_old_val)),
8834                       nvl(clf.mx_comp_val,p_old_val)+1,nvl(clf.mx_comp_val,p_old_val)+0.000000001),
8835                       nvl(clf.mx_comp_val,p_old_val)+0.000000001 )  )
8836                                        -- ceil( NVL(clf.mx_comp_val
8837                                        -- ,p_old_val)) + 0.001 )
8838                  OR (    p_new_val IS NULL
8839                      AND p_old_val IS NULL));
8840     --
8841     --
8842     l_index          PLS_INTEGER;
8843     l_not_hash_found BOOLEAN;
8844     l_c2notfound       BOOLEAN;
8845   --
8846   BEGIN
8847     --
8848     -- hr_utility.set_location ('Entering '||l_package,10);
8849     --
8850     -- Steps to do process
8851     --
8852     -- 1) Try and get value from cache
8853     -- 2) If can get from cache then copy to output record
8854     -- 3) If can't get from cache do db hit and then
8855     --    copy to cache record and then copy to output record.
8856     --
8857     -- Get hashed index value
8858     --
8859     l_index  := MOD(p_oiplip_id
8860                  ,g_hash_key);
8861     --
8862     IF NOT g_cache_oiplip_clf_rt_rec.EXISTS(l_index) THEN
8863       --
8864       -- Lets store the hash value in this index
8865       --
8866       RAISE NO_DATA_FOUND;
8867     --
8868     ELSE
8869       --
8870       -- If it does exist make sure its the right one
8871       --
8872       IF g_cache_oiplip_clf_rt_rec(l_index).id <> p_oiplip_id THEN
8873         --
8874         -- Loop through the hash using the jump routine to check further
8875         -- indexes
8876         --
8877         l_not_hash_found  := FALSE;
8878         --
8879         WHILE NOT l_not_hash_found LOOP
8880           --
8881           l_index  := l_index + g_hash_jump;
8882           --
8883           -- Check if the hash index exists, if not we can use it
8884           --
8885           IF NOT g_cache_oiplip_clf_rt_rec.EXISTS(l_index) THEN
8886             --
8890           --
8887             -- Lets store the hash value in the index
8888             --
8889             RAISE NO_DATA_FOUND;
8891           ELSE
8892             --
8893             -- Make sure the index is the correct one
8894             --
8895             IF g_cache_oiplip_clf_rt_rec(l_index).id = p_oiplip_id THEN
8896               --
8897               -- We have a match so the hashed value  has been stored before
8898               --
8899               l_not_hash_found  := TRUE;
8900             --
8901             END IF;
8902           --
8903           END IF;
8904         --
8905         END LOOP;
8906       --
8907       END IF;
8908     --
8909     END IF;
8910     --
8911     -- If p_old_val and p_new_val is set this means we are trying to retrieve
8912     -- the correct rate for the calculated value.
8913     -- Previously we just cached the first rate we
8914     -- found since we needed the determination code, the correct age,los code,etc
8915     -- By killing the cache and forcing the value to be removed we cache the
8916     -- correct rate profile for the case we need.
8917     --
8918     IF     p_old_val IS NOT NULL
8919        AND p_new_val IS NOT NULL THEN
8920       --
8921       RAISE NO_DATA_FOUND;
8922     --
8923     END IF;
8924     --
8925     p_rec    := g_cache_oiplip_clf_rt_rec(l_index);
8926   --
8927   -- hr_utility.set_location ('Leaving '||l_package,10);
8928   --
8929   EXCEPTION
8930     --
8931     WHEN NO_DATA_FOUND THEN
8932       --
8933       -- The record has not been cached yet so lets cache it
8934       --
8935       OPEN c1;
8936       --
8937       FETCH c1 INTO g_cache_oiplip_clf_rt_rec(l_index);
8938       -- PERFNEW
8939       IF c1%NOTFOUND THEN
8940          --
8941          l_c2notfound := false;
8942          OPEN c2;
8943          FETCH c2 INTO g_cache_oiplip_clf_rt_rec(l_index);
8944          IF c2%NOTFOUND THEN
8945             --
8946             l_c2notfound := true;
8947             --
8948          END IF;
8949          CLOSE c2;
8950          --
8951       END IF;
8952       -- PERFNEW
8953       IF     p_old_val IS NULL
8954          AND p_new_val IS NULL THEN
8955         --
8956         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
8957           --
8958           if NOT g_cache_oiplip_clf_rt_rec.EXISTS(l_index) then
8959             g_cache_oiplip_clf_rt_rec(l_index).id     := p_oiplip_id;
8960             g_cache_oiplip_clf_rt_rec(l_index).exist  := 'N';
8961           end if;
8962         --
8963         END IF;
8964       --
8965       END IF;
8966       --
8967       p_rec  := g_cache_oiplip_clf_rt_rec(l_index);
8968       --
8969       CLOSE c1;
8970   --
8971   END get_comp_oiplip_rate;
8972 --
8973   PROCEDURE get_comp_rate(
8974     p_pgm_id            IN            NUMBER
8975    ,p_pl_id             IN            NUMBER
8976    ,p_oipl_id           IN            NUMBER
8977    ,p_plip_id           IN            NUMBER
8978    ,p_ptip_id           IN            NUMBER
8979    ,p_oiplip_id         IN            NUMBER
8980    ,p_old_val           IN            NUMBER DEFAULT NULL
8981    ,p_new_val           IN            NUMBER DEFAULT NULL
8982    ,p_business_group_id IN            NUMBER
8983    ,p_effective_date    IN            DATE
8984    ,p_rec               OUT NOCOPY    g_cache_clf_rec_obj) IS
8985     --
8986     l_package VARCHAR2(80) := g_package || '.get_comp_rate';
8987   --
8988   BEGIN
8989     --
8990     -- hr_utility.set_location ('Entering '||l_package,10);
8991     --
8992     -- Derive which data type we are dealing with
8993     --
8994     IF p_pgm_id IS NOT NULL THEN
8995       --
8996       get_comp_pgm_rate(p_pgm_id=> p_pgm_id
8997        ,p_old_val           => p_old_val
8998        ,p_new_val           => p_new_val
8999        ,p_business_group_id => p_business_group_id
9000        ,p_effective_date    => p_effective_date
9001        ,p_rec               => p_rec);
9002     --
9003     ELSIF p_pl_id IS NOT NULL THEN
9004       --
9005       get_comp_pl_rate(p_pl_id=> p_pl_id
9006        ,p_old_val           => p_old_val
9007        ,p_new_val           => p_new_val
9008        ,p_business_group_id => p_business_group_id
9009        ,p_effective_date    => p_effective_date
9010        ,p_rec               => p_rec);
9011     --
9012     ELSIF p_oipl_id IS NOT NULL THEN
9013       --
9014       get_comp_oipl_rate(p_oipl_id=> p_oipl_id
9015        ,p_old_val           => p_old_val
9016        ,p_new_val           => p_new_val
9017        ,p_business_group_id => p_business_group_id
9018        ,p_effective_date    => p_effective_date
9019        ,p_rec               => p_rec);
9020     --
9021     ELSIF p_plip_id IS NOT NULL THEN
9022       --
9023       get_comp_plip_rate(p_plip_id=> p_plip_id
9024        ,p_old_val           => p_old_val
9025        ,p_new_val           => p_new_val
9026        ,p_business_group_id => p_business_group_id
9027        ,p_effective_date    => p_effective_date
9028        ,p_rec               => p_rec);
9029     --
9030     ELSIF p_ptip_id IS NOT NULL THEN
9031       --
9032       get_comp_ptip_rate(p_ptip_id=> p_ptip_id
9033        ,p_old_val           => p_old_val
9037        ,p_rec               => p_rec);
9034        ,p_new_val           => p_new_val
9035        ,p_business_group_id => p_business_group_id
9036        ,p_effective_date    => p_effective_date
9038     --
9039     ELSIF p_oiplip_id IS NOT NULL THEN
9040       --
9041       get_comp_oiplip_rate(p_oiplip_id=> p_oiplip_id
9042        ,p_old_val           => p_old_val
9043        ,p_new_val           => p_new_val
9044        ,p_business_group_id => p_business_group_id
9045        ,p_effective_date    => p_effective_date
9046        ,p_rec               => p_rec);
9047     --
9048     END IF;
9049   --
9050   -- hr_utility.set_location ('Leaving '||l_package,10);
9051   --
9052   END get_comp_rate;
9053 --
9054   PROCEDURE get_comb_pgm_elig(
9055     p_pgm_id            IN            NUMBER
9056    ,p_old_val           in            number  default null
9057    ,p_new_val           in            number  default null
9058    ,p_business_group_id IN            NUMBER
9059    ,p_effective_date    IN            DATE
9060    ,p_rec               OUT NOCOPY    g_cache_cla_rec_obj) IS
9061     --
9062     l_package        VARCHAR2(80) := g_package || '.get_comb_pgm_elig';
9063     --
9064     -- Define Cursor
9065     --
9066     CURSOR c1 IS
9067       SELECT   p_pgm_id
9068               ,'Y'
9069               ,cla.los_fctr_id
9070               ,cla.age_fctr_id
9071               ,cla.cmbnd_min_val
9072               ,cla.cmbnd_max_val
9073       FROM     ben_cmbn_age_los_fctr cla
9074               ,ben_elig_cmbn_age_los_prte_f ecp
9075               ,ben_eligy_prfl_f elp
9076               ,ben_prtn_elig_prfl_f cep
9077               ,ben_prtn_elig_f epa
9078       WHERE    epa.pgm_id = p_pgm_id
9079       AND      p_effective_date BETWEEN epa.effective_start_date
9080                    AND epa.effective_end_date
9081       AND      epa.prtn_elig_id = cep.prtn_elig_id
9082       AND      p_effective_date BETWEEN cep.effective_start_date
9083                    AND cep.effective_end_date
9084       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
9085       AND      p_effective_date BETWEEN ecp.effective_start_date
9086                    AND ecp.effective_end_date
9087       AND      ecp.eligy_prfl_id = elp.eligy_prfl_id
9088       AND      p_effective_date BETWEEN ecp.effective_start_date
9089                    AND ecp.effective_end_date
9090       AND      ecp.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
9091       AND     (
9092                  (
9093                    p_new_val IS NOT NULL
9094                    AND p_old_val IS NOT NULL
9095                    AND p_new_val >= NVL(cla.cmbnd_min_val ,p_new_val)
9096                    and p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
9097                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
9098                  ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
9099                   nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
9100                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )
9101                   -- and p_old_val < cla.cmbnd_min_val
9102                   )
9103                  OR
9104                  (
9105                    p_new_val IS NOT NULL
9106                    AND p_old_val IS NOT NULL
9107                    AND
9108                    (
9109                     p_new_val < NVL(cla.cmbnd_min_val,p_new_val)
9110                     OR
9111                     p_new_val >=   decode(nvl(cla.cmbnd_max_val,p_new_val) ,
9112                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
9113                    ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
9114                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
9115                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )
9116                      )
9117                     AND p_old_val >= NVL(cla.cmbnd_min_val ,p_old_val)
9118                     and p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
9119                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
9120                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
9121                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
9122                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )
9123                   )
9124                  OR
9125                   (  p_new_val IS NULL
9126                      AND p_old_val IS NULL
9127                    )
9128             );
9129 
9130     --
9131     l_index          PLS_INTEGER;
9132     l_not_hash_found BOOLEAN;
9133   --
9134   BEGIN
9135     --
9136     -- hr_utility.set_location ('Entering '||l_package,10);
9137     --
9138     -- Steps to do process
9139     --
9140     -- 1) Try and get value from cache
9141     -- 2) If can get from cache then copy to output record
9142     -- 3) If can't get from cache do db hit and then
9143     --    copy to cache record and then copy to output record.
9144     --
9145     -- Get hashed index value
9146     --
9147     l_index  := MOD(p_pgm_id
9148                  ,g_hash_key);
9149     --
9150     IF NOT g_cache_pgm_cla_el_rec.EXISTS(l_index) THEN
9151       --
9152       -- Lets store the hash value in this index
9153       --
9154       RAISE NO_DATA_FOUND;
9155     --
9156     ELSE
9157       --
9161         --
9158       -- If it does exist make sure its the right one
9159       --
9160       IF g_cache_pgm_cla_el_rec(l_index).id <> p_pgm_id THEN
9162         -- Loop through the hash using the jump routine to check further
9163         -- indexes
9164         --
9165         l_not_hash_found  := FALSE;
9166         --
9167         WHILE NOT l_not_hash_found LOOP
9168           --
9169           l_index  := l_index + g_hash_jump;
9170           --
9171           -- Check if the hash index exists, if not we can use it
9172           --
9173           IF NOT g_cache_pgm_cla_el_rec.EXISTS(l_index) THEN
9174             --
9175             -- Lets store the hash value in the index
9176             --
9177             RAISE NO_DATA_FOUND;
9178           --
9179           ELSE
9180             --
9181             -- Make sure the index is the correct one
9182             --
9183             IF g_cache_pgm_cla_el_rec(l_index).id = p_pgm_id THEN
9184               --
9185               -- We have a match so the hashed value  has been stored before
9186               --
9187               l_not_hash_found  := TRUE;
9188             --
9189             END IF;
9190           --
9191           END IF;
9192         --
9193         END LOOP;
9194       --
9195       END IF;
9196     --
9197     END IF;
9198     --
9199      IF     p_old_val IS NOT NULL
9200        AND p_new_val IS NOT NULL THEN
9201       --
9202       RAISE NO_DATA_FOUND;
9203     --
9204     END IF;
9205 
9206     p_rec    := g_cache_pgm_cla_el_rec(l_index);
9207   --
9208   -- hr_utility.set_location ('Leaving '||l_package,10);
9209   --
9210   EXCEPTION
9211     --
9212     WHEN NO_DATA_FOUND THEN
9213       --
9214       -- The record has not been cached yet so lets cache it
9215       --
9216       OPEN c1;
9217       --
9218       FETCH c1 INTO g_cache_pgm_cla_el_rec(l_index);
9219       IF c1%NOTFOUND THEN
9220         --
9221         if NOT g_cache_pgm_cla_el_rec.EXISTS(l_index) then
9222           g_cache_pgm_cla_el_rec(l_index).id     := p_pgm_id;
9223           g_cache_pgm_cla_el_rec(l_index).exist  := 'N';
9224         end if;
9225       --
9226       END IF;
9227       --
9228       p_rec  := g_cache_pgm_cla_el_rec(l_index);
9229       --
9230       CLOSE c1;
9231   --
9232   END get_comb_pgm_elig;
9233 --
9234   PROCEDURE get_comb_pl_elig(
9235     p_pl_id             IN            NUMBER
9236    ,p_old_val           in            number  default null
9237    ,p_new_val           in            number  default null
9238    ,p_business_group_id IN            NUMBER
9239    ,p_effective_date    IN            DATE
9240    ,p_rec               OUT NOCOPY    g_cache_cla_rec_obj) IS
9241     --
9242     l_package        VARCHAR2(80) := g_package || '.get_comb_pl_elig';
9243     --
9244     -- Define Cursor
9245     --
9246     CURSOR c1 IS
9247       SELECT   p_pl_id
9248               ,'Y'
9249               ,cla.los_fctr_id
9250               ,cla.age_fctr_id
9251               ,cla.cmbnd_min_val
9252               ,cla.cmbnd_max_val
9253       FROM     ben_cmbn_age_los_fctr cla
9254               ,ben_elig_cmbn_age_los_prte_f ecp
9255               ,ben_eligy_prfl_f elp
9256               ,ben_prtn_elig_prfl_f cep
9257               ,ben_prtn_elig_f epa
9258       WHERE    epa.pl_id = p_pl_id
9259       AND      p_effective_date BETWEEN epa.effective_start_date
9260                    AND epa.effective_end_date
9261       AND      epa.prtn_elig_id = cep.prtn_elig_id
9262       AND      p_effective_date BETWEEN cep.effective_start_date
9263                    AND cep.effective_end_date
9264       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
9265       AND      p_effective_date BETWEEN ecp.effective_start_date
9266                    AND ecp.effective_end_date
9267       AND      ecp.eligy_prfl_id = elp.eligy_prfl_id
9268       AND      p_effective_date BETWEEN ecp.effective_start_date
9269                    AND ecp.effective_end_date
9270       AND      ecp.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
9271       AND     (
9272                  (
9273                    p_new_val IS NOT NULL
9274                    AND p_old_val IS NOT NULL
9275                    AND p_new_val >= NVL(cla.cmbnd_min_val ,p_new_val)
9276                    and p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
9277                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
9278                  ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
9279                   nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
9280                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )
9281                   -- and p_old_val < cla.cmbnd_min_val
9282                   )
9283                  OR
9284                  (
9285                    p_new_val IS NOT NULL
9286                    AND p_old_val IS NOT NULL
9287                    AND
9288                    (
9289                     p_new_val < NVL(cla.cmbnd_min_val,p_new_val)
9290                     OR
9291                     p_new_val >=   decode(nvl(cla.cmbnd_max_val,p_new_val) ,
9292                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
9293                    ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
9297                     AND p_old_val >= NVL(cla.cmbnd_min_val ,p_old_val)
9294                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
9295                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )
9296                      )
9298                     and p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
9299                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
9300                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
9301                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
9302                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )
9303                   )
9304                  OR
9305                   (  p_new_val IS NULL
9306                      AND p_old_val IS NULL
9307                    )
9308             );
9309 
9310     --
9311     --
9312     l_index          PLS_INTEGER;
9313     l_not_hash_found BOOLEAN;
9314   --
9315   BEGIN
9316     --
9317     -- hr_utility.set_location ('Entering '||l_package,10);
9318     --
9319     -- Steps to do process
9320     --
9321     -- 1) Try and get value from cache
9322     -- 2) If can get from cache then copy to output record
9323     -- 3) If can't get from cache do db hit and then
9324     --    copy to cache record and then copy to output record.
9325     --
9326     -- Get hashed index value
9327     --
9328     l_index  := MOD(p_pl_id
9329                  ,g_hash_key);
9330     --
9331     IF NOT g_cache_pl_cla_el_rec.EXISTS(l_index) THEN
9332       --
9333       -- Lets store the hash value in this index
9334       --
9335       RAISE NO_DATA_FOUND;
9336     --
9337     ELSE
9338       --
9339       -- If it does exist make sure its the right one
9340       --
9341       IF g_cache_pl_cla_el_rec(l_index).id <> p_pl_id THEN
9342         --
9343         -- Loop through the hash using the jump routine to check further
9344         -- indexes
9345         --
9346         l_not_hash_found  := FALSE;
9347         --
9348         WHILE NOT l_not_hash_found LOOP
9349           --
9350           l_index  := l_index + g_hash_jump;
9351           --
9352           -- Check if the hash index exists, if not we can use it
9353           --
9354           IF NOT g_cache_pl_cla_el_rec.EXISTS(l_index) THEN
9355             --
9356             -- Lets store the hash value in the index
9357             --
9358             RAISE NO_DATA_FOUND;
9359           --
9360           ELSE
9361             --
9362             -- Make sure the index is the correct one
9363             --
9364             IF g_cache_pl_cla_el_rec(l_index).id = p_pl_id THEN
9365               --
9366               -- We have a match so the hashed value  has been stored before
9367               --
9368               l_not_hash_found  := TRUE;
9369             --
9370             END IF;
9371           --
9372           END IF;
9373         --
9374         END LOOP;
9375       --
9376       END IF;
9377     --
9378     END IF;
9379     --
9380      IF     p_old_val IS NOT NULL
9381        AND p_new_val IS NOT NULL THEN
9382       --
9383       RAISE NO_DATA_FOUND;
9384     --
9385     END IF;
9386     p_rec    := g_cache_pl_cla_el_rec(l_index);
9387   --
9388   -- hr_utility.set_location ('Leaving '||l_package,10);
9389   --
9390   EXCEPTION
9391     --
9392     WHEN NO_DATA_FOUND THEN
9393       --
9394       -- The record has not been cached yet so lets cache it
9395       --
9396       OPEN c1;
9397       --
9398       FETCH c1 INTO g_cache_pl_cla_el_rec(l_index);
9399       IF c1%NOTFOUND THEN
9400         --
9401         if NOT g_cache_pl_cla_el_rec.EXISTS(l_index) then
9402           g_cache_pl_cla_el_rec(l_index).id     := p_pl_id;
9403           g_cache_pl_cla_el_rec(l_index).exist  := 'N';
9404         end if;
9405       --
9406       END IF;
9407       --
9408       p_rec  := g_cache_pl_cla_el_rec(l_index);
9409       --
9410       CLOSE c1;
9411   --
9412   END get_comb_pl_elig;
9413 --
9414   PROCEDURE get_comb_oipl_elig(
9415     p_oipl_id           IN            NUMBER
9416    ,p_old_val           in            number  default null
9417    ,p_new_val           in            number  default null
9418    ,p_business_group_id IN            NUMBER
9419    ,p_effective_date    IN            DATE
9420    ,p_rec               OUT NOCOPY    g_cache_cla_rec_obj) IS
9421     --
9422     l_package        VARCHAR2(80) := g_package || '.get_comb_oipl_elig';
9423     --
9424     -- Define Cursor
9425     --
9426     CURSOR c1 IS
9427       SELECT   p_oipl_id
9428               ,'Y'
9429               ,cla.los_fctr_id
9430               ,cla.age_fctr_id
9431               ,cla.cmbnd_min_val
9432               ,cla.cmbnd_max_val
9433       FROM     ben_cmbn_age_los_fctr cla
9434               ,ben_elig_cmbn_age_los_prte_f ecp
9435               ,ben_eligy_prfl_f elp
9436               ,ben_prtn_elig_prfl_f cep
9437               ,ben_prtn_elig_f epa
9438       WHERE    epa.oipl_id = p_oipl_id
9439       AND      p_effective_date BETWEEN epa.effective_start_date
9443                    AND cep.effective_end_date
9440                    AND epa.effective_end_date
9441       AND      epa.prtn_elig_id = cep.prtn_elig_id
9442       AND      p_effective_date BETWEEN cep.effective_start_date
9444       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
9445       AND      p_effective_date BETWEEN ecp.effective_start_date
9446                    AND ecp.effective_end_date
9447       AND      ecp.eligy_prfl_id = elp.eligy_prfl_id
9448       AND      p_effective_date BETWEEN ecp.effective_start_date
9449                    AND ecp.effective_end_date
9450       AND      ecp.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
9451       AND     (
9452                  (
9453                    p_new_val IS NOT NULL
9454                    AND p_old_val IS NOT NULL
9455                    AND p_new_val >= NVL(cla.cmbnd_min_val ,p_new_val)
9456                    and p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
9457                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
9458                  ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
9459                   nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
9460                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )
9461                   -- and p_old_val < cla.cmbnd_min_val
9462                   )
9463                  OR
9464                  (
9465                    p_new_val IS NOT NULL
9466                    AND p_old_val IS NOT NULL
9467                    AND
9468                    (
9469                     p_new_val < NVL(cla.cmbnd_min_val,p_new_val)
9470                     OR
9471                     p_new_val >=   decode(nvl(cla.cmbnd_max_val,p_new_val) ,
9472                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
9473                    ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
9474                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
9475                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )
9476                      )
9477                     AND p_old_val >= NVL(cla.cmbnd_min_val ,p_old_val)
9478                     and p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
9479                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
9480                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
9481                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
9482                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )
9483                   )
9484                  OR
9485                   (  p_new_val IS NULL
9486                      AND p_old_val IS NULL
9487                    )
9488             );
9489 
9490     --
9491     --
9492     l_index          PLS_INTEGER;
9493     l_not_hash_found BOOLEAN;
9494   --
9495   BEGIN
9496     --
9497     -- hr_utility.set_location ('Entering '||l_package,10);
9498     --
9499     -- Steps to do process
9500     --
9501     -- 1) Try and get value from cache
9502     -- 2) If can get from cache then copy to output record
9503     -- 3) If can't get from cache do db hit and then
9504     --    copy to cache record and then copy to output record.
9505     --
9506     -- Get hashed index value
9507     --
9508     l_index  := MOD(p_oipl_id
9509                  ,g_hash_key);
9510     --
9511     IF NOT g_cache_oipl_cla_el_rec.EXISTS(l_index) THEN
9512       --
9513       -- Lets store the hash value in this index
9514       --
9515       RAISE NO_DATA_FOUND;
9516     --
9517     ELSE
9518       --
9519       -- If it does exist make sure its the right one
9520       --
9521       IF g_cache_oipl_cla_el_rec(l_index).id <> p_oipl_id THEN
9522         --
9523         -- Loop through the hash using the jump routine to check further
9524         -- indexes
9525         --
9526         l_not_hash_found  := FALSE;
9527         --
9528         WHILE NOT l_not_hash_found LOOP
9529           --
9530           l_index  := l_index + g_hash_jump;
9531           --
9532           -- Check if the hash index exists, if not we can use it
9533           --
9534           IF NOT g_cache_oipl_cla_el_rec.EXISTS(l_index) THEN
9535             --
9536             -- Lets store the hash value in the index
9537             --
9538             RAISE NO_DATA_FOUND;
9539           --
9540           ELSE
9541             --
9542             -- Make sure the index is the correct one
9543             --
9544             IF g_cache_oipl_cla_el_rec(l_index).id = p_oipl_id THEN
9545               --
9546               -- We have a match so the hashed value  has been stored before
9547               --
9548               l_not_hash_found  := TRUE;
9549             --
9550             END IF;
9551           --
9552           END IF;
9553         --
9554         END LOOP;
9555       --
9556       END IF;
9557     --
9558     END IF;
9559     --
9560      IF     p_old_val IS NOT NULL
9561        AND p_new_val IS NOT NULL THEN
9562       --
9563       RAISE NO_DATA_FOUND;
9564     --
9565     END IF;
9566     p_rec    := g_cache_oipl_cla_el_rec(l_index);
9567   --
9568   -- hr_utility.set_location ('Leaving '||l_package,10);
9569   --
9570   EXCEPTION
9571     --
9575       --
9572     WHEN NO_DATA_FOUND THEN
9573       --
9574       -- The record has not been cached yet so lets cache it
9576       OPEN c1;
9577       --
9578       FETCH c1 INTO g_cache_oipl_cla_el_rec(l_index);
9579       IF c1%NOTFOUND THEN
9580         --
9581         if NOT g_cache_oipl_cla_el_rec.EXISTS(l_index) then
9582           g_cache_oipl_cla_el_rec(l_index).id     := p_oipl_id;
9583           g_cache_oipl_cla_el_rec(l_index).exist  := 'N';
9584         end if;
9585       --
9586       END IF;
9587       --
9588       p_rec  := g_cache_oipl_cla_el_rec(l_index);
9589       --
9590       CLOSE c1;
9591   --
9592   END get_comb_oipl_elig;
9593 --
9594   PROCEDURE get_comb_plip_elig(
9595     p_plip_id           IN            NUMBER
9596    ,p_old_val           in            number  default null
9597    ,p_new_val           in            number  default null
9598    ,p_business_group_id IN            NUMBER
9599    ,p_effective_date    IN            DATE
9600    ,p_rec               OUT NOCOPY    g_cache_cla_rec_obj) IS
9601     --
9602     l_package        VARCHAR2(80) := g_package || '.get_comb_plip_elig';
9603     --
9604     -- Define Cursor
9605     --
9606     CURSOR c1 IS
9607       SELECT   p_plip_id
9608               ,'Y'
9609               ,cla.los_fctr_id
9610               ,cla.age_fctr_id
9611               ,cla.cmbnd_min_val
9612               ,cla.cmbnd_max_val
9613       FROM     ben_cmbn_age_los_fctr cla
9614               ,ben_elig_cmbn_age_los_prte_f ecp
9615               ,ben_eligy_prfl_f elp
9616               ,ben_prtn_elig_prfl_f cep
9617               ,ben_prtn_elig_f epa
9618       WHERE    epa.plip_id = p_plip_id
9619       AND      p_effective_date BETWEEN epa.effective_start_date
9620                    AND epa.effective_end_date
9621       AND      epa.prtn_elig_id = cep.prtn_elig_id
9622       AND      p_effective_date BETWEEN cep.effective_start_date
9623                    AND cep.effective_end_date
9624       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
9625       AND      p_effective_date BETWEEN ecp.effective_start_date
9626                    AND ecp.effective_end_date
9627       AND      ecp.eligy_prfl_id = elp.eligy_prfl_id
9628       AND      p_effective_date BETWEEN ecp.effective_start_date
9629                    AND ecp.effective_end_date
9630       AND      ecp.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
9631       AND     (
9632                  (
9633                    p_new_val IS NOT NULL
9634                    AND p_old_val IS NOT NULL
9635                    AND p_new_val >= NVL(cla.cmbnd_min_val ,p_new_val)
9636                    and p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
9637                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
9638                  ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
9639                   nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
9640                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )
9641                   -- and p_old_val < cla.cmbnd_min_val
9642                   )
9643                  OR
9644                  (
9645                    p_new_val IS NOT NULL
9646                    AND p_old_val IS NOT NULL
9647                    AND
9648                    (
9649                     p_new_val < NVL(cla.cmbnd_min_val,p_new_val)
9650                     OR
9651                     p_new_val >=   decode(nvl(cla.cmbnd_max_val,p_new_val) ,
9652                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
9653                    ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
9654                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
9655                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )
9656                      )
9657                     AND p_old_val >= NVL(cla.cmbnd_min_val ,p_old_val)
9658                     and p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
9659                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
9660                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
9661                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
9662                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )
9663                   )
9664                  OR
9665                   (  p_new_val IS NULL
9666                      AND p_old_val IS NULL
9667                    )
9668             );
9669 
9670     --
9671     --
9672     l_index          PLS_INTEGER;
9673     l_not_hash_found BOOLEAN;
9674   --
9675   BEGIN
9676     --
9677     -- hr_utility.set_location ('Entering '||l_package,10);
9678     --
9679     -- Steps to do process
9680     --
9681     -- 1) Try and get value from cache
9682     -- 2) If can get from cache then copy to output record
9683     -- 3) If can't get from cache do db hit and then
9684     --    copy to cache record and then copy to output record.
9685     --
9686     -- Get hashed index value
9687     --
9688     l_index  := MOD(p_plip_id
9689                  ,g_hash_key);
9690     --
9691     IF NOT g_cache_plip_cla_el_rec.EXISTS(l_index) THEN
9692       --
9693       -- Lets store the hash value in this index
9694       --
9695       RAISE NO_DATA_FOUND;
9696     --
9700       --
9697     ELSE
9698       --
9699       -- If it does exist make sure its the right one
9701       IF g_cache_plip_cla_el_rec(l_index).id <> p_plip_id THEN
9702         --
9703         -- Loop through the hash using the jump routine to check further
9704         -- indexes
9705         --
9706         l_not_hash_found  := FALSE;
9707         --
9708         WHILE NOT l_not_hash_found LOOP
9709           --
9710           l_index  := l_index + g_hash_jump;
9711           --
9712           -- Check if the hash index exists, if not we can use it
9713           --
9714           IF NOT g_cache_plip_cla_el_rec.EXISTS(l_index) THEN
9715             --
9716             -- Lets store the hash value in the index
9717             --
9718             RAISE NO_DATA_FOUND;
9719           --
9720           ELSE
9721             --
9722             -- Make sure the index is the correct one
9723             --
9724             IF g_cache_plip_cla_el_rec(l_index).id = p_plip_id THEN
9725               --
9726               -- We have a match so the hashed value  has been stored before
9727               --
9728               l_not_hash_found  := TRUE;
9729             --
9730             END IF;
9731           --
9732           END IF;
9733         --
9734         END LOOP;
9735       --
9736       END IF;
9737     --
9738     END IF;
9739     --
9740      IF     p_old_val IS NOT NULL
9741        AND p_new_val IS NOT NULL THEN
9742       --
9743       RAISE NO_DATA_FOUND;
9744     --
9745     END IF;
9746     p_rec    := g_cache_plip_cla_el_rec(l_index);
9747   --
9748   -- hr_utility.set_location ('Leaving '||l_package,10);
9749   --
9750   EXCEPTION
9751     --
9752     WHEN NO_DATA_FOUND THEN
9753       --
9754       -- The record has not been cached yet so lets cache it
9755       --
9756       OPEN c1;
9757       --
9758       FETCH c1 INTO g_cache_plip_cla_el_rec(l_index);
9759       IF c1%NOTFOUND THEN
9760         --
9761         if NOT g_cache_plip_cla_el_rec.EXISTS(l_index) then
9762           g_cache_plip_cla_el_rec(l_index).id     := p_plip_id;
9763           g_cache_plip_cla_el_rec(l_index).exist  := 'N';
9764         end if;
9765       --
9766       END IF;
9767       --
9768       p_rec  := g_cache_plip_cla_el_rec(l_index);
9769       --
9770       CLOSE c1;
9771   --
9772   END get_comb_plip_elig;
9773 --
9774   PROCEDURE get_comb_ptip_elig(
9775     p_ptip_id           IN            NUMBER
9776    ,p_old_val           in            number  default null
9777    ,p_new_val           in            number  default null
9778    ,p_business_group_id IN            NUMBER
9779    ,p_effective_date    IN            DATE
9780    ,p_rec               OUT NOCOPY    g_cache_cla_rec_obj) IS
9781     --
9782     l_package        VARCHAR2(80) := g_package || '.get_comb_ptip_elig';
9783     --
9784     -- Define Cursor
9785     --
9786     CURSOR c1 IS
9787       SELECT   p_ptip_id
9788               ,'Y'
9789               ,cla.los_fctr_id
9790               ,cla.age_fctr_id
9791               ,cla.cmbnd_min_val
9792               ,cla.cmbnd_max_val
9793       FROM     ben_cmbn_age_los_fctr cla
9794               ,ben_elig_cmbn_age_los_prte_f ecp
9795               ,ben_eligy_prfl_f elp
9796               ,ben_prtn_elig_prfl_f cep
9797               ,ben_prtn_elig_f epa
9798       WHERE    epa.ptip_id = p_ptip_id
9799       AND      p_effective_date BETWEEN epa.effective_start_date
9800                    AND epa.effective_end_date
9801       AND      epa.prtn_elig_id = cep.prtn_elig_id
9802       AND      p_effective_date BETWEEN cep.effective_start_date
9803                    AND cep.effective_end_date
9804       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
9805       AND      p_effective_date BETWEEN ecp.effective_start_date
9806                    AND ecp.effective_end_date
9807       AND      ecp.eligy_prfl_id = elp.eligy_prfl_id
9808       AND      p_effective_date BETWEEN ecp.effective_start_date
9809                    AND ecp.effective_end_date
9810       AND      ecp.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
9811       AND     (
9812                  (
9813                    p_new_val IS NOT NULL
9814                    AND p_old_val IS NOT NULL
9815                    AND p_new_val >= NVL(cla.cmbnd_min_val ,p_new_val)
9816                    and p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
9817                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
9818                  ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
9819                   nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
9820                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )
9821                   -- and p_old_val < cla.cmbnd_min_val
9822                   )
9823                  OR
9824                  (
9825                    p_new_val IS NOT NULL
9826                    AND p_old_val IS NOT NULL
9827                    AND
9828                    (
9829                     p_new_val < NVL(cla.cmbnd_min_val,p_new_val)
9830                     OR
9831                     p_new_val >=   decode(nvl(cla.cmbnd_max_val,p_new_val) ,
9832                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
9836                      )
9833                    ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
9834                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
9835                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )
9837                     AND p_old_val >= NVL(cla.cmbnd_min_val ,p_old_val)
9838                     and p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
9839                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
9840                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
9841                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
9842                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )
9843                   )
9844                  OR
9845                   (  p_new_val IS NULL
9846                      AND p_old_val IS NULL
9847                    )
9848             );
9849 
9850     --
9851     --
9852     l_index          PLS_INTEGER;
9853     l_not_hash_found BOOLEAN;
9854   --
9855   BEGIN
9856     --
9857     -- hr_utility.set_location ('Entering '||l_package,10);
9858     --
9859     -- Steps to do process
9860     --
9861     -- 1) Try and get value from cache
9862     -- 2) If can get from cache then copy to output record
9863     -- 3) If can't get from cache do db hit and then
9864     --    copy to cache record and then copy to output record.
9865     --
9866     -- Get hashed index value
9867     --
9868     l_index  := MOD(p_ptip_id
9869                  ,g_hash_key);
9870     --
9871     IF NOT g_cache_ptip_cla_el_rec.EXISTS(l_index) THEN
9872       --
9873       -- Lets store the hash value in this index
9874       --
9875       RAISE NO_DATA_FOUND;
9876     --
9877     ELSE
9878       --
9879       -- If it does exist make sure its the right one
9880       --
9881       IF g_cache_ptip_cla_el_rec(l_index).id <> p_ptip_id THEN
9882         --
9883         -- Loop through the hash using the jump routine to check further
9884         -- indexes
9885         --
9886         l_not_hash_found  := FALSE;
9887         --
9888         WHILE NOT l_not_hash_found LOOP
9889           --
9890           l_index  := l_index + g_hash_jump;
9891           --
9892           -- Check if the hash index exists, if not we can use it
9893           --
9894           IF NOT g_cache_ptip_cla_el_rec.EXISTS(l_index) THEN
9895             --
9896             -- Lets store the hash value in the index
9897             --
9898             RAISE NO_DATA_FOUND;
9899           --
9900           ELSE
9901             --
9902             -- Make sure the index is the correct one
9903             --
9904             IF g_cache_ptip_cla_el_rec(l_index).id = p_ptip_id THEN
9905               --
9906               -- We have a match so the hashed value  has been stored before
9907               --
9908               l_not_hash_found  := TRUE;
9909             --
9910             END IF;
9911           --
9912           END IF;
9913         --
9914         END LOOP;
9915       --
9916       END IF;
9917     --
9918     END IF;
9919     --
9920      IF     p_old_val IS NOT NULL
9921        AND p_new_val IS NOT NULL THEN
9922       --
9923       RAISE NO_DATA_FOUND;
9924     --
9925     END IF;
9926     p_rec    := g_cache_ptip_cla_el_rec(l_index);
9927   --
9928   -- hr_utility.set_location ('Leaving '||l_package,10);
9929   --
9930   EXCEPTION
9931     --
9932     WHEN NO_DATA_FOUND THEN
9933       --
9934       -- The record has not been cached yet so lets cache it
9935       --
9936       OPEN c1;
9937       --
9938       FETCH c1 INTO g_cache_ptip_cla_el_rec(l_index);
9939       IF c1%NOTFOUND THEN
9940         --
9941         if NOT g_cache_ptip_cla_el_rec.EXISTS(l_index) then
9942           g_cache_ptip_cla_el_rec(l_index).id     := p_ptip_id;
9943           g_cache_ptip_cla_el_rec(l_index).exist  := 'N';
9944         end if;
9945       --
9946       END IF;
9947       --
9948       p_rec  := g_cache_ptip_cla_el_rec(l_index);
9949       --
9950       CLOSE c1;
9951   --
9952   END get_comb_ptip_elig;
9953 --
9954   PROCEDURE get_comb_elig(
9955     p_pgm_id            IN            NUMBER
9956    ,p_pl_id             IN            NUMBER
9957    ,p_oipl_id           IN            NUMBER
9958    ,p_plip_id           IN            NUMBER
9959    ,p_ptip_id           IN            NUMBER
9960    ,p_old_val           in            number  default null
9961    ,p_new_val           in            number  default null
9962    ,p_business_group_id IN            NUMBER
9963    ,p_effective_date    IN            DATE
9964    ,p_rec               OUT NOCOPY    g_cache_cla_rec_obj) IS
9965     --
9966     l_package VARCHAR2(80) := g_package || '.get_comb_elig';
9967   --
9968   BEGIN
9969     --
9970     -- hr_utility.set_location ('Entering '||l_package,10);
9971     --
9972     -- Derive which data type we are dealing with
9973     --
9974     IF p_pgm_id IS NOT NULL THEN
9975       --
9976       get_comb_pgm_elig(p_pgm_id=> p_pgm_id
9977        ,p_old_val           => p_old_val
9978        ,p_new_val           => p_new_val
9982     --
9979        ,p_business_group_id => p_business_group_id
9980        ,p_effective_date    => p_effective_date
9981        ,p_rec               => p_rec);
9983     ELSIF p_pl_id IS NOT NULL THEN
9984       --
9985       get_comb_pl_elig(p_pl_id=> p_pl_id
9986         ,p_old_val           => p_old_val
9987        ,p_new_val           => p_new_val
9988        ,p_business_group_id => p_business_group_id
9989        ,p_effective_date    => p_effective_date
9990        ,p_rec               => p_rec);
9991     --
9992     ELSIF p_oipl_id IS NOT NULL THEN
9993       --
9994       get_comb_oipl_elig(p_oipl_id=> p_oipl_id
9995         ,p_old_val           => p_old_val
9996        ,p_new_val           => p_new_val
9997        ,p_business_group_id => p_business_group_id
9998        ,p_effective_date    => p_effective_date
9999        ,p_rec               => p_rec);
10000     --
10001     ELSIF p_plip_id IS NOT NULL THEN
10002       --
10003       get_comb_plip_elig(p_plip_id=> p_plip_id
10004         ,p_old_val           => p_old_val
10005        ,p_new_val           => p_new_val
10006        ,p_business_group_id => p_business_group_id
10007        ,p_effective_date    => p_effective_date
10008        ,p_rec               => p_rec);
10009     --
10010     ELSIF p_ptip_id IS NOT NULL THEN
10011       --
10012       get_comb_ptip_elig(p_ptip_id=> p_ptip_id
10013         ,p_old_val           => p_old_val
10014        ,p_new_val           => p_new_val
10015        ,p_business_group_id => p_business_group_id
10016        ,p_effective_date    => p_effective_date
10017        ,p_rec               => p_rec);
10018     --
10019     END IF;
10020   --
10021   -- hr_utility.set_location ('Leaving '||l_package,10);
10022   --
10023   END get_comb_elig;
10024 --
10025   PROCEDURE get_comb_pgm_rate(
10026     p_pgm_id            IN            NUMBER
10027    ,p_old_val           IN            NUMBER DEFAULT NULL
10028    ,p_new_val           IN            NUMBER DEFAULT NULL
10029    ,p_business_group_id IN            NUMBER
10030    ,p_effective_date    IN            DATE
10031    ,p_rec               OUT NOCOPY    g_cache_cla_rec_obj) IS
10032     --
10033     l_package        VARCHAR2(80) := g_package || '.get_comb_pgm_rate';
10034     l_old_val_1 NUMBER := p_old_val + 1;
10035     l_new_val_1 NUMBER := p_new_val + 1;
10036     --
10037     -- Define Cursor
10038     --
10039     CURSOR c1 IS
10040       SELECT   p_pgm_id
10041               ,'Y'
10042               ,cla.los_fctr_id
10043               ,cla.age_fctr_id
10044               ,cla.cmbnd_min_val
10045               ,cla.cmbnd_max_val
10046       FROM     ben_cmbn_age_los_fctr cla
10047               ,ben_cmbn_age_los_rt_f cmr
10048               ,ben_vrbl_rt_prfl_f vpf
10049               ,ben_acty_vrbl_rt_f avr
10050               ,ben_acty_base_rt_f abr
10051       WHERE    abr.pgm_id = p_pgm_id
10052       AND      p_effective_date BETWEEN abr.effective_start_date
10053                    AND abr.effective_end_date
10054       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
10055       AND      p_effective_date BETWEEN avr.effective_start_date
10056                    AND avr.effective_end_date
10057       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
10058       AND      p_effective_date BETWEEN vpf.effective_start_date
10059                    AND vpf.effective_end_date
10060       AND      vpf.vrbl_rt_prfl_id = cmr.vrbl_rt_prfl_id
10061       AND      p_effective_date BETWEEN cmr.effective_start_date
10062                    AND cmr.effective_end_date
10063       AND      cmr.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
10064       AND      (
10065                     (
10066                           p_new_val IS NOT NULL
10067                       AND p_old_val IS NOT NULL
10068                       AND p_new_val >= NVL(cla.cmbnd_min_val
10069                                         ,p_new_val)
10070                       AND p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
10071                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
10072                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
10073                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
10074                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
10075 				-- ceil( NVL(cla.cmbnd_max_val
10076                                 --       ,p_new_val) + 0.001 ))
10077                  OR (
10078                           p_new_val IS NOT NULL
10079                       AND p_old_val IS NOT NULL
10080                       AND (
10081                                p_new_val < NVL(cla.cmbnd_min_val
10082                                             ,p_new_val)
10083                             OR p_new_val >=  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
10084                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
10085                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
10086                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
10087                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
10088                                     --    ceil( NVL(cla.cmbnd_max_val
10089                                     --     , p_new_val)) + 0.001 )
10090                       AND p_old_val >= NVL(cla.cmbnd_min_val
10091                                         ,p_old_val)
10095                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
10092                       AND p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
10093                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
10094                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
10096                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )  )
10097 					-- ceil( NVL(cla.cmbnd_max_val
10098                                         -- ,p_old_val)) +   0.001 )
10099                  OR (    p_new_val IS NULL
10100                      AND p_old_val IS NULL));
10101     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
10102     --UNION ALL
10103     CURSOR c2 IS
10104       SELECT   p_pgm_id
10105               ,'Y'
10106               ,cla.los_fctr_id
10107               ,cla.age_fctr_id
10108               ,cla.cmbnd_min_val
10109               ,cla.cmbnd_max_val
10110       FROM     ben_cmbn_age_los_fctr cla
10111               --,ben_cmbn_age_los_rt_f cmr
10112               ,ben_elig_cmbn_age_los_prte_f ecp
10113               ,ben_eligy_prfl_f elp
10114               ,ben_vrbl_rt_elig_prfl_f vep
10115               ,ben_vrbl_rt_prfl_f vpf
10116               ,ben_acty_vrbl_rt_f avr
10117               ,ben_acty_base_rt_f abr
10118       WHERE    abr.pgm_id = p_pgm_id
10119       AND      p_effective_date BETWEEN abr.effective_start_date
10120                    AND abr.effective_end_date
10121       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
10122       AND      p_effective_date BETWEEN avr.effective_start_date
10123                    AND avr.effective_end_date
10124       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
10125       AND      p_effective_date BETWEEN vpf.effective_start_date
10126                    AND vpf.effective_end_date
10127 --      AND      vpf.vrbl_rt_prfl_id = ecp.vrbl_rt_prfl_id
10128       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
10129       AND      p_effective_date BETWEEN vep.effective_start_date
10130                    AND vep.effective_end_date
10131       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
10132       AND      p_effective_date BETWEEN elp.effective_start_date
10133                    AND elp.effective_end_date
10134       AND      ecp.eligy_prfl_id = elp.eligy_prfl_id
10135       AND      p_effective_date BETWEEN ecp.effective_start_date
10136                    AND ecp.effective_end_date
10137       AND      ecp.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
10138       AND      (
10139                     (
10140                           p_new_val IS NOT NULL
10141                       AND p_old_val IS NOT NULL
10142                       AND p_new_val >= NVL(cla.cmbnd_min_val
10143                                         ,p_new_val)
10144                       AND p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
10145                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
10146                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
10147                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
10148                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
10149 				-- ceil( NVL(cla.cmbnd_max_val
10150                                 --       ,p_new_val) + 0.001 ))
10151                  OR (
10152                           p_new_val IS NOT NULL
10153                       AND p_old_val IS NOT NULL
10154                       AND (
10155                                p_new_val < NVL(cla.cmbnd_min_val
10156                                             ,p_new_val)
10157                             OR p_new_val >=  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
10158                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
10159                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
10160                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
10161                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
10162                                     --    ceil( NVL(cla.cmbnd_max_val
10163                                     --     , p_new_val)) + 0.001 )
10164                       AND p_old_val >= NVL(cla.cmbnd_min_val
10165                                         ,p_old_val)
10166                       AND p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
10167                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
10168                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
10169                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
10170                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )  )
10171 					-- ceil( NVL(cla.cmbnd_max_val
10172                                         -- ,p_old_val)) +   0.001 )
10173                  OR (    p_new_val IS NULL
10174                      AND p_old_val IS NULL));
10175     --
10176     --
10177     l_index          PLS_INTEGER;
10178     l_not_hash_found BOOLEAN;
10179     l_c2notfound       BOOLEAN;
10180   --
10181   BEGIN
10182     --
10183     -- hr_utility.set_location ('Entering '||l_package,10);
10184     --
10185     -- Steps to do process
10186     --
10187     -- 1) Try and get value from cache
10188     -- 2) If can get from cache then copy to output record
10189     -- 3) If can't get from cache do db hit and then
10193     --
10190     --    copy to cache record and then copy to output record.
10191     --
10192     -- Get hashed index value
10194     l_index  := MOD(p_pgm_id
10195                  ,g_hash_key);
10196     --
10197     IF NOT g_cache_pgm_cla_rt_rec.EXISTS(l_index) THEN
10198       --
10199       -- Lets store the hash value in this index
10200       --
10201       RAISE NO_DATA_FOUND;
10202     --
10203     ELSE
10204       --
10205       -- If it does exist make sure its the right one
10206       --
10207       IF g_cache_pgm_cla_rt_rec(l_index).id <> p_pgm_id THEN
10208         --
10209         -- Loop through the hash using the jump routine to check further
10210         -- indexes
10211         --
10212         l_not_hash_found  := FALSE;
10213         --
10214         WHILE NOT l_not_hash_found LOOP
10215           --
10216           l_index  := l_index + g_hash_jump;
10217           --
10218           -- Check if the hash index exists, if not we can use it
10219           --
10220           IF NOT g_cache_pgm_cla_rt_rec.EXISTS(l_index) THEN
10221             --
10222             -- Lets store the hash value in the index
10223             --
10224             RAISE NO_DATA_FOUND;
10225           --
10226           ELSE
10227             --
10228             -- Make sure the index is the correct one
10229             --
10230             IF g_cache_pgm_cla_rt_rec(l_index).id = p_pgm_id THEN
10231               --
10232               -- We have a match so the hashed value  has been stored before
10233               --
10234               l_not_hash_found  := TRUE;
10235             --
10236             END IF;
10237           --
10238           END IF;
10239         --
10240         END LOOP;
10241       --
10242       END IF;
10243     --
10244     END IF;
10245     --
10246     -- If p_old_val and p_new_val is set this means we are trying to retrieve
10247     -- the correct rate for the calculated value.
10248     -- Previously we just cached the first rate we
10249     -- found since we needed the determination code, the correct age,los code,etc
10250     -- By killing the cache and forcing the value to be removed we cache the
10251     -- correct rate profile for the case we need.
10252     --
10253     IF     p_old_val IS NOT NULL
10254        AND p_new_val IS NOT NULL THEN
10255       --
10256       RAISE NO_DATA_FOUND;
10257     --
10258     END IF;
10259     --
10260     p_rec    := g_cache_pgm_cla_rt_rec(l_index);
10261   --
10262   -- hr_utility.set_location ('Leaving '||l_package,10);
10263   --
10264   EXCEPTION
10265     --
10266     WHEN NO_DATA_FOUND THEN
10267       --
10268       -- The record has not been cached yet so lets cache it
10269       --
10270       OPEN c1;
10271       --
10272       FETCH c1 INTO g_cache_pgm_cla_rt_rec(l_index);
10273       -- PERFNEW
10274       IF c1%NOTFOUND THEN
10275          --
10276          l_c2notfound := false;
10277          OPEN c2;
10278          FETCH c2 INTO g_cache_pgm_cla_rt_rec(l_index);
10279          IF c2%NOTFOUND THEN
10280             --
10281             l_c2notfound := true;
10282             --
10283          END IF;
10284          CLOSE c2;
10285          --
10286       END IF;
10287       -- PERFNEW
10288       IF     p_old_val IS NULL
10289          AND p_new_val IS NULL THEN
10290         --
10291         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
10292           --
10293           if NOT g_cache_pgm_cla_rt_rec.EXISTS(l_index) then
10294             g_cache_pgm_cla_rt_rec(l_index).id     := p_pgm_id;
10295             g_cache_pgm_cla_rt_rec(l_index).exist  := 'N';
10296           end if;
10297         --
10298         END IF;
10299       --
10300       END IF;
10301       --
10302       p_rec  := g_cache_pgm_cla_rt_rec(l_index);
10303       --
10304       CLOSE c1;
10305   --
10306   END get_comb_pgm_rate;
10307 --
10308   PROCEDURE get_comb_pl_rate(
10309     p_pl_id             IN            NUMBER
10310    ,p_old_val           IN            NUMBER DEFAULT NULL
10311    ,p_new_val           IN            NUMBER DEFAULT NULL
10312    ,p_business_group_id IN            NUMBER
10313    ,p_effective_date    IN            DATE
10314    ,p_rec               OUT NOCOPY    g_cache_cla_rec_obj) IS
10315     --
10316     l_package        VARCHAR2(80) := g_package || '.get_comb_pl_rate';
10317     l_old_val_1 NUMBER := p_old_val + 1;
10318     l_new_val_1 NUMBER := p_new_val + 1;
10319     --
10320     -- Define Cursor
10321     --
10322     CURSOR c1 IS
10323       SELECT   p_pl_id
10324               ,'Y'
10325               ,cla.los_fctr_id
10326               ,cla.age_fctr_id
10327               ,cla.cmbnd_min_val
10328               ,cla.cmbnd_max_val
10329       FROM     ben_cmbn_age_los_fctr cla
10330               ,ben_cmbn_age_los_rt_f cmr
10331               ,ben_vrbl_rt_prfl_f vpf
10332               ,ben_acty_vrbl_rt_f avr
10333               ,ben_acty_base_rt_f abr
10334       WHERE    abr.pl_id = p_pl_id
10335       AND      p_effective_date BETWEEN abr.effective_start_date
10336                    AND abr.effective_end_date
10337       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
10338       AND      p_effective_date BETWEEN avr.effective_start_date
10342                    AND vpf.effective_end_date
10339                    AND avr.effective_end_date
10340       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
10341       AND      p_effective_date BETWEEN vpf.effective_start_date
10343       AND      vpf.vrbl_rt_prfl_id = cmr.vrbl_rt_prfl_id
10344       AND      p_effective_date BETWEEN cmr.effective_start_date
10345                    AND cmr.effective_end_date
10346       AND      cmr.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
10347       AND      (
10348                     (
10349                           p_new_val IS NOT NULL
10350                       AND p_old_val IS NOT NULL
10351                       AND p_new_val >= NVL(cla.cmbnd_min_val
10352                                         ,p_new_val)
10353                       AND p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
10354                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
10355                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
10356                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
10357                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
10358                                     -- ceil( NVL(cla.cmbnd_max_val
10359                                     --    ,p_new_val) + 0.001 ))
10360                  OR (
10361                           p_new_val IS NOT NULL
10362                       AND p_old_val IS NOT NULL
10363                       AND (
10364                                p_new_val < NVL(cla.cmbnd_min_val
10365                                             ,p_new_val)
10366                             OR p_new_val >=  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
10367                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
10368                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
10369                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
10370                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
10371                                      --   ceil( NVL(cla.cmbnd_max_val
10372                                      --    ,p_new_val )) + 0.001 )
10373                       AND p_old_val >= NVL(cla.cmbnd_min_val
10374                                         ,p_old_val)
10375                       AND p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
10376                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
10377                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
10378                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
10379                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )  )
10380                                     -- ceil( NVL(cla.cmbnd_max_val
10381                                     --    ,p_old_val))  + 0.001 )
10382                  OR (    p_new_val IS NULL
10383                      AND p_old_val IS NULL));
10384     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
10385     --UNION ALL
10386     CURSOR c2 IS
10387       SELECT   p_pl_id
10388               ,'Y'
10389               ,cla.los_fctr_id
10390               ,cla.age_fctr_id
10391               ,cla.cmbnd_min_val
10392               ,cla.cmbnd_max_val
10393       FROM     ben_cmbn_age_los_fctr cla
10394               --,ben_cmbn_age_los_rt_f cmr
10395               ,ben_elig_cmbn_age_los_prte_f ecp
10396               ,ben_eligy_prfl_f elp
10397               ,ben_vrbl_rt_elig_prfl_f vep
10398               ,ben_vrbl_rt_prfl_f vpf
10399               ,ben_acty_vrbl_rt_f avr
10400               ,ben_acty_base_rt_f abr
10401       WHERE    abr.pl_id = p_pl_id
10402       AND      p_effective_date BETWEEN abr.effective_start_date
10403                    AND abr.effective_end_date
10404       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
10405       AND      p_effective_date BETWEEN avr.effective_start_date
10406                    AND avr.effective_end_date
10407       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
10408       AND      p_effective_date BETWEEN vpf.effective_start_date
10409                    AND vpf.effective_end_date
10410 --      AND      vpf.vrbl_rt_prfl_id = ecp.vrbl_rt_prfl_id
10411       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
10412       AND      p_effective_date BETWEEN vep.effective_start_date
10413                    AND vep.effective_end_date
10414       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
10415       AND      p_effective_date BETWEEN elp.effective_start_date
10416                    AND elp.effective_end_date
10417       AND      ecp.eligy_prfl_id = elp.eligy_prfl_id
10418       AND      p_effective_date BETWEEN ecp.effective_start_date
10419                    AND ecp.effective_end_date
10420       AND      ecp.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
10421       AND      (
10422                     (
10423                           p_new_val IS NOT NULL
10424                       AND p_old_val IS NOT NULL
10425                       AND p_new_val >= NVL(cla.cmbnd_min_val
10426                                         ,p_new_val)
10427                       AND p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
10428                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
10429                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
10430                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
10434                  OR (
10431                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
10432                                     -- ceil( NVL(cla.cmbnd_max_val
10433                                     --    ,p_new_val) + 0.001 ))
10435                           p_new_val IS NOT NULL
10436                       AND p_old_val IS NOT NULL
10437                       AND (
10438                                p_new_val < NVL(cla.cmbnd_min_val
10439                                             ,p_new_val)
10440                             OR p_new_val >=  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
10441                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
10442                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
10443                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
10444                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
10445                                      --   ceil( NVL(cla.cmbnd_max_val
10446                                      --    ,p_new_val )) + 0.001 )
10447                       AND p_old_val >= NVL(cla.cmbnd_min_val
10448                                         ,p_old_val)
10449                       AND p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
10450                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
10451                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
10452                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
10453                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )  )
10454                                     -- ceil( NVL(cla.cmbnd_max_val
10455                                     --    ,p_old_val))  + 0.001 )
10456                  OR (    p_new_val IS NULL
10457                      AND p_old_val IS NULL));
10458     --
10459     --
10460     l_index          PLS_INTEGER;
10461     l_not_hash_found BOOLEAN;
10462     l_c2notfound       BOOLEAN;
10463   --
10464   BEGIN
10465     --
10466     -- hr_utility.set_location ('Entering '||l_package,10);
10467     --
10468     -- Steps to do process
10469     --
10470     -- 1) Try and get value from cache
10471     -- 2) If can get from cache then copy to output record
10472     -- 3) If can't get from cache do db hit and then
10473     --    copy to cache record and then copy to output record.
10474     --
10475     -- Get hashed index value
10476     --
10477     l_index  := MOD(p_pl_id
10478                  ,g_hash_key);
10479     --
10480     IF NOT g_cache_pl_cla_rt_rec.EXISTS(l_index) THEN
10481       --
10482       -- Lets store the hash value in this index
10483       --
10484       RAISE NO_DATA_FOUND;
10485     --
10486     ELSE
10487       --
10488       -- If it does exist make sure its the right one
10489       --
10490       IF g_cache_pl_cla_rt_rec(l_index).id <> p_pl_id THEN
10491         --
10492         -- Loop through the hash using the jump routine to check further
10493         -- indexes
10494         --
10495         l_not_hash_found  := FALSE;
10496         --
10497         WHILE NOT l_not_hash_found LOOP
10498           --
10499           l_index  := l_index + g_hash_jump;
10500           --
10501           -- Check if the hash index exists, if not we can use it
10502           --
10503           IF NOT g_cache_pl_cla_rt_rec.EXISTS(l_index) THEN
10504             --
10505             -- Lets store the hash value in the index
10506             --
10507             RAISE NO_DATA_FOUND;
10508           --
10509           ELSE
10510             --
10511             -- Make sure the index is the correct one
10512             --
10513             IF g_cache_pl_cla_rt_rec(l_index).id = p_pl_id THEN
10514               --
10515               -- We have a match so the hashed value  has been stored before
10516               --
10517               l_not_hash_found  := TRUE;
10518             --
10519             END IF;
10520           --
10521           END IF;
10522         --
10523         END LOOP;
10524       --
10525       END IF;
10526     --
10527     END IF;
10528     --
10529     -- If p_old_val and p_new_val is set this means we are trying to retrieve
10530     -- the correct rate for the calculated value.
10531     -- Previously we just cached the first rate we
10532     -- found since we needed the determination code, the correct age,los code,etc
10533     -- By killing the cache and forcing the value to be removed we cache the
10534     -- correct rate profile for the case we need.
10535     --
10536     IF     p_old_val IS NOT NULL
10537        AND p_new_val IS NOT NULL THEN
10538       --
10539       RAISE NO_DATA_FOUND;
10540     --
10541     END IF;
10542     --
10543     p_rec    := g_cache_pl_cla_rt_rec(l_index);
10544   --
10545   -- hr_utility.set_location ('Leaving '||l_package,10);
10546   --
10547   EXCEPTION
10548     --
10549     WHEN NO_DATA_FOUND THEN
10550       --
10551       -- The record has not been cached yet so lets cache it
10552       --
10553       OPEN c1;
10554       --
10555       FETCH c1 INTO g_cache_pl_cla_rt_rec(l_index);
10556       -- PERFNEW
10557       IF c1%NOTFOUND THEN
10558          --
10559          l_c2notfound := false;
10560          OPEN c2;
10561          FETCH c2 INTO g_cache_pl_cla_rt_rec(l_index);
10562          IF c2%NOTFOUND THEN
10563             --
10564             l_c2notfound := true;
10568          --
10565             --
10566          END IF;
10567          CLOSE c2;
10569       END IF;
10570       -- PERFNEW
10571       IF     p_old_val IS NULL
10572          AND p_new_val IS NULL THEN
10573         --
10574         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
10575           --
10576           if NOT g_cache_pl_cla_rt_rec.EXISTS(l_index) then
10577             g_cache_pl_cla_rt_rec(l_index).id     := p_pl_id;
10578             g_cache_pl_cla_rt_rec(l_index).exist  := 'N';
10579           end if;
10580         --
10581         END IF;
10582       --
10583       END IF;
10584       --
10585       p_rec  := g_cache_pl_cla_rt_rec(l_index);
10586       --
10587       CLOSE c1;
10588   --
10589   END get_comb_pl_rate;
10590 --
10591   PROCEDURE get_comb_oipl_rate(
10592     p_oipl_id           IN            NUMBER
10593    ,p_old_val           IN            NUMBER DEFAULT NULL
10594    ,p_new_val           IN            NUMBER DEFAULT NULL
10595    ,p_business_group_id IN            NUMBER
10596    ,p_effective_date    IN            DATE
10597    ,p_rec               OUT NOCOPY    g_cache_cla_rec_obj) IS
10598     --
10599     l_package        VARCHAR2(80) := g_package || '.get_comb_oipl_rate';
10600     l_old_val_1 NUMBER := p_old_val + 1;
10601     l_new_val_1 NUMBER := p_new_val + 1;
10602     --
10603     l_opt_id    NUMBER;
10604     --
10605     -- Define Cursor
10606     --
10607     CURSOR c1 IS
10608       SELECT   p_oipl_id
10609               ,'Y'
10610               ,cla.los_fctr_id
10611               ,cla.age_fctr_id
10612               ,cla.cmbnd_min_val
10613               ,cla.cmbnd_max_val
10614       FROM     ben_cmbn_age_los_fctr cla
10615               ,ben_cmbn_age_los_rt_f cmr
10616               ,ben_vrbl_rt_prfl_f vpf
10617               ,ben_acty_vrbl_rt_f avr
10618               ,ben_acty_base_rt_f abr
10619       WHERE    ( abr.oipl_id = p_oipl_id
10620       --
10621       --START Option level Rates Enhancements
10622                or ( abr.opt_id = l_opt_id and
10623                      not exists (select null from ben_acty_base_rt_f abr1
10624                      where abr1.oipl_id = p_oipl_id )))
10625       --END Option level Rates Enhancements
10626       --
10627       AND      p_effective_date BETWEEN abr.effective_start_date
10628                    AND abr.effective_end_date
10629       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
10630       AND      p_effective_date BETWEEN avr.effective_start_date
10631                    AND avr.effective_end_date
10632       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
10633       AND      p_effective_date BETWEEN vpf.effective_start_date
10634                    AND vpf.effective_end_date
10635       AND      vpf.vrbl_rt_prfl_id = cmr.vrbl_rt_prfl_id
10636       AND      p_effective_date BETWEEN cmr.effective_start_date
10637                    AND cmr.effective_end_date
10638       AND      cmr.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
10639       AND      (
10640                     (
10641                           p_new_val IS NOT NULL
10642                       AND p_old_val IS NOT NULL
10643                       AND p_new_val >= NVL(cla.cmbnd_min_val
10644                                         ,p_new_val)
10645                       AND p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
10646                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
10647                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
10648                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
10649                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
10650                                     -- ceil( NVL(cla.cmbnd_max_val
10651                                     --  ,p_new_val) + 0.001 ))
10652                  OR (
10653                           p_new_val IS NOT NULL
10654                       AND p_old_val IS NOT NULL
10655                       AND (
10656                                p_new_val < NVL(cla.cmbnd_min_val
10657                                             ,p_new_val)
10658                             OR p_new_val >=  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
10659                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
10660                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
10661                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
10662                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
10663                                      --    ceil( NVL(cla.cmbnd_max_val
10664                                      --    ,p_new_val)) + 0.001 )
10665                       AND p_old_val >= NVL(cla.cmbnd_min_val
10666                                         ,p_old_val)
10667                       AND p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
10668                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
10669                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
10670                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
10671                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )  )
10672                                      -- ceil(NVL(cla.cmbnd_max_val
10673                                      --   ,l_old_val_1)) + 0.001 )
10677     --UNION ALL
10674                  OR (    p_new_val IS NULL
10675                      AND p_old_val IS NULL));
10676     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
10678     CURSOR c2 IS
10679       SELECT   p_oipl_id
10680               ,'Y'
10681               ,cla.los_fctr_id
10682               ,cla.age_fctr_id
10683               ,cla.cmbnd_min_val
10684               ,cla.cmbnd_max_val
10685       FROM     ben_cmbn_age_los_fctr cla
10686               --,ben_cmbn_age_los_rt_f cmr
10687               ,ben_elig_cmbn_age_los_prte_f ecp
10688               ,ben_eligy_prfl_f elp
10689               ,ben_vrbl_rt_elig_prfl_f vep
10690               ,ben_vrbl_rt_prfl_f vpf
10691               ,ben_acty_vrbl_rt_f avr
10692               ,ben_acty_base_rt_f abr
10693       WHERE    ( abr.oipl_id = p_oipl_id
10694       --
10695       --START Option level Rates Enhancements
10696                or ( abr.opt_id = l_opt_id and
10697                      not exists (select null from ben_acty_base_rt_f abr1
10698                      where abr1.oipl_id = p_oipl_id )))
10699       --END Option level Rates Enhancements
10700       --
10701       AND      p_effective_date BETWEEN abr.effective_start_date
10702                    AND abr.effective_end_date
10703       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
10704       AND      p_effective_date BETWEEN avr.effective_start_date
10705                    AND avr.effective_end_date
10706       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
10707       AND      p_effective_date BETWEEN vpf.effective_start_date
10708                    AND vpf.effective_end_date
10709 --      AND      vpf.vrbl_rt_prfl_id = ecp.vrbl_rt_prfl_id
10710       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
10711       AND      p_effective_date BETWEEN vep.effective_start_date
10712                    AND vep.effective_end_date
10713       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
10714       AND      p_effective_date BETWEEN elp.effective_start_date
10715                    AND elp.effective_end_date
10716       AND      ecp.eligy_prfl_id = elp.eligy_prfl_id
10717       AND      p_effective_date BETWEEN ecp.effective_start_date
10718                    AND ecp.effective_end_date
10719       AND      ecp.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
10720       AND      (
10721                     (
10722                           p_new_val IS NOT NULL
10723                       AND p_old_val IS NOT NULL
10724                       AND p_new_val >= NVL(cla.cmbnd_min_val
10725                                         ,p_new_val)
10726                       AND p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
10727                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
10728                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
10729                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
10730                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
10731                                     -- ceil( NVL(cla.cmbnd_max_val
10732                                     --  ,p_new_val) + 0.001 ))
10733                  OR (
10734                           p_new_val IS NOT NULL
10735                       AND p_old_val IS NOT NULL
10736                       AND (
10737                                p_new_val < NVL(cla.cmbnd_min_val
10738                                             ,p_new_val)
10739                             OR p_new_val >=  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
10740                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
10741                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
10742                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
10743                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
10744                                      --    ceil( NVL(cla.cmbnd_max_val
10745                                      --    ,p_new_val)) + 0.001 )
10746                       AND p_old_val >= NVL(cla.cmbnd_min_val
10747                                         ,p_old_val)
10748                       AND p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
10749                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
10750                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
10751                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
10752                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )  )
10753                                      -- ceil(NVL(cla.cmbnd_max_val
10754                                      --   ,l_old_val_1)) + 0.001 )
10755                  OR (    p_new_val IS NULL
10756                      AND p_old_val IS NULL));
10757     --
10758     --
10759     l_index          PLS_INTEGER;
10760     l_not_hash_found BOOLEAN;
10761     l_c2notfound       BOOLEAN;
10762   --
10763   BEGIN
10764     --
10765     -- hr_utility.set_location ('Entering '||l_package,10);
10766     --
10767     -- Steps to do process
10768     --
10769     -- 1) Try and get value from cache
10770     -- 2) If can get from cache then copy to output record
10771     -- 3) If can't get from cache do db hit and then
10772     --    copy to cache record and then copy to output record.
10773     --
10774     -- Get hashed index value
10775     --
10776     l_index  := MOD(p_oipl_id
10777                  ,g_hash_key);
10778     --
10782       --
10779     IF NOT g_cache_oipl_cla_rt_rec.EXISTS(l_index) THEN
10780       --
10781       -- Lets store the hash value in this index
10783       RAISE NO_DATA_FOUND;
10784     --
10785     ELSE
10786       --
10787       -- If it does exist make sure its the right one
10788       --
10789       IF g_cache_oipl_cla_rt_rec(l_index).id <> p_oipl_id THEN
10790         --
10791         -- Loop through the hash using the jump routine to check further
10792         -- indexes
10793         --
10794         l_not_hash_found  := FALSE;
10795         --
10796         WHILE NOT l_not_hash_found LOOP
10797           --
10798           l_index  := l_index + g_hash_jump;
10799           --
10800           -- Check if the hash index exists, if not we can use it
10801           --
10802           IF NOT g_cache_oipl_cla_rt_rec.EXISTS(l_index) THEN
10803             --
10804             -- Lets store the hash value in the index
10805             --
10806             RAISE NO_DATA_FOUND;
10807           --
10808           ELSE
10809             --
10810             -- Make sure the index is the correct one
10811             --
10812             IF g_cache_oipl_cla_rt_rec(l_index).id = p_oipl_id THEN
10813               --
10814               -- We have a match so the hashed value  has been stored before
10815               --
10816               l_not_hash_found  := TRUE;
10817             --
10818             END IF;
10819           --
10820           END IF;
10821         --
10822         END LOOP;
10823       --
10824       END IF;
10825     --
10826     END IF;
10827     --
10828     -- If p_old_val and p_new_val is set this means we are trying to retrieve
10829     -- the correct rate for the calculated value.
10830     -- Previously we just cached the first rate we
10831     -- found since we needed the determination code, the correct age,los code,etc
10832     -- By killing the cache and forcing the value to be removed we cache the
10833     -- correct rate profile for the case we need.
10834     --
10835     IF     p_old_val IS NOT NULL
10836        AND p_new_val IS NOT NULL THEN
10837       --
10838       RAISE NO_DATA_FOUND;
10839     --
10840     END IF;
10841     --
10842     p_rec    := g_cache_oipl_cla_rt_rec(l_index);
10843   --
10844   -- hr_utility.set_location ('Leaving '||l_package,10);
10845   --
10846   EXCEPTION
10847     --
10848     WHEN NO_DATA_FOUND THEN
10849       --
10850       -- The record has not been cached yet so lets cache it
10851       -- Option level rates enhancement
10852       l_opt_id := get_opt_id(p_oipl_id,p_effective_date);
10853       --
10854       OPEN c1;
10855       --
10856       FETCH c1 INTO g_cache_oipl_cla_rt_rec(l_index);
10857       -- PERFNEW
10858       IF c1%NOTFOUND THEN
10859          --
10860          l_c2notfound := false;
10861          OPEN c2;
10862          FETCH c2 INTO g_cache_oipl_cla_rt_rec(l_index);
10863          IF c2%NOTFOUND THEN
10864             --
10865             l_c2notfound := true;
10866             --
10867          END IF;
10868          CLOSE c2;
10869          --
10870       END IF;
10871       -- PERFNEW
10872       IF     p_old_val IS NULL
10873          AND p_new_val IS NULL THEN
10874         --
10875         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
10876           --
10877           if NOT g_cache_plip_cla_rt_rec.EXISTS(l_index) then
10878             g_cache_oipl_cla_rt_rec(l_index).id     := p_oipl_id;
10879             g_cache_oipl_cla_rt_rec(l_index).exist  := 'N';
10880           end if;
10881         --
10882         END IF;
10883       --
10884       END IF;
10885       --
10886       p_rec  := g_cache_oipl_cla_rt_rec(l_index);
10887       --
10888       CLOSE c1;
10889   --
10890   END get_comb_oipl_rate;
10891 --
10892   PROCEDURE get_comb_plip_rate(
10893     p_plip_id           IN            NUMBER
10894    ,p_old_val           IN            NUMBER DEFAULT NULL
10895    ,p_new_val           IN            NUMBER DEFAULT NULL
10896    ,p_business_group_id IN            NUMBER
10897    ,p_effective_date    IN            DATE
10898    ,p_rec               OUT NOCOPY    g_cache_cla_rec_obj) IS
10899     --
10900     l_package        VARCHAR2(80) := g_package || '.get_comb_plip_rate';
10901     l_old_val_1 NUMBER := p_old_val + 1;
10902     l_new_val_1 NUMBER := p_new_val + 1;
10903     --
10904     -- Define Cursor
10905     --
10906     CURSOR c1 IS
10907       SELECT   p_plip_id
10908               ,'Y'
10909               ,cla.los_fctr_id
10910               ,cla.age_fctr_id
10911               ,cla.cmbnd_min_val
10912               ,cla.cmbnd_max_val
10913       FROM     ben_cmbn_age_los_fctr cla
10914               ,ben_cmbn_age_los_rt_f cmr
10915               ,ben_vrbl_rt_prfl_f vpf
10916               ,ben_acty_vrbl_rt_f avr
10917               ,ben_acty_base_rt_f abr
10918       WHERE    abr.plip_id = p_plip_id
10919       AND      p_effective_date BETWEEN abr.effective_start_date
10920                    AND abr.effective_end_date
10921       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
10922       AND      p_effective_date BETWEEN avr.effective_start_date
10923                    AND avr.effective_end_date
10924       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
10925       AND      p_effective_date BETWEEN vpf.effective_start_date
10929                    AND cmr.effective_end_date
10926                    AND vpf.effective_end_date
10927       AND      vpf.vrbl_rt_prfl_id = cmr.vrbl_rt_prfl_id
10928       AND      p_effective_date BETWEEN cmr.effective_start_date
10930       AND      cmr.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
10931       AND      (
10932                     (
10933                           p_new_val IS NOT NULL
10934                       AND p_old_val IS NOT NULL
10935                       AND p_new_val >= NVL(cla.cmbnd_min_val
10936                                         ,p_new_val)
10937                       AND p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
10938                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
10939                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
10940                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
10941                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
10942                                      -- ceil( NVL(cla.cmbnd_max_val
10943                                      --   ,l_new_val_1) + 0.001 ))
10944                  OR (
10945                           p_new_val IS NOT NULL
10946                       AND p_old_val IS NOT NULL
10947                       AND (
10948                                p_new_val < NVL(cla.cmbnd_min_val
10949                                             ,p_new_val)
10950                             OR p_new_val >=  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
10951                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
10952                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
10953                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
10954                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
10955                                      --   ceil(NVL(cla.cmbnd_max_val
10956                                      --    ,l_new_val_1)) + 0.001 )
10957                       AND p_old_val >= NVL(cla.cmbnd_min_val
10958                                         ,p_old_val)
10959                       AND p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
10960                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
10961                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
10962                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
10963                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )  )
10964                                      -- ceil( NVL(cla.cmbnd_max_val
10965                                      --   ,l_old_val_1)) + 0.001 )
10966                  OR (    p_new_val IS NULL
10967                      AND p_old_val IS NULL));
10968     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
10969     --UNION ALL
10970     CURSOR c2 IS
10971       SELECT   p_plip_id
10972               ,'Y'
10973               ,cla.los_fctr_id
10974               ,cla.age_fctr_id
10975               ,cla.cmbnd_min_val
10976               ,cla.cmbnd_max_val
10977       FROM     ben_cmbn_age_los_fctr cla
10978               --,ben_cmbn_age_los_rt_f cmr
10979               ,ben_elig_cmbn_age_los_prte_f ecp
10980               ,ben_eligy_prfl_f elp
10981               ,ben_vrbl_rt_elig_prfl_f vep
10982               ,ben_vrbl_rt_prfl_f vpf
10983               ,ben_acty_vrbl_rt_f avr
10984               ,ben_acty_base_rt_f abr
10985       WHERE    abr.plip_id = p_plip_id
10986       AND      p_effective_date BETWEEN abr.effective_start_date
10987                    AND abr.effective_end_date
10988       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
10989       AND      p_effective_date BETWEEN avr.effective_start_date
10990                    AND avr.effective_end_date
10991       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
10992       AND      p_effective_date BETWEEN vpf.effective_start_date
10993                    AND vpf.effective_end_date
10994 --      AND      vpf.vrbl_rt_prfl_id = ecp.vrbl_rt_prfl_id
10995       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
10996       AND      p_effective_date BETWEEN vep.effective_start_date
10997                    AND vep.effective_end_date
10998       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
10999       AND      p_effective_date BETWEEN elp.effective_start_date
11000                    AND elp.effective_end_date
11001       AND      ecp.eligy_prfl_id = elp.eligy_prfl_id
11002       AND      p_effective_date BETWEEN ecp.effective_start_date
11003                    AND ecp.effective_end_date
11004       AND      ecp.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
11005       AND      (
11006                     (
11007                           p_new_val IS NOT NULL
11008                       AND p_old_val IS NOT NULL
11009                       AND p_new_val >= NVL(cla.cmbnd_min_val
11010                                         ,p_new_val)
11011                       AND p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
11012                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
11013                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
11014                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
11015                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
11016                                      -- ceil( NVL(cla.cmbnd_max_val
11017                                      --   ,l_new_val_1) + 0.001 ))
11021                       AND (
11018                  OR (
11019                           p_new_val IS NOT NULL
11020                       AND p_old_val IS NOT NULL
11022                                p_new_val < NVL(cla.cmbnd_min_val
11023                                             ,p_new_val)
11024                             OR p_new_val >=  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
11025                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
11026                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
11027                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
11028                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
11029                                      --   ceil(NVL(cla.cmbnd_max_val
11030                                      --    ,l_new_val_1)) + 0.001 )
11031                       AND p_old_val >= NVL(cla.cmbnd_min_val
11032                                         ,p_old_val)
11033                       AND p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
11034                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
11035                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
11036                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
11037                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )  )
11038                                      -- ceil( NVL(cla.cmbnd_max_val
11039                                      --   ,l_old_val_1)) + 0.001 )
11040                  OR (    p_new_val IS NULL
11041                      AND p_old_val IS NULL));
11042     --
11043     l_index          PLS_INTEGER;
11044     l_not_hash_found BOOLEAN;
11045     l_c2notfound       BOOLEAN;
11046   --
11047   BEGIN
11048     --
11049     -- hr_utility.set_location ('Entering '||l_package,10);
11050     --
11051     -- Steps to do process
11052     --
11053     -- 1) Try and get value from cache
11054     -- 2) If can get from cache then copy to output record
11055     -- 3) If can't get from cache do db hit and then
11056     --    copy to cache record and then copy to output record.
11057     --
11058     -- Get hashed index value
11059     --
11060     l_index  := MOD(p_plip_id
11061                  ,g_hash_key);
11062     --
11063     IF NOT g_cache_plip_cla_rt_rec.EXISTS(l_index) THEN
11064       --
11065       -- Lets store the hash value in this index
11066       --
11067       RAISE NO_DATA_FOUND;
11068     --
11069     ELSE
11070       --
11071       -- If it does exist make sure its the right one
11072       --
11073       IF g_cache_plip_cla_rt_rec(l_index).id <> p_plip_id THEN
11074         --
11075         -- Loop through the hash using the jump routine to check further
11076         -- indexes
11077         --
11078         l_not_hash_found  := FALSE;
11079         --
11080         WHILE NOT l_not_hash_found LOOP
11081           --
11082           l_index  := l_index + g_hash_jump;
11083           --
11084           -- Check if the hash index exists, if not we can use it
11085           --
11086           IF NOT g_cache_plip_cla_rt_rec.EXISTS(l_index) THEN
11087             --
11088             -- Lets store the hash value in the index
11089             --
11090             RAISE NO_DATA_FOUND;
11091           --
11092           ELSE
11093             --
11094             -- Make sure the index is the correct one
11095             --
11096             IF g_cache_plip_cla_rt_rec(l_index).id = p_plip_id THEN
11097               --
11098               -- We have a match so the hashed value  has been stored before
11099               --
11100               l_not_hash_found  := TRUE;
11101             --
11102             END IF;
11103           --
11104           END IF;
11105         --
11106         END LOOP;
11107       --
11108       END IF;
11109     --
11110     END IF;
11111     --
11112     -- If p_old_val and p_new_val is set this means we are trying to retrieve
11113     -- the correct rate for the calculated value.
11114     -- Previously we just cached the first rate we
11115     -- found since we needed the determination code, the correct age,los code,etc
11116     -- By killing the cache and forcing the value to be removed we cache the
11117     -- correct rate profile for the case we need.
11118     --
11119     IF     p_old_val IS NOT NULL
11120        AND p_new_val IS NOT NULL THEN
11121       --
11122       RAISE NO_DATA_FOUND;
11123     --
11124     END IF;
11125     --
11126     p_rec    := g_cache_plip_cla_rt_rec(l_index);
11127   --
11128   -- hr_utility.set_location ('Leaving '||l_package,10);
11129   --
11130   EXCEPTION
11131     --
11132     WHEN NO_DATA_FOUND THEN
11133       --
11134       -- The record has not been cached yet so lets cache it
11135       --
11136       OPEN c1;
11137       --
11138       FETCH c1 INTO g_cache_plip_cla_rt_rec(l_index);
11139       -- PERFNEW
11140       IF c1%NOTFOUND THEN
11141          --
11142          l_c2notfound := false;
11143          OPEN c2;
11144          FETCH c2 INTO g_cache_plip_cla_rt_rec(l_index);
11145          IF c2%NOTFOUND THEN
11146             --
11147             l_c2notfound := true;
11148             --
11149          END IF;
11150          CLOSE c2;
11151          --
11152       END IF;
11153       -- PERFNEW
11154       IF     p_old_val IS NULL
11158           --
11155          AND p_new_val IS NULL THEN
11156         --
11157         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
11159           if NOT g_cache_plip_cla_rt_rec.EXISTS(l_index) then
11160             g_cache_plip_cla_rt_rec(l_index).id     := p_plip_id;
11161             g_cache_plip_cla_rt_rec(l_index).exist  := 'N';
11162           end if;
11163         --
11164         END IF;
11165       --
11166       END IF;
11167       --
11168       p_rec  := g_cache_plip_cla_rt_rec(l_index);
11169       --
11170       CLOSE c1;
11171   --
11172   END get_comb_plip_rate;
11173 --
11174   PROCEDURE get_comb_ptip_rate(
11175     p_ptip_id           IN            NUMBER
11176    ,p_old_val           IN            NUMBER DEFAULT NULL
11177    ,p_new_val           IN            NUMBER DEFAULT NULL
11178    ,p_business_group_id IN            NUMBER
11179    ,p_effective_date    IN            DATE
11180    ,p_rec               OUT NOCOPY    g_cache_cla_rec_obj) IS
11181     --
11182     l_package        VARCHAR2(80) := g_package || '.get_comb_ptip_rate';
11183     l_old_val_1 NUMBER := p_old_val + 1;
11184     l_new_val_1 NUMBER := p_new_val + 1;
11185     --
11186     -- Define Cursor
11187     --
11188     CURSOR c1 IS
11189       SELECT   p_ptip_id
11190               ,'Y'
11191               ,cla.los_fctr_id
11192               ,cla.age_fctr_id
11193               ,cla.cmbnd_min_val
11194               ,cla.cmbnd_max_val
11195       FROM     ben_cmbn_age_los_fctr cla
11196               ,ben_cmbn_age_los_rt_f cmr
11197               ,ben_vrbl_rt_prfl_f vpf
11198               ,ben_acty_vrbl_rt_f avr
11199               ,ben_acty_base_rt_f abr
11200       WHERE    abr.ptip_id = p_ptip_id
11201       AND      p_effective_date BETWEEN abr.effective_start_date
11202                    AND abr.effective_end_date
11203       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
11204       AND      p_effective_date BETWEEN avr.effective_start_date
11205                    AND avr.effective_end_date
11206       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
11207       AND      p_effective_date BETWEEN vpf.effective_start_date
11208                    AND vpf.effective_end_date
11209       AND      vpf.vrbl_rt_prfl_id = cmr.vrbl_rt_prfl_id
11210       AND      p_effective_date BETWEEN cmr.effective_start_date
11211                    AND cmr.effective_end_date
11212       AND      cmr.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
11213       AND      (
11214                     (
11215                           p_new_val IS NOT NULL
11216                       AND p_old_val IS NOT NULL
11217                       AND p_new_val >= NVL(cla.cmbnd_min_val
11218                                         ,p_new_val)
11219                       AND p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
11220                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
11221                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
11222                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
11223                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
11224                                    -- ceil( NVL(cla.cmbnd_max_val
11225                                    --     ,p_new_val) + 0.001 ))
11226                  OR (
11227                           p_new_val IS NOT NULL
11228                       AND p_old_val IS NOT NULL
11229                       AND (
11230                                p_new_val < NVL(cla.cmbnd_min_val
11231                                             ,p_new_val)
11232                             OR p_new_val >=  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
11233                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
11234                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
11235                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
11236                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
11237                                      --    ceil( NVL(cla.cmbnd_max_val
11238                                      --    ,p_new_val)) + 0.001 )
11239                       AND p_old_val >= NVL(cla.cmbnd_min_val
11240                                         ,p_old_val)
11241                       AND p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
11242                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
11243                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
11244                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
11245                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )  )
11246                                      -- ceil( NVL(cla.cmbnd_max_val
11247                                      --   ,p_old_val))  + 0.001 )
11248                  OR (    p_new_val IS NULL
11249                      AND p_old_val IS NULL));
11250     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
11251     --UNION ALL
11252     CURSOR c2 IS
11253       SELECT   p_ptip_id
11254               ,'Y'
11255               ,cla.los_fctr_id
11256               ,cla.age_fctr_id
11257               ,cla.cmbnd_min_val
11258               ,cla.cmbnd_max_val
11259       FROM     ben_cmbn_age_los_fctr cla
11260               --,ben_cmbn_age_los_rt_f cmr
11264               ,ben_vrbl_rt_prfl_f vpf
11261               ,ben_elig_cmbn_age_los_prte_f ecp
11262               ,ben_eligy_prfl_f elp
11263               ,ben_vrbl_rt_elig_prfl_f vep
11265               ,ben_acty_vrbl_rt_f avr
11266               ,ben_acty_base_rt_f abr
11267       WHERE    abr.ptip_id = p_ptip_id
11268       AND      p_effective_date BETWEEN abr.effective_start_date
11269                    AND abr.effective_end_date
11270       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
11271       AND      p_effective_date BETWEEN avr.effective_start_date
11272                    AND avr.effective_end_date
11273       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
11274       AND      p_effective_date BETWEEN vpf.effective_start_date
11275                    AND vpf.effective_end_date
11276 --      AND      vpf.vrbl_rt_prfl_id = ecp.vrbl_rt_prfl_id
11277       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
11278       AND      p_effective_date BETWEEN vep.effective_start_date
11279                    AND vep.effective_end_date
11280       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
11281       AND      p_effective_date BETWEEN elp.effective_start_date
11282                    AND elp.effective_end_date
11283       AND      ecp.eligy_prfl_id = elp.eligy_prfl_id
11284       AND      p_effective_date BETWEEN ecp.effective_start_date
11285                    AND ecp.effective_end_date
11286       AND      ecp.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
11287       AND      (
11288                     (
11289                           p_new_val IS NOT NULL
11290                       AND p_old_val IS NOT NULL
11291                       AND p_new_val >= NVL(cla.cmbnd_min_val
11292                                         ,p_new_val)
11293                       AND p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
11294                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
11295                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
11296                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
11297                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
11298                                    -- ceil( NVL(cla.cmbnd_max_val
11299                                    --     ,p_new_val) + 0.001 ))
11300                  OR (
11301                           p_new_val IS NOT NULL
11302                       AND p_old_val IS NOT NULL
11303                       AND (
11304                                p_new_val < NVL(cla.cmbnd_min_val
11305                                             ,p_new_val)
11306                             OR p_new_val >=  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
11307                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
11308                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
11309                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
11310                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
11311                                      --    ceil( NVL(cla.cmbnd_max_val
11312                                      --    ,p_new_val)) + 0.001 )
11313                       AND p_old_val >= NVL(cla.cmbnd_min_val
11314                                         ,p_old_val)
11315                       AND p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
11316                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
11317                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
11318                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
11319                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )  )
11320                                      -- ceil( NVL(cla.cmbnd_max_val
11321                                      --   ,p_old_val))  + 0.001 )
11322                  OR (    p_new_val IS NULL
11323                      AND p_old_val IS NULL));
11324     --
11325     --
11326     l_index          PLS_INTEGER;
11327     l_not_hash_found BOOLEAN;
11328     l_c2notfound       BOOLEAN;
11329   --
11330   BEGIN
11331     --
11332     -- hr_utility.set_location ('Entering '||l_package,10);
11333     --
11334     -- Steps to do process
11335     --
11336     -- 1) Try and get value from cache
11337     -- 2) If can get from cache then copy to output record
11338     -- 3) If can't get from cache do db hit and then
11339     --    copy to cache record and then copy to output record.
11340     --
11341     -- Get hashed index value
11342     --
11343     l_index  := MOD(p_ptip_id
11344                  ,g_hash_key);
11345     --
11346     IF NOT g_cache_ptip_cla_rt_rec.EXISTS(l_index) THEN
11347       --
11348       -- Lets store the hash value in this index
11349       --
11350       RAISE NO_DATA_FOUND;
11351     --
11352     ELSE
11353       --
11354       -- If it does exist make sure its the right one
11355       --
11356       IF g_cache_ptip_cla_rt_rec(l_index).id <> p_ptip_id THEN
11357         --
11358         -- Loop through the hash using the jump routine to check further
11359         -- indexes
11360         --
11361         l_not_hash_found  := FALSE;
11362         --
11363         WHILE NOT l_not_hash_found LOOP
11364           --
11365           l_index  := l_index + g_hash_jump;
11366           --
11367           -- Check if the hash index exists, if not we can use it
11368           --
11369           IF NOT g_cache_ptip_cla_rt_rec.EXISTS(l_index) THEN
11373             RAISE NO_DATA_FOUND;
11370             --
11371             -- Lets store the hash value in the index
11372             --
11374           --
11375           ELSE
11376             --
11377             -- Make sure the index is the correct one
11378             --
11379             IF g_cache_ptip_cla_rt_rec(l_index).id = p_ptip_id THEN
11380               --
11381               -- We have a match so the hashed value  has been stored before
11382               --
11383               l_not_hash_found  := TRUE;
11384             --
11385             END IF;
11386           --
11387           END IF;
11388         --
11389         END LOOP;
11390       --
11391       END IF;
11392     --
11393     END IF;
11394     --
11395     -- If p_old_val and p_new_val is set this means we are trying to retrieve
11396     -- the correct rate for the calculated value.
11397     -- Previously we just cached the first rate we
11398     -- found since we needed the determination code, the correct age,los code,etc
11399     -- By killing the cache and forcing the value to be removed we cache the
11400     -- correct rate profile for the case we need.
11401     --
11402     IF     p_old_val IS NOT NULL
11403        AND p_new_val IS NOT NULL THEN
11404       --
11405       RAISE NO_DATA_FOUND;
11406     --
11407     END IF;
11408     --
11409     p_rec    := g_cache_ptip_cla_rt_rec(l_index);
11410   --
11411   -- hr_utility.set_location ('Leaving '||l_package,10);
11412   --
11413   EXCEPTION
11414     --
11415     WHEN NO_DATA_FOUND THEN
11416       --
11417       -- The record has not been cached yet so lets cache it
11418       --
11419       OPEN c1;
11420       --
11421       FETCH c1 INTO g_cache_ptip_cla_rt_rec(l_index);
11422       -- PERFNEW
11423       IF c1%NOTFOUND THEN
11424          --
11425          l_c2notfound := false;
11426          OPEN c2;
11427          FETCH c2 INTO g_cache_ptip_cla_rt_rec(l_index);
11428          IF c2%NOTFOUND THEN
11429             --
11430             l_c2notfound := true;
11431             --
11432          END IF;
11433          CLOSE c2;
11434          --
11435       END IF;
11436       -- PERFNEW
11437       IF     p_old_val IS NULL
11438          AND p_new_val IS NULL THEN
11439         --
11440         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
11441           --
11442           if NOT g_cache_ptip_cla_rt_rec.EXISTS(l_index) then
11443             g_cache_ptip_cla_rt_rec(l_index).id     := p_ptip_id;
11444             g_cache_ptip_cla_rt_rec(l_index).exist  := 'N';
11445           end if;
11446         --
11447         END IF;
11448       --
11449       END IF;
11450       --
11451       p_rec  := g_cache_ptip_cla_rt_rec(l_index);
11452       --
11453       CLOSE c1;
11454   --
11455   END get_comb_ptip_rate;
11456 --
11457   PROCEDURE get_comb_oiplip_rate(
11458     p_oiplip_id         IN            NUMBER
11459    ,p_old_val           IN            NUMBER DEFAULT NULL
11460    ,p_new_val           IN            NUMBER DEFAULT NULL
11461    ,p_business_group_id IN            NUMBER
11462    ,p_effective_date    IN            DATE
11463    ,p_rec               OUT NOCOPY    g_cache_cla_rec_obj) IS
11464     --
11465     l_package        VARCHAR2(80) := g_package || '.get_comb_oiplip_rate';
11466     l_old_val_1 NUMBER := p_old_val + 1;
11467     l_new_val_1 NUMBER := p_new_val + 1;
11468     --
11469     -- Define Cursor
11470     --
11471     CURSOR c1 IS
11472       SELECT   p_oiplip_id
11473               ,'Y'
11474               ,cla.los_fctr_id
11475               ,cla.age_fctr_id
11476               ,cla.cmbnd_min_val
11477               ,cla.cmbnd_max_val
11478       FROM     ben_cmbn_age_los_fctr cla
11479               ,ben_cmbn_age_los_rt_f cmr
11480               ,ben_vrbl_rt_prfl_f vpf
11481               ,ben_acty_vrbl_rt_f avr
11482               ,ben_acty_base_rt_f abr
11483       WHERE    abr.oiplip_id = p_oiplip_id
11484       AND      p_effective_date BETWEEN abr.effective_start_date
11485                    AND abr.effective_end_date
11486       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
11487       AND      p_effective_date BETWEEN avr.effective_start_date
11488                    AND avr.effective_end_date
11489       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
11490       AND      p_effective_date BETWEEN vpf.effective_start_date
11491                    AND vpf.effective_end_date
11492       AND      vpf.vrbl_rt_prfl_id = cmr.vrbl_rt_prfl_id
11493       AND      p_effective_date BETWEEN cmr.effective_start_date
11494                    AND cmr.effective_end_date
11495       AND      cmr.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
11496       AND      (
11497                     (
11498                           p_new_val IS NOT NULL
11499                       AND p_old_val IS NOT NULL
11500                       AND p_new_val >= NVL(cla.cmbnd_min_val
11501                                         ,p_new_val)
11502                       AND p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
11503                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
11504                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
11505                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
11509                  OR (
11506                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
11507                                     -- ceil( NVL(cla.cmbnd_max_val
11508                                     --    ,p_new_val) + 0.001 ))
11510                           p_new_val IS NOT NULL
11511                       AND p_old_val IS NOT NULL
11512                       AND (
11513                                p_new_val < NVL(cla.cmbnd_min_val
11514                                             ,p_new_val)
11515                             OR p_new_val >=  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
11516                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
11517                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
11518                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
11519                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
11520                                      --   ceil( NVL(cla.cmbnd_max_val
11521                                      --    ,p_new_val)) + 0.001 )
11522                       AND p_old_val >= NVL(cla.cmbnd_min_val
11523                                         ,p_old_val)
11524                       AND p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
11525                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
11526                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
11527                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
11528                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )  )
11529                                      -- ceil( NVL(cla.cmbnd_max_val
11530                                      --   ,p_old_val)) + 0.001 )
11531                  OR (    p_new_val IS NULL
11532                      AND p_old_val IS NULL));
11533     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
11534     --UNION ALL
11535     CURSOR c2 IS
11536       SELECT   p_oiplip_id
11537               ,'Y'
11538               ,cla.los_fctr_id
11539               ,cla.age_fctr_id
11540               ,cla.cmbnd_min_val
11541               ,cla.cmbnd_max_val
11542       FROM     ben_cmbn_age_los_fctr cla
11543               --,ben_cmbn_age_los_rt_f cmr
11544               ,ben_elig_cmbn_age_los_prte_f ecp
11545               ,ben_eligy_prfl_f elp
11546               ,ben_vrbl_rt_elig_prfl_f vep
11547               ,ben_vrbl_rt_prfl_f vpf
11548               ,ben_acty_vrbl_rt_f avr
11549               ,ben_acty_base_rt_f abr
11550       WHERE    abr.oiplip_id = p_oiplip_id
11551       AND      p_effective_date BETWEEN abr.effective_start_date
11552                    AND abr.effective_end_date
11553       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
11554       AND      p_effective_date BETWEEN avr.effective_start_date
11555                    AND avr.effective_end_date
11556       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
11557       AND      p_effective_date BETWEEN vpf.effective_start_date
11558                    AND vpf.effective_end_date
11559 --      AND      vpf.vrbl_rt_prfl_id = ecp.vrbl_rt_prfl_id
11560       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
11561       AND      p_effective_date BETWEEN vep.effective_start_date
11562                    AND vep.effective_end_date
11563       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
11564       AND      p_effective_date BETWEEN elp.effective_start_date
11565                    AND elp.effective_end_date
11566       AND      ecp.eligy_prfl_id = elp.eligy_prfl_id
11567       AND      p_effective_date BETWEEN ecp.effective_start_date
11568                    AND ecp.effective_end_date
11569       AND      ecp.cmbn_age_los_fctr_id = cla.cmbn_age_los_fctr_id
11570       AND      (
11571                     (
11572                           p_new_val IS NOT NULL
11573                       AND p_old_val IS NOT NULL
11574                       AND p_new_val >= NVL(cla.cmbnd_min_val
11575                                         ,p_new_val)
11576                       AND p_new_val <  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
11577                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
11578                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
11579                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
11580                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
11581                                     -- ceil( NVL(cla.cmbnd_max_val
11582                                     --    ,p_new_val) + 0.001 ))
11583                  OR (
11584                           p_new_val IS NOT NULL
11585                       AND p_old_val IS NOT NULL
11586                       AND (
11587                                p_new_val < NVL(cla.cmbnd_min_val
11588                                             ,p_new_val)
11589                             OR p_new_val >=  decode(nvl(cla.cmbnd_max_val,p_new_val) ,
11590                                     trunc(nvl(cla.cmbnd_max_val,p_new_val))
11591                      ,decode(nvl(cla.cmbnd_min_val,p_new_val), trunc(nvl(cla.cmbnd_min_val,p_new_val)),
11592                       nvl(cla.cmbnd_max_val,p_new_val)+1,nvl(cla.cmbnd_max_val,p_new_val)+0.000000001),
11593                       nvl(cla.cmbnd_max_val,p_new_val)+0.000000001 )  )
11594                                      --   ceil( NVL(cla.cmbnd_max_val
11595                                      --    ,p_new_val)) + 0.001 )
11596                       AND p_old_val >= NVL(cla.cmbnd_min_val
11600                      ,decode(nvl(cla.cmbnd_min_val,p_old_val), trunc(nvl(cla.cmbnd_min_val,p_old_val)),
11597                                         ,p_old_val)
11598                       AND p_old_val <  decode(nvl(cla.cmbnd_max_val,p_old_val) ,
11599                                     trunc(nvl(cla.cmbnd_max_val,p_old_val))
11601                       nvl(cla.cmbnd_max_val,p_old_val)+1,nvl(cla.cmbnd_max_val,p_old_val)+0.000000001),
11602                       nvl(cla.cmbnd_max_val,p_old_val)+0.000000001 )  )
11603                                      -- ceil( NVL(cla.cmbnd_max_val
11604                                      --   ,p_old_val)) + 0.001 )
11605                  OR (    p_new_val IS NULL
11606                      AND p_old_val IS NULL));
11607     --
11608     --
11609     l_index          PLS_INTEGER;
11610     l_not_hash_found BOOLEAN;
11611     l_c2notfound       BOOLEAN;
11612   --
11613   BEGIN
11614     --
11615     -- hr_utility.set_location ('Entering '||l_package,10);
11616     --
11617     -- Steps to do process
11618     --
11619     -- 1) Try and get value from cache
11620     -- 2) If can get from cache then copy to output record
11621     -- 3) If can't get from cache do db hit and then
11622     --    copy to cache record and then copy to output record.
11623     --
11624     -- Get hashed index value
11625     --
11626     l_index  := MOD(p_oiplip_id
11627                  ,g_hash_key);
11628     --
11629     IF NOT g_cache_oiplip_cla_rt_rec.EXISTS(l_index) THEN
11630       --
11631       -- Lets store the hash value in this index
11632       --
11633       RAISE NO_DATA_FOUND;
11634     --
11635     ELSE
11636       --
11637       -- If it does exist make sure its the right one
11638       --
11639       IF g_cache_oiplip_cla_rt_rec(l_index).id <> p_oiplip_id THEN
11640         --
11641         -- Loop through the hash using the jump routine to check further
11642         -- indexes
11643         --
11644         l_not_hash_found  := FALSE;
11645         --
11646         WHILE NOT l_not_hash_found LOOP
11647           --
11648           l_index  := l_index + g_hash_jump;
11649           --
11650           -- Check if the hash index exists, if not we can use it
11651           --
11652           IF NOT g_cache_oiplip_cla_rt_rec.EXISTS(l_index) THEN
11653             --
11654             -- Lets store the hash value in the index
11655             --
11656             RAISE NO_DATA_FOUND;
11657           --
11658           ELSE
11659             --
11660             -- Make sure the index is the correct one
11661             --
11662             IF g_cache_oiplip_cla_rt_rec(l_index).id = p_oiplip_id THEN
11663               --
11664               -- We have a match so the hashed value  has been stored before
11665               --
11666               l_not_hash_found  := TRUE;
11667             --
11668             END IF;
11669           --
11670           END IF;
11671         --
11672         END LOOP;
11673       --
11674       END IF;
11675     --
11676     END IF;
11677     --
11678     -- If p_old_val and p_new_val is set this means we are trying to retrieve
11679     -- the correct rate for the calculated value.
11680     -- Previously we just cached the first rate we
11681     -- found since we needed the determination code, the correct age,los code,etc
11682     -- By killing the cache and forcing the value to be removed we cache the
11683     -- correct rate profile for the case we need.
11684     --
11685     IF     p_old_val IS NOT NULL
11686        AND p_new_val IS NOT NULL THEN
11687       --
11688       RAISE NO_DATA_FOUND;
11689     --
11690     END IF;
11691     --
11692     p_rec    := g_cache_oiplip_cla_rt_rec(l_index);
11693   --
11694   -- hr_utility.set_location ('Leaving '||l_package,10);
11695   --
11696   EXCEPTION
11697     --
11698     WHEN NO_DATA_FOUND THEN
11699       --
11700       -- The record has not been cached yet so lets cache it
11701       --
11702       OPEN c1;
11703       --
11704       FETCH c1 INTO g_cache_oiplip_cla_rt_rec(l_index);
11705       -- PERFNEW
11706       IF c1%NOTFOUND THEN
11707          --
11708          l_c2notfound := false;
11709          OPEN c2;
11710          FETCH c2 INTO g_cache_oiplip_cla_rt_rec(l_index);
11711          IF c2%NOTFOUND THEN
11712             --
11713             l_c2notfound := true;
11714             --
11715          END IF;
11716          CLOSE c2;
11717          --
11718       END IF;
11719       -- PERFNEW
11720       IF     p_old_val IS NULL
11721          AND p_new_val IS NULL THEN
11722         --
11723         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
11724           --
11725           if NOT g_cache_oiplip_cla_rt_rec.EXISTS(l_index) then
11726             g_cache_oiplip_cla_rt_rec(l_index).id     := p_oiplip_id;
11727             g_cache_oiplip_cla_rt_rec(l_index).exist  := 'N';
11728           end if;
11729         --
11730         END IF;
11731       --
11732       END IF;
11733       --
11734       p_rec  := g_cache_oiplip_cla_rt_rec(l_index);
11735       --
11736       CLOSE c1;
11737   --
11738   END get_comb_oiplip_rate;
11739 --
11740   PROCEDURE get_comb_rate(
11741     p_pgm_id            IN            NUMBER
11742    ,p_pl_id             IN            NUMBER
11743    ,p_oipl_id           IN            NUMBER
11747    ,p_old_val           IN            NUMBER DEFAULT NULL
11744    ,p_plip_id           IN            NUMBER
11745    ,p_ptip_id           IN            NUMBER
11746    ,p_oiplip_id         IN            NUMBER
11748    ,p_new_val           IN            NUMBER DEFAULT NULL
11749    ,p_business_group_id IN            NUMBER
11750    ,p_effective_date    IN            DATE
11751    ,p_rec               OUT NOCOPY    g_cache_cla_rec_obj) IS
11752     --
11753     l_package VARCHAR2(80) := g_package || '.get_comb_rate';
11754   --
11755   BEGIN
11756     --
11757     -- hr_utility.set_location ('Entering '||l_package,10);
11758     --
11759     -- Derive which data type we are dealing with
11760     --
11761     IF p_pgm_id IS NOT NULL THEN
11762       --
11763       get_comb_pgm_rate(p_pgm_id=> p_pgm_id
11764        ,p_old_val           => p_old_val
11765        ,p_new_val           => p_new_val
11766        ,p_business_group_id => p_business_group_id
11767        ,p_effective_date    => p_effective_date
11768        ,p_rec               => p_rec);
11769     --
11770     ELSIF p_pl_id IS NOT NULL THEN
11771       --
11772       get_comb_pl_rate(p_pl_id=> p_pl_id
11773        ,p_old_val           => p_old_val
11774        ,p_new_val           => p_new_val
11775        ,p_business_group_id => p_business_group_id
11776        ,p_effective_date    => p_effective_date
11777        ,p_rec               => p_rec);
11778     --
11779     ELSIF p_oipl_id IS NOT NULL THEN
11780       --
11781       get_comb_oipl_rate(p_oipl_id=> p_oipl_id
11782        ,p_old_val           => p_old_val
11783        ,p_new_val           => p_new_val
11784        ,p_business_group_id => p_business_group_id
11785        ,p_effective_date    => p_effective_date
11786        ,p_rec               => p_rec);
11787     --
11788     ELSIF p_plip_id IS NOT NULL THEN
11789       --
11790       get_comb_plip_rate(p_plip_id=> p_plip_id
11791        ,p_old_val           => p_old_val
11792        ,p_new_val           => p_new_val
11793        ,p_business_group_id => p_business_group_id
11794        ,p_effective_date    => p_effective_date
11795        ,p_rec               => p_rec);
11796     --
11797     ELSIF p_ptip_id IS NOT NULL THEN
11798       --
11799       get_comb_ptip_rate(p_ptip_id=> p_ptip_id
11800        ,p_old_val           => p_old_val
11801        ,p_new_val           => p_new_val
11802        ,p_business_group_id => p_business_group_id
11803        ,p_effective_date    => p_effective_date
11804        ,p_rec               => p_rec);
11805     --
11806     ELSIF p_oiplip_id IS NOT NULL THEN
11807       --
11808       get_comb_oiplip_rate(p_oiplip_id=> p_oiplip_id
11809        ,p_old_val           => p_old_val
11810        ,p_new_val           => p_new_val
11811        ,p_business_group_id => p_business_group_id
11812        ,p_effective_date    => p_effective_date
11813        ,p_rec               => p_rec);
11814     --
11815     END IF;
11816   --
11817   -- hr_utility.set_location ('Leaving '||l_package,10);
11818   --
11819   END get_comb_rate;
11820 --
11821   PROCEDURE get_pct_pgm_elig(
11822     p_pgm_id            IN            NUMBER
11823    ,p_old_val           in            number  default null
11824    ,p_new_val           in            number  default null
11825    ,p_business_group_id IN            NUMBER
11826    ,p_effective_date    IN            DATE
11827    ,p_rec               OUT NOCOPY    g_cache_pff_rec_obj) IS
11828     --
11829     l_package        VARCHAR2(80) := g_package || '.get_pct_pgm_elig';
11830     --
11831     -- Define Cursor
11832     --
11833     CURSOR c1 IS
11834       SELECT   p_pgm_id
11835               ,'Y'
11836               ,pff.use_prmry_asnt_only_flag
11837               ,pff.use_sum_of_all_asnts_flag
11838               ,pff.rndg_cd
11839               ,pff.rndg_rl
11840               ,pff.mn_pct_val
11841               ,pff.mx_pct_val
11842       FROM     ben_pct_fl_tm_fctr pff
11843               ,ben_elig_pct_fl_tm_prte_f epf
11844               ,ben_eligy_prfl_f elp
11845               ,ben_prtn_elig_prfl_f cep
11846               ,ben_prtn_elig_f epa
11847       WHERE    epa.pgm_id = p_pgm_id
11848       AND      p_effective_date BETWEEN epa.effective_start_date
11849                    AND epa.effective_end_date
11850       AND      epa.prtn_elig_id = cep.prtn_elig_id
11851       AND      p_effective_date BETWEEN cep.effective_start_date
11852                    AND cep.effective_end_date
11853       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
11854       AND      p_effective_date BETWEEN elp.effective_start_date
11855                    AND elp.effective_end_date
11856       AND      epf.eligy_prfl_id = elp.eligy_prfl_id
11857       AND      p_effective_date BETWEEN epf.effective_start_date
11858                    AND epf.effective_end_date
11859       AND      epf.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
11860       AND     (
11861                  (
11862                    p_new_val IS NOT NULL
11863                    AND p_old_val IS NOT NULL
11864                    AND p_new_val >= NVL(pff.mn_pct_val ,p_new_val)
11865                    and p_new_val <  decode(nvl(pff.mx_pct_val,p_new_val) ,
11866                                     trunc(nvl(pff.mx_pct_val,p_new_val))
11867                  ,decode(nvl(pff.mn_pct_val,p_new_val), trunc(nvl(pff.mn_pct_val,p_new_val)),
11871                   )
11868                   nvl(pff.mx_pct_val,p_new_val)+1,nvl(pff.mx_pct_val,p_new_val)+0.000000001),
11869                       nvl(pff.mx_pct_val,p_new_val)+0.000000001 )
11870                   -- and p_old_val < pff.mn_pct_val
11872                  OR
11873                  (
11874                    p_new_val IS NOT NULL
11875                    AND p_old_val IS NOT NULL
11876                    AND
11877                    (
11878                     p_new_val < NVL(pff.mn_pct_val,p_new_val)
11879                     OR
11880                     p_new_val >=   decode(nvl(pff.mx_pct_val,p_new_val) ,
11881                                     trunc(nvl(pff.mx_pct_val,p_new_val))
11882                    ,decode(nvl(pff.mn_pct_val,p_new_val), trunc(nvl(pff.mn_pct_val,p_new_val)),
11883                       nvl(pff.mx_pct_val,p_new_val)+1,nvl(pff.mx_pct_val,p_new_val)+0.000000001),
11884                       nvl(pff.mx_pct_val,p_new_val)+0.000000001 )
11885                      )
11886                     AND p_old_val >= NVL(pff.mn_pct_val ,p_old_val)
11887                     and p_old_val <  decode(nvl(pff.mx_pct_val,p_old_val) ,
11888                                     trunc(nvl(pff.mx_pct_val,p_old_val))
11889                      ,decode(nvl(pff.mn_pct_val,p_old_val), trunc(nvl(pff.mn_pct_val,p_old_val)),
11890                       nvl(pff.mx_pct_val,p_old_val)+1,nvl(pff.mx_pct_val,p_old_val)+0.000000001),
11891                       nvl(pff.mx_pct_val,p_old_val)+0.000000001 )
11892                   )
11893                  OR
11894                   (  p_new_val IS NULL
11895                      AND p_old_val IS NULL
11896                    )
11897             );
11898 
11899     --
11900     l_index          PLS_INTEGER;
11901     l_not_hash_found BOOLEAN;
11902   --
11903   BEGIN
11904     --
11905     -- hr_utility.set_location ('Entering '||l_package,10);
11906     --
11907     -- Steps to do process
11908     --
11909     -- 1) Try and get value from cache
11910     -- 2) If can get from cache then copy to output record
11911     -- 3) If can't get from cache do db hit and then
11912     --    copy to cache record and then copy to output record.
11913     --
11914     -- Get hashed index value
11915     --
11916     l_index  := MOD(p_pgm_id
11917                  ,g_hash_key);
11918     --
11919     IF NOT g_cache_pgm_pff_el_rec.EXISTS(l_index) THEN
11920       --
11921       -- Lets store the hash value in this index
11922       --
11923       RAISE NO_DATA_FOUND;
11924     --
11925     ELSE
11926       --
11927       -- If it does exist make sure its the right one
11928       --
11929       IF g_cache_pgm_pff_el_rec(l_index).id <> p_pgm_id THEN
11930         --
11931         -- Loop through the hash using the jump routine to check further
11932         -- indexes
11933         --
11934         l_not_hash_found  := FALSE;
11935         --
11936         WHILE NOT l_not_hash_found LOOP
11937           --
11938           l_index  := l_index + g_hash_jump;
11939           --
11940           -- Check if the hash index exists, if not we can use it
11941           --
11942           IF NOT g_cache_pgm_pff_el_rec.EXISTS(l_index) THEN
11943             --
11944             -- Lets store the hash value in the index
11945             --
11946             RAISE NO_DATA_FOUND;
11947           --
11948           ELSE
11949             --
11950             -- Make sure the index is the correct one
11951             --
11952             IF g_cache_pgm_pff_el_rec(l_index).id = p_pgm_id THEN
11953               --
11954               -- We have a match so the hashed value  has been stored before
11955               --
11956               l_not_hash_found  := TRUE;
11957             --
11958             END IF;
11959           --
11960           END IF;
11961         --
11962         END LOOP;
11963       --
11964       END IF;
11965     --
11966     END IF;
11967     --
11968      IF     p_old_val IS NOT NULL
11969        AND p_new_val IS NOT NULL THEN
11970       --
11971       RAISE NO_DATA_FOUND;
11972     --
11973     END IF;
11974 
11975     p_rec    := g_cache_pgm_pff_el_rec(l_index);
11976   --
11977   -- hr_utility.set_location ('Leaving '||l_package,10);
11978   --
11979   EXCEPTION
11980     --
11981     WHEN NO_DATA_FOUND THEN
11982       --
11983       -- The record has not been cached yet so lets cache it
11984       --
11985       OPEN c1;
11986       --
11987       FETCH c1 INTO g_cache_pgm_pff_el_rec(l_index);
11988       --
11989       IF c1%NOTFOUND THEN
11990         --
11991         if NOT g_cache_pgm_pff_el_rec.EXISTS(l_index) then
11992           g_cache_pgm_pff_el_rec(l_index).id     := p_pgm_id;
11993           g_cache_pgm_pff_el_rec(l_index).exist  := 'N';
11994         end if;
11995       --
11996       END IF;
11997       --
11998       p_rec  := g_cache_pgm_pff_el_rec(l_index);
11999       --
12000       CLOSE c1;
12001   --
12002   END get_pct_pgm_elig;
12003 --
12004   PROCEDURE get_pct_pl_elig(
12005     p_pl_id             IN            NUMBER
12006    ,p_old_val           in            number  default null
12007    ,p_new_val           in            number  default null
12008    ,p_business_group_id IN            NUMBER
12009    ,p_effective_date    IN            DATE
12010    ,p_rec               OUT NOCOPY    g_cache_pff_rec_obj) IS
12011     --
12015     --
12012     l_package        VARCHAR2(80) := g_package || '.get_pct_pl_elig';
12013     --
12014     -- Define Cursor
12016     CURSOR c1 IS
12017       SELECT   p_pl_id
12018               ,'Y'
12019               ,pff.use_prmry_asnt_only_flag
12020               ,pff.use_sum_of_all_asnts_flag
12021               ,pff.rndg_cd
12022               ,pff.rndg_rl
12023               ,pff.mn_pct_val
12024               ,pff.mx_pct_val
12025       FROM     ben_pct_fl_tm_fctr pff
12026               ,ben_elig_pct_fl_tm_prte_f epf
12027               ,ben_eligy_prfl_f elp
12028               ,ben_prtn_elig_prfl_f cep
12029               ,ben_prtn_elig_f epa
12030       WHERE    epa.pl_id = p_pl_id
12031       AND      p_effective_date BETWEEN epa.effective_start_date
12032                    AND epa.effective_end_date
12033       AND      epa.prtn_elig_id = cep.prtn_elig_id
12034       AND      p_effective_date BETWEEN cep.effective_start_date
12035                    AND cep.effective_end_date
12036       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
12037       AND      p_effective_date BETWEEN elp.effective_start_date
12038                    AND elp.effective_end_date
12039       AND      epf.eligy_prfl_id = elp.eligy_prfl_id
12040       AND      p_effective_date BETWEEN epf.effective_start_date
12041                    AND epf.effective_end_date
12042       AND      epf.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
12043       AND     (
12044                  (
12045                    p_new_val IS NOT NULL
12046                    AND p_old_val IS NOT NULL
12047                    AND p_new_val >= NVL(pff.mn_pct_val ,p_new_val)
12048                    and p_new_val <  decode(nvl(pff.mx_pct_val,p_new_val) ,
12049                                     trunc(nvl(pff.mx_pct_val,p_new_val))
12050                  ,decode(nvl(pff.mn_pct_val,p_new_val), trunc(nvl(pff.mn_pct_val,p_new_val)),
12051                   nvl(pff.mx_pct_val,p_new_val)+1,nvl(pff.mx_pct_val,p_new_val)+0.000000001),
12052                       nvl(pff.mx_pct_val,p_new_val)+0.000000001 )
12053                   -- and p_old_val < pff.mn_pct_val
12054                   )
12055                  OR
12056                  (
12057                    p_new_val IS NOT NULL
12058                    AND p_old_val IS NOT NULL
12059                    AND
12060                    (
12061                     p_new_val < NVL(pff.mn_pct_val,p_new_val)
12062                     OR
12063                     p_new_val >=   decode(nvl(pff.mx_pct_val,p_new_val) ,
12064                                     trunc(nvl(pff.mx_pct_val,p_new_val))
12065                    ,decode(nvl(pff.mn_pct_val,p_new_val), trunc(nvl(pff.mn_pct_val,p_new_val)),
12066                       nvl(pff.mx_pct_val,p_new_val)+1,nvl(pff.mx_pct_val,p_new_val)+0.000000001),
12067                       nvl(pff.mx_pct_val,p_new_val)+0.000000001 )
12068                      )
12069                     AND p_old_val >= NVL(pff.mn_pct_val ,p_old_val)
12070                     and p_old_val <  decode(nvl(pff.mx_pct_val,p_old_val) ,
12071                                     trunc(nvl(pff.mx_pct_val,p_old_val))
12072                      ,decode(nvl(pff.mn_pct_val,p_old_val), trunc(nvl(pff.mn_pct_val,p_old_val)),
12073                       nvl(pff.mx_pct_val,p_old_val)+1,nvl(pff.mx_pct_val,p_old_val)+0.000000001),
12074                       nvl(pff.mx_pct_val,p_old_val)+0.000000001 )
12075                   )
12076                  OR
12077                   (  p_new_val IS NULL
12078                      AND p_old_val IS NULL
12079                    )
12080             );
12081 
12082     --
12083     --
12084     l_index          PLS_INTEGER;
12085     l_not_hash_found BOOLEAN;
12086   --
12087   BEGIN
12088     --
12089     -- hr_utility.set_location ('Entering '||l_package,10);
12090     --
12091     -- Steps to do process
12092     --
12093     -- 1) Try and get value from cache
12094     -- 2) If can get from cache then copy to output record
12095     -- 3) If can't get from cache do db hit and then
12096     --    copy to cache record and then copy to output record.
12097     --
12098     -- Get hashed index value
12099     --
12100     l_index  := MOD(p_pl_id
12101                  ,g_hash_key);
12102     --
12103     IF NOT g_cache_pl_pff_el_rec.EXISTS(l_index) THEN
12104       --
12105       -- Lets store the hash value in this index
12106       --
12107       RAISE NO_DATA_FOUND;
12108     --
12109     ELSE
12110       --
12111       -- If it does exist make sure its the right one
12112       --
12113       IF g_cache_pl_pff_el_rec(l_index).id <> p_pl_id THEN
12114         --
12115         -- Loop through the hash using the jump routine to check further
12116         -- indexes
12117         --
12118         l_not_hash_found  := FALSE;
12119         --
12120         WHILE NOT l_not_hash_found LOOP
12121           --
12122           l_index  := l_index + g_hash_jump;
12123           --
12124           -- Check if the hash index exists, if not we can use it
12125           --
12126           IF NOT g_cache_pl_pff_el_rec.EXISTS(l_index) THEN
12127             --
12128             -- Lets store the hash value in the index
12129             --
12130             RAISE NO_DATA_FOUND;
12131           --
12132           ELSE
12133             --
12134             -- Make sure the index is the correct one
12135             --
12136             IF g_cache_pl_pff_el_rec(l_index).id = p_pl_id THEN
12140               l_not_hash_found  := TRUE;
12137               --
12138               -- We have a match so the hashed value  has been stored before
12139               --
12141             --
12142             END IF;
12143           --
12144           END IF;
12145         --
12146         END LOOP;
12147       --
12148       END IF;
12149     --
12150     END IF;
12151     --
12152      IF     p_old_val IS NOT NULL
12153        AND p_new_val IS NOT NULL THEN
12154       --
12155       RAISE NO_DATA_FOUND;
12156     --
12157     END IF;
12158     p_rec    := g_cache_pl_pff_el_rec(l_index);
12159   --
12160   -- hr_utility.set_location ('Leaving '||l_package,10);
12161   --
12162   EXCEPTION
12163     --
12164     WHEN NO_DATA_FOUND THEN
12165       --
12166       -- The record has not been cached yet so lets cache it
12167       --
12168       OPEN c1;
12169       --
12170       FETCH c1 INTO g_cache_pl_pff_el_rec(l_index);
12171       IF c1%NOTFOUND THEN
12172         --
12173         if NOT g_cache_pl_pff_el_rec.EXISTS(l_index) then
12174           g_cache_pl_pff_el_rec(l_index).id     := p_pl_id;
12175           g_cache_pl_pff_el_rec(l_index).exist  := 'N';
12176         end if;
12177       --
12178       END IF;
12179       --
12180       p_rec  := g_cache_pl_pff_el_rec(l_index);
12181       --
12182       CLOSE c1;
12183   --
12184   END get_pct_pl_elig;
12185 --
12186   PROCEDURE get_pct_oipl_elig(
12187     p_oipl_id           IN            NUMBER
12188    ,p_old_val           in            number  default null
12189    ,p_new_val           in            number  default null
12190    ,p_business_group_id IN            NUMBER
12191    ,p_effective_date    IN            DATE
12192    ,p_rec               OUT NOCOPY    g_cache_pff_rec_obj) IS
12193     --
12194     l_package        VARCHAR2(80) := g_package || '.get_pct_oipl_elig';
12195     --
12196     -- Define Cursor
12197     --
12198     CURSOR c1 IS
12199       SELECT   p_oipl_id
12200               ,'Y'
12201               ,pff.use_prmry_asnt_only_flag
12202               ,pff.use_sum_of_all_asnts_flag
12203               ,pff.rndg_cd
12204               ,pff.rndg_rl
12205               ,pff.mn_pct_val
12206               ,pff.mx_pct_val
12207       FROM     ben_pct_fl_tm_fctr pff
12208               ,ben_elig_pct_fl_tm_prte_f epf
12209               ,ben_eligy_prfl_f elp
12210               ,ben_prtn_elig_prfl_f cep
12211               ,ben_prtn_elig_f epa
12212       WHERE    epa.oipl_id = p_oipl_id
12213       AND      p_effective_date BETWEEN epa.effective_start_date
12214                    AND epa.effective_end_date
12215       AND      epa.prtn_elig_id = cep.prtn_elig_id
12216       AND      p_effective_date BETWEEN cep.effective_start_date
12217                    AND cep.effective_end_date
12218       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
12219       AND      p_effective_date BETWEEN elp.effective_start_date
12220                    AND elp.effective_end_date
12221       AND      epf.eligy_prfl_id = elp.eligy_prfl_id
12222       AND      p_effective_date BETWEEN epf.effective_start_date
12223                    AND epf.effective_end_date
12224       AND      epf.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
12225       AND     (
12226                  (
12227                    p_new_val IS NOT NULL
12228                    AND p_old_val IS NOT NULL
12229                    AND p_new_val >= NVL(pff.mn_pct_val ,p_new_val)
12230                    and p_new_val <  decode(nvl(pff.mx_pct_val,p_new_val) ,
12231                                     trunc(nvl(pff.mx_pct_val,p_new_val))
12232                  ,decode(nvl(pff.mn_pct_val,p_new_val), trunc(nvl(pff.mn_pct_val,p_new_val)),
12233                   nvl(pff.mx_pct_val,p_new_val)+1,nvl(pff.mx_pct_val,p_new_val)+0.000000001),
12234                       nvl(pff.mx_pct_val,p_new_val)+0.000000001 )
12235                   -- and p_old_val < pff.mn_pct_val
12236                   )
12237                  OR
12238                  (
12239                    p_new_val IS NOT NULL
12240                    AND p_old_val IS NOT NULL
12241                    AND
12242                    (
12243                     p_new_val < NVL(pff.mn_pct_val,p_new_val)
12244                     OR
12245                     p_new_val >=   decode(nvl(pff.mx_pct_val,p_new_val) ,
12246                                     trunc(nvl(pff.mx_pct_val,p_new_val))
12247                    ,decode(nvl(pff.mn_pct_val,p_new_val), trunc(nvl(pff.mn_pct_val,p_new_val)),
12248                       nvl(pff.mx_pct_val,p_new_val)+1,nvl(pff.mx_pct_val,p_new_val)+0.000000001),
12249                       nvl(pff.mx_pct_val,p_new_val)+0.000000001 )
12250                      )
12251                     AND p_old_val >= NVL(pff.mn_pct_val ,p_old_val)
12252                     and p_old_val <  decode(nvl(pff.mx_pct_val,p_old_val) ,
12253                                     trunc(nvl(pff.mx_pct_val,p_old_val))
12254                      ,decode(nvl(pff.mn_pct_val,p_old_val), trunc(nvl(pff.mn_pct_val,p_old_val)),
12255                       nvl(pff.mx_pct_val,p_old_val)+1,nvl(pff.mx_pct_val,p_old_val)+0.000000001),
12256                       nvl(pff.mx_pct_val,p_old_val)+0.000000001 )
12257                   )
12258                  OR
12259                   (  p_new_val IS NULL
12263 
12260                      AND p_old_val IS NULL
12261                    )
12262             );
12264     --
12265     --
12266     l_index          PLS_INTEGER;
12267     l_not_hash_found BOOLEAN;
12268   --
12269   BEGIN
12270     --
12271     -- hr_utility.set_location ('Entering '||l_package,10);
12272     --
12273     -- Steps to do process
12274     --
12275     -- 1) Try and get value from cache
12276     -- 2) If can get from cache then copy to output record
12277     -- 3) If can't get from cache do db hit and then
12278     --    copy to cache record and then copy to output record.
12279     --
12280     -- Get hashed index value
12281     --
12282     l_index  := MOD(p_oipl_id
12283                  ,g_hash_key);
12284     --
12285     IF NOT g_cache_oipl_pff_el_rec.EXISTS(l_index) THEN
12286       --
12287       -- Lets store the hash value in this index
12288       --
12289       RAISE NO_DATA_FOUND;
12290     --
12291     ELSE
12292       --
12293       -- If it does exist make sure its the right one
12294       --
12295       IF g_cache_oipl_pff_el_rec(l_index).id <> p_oipl_id THEN
12296         --
12297         -- Loop through the hash using the jump routine to check further
12298         -- indexes
12299         --
12300         l_not_hash_found  := FALSE;
12301         --
12302         WHILE NOT l_not_hash_found LOOP
12303           --
12304           l_index  := l_index + g_hash_jump;
12305           --
12306           -- Check if the hash index exists, if not we can use it
12307           --
12308           IF NOT g_cache_oipl_pff_el_rec.EXISTS(l_index) THEN
12309             --
12310             -- Lets store the hash value in the index
12311             --
12312             RAISE NO_DATA_FOUND;
12313           --
12314           ELSE
12315             --
12316             -- Make sure the index is the correct one
12317             --
12318             IF g_cache_oipl_pff_el_rec(l_index).id = p_oipl_id THEN
12319               --
12320               -- We have a match so the hashed value  has been stored before
12321               --
12322               l_not_hash_found  := TRUE;
12323             --
12324             END IF;
12325           --
12326           END IF;
12327         --
12328         END LOOP;
12329       --
12330       END IF;
12331     --
12332     END IF;
12333     --
12334      IF     p_old_val IS NOT NULL
12335        AND p_new_val IS NOT NULL THEN
12336       --
12337       RAISE NO_DATA_FOUND;
12338     --
12339     END IF;
12340     p_rec    := g_cache_oipl_pff_el_rec(l_index);
12341   --
12342   -- hr_utility.set_location ('Leaving '||l_package,10);
12343   --
12344   EXCEPTION
12345     --
12346     WHEN NO_DATA_FOUND THEN
12347       --
12348       -- The record has not been cached yet so lets cache it
12349       --
12350       OPEN c1;
12351       --
12352       FETCH c1 INTO g_cache_oipl_pff_el_rec(l_index);
12353       IF c1%NOTFOUND THEN
12354         --
12355         if NOT g_cache_oipl_pff_el_rec.EXISTS(l_index) then
12356           g_cache_oipl_pff_el_rec(l_index).id     := p_oipl_id;
12357           g_cache_oipl_pff_el_rec(l_index).exist  := 'N';
12358         end if;
12359       --
12360       END IF;
12361       --
12362       p_rec  := g_cache_oipl_pff_el_rec(l_index);
12363       --
12364       CLOSE c1;
12365   --
12366   END get_pct_oipl_elig;
12367 --
12368   PROCEDURE get_pct_plip_elig(
12369     p_plip_id           IN            NUMBER
12370    ,p_old_val           in            number  default null
12371    ,p_new_val           in            number  default null
12372    ,p_business_group_id IN            NUMBER
12373    ,p_effective_date    IN            DATE
12374    ,p_rec               OUT NOCOPY    g_cache_pff_rec_obj) IS
12375     --
12376     l_package        VARCHAR2(80) := g_package || '.get_pct_plip_elig';
12377     --
12378     -- Define Cursor
12379     --
12380     CURSOR c1 IS
12381       SELECT   p_plip_id
12382               ,'Y'
12383               ,pff.use_prmry_asnt_only_flag
12384               ,pff.use_sum_of_all_asnts_flag
12385               ,pff.rndg_cd
12386               ,pff.rndg_rl
12387               ,pff.mn_pct_val
12388               ,pff.mx_pct_val
12389       FROM     ben_pct_fl_tm_fctr pff
12390               ,ben_elig_pct_fl_tm_prte_f epf
12391               ,ben_eligy_prfl_f elp
12392               ,ben_prtn_elig_prfl_f cep
12393               ,ben_prtn_elig_f epa
12394       WHERE    epa.plip_id = p_plip_id
12395       AND      p_effective_date BETWEEN epa.effective_start_date
12396                    AND epa.effective_end_date
12397       AND      epa.prtn_elig_id = cep.prtn_elig_id
12398       AND      p_effective_date BETWEEN cep.effective_start_date
12399                    AND cep.effective_end_date
12400       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
12401       AND      p_effective_date BETWEEN elp.effective_start_date
12402                    AND elp.effective_end_date
12403       AND      epf.eligy_prfl_id = elp.eligy_prfl_id
12404       AND      p_effective_date BETWEEN epf.effective_start_date
12405                    AND epf.effective_end_date
12406       AND      epf.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
12407       AND     (
12408                  (
12412                    and p_new_val <  decode(nvl(pff.mx_pct_val,p_new_val) ,
12409                    p_new_val IS NOT NULL
12410                    AND p_old_val IS NOT NULL
12411                    AND p_new_val >= NVL(pff.mn_pct_val ,p_new_val)
12413                                     trunc(nvl(pff.mx_pct_val,p_new_val))
12414                  ,decode(nvl(pff.mn_pct_val,p_new_val), trunc(nvl(pff.mn_pct_val,p_new_val)),
12415                   nvl(pff.mx_pct_val,p_new_val)+1,nvl(pff.mx_pct_val,p_new_val)+0.000000001),
12416                       nvl(pff.mx_pct_val,p_new_val)+0.000000001 )
12417                   -- and p_old_val < pff.mn_pct_val
12418                   )
12419                  OR
12420                  (
12421                    p_new_val IS NOT NULL
12422                    AND p_old_val IS NOT NULL
12423                    AND
12424                    (
12425                     p_new_val < NVL(pff.mn_pct_val,p_new_val)
12426                     OR
12427                     p_new_val >=   decode(nvl(pff.mx_pct_val,p_new_val) ,
12428                                     trunc(nvl(pff.mx_pct_val,p_new_val))
12429                    ,decode(nvl(pff.mn_pct_val,p_new_val), trunc(nvl(pff.mn_pct_val,p_new_val)),
12430                       nvl(pff.mx_pct_val,p_new_val)+1,nvl(pff.mx_pct_val,p_new_val)+0.000000001),
12431                       nvl(pff.mx_pct_val,p_new_val)+0.000000001 )
12432                      )
12433                     AND p_old_val >= NVL(pff.mn_pct_val ,p_old_val)
12434                     and p_old_val <  decode(nvl(pff.mx_pct_val,p_old_val) ,
12435                                     trunc(nvl(pff.mx_pct_val,p_old_val))
12436                      ,decode(nvl(pff.mn_pct_val,p_old_val), trunc(nvl(pff.mn_pct_val,p_old_val)),
12437                       nvl(pff.mx_pct_val,p_old_val)+1,nvl(pff.mx_pct_val,p_old_val)+0.000000001),
12438                       nvl(pff.mx_pct_val,p_old_val)+0.000000001 )
12439                   )
12440                  OR
12441                   (  p_new_val IS NULL
12442                      AND p_old_val IS NULL
12443                    )
12444             );
12445 
12446     --
12447     --
12448     l_index          PLS_INTEGER;
12449     l_not_hash_found BOOLEAN;
12450   --
12451   BEGIN
12452     --
12453     -- hr_utility.set_location ('Entering '||l_package,10);
12454     --
12455     -- Steps to do process
12456     --
12457     -- 1) Try and get value from cache
12458     -- 2) If can get from cache then copy to output record
12459     -- 3) If can't get from cache do db hit and then
12460     --    copy to cache record and then copy to output record.
12461     --
12462     -- Get hashed index value
12463     --
12464     l_index  := MOD(p_plip_id
12465                  ,g_hash_key);
12466     --
12467     IF NOT g_cache_plip_pff_el_rec.EXISTS(l_index) THEN
12468       --
12469       -- Lets store the hash value in this index
12470       --
12471       RAISE NO_DATA_FOUND;
12472     --
12473     ELSE
12474       --
12475       -- If it does exist make sure its the right one
12476       --
12477       IF g_cache_plip_pff_el_rec(l_index).id <> p_plip_id THEN
12478         --
12479         -- Loop through the hash using the jump routine to check further
12480         -- indexes
12481         --
12482         l_not_hash_found  := FALSE;
12483         --
12484         WHILE NOT l_not_hash_found LOOP
12485           --
12486           l_index  := l_index + g_hash_jump;
12487           --
12488           -- Check if the hash index exists, if not we can use it
12489           --
12490           IF NOT g_cache_plip_pff_el_rec.EXISTS(l_index) THEN
12491             --
12492             -- Lets store the hash value in the index
12493             --
12494             RAISE NO_DATA_FOUND;
12495           --
12496           ELSE
12497             --
12498             -- Make sure the index is the correct one
12499             --
12500             IF g_cache_plip_pff_el_rec(l_index).id = p_plip_id THEN
12501               --
12502               -- We have a match so the hashed value  has been stored before
12503               --
12504               l_not_hash_found  := TRUE;
12505             --
12506             END IF;
12507           --
12508           END IF;
12509         --
12510         END LOOP;
12511       --
12512       END IF;
12513     --
12514     END IF;
12515     --
12516      IF     p_old_val IS NOT NULL
12517        AND p_new_val IS NOT NULL THEN
12518       --
12519       RAISE NO_DATA_FOUND;
12520     --
12521     END IF;
12522     p_rec    := g_cache_plip_pff_el_rec(l_index);
12523   --
12524   -- hr_utility.set_location ('Leaving '||l_package,10);
12525   --
12526   EXCEPTION
12527     --
12528     WHEN NO_DATA_FOUND THEN
12529       --
12530       -- The record has not been cached yet so lets cache it
12531       --
12532       OPEN c1;
12533       --
12534       FETCH c1 INTO g_cache_plip_pff_el_rec(l_index);
12535       IF c1%NOTFOUND THEN
12536         --
12537         if NOT g_cache_plip_pff_el_rec.EXISTS(l_index) then
12538           g_cache_plip_pff_el_rec(l_index).id     := p_plip_id;
12539           g_cache_plip_pff_el_rec(l_index).exist  := 'N';
12540         end if;
12541       --
12542       END IF;
12543       --
12547   --
12544       p_rec  := g_cache_plip_pff_el_rec(l_index);
12545       --
12546       CLOSE c1;
12548   END get_pct_plip_elig;
12549 --
12550   PROCEDURE get_pct_ptip_elig(
12551     p_ptip_id           IN            NUMBER
12552    ,p_old_val           in            number  default null
12553    ,p_new_val           in            number  default null
12554    ,p_business_group_id IN            NUMBER
12555    ,p_effective_date    IN            DATE
12556    ,p_rec               OUT NOCOPY    g_cache_pff_rec_obj) IS
12557     --
12558     l_package        VARCHAR2(80) := g_package || '.get_pct_ptip_elig';
12559     --
12560     -- Define Cursor
12561     --
12562     CURSOR c1 IS
12563       SELECT   p_ptip_id
12564               ,'Y'
12565               ,pff.use_prmry_asnt_only_flag
12566               ,pff.use_sum_of_all_asnts_flag
12567               ,pff.rndg_cd
12568               ,pff.rndg_rl
12569               ,pff.mn_pct_val
12570               ,pff.mx_pct_val
12571       FROM     ben_pct_fl_tm_fctr pff
12572               ,ben_elig_pct_fl_tm_prte_f epf
12573               ,ben_eligy_prfl_f elp
12574               ,ben_prtn_elig_prfl_f cep
12575               ,ben_prtn_elig_f epa
12576       WHERE    epa.ptip_id = p_ptip_id
12577       AND      p_effective_date BETWEEN epa.effective_start_date
12578                    AND epa.effective_end_date
12579       AND      epa.prtn_elig_id = cep.prtn_elig_id
12580       AND      p_effective_date BETWEEN cep.effective_start_date
12581                    AND cep.effective_end_date
12582       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
12583       AND      p_effective_date BETWEEN elp.effective_start_date
12584                    AND elp.effective_end_date
12585       AND      epf.eligy_prfl_id = elp.eligy_prfl_id
12586       AND      p_effective_date BETWEEN epf.effective_start_date
12587                    AND epf.effective_end_date
12588       AND      epf.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
12589       AND     (
12590                  (
12591                    p_new_val IS NOT NULL
12592                    AND p_old_val IS NOT NULL
12593                    AND p_new_val >= NVL(pff.mn_pct_val ,p_new_val)
12594                    and p_new_val <  decode(nvl(pff.mx_pct_val,p_new_val) ,
12595                                     trunc(nvl(pff.mx_pct_val,p_new_val))
12596                  ,decode(nvl(pff.mn_pct_val,p_new_val), trunc(nvl(pff.mn_pct_val,p_new_val)),
12597                   nvl(pff.mx_pct_val,p_new_val)+1,nvl(pff.mx_pct_val,p_new_val)+0.000000001),
12598                       nvl(pff.mx_pct_val,p_new_val)+0.000000001 )
12599                   -- and p_old_val < pff.mn_pct_val
12600                   )
12601                  OR
12602                  (
12603                    p_new_val IS NOT NULL
12604                    AND p_old_val IS NOT NULL
12605                    AND
12606                    (
12607                     p_new_val < NVL(pff.mn_pct_val,p_new_val)
12608                     OR
12609                     p_new_val >=   decode(nvl(pff.mx_pct_val,p_new_val) ,
12610                                     trunc(nvl(pff.mx_pct_val,p_new_val))
12611                    ,decode(nvl(pff.mn_pct_val,p_new_val), trunc(nvl(pff.mn_pct_val,p_new_val)),
12612                       nvl(pff.mx_pct_val,p_new_val)+1,nvl(pff.mx_pct_val,p_new_val)+0.000000001),
12613                       nvl(pff.mx_pct_val,p_new_val)+0.000000001 )
12614                      )
12615                     AND p_old_val >= NVL(pff.mn_pct_val ,p_old_val)
12616                     and p_old_val <  decode(nvl(pff.mx_pct_val,p_old_val) ,
12617                                     trunc(nvl(pff.mx_pct_val,p_old_val))
12618                      ,decode(nvl(pff.mn_pct_val,p_old_val), trunc(nvl(pff.mn_pct_val,p_old_val)),
12619                       nvl(pff.mx_pct_val,p_old_val)+1,nvl(pff.mx_pct_val,p_old_val)+0.000000001),
12620                       nvl(pff.mx_pct_val,p_old_val)+0.000000001 )
12621                   )
12622                  OR
12623                   (  p_new_val IS NULL
12624                      AND p_old_val IS NULL
12625                    )
12626             );
12627 
12628     --
12629     --
12630     l_index          PLS_INTEGER;
12631     l_not_hash_found BOOLEAN;
12632   --
12633   BEGIN
12634     --
12635     -- hr_utility.set_location ('Entering '||l_package,10);
12636     --
12637     -- Steps to do process
12638     --
12639     -- 1) Try and get value from cache
12640     -- 2) If can get from cache then copy to output record
12641     -- 3) If can't get from cache do db hit and then
12642     --    copy to cache record and then copy to output record.
12643     --
12644     -- Get hashed index value
12645     --
12646     l_index  := MOD(p_ptip_id
12647                  ,g_hash_key);
12648     --
12649     IF NOT g_cache_ptip_pff_el_rec.EXISTS(l_index) THEN
12650       --
12651       -- Lets store the hash value in this index
12652       --
12653       RAISE NO_DATA_FOUND;
12654     --
12655     ELSE
12656       --
12657       -- If it does exist make sure its the right one
12658       --
12659       IF g_cache_ptip_pff_el_rec(l_index).id <> p_ptip_id THEN
12660         --
12661         -- Loop through the hash using the jump routine to check further
12662         -- indexes
12663         --
12664         l_not_hash_found  := FALSE;
12665         --
12666         WHILE NOT l_not_hash_found LOOP
12670           -- Check if the hash index exists, if not we can use it
12667           --
12668           l_index  := l_index + g_hash_jump;
12669           --
12671           --
12672           IF NOT g_cache_ptip_pff_el_rec.EXISTS(l_index) THEN
12673             --
12674             -- Lets store the hash value in the index
12675             --
12676             RAISE NO_DATA_FOUND;
12677           --
12678           ELSE
12679             --
12680             -- Make sure the index is the correct one
12681             --
12682             IF g_cache_ptip_pff_el_rec(l_index).id = p_ptip_id THEN
12683               --
12684               -- We have a match so the hashed value  has been stored before
12685               --
12686               l_not_hash_found  := TRUE;
12687             --
12688             END IF;
12689           --
12690           END IF;
12691         --
12692         END LOOP;
12693       --
12694       END IF;
12695     --
12696     END IF;
12697     --
12698      IF     p_old_val IS NOT NULL
12699        AND p_new_val IS NOT NULL THEN
12700       --
12701       RAISE NO_DATA_FOUND;
12702     --
12703     END IF;
12704     p_rec    := g_cache_ptip_pff_el_rec(l_index);
12705   --
12706   -- hr_utility.set_location ('Leaving '||l_package,10);
12707   --
12708   EXCEPTION
12709     --
12710     WHEN NO_DATA_FOUND THEN
12711       --
12712       -- The record has not been cached yet so lets cache it
12713       --
12714       OPEN c1;
12715       --
12716       FETCH c1 INTO g_cache_ptip_pff_el_rec(l_index);
12717       IF c1%NOTFOUND THEN
12718         --
12719         if NOT g_cache_ptip_pff_el_rec.EXISTS(l_index) then
12720           g_cache_ptip_pff_el_rec(l_index).id     := p_ptip_id;
12721           g_cache_ptip_pff_el_rec(l_index).exist  := 'N';
12722         end if;
12723       --
12724       END IF;
12725       --
12726       p_rec  := g_cache_ptip_pff_el_rec(l_index);
12727       --
12728       CLOSE c1;
12729   --
12730   END get_pct_ptip_elig;
12731 --
12732   PROCEDURE get_pct_elig(
12733     p_pgm_id            IN            NUMBER
12734    ,p_pl_id             IN            NUMBER
12735    ,p_oipl_id           IN            NUMBER
12736    ,p_plip_id           IN            NUMBER
12737    ,p_ptip_id           IN            NUMBER
12738    ,p_old_val           in            number  default null
12739    ,p_new_val           in            number  default null
12740    ,p_business_group_id IN            NUMBER
12741    ,p_effective_date    IN            DATE
12742    ,p_rec               OUT NOCOPY    g_cache_pff_rec_obj) IS
12743     --
12744     l_package VARCHAR2(80) := g_package || '.get_pct_elig';
12745   --
12746   BEGIN
12747     --
12748     -- hr_utility.set_location ('Entering '||l_package,10);
12749     --
12750     -- Derive which data type we are dealing with
12751     --
12752     IF p_pgm_id IS NOT NULL THEN
12753       --
12754       get_pct_pgm_elig(p_pgm_id=> p_pgm_id
12755        ,p_old_val           => p_old_val
12756        ,p_new_val           => p_new_val
12757        ,p_business_group_id => p_business_group_id
12758        ,p_effective_date    => p_effective_date
12759        ,p_rec               => p_rec);
12760     --
12761     ELSIF p_pl_id IS NOT NULL THEN
12762       --
12763       get_pct_pl_elig(p_pl_id=> p_pl_id
12764         ,p_old_val           => p_old_val
12765        ,p_new_val           => p_new_val
12766        ,p_business_group_id => p_business_group_id
12767        ,p_effective_date    => p_effective_date
12768        ,p_rec               => p_rec);
12769     --
12770     ELSIF p_oipl_id IS NOT NULL THEN
12771       --
12772       get_pct_oipl_elig(p_oipl_id=> p_oipl_id
12773         ,p_old_val           => p_old_val
12774        ,p_new_val           => p_new_val
12775        ,p_business_group_id => p_business_group_id
12776        ,p_effective_date    => p_effective_date
12777        ,p_rec               => p_rec);
12778     --
12779     ELSIF p_plip_id IS NOT NULL THEN
12780       --
12781       get_pct_plip_elig(p_plip_id=> p_plip_id
12782         ,p_old_val           => p_old_val
12783        ,p_new_val           => p_new_val
12784        ,p_business_group_id => p_business_group_id
12785        ,p_effective_date    => p_effective_date
12786        ,p_rec               => p_rec);
12787     --
12788     ELSIF p_ptip_id IS NOT NULL THEN
12789       --
12790       get_pct_ptip_elig(p_ptip_id=> p_ptip_id
12791         ,p_old_val           => p_old_val
12792        ,p_new_val           => p_new_val
12793        ,p_business_group_id => p_business_group_id
12794        ,p_effective_date    => p_effective_date
12795        ,p_rec               => p_rec);
12796     --
12797     END IF;
12798   --
12799   -- hr_utility.set_location ('Leaving '||l_package,10);
12800   --
12801   END get_pct_elig;
12802 --
12803   PROCEDURE get_pct_pgm_rate(
12804     p_pgm_id            IN            NUMBER
12805    ,p_old_val           IN            NUMBER DEFAULT NULL
12806    ,p_new_val           IN            NUMBER DEFAULT NULL
12807    ,p_business_group_id IN            NUMBER
12808    ,p_effective_date    IN            DATE
12809    ,p_rec               OUT NOCOPY    g_cache_pff_rec_obj) IS
12810     --
12814     --
12811     l_package        VARCHAR2(80) := g_package || '.get_pct_pgm_rate';
12812     l_old_val_1 NUMBER := p_old_val + 1;
12813     l_new_val_1 NUMBER := p_new_val + 1;
12815     -- Define Cursor
12816     --
12817     CURSOR c1 IS
12818       SELECT   p_pgm_id
12819               ,'Y'
12820               ,pff.use_prmry_asnt_only_flag
12821               ,pff.use_sum_of_all_asnts_flag
12822               ,pff.rndg_cd
12823               ,pff.rndg_rl
12824               ,pff.mn_pct_val
12825               ,pff.mx_pct_val
12826       FROM     ben_pct_fl_tm_fctr pff
12827               ,ben_pct_fl_tm_rt_f pfr
12828               ,ben_vrbl_rt_prfl_f vpf
12829               ,ben_acty_vrbl_rt_f avr
12830               ,ben_acty_base_rt_f abr
12831       WHERE    abr.pgm_id = p_pgm_id
12832       AND      p_effective_date BETWEEN abr.effective_start_date
12833                    AND abr.effective_end_date
12834       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
12835       AND      p_effective_date BETWEEN avr.effective_start_date
12836                    AND avr.effective_end_date
12837       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
12838       AND      p_effective_date BETWEEN vpf.effective_start_date
12839                    AND vpf.effective_end_date
12840       AND      vpf.vrbl_rt_prfl_id = pfr.vrbl_rt_prfl_id
12841       AND      p_effective_date BETWEEN pfr.effective_start_date
12842                    AND pfr.effective_end_date
12843       AND      pfr.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
12844       AND      (
12845                     (
12846                           p_new_val IS NOT NULL
12847                       AND p_old_val IS NOT NULL
12848                       AND p_new_val >= NVL(pff.mn_pct_val
12849                                         ,p_new_val)
12850                       AND (p_new_val*100) <  (NVL(pff.mx_pct_val
12851                                        ,p_new_val)*100)+1 )
12852                  OR (
12853                           p_new_val IS NOT NULL
12854                       AND p_old_val IS NOT NULL
12855                       AND (
12856                                p_new_val < NVL(pff.mn_pct_val
12857                                             ,p_new_val)
12858                             OR (p_new_val*100)  >= ( NVL(pff.mx_pct_val
12859                                              ,p_new_val)*100)+1 )
12860                       AND p_old_val >= NVL(pff.mn_pct_val
12861                                         ,p_old_val)
12862                       AND (p_old_val*100) < (NVL(pff.mx_pct_val
12863                                        ,p_old_val)*100)+1 )
12864                  OR (    p_new_val IS NULL
12865                      AND p_old_val IS NULL));
12866     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
12867     --UNION ALL
12868     CURSOR c2 IS
12869       SELECT   p_pgm_id
12870               ,'Y'
12871               ,pff.use_prmry_asnt_only_flag
12872               ,pff.use_sum_of_all_asnts_flag
12873               ,pff.rndg_cd
12874               ,pff.rndg_rl
12875               ,pff.mn_pct_val
12876               ,pff.mx_pct_val
12877       FROM     ben_pct_fl_tm_fctr pff
12878               --,ben_pct_fl_tm_rt_f pfr
12879               ,ben_elig_pct_fl_tm_prte_f epf
12880               ,ben_eligy_prfl_f elp
12881               ,ben_vrbl_rt_elig_prfl_f vep
12882               ,ben_vrbl_rt_prfl_f vpf
12883               ,ben_acty_vrbl_rt_f avr
12884               ,ben_acty_base_rt_f abr
12885       WHERE    abr.pgm_id = p_pgm_id
12886       AND      p_effective_date BETWEEN abr.effective_start_date
12887                    AND abr.effective_end_date
12888       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
12889       AND      p_effective_date BETWEEN avr.effective_start_date
12890                    AND avr.effective_end_date
12891       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
12892       AND      p_effective_date BETWEEN vpf.effective_start_date
12893                    AND vpf.effective_end_date
12894 --      AND      vpf.vrbl_rt_prfl_id = epf.vrbl_rt_prfl_id
12895       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
12896       AND      p_effective_date BETWEEN vep.effective_start_date
12897                    AND vep.effective_end_date
12898       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
12899       AND      p_effective_date BETWEEN elp.effective_start_date
12900                    AND elp.effective_end_date
12901       AND      epf.eligy_prfl_id = elp.eligy_prfl_id
12902       AND      p_effective_date BETWEEN epf.effective_start_date
12903                    AND epf.effective_end_date
12904       AND      epf.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
12905       AND      (
12906                     (
12907                           p_new_val IS NOT NULL
12908                       AND p_old_val IS NOT NULL
12909                       AND p_new_val >= NVL(pff.mn_pct_val
12910                                         ,p_new_val)
12911                       AND (p_new_val*100) <  (NVL(pff.mx_pct_val
12912                                        ,p_new_val)*100)+1 )
12913                  OR (
12914                           p_new_val IS NOT NULL
12915                       AND p_old_val IS NOT NULL
12916                       AND (
12917                                p_new_val < NVL(pff.mn_pct_val
12918                                             ,p_new_val)
12919                             OR (p_new_val*100)  >= ( NVL(pff.mx_pct_val
12923                       AND (p_old_val*100) < (NVL(pff.mx_pct_val
12920                                              ,p_new_val)*100)+1 )
12921                       AND p_old_val >= NVL(pff.mn_pct_val
12922                                         ,p_old_val)
12924                                        ,p_old_val)*100)+1 )
12925                  OR (    p_new_val IS NULL
12926                      AND p_old_val IS NULL));
12927     --
12928     --
12929     l_index          PLS_INTEGER;
12930     l_not_hash_found BOOLEAN;
12931     l_c2notfound       BOOLEAN;
12932   --
12933   BEGIN
12934     --
12935     -- hr_utility.set_location ('Entering '||l_package,10);
12936     --
12937     -- Steps to do process
12938     --
12939     -- 1) Try and get value from cache
12940     -- 2) If can get from cache then copy to output record
12941     -- 3) If can't get from cache do db hit and then
12942     --    copy to cache record and then copy to output record.
12943     --
12944     -- Get hashed index value
12945     --
12946     l_index  := MOD(p_pgm_id
12947                  ,g_hash_key);
12948     --
12949     IF NOT g_cache_pgm_pff_rt_rec.EXISTS(l_index) THEN
12950       --
12951       -- Lets store the hash value in this index
12952       --
12953       RAISE NO_DATA_FOUND;
12954     --
12955     ELSE
12956       --
12957       -- If it does exist make sure its the right one
12958       --
12959       IF g_cache_pgm_pff_rt_rec(l_index).id <> p_pgm_id THEN
12960         --
12961         -- Loop through the hash using the jump routine to check further
12962         -- indexes
12963         --
12964         l_not_hash_found  := FALSE;
12965         --
12966         WHILE NOT l_not_hash_found LOOP
12967           --
12968           l_index  := l_index + g_hash_jump;
12969           --
12970           -- Check if the hash index exists, if not we can use it
12971           --
12972           IF NOT g_cache_pgm_pff_rt_rec.EXISTS(l_index) THEN
12973             --
12974             -- Lets store the hash value in the index
12975             --
12976             RAISE NO_DATA_FOUND;
12977           --
12978           ELSE
12979             --
12980             -- Make sure the index is the correct one
12981             --
12982             IF g_cache_pgm_pff_rt_rec(l_index).id = p_pgm_id THEN
12983               --
12984               -- We have a match so the hashed value  has been stored before
12985               --
12986               l_not_hash_found  := TRUE;
12987             --
12988             END IF;
12989           --
12990           END IF;
12991         --
12992         END LOOP;
12993       --
12994       END IF;
12995     --
12996     END IF;
12997     --
12998     -- If p_old_val and p_new_val is set this means we are trying to retrieve
12999     -- the correct rate for the calculated value.
13000     -- Previously we just cached the first rate we
13001     -- found since we needed the determination code, the correct age,los code,etc
13002     -- By killing the cache and forcing the value to be removed we cache the
13003     -- correct rate profile for the case we need.
13004     --
13005     IF     p_old_val IS NOT NULL
13006        AND p_new_val IS NOT NULL THEN
13007       --
13008       RAISE NO_DATA_FOUND;
13009     --
13010     END IF;
13011     --
13012     p_rec    := g_cache_pgm_pff_rt_rec(l_index);
13013   --
13014   -- hr_utility.set_location ('Leaving '||l_package,10);
13015   --
13016   EXCEPTION
13017     --
13018     WHEN NO_DATA_FOUND THEN
13019       --
13020       -- The record has not been cached yet so lets cache it
13021       --
13022       OPEN c1;
13023       --
13024       FETCH c1 INTO g_cache_pgm_pff_rt_rec(l_index);
13025       -- PERFNEW
13026       IF c1%NOTFOUND THEN
13027          --
13028          l_c2notfound := false;
13029          OPEN c2;
13030          FETCH c2 INTO g_cache_pgm_pff_rt_rec(l_index);
13031          IF c2%NOTFOUND THEN
13032             --
13033             l_c2notfound := true;
13034             --
13035          END IF;
13036          CLOSE c2;
13037          --
13038       END IF;
13039       -- PERFNEW
13040       IF     p_old_val IS NULL
13041          AND p_new_val IS NULL THEN
13042         --
13043         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
13044           --
13045           if NOT g_cache_pgm_pff_rt_rec.EXISTS(l_index) then
13046             g_cache_pgm_pff_rt_rec(l_index).id     := p_pgm_id;
13047             g_cache_pgm_pff_rt_rec(l_index).exist  := 'N';
13048           end if;
13049         --
13050         END IF;
13051       --
13052       END IF;
13053       --
13054       p_rec  := g_cache_pgm_pff_rt_rec(l_index);
13055       --
13056       CLOSE c1;
13057   --
13058   END get_pct_pgm_rate;
13059 --
13060   PROCEDURE get_pct_pl_rate(
13061     p_pl_id             IN            NUMBER
13062    ,p_old_val           IN            NUMBER DEFAULT NULL
13063    ,p_new_val           IN            NUMBER DEFAULT NULL
13064    ,p_business_group_id IN            NUMBER
13065    ,p_effective_date    IN            DATE
13066    ,p_rec               OUT NOCOPY    g_cache_pff_rec_obj) IS
13067     --
13071     --
13068     l_package        VARCHAR2(80) := g_package || '.get_pct_pl_rate';
13069     l_old_val_1 NUMBER := p_old_val + 1;
13070     l_new_val_1 NUMBER := p_new_val + 1;
13072     -- Define Cursor
13073     --
13074     CURSOR c1 IS
13075       SELECT   p_pl_id
13076               ,'Y'
13077               ,pff.use_prmry_asnt_only_flag
13078               ,pff.use_sum_of_all_asnts_flag
13079               ,pff.rndg_cd
13080               ,pff.rndg_rl
13081               ,pff.mn_pct_val
13082               ,pff.mx_pct_val
13083       FROM     ben_pct_fl_tm_fctr pff
13084               ,ben_pct_fl_tm_rt_f pfr
13085               ,ben_vrbl_rt_prfl_f vpf
13086               ,ben_acty_vrbl_rt_f avr
13087               ,ben_acty_base_rt_f abr
13088       WHERE    abr.pl_id = p_pl_id
13089       AND      p_effective_date BETWEEN abr.effective_start_date
13090                    AND abr.effective_end_date
13091       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
13092       AND      p_effective_date BETWEEN avr.effective_start_date
13093                    AND avr.effective_end_date
13094       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
13095       AND      p_effective_date BETWEEN vpf.effective_start_date
13096                    AND vpf.effective_end_date
13097       AND      vpf.vrbl_rt_prfl_id = pfr.vrbl_rt_prfl_id
13098       AND      p_effective_date BETWEEN pfr.effective_start_date
13099                    AND pfr.effective_end_date
13100       AND      pfr.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
13101       AND      (
13102                     (
13103                           p_new_val IS NOT NULL
13104                       AND p_old_val IS NOT NULL
13105                       AND p_new_val >= NVL(pff.mn_pct_val
13106                                         ,p_new_val)
13107                       AND (p_new_val*100)  < ( NVL(pff.mx_pct_val
13108                                        ,p_new_val)*100)+1 )
13109                  OR (
13110                           p_new_val IS NOT NULL
13111                       AND p_old_val IS NOT NULL
13112                       AND (
13113                                p_new_val < NVL(pff.mn_pct_val
13114                                             ,p_new_val)
13115                             OR (p_new_val*100)  >= (NVL(pff.mx_pct_val
13116                                              ,p_new_val)*100)+1 )
13117                       AND p_old_val >= NVL(pff.mn_pct_val
13118                                         ,p_old_val)
13119                       AND (p_old_val*100) < ( NVL(pff.mx_pct_val
13120                                        ,p_old_val)*100)+1 )
13121                  OR (    p_new_val IS NULL
13122                      AND p_old_val IS NULL));
13123     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
13124     --UNION ALL
13125     CURSOR c2 IS
13126       SELECT   p_pl_id
13127               ,'Y'
13128               ,pff.use_prmry_asnt_only_flag
13129               ,pff.use_sum_of_all_asnts_flag
13130               ,pff.rndg_cd
13131               ,pff.rndg_rl
13132               ,pff.mn_pct_val
13133               ,pff.mx_pct_val
13134       FROM     ben_pct_fl_tm_fctr pff
13135               --,ben_pct_fl_tm_rt_f pfr
13136               ,ben_elig_pct_fl_tm_prte_f epf
13137               ,ben_eligy_prfl_f elp
13138               ,ben_vrbl_rt_elig_prfl_f vep
13139               ,ben_vrbl_rt_prfl_f vpf
13140               ,ben_acty_vrbl_rt_f avr
13141               ,ben_acty_base_rt_f abr
13142       WHERE    abr.pl_id = p_pl_id
13143       AND      p_effective_date BETWEEN abr.effective_start_date
13144                    AND abr.effective_end_date
13145       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
13146       AND      p_effective_date BETWEEN avr.effective_start_date
13147                    AND avr.effective_end_date
13148       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
13149       AND      p_effective_date BETWEEN vpf.effective_start_date
13150                    AND vpf.effective_end_date
13151 --      AND      vpf.vrbl_rt_prfl_id = epf.vrbl_rt_prfl_id
13152       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
13153       AND      p_effective_date BETWEEN vep.effective_start_date
13154                    AND vep.effective_end_date
13155       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
13156       AND      p_effective_date BETWEEN elp.effective_start_date
13157                    AND elp.effective_end_date
13158       AND      epf.eligy_prfl_id = elp.eligy_prfl_id
13159       AND      p_effective_date BETWEEN epf.effective_start_date
13160                    AND epf.effective_end_date
13161       AND      epf.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
13162       AND      (
13163                     (
13164                           p_new_val IS NOT NULL
13165                       AND p_old_val IS NOT NULL
13166                       AND p_new_val >= NVL(pff.mn_pct_val
13167                                         ,p_new_val)
13168                       AND (p_new_val*100)  < ( NVL(pff.mx_pct_val
13169                                        ,p_new_val)*100)+1 )
13170                  OR (
13171                           p_new_val IS NOT NULL
13172                       AND p_old_val IS NOT NULL
13173                       AND (
13174                                p_new_val < NVL(pff.mn_pct_val
13175                                             ,p_new_val)
13176                             OR (p_new_val*100)  >= (NVL(pff.mx_pct_val
13177                                              ,p_new_val)*100)+1 )
13181                                        ,p_old_val)*100)+1 )
13178                       AND p_old_val >= NVL(pff.mn_pct_val
13179                                         ,p_old_val)
13180                       AND (p_old_val*100) < ( NVL(pff.mx_pct_val
13182                  OR (    p_new_val IS NULL
13183                      AND p_old_val IS NULL));
13184     --
13185     --
13186     l_index          PLS_INTEGER;
13187     l_not_hash_found BOOLEAN;
13188     l_c2notfound       BOOLEAN;
13189   --
13190   BEGIN
13191     --
13192     -- hr_utility.set_location ('Entering '||l_package,10);
13193     --
13194     -- Steps to do process
13195     --
13196     -- 1) Try and get value from cache
13197     -- 2) If can get from cache then copy to output record
13198     -- 3) If can't get from cache do db hit and then
13199     --    copy to cache record and then copy to output record.
13200     --
13201     -- Get hashed index value
13202     --
13203     l_index  := MOD(p_pl_id
13204                  ,g_hash_key);
13205     --
13206     IF NOT g_cache_pl_pff_rt_rec.EXISTS(l_index) THEN
13207       --
13208       -- Lets store the hash value in this index
13209       --
13210       RAISE NO_DATA_FOUND;
13211     --
13212     ELSE
13213       --
13214       -- If it does exist make sure its the right one
13215       --
13216       IF g_cache_pl_pff_rt_rec(l_index).id <> p_pl_id THEN
13217         --
13218         -- Loop through the hash using the jump routine to check further
13219         -- indexes
13220         --
13221         l_not_hash_found  := FALSE;
13222         --
13223         WHILE NOT l_not_hash_found LOOP
13224           --
13225           l_index  := l_index + g_hash_jump;
13226           --
13227           -- Check if the hash index exists, if not we can use it
13228           --
13229           IF NOT g_cache_pl_pff_rt_rec.EXISTS(l_index) THEN
13230             --
13231             -- Lets store the hash value in the index
13232             --
13233             RAISE NO_DATA_FOUND;
13234           --
13235           ELSE
13236             --
13237             -- Make sure the index is the correct one
13238             --
13239             IF g_cache_pl_pff_rt_rec(l_index).id = p_pl_id THEN
13240               --
13241               -- We have a match so the hashed value  has been stored before
13242               --
13243               l_not_hash_found  := TRUE;
13244             --
13245             END IF;
13246           --
13247           END IF;
13248         --
13249         END LOOP;
13250       --
13251       END IF;
13252     --
13253     END IF;
13254     --
13255     -- If p_old_val and p_new_val is set this means we are trying to retrieve
13256     -- the correct rate for the calculated value.
13257     -- Previously we just cached the first rate we
13258     -- found since we needed the determination code, the correct age,los code,etc
13259     -- By killing the cache and forcing the value to be removed we cache the
13260     -- correct rate profile for the case we need.
13261     --
13262     IF     p_old_val IS NOT NULL
13263        AND p_new_val IS NOT NULL THEN
13264       --
13265       RAISE NO_DATA_FOUND;
13266     --
13267     END IF;
13268     --
13269     p_rec    := g_cache_pl_pff_rt_rec(l_index);
13270   --
13271   -- hr_utility.set_location ('Leaving '||l_package,10);
13272   --
13273   EXCEPTION
13274     --
13275     WHEN NO_DATA_FOUND THEN
13276       --
13277       -- The record has not been cached yet so lets cache it
13278       --
13279       OPEN c1;
13280       --
13281       FETCH c1 INTO g_cache_pl_pff_rt_rec(l_index);
13282       -- PERFNEW
13283       IF c1%NOTFOUND THEN
13284          --
13285          l_c2notfound := false;
13286          OPEN c2;
13287          FETCH c2 INTO g_cache_pl_pff_rt_rec(l_index);
13288          IF c2%NOTFOUND THEN
13289             --
13290             l_c2notfound := true;
13291             --
13292          END IF;
13293          CLOSE c2;
13294          --
13295       END IF;
13296       -- PERFNEW
13297       IF     p_old_val IS NULL
13298          AND p_new_val IS NULL THEN
13299         --
13300         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
13301           --
13302           if NOT g_cache_pl_pff_rt_rec.EXISTS(l_index) then
13303             g_cache_pl_pff_rt_rec(l_index).id     := p_pl_id;
13304             g_cache_pl_pff_rt_rec(l_index).exist  := 'N';
13305           end if;
13306         --
13307         END IF;
13308       --
13309       END IF;
13310       --
13311       p_rec  := g_cache_pl_pff_rt_rec(l_index);
13312       --
13313       CLOSE c1;
13314   --
13315   END get_pct_pl_rate;
13316 --
13317   PROCEDURE get_pct_oipl_rate(
13318     p_oipl_id           IN            NUMBER
13319    ,p_old_val           IN            NUMBER DEFAULT NULL
13320    ,p_new_val           IN            NUMBER DEFAULT NULL
13321    ,p_business_group_id IN            NUMBER
13322    ,p_effective_date    IN            DATE
13323    ,p_rec               OUT NOCOPY    g_cache_pff_rec_obj) IS
13324     --
13325     l_package        VARCHAR2(80) := g_package || '.get_pct_oipl_rate';
13329     l_opt_id    NUMBER;
13326     l_old_val_1 NUMBER := p_old_val + 1;
13327     l_new_val_1 NUMBER := p_new_val + 1;
13328     --
13330     --
13331     -- Define Cursor
13332     --
13333     CURSOR c1 IS
13334       SELECT   p_oipl_id
13335               ,'Y'
13336               ,pff.use_prmry_asnt_only_flag
13337               ,pff.use_sum_of_all_asnts_flag
13338               ,pff.rndg_cd
13339               ,pff.rndg_rl
13340               ,pff.mn_pct_val
13341               ,pff.mx_pct_val
13342       FROM     ben_pct_fl_tm_fctr pff
13343               ,ben_pct_fl_tm_rt_f pfr
13344               ,ben_vrbl_rt_prfl_f vpf
13345               ,ben_acty_vrbl_rt_f avr
13346               ,ben_acty_base_rt_f abr
13347       WHERE    ( abr.oipl_id = p_oipl_id
13348       --
13349       --START Option level Rates Enhancements
13350                or ( abr.opt_id = l_opt_id and
13351                      not exists (select null from ben_acty_base_rt_f abr1
13352                      where abr1.oipl_id = p_oipl_id )))
13353       --END Option level Rates Enhancements
13354       --
13355       AND      p_effective_date BETWEEN abr.effective_start_date
13356                    AND abr.effective_end_date
13357       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
13358       AND      p_effective_date BETWEEN avr.effective_start_date
13359                    AND avr.effective_end_date
13360       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
13361       AND      p_effective_date BETWEEN vpf.effective_start_date
13362                    AND vpf.effective_end_date
13363       AND      vpf.vrbl_rt_prfl_id = pfr.vrbl_rt_prfl_id
13364       AND      p_effective_date BETWEEN pfr.effective_start_date
13365                    AND pfr.effective_end_date
13366       AND      pfr.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
13367       AND      (
13368                     (
13369                           p_new_val IS NOT NULL
13370                       AND p_old_val IS NOT NULL
13371                       AND p_new_val >= NVL(pff.mn_pct_val
13372                                         ,p_new_val)
13373                       AND (p_new_val*100) < ( NVL(pff.mx_pct_val
13374                                        ,p_new_val)*100)+1)
13375                  OR (
13376                           p_new_val IS NOT NULL
13377                       AND p_old_val IS NOT NULL
13378                       AND (
13379                                p_new_val < NVL(pff.mn_pct_val
13380                                             ,p_new_val)
13381                             OR (p_new_val*100) >= (NVL(pff.mx_pct_val
13382                                              ,p_new_val)*100)+1)
13383                       AND p_old_val >= NVL(pff.mn_pct_val
13384                                         ,p_old_val)
13385                       AND (p_old_val*100) <( NVL(pff.mx_pct_val
13386                                        ,p_old_val)*100)+1)
13387                  OR (    p_new_val IS NULL
13388                      AND p_old_val IS NULL));
13389     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
13390     --UNION ALL
13391     CURSOR c2 IS
13392       SELECT   p_oipl_id
13393               ,'Y'
13394               ,pff.use_prmry_asnt_only_flag
13395               ,pff.use_sum_of_all_asnts_flag
13396               ,pff.rndg_cd
13397               ,pff.rndg_rl
13398               ,pff.mn_pct_val
13399               ,pff.mx_pct_val
13400       FROM     ben_pct_fl_tm_fctr pff
13401               --,ben_pct_fl_tm_rt_f pfr
13402               ,ben_elig_pct_fl_tm_prte_f epf
13403               ,ben_eligy_prfl_f elp
13404               ,ben_vrbl_rt_elig_prfl_f vep
13405               ,ben_vrbl_rt_prfl_f vpf
13406               ,ben_acty_vrbl_rt_f avr
13407               ,ben_acty_base_rt_f abr
13408       WHERE    ( abr.oipl_id = p_oipl_id
13409       --
13410       --START Option level Rates Enhancements
13411                or ( abr.opt_id = l_opt_id and
13412                      not exists (select null from ben_acty_base_rt_f abr1
13413                      where abr1.oipl_id = p_oipl_id )))
13414       --END Option level Rates Enhancements
13415       --
13416       AND      p_effective_date BETWEEN abr.effective_start_date
13417                    AND abr.effective_end_date
13418       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
13419       AND      p_effective_date BETWEEN avr.effective_start_date
13420                    AND avr.effective_end_date
13421       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
13422       AND      p_effective_date BETWEEN vpf.effective_start_date
13423                    AND vpf.effective_end_date
13424 --      AND      vpf.vrbl_rt_prfl_id = epf.vrbl_rt_prfl_id
13425       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
13426       AND      p_effective_date BETWEEN vep.effective_start_date
13427                    AND vep.effective_end_date
13428       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
13429       AND      p_effective_date BETWEEN elp.effective_start_date
13430                    AND elp.effective_end_date
13431       AND      epf.eligy_prfl_id = elp.eligy_prfl_id
13432       AND      p_effective_date BETWEEN epf.effective_start_date
13433                    AND epf.effective_end_date
13434       AND      epf.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
13435       AND      (
13436                     (
13437                           p_new_val IS NOT NULL
13438                       AND p_old_val IS NOT NULL
13439                       AND p_new_val >= NVL(pff.mn_pct_val
13440                                         ,p_new_val)
13444                           p_new_val IS NOT NULL
13441                       AND (p_new_val*100) < ( NVL(pff.mx_pct_val
13442                                        ,p_new_val)*100)+1)
13443                  OR (
13445                       AND p_old_val IS NOT NULL
13446                       AND (
13447                                p_new_val < NVL(pff.mn_pct_val
13448                                             ,p_new_val)
13449                             OR (p_new_val*100) >= (NVL(pff.mx_pct_val
13450                                              ,p_new_val)*100)+1)
13451                       AND p_old_val >= NVL(pff.mn_pct_val
13452                                         ,p_old_val)
13453                       AND (p_old_val*100) <( NVL(pff.mx_pct_val
13454                                        ,p_old_val)*100)+1)
13455                  OR (    p_new_val IS NULL
13456                      AND p_old_val IS NULL));
13457     --
13458     --
13459     l_index          PLS_INTEGER;
13460     l_not_hash_found BOOLEAN;
13461     l_c2notfound       BOOLEAN;
13462   --
13463   BEGIN
13464     --
13465     -- hr_utility.set_location ('Entering '||l_package,10);
13466     --
13467     -- Steps to do process
13468     --
13469     -- 1) Try and get value from cache
13470     -- 2) If can get from cache then copy to output record
13471     -- 3) If can't get from cache do db hit and then
13472     --    copy to cache record and then copy to output record.
13473     --
13474     -- Get hashed index value
13475     --
13476     l_index  := MOD(p_oipl_id
13477                  ,g_hash_key);
13478     --
13479     IF NOT g_cache_oipl_pff_rt_rec.EXISTS(l_index) THEN
13480       --
13481       -- Lets store the hash value in this index
13482       --
13483       RAISE NO_DATA_FOUND;
13484     --
13485     ELSE
13486       --
13487       -- If it does exist make sure its the right one
13488       --
13489       IF g_cache_oipl_pff_rt_rec(l_index).id <> p_oipl_id THEN
13490         --
13491         -- Loop through the hash using the jump routine to check further
13492         -- indexes
13493         --
13494         l_not_hash_found  := FALSE;
13495         --
13496         WHILE NOT l_not_hash_found LOOP
13497           --
13498           l_index  := l_index + g_hash_jump;
13499           --
13500           -- Check if the hash index exists, if not we can use it
13501           --
13502           IF NOT g_cache_oipl_pff_rt_rec.EXISTS(l_index) THEN
13503             --
13504             -- Lets store the hash value in the index
13505             --
13506             RAISE NO_DATA_FOUND;
13507           --
13508           ELSE
13509             --
13510             -- Make sure the index is the correct one
13511             --
13512             IF g_cache_oipl_pff_rt_rec(l_index).id = p_oipl_id THEN
13513               --
13514               -- We have a match so the hashed value  has been stored before
13515               --
13516               l_not_hash_found  := TRUE;
13517             --
13518             END IF;
13519           --
13520           END IF;
13521         --
13522         END LOOP;
13523       --
13524       END IF;
13525     --
13526     END IF;
13527     --
13528     -- If p_old_val and p_new_val is set this means we are trying to retrieve
13529     -- the correct rate for the calculated value.
13530     -- Previously we just cached the first rate we
13531     -- found since we needed the determination code, the correct age,los code,etc
13532     -- By killing the cache and forcing the value to be removed we cache the
13533     -- correct rate profile for the case we need.
13534     --
13535     IF     p_old_val IS NOT NULL
13536        AND p_new_val IS NOT NULL THEN
13537       --
13538       RAISE NO_DATA_FOUND;
13539     --
13540     END IF;
13541     --
13542     p_rec    := g_cache_oipl_pff_rt_rec(l_index);
13543   --
13544   -- hr_utility.set_location ('Leaving '||l_package,10);
13545   --
13546   EXCEPTION
13547     --
13548     WHEN NO_DATA_FOUND THEN
13549       --
13550       -- The record has not been cached yet so lets cache it
13551       -- Option level rates enhancement
13552       l_opt_id := get_opt_id(p_oipl_id,p_effective_date);
13553       --
13554       OPEN c1;
13555       --
13556       FETCH c1 INTO g_cache_oipl_pff_rt_rec(l_index);
13557       -- PERFNEW
13558       IF c1%NOTFOUND THEN
13559          --
13560          l_c2notfound := false;
13561          OPEN c2;
13562          FETCH c2 INTO g_cache_oipl_pff_rt_rec(l_index);
13563          IF c2%NOTFOUND THEN
13564             --
13565             l_c2notfound := true;
13566             --
13567          END IF;
13568          CLOSE c2;
13569          --
13570       END IF;
13571       -- PERFNEW
13572       IF     p_old_val IS NULL
13573          AND p_new_val IS NULL THEN
13574         --
13575         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
13576           --
13577           if NOT g_cache_oipl_pff_rt_rec.EXISTS(l_index) then
13578             g_cache_oipl_pff_rt_rec(l_index).id     := p_oipl_id;
13579             g_cache_oipl_pff_rt_rec(l_index).exist  := 'N';
13580           end if;
13581         --
13582         END IF;
13583       --
13584       END IF;
13585       --
13589   --
13586       p_rec  := g_cache_oipl_pff_rt_rec(l_index);
13587       --
13588       CLOSE c1;
13590   END get_pct_oipl_rate;
13591 --
13592   PROCEDURE get_pct_plip_rate(
13593     p_plip_id           IN            NUMBER
13594    ,p_old_val           IN            NUMBER DEFAULT NULL
13595    ,p_new_val           IN            NUMBER DEFAULT NULL
13596    ,p_business_group_id IN            NUMBER
13597    ,p_effective_date    IN            DATE
13598    ,p_rec               OUT NOCOPY    g_cache_pff_rec_obj) IS
13599     --
13600     l_package        VARCHAR2(80) := g_package || '.get_pct_plip_rate';
13601     l_old_val_1 NUMBER := p_old_val + 1;
13602     l_new_val_1 NUMBER := p_new_val + 1;
13603     --
13604     -- Define Cursor
13605     --
13606     CURSOR c1 IS
13607       SELECT   p_plip_id
13608               ,'Y'
13609               ,pff.use_prmry_asnt_only_flag
13610               ,pff.use_sum_of_all_asnts_flag
13611               ,pff.rndg_cd
13612               ,pff.rndg_rl
13613               ,pff.mn_pct_val
13614               ,pff.mx_pct_val
13615       FROM     ben_pct_fl_tm_fctr pff
13616               ,ben_pct_fl_tm_rt_f pfr
13617               ,ben_vrbl_rt_prfl_f vpf
13618               ,ben_acty_vrbl_rt_f avr
13619               ,ben_acty_base_rt_f abr
13620       WHERE    abr.plip_id = p_plip_id
13621       AND      p_effective_date BETWEEN abr.effective_start_date
13622                    AND abr.effective_end_date
13623       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
13624       AND      p_effective_date BETWEEN avr.effective_start_date
13625                    AND avr.effective_end_date
13626       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
13627       AND      p_effective_date BETWEEN vpf.effective_start_date
13628                    AND vpf.effective_end_date
13629       AND      vpf.vrbl_rt_prfl_id = pfr.vrbl_rt_prfl_id
13630       AND      p_effective_date BETWEEN pfr.effective_start_date
13631                    AND pfr.effective_end_date
13632       AND      pfr.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
13633       AND      (
13634                     (
13635                           p_new_val IS NOT NULL
13636                       AND p_old_val IS NOT NULL
13637                       AND p_new_val >= NVL(pff.mn_pct_val
13638                                         ,p_new_val)
13639                       AND (p_new_val*100)  < (NVL(pff.mx_pct_val
13640                                        ,p_new_val)*100)+1)
13641                  OR (
13642                           p_new_val IS NOT NULL
13643                       AND p_old_val IS NOT NULL
13644                       AND (
13645                                p_new_val < NVL(pff.mn_pct_val
13646                                             ,p_new_val)
13647                             OR (p_new_val*100) >= ( NVL(pff.mx_pct_val
13648                                              ,p_new_val)*100)+1)
13649                       AND p_old_val >= NVL(pff.mn_pct_val
13650                                         ,p_old_val)
13651                       AND (p_old_val*100) < (NVL(pff.mx_pct_val
13652                                        ,p_old_val)*100)+1)
13653                  OR (    p_new_val IS NULL
13654                      AND p_old_val IS NULL));
13655     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
13656     --UNION ALL
13657     CURSOR c2 IS
13658       SELECT   p_plip_id
13659               ,'Y'
13660               ,pff.use_prmry_asnt_only_flag
13661               ,pff.use_sum_of_all_asnts_flag
13662               ,pff.rndg_cd
13663               ,pff.rndg_rl
13664               ,pff.mn_pct_val
13665               ,pff.mx_pct_val
13666       FROM     ben_pct_fl_tm_fctr pff
13667               --,ben_pct_fl_tm_rt_f pfr
13668               ,ben_elig_pct_fl_tm_prte_f epf
13669               ,ben_eligy_prfl_f elp
13670               ,ben_vrbl_rt_elig_prfl_f vep
13671               ,ben_vrbl_rt_prfl_f vpf
13672               ,ben_acty_vrbl_rt_f avr
13673               ,ben_acty_base_rt_f abr
13674       WHERE    abr.plip_id = p_plip_id
13675       AND      p_effective_date BETWEEN abr.effective_start_date
13676                    AND abr.effective_end_date
13677       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
13678       AND      p_effective_date BETWEEN avr.effective_start_date
13679                    AND avr.effective_end_date
13680       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
13681       AND      p_effective_date BETWEEN vpf.effective_start_date
13682                    AND vpf.effective_end_date
13683 --      AND      vpf.vrbl_rt_prfl_id = epf.vrbl_rt_prfl_id
13684       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
13685       AND      p_effective_date BETWEEN vep.effective_start_date
13686                    AND vep.effective_end_date
13687       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
13688       AND      p_effective_date BETWEEN elp.effective_start_date
13689                    AND elp.effective_end_date
13690       AND      epf.eligy_prfl_id = elp.eligy_prfl_id
13691       AND      p_effective_date BETWEEN epf.effective_start_date
13692                    AND epf.effective_end_date
13693       AND      epf.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
13694       AND      (
13695                     (
13696                           p_new_val IS NOT NULL
13697                       AND p_old_val IS NOT NULL
13698                       AND p_new_val >= NVL(pff.mn_pct_val
13699                                         ,p_new_val)
13703                           p_new_val IS NOT NULL
13700                       AND (p_new_val*100)  < (NVL(pff.mx_pct_val
13701                                        ,p_new_val)*100)+1)
13702                  OR (
13704                       AND p_old_val IS NOT NULL
13705                       AND (
13706                                p_new_val < NVL(pff.mn_pct_val
13707                                             ,p_new_val)
13708                             OR (p_new_val*100) >= ( NVL(pff.mx_pct_val
13709                                              ,p_new_val)*100)+1)
13710                       AND p_old_val >= NVL(pff.mn_pct_val
13711                                         ,p_old_val)
13712                       AND (p_old_val*100) < (NVL(pff.mx_pct_val
13713                                        ,p_old_val)*100)+1)
13714                  OR (    p_new_val IS NULL
13715                      AND p_old_val IS NULL));
13716     --
13717     --
13718     l_index          PLS_INTEGER;
13719     l_not_hash_found BOOLEAN;
13720     l_c2notfound       BOOLEAN;
13721   --
13722   BEGIN
13723     --
13724     -- hr_utility.set_location ('Entering '||l_package,10);
13725     --
13726     -- Steps to do process
13727     --
13728     -- 1) Try and get value from cache
13729     -- 2) If can get from cache then copy to output record
13730     -- 3) If can't get from cache do db hit and then
13731     --    copy to cache record and then copy to output record.
13732     --
13733     -- Get hashed index value
13734     --
13735     l_index  := MOD(p_plip_id
13736                  ,g_hash_key);
13737     --
13738     IF NOT g_cache_plip_pff_rt_rec.EXISTS(l_index) THEN
13739       --
13740       -- Lets store the hash value in this index
13741       --
13742       RAISE NO_DATA_FOUND;
13743     --
13744     ELSE
13745       --
13746       -- If it does exist make sure its the right one
13747       --
13748       IF g_cache_plip_pff_rt_rec(l_index).id <> p_plip_id THEN
13749         --
13750         -- Loop through the hash using the jump routine to check further
13751         -- indexes
13752         --
13753         l_not_hash_found  := FALSE;
13754         --
13755         WHILE NOT l_not_hash_found LOOP
13756           --
13757           l_index  := l_index + g_hash_jump;
13758           --
13759           -- Check if the hash index exists, if not we can use it
13760           --
13761           IF NOT g_cache_plip_pff_rt_rec.EXISTS(l_index) THEN
13762             --
13763             -- Lets store the hash value in the index
13764             --
13765             RAISE NO_DATA_FOUND;
13766           --
13767           ELSE
13768             --
13769             -- Make sure the index is the correct one
13770             --
13771             IF g_cache_plip_pff_rt_rec(l_index).id = p_plip_id THEN
13772               --
13773               -- We have a match so the hashed value  has been stored before
13774               --
13775               l_not_hash_found  := TRUE;
13776             --
13777             END IF;
13778           --
13779           END IF;
13780         --
13781         END LOOP;
13782       --
13783       END IF;
13784     --
13785     END IF;
13786     --
13787     -- If p_old_val and p_new_val is set this means we are trying to retrieve
13788     -- the correct rate for the calculated value.
13789     -- Previously we just cached the first rate we
13790     -- found since we needed the determination code, the correct age,los code,etc
13791     -- By killing the cache and forcing the value to be removed we cache the
13792     -- correct rate profile for the case we need.
13793     --
13794     IF     p_old_val IS NOT NULL
13795        AND p_new_val IS NOT NULL THEN
13796       --
13797       RAISE NO_DATA_FOUND;
13798     --
13799     END IF;
13800     --
13801     p_rec    := g_cache_plip_pff_rt_rec(l_index);
13802   --
13803   -- hr_utility.set_location ('Leaving '||l_package,10);
13804   --
13805   EXCEPTION
13806     --
13807     WHEN NO_DATA_FOUND THEN
13808       --
13809       -- The record has not been cached yet so lets cache it
13810       --
13811       OPEN c1;
13812       --
13813       FETCH c1 INTO g_cache_plip_pff_rt_rec(l_index);
13814       -- PERFNEW
13815       IF c1%NOTFOUND THEN
13816          --
13817          l_c2notfound := false;
13818          OPEN c2;
13819          FETCH c2 INTO g_cache_plip_pff_rt_rec(l_index);
13820          IF c2%NOTFOUND THEN
13821             --
13822             l_c2notfound := true;
13823             --
13824          END IF;
13825          CLOSE c2;
13826          --
13827       END IF;
13828       -- PERFNEW
13829       IF     p_old_val IS NULL
13830          AND p_new_val IS NULL THEN
13831         --
13832         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
13833           --
13834           if NOT g_cache_plip_pff_rt_rec.EXISTS(l_index) then
13835             g_cache_plip_pff_rt_rec(l_index).id     := p_plip_id;
13836             g_cache_plip_pff_rt_rec(l_index).exist  := 'N';
13837           end if;
13838         --
13839         END IF;
13840       --
13841       END IF;
13842       --
13843       p_rec  := g_cache_plip_pff_rt_rec(l_index);
13844       --
13845       CLOSE c1;
13846   --
13847   END get_pct_plip_rate;
13848 --
13849   PROCEDURE get_pct_ptip_rate(
13853    ,p_business_group_id IN            NUMBER
13850     p_ptip_id           IN            NUMBER
13851    ,p_old_val           IN            NUMBER DEFAULT NULL
13852    ,p_new_val           IN            NUMBER DEFAULT NULL
13854    ,p_effective_date    IN            DATE
13855    ,p_rec               OUT NOCOPY    g_cache_pff_rec_obj) IS
13856     --
13857     l_package        VARCHAR2(80) := g_package || '.get_pct_ptip_rate';
13858     l_old_val_1 NUMBER := p_old_val + 1;
13859     l_new_val_1 NUMBER := p_new_val + 1;
13860     --
13861     -- Define Cursor
13862     --
13863     CURSOR c1 IS
13864       SELECT   p_ptip_id
13865               ,'Y'
13866               ,pff.use_prmry_asnt_only_flag
13867               ,pff.use_sum_of_all_asnts_flag
13868               ,pff.rndg_cd
13869               ,pff.rndg_rl
13870               ,pff.mn_pct_val
13871               ,pff.mx_pct_val
13872       FROM     ben_pct_fl_tm_fctr pff
13873               ,ben_pct_fl_tm_rt_f pfr
13874               ,ben_vrbl_rt_prfl_f vpf
13875               ,ben_acty_vrbl_rt_f avr
13876               ,ben_acty_base_rt_f abr
13877       WHERE    abr.ptip_id = p_ptip_id
13878       AND      p_effective_date BETWEEN abr.effective_start_date
13879                    AND abr.effective_end_date
13880       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
13881       AND      p_effective_date BETWEEN avr.effective_start_date
13882                    AND avr.effective_end_date
13883       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
13884       AND      p_effective_date BETWEEN vpf.effective_start_date
13885                    AND vpf.effective_end_date
13886       AND      vpf.vrbl_rt_prfl_id = pfr.vrbl_rt_prfl_id
13887       AND      p_effective_date BETWEEN pfr.effective_start_date
13888                    AND pfr.effective_end_date
13889       AND      pfr.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
13890       AND      (
13891                     (
13892                           p_new_val IS NOT NULL
13893                       AND p_old_val IS NOT NULL
13894                       AND p_new_val >= NVL(pff.mn_pct_val
13895                                         ,p_new_val)
13896                       AND (p_new_val*100) < (NVL(pff.mx_pct_val
13897                                        ,p_new_val)*100)+1)
13898                  OR (
13899                           p_new_val IS NOT NULL
13900                       AND p_old_val IS NOT NULL
13901                       AND (
13902                                p_new_val < NVL(pff.mn_pct_val
13903                                             ,p_new_val)
13904                             OR (p_new_val*100) >= (NVL(pff.mx_pct_val
13905                                              ,p_new_val)*100)+1)
13906                       AND p_old_val >= NVL(pff.mn_pct_val
13907                                         ,p_old_val)
13908                       AND (p_old_val*100) < ( NVL(pff.mx_pct_val
13909                                        ,p_old_val)*100)+1)
13910                  OR (    p_new_val IS NULL
13911                      AND p_old_val IS NULL));
13912     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
13913     --UNION ALL
13914     CURSOR c2 IS
13915       SELECT   p_ptip_id
13916               ,'Y'
13917               ,pff.use_prmry_asnt_only_flag
13918               ,pff.use_sum_of_all_asnts_flag
13919               ,pff.rndg_cd
13920               ,pff.rndg_rl
13921               ,pff.mn_pct_val
13922               ,pff.mx_pct_val
13923       FROM     ben_pct_fl_tm_fctr pff
13924               --,ben_pct_fl_tm_rt_f pfr
13925               ,ben_elig_pct_fl_tm_prte_f epf
13926               ,ben_eligy_prfl_f elp
13927               ,ben_vrbl_rt_elig_prfl_f vep
13928               ,ben_vrbl_rt_prfl_f vpf
13929               ,ben_acty_vrbl_rt_f avr
13930               ,ben_acty_base_rt_f abr
13931       WHERE    abr.ptip_id = p_ptip_id
13932       AND      p_effective_date BETWEEN abr.effective_start_date
13933                    AND abr.effective_end_date
13934       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
13935       AND      p_effective_date BETWEEN avr.effective_start_date
13936                    AND avr.effective_end_date
13937       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
13938       AND      p_effective_date BETWEEN vpf.effective_start_date
13939                    AND vpf.effective_end_date
13940 --      AND      vpf.vrbl_rt_prfl_id = epf.vrbl_rt_prfl_id
13941       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
13942       AND      p_effective_date BETWEEN vep.effective_start_date
13943                    AND vep.effective_end_date
13944       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
13945       AND      p_effective_date BETWEEN elp.effective_start_date
13946                    AND elp.effective_end_date
13947       AND      epf.eligy_prfl_id = elp.eligy_prfl_id
13948       AND      p_effective_date BETWEEN epf.effective_start_date
13949                    AND epf.effective_end_date
13950       AND      epf.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
13951       AND      (
13952                     (
13953                           p_new_val IS NOT NULL
13954                       AND p_old_val IS NOT NULL
13955                       AND p_new_val >= NVL(pff.mn_pct_val
13956                                         ,p_new_val)
13957                       AND (p_new_val*100) < (NVL(pff.mx_pct_val
13958                                        ,p_new_val)*100)+1)
13959                  OR (
13963                                p_new_val < NVL(pff.mn_pct_val
13960                           p_new_val IS NOT NULL
13961                       AND p_old_val IS NOT NULL
13962                       AND (
13964                                             ,p_new_val)
13965                             OR (p_new_val*100) >= (NVL(pff.mx_pct_val
13966                                              ,p_new_val)*100)+1)
13967                       AND p_old_val >= NVL(pff.mn_pct_val
13968                                         ,p_old_val)
13969                       AND (p_old_val*100) < ( NVL(pff.mx_pct_val
13970                                        ,p_old_val)*100)+1)
13971                  OR (    p_new_val IS NULL
13972                      AND p_old_val IS NULL));
13973     --
13974     --
13975     l_index          PLS_INTEGER;
13976     l_not_hash_found BOOLEAN;
13977     l_c2notfound       BOOLEAN;
13978   --
13979   BEGIN
13980     --
13981     -- hr_utility.set_location ('Entering '||l_package,10);
13982     --
13983     -- Steps to do process
13984     --
13985     -- 1) Try and get value from cache
13986     -- 2) If can get from cache then copy to output record
13987     -- 3) If can't get from cache do db hit and then
13988     --    copy to cache record and then copy to output record.
13989     --
13990     -- Get hashed index value
13991     --
13992     l_index  := MOD(p_ptip_id
13993                  ,g_hash_key);
13994     --
13995     IF NOT g_cache_ptip_pff_rt_rec.EXISTS(l_index) THEN
13996       --
13997       -- Lets store the hash value in this index
13998       --
13999       RAISE NO_DATA_FOUND;
14000     --
14001     ELSE
14002       --
14003       -- If it does exist make sure its the right one
14004       --
14005       IF g_cache_ptip_pff_rt_rec(l_index).id <> p_ptip_id THEN
14006         --
14007         -- Loop through the hash using the jump routine to check further
14008         -- indexes
14009         --
14010         l_not_hash_found  := FALSE;
14011         --
14012         WHILE NOT l_not_hash_found LOOP
14013           --
14014           l_index  := l_index + g_hash_jump;
14015           --
14016           -- Check if the hash index exists, if not we can use it
14017           --
14018           IF NOT g_cache_ptip_pff_rt_rec.EXISTS(l_index) THEN
14019             --
14020             -- Lets store the hash value in the index
14021             --
14022             RAISE NO_DATA_FOUND;
14023           --
14024           ELSE
14025             --
14026             -- Make sure the index is the correct one
14027             --
14028             IF g_cache_ptip_pff_rt_rec(l_index).id = p_ptip_id THEN
14029               --
14030               -- We have a match so the hashed value  has been stored before
14031               --
14032               l_not_hash_found  := TRUE;
14033             --
14034             END IF;
14035           --
14036           END IF;
14037         --
14038         END LOOP;
14039       --
14040       END IF;
14041     --
14042     END IF;
14043     --
14044     -- If p_old_val and p_new_val is set this means we are trying to retrieve
14045     -- the correct rate for the calculated value.
14046     -- Previously we just cached the first rate we
14047     -- found since we needed the determination code, the correct age,los code,etc
14048     -- By killing the cache and forcing the value to be removed we cache the
14049     -- correct rate profile for the case we need.
14050     --
14051     IF     p_old_val IS NOT NULL
14052        AND p_new_val IS NOT NULL THEN
14053       --
14054       RAISE NO_DATA_FOUND;
14055     --
14056     END IF;
14057     --
14058     p_rec    := g_cache_ptip_pff_rt_rec(l_index);
14059   --
14060   -- hr_utility.set_location ('Leaving '||l_package,10);
14061   --
14062   EXCEPTION
14063     --
14064     WHEN NO_DATA_FOUND THEN
14065       --
14066       -- The record has not been cached yet so lets cache it
14067       --
14068       OPEN c1;
14069       --
14070       FETCH c1 INTO g_cache_ptip_pff_rt_rec(l_index);
14071       -- PERFNEW
14072       IF c1%NOTFOUND THEN
14073          --
14074          l_c2notfound := false;
14075          OPEN c2;
14076          FETCH c2 INTO g_cache_ptip_pff_rt_rec(l_index);
14077          IF c2%NOTFOUND THEN
14078             --
14079             l_c2notfound := true;
14080             --
14081          END IF;
14082          CLOSE c2;
14083          --
14084       END IF;
14085       -- PERFNEW
14086       IF     p_old_val IS NULL
14087          AND p_new_val IS NULL THEN
14088         --
14089         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
14090           --
14091           if NOT g_cache_ptip_pff_rt_rec.EXISTS(l_index) then
14092             g_cache_ptip_pff_rt_rec(l_index).id     := p_ptip_id;
14093             g_cache_ptip_pff_rt_rec(l_index).exist  := 'N';
14094           end if;
14095         --
14096         END IF;
14097       --
14098       END IF;
14099       --
14100       p_rec  := g_cache_ptip_pff_rt_rec(l_index);
14101       --
14102       CLOSE c1;
14103   --
14104   END get_pct_ptip_rate;
14105 --
14106   PROCEDURE get_pct_oiplip_rate(
14107     p_oiplip_id         IN            NUMBER
14108    ,p_old_val           IN            NUMBER DEFAULT NULL
14109    ,p_new_val           IN            NUMBER DEFAULT NULL
14113     --
14110    ,p_business_group_id IN            NUMBER
14111    ,p_effective_date    IN            DATE
14112    ,p_rec               OUT NOCOPY    g_cache_pff_rec_obj) IS
14114     l_package        VARCHAR2(80) := g_package || '.get_pct_oiplip_rate';
14115     l_old_val_1 NUMBER := p_old_val + 1;
14116     l_new_val_1 NUMBER := p_new_val + 1;
14117     --
14118     -- Define Cursor
14119     --
14120     CURSOR c1 IS
14121       SELECT   p_oiplip_id
14122               ,'Y'
14123               ,pff.use_prmry_asnt_only_flag
14124               ,pff.use_sum_of_all_asnts_flag
14125               ,pff.rndg_cd
14126               ,pff.rndg_rl
14127               ,pff.mn_pct_val
14128               ,pff.mx_pct_val
14129       FROM     ben_pct_fl_tm_fctr pff
14130               ,ben_pct_fl_tm_rt_f pfr
14131               ,ben_vrbl_rt_prfl_f vpf
14132               ,ben_acty_vrbl_rt_f avr
14133               ,ben_acty_base_rt_f abr
14134       WHERE    abr.oiplip_id = p_oiplip_id
14135       AND      p_effective_date BETWEEN abr.effective_start_date
14136                    AND abr.effective_end_date
14137       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
14138       AND      p_effective_date BETWEEN avr.effective_start_date
14139                    AND avr.effective_end_date
14140       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
14141       AND      p_effective_date BETWEEN vpf.effective_start_date
14142                    AND vpf.effective_end_date
14143       AND      vpf.vrbl_rt_prfl_id = pfr.vrbl_rt_prfl_id
14144       AND      p_effective_date BETWEEN pfr.effective_start_date
14145                    AND pfr.effective_end_date
14146       AND      pfr.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
14147       AND      (
14148                     (
14149                           p_new_val IS NOT NULL
14150                       AND p_old_val IS NOT NULL
14151                       AND p_new_val >= NVL(pff.mn_pct_val
14152                                         ,p_new_val)
14153                       AND (p_new_val*100)  < (NVL(pff.mx_pct_val
14154                                        ,p_new_val)*100)+1)
14155                  OR (
14156                           p_new_val IS NOT NULL
14157                       AND p_old_val IS NOT NULL
14158                       AND (
14159                                p_new_val < NVL(pff.mn_pct_val
14160                                             ,p_new_val)
14161                             OR  (p_new_val*100) >= ( NVL(pff.mx_pct_val
14162                                              ,p_new_val)*100)+1)
14163                       AND p_old_val >= NVL(pff.mn_pct_val
14164                                         ,p_old_val)
14165                       AND (p_old_val*100) < (NVL(pff.mx_pct_val
14166                                        ,p_old_val)*100)+1)
14167                  OR (    p_new_val IS NULL
14168                      AND p_old_val IS NULL));
14169     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
14170     --UNION ALL
14171     CURSOR c2 IS
14172       SELECT   p_oiplip_id
14173               ,'Y'
14174               ,pff.use_prmry_asnt_only_flag
14175               ,pff.use_sum_of_all_asnts_flag
14176               ,pff.rndg_cd
14177               ,pff.rndg_rl
14178               ,pff.mn_pct_val
14179               ,pff.mx_pct_val
14180       FROM     ben_pct_fl_tm_fctr pff
14181               --,ben_pct_fl_tm_rt_f pfr
14182               ,ben_elig_pct_fl_tm_prte_f epf
14183               ,ben_eligy_prfl_f elp
14184               ,ben_vrbl_rt_elig_prfl_f vep
14185               ,ben_vrbl_rt_prfl_f vpf
14186               ,ben_acty_vrbl_rt_f avr
14187               ,ben_acty_base_rt_f abr
14188       WHERE    abr.oiplip_id = p_oiplip_id
14189       AND      p_effective_date BETWEEN abr.effective_start_date
14190                    AND abr.effective_end_date
14191       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
14192       AND      p_effective_date BETWEEN avr.effective_start_date
14193                    AND avr.effective_end_date
14194       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
14195       AND      p_effective_date BETWEEN vpf.effective_start_date
14196                    AND vpf.effective_end_date
14197 --      AND      vpf.vrbl_rt_prfl_id = epf.vrbl_rt_prfl_id
14198       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
14199       AND      p_effective_date BETWEEN vep.effective_start_date
14200                    AND vep.effective_end_date
14201       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
14202       AND      p_effective_date BETWEEN elp.effective_start_date
14203                    AND elp.effective_end_date
14204       AND      epf.eligy_prfl_id = elp.eligy_prfl_id
14205       AND      p_effective_date BETWEEN epf.effective_start_date
14206                    AND epf.effective_end_date
14207       AND      epf.pct_fl_tm_fctr_id = pff.pct_fl_tm_fctr_id
14208       AND      (
14209                     (
14210                           p_new_val IS NOT NULL
14211                       AND p_old_val IS NOT NULL
14212                       AND p_new_val >= NVL(pff.mn_pct_val
14213                                         ,p_new_val)
14214                       AND (p_new_val*100)  < (NVL(pff.mx_pct_val
14215                                        ,p_new_val)*100)+1)
14216                  OR (
14217                           p_new_val IS NOT NULL
14218                       AND p_old_val IS NOT NULL
14219                       AND (
14223                                              ,p_new_val)*100)+1)
14220                                p_new_val < NVL(pff.mn_pct_val
14221                                             ,p_new_val)
14222                             OR  (p_new_val*100) >= ( NVL(pff.mx_pct_val
14224                       AND p_old_val >= NVL(pff.mn_pct_val
14225                                         ,p_old_val)
14226                       AND (p_old_val*100) < (NVL(pff.mx_pct_val
14227                                        ,p_old_val)*100)+1)
14228                  OR (    p_new_val IS NULL
14229                      AND p_old_val IS NULL));
14230     --
14231     --
14232     l_index          PLS_INTEGER;
14233     l_not_hash_found BOOLEAN;
14234     l_c2notfound       BOOLEAN;
14235   --
14236   BEGIN
14237     --
14238     -- hr_utility.set_location ('Entering '||l_package,10);
14239     --
14240     -- Steps to do process
14241     --
14242     -- 1) Try and get value from cache
14243     -- 2) If can get from cache then copy to output record
14244     -- 3) If can't get from cache do db hit and then
14245     --    copy to cache record and then copy to output record.
14246     --
14247     -- Get hashed index value
14248     --
14249     l_index  := MOD(p_oiplip_id
14250                  ,g_hash_key);
14251     --
14252     IF NOT g_cache_oiplip_pff_rt_rec.EXISTS(l_index) THEN
14253       --
14254       -- Lets store the hash value in this index
14255       --
14256       RAISE NO_DATA_FOUND;
14257     --
14258     ELSE
14259       --
14260       -- If it does exist make sure its the right one
14261       --
14262       IF g_cache_oiplip_pff_rt_rec(l_index).id <> p_oiplip_id THEN
14263         --
14264         -- Loop through the hash using the jump routine to check further
14265         -- indexes
14266         --
14267         l_not_hash_found  := FALSE;
14268         --
14269         WHILE NOT l_not_hash_found LOOP
14270           --
14271           l_index  := l_index + g_hash_jump;
14272           --
14273           -- Check if the hash index exists, if not we can use it
14274           --
14275           IF NOT g_cache_oiplip_pff_rt_rec.EXISTS(l_index) THEN
14276             --
14277             -- Lets store the hash value in the index
14278             --
14279             RAISE NO_DATA_FOUND;
14280           --
14281           ELSE
14282             --
14283             -- Make sure the index is the correct one
14284             --
14285             IF g_cache_oiplip_pff_rt_rec(l_index).id = p_oiplip_id THEN
14286               --
14287               -- We have a match so the hashed value  has been stored before
14288               --
14289               l_not_hash_found  := TRUE;
14290             --
14291             END IF;
14292           --
14293           END IF;
14294         --
14295         END LOOP;
14296       --
14297       END IF;
14298     --
14299     END IF;
14300     --
14301     -- If p_old_val and p_new_val is set this means we are trying to retrieve
14302     -- the correct rate for the calculated value.
14303     -- Previously we just cached the first rate we
14304     -- found since we needed the determination code, the correct age,los code,etc
14305     -- By killing the cache and forcing the value to be removed we cache the
14306     -- correct rate profile for the case we need.
14307     --
14308     IF     p_old_val IS NOT NULL
14309        AND p_new_val IS NOT NULL THEN
14310       --
14311       RAISE NO_DATA_FOUND;
14312     --
14313     END IF;
14314     --
14315     p_rec    := g_cache_oiplip_pff_rt_rec(l_index);
14316   --
14317   -- hr_utility.set_location ('Leaving '||l_package,10);
14318   --
14319   EXCEPTION
14320     --
14321     WHEN NO_DATA_FOUND THEN
14322       --
14323       -- The record has not been cached yet so lets cache it
14324       --
14325       OPEN c1;
14326       --
14327       FETCH c1 INTO g_cache_oiplip_pff_rt_rec(l_index);
14328       -- PERFNEW
14329       IF c1%NOTFOUND THEN
14330          --
14331          l_c2notfound := false;
14332          OPEN c2;
14333          FETCH c2 INTO g_cache_oiplip_pff_rt_rec(l_index);
14334          IF c2%NOTFOUND THEN
14335             --
14336             l_c2notfound := true;
14337             --
14338          END IF;
14339          CLOSE c2;
14340          --
14341       END IF;
14342       -- PERFNEW
14343       IF     p_old_val IS NULL
14344          AND p_new_val IS NULL THEN
14345         --
14346         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
14347           --
14348           if NOT g_cache_oiplip_pff_rt_rec.EXISTS(l_index) then
14349             g_cache_oiplip_pff_rt_rec(l_index).id     := p_oiplip_id;
14350             g_cache_oiplip_pff_rt_rec(l_index).exist  := 'N';
14351           end if;
14352         --
14353         END IF;
14354       --
14355       END IF;
14356       --
14357       p_rec  := g_cache_oiplip_pff_rt_rec(l_index);
14358       --
14359       CLOSE c1;
14360   --
14361   END get_pct_oiplip_rate;
14362 --
14363   PROCEDURE get_pct_rate(
14364     p_pgm_id            IN            NUMBER
14365    ,p_pl_id             IN            NUMBER
14366    ,p_oipl_id           IN            NUMBER
14367    ,p_plip_id           IN            NUMBER
14368    ,p_ptip_id           IN            NUMBER
14372    ,p_business_group_id IN            NUMBER
14369    ,p_oiplip_id         IN            NUMBER
14370    ,p_old_val           IN            NUMBER DEFAULT NULL
14371    ,p_new_val           IN            NUMBER DEFAULT NULL
14373    ,p_effective_date    IN            DATE
14374    ,p_rec               OUT NOCOPY    g_cache_pff_rec_obj) IS
14375     --
14376     l_package VARCHAR2(80) := g_package || '.get_pct_rate';
14377   --
14378   BEGIN
14379     --
14380     -- hr_utility.set_location ('Entering '||l_package,10);
14381     --
14382     -- Derive which data type we are dealing with
14383     --
14384     IF p_pgm_id IS NOT NULL THEN
14385       --
14386       get_pct_pgm_rate(p_pgm_id=> p_pgm_id
14387        ,p_old_val           => p_old_val
14388        ,p_new_val           => p_new_val
14389        ,p_business_group_id => p_business_group_id
14390        ,p_effective_date    => p_effective_date
14391        ,p_rec               => p_rec);
14392     --
14393     ELSIF p_pl_id IS NOT NULL THEN
14394       --
14395       get_pct_pl_rate(p_pl_id=> p_pl_id
14396        ,p_old_val           => p_old_val
14397        ,p_new_val           => p_new_val
14398        ,p_business_group_id => p_business_group_id
14399        ,p_effective_date    => p_effective_date
14400        ,p_rec               => p_rec);
14401     --
14402     ELSIF p_oipl_id IS NOT NULL THEN
14403       --
14404       get_pct_oipl_rate(p_oipl_id=> p_oipl_id
14405        ,p_old_val           => p_old_val
14406        ,p_new_val           => p_new_val
14407        ,p_business_group_id => p_business_group_id
14408        ,p_effective_date    => p_effective_date
14409        ,p_rec               => p_rec);
14410     --
14411     ELSIF p_plip_id IS NOT NULL THEN
14412       --
14413       get_pct_plip_rate(p_plip_id=> p_plip_id
14414        ,p_old_val           => p_old_val
14415        ,p_new_val           => p_new_val
14416        ,p_business_group_id => p_business_group_id
14417        ,p_effective_date    => p_effective_date
14418        ,p_rec               => p_rec);
14419     --
14420     ELSIF p_ptip_id IS NOT NULL THEN
14421       --
14422       get_pct_ptip_rate(p_ptip_id=> p_ptip_id
14423        ,p_old_val           => p_old_val
14424        ,p_new_val           => p_new_val
14425        ,p_business_group_id => p_business_group_id
14426        ,p_effective_date    => p_effective_date
14427        ,p_rec               => p_rec);
14428     --
14429     ELSIF p_oiplip_id IS NOT NULL THEN
14430       --
14431       get_pct_oiplip_rate(p_oiplip_id=> p_oiplip_id
14432        ,p_old_val           => p_old_val
14433        ,p_new_val           => p_new_val
14434        ,p_business_group_id => p_business_group_id
14435        ,p_effective_date    => p_effective_date
14436        ,p_rec               => p_rec);
14437     --
14438     END IF;
14439   --
14440   -- hr_utility.set_location ('Leaving '||l_package,10);
14441   --
14442   END get_pct_rate;
14443 --
14444   PROCEDURE get_hours_pgm_elig(
14445     p_pgm_id            IN            NUMBER
14446    ,p_old_val           in            number  default null
14447    ,p_new_val           in            number  default null
14448    ,p_business_group_id IN            NUMBER
14449    ,p_effective_date    IN            DATE
14450    ,p_rec               OUT NOCOPY    g_cache_hwf_rec_obj) IS
14451     --
14452     l_package        VARCHAR2(80) := g_package || '.get_hours_pgm_elig';
14453     --
14454     -- Define Cursor
14455     --
14456     CURSOR c1 IS
14457       SELECT   p_pgm_id
14458               ,'Y'
14459               ,hwf.hrs_src_cd
14460               ,hwf.hrs_wkd_det_cd
14461               ,hwf.hrs_wkd_det_rl
14462               ,hwf.rndg_cd
14463               ,hwf.rndg_rl
14464               ,hwf.defined_balance_id
14465               ,hwf.bnfts_bal_id
14466               ,hwf.mn_hrs_num
14467               ,hwf.mx_hrs_num
14468               ,hwf.once_r_cntug_cd
14469               ,hwf.hrs_wkd_calc_rl
14470       FROM     ben_hrs_wkd_in_perd_fctr hwf
14471               ,ben_elig_hrs_wkd_prte_f ehw
14472               ,ben_eligy_prfl_f elp
14473               ,ben_prtn_elig_prfl_f cep
14474               ,ben_prtn_elig_f epa
14475       WHERE    epa.pgm_id = p_pgm_id
14476       AND      p_effective_date BETWEEN epa.effective_start_date
14477                    AND epa.effective_end_date
14478       AND      epa.prtn_elig_id = cep.prtn_elig_id
14479       AND      p_effective_date BETWEEN cep.effective_start_date
14480                    AND cep.effective_end_date
14481       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
14482       AND      p_effective_date BETWEEN elp.effective_start_date
14483                    AND elp.effective_end_date
14484       AND      ehw.eligy_prfl_id = elp.eligy_prfl_id
14485       AND      p_effective_date BETWEEN ehw.effective_start_date
14486                    AND ehw.effective_end_date
14487       AND      ehw.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
14488       AND     (
14489                  (
14490                    p_new_val IS NOT NULL
14491                    AND p_old_val IS NOT NULL
14492                    AND p_new_val >= NVL(hwf.mn_hrs_num ,p_new_val)
14493                    and p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
14494                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
14495                  ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
14499                   )
14496                   nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
14497                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )
14498                   -- and p_old_val < hwf.mn_hrs_num
14500                  OR
14501                  (
14502                    p_new_val IS NOT NULL
14503                    AND p_old_val IS NOT NULL
14504                    AND
14505                    (
14506                     p_new_val < NVL(hwf.mn_hrs_num,p_new_val)
14507                     OR
14508                     p_new_val >=   decode(nvl(hwf.mx_hrs_num,p_new_val) ,
14509                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
14510                    ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
14511                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
14512                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )
14513                      )
14514                     AND p_old_val >= NVL(hwf.mn_hrs_num ,p_old_val)
14515                     and p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
14516                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
14517                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
14518                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
14519                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )
14520                   )
14521                  OR
14522                   (  p_new_val IS NULL
14523                      AND p_old_val IS NULL
14524                    )
14525             );
14526 
14527     --
14528     l_index          PLS_INTEGER;
14529     l_not_hash_found BOOLEAN;
14530   --
14531   BEGIN
14532     --
14533     -- hr_utility.set_location ('Entering '||l_package,10);
14534     --
14535     -- Steps to do process
14536     --
14537     -- 1) Try and get value from cache
14538     -- 2) If can get from cache then copy to output record
14539     -- 3) If can't get from cache do db hit and then
14540     --    copy to cache record and then copy to output record.
14541     --
14542     -- Get hashed index value
14543     --
14544     l_index  := MOD(p_pgm_id
14545                  ,g_hash_key);
14546     --
14547     IF NOT g_cache_pgm_hwf_el_rec.EXISTS(l_index) THEN
14548       --
14549       -- Lets store the hash value in this index
14550       --
14551       RAISE NO_DATA_FOUND;
14552     --
14553     ELSE
14554       --
14555       -- If it does exist make sure its the right one
14556       --
14557       IF g_cache_pgm_hwf_el_rec(l_index).id <> p_pgm_id THEN
14558         --
14559         -- Loop through the hash using the jump routine to check further
14560         -- indexes
14561         --
14562         l_not_hash_found  := FALSE;
14563         --
14564         WHILE NOT l_not_hash_found LOOP
14565           --
14566           l_index  := l_index + g_hash_jump;
14567           --
14568           -- Check if the hash index exists, if not we can use it
14569           --
14570           IF NOT g_cache_pgm_hwf_el_rec.EXISTS(l_index) THEN
14571             --
14572             -- Lets store the hash value in the index
14573             --
14574             RAISE NO_DATA_FOUND;
14575           --
14576           ELSE
14577             --
14578             -- Make sure the index is the correct one
14579             --
14580             IF g_cache_pgm_hwf_el_rec(l_index).id = p_pgm_id THEN
14581               --
14582               -- We have a match so the hashed value  has been stored before
14583               --
14584               l_not_hash_found  := TRUE;
14585             --
14586             END IF;
14587           --
14588           END IF;
14589         --
14590         END LOOP;
14591       --
14592       END IF;
14593     --
14594     END IF;
14595     --
14596      IF     p_old_val IS NOT NULL
14597        AND p_new_val IS NOT NULL THEN
14598       --
14599       RAISE NO_DATA_FOUND;
14600     --
14601     END IF;
14602 
14603     p_rec    := g_cache_pgm_hwf_el_rec(l_index);
14604   --
14605   -- hr_utility.set_location ('Leaving '||l_package,10);
14606   --
14607   EXCEPTION
14608     --
14609     WHEN NO_DATA_FOUND THEN
14610       --
14611       -- The record has not been cached yet so lets cache it
14612       --
14613       OPEN c1;
14614       --
14615       FETCH c1 INTO g_cache_pgm_hwf_el_rec(l_index);
14616       IF c1%NOTFOUND THEN
14617         --
14618         if NOT g_cache_pgm_hwf_el_rec.EXISTS(l_index) then
14619           g_cache_pgm_hwf_el_rec(l_index).id     := p_pgm_id;
14620           g_cache_pgm_hwf_el_rec(l_index).exist  := 'N';
14621         end if;
14622       --
14623       END IF;
14624       --
14625       p_rec  := g_cache_pgm_hwf_el_rec(l_index);
14626       --
14627       CLOSE c1;
14628   --
14629   END get_hours_pgm_elig;
14630 --
14631   PROCEDURE get_hours_pl_elig(
14632     p_pl_id             IN            NUMBER
14633    ,p_old_val           in            number  default null
14634    ,p_new_val           in            number  default null
14638     --
14635    ,p_business_group_id IN            NUMBER
14636    ,p_effective_date    IN            DATE
14637    ,p_rec               OUT NOCOPY    g_cache_hwf_rec_obj) IS
14639     l_package        VARCHAR2(80) := g_package || '.get_hours_pl_elig';
14640     --
14641     -- Define Cursor
14642     --
14643     CURSOR c1 IS
14644       SELECT   p_pl_id
14645               ,'Y'
14646               ,hwf.hrs_src_cd
14647               ,hwf.hrs_wkd_det_cd
14648               ,hwf.hrs_wkd_det_rl
14649               ,hwf.rndg_cd
14650               ,hwf.rndg_rl
14651               ,hwf.defined_balance_id
14652               ,hwf.bnfts_bal_id
14653               ,hwf.mn_hrs_num
14654               ,hwf.mx_hrs_num
14655               ,hwf.once_r_cntug_cd
14656               ,hwf.hrs_wkd_calc_rl
14657       FROM     ben_hrs_wkd_in_perd_fctr hwf
14658               ,ben_elig_hrs_wkd_prte_f ehw
14659               ,ben_eligy_prfl_f elp
14660               ,ben_prtn_elig_prfl_f cep
14661               ,ben_prtn_elig_f epa
14662       WHERE    epa.pl_id = p_pl_id
14663       AND      p_effective_date BETWEEN epa.effective_start_date
14664                    AND epa.effective_end_date
14665       AND      epa.prtn_elig_id = cep.prtn_elig_id
14666       AND      p_effective_date BETWEEN cep.effective_start_date
14667                    AND cep.effective_end_date
14668       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
14669       AND      p_effective_date BETWEEN elp.effective_start_date
14670                    AND elp.effective_end_date
14671       AND      ehw.eligy_prfl_id = elp.eligy_prfl_id
14672       AND      p_effective_date BETWEEN ehw.effective_start_date
14673                    AND ehw.effective_end_date
14674       AND      ehw.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
14675       AND     (
14676                  (
14677                    p_new_val IS NOT NULL
14678                    AND p_old_val IS NOT NULL
14679                    AND p_new_val >= NVL(hwf.mn_hrs_num ,p_new_val)
14680                    and p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
14681                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
14682                  ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
14683                   nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
14684                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )
14685                   -- and p_old_val < hwf.mn_hrs_num
14686                   )
14687                  OR
14688                  (
14689                    p_new_val IS NOT NULL
14690                    AND p_old_val IS NOT NULL
14691                    AND
14692                    (
14693                     p_new_val < NVL(hwf.mn_hrs_num,p_new_val)
14694                     OR
14695                     p_new_val >=   decode(nvl(hwf.mx_hrs_num,p_new_val) ,
14696                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
14697                    ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
14698                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
14699                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )
14700                      )
14701                     AND p_old_val >= NVL(hwf.mn_hrs_num ,p_old_val)
14702                     and p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
14703                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
14704                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
14705                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
14706                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )
14707                   )
14708                  OR
14709                   (  p_new_val IS NULL
14710                      AND p_old_val IS NULL
14711                    )
14712             );
14713 
14714     --
14715     --
14716     l_index          PLS_INTEGER;
14717     l_not_hash_found BOOLEAN;
14718   --
14719   BEGIN
14720     --
14721     -- hr_utility.set_location ('Entering '||l_package,10);
14722     --
14723     -- Steps to do process
14724     --
14725     -- 1) Try and get value from cache
14726     -- 2) If can get from cache then copy to output record
14727     -- 3) If can't get from cache do db hit and then
14728     --    copy to cache record and then copy to output record.
14729     --
14730     -- Get hashed index value
14731     --
14732     l_index  := MOD(p_pl_id
14733                  ,g_hash_key);
14734     --
14735     IF NOT g_cache_pl_hwf_el_rec.EXISTS(l_index) THEN
14736       --
14737       -- Lets store the hash value in this index
14738       --
14739       RAISE NO_DATA_FOUND;
14740     --
14741     ELSE
14742       --
14743       -- If it does exist make sure its the right one
14744       --
14745       IF g_cache_pl_hwf_el_rec(l_index).id <> p_pl_id THEN
14746         --
14747         -- Loop through the hash using the jump routine to check further
14748         -- indexes
14749         --
14750         l_not_hash_found  := FALSE;
14751         --
14752         WHILE NOT l_not_hash_found LOOP
14753           --
14754           l_index  := l_index + g_hash_jump;
14755           --
14756           -- Check if the hash index exists, if not we can use it
14757           --
14758           IF NOT g_cache_pl_hwf_el_rec.EXISTS(l_index) THEN
14759             --
14763           --
14760             -- Lets store the hash value in the index
14761             --
14762             RAISE NO_DATA_FOUND;
14764           ELSE
14765             --
14766             -- Make sure the index is the correct one
14767             --
14768             IF g_cache_pl_hwf_el_rec(l_index).id = p_pl_id THEN
14769               --
14770               -- We have a match so the hashed value  has been stored before
14771               --
14772               l_not_hash_found  := TRUE;
14773             --
14774             END IF;
14775           --
14776           END IF;
14777         --
14778         END LOOP;
14779       --
14780       END IF;
14781     --
14782     END IF;
14783     --
14784      IF     p_old_val IS NOT NULL
14785        AND p_new_val IS NOT NULL THEN
14786       --
14787       RAISE NO_DATA_FOUND;
14788     --
14789     END IF;
14790     p_rec    := g_cache_pl_hwf_el_rec(l_index);
14791   --
14792   -- hr_utility.set_location ('Leaving '||l_package,10);
14793   --
14794   EXCEPTION
14795     --
14796     WHEN NO_DATA_FOUND THEN
14797       --
14798       -- The record has not been cached yet so lets cache it
14799       --
14800       OPEN c1;
14801       --
14802       FETCH c1 INTO g_cache_pl_hwf_el_rec(l_index);
14803       IF c1%NOTFOUND THEN
14804         --
14805         if NOT g_cache_pl_hwf_el_rec.EXISTS(l_index) then
14806           g_cache_pl_hwf_el_rec(l_index).id     := p_pl_id;
14807           g_cache_pl_hwf_el_rec(l_index).exist  := 'N';
14808         end if;
14809       --
14810       END IF;
14811       --
14812       p_rec  := g_cache_pl_hwf_el_rec(l_index);
14813       --
14814       CLOSE c1;
14815   --
14816   END get_hours_pl_elig;
14817 --
14818   PROCEDURE get_hours_oipl_elig(
14819     p_oipl_id           IN            NUMBER
14820    ,p_old_val           in            number  default null
14821    ,p_new_val           in            number  default null
14822    ,p_business_group_id IN            NUMBER
14823    ,p_effective_date    IN            DATE
14824    ,p_rec               OUT NOCOPY    g_cache_hwf_rec_obj) IS
14825     --
14826     l_package        VARCHAR2(80) := g_package || '.get_hours_oipl_elig';
14827     --
14828     -- Define Cursor
14829     --
14830     CURSOR c1 IS
14831       SELECT   p_oipl_id
14832               ,'Y'
14833               ,hwf.hrs_src_cd
14834               ,hwf.hrs_wkd_det_cd
14835               ,hwf.hrs_wkd_det_rl
14836               ,hwf.rndg_cd
14837               ,hwf.rndg_rl
14838               ,hwf.defined_balance_id
14839               ,hwf.bnfts_bal_id
14840               ,hwf.mn_hrs_num
14841               ,hwf.mx_hrs_num
14842               ,hwf.once_r_cntug_cd
14843               ,hwf.hrs_wkd_calc_rl
14844       FROM     ben_hrs_wkd_in_perd_fctr hwf
14845               ,ben_elig_hrs_wkd_prte_f ehw
14846               ,ben_eligy_prfl_f elp
14847               ,ben_prtn_elig_prfl_f cep
14848               ,ben_prtn_elig_f epa
14849       WHERE    epa.oipl_id = p_oipl_id
14850       AND      p_effective_date BETWEEN epa.effective_start_date
14851                    AND epa.effective_end_date
14852       AND      epa.prtn_elig_id = cep.prtn_elig_id
14853       AND      p_effective_date BETWEEN cep.effective_start_date
14854                    AND cep.effective_end_date
14855       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
14856       AND      p_effective_date BETWEEN elp.effective_start_date
14857                    AND elp.effective_end_date
14858       AND      ehw.eligy_prfl_id = elp.eligy_prfl_id
14859       AND      p_effective_date BETWEEN ehw.effective_start_date
14860                    AND ehw.effective_end_date
14861       AND      ehw.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
14862       AND     (
14863                  (
14864                    p_new_val IS NOT NULL
14865                    AND p_old_val IS NOT NULL
14866                    AND p_new_val >= NVL(hwf.mn_hrs_num ,p_new_val)
14867                    and p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
14868                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
14869                  ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
14870                   nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
14871                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )
14872                   -- and p_old_val < hwf.mn_hrs_num
14873                   )
14874                  OR
14875                  (
14876                    p_new_val IS NOT NULL
14877                    AND p_old_val IS NOT NULL
14878                    AND
14879                    (
14880                     p_new_val < NVL(hwf.mn_hrs_num,p_new_val)
14881                     OR
14882                     p_new_val >=   decode(nvl(hwf.mx_hrs_num,p_new_val) ,
14883                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
14884                    ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
14885                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
14886                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )
14887                      )
14888                     AND p_old_val >= NVL(hwf.mn_hrs_num ,p_old_val)
14892                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
14889                     and p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
14890                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
14891                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
14893                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )
14894                   )
14895                  OR
14896                   (  p_new_val IS NULL
14897                      AND p_old_val IS NULL
14898                    )
14899             );
14900 
14901     --
14902     --
14903     l_index          PLS_INTEGER;
14904     l_not_hash_found BOOLEAN;
14905   --
14906   BEGIN
14907     --
14908     -- hr_utility.set_location ('Entering '||l_package,10);
14909     --
14910     -- Steps to do process
14911     --
14912     -- 1) Try and get value from cache
14913     -- 2) If can get from cache then copy to output record
14914     -- 3) If can't get from cache do db hit and then
14915     --    copy to cache record and then copy to output record.
14916     --
14917     -- Get hashed index value
14918     --
14919     l_index  := MOD(p_oipl_id
14920                  ,g_hash_key);
14921     --
14922     IF NOT g_cache_oipl_hwf_el_rec.EXISTS(l_index) THEN
14923       --
14924       -- Lets store the hash value in this index
14925       --
14926       RAISE NO_DATA_FOUND;
14927     --
14928     ELSE
14929       --
14930       -- If it does exist make sure its the right one
14931       --
14932       IF g_cache_oipl_hwf_el_rec(l_index).id <> p_oipl_id THEN
14933         --
14934         -- Loop through the hash using the jump routine to check further
14935         -- indexes
14936         --
14937         l_not_hash_found  := FALSE;
14938         --
14939         WHILE NOT l_not_hash_found LOOP
14940           --
14941           l_index  := l_index + g_hash_jump;
14942           --
14943           -- Check if the hash index exists, if not we can use it
14944           --
14945           IF NOT g_cache_oipl_hwf_el_rec.EXISTS(l_index) THEN
14946             --
14947             -- Lets store the hash value in the index
14948             --
14949             RAISE NO_DATA_FOUND;
14950           --
14951           ELSE
14952             --
14953             -- Make sure the index is the correct one
14954             --
14955             IF g_cache_oipl_hwf_el_rec(l_index).id = p_oipl_id THEN
14956               --
14957               -- We have a match so the hashed value  has been stored before
14958               --
14959               l_not_hash_found  := TRUE;
14960             --
14961             END IF;
14962           --
14963           END IF;
14964         --
14965         END LOOP;
14966       --
14967       END IF;
14968     --
14969     END IF;
14970     --
14971      IF     p_old_val IS NOT NULL
14972        AND p_new_val IS NOT NULL THEN
14973       --
14974       RAISE NO_DATA_FOUND;
14975     --
14976     END IF;
14977     p_rec    := g_cache_oipl_hwf_el_rec(l_index);
14978   --
14979   -- hr_utility.set_location ('Leaving '||l_package,10);
14980   --
14981   EXCEPTION
14982     --
14983     WHEN NO_DATA_FOUND THEN
14984       --
14985       -- The record has not been cached yet so lets cache it
14986       --
14987       OPEN c1;
14988       --
14989       FETCH c1 INTO g_cache_oipl_hwf_el_rec(l_index);
14990       IF c1%NOTFOUND THEN
14991         --
14992         if NOT g_cache_oipl_hwf_el_rec.EXISTS(l_index) then
14993           g_cache_oipl_hwf_el_rec(l_index).id     := p_oipl_id;
14994           g_cache_oipl_hwf_el_rec(l_index).exist  := 'N';
14995         end if;
14996       --
14997       END IF;
14998       --
14999       p_rec  := g_cache_oipl_hwf_el_rec(l_index);
15000       --
15001       CLOSE c1;
15002   --
15003   END get_hours_oipl_elig;
15004 --
15005   PROCEDURE get_hours_plip_elig(
15006     p_plip_id           IN            NUMBER
15007    ,p_old_val           in            number  default null
15008    ,p_new_val           in            number  default null
15009    ,p_business_group_id IN            NUMBER
15010    ,p_effective_date    IN            DATE
15011    ,p_rec               OUT NOCOPY    g_cache_hwf_rec_obj) IS
15012     --
15013     l_package        VARCHAR2(80) := g_package || '.get_hours_plip_elig';
15014     --
15015     -- Define Cursor
15016     --
15017     CURSOR c1 IS
15018       SELECT   p_plip_id
15019               ,'Y'
15020               ,hwf.hrs_src_cd
15021               ,hwf.hrs_wkd_det_cd
15022               ,hwf.hrs_wkd_det_rl
15023               ,hwf.rndg_cd
15024               ,hwf.rndg_rl
15025               ,hwf.defined_balance_id
15026               ,hwf.bnfts_bal_id
15027               ,hwf.mn_hrs_num
15028               ,hwf.mx_hrs_num
15029               ,hwf.once_r_cntug_cd
15030               ,hwf.hrs_wkd_calc_rl
15031       FROM     ben_hrs_wkd_in_perd_fctr hwf
15032               ,ben_elig_hrs_wkd_prte_f ehw
15033               ,ben_eligy_prfl_f elp
15034               ,ben_prtn_elig_prfl_f cep
15035               ,ben_prtn_elig_f epa
15036       WHERE    epa.plip_id = p_plip_id
15037       AND      p_effective_date BETWEEN epa.effective_start_date
15041                    AND cep.effective_end_date
15038                    AND epa.effective_end_date
15039       AND      epa.prtn_elig_id = cep.prtn_elig_id
15040       AND      p_effective_date BETWEEN cep.effective_start_date
15042       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
15043       AND      p_effective_date BETWEEN elp.effective_start_date
15044                    AND elp.effective_end_date
15045       AND      ehw.eligy_prfl_id = elp.eligy_prfl_id
15046       AND      p_effective_date BETWEEN ehw.effective_start_date
15047                    AND ehw.effective_end_date
15048       AND      ehw.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
15049       AND     (
15050                  (
15051                    p_new_val IS NOT NULL
15052                    AND p_old_val IS NOT NULL
15053                    AND p_new_val >= NVL(hwf.mn_hrs_num ,p_new_val)
15054                    and p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
15055                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
15056                  ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
15057                   nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
15058                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )
15059                   -- and p_old_val < hwf.mn_hrs_num
15060                   )
15061                  OR
15062                  (
15063                    p_new_val IS NOT NULL
15064                    AND p_old_val IS NOT NULL
15065                    AND
15066                    (
15067                     p_new_val < NVL(hwf.mn_hrs_num,p_new_val)
15068                     OR
15069                     p_new_val >=   decode(nvl(hwf.mx_hrs_num,p_new_val) ,
15070                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
15071                    ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
15072                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
15073                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )
15074                      )
15075                     AND p_old_val >= NVL(hwf.mn_hrs_num ,p_old_val)
15076                     and p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
15077                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
15078                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
15079                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
15080                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )
15081                   )
15082                  OR
15083                   (  p_new_val IS NULL
15084                      AND p_old_val IS NULL
15085                    )
15086             );
15087 
15088     --
15089     --
15090     l_index          PLS_INTEGER;
15091     l_not_hash_found BOOLEAN;
15092   --
15093   BEGIN
15094     --
15095     -- hr_utility.set_location ('Entering '||l_package,10);
15096     --
15097     -- Steps to do process
15098     --
15099     -- 1) Try and get value from cache
15100     -- 2) If can get from cache then copy to output record
15101     -- 3) If can't get from cache do db hit and then
15102     --    copy to cache record and then copy to output record.
15103     --
15104     -- Get hashed index value
15105     --
15106     l_index  := MOD(p_plip_id
15107                  ,g_hash_key);
15108     --
15109     IF NOT g_cache_plip_hwf_el_rec.EXISTS(l_index) THEN
15110       --
15111       -- Lets store the hash value in this index
15112       --
15113       RAISE NO_DATA_FOUND;
15114     --
15115     ELSE
15116       --
15117       -- If it does exist make sure its the right one
15118       --
15119       IF g_cache_plip_hwf_el_rec(l_index).id <> p_plip_id THEN
15120         --
15121         -- Loop through the hash using the jump routine to check further
15122         -- indexes
15123         --
15124         l_not_hash_found  := FALSE;
15125         --
15126         WHILE NOT l_not_hash_found LOOP
15127           --
15128           l_index  := l_index + g_hash_jump;
15129           --
15130           -- Check if the hash index exists, if not we can use it
15131           --
15132           IF NOT g_cache_plip_hwf_el_rec.EXISTS(l_index) THEN
15133             --
15134             -- Lets store the hash value in the index
15135             --
15136             RAISE NO_DATA_FOUND;
15137           --
15138           ELSE
15139             --
15140             -- Make sure the index is the correct one
15141             --
15142             IF g_cache_plip_hwf_el_rec(l_index).id = p_plip_id THEN
15143               --
15144               -- We have a match so the hashed value  has been stored before
15145               --
15146               l_not_hash_found  := TRUE;
15147             --
15148             END IF;
15149           --
15150           END IF;
15151         --
15152         END LOOP;
15153       --
15154       END IF;
15155     --
15156     END IF;
15157     --
15158      IF     p_old_val IS NOT NULL
15159        AND p_new_val IS NOT NULL THEN
15160       --
15161       RAISE NO_DATA_FOUND;
15162     --
15163     END IF;
15164     p_rec    := g_cache_plip_hwf_el_rec(l_index);
15165   --
15166   -- hr_utility.set_location ('Leaving '||l_package,10);
15167   --
15168   EXCEPTION
15169     --
15173       --
15170     WHEN NO_DATA_FOUND THEN
15171       --
15172       -- The record has not been cached yet so lets cache it
15174       OPEN c1;
15175       --
15176       FETCH c1 INTO g_cache_plip_hwf_el_rec(l_index);
15177       IF c1%NOTFOUND THEN
15178         --
15179         if NOT g_cache_plip_hwf_el_rec.EXISTS(l_index) then
15180           g_cache_plip_hwf_el_rec(l_index).id     := p_plip_id;
15181           g_cache_plip_hwf_el_rec(l_index).exist  := 'N';
15182         end if;
15183       --
15184       END IF;
15185       --
15186       p_rec  := g_cache_plip_hwf_el_rec(l_index);
15187       --
15188       CLOSE c1;
15189   --
15190   END get_hours_plip_elig;
15191 --
15192   PROCEDURE get_hours_ptip_elig(
15193     p_ptip_id           IN            NUMBER
15194    ,p_old_val           in            number  default null
15195    ,p_new_val           in            number  default null
15196    ,p_business_group_id IN            NUMBER
15197    ,p_effective_date    IN            DATE
15198    ,p_rec               OUT NOCOPY    g_cache_hwf_rec_obj) IS
15199     --
15200     l_package        VARCHAR2(80) := g_package || '.get_hours_ptip_elig';
15201     --
15202     -- Define Cursor
15203     --
15204     CURSOR c1 IS
15205       SELECT   p_ptip_id
15206               ,'Y'
15207               ,hwf.hrs_src_cd
15208               ,hwf.hrs_wkd_det_cd
15209               ,hwf.hrs_wkd_det_rl
15210               ,hwf.rndg_cd
15211               ,hwf.rndg_rl
15212               ,hwf.defined_balance_id
15213               ,hwf.bnfts_bal_id
15214               ,hwf.mn_hrs_num
15215               ,hwf.mx_hrs_num
15216               ,hwf.once_r_cntug_cd
15217               ,hwf.hrs_wkd_calc_rl
15218       FROM     ben_hrs_wkd_in_perd_fctr hwf
15219               ,ben_elig_hrs_wkd_prte_f ehw
15220               ,ben_eligy_prfl_f elp
15221               ,ben_prtn_elig_prfl_f cep
15222               ,ben_prtn_elig_f epa
15223       WHERE    epa.ptip_id = p_ptip_id
15224       AND      p_effective_date BETWEEN epa.effective_start_date
15225                    AND epa.effective_end_date
15226       AND      epa.prtn_elig_id = cep.prtn_elig_id
15227       AND      p_effective_date BETWEEN cep.effective_start_date
15228                    AND cep.effective_end_date
15229       AND      cep.eligy_prfl_id = elp.eligy_prfl_id
15230       AND      p_effective_date BETWEEN elp.effective_start_date
15231                    AND elp.effective_end_date
15232       AND      ehw.eligy_prfl_id = elp.eligy_prfl_id
15233       AND      p_effective_date BETWEEN ehw.effective_start_date
15234                    AND ehw.effective_end_date
15235       AND      ehw.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
15236       AND     (
15237                  (
15238                    p_new_val IS NOT NULL
15239                    AND p_old_val IS NOT NULL
15240                    AND p_new_val >= NVL(hwf.mn_hrs_num ,p_new_val)
15241                    and p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
15242                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
15243                  ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
15244                   nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
15245                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )
15246                   -- and p_old_val < hwf.mn_hrs_num
15247                   )
15248                  OR
15249                  (
15250                    p_new_val IS NOT NULL
15251                    AND p_old_val IS NOT NULL
15252                    AND
15253                    (
15254                     p_new_val < NVL(hwf.mn_hrs_num,p_new_val)
15255                     OR
15256                     p_new_val >=   decode(nvl(hwf.mx_hrs_num,p_new_val) ,
15257                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
15258                    ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
15259                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
15260                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )
15261                      )
15262                     AND p_old_val >= NVL(hwf.mn_hrs_num ,p_old_val)
15263                     and p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
15264                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
15265                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
15266                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
15267                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )
15268                   )
15269                  OR
15270                   (  p_new_val IS NULL
15271                      AND p_old_val IS NULL
15272                    )
15273             );
15274 
15275     --
15276     --
15277     l_index          PLS_INTEGER;
15278     l_not_hash_found BOOLEAN;
15279   --
15280   BEGIN
15281     --
15282     -- hr_utility.set_location ('Entering '||l_package,10);
15283     --
15284     -- Steps to do process
15285     --
15286     -- 1) Try and get value from cache
15287     -- 2) If can get from cache then copy to output record
15288     -- 3) If can't get from cache do db hit and then
15292     --
15289     --    copy to cache record and then copy to output record.
15290     --
15291     -- Get hashed index value
15293     l_index  := MOD(p_ptip_id
15294                  ,g_hash_key);
15295     --
15296     IF NOT g_cache_ptip_hwf_el_rec.EXISTS(l_index) THEN
15297       --
15298       -- Lets store the hash value in this index
15299       --
15300       RAISE NO_DATA_FOUND;
15301     --
15302     ELSE
15303       --
15304       -- If it does exist make sure its the right one
15305       --
15306       IF g_cache_ptip_hwf_el_rec(l_index).id <> p_ptip_id THEN
15307         --
15308         -- Loop through the hash using the jump routine to check further
15309         -- indexes
15310         --
15311         l_not_hash_found  := FALSE;
15312         --
15313         WHILE NOT l_not_hash_found LOOP
15314           --
15315           l_index  := l_index + g_hash_jump;
15316           --
15317           -- Check if the hash index exists, if not we can use it
15318           --
15319           IF NOT g_cache_ptip_hwf_el_rec.EXISTS(l_index) THEN
15320             --
15321             -- Lets store the hash value in the index
15322             --
15323             RAISE NO_DATA_FOUND;
15324           --
15325           ELSE
15326             --
15327             -- Make sure the index is the correct one
15328             --
15329             IF g_cache_ptip_hwf_el_rec(l_index).id = p_ptip_id THEN
15330               --
15331               -- We have a match so the hashed value  has been stored before
15332               --
15333               l_not_hash_found  := TRUE;
15334             --
15335             END IF;
15336           --
15337           END IF;
15338         --
15339         END LOOP;
15340       --
15341       END IF;
15342     --
15343     END IF;
15344     --
15345      IF     p_old_val IS NOT NULL
15346        AND p_new_val IS NOT NULL THEN
15347       --
15348       RAISE NO_DATA_FOUND;
15349     --
15350     END IF;
15351     p_rec    := g_cache_ptip_hwf_el_rec(l_index);
15352   --
15353   -- hr_utility.set_location ('Leaving '||l_package,10);
15354   --
15355   EXCEPTION
15356     --
15357     WHEN NO_DATA_FOUND THEN
15358       --
15359       -- The record has not been cached yet so lets cache it
15360       --
15361       OPEN c1;
15362       --
15363       FETCH c1 INTO g_cache_ptip_hwf_el_rec(l_index);
15364       IF c1%NOTFOUND THEN
15365         --
15366         if NOT g_cache_ptip_hwf_el_rec.EXISTS(l_index) then
15367           g_cache_ptip_hwf_el_rec(l_index).id     := p_ptip_id;
15368           g_cache_ptip_hwf_el_rec(l_index).exist  := 'N';
15369         end if;
15370       --
15371       END IF;
15372       --
15373       p_rec  := g_cache_ptip_hwf_el_rec(l_index);
15374       --
15375       CLOSE c1;
15376   --
15377   END get_hours_ptip_elig;
15378 --
15379   PROCEDURE get_hours_elig(
15380     p_pgm_id            IN            NUMBER
15381    ,p_pl_id             IN            NUMBER
15382    ,p_oipl_id           IN            NUMBER
15383    ,p_plip_id           IN            NUMBER
15384    ,p_ptip_id           IN            NUMBER
15385    ,p_old_val           in            number  default null
15386    ,p_new_val           in            number  default null
15387    ,p_business_group_id IN            NUMBER
15388    ,p_effective_date    IN            DATE
15389    ,p_rec               OUT NOCOPY    g_cache_hwf_rec_obj) IS
15390     --
15391     l_package VARCHAR2(80) := g_package || '.get_hours_elig';
15392   --
15393   BEGIN
15394     --
15395     -- hr_utility.set_location ('Entering '||l_package,10);
15396     --
15397     -- Derive which data type we are dealing with
15398     --
15399     IF p_pgm_id IS NOT NULL THEN
15400       --
15401       get_hours_pgm_elig(p_pgm_id=> p_pgm_id
15402        ,p_old_val           => p_old_val
15403        ,p_new_val           => p_new_val
15404        ,p_business_group_id => p_business_group_id
15405        ,p_effective_date    => p_effective_date
15406        ,p_rec               => p_rec);
15407     --
15408     ELSIF p_pl_id IS NOT NULL THEN
15409       --
15410       get_hours_pl_elig(p_pl_id=> p_pl_id
15411         ,p_old_val           => p_old_val
15412        ,p_new_val           => p_new_val
15413        ,p_business_group_id => p_business_group_id
15414        ,p_effective_date    => p_effective_date
15415        ,p_rec               => p_rec);
15416     --
15417     ELSIF p_oipl_id IS NOT NULL THEN
15418       --
15419       get_hours_oipl_elig(p_oipl_id=> p_oipl_id
15420         ,p_old_val           => p_old_val
15421        ,p_new_val           => p_new_val
15422        ,p_business_group_id => p_business_group_id
15423        ,p_effective_date    => p_effective_date
15424        ,p_rec               => p_rec);
15425     --
15426     ELSIF p_plip_id IS NOT NULL THEN
15427       --
15428       get_hours_plip_elig(p_plip_id=> p_plip_id
15429         ,p_old_val           => p_old_val
15430        ,p_new_val           => p_new_val
15431        ,p_business_group_id => p_business_group_id
15432        ,p_effective_date    => p_effective_date
15433        ,p_rec               => p_rec);
15434     --
15438         ,p_old_val           => p_old_val
15435     ELSIF p_ptip_id IS NOT NULL THEN
15436       --
15437       get_hours_ptip_elig(p_ptip_id=> p_ptip_id
15439        ,p_new_val           => p_new_val
15440        ,p_business_group_id => p_business_group_id
15441        ,p_effective_date    => p_effective_date
15442        ,p_rec               => p_rec);
15443     --
15444     END IF;
15445   --
15446   -- hr_utility.set_location ('Leaving '||l_package,10);
15447   --
15448   END get_hours_elig;
15449 --
15450   PROCEDURE get_hours_pgm_rate(
15451     p_pgm_id            IN            NUMBER
15452    ,p_old_val           IN            NUMBER DEFAULT NULL
15453    ,p_new_val           IN            NUMBER DEFAULT NULL
15454    ,p_business_group_id IN            NUMBER
15455    ,p_effective_date    IN            DATE
15456    ,p_rec               OUT NOCOPY    g_cache_hwf_rec_obj) IS
15457     --
15458     l_package        VARCHAR2(80) := g_package || '.get_hours_pgm_rate';
15459     l_old_val_1 NUMBER := p_old_val + 1;
15460     l_new_val_1 NUMBER := p_new_val + 1;
15461     --
15462     -- Define Cursor
15463     --
15464     CURSOR c1 IS
15465       SELECT   p_pgm_id
15466               ,'Y'
15467               ,hwf.hrs_src_cd
15468               ,hwf.hrs_wkd_det_cd
15469               ,hwf.hrs_wkd_det_rl
15470               ,hwf.rndg_cd
15471               ,hwf.rndg_rl
15472               ,hwf.defined_balance_id
15473               ,hwf.bnfts_bal_id
15474               ,hwf.mn_hrs_num
15475               ,hwf.mx_hrs_num
15476               ,hwf.once_r_cntug_cd
15477               ,hwf.hrs_wkd_calc_rl
15478       FROM     ben_hrs_wkd_in_perd_fctr hwf
15479               ,ben_hrs_wkd_in_perd_rt_f hwr
15480               ,ben_vrbl_rt_prfl_f vpf
15481               ,ben_acty_vrbl_rt_f avr
15482               ,ben_acty_base_rt_f abr
15483       WHERE    abr.pgm_id = p_pgm_id
15484       AND      p_effective_date BETWEEN abr.effective_start_date
15485                    AND abr.effective_end_date
15486       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
15487       AND      p_effective_date BETWEEN avr.effective_start_date
15488                    AND avr.effective_end_date
15489       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
15490       AND      p_effective_date BETWEEN vpf.effective_start_date
15491                    AND vpf.effective_end_date
15492       AND      vpf.vrbl_rt_prfl_id = hwr.vrbl_rt_prfl_id
15493       AND      p_effective_date BETWEEN hwr.effective_start_date
15494                    AND hwr.effective_end_date
15495       AND      hwr.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
15496       AND      (
15497                     (
15498                           p_new_val IS NOT NULL
15499                       AND p_old_val IS NOT NULL
15500                       AND p_new_val >= NVL(hwf.mn_hrs_num
15501                                         ,p_new_val)
15502                       AND p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
15503                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
15504                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
15505                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
15506                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
15507                                    -- ceil( NVL(hwf.mx_hrs_num
15508                                    --     ,p_new_val) + 0.001 ))
15509                  OR (
15510                           p_new_val IS NOT NULL
15511                       AND p_old_val IS NOT NULL
15512                       AND (
15513                                p_new_val < NVL(hwf.mn_hrs_num
15514                                             ,p_new_val)
15515                             OR p_new_val >=  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
15516                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
15517                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
15518                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
15519                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
15520                                    -- ceil( NVL(hwf.mx_hrs_num
15521                                    --          ,p_new_val)) + 0.001 )
15522                       AND p_old_val >= NVL(hwf.mn_hrs_num
15523                                         ,p_old_val)
15524                       AND p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
15525                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
15526                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
15527                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
15528                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )  )
15529                                   -- ceil( NVL(hwf.mx_hrs_num
15530                                   --      ,p_old_val))  + 0.001 )
15531                  OR (    p_new_val IS NULL
15532                      AND p_old_val IS NULL));
15533     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
15534     --UNION ALL
15535     CURSOR c2 IS
15536       SELECT   p_pgm_id
15537               ,'Y'
15538               ,hwf.hrs_src_cd
15539               ,hwf.hrs_wkd_det_cd
15540               ,hwf.hrs_wkd_det_rl
15541               ,hwf.rndg_cd
15542               ,hwf.rndg_rl
15546               ,hwf.mx_hrs_num
15543               ,hwf.defined_balance_id
15544               ,hwf.bnfts_bal_id
15545               ,hwf.mn_hrs_num
15547               ,hwf.once_r_cntug_cd
15548               ,hwf.hrs_wkd_calc_rl
15549       FROM     ben_hrs_wkd_in_perd_fctr hwf
15550               --,ben_hrs_wkd_in_perd_rt_f hwr
15551               ,ben_elig_hrs_wkd_prte_f ehw
15552               ,ben_eligy_prfl_f elp
15553               ,ben_vrbl_rt_elig_prfl_f vep
15554               ,ben_vrbl_rt_prfl_f vpf
15555               ,ben_acty_vrbl_rt_f avr
15556               ,ben_acty_base_rt_f abr
15557       WHERE    abr.pgm_id = p_pgm_id
15558       AND      p_effective_date BETWEEN abr.effective_start_date
15559                    AND abr.effective_end_date
15560       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
15561       AND      p_effective_date BETWEEN avr.effective_start_date
15562                    AND avr.effective_end_date
15563       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
15564       AND      p_effective_date BETWEEN vpf.effective_start_date
15565                    AND vpf.effective_end_date
15566 --      AND      vpf.vrbl_rt_prfl_id = ehw.vrbl_rt_prfl_id
15567       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
15568       AND      p_effective_date BETWEEN vep.effective_start_date
15569                    AND vep.effective_end_date
15570       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
15571       AND      p_effective_date BETWEEN elp.effective_start_date
15572                    AND elp.effective_end_date
15573       AND      ehw.eligy_prfl_id = elp.eligy_prfl_id
15574       AND      p_effective_date BETWEEN ehw.effective_start_date
15575                    AND ehw.effective_end_date
15576       AND      ehw.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
15577       AND      (
15578                     (
15579                           p_new_val IS NOT NULL
15580                       AND p_old_val IS NOT NULL
15581                       AND p_new_val >= NVL(hwf.mn_hrs_num
15582                                         ,p_new_val)
15583                       AND p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
15584                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
15585                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
15586                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
15587                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
15588                                    -- ceil( NVL(hwf.mx_hrs_num
15589                                    --     ,p_new_val) + 0.001 ))
15590                  OR (
15591                           p_new_val IS NOT NULL
15592                       AND p_old_val IS NOT NULL
15593                       AND (
15594                                p_new_val < NVL(hwf.mn_hrs_num
15595                                             ,p_new_val)
15596                             OR p_new_val >=  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
15597                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
15598                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
15599                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
15600                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
15601                                    -- ceil( NVL(hwf.mx_hrs_num
15602                                    --          ,p_new_val)) + 0.001 )
15603                       AND p_old_val >= NVL(hwf.mn_hrs_num
15604                                         ,p_old_val)
15605                       AND p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
15606                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
15607                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
15608                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
15609                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )  )
15610                                   -- ceil( NVL(hwf.mx_hrs_num
15611                                   --      ,p_old_val))  + 0.001 )
15612                  OR (    p_new_val IS NULL
15613                      AND p_old_val IS NULL));
15614     --
15615     --
15616     l_index          PLS_INTEGER;
15617     l_not_hash_found BOOLEAN;
15618     l_c2notfound       BOOLEAN;
15619   --
15620   BEGIN
15621     --
15622     -- hr_utility.set_location ('Entering '||l_package,10);
15623     --
15624     -- Steps to do process
15625     --
15626     -- 1) Try and get value from cache
15627     -- 2) If can get from cache then copy to output record
15628     -- 3) If can't get from cache do db hit and then
15629     --    copy to cache record and then copy to output record.
15630     --
15631     -- Get hashed index value
15632     --
15633     l_index  := MOD(p_pgm_id
15634                  ,g_hash_key);
15635     --
15636     IF NOT g_cache_pgm_hwf_rt_rec.EXISTS(l_index) THEN
15637       --
15638       -- Lets store the hash value in this index
15639       --
15640       RAISE NO_DATA_FOUND;
15641     --
15642     ELSE
15643       --
15644       -- If it does exist make sure its the right one
15645       --
15646       IF g_cache_pgm_hwf_rt_rec(l_index).id <> p_pgm_id THEN
15647         --
15648         -- Loop through the hash using the jump routine to check further
15649         -- indexes
15650         --
15651         l_not_hash_found  := FALSE;
15655           l_index  := l_index + g_hash_jump;
15652         --
15653         WHILE NOT l_not_hash_found LOOP
15654           --
15656           --
15657           -- Check if the hash index exists, if not we can use it
15658           --
15659           IF NOT g_cache_pgm_hwf_rt_rec.EXISTS(l_index) THEN
15660             --
15661             -- Lets store the hash value in the index
15662             --
15663             RAISE NO_DATA_FOUND;
15664           --
15665           ELSE
15666             --
15667             -- Make sure the index is the correct one
15668             --
15669             IF g_cache_pgm_hwf_rt_rec(l_index).id = p_pgm_id THEN
15670               --
15671               -- We have a match so the hashed value  has been stored before
15672               --
15673               l_not_hash_found  := TRUE;
15674             --
15675             END IF;
15676           --
15677           END IF;
15678         --
15679         END LOOP;
15680       --
15681       END IF;
15682     --
15683     END IF;
15684     --
15685     -- If p_old_val and p_new_val is set this means we are trying to retrieve
15686     -- the correct rate for the calculated value.
15687     -- Previously we just cached the first rate we
15688     -- found since we needed the determination code, the correct age,los code,etc
15689     -- By killing the cache and forcing the value to be removed we cache the
15690     -- correct rate profile for the case we need.
15691     --
15692     IF     p_old_val IS NOT NULL
15693        AND p_new_val IS NOT NULL THEN
15694       --
15695       RAISE NO_DATA_FOUND;
15696     --
15697     END IF;
15698     --
15699     p_rec    := g_cache_pgm_hwf_rt_rec(l_index);
15700   --
15701   -- hr_utility.set_location ('Leaving '||l_package,10);
15702   --
15703   EXCEPTION
15704     --
15705     WHEN NO_DATA_FOUND THEN
15706       --
15707       -- The record has not been cached yet so lets cache it
15708       --
15709       OPEN c1;
15710       --
15711       FETCH c1 INTO g_cache_pgm_hwf_rt_rec(l_index);
15712       -- PERFNEW
15713       IF c1%NOTFOUND THEN
15714          --
15715          l_c2notfound := false;
15716          OPEN c2;
15717          FETCH c2 INTO g_cache_pgm_hwf_rt_rec(l_index);
15718          IF c2%NOTFOUND THEN
15719             --
15720             l_c2notfound := true;
15721             --
15722          END IF;
15723          CLOSE c2;
15724          --
15725       END IF;
15726       -- PERFNEW
15727       IF     p_old_val IS NULL
15728          AND p_new_val IS NULL THEN
15729         --
15730         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
15731           --
15732           if NOT g_cache_pgm_hwf_rt_rec.EXISTS(l_index) then
15733             g_cache_pgm_hwf_rt_rec(l_index).id     := p_pgm_id;
15734             g_cache_pgm_hwf_rt_rec(l_index).exist  := 'N';
15735           end if;
15736         --
15737         END IF;
15738       --
15739       END IF;
15740       --
15741       p_rec  := g_cache_pgm_hwf_rt_rec(l_index);
15742       --
15743       CLOSE c1;
15744   --
15745   END get_hours_pgm_rate;
15746 --
15747   PROCEDURE get_hours_pl_rate(
15748     p_pl_id             IN            NUMBER
15749    ,p_old_val           IN            NUMBER DEFAULT NULL
15750    ,p_new_val           IN            NUMBER DEFAULT NULL
15751    ,p_business_group_id IN            NUMBER
15752    ,p_effective_date    IN            DATE
15753    ,p_rec               OUT NOCOPY    g_cache_hwf_rec_obj) IS
15754     --
15755     l_package        VARCHAR2(80) := g_package || '.get_hours_pl_rate';
15756     l_old_val_1 NUMBER := p_old_val + 1;
15757     l_new_val_1 NUMBER := p_new_val + 1;
15758     --
15759     -- Define Cursor
15760     --
15761     CURSOR c1 IS
15762       SELECT   p_pl_id
15763               ,'Y'
15764               ,hwf.hrs_src_cd
15765               ,hwf.hrs_wkd_det_cd
15766               ,hwf.hrs_wkd_det_rl
15767               ,hwf.rndg_cd
15768               ,hwf.rndg_rl
15769               ,hwf.defined_balance_id
15770               ,hwf.bnfts_bal_id
15771               ,hwf.mn_hrs_num
15772               ,hwf.mx_hrs_num
15773               ,hwf.once_r_cntug_cd
15774               ,hwf.hrs_wkd_calc_rl
15775       FROM     ben_hrs_wkd_in_perd_fctr hwf
15776               ,ben_hrs_wkd_in_perd_rt_f hwr
15777               ,ben_vrbl_rt_prfl_f vpf
15778               ,ben_acty_vrbl_rt_f avr
15779               ,ben_acty_base_rt_f abr
15780       WHERE    abr.pl_id = p_pl_id
15781       AND      p_effective_date BETWEEN abr.effective_start_date
15782                    AND abr.effective_end_date
15783       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
15784       AND      p_effective_date BETWEEN avr.effective_start_date
15785                    AND avr.effective_end_date
15786       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
15787       AND      p_effective_date BETWEEN vpf.effective_start_date
15788                    AND vpf.effective_end_date
15789       AND      vpf.vrbl_rt_prfl_id = hwr.vrbl_rt_prfl_id
15790       AND      p_effective_date BETWEEN hwr.effective_start_date
15791                    AND hwr.effective_end_date
15792       AND      hwr.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
15793       AND      (
15797                       AND p_new_val >= NVL(hwf.mn_hrs_num
15794                     (
15795                           p_new_val IS NOT NULL
15796                       AND p_old_val IS NOT NULL
15798                                         ,p_new_val)
15799                       AND p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
15800                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
15801                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
15802                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
15803                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
15804                                     -- ceil(NVL(hwf.mx_hrs_num
15805                                     --   ,p_new_val) + 0.001 ))
15806                  OR (
15807                           p_new_val IS NOT NULL
15808                       AND p_old_val IS NOT NULL
15809                       AND (
15810                                p_new_val < NVL(hwf.mn_hrs_num
15811                                             ,p_new_val)
15812                             OR p_new_val >=  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
15813                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
15814                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
15815                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
15816                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
15817                                   -- ceil( NVL(hwf.mx_hrs_num
15818                                   --           ,p_new_val))  + 0.001 )
15819                       AND p_old_val >= NVL(hwf.mn_hrs_num
15820                                         ,p_old_val)
15821                       AND p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
15822                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
15823                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
15824                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
15825                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )  )
15826                                   -- ceil( NVL(hwf.mx_hrs_num
15827                                   --     ,p_old_val)) + 0.001 )
15828                  OR (    p_new_val IS NULL
15829                      AND p_old_val IS NULL));
15830     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
15831     --UNION ALL
15832     CURSOR c2 IS
15833       SELECT   p_pl_id
15834               ,'Y'
15835               ,hwf.hrs_src_cd
15836               ,hwf.hrs_wkd_det_cd
15837               ,hwf.hrs_wkd_det_rl
15838               ,hwf.rndg_cd
15839               ,hwf.rndg_rl
15840               ,hwf.defined_balance_id
15841               ,hwf.bnfts_bal_id
15842               ,hwf.mn_hrs_num
15843               ,hwf.mx_hrs_num
15844               ,hwf.once_r_cntug_cd
15845               ,hwf.hrs_wkd_calc_rl
15846       FROM     ben_hrs_wkd_in_perd_fctr hwf
15847               --,ben_hrs_wkd_in_perd_rt_f hwr
15848               ,ben_elig_hrs_wkd_prte_f ehw
15849               ,ben_eligy_prfl_f elp
15850               ,ben_vrbl_rt_elig_prfl_f vep
15851               ,ben_vrbl_rt_prfl_f vpf
15852               ,ben_acty_vrbl_rt_f avr
15853               ,ben_acty_base_rt_f abr
15854       WHERE    abr.pl_id = p_pl_id
15855       AND      p_effective_date BETWEEN abr.effective_start_date
15856                    AND abr.effective_end_date
15857       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
15858       AND      p_effective_date BETWEEN avr.effective_start_date
15859                    AND avr.effective_end_date
15860       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
15861       AND      p_effective_date BETWEEN vpf.effective_start_date
15862                    AND vpf.effective_end_date
15863 --      AND      vpf.vrbl_rt_prfl_id = ehw.vrbl_rt_prfl_id
15864       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
15865       AND      p_effective_date BETWEEN vep.effective_start_date
15866                    AND vep.effective_end_date
15867       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
15868       AND      p_effective_date BETWEEN elp.effective_start_date
15869                    AND elp.effective_end_date
15870       AND      ehw.eligy_prfl_id = elp.eligy_prfl_id
15871       AND      p_effective_date BETWEEN ehw.effective_start_date
15872                    AND ehw.effective_end_date
15873       AND      ehw.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
15874       AND      (
15875                     (
15876                           p_new_val IS NOT NULL
15877                       AND p_old_val IS NOT NULL
15878                       AND p_new_val >= NVL(hwf.mn_hrs_num
15879                                         ,p_new_val)
15880                       AND p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
15881                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
15882                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
15883                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
15884                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
15885                                     -- ceil(NVL(hwf.mx_hrs_num
15886                                     --   ,p_new_val) + 0.001 ))
15887                  OR (
15888                           p_new_val IS NOT NULL
15892                                             ,p_new_val)
15889                       AND p_old_val IS NOT NULL
15890                       AND (
15891                                p_new_val < NVL(hwf.mn_hrs_num
15893                             OR p_new_val >=  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
15894                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
15895                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
15896                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
15897                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
15898                                   -- ceil( NVL(hwf.mx_hrs_num
15899                                   --           ,p_new_val))  + 0.001 )
15900                       AND p_old_val >= NVL(hwf.mn_hrs_num
15901                                         ,p_old_val)
15902                       AND p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
15903                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
15904                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
15905                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
15906                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )  )
15907                                   -- ceil( NVL(hwf.mx_hrs_num
15908                                   --     ,p_old_val)) + 0.001 )
15909                  OR (    p_new_val IS NULL
15910                      AND p_old_val IS NULL));
15911     --
15912     --
15913     l_index          PLS_INTEGER;
15914     l_not_hash_found BOOLEAN;
15915     l_c2notfound       BOOLEAN;
15916   --
15917   BEGIN
15918     --
15919     -- hr_utility.set_location ('Entering '||l_package,10);
15920     --
15921     -- Steps to do process
15922     --
15923     -- 1) Try and get value from cache
15924     -- 2) If can get from cache then copy to output record
15925     -- 3) If can't get from cache do db hit and then
15926     --    copy to cache record and then copy to output record.
15927     --
15928     -- Get hashed index value
15929     --
15930     l_index  := MOD(p_pl_id
15931                  ,g_hash_key);
15932     --
15933     IF NOT g_cache_pl_hwf_rt_rec.EXISTS(l_index) THEN
15934       --
15935       -- Lets store the hash value in this index
15936       --
15937       RAISE NO_DATA_FOUND;
15938     --
15939     ELSE
15940       --
15941       -- If it does exist make sure its the right one
15942       --
15943       IF g_cache_pl_hwf_rt_rec(l_index).id <> p_pl_id THEN
15944         --
15945         -- Loop through the hash using the jump routine to check further
15946         -- indexes
15947         --
15948         l_not_hash_found  := FALSE;
15949         --
15950         WHILE NOT l_not_hash_found LOOP
15951           --
15952           l_index  := l_index + g_hash_jump;
15953           --
15954           -- Check if the hash index exists, if not we can use it
15955           --
15956           IF NOT g_cache_pl_hwf_rt_rec.EXISTS(l_index) THEN
15957             --
15958             -- Lets store the hash value in the index
15959             --
15960             RAISE NO_DATA_FOUND;
15961           --
15962           ELSE
15963             --
15964             -- Make sure the index is the correct one
15965             --
15966             IF g_cache_pl_hwf_rt_rec(l_index).id = p_pl_id THEN
15967               --
15968               -- We have a match so the hashed value  has been stored before
15969               --
15970               l_not_hash_found  := TRUE;
15971             --
15972             END IF;
15973           --
15974           END IF;
15975         --
15976         END LOOP;
15977       --
15978       END IF;
15979     --
15980     END IF;
15981     --
15982     -- If p_old_val and p_new_val is set this means we are trying to retrieve
15983     -- the correct rate for the calculated value.
15984     -- Previously we just cached the first rate we
15985     -- found since we needed the determination code, the correct age,los code,etc
15986     -- By killing the cache and forcing the value to be removed we cache the
15987     -- correct rate profile for the case we need.
15988     --
15989     IF     p_old_val IS NOT NULL
15990        AND p_new_val IS NOT NULL THEN
15991       --
15992       RAISE NO_DATA_FOUND;
15993     --
15994     END IF;
15995     --
15996     p_rec    := g_cache_pl_hwf_rt_rec(l_index);
15997   --
15998   -- hr_utility.set_location ('Leaving '||l_package,10);
15999   --
16000   EXCEPTION
16001     --
16002     WHEN NO_DATA_FOUND THEN
16003       --
16004       -- The record has not been cached yet so lets cache it
16005       --
16006       OPEN c1;
16007       --
16008       FETCH c1 INTO g_cache_pl_hwf_rt_rec(l_index);
16009       -- PERFNEW
16010       IF c1%NOTFOUND THEN
16011          --
16012          l_c2notfound := false;
16013          OPEN c2;
16014          FETCH c2 INTO g_cache_pl_hwf_rt_rec(l_index);
16015          IF c2%NOTFOUND THEN
16016             --
16017             l_c2notfound := true;
16018             --
16019          END IF;
16020          CLOSE c2;
16021          --
16022       END IF;
16023       -- PERFNEW
16024       IF     p_old_val IS NULL
16025          AND p_new_val IS NULL THEN
16029           if NOT g_cache_pl_hwf_rt_rec.EXISTS(l_index) then
16026         --
16027         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
16028           --
16030             g_cache_pl_hwf_rt_rec(l_index).id     := p_pl_id;
16031             g_cache_pl_hwf_rt_rec(l_index).exist  := 'N';
16032           end if;
16033         --
16034         END IF;
16035       --
16036       END IF;
16037       --
16038       p_rec  := g_cache_pl_hwf_rt_rec(l_index);
16039       --
16040       CLOSE c1;
16041   --
16042   END get_hours_pl_rate;
16043 --
16044   PROCEDURE get_hours_oipl_rate(
16045     p_oipl_id           IN            NUMBER
16046    ,p_old_val           IN            NUMBER DEFAULT NULL
16047    ,p_new_val           IN            NUMBER DEFAULT NULL
16048    ,p_business_group_id IN            NUMBER
16049    ,p_effective_date    IN            DATE
16050    ,p_rec               OUT NOCOPY    g_cache_hwf_rec_obj) IS
16051     --
16052     l_package        VARCHAR2(80) := g_package || '.get_hours_oipl_rate';
16053     l_old_val_1 NUMBER := p_old_val + 1;
16054     l_new_val_1 NUMBER := p_new_val + 1;
16055     --
16056     l_opt_id    NUMBER;
16057     --
16058     -- Define Cursor
16059     --
16060     CURSOR c1 IS
16061       SELECT   p_oipl_id
16062               ,'Y'
16063               ,hwf.hrs_src_cd
16064               ,hwf.hrs_wkd_det_cd
16065               ,hwf.hrs_wkd_det_rl
16066               ,hwf.rndg_cd
16067               ,hwf.rndg_rl
16068               ,hwf.defined_balance_id
16069               ,hwf.bnfts_bal_id
16070               ,hwf.mn_hrs_num
16071               ,hwf.mx_hrs_num
16072               ,hwf.once_r_cntug_cd
16073               ,hwf.hrs_wkd_calc_rl
16074       FROM     ben_hrs_wkd_in_perd_fctr hwf
16075               ,ben_hrs_wkd_in_perd_rt_f hwr
16076               ,ben_vrbl_rt_prfl_f vpf
16077               ,ben_acty_vrbl_rt_f avr
16078               ,ben_acty_base_rt_f abr
16079       WHERE    ( abr.oipl_id = p_oipl_id
16080       --
16081       --START Option level Rates Enhancements
16082                or ( abr.opt_id = l_opt_id and
16083                      not exists (select null from ben_acty_base_rt_f abr1
16084                      where abr1.oipl_id = p_oipl_id )))
16085       --END Option level Rates Enhancements
16086       --
16087       AND      p_effective_date BETWEEN abr.effective_start_date
16088                    AND abr.effective_end_date
16089       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
16090       AND      p_effective_date BETWEEN avr.effective_start_date
16091                    AND avr.effective_end_date
16092       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
16093       AND      p_effective_date BETWEEN vpf.effective_start_date
16094                    AND vpf.effective_end_date
16095       AND      vpf.vrbl_rt_prfl_id = hwr.vrbl_rt_prfl_id
16096       AND      p_effective_date BETWEEN hwr.effective_start_date
16097                    AND hwr.effective_end_date
16098       AND      hwr.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
16099       AND      (
16100                     (
16101                           p_new_val IS NOT NULL
16102                       AND p_old_val IS NOT NULL
16103                       AND p_new_val >= NVL(hwf.mn_hrs_num
16104                                         ,p_new_val)
16105                       AND p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
16106                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
16107                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
16108                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
16109                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
16110                                     -- ceil( NVL(hwf.mx_hrs_num
16111                                     --   ,p_new_val) + 0.001 ))
16112                  OR (
16113                           p_new_val IS NOT NULL
16114                       AND p_old_val IS NOT NULL
16115                       AND (
16116                                p_new_val < NVL(hwf.mn_hrs_num
16117                                             ,p_new_val)
16118                             OR p_new_val >=  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
16119                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
16120                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
16121                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
16122                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
16123                                   -- ceil(NVL(hwf.mx_hrs_num
16124                                   --            ,p_new_val)) + 0.001 )
16125                       AND p_old_val >= NVL(hwf.mn_hrs_num
16126                                         ,p_old_val)
16127                       AND p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
16128                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
16129                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
16130                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
16131                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )  )
16132                                   -- ceil(NVL(hwf.mx_hrs_num
16133                                   --      ,p_old_val)) + 0.001 )
16134                  OR (    p_new_val IS NULL
16138     CURSOR c2 IS
16135                      AND p_old_val IS NULL));
16136     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
16137     --UNION ALL
16139       SELECT   p_oipl_id
16140               ,'Y'
16141               ,hwf.hrs_src_cd
16142               ,hwf.hrs_wkd_det_cd
16143               ,hwf.hrs_wkd_det_rl
16144               ,hwf.rndg_cd
16145               ,hwf.rndg_rl
16146               ,hwf.defined_balance_id
16147               ,hwf.bnfts_bal_id
16148               ,hwf.mn_hrs_num
16149               ,hwf.mx_hrs_num
16150               ,hwf.once_r_cntug_cd
16151               ,hwf.hrs_wkd_calc_rl
16152       FROM     ben_hrs_wkd_in_perd_fctr hwf
16153               --,ben_hrs_wkd_in_perd_rt_f hwr
16154               ,ben_elig_hrs_wkd_prte_f ehw
16155               ,ben_eligy_prfl_f elp
16156               ,ben_vrbl_rt_elig_prfl_f vep
16157               ,ben_vrbl_rt_prfl_f vpf
16158               ,ben_acty_vrbl_rt_f avr
16159               ,ben_acty_base_rt_f abr
16160       WHERE    ( abr.oipl_id = p_oipl_id
16161       --
16162       --START Option level Rates Enhancements
16163                or ( abr.opt_id = l_opt_id and
16164                      not exists (select null from ben_acty_base_rt_f abr1
16165                      where abr1.oipl_id = p_oipl_id )))
16166       --END Option level Rates Enhancements
16167       --
16168       AND      p_effective_date BETWEEN abr.effective_start_date
16169                    AND abr.effective_end_date
16170       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
16171       AND      p_effective_date BETWEEN avr.effective_start_date
16172                    AND avr.effective_end_date
16173       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
16174       AND      p_effective_date BETWEEN vpf.effective_start_date
16175                    AND vpf.effective_end_date
16176 --      AND      vpf.vrbl_rt_prfl_id = ehw.vrbl_rt_prfl_id
16177       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
16178       AND      p_effective_date BETWEEN vep.effective_start_date
16179                    AND vep.effective_end_date
16180       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
16181       AND      p_effective_date BETWEEN elp.effective_start_date
16182                    AND elp.effective_end_date
16183       AND      ehw.eligy_prfl_id = elp.eligy_prfl_id
16184       AND      p_effective_date BETWEEN ehw.effective_start_date
16185                    AND ehw.effective_end_date
16186       AND      ehw.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
16187       AND      (
16188                     (
16189                           p_new_val IS NOT NULL
16190                       AND p_old_val IS NOT NULL
16191                       AND p_new_val >= NVL(hwf.mn_hrs_num
16192                                         ,p_new_val)
16193                       AND p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
16194                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
16195                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
16196                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
16197                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
16198                                     -- ceil( NVL(hwf.mx_hrs_num
16199                                     --   ,p_new_val) + 0.001 ))
16200                  OR (
16201                           p_new_val IS NOT NULL
16202                       AND p_old_val IS NOT NULL
16203                       AND (
16204                                p_new_val < NVL(hwf.mn_hrs_num
16205                                             ,p_new_val)
16206                             OR p_new_val >=  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
16207                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
16208                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
16209                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
16210                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
16211                                   -- ceil(NVL(hwf.mx_hrs_num
16212                                   --            ,p_new_val)) + 0.001 )
16213                       AND p_old_val >= NVL(hwf.mn_hrs_num
16214                                         ,p_old_val)
16215                       AND p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
16216                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
16217                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
16218                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
16219                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )  )
16220                                   -- ceil(NVL(hwf.mx_hrs_num
16221                                   --      ,p_old_val)) + 0.001 )
16222                  OR (    p_new_val IS NULL
16223                      AND p_old_val IS NULL));
16224     --
16225     --
16226     l_index          PLS_INTEGER;
16227     l_not_hash_found BOOLEAN;
16228     l_c2notfound       BOOLEAN;
16229   --
16230   BEGIN
16231     --
16232     -- hr_utility.set_location ('Entering '||l_package,10);
16233     --
16234     -- Steps to do process
16235     --
16236     -- 1) Try and get value from cache
16237     -- 2) If can get from cache then copy to output record
16238     -- 3) If can't get from cache do db hit and then
16239     --    copy to cache record and then copy to output record.
16240     --
16244                  ,g_hash_key);
16241     -- Get hashed index value
16242     --
16243     l_index  := MOD(p_oipl_id
16245     --
16246     IF NOT g_cache_oipl_hwf_rt_rec.EXISTS(l_index) THEN
16247       --
16248       -- Lets store the hash value in this index
16249       --
16250       RAISE NO_DATA_FOUND;
16251     --
16252     ELSE
16253       --
16254       -- If it does exist make sure its the right one
16255       --
16256       IF g_cache_oipl_hwf_rt_rec(l_index).id <> p_oipl_id THEN
16257         --
16258         -- Loop through the hash using the jump routine to check further
16259         -- indexes
16260         --
16261         l_not_hash_found  := FALSE;
16262         --
16263         WHILE NOT l_not_hash_found LOOP
16264           --
16265           l_index  := l_index + g_hash_jump;
16266           --
16267           -- Check if the hash index exists, if not we can use it
16268           --
16269           IF NOT g_cache_oipl_hwf_rt_rec.EXISTS(l_index) THEN
16270             --
16271             -- Lets store the hash value in the index
16272             --
16273             RAISE NO_DATA_FOUND;
16274           --
16275           ELSE
16276             --
16277             -- Make sure the index is the correct one
16278             --
16279             IF g_cache_oipl_hwf_rt_rec(l_index).id = p_oipl_id THEN
16280               --
16281               -- We have a match so the hashed value  has been stored before
16282               --
16283               l_not_hash_found  := TRUE;
16284             --
16285             END IF;
16286           --
16287           END IF;
16288         --
16289         END LOOP;
16290       --
16291       END IF;
16292     --
16293     END IF;
16294     --
16295     -- If p_old_val and p_new_val is set this means we are trying to retrieve
16296     -- the correct rate for the calculated value.
16297     -- Previously we just cached the first rate we
16298     -- found since we needed the determination code, the correct age,los code,etc
16299     -- By killing the cache and forcing the value to be removed we cache the
16300     -- correct rate profile for the case we need.
16301     --
16302     IF     p_old_val IS NOT NULL
16303        AND p_new_val IS NOT NULL THEN
16304       --
16305       RAISE NO_DATA_FOUND;
16306     --
16307     END IF;
16308     --
16309     p_rec    := g_cache_oipl_hwf_rt_rec(l_index);
16310   --
16311   -- hr_utility.set_location ('Leaving '||l_package,10);
16312   --
16313   EXCEPTION
16314     --
16315     WHEN NO_DATA_FOUND THEN
16316       --
16317       -- The record has not been cached yet so lets cache it
16318       -- Option level rates enhancement
16319       l_opt_id := get_opt_id(p_oipl_id,p_effective_date);
16320       --
16321       OPEN c1;
16322       --
16323       FETCH c1 INTO g_cache_oipl_hwf_rt_rec(l_index);
16324       -- PERFNEW
16325       IF c1%NOTFOUND THEN
16326          --
16327          l_c2notfound := false;
16328          OPEN c2;
16329          FETCH c2 INTO g_cache_oipl_hwf_rt_rec(l_index);
16330          IF c2%NOTFOUND THEN
16331             --
16332             l_c2notfound := true;
16333             --
16334          END IF;
16335          CLOSE c2;
16336          --
16337       END IF;
16338       -- PERFNEW
16339       IF     p_old_val IS NULL
16340          AND p_new_val IS NULL THEN
16341         --
16342         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
16343           --
16344           if NOT g_cache_oipl_hwf_rt_rec.EXISTS(l_index) then
16345             g_cache_oipl_hwf_rt_rec(l_index).id     := p_oipl_id;
16346             g_cache_oipl_hwf_rt_rec(l_index).exist  := 'N';
16347           end if;
16348         --
16349         END IF;
16350       --
16351       END IF;
16352       --
16353       p_rec  := g_cache_oipl_hwf_rt_rec(l_index);
16354       --
16355       CLOSE c1;
16356   --
16357   END get_hours_oipl_rate;
16358 --
16359   PROCEDURE get_hours_plip_rate(
16360     p_plip_id           IN            NUMBER
16361    ,p_old_val           IN            NUMBER DEFAULT NULL
16362    ,p_new_val           IN            NUMBER DEFAULT NULL
16363    ,p_business_group_id IN            NUMBER
16364    ,p_effective_date    IN            DATE
16365    ,p_rec               OUT NOCOPY    g_cache_hwf_rec_obj) IS
16366     --
16367     l_package        VARCHAR2(80) := g_package || '.get_hours_plip_rate';
16368     l_old_val_1 NUMBER := p_old_val + 1;
16369     l_new_val_1 NUMBER := p_new_val + 1;
16370     --
16371     -- Define Cursor
16372     --
16373     CURSOR c1 IS
16374       SELECT   p_plip_id
16375               ,'Y'
16376               ,hwf.hrs_src_cd
16377               ,hwf.hrs_wkd_det_cd
16378               ,hwf.hrs_wkd_det_rl
16379               ,hwf.rndg_cd
16380               ,hwf.rndg_rl
16381               ,hwf.defined_balance_id
16382               ,hwf.bnfts_bal_id
16383               ,hwf.mn_hrs_num
16384               ,hwf.mx_hrs_num
16385               ,hwf.once_r_cntug_cd
16386               ,hwf.hrs_wkd_calc_rl
16387       FROM     ben_hrs_wkd_in_perd_fctr hwf
16388               ,ben_hrs_wkd_in_perd_rt_f hwr
16389               ,ben_vrbl_rt_prfl_f vpf
16390               ,ben_acty_vrbl_rt_f avr
16391               ,ben_acty_base_rt_f abr
16392       WHERE    abr.plip_id = p_plip_id
16393       AND      p_effective_date BETWEEN abr.effective_start_date
16394                    AND abr.effective_end_date
16398       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
16395       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
16396       AND      p_effective_date BETWEEN avr.effective_start_date
16397                    AND avr.effective_end_date
16399       AND      p_effective_date BETWEEN vpf.effective_start_date
16400                    AND vpf.effective_end_date
16401       AND      vpf.vrbl_rt_prfl_id = hwr.vrbl_rt_prfl_id
16402       AND      p_effective_date BETWEEN hwr.effective_start_date
16403                    AND hwr.effective_end_date
16404       AND      hwr.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
16405       AND      (
16406                     (
16407                           p_new_val IS NOT NULL
16408                       AND p_old_val IS NOT NULL
16409                       AND p_new_val >= NVL(hwf.mn_hrs_num
16410                                         ,p_new_val)
16411                       AND p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
16412                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
16413                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
16414                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
16415                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
16416                                      -- ceil( NVL(hwf.mx_hrs_num
16417                                      --   ,p_new_val) + 0.001 ))
16418                  OR (
16419                           p_new_val IS NOT NULL
16420                       AND p_old_val IS NOT NULL
16421                       AND (
16422                                p_new_val < NVL(hwf.mn_hrs_num
16423                                             ,p_new_val)
16424                             OR p_new_val >=  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
16425                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
16426                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
16427                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
16428                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
16429                                   -- ceil( NVL(hwf.mx_hrs_num
16430                                   --            ,p_new_val)) + 0.001 )
16431                       AND p_old_val >= NVL(hwf.mn_hrs_num
16432                                         ,p_old_val)
16433                       AND p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
16434                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
16435                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
16436                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
16437                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )  )
16438                                  -- ceil( NVL(hwf.mx_hrs_num
16439                                  --      , p_old_val))  + 0.001 )
16440                  OR (    p_new_val IS NULL
16441                      AND p_old_val IS NULL));
16442     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
16443     --UNION ALL
16444     CURSOR c2 IS
16445       SELECT   p_plip_id
16446               ,'Y'
16447               ,hwf.hrs_src_cd
16448               ,hwf.hrs_wkd_det_cd
16449               ,hwf.hrs_wkd_det_rl
16450               ,hwf.rndg_cd
16451               ,hwf.rndg_rl
16452               ,hwf.defined_balance_id
16453               ,hwf.bnfts_bal_id
16454               ,hwf.mn_hrs_num
16455               ,hwf.mx_hrs_num
16456               ,hwf.once_r_cntug_cd
16457               ,hwf.hrs_wkd_calc_rl
16458       FROM     ben_hrs_wkd_in_perd_fctr hwf
16462               ,ben_vrbl_rt_elig_prfl_f vep
16459               --,ben_hrs_wkd_in_perd_rt_f hwr
16460               ,ben_elig_hrs_wkd_prte_f ehw
16461               ,ben_eligy_prfl_f elp
16463               ,ben_vrbl_rt_prfl_f vpf
16464               ,ben_acty_vrbl_rt_f avr
16465               ,ben_acty_base_rt_f abr
16466       WHERE    abr.plip_id = p_plip_id
16467       AND      p_effective_date BETWEEN abr.effective_start_date
16468                    AND abr.effective_end_date
16469       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
16470       AND      p_effective_date BETWEEN avr.effective_start_date
16471                    AND avr.effective_end_date
16472       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
16473       AND      p_effective_date BETWEEN vpf.effective_start_date
16474                    AND vpf.effective_end_date
16475 --      AND      vpf.vrbl_rt_prfl_id = ehw.vrbl_rt_prfl_id
16476       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
16477       AND      p_effective_date BETWEEN vep.effective_start_date
16478                    AND vep.effective_end_date
16479       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
16480       AND      p_effective_date BETWEEN elp.effective_start_date
16481                    AND elp.effective_end_date
16482       AND      ehw.eligy_prfl_id = elp.eligy_prfl_id
16483       AND      p_effective_date BETWEEN ehw.effective_start_date
16484                    AND ehw.effective_end_date
16485       AND      ehw.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
16486       AND      (
16487                     (
16488                           p_new_val IS NOT NULL
16489                       AND p_old_val IS NOT NULL
16490                       AND p_new_val >= NVL(hwf.mn_hrs_num
16491                                         ,p_new_val)
16492                       AND p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
16493                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
16494                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
16495                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
16496                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
16497                                      -- ceil( NVL(hwf.mx_hrs_num
16498                                      --   ,p_new_val) + 0.001 ))
16499                  OR (
16500                           p_new_val IS NOT NULL
16501                       AND p_old_val IS NOT NULL
16502                       AND (
16503                                p_new_val < NVL(hwf.mn_hrs_num
16504                                             ,p_new_val)
16505                             OR p_new_val >=  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
16506                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
16507                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
16508                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
16509                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
16510                                   -- ceil( NVL(hwf.mx_hrs_num
16511                                   --            ,p_new_val)) + 0.001 )
16512                       AND p_old_val >= NVL(hwf.mn_hrs_num
16513                                         ,p_old_val)
16514                       AND p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
16515                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
16516                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
16517                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
16518                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )  )
16519                                  -- ceil( NVL(hwf.mx_hrs_num
16520                                  --      , p_old_val))  + 0.001 )
16521                  OR (    p_new_val IS NULL
16522                      AND p_old_val IS NULL));
16523     --
16524     --
16525     l_index          PLS_INTEGER;
16526     l_not_hash_found BOOLEAN;
16527     l_c2notfound       BOOLEAN;
16528   --
16529   BEGIN
16530     --
16531     -- hr_utility.set_location ('Entering '||l_package,10);
16532     --
16533     -- Steps to do process
16534     --
16535     -- 1) Try and get value from cache
16536     -- 2) If can get from cache then copy to output record
16537     -- 3) If can't get from cache do db hit and then
16538     --    copy to cache record and then copy to output record.
16539     --
16540     -- Get hashed index value
16541     --
16542     l_index  := MOD(p_plip_id
16543                  ,g_hash_key);
16544     --
16545     IF NOT g_cache_plip_hwf_rt_rec.EXISTS(l_index) THEN
16546       --
16547       -- Lets store the hash value in this index
16548       --
16549       RAISE NO_DATA_FOUND;
16550     --
16551     ELSE
16552       --
16553       -- If it does exist make sure its the right one
16554       --
16555       IF g_cache_plip_hwf_rt_rec(l_index).id <> p_plip_id THEN
16556         --
16557         -- Loop through the hash using the jump routine to check further
16558         -- indexes
16559         --
16560         l_not_hash_found  := FALSE;
16561         --
16562         WHILE NOT l_not_hash_found LOOP
16563           --
16564           l_index  := l_index + g_hash_jump;
16565           --
16566           -- Check if the hash index exists, if not we can use it
16567           --
16568           IF NOT g_cache_plip_hwf_rt_rec.EXISTS(l_index) THEN
16569             --
16570             -- Lets store the hash value in the index
16571             --
16572             RAISE NO_DATA_FOUND;
16573           --
16574           ELSE
16575             --
16576             -- Make sure the index is the correct one
16577             --
16578             IF g_cache_plip_hwf_rt_rec(l_index).id = p_plip_id THEN
16579               --
16583             --
16580               -- We have a match so the hashed value  has been stored before
16581               --
16582               l_not_hash_found  := TRUE;
16584             END IF;
16585           --
16586           END IF;
16587         --
16588         END LOOP;
16589       --
16590       END IF;
16591     --
16592     END IF;
16593     --
16594     -- If p_old_val and p_new_val is set this means we are trying to retrieve
16595     -- the correct rate for the calculated value.
16596     -- Previously we just cached the first rate we
16597     -- found since we needed the determination code, the correct age,los code,etc
16598     -- By killing the cache and forcing the value to be removed we cache the
16599     -- correct rate profile for the case we need.
16600     --
16601     IF     p_old_val IS NOT NULL
16602        AND p_new_val IS NOT NULL THEN
16603       --
16604       RAISE NO_DATA_FOUND;
16605     --
16606     END IF;
16607     --
16608     p_rec    := g_cache_plip_hwf_rt_rec(l_index);
16609   --
16610   -- hr_utility.set_location ('Leaving '||l_package,10);
16611   --
16612   EXCEPTION
16613     --
16614     WHEN NO_DATA_FOUND THEN
16615       --
16616       -- The record has not been cached yet so lets cache it
16617       --
16618       OPEN c1;
16619       --
16620       FETCH c1 INTO g_cache_plip_hwf_rt_rec(l_index);
16621       -- PERFNEW
16622       IF c1%NOTFOUND THEN
16623          --
16624          l_c2notfound := false;
16625          OPEN c2;
16626          FETCH c2 INTO g_cache_plip_hwf_rt_rec(l_index);
16627          IF c2%NOTFOUND THEN
16628             --
16629             l_c2notfound := true;
16630             --
16631          END IF;
16632          CLOSE c2;
16633          --
16634       END IF;
16635       -- PERFNEW
16636       IF     p_old_val IS NULL
16637          AND p_new_val IS NULL THEN
16638         --
16639         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
16640           --
16641           if NOT g_cache_plip_hwf_rt_rec.EXISTS(l_index) then
16642           g_cache_plip_hwf_rt_rec(l_index).id     := p_plip_id;
16643           g_cache_plip_hwf_rt_rec(l_index).exist  := 'N';
16644           end if;
16645         --
16646         END IF;
16647       --
16648       END IF;
16649       --
16650       p_rec  := g_cache_plip_hwf_rt_rec(l_index);
16651       --
16652       CLOSE c1;
16653   --
16654   END get_hours_plip_rate;
16655 --
16656   PROCEDURE get_hours_ptip_rate(
16657     p_ptip_id           IN            NUMBER
16658    ,p_old_val           IN            NUMBER DEFAULT NULL
16659    ,p_new_val           IN            NUMBER DEFAULT NULL
16660    ,p_business_group_id IN            NUMBER
16661    ,p_effective_date    IN            DATE
16662    ,p_rec               OUT NOCOPY    g_cache_hwf_rec_obj) IS
16663     --
16664     l_package        VARCHAR2(80) := g_package || '.get_hours_ptip_rate';
16665     l_old_val_1 NUMBER := p_old_val + 1;
16666     l_new_val_1 NUMBER := p_new_val + 1;
16667     --
16668     -- Define Cursor
16669     --
16670     CURSOR c1 IS
16671       SELECT   p_ptip_id
16672               ,'Y'
16673               ,hwf.hrs_src_cd
16674               ,hwf.hrs_wkd_det_cd
16675               ,hwf.hrs_wkd_det_rl
16676               ,hwf.rndg_cd
16677               ,hwf.rndg_rl
16678               ,hwf.defined_balance_id
16679               ,hwf.bnfts_bal_id
16680               ,hwf.mn_hrs_num
16681               ,hwf.mx_hrs_num
16682               ,hwf.once_r_cntug_cd
16683               ,hwf.hrs_wkd_calc_rl
16684       FROM     ben_hrs_wkd_in_perd_fctr hwf
16685               ,ben_hrs_wkd_in_perd_rt_f hwr
16686               ,ben_vrbl_rt_prfl_f vpf
16687               ,ben_acty_vrbl_rt_f avr
16688               ,ben_acty_base_rt_f abr
16689       WHERE    abr.ptip_id = p_ptip_id
16690       AND      p_effective_date BETWEEN abr.effective_start_date
16691                    AND abr.effective_end_date
16692       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
16693       AND      p_effective_date BETWEEN avr.effective_start_date
16694                    AND avr.effective_end_date
16695       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
16696       AND      p_effective_date BETWEEN vpf.effective_start_date
16697                    AND vpf.effective_end_date
16698       AND      vpf.vrbl_rt_prfl_id = hwr.vrbl_rt_prfl_id
16699       AND      p_effective_date BETWEEN hwr.effective_start_date
16700                    AND hwr.effective_end_date
16701       AND      hwr.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
16702       AND      (
16703                     (
16704                           p_new_val IS NOT NULL
16705                       AND p_old_val IS NOT NULL
16706                       AND p_new_val >= NVL(hwf.mn_hrs_num
16707                                         ,p_new_val)
16708                       AND p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
16709                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
16710                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
16711                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
16712                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
16713                                    -- ceil( NVL(hwf.mx_hrs_num
16714                                    --     ,p_new_val) + 0.001 ))
16715                  OR (
16716                           p_new_val IS NOT NULL
16717                       AND p_old_val IS NOT NULL
16718                       AND (
16719                                p_new_val < NVL(hwf.mn_hrs_num
16720                                             ,p_new_val)
16721                             OR p_new_val >=  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
16725                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
16722                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
16723                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
16724                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
16726                                   -- ceil( NVL(hwf.mx_hrs_num
16727                                   --            , p_new_val)) + 0.001 )
16728                       AND p_old_val >= NVL(hwf.mn_hrs_num
16729                                         ,p_old_val)
16730                       AND p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
16731                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
16732                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
16733                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
16734                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )  )
16735                                   -- ceil( NVL(hwf.mx_hrs_num
16736                                   --     ,p_old_val)) + 0.001 )
16737                  OR (    p_new_val IS NULL
16738                      AND p_old_val IS NULL));
16739     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
16740     --UNION ALL
16741     CURSOR c2 IS
16742       SELECT   p_ptip_id
16743               ,'Y'
16744               ,hwf.hrs_src_cd
16745               ,hwf.hrs_wkd_det_cd
16746               ,hwf.hrs_wkd_det_rl
16747               ,hwf.rndg_cd
16748               ,hwf.rndg_rl
16749               ,hwf.defined_balance_id
16750               ,hwf.bnfts_bal_id
16751               ,hwf.mn_hrs_num
16752               ,hwf.mx_hrs_num
16753               ,hwf.once_r_cntug_cd
16754               ,hwf.hrs_wkd_calc_rl
16755       FROM     ben_hrs_wkd_in_perd_fctr hwf
16756               --,ben_hrs_wkd_in_perd_rt_f hwr
16757               ,ben_elig_hrs_wkd_prte_f ehw
16758               ,ben_eligy_prfl_f elp
16759               ,ben_vrbl_rt_elig_prfl_f vep
16760               ,ben_vrbl_rt_prfl_f vpf
16761               ,ben_acty_vrbl_rt_f avr
16762               ,ben_acty_base_rt_f abr
16763       WHERE    abr.ptip_id = p_ptip_id
16764       AND      p_effective_date BETWEEN abr.effective_start_date
16765                    AND abr.effective_end_date
16766       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
16767       AND      p_effective_date BETWEEN avr.effective_start_date
16768                    AND avr.effective_end_date
16769       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
16770       AND      p_effective_date BETWEEN vpf.effective_start_date
16771                    AND vpf.effective_end_date
16772 --      AND      vpf.vrbl_rt_prfl_id = ehw.vrbl_rt_prfl_id
16773       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
16774       AND      p_effective_date BETWEEN vep.effective_start_date
16775                    AND vep.effective_end_date
16776       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
16777       AND      p_effective_date BETWEEN elp.effective_start_date
16778                    AND elp.effective_end_date
16779       AND      ehw.eligy_prfl_id = elp.eligy_prfl_id
16780       AND      p_effective_date BETWEEN ehw.effective_start_date
16781                    AND ehw.effective_end_date
16782       AND      ehw.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
16783       AND      (
16784                     (
16785                           p_new_val IS NOT NULL
16786                       AND p_old_val IS NOT NULL
16787                       AND p_new_val >= NVL(hwf.mn_hrs_num
16788                                         ,p_new_val)
16789                       AND p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
16790                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
16791                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
16792                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
16793                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
16794                                    -- ceil( NVL(hwf.mx_hrs_num
16795                                    --     ,p_new_val) + 0.001 ))
16796                  OR (
16797                           p_new_val IS NOT NULL
16798                       AND p_old_val IS NOT NULL
16799                       AND (
16800                                p_new_val < NVL(hwf.mn_hrs_num
16801                                             ,p_new_val)
16802                             OR p_new_val >=  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
16803                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
16804                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
16805                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
16806                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
16807                                   -- ceil( NVL(hwf.mx_hrs_num
16808                                   --            , p_new_val)) + 0.001 )
16809                       AND p_old_val >= NVL(hwf.mn_hrs_num
16810                                         ,p_old_val)
16811                       AND p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
16812                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
16813                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
16814                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
16815                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )  )
16816                                   -- ceil( NVL(hwf.mx_hrs_num
16817                                   --     ,p_old_val)) + 0.001 )
16818                  OR (    p_new_val IS NULL
16819                      AND p_old_val IS NULL));
16820     --
16821     --
16822     l_index          PLS_INTEGER;
16823     l_not_hash_found BOOLEAN;
16824     l_c2notfound       BOOLEAN;
16825   --
16826   BEGIN
16830     -- Steps to do process
16827     --
16828     -- hr_utility.set_location ('Entering '||l_package,10);
16829     --
16831     --
16832     -- 1) Try and get value from cache
16833     -- 2) If can get from cache then copy to output record
16834     -- 3) If can't get from cache do db hit and then
16835     --    copy to cache record and then copy to output record.
16836     --
16837     -- Get hashed index value
16838     --
16839     l_index  := MOD(p_ptip_id
16840                  ,g_hash_key);
16841     --
16842     IF NOT g_cache_ptip_hwf_rt_rec.EXISTS(l_index) THEN
16843       --
16844       -- Lets store the hash value in this index
16845       --
16846       RAISE NO_DATA_FOUND;
16847     --
16848     ELSE
16849       --
16850       -- If it does exist make sure its the right one
16851       --
16852       IF g_cache_ptip_hwf_rt_rec(l_index).id <> p_ptip_id THEN
16853         --
16854         -- Loop through the hash using the jump routine to check further
16855         -- indexes
16856         --
16857         l_not_hash_found  := FALSE;
16858         --
16859         WHILE NOT l_not_hash_found LOOP
16860           --
16861           l_index  := l_index + g_hash_jump;
16862           --
16863           -- Check if the hash index exists, if not we can use it
16864           --
16865           IF NOT g_cache_ptip_hwf_rt_rec.EXISTS(l_index) THEN
16866             --
16867             -- Lets store the hash value in the index
16868             --
16869             RAISE NO_DATA_FOUND;
16870           --
16871           ELSE
16872             --
16873             -- Make sure the index is the correct one
16874             --
16875             IF g_cache_ptip_hwf_rt_rec(l_index).id = p_ptip_id THEN
16876               --
16877               -- We have a match so the hashed value  has been stored before
16878               --
16879               l_not_hash_found  := TRUE;
16880             --
16881             END IF;
16882           --
16883           END IF;
16884         --
16885         END LOOP;
16886       --
16887       END IF;
16888     --
16889     END IF;
16890     --
16891     -- If p_old_val and p_new_val is set this means we are trying to retrieve
16892     -- the correct rate for the calculated value.
16893     -- Previously we just cached the first rate we
16894     -- found since we needed the determination code, the correct age,los code,etc
16895     -- By killing the cache and forcing the value to be removed we cache the
16896     -- correct rate profile for the case we need.
16897     --
16898     IF     p_old_val IS NOT NULL
16899        AND p_new_val IS NOT NULL THEN
16900       --
16901       RAISE NO_DATA_FOUND;
16902     --
16903     END IF;
16904     --
16905     p_rec    := g_cache_ptip_hwf_rt_rec(l_index);
16906   --
16907   -- hr_utility.set_location ('Leaving '||l_package,10);
16908   --
16909   EXCEPTION
16910     --
16911     WHEN NO_DATA_FOUND THEN
16912       --
16913       -- The record has not been cached yet so lets cache it
16914       --
16915       OPEN c1;
16916       --
16917       FETCH c1 INTO g_cache_ptip_hwf_rt_rec(l_index);
16918       -- PERFNEW
16919       IF c1%NOTFOUND THEN
16920          --
16921          l_c2notfound := false;
16922          OPEN c2;
16923          FETCH c2 INTO g_cache_ptip_hwf_rt_rec(l_index);
16924          IF c2%NOTFOUND THEN
16925             --
16926             l_c2notfound := true;
16927             --
16928          END IF;
16929          CLOSE c2;
16930          --
16931       END IF;
16932       -- PERFNEW
16933       IF     p_old_val IS NULL
16934          AND p_new_val IS NULL THEN
16935         --
16936         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
16937           --
16938           if NOT g_cache_ptip_hwf_rt_rec.EXISTS(l_index) then
16939             g_cache_ptip_hwf_rt_rec(l_index).id     := p_ptip_id;
16940             g_cache_ptip_hwf_rt_rec(l_index).exist  := 'N';
16941           end if;
16942         --
16943         END IF;
16944       --
16945       END IF;
16946       --
16947       p_rec  := g_cache_ptip_hwf_rt_rec(l_index);
16948       --
16949       CLOSE c1;
16950   --
16951   END get_hours_ptip_rate;
16952 --
16953   PROCEDURE get_hours_oiplip_rate(
16954     p_oiplip_id         IN            NUMBER
16955    ,p_old_val           IN            NUMBER DEFAULT NULL
16956    ,p_new_val           IN            NUMBER DEFAULT NULL
16957    ,p_business_group_id IN            NUMBER
16958    ,p_effective_date    IN            DATE
16959    ,p_rec               OUT NOCOPY    g_cache_hwf_rec_obj) IS
16960     --
16961     l_package        VARCHAR2(80) := g_package || '.get_hours_oiplip_rate';
16962     l_old_val_1 NUMBER := p_old_val + 1;
16963     l_new_val_1 NUMBER := p_new_val + 1;
16964     --
16965     -- Define Cursor
16966     --
16967     CURSOR c1 IS
16968       SELECT   p_oiplip_id
16969               ,'Y'
16970               ,hwf.hrs_src_cd
16971               ,hwf.hrs_wkd_det_cd
16972               ,hwf.hrs_wkd_det_rl
16973               ,hwf.rndg_cd
16974               ,hwf.rndg_rl
16975               ,hwf.defined_balance_id
16976               ,hwf.bnfts_bal_id
16977               ,hwf.mn_hrs_num
16978               ,hwf.mx_hrs_num
16979               ,hwf.once_r_cntug_cd
16980               ,hwf.hrs_wkd_calc_rl
16981       FROM     ben_hrs_wkd_in_perd_fctr hwf
16982               ,ben_hrs_wkd_in_perd_rt_f hwr
16983               ,ben_vrbl_rt_prfl_f vpf
16984               ,ben_acty_vrbl_rt_f avr
16985               ,ben_acty_base_rt_f abr
16986       WHERE    abr.oiplip_id = p_oiplip_id
16990       AND      p_effective_date BETWEEN avr.effective_start_date
16987       AND      p_effective_date BETWEEN abr.effective_start_date
16988                    AND abr.effective_end_date
16989       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
16991                    AND avr.effective_end_date
16992       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
16993       AND      p_effective_date BETWEEN vpf.effective_start_date
16994                    AND vpf.effective_end_date
16995       AND      vpf.vrbl_rt_prfl_id = hwr.vrbl_rt_prfl_id
16996       AND      p_effective_date BETWEEN hwr.effective_start_date
16997                    AND hwr.effective_end_date
16998       AND      hwr.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
16999       AND      (
17000                     (
17001                           p_new_val IS NOT NULL
17002                       AND p_old_val IS NOT NULL
17003                       AND p_new_val >= NVL(hwf.mn_hrs_num
17004                                         ,p_new_val)
17005                       AND p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
17006                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
17007                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
17008                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
17009                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
17010                                   -- ceil( NVL(hwf.mx_hrs_num
17011                                   --      ,p_new_val) + 0.001 ))
17012                  OR (
17013                           p_new_val IS NOT NULL
17014                       AND p_old_val IS NOT NULL
17015                       AND (
17016                                p_new_val < NVL(hwf.mn_hrs_num
17017                                             ,p_new_val)
17018                             OR p_new_val >=  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
17019                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
17020                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
17021                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
17022                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
17023                                   -- ceil( NVL(hwf.mx_hrs_num
17024                                   --            ,p_new_val)) + 0.001 )
17025                       AND p_old_val >= NVL(hwf.mn_hrs_num
17026                                         ,p_old_val)
17027                       AND p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
17028                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
17029                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
17030                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
17031                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )  )
17032                                   -- ceil( NVL(hwf.mx_hrs_num
17033                                   --     , p_old_val)) + 0.001 )
17034                  OR (    p_new_val IS NULL
17035                      AND p_old_val IS NULL));
17036     -- PERFNEW. SPLIT TO 2 CURSORS C1 and C2.
17037     --UNION ALL
17038     CURSOR c2 IS
17039       SELECT   p_oiplip_id
17040               ,'Y'
17041               ,hwf.hrs_src_cd
17042               ,hwf.hrs_wkd_det_cd
17043               ,hwf.hrs_wkd_det_rl
17044               ,hwf.rndg_cd
17045               ,hwf.rndg_rl
17046               ,hwf.defined_balance_id
17047               ,hwf.bnfts_bal_id
17048               ,hwf.mn_hrs_num
17049               ,hwf.mx_hrs_num
17050               ,hwf.once_r_cntug_cd
17051               ,hwf.hrs_wkd_calc_rl
17052       FROM     ben_hrs_wkd_in_perd_fctr hwf
17053               --,ben_hrs_wkd_in_perd_rt_f hwr
17054               ,ben_elig_hrs_wkd_prte_f ehw
17055               ,ben_eligy_prfl_f elp
17056               ,ben_vrbl_rt_elig_prfl_f vep
17057               ,ben_vrbl_rt_prfl_f vpf
17058               ,ben_acty_vrbl_rt_f avr
17059               ,ben_acty_base_rt_f abr
17060       WHERE    abr.oiplip_id = p_oiplip_id
17061       AND      p_effective_date BETWEEN abr.effective_start_date
17062                    AND abr.effective_end_date
17063       AND      abr.acty_base_rt_id = avr.acty_base_rt_id
17064       AND      p_effective_date BETWEEN avr.effective_start_date
17065                    AND avr.effective_end_date
17066       AND      avr.vrbl_rt_prfl_id = vpf.vrbl_rt_prfl_id
17067       AND      p_effective_date BETWEEN vpf.effective_start_date
17068                    AND vpf.effective_end_date
17069 --      AND      vpf.vrbl_rt_prfl_id = ehw.vrbl_rt_prfl_id
17070       AND      vpf.vrbl_rt_prfl_id = vep.vrbl_rt_prfl_id
17071       AND      p_effective_date BETWEEN vep.effective_start_date
17072                    AND vep.effective_end_date
17073       AND      vep.eligy_prfl_id = elp.eligy_prfl_id
17074       AND      p_effective_date BETWEEN elp.effective_start_date
17075                    AND elp.effective_end_date
17076       AND      ehw.eligy_prfl_id = elp.eligy_prfl_id
17077       AND      p_effective_date BETWEEN ehw.effective_start_date
17078                    AND ehw.effective_end_date
17079       AND      ehw.hrs_wkd_in_perd_fctr_id = hwf.hrs_wkd_in_perd_fctr_id
17080       AND      (
17081                     (
17082                           p_new_val IS NOT NULL
17083                       AND p_old_val IS NOT NULL
17084                       AND p_new_val >= NVL(hwf.mn_hrs_num
17085                                         ,p_new_val)
17086                       AND p_new_val <  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
17087                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
17088                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
17089                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
17090                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
17094                           p_new_val IS NOT NULL
17091                                   -- ceil( NVL(hwf.mx_hrs_num
17092                                   --      ,p_new_val) + 0.001 ))
17093                  OR (
17095                       AND p_old_val IS NOT NULL
17096                       AND (
17097                                p_new_val < NVL(hwf.mn_hrs_num
17098                                             ,p_new_val)
17099                             OR p_new_val >=  decode(nvl(hwf.mx_hrs_num,p_new_val) ,
17100                                     trunc(nvl(hwf.mx_hrs_num,p_new_val))
17101                      ,decode(nvl(hwf.mn_hrs_num,p_new_val), trunc(nvl(hwf.mn_hrs_num,p_new_val)),
17102                       nvl(hwf.mx_hrs_num,p_new_val)+1,nvl(hwf.mx_hrs_num,p_new_val)+0.000000001),
17103                       nvl(hwf.mx_hrs_num,p_new_val)+0.000000001 )  )
17104                                   -- ceil( NVL(hwf.mx_hrs_num
17105                                   --            ,p_new_val)) + 0.001 )
17106                       AND p_old_val >= NVL(hwf.mn_hrs_num
17107                                         ,p_old_val)
17108                       AND p_old_val <  decode(nvl(hwf.mx_hrs_num,p_old_val) ,
17109                                     trunc(nvl(hwf.mx_hrs_num,p_old_val))
17110                      ,decode(nvl(hwf.mn_hrs_num,p_old_val), trunc(nvl(hwf.mn_hrs_num,p_old_val)),
17111                       nvl(hwf.mx_hrs_num,p_old_val)+1,nvl(hwf.mx_hrs_num,p_old_val)+0.000000001),
17112                       nvl(hwf.mx_hrs_num,p_old_val)+0.000000001 )  )
17113                                   -- ceil( NVL(hwf.mx_hrs_num
17114                                   --     , p_old_val)) + 0.001 )
17115                  OR (    p_new_val IS NULL
17116                      AND p_old_val IS NULL));
17117     --
17118     --
17119     l_index          PLS_INTEGER;
17120     l_not_hash_found BOOLEAN;
17121     l_c2notfound       BOOLEAN;
17122   --
17123   BEGIN
17124     --
17125     -- hr_utility.set_location ('Entering '||l_package,10);
17126     --
17127     -- Steps to do process
17128     --
17129     -- 1) Try and get value from cache
17130     -- 2) If can get from cache then copy to output record
17131     -- 3) If can't get from cache do db hit and then
17132     --    copy to cache record and then copy to output record.
17133     --
17134     -- Get hashed index value
17135     --
17136     l_index  := MOD(p_oiplip_id
17137                  ,g_hash_key);
17138     --
17139     IF NOT g_cache_oiplip_hwf_rt_rec.EXISTS(l_index) THEN
17140       --
17141       -- Lets store the hash value in this index
17142       --
17143       RAISE NO_DATA_FOUND;
17144     --
17145     ELSE
17146       --
17147       -- If it does exist make sure its the right one
17148       --
17149       IF g_cache_oiplip_hwf_rt_rec(l_index).id <> p_oiplip_id THEN
17150         --
17151         -- Loop through the hash using the jump routine to check further
17152         -- indexes
17153         --
17154         l_not_hash_found  := FALSE;
17155         --
17156         WHILE NOT l_not_hash_found LOOP
17157           --
17158           l_index  := l_index + g_hash_jump;
17159           --
17160           -- Check if the hash index exists, if not we can use it
17161           --
17162           IF NOT g_cache_oiplip_hwf_rt_rec.EXISTS(l_index) THEN
17163             --
17164             -- Lets store the hash value in the index
17165             --
17166             RAISE NO_DATA_FOUND;
17167           --
17168           ELSE
17169             --
17170             -- Make sure the index is the correct one
17171             --
17172             IF g_cache_oiplip_hwf_rt_rec(l_index).id = p_oiplip_id THEN
17173               --
17174               -- We have a match so the hashed value  has been stored before
17175               --
17176               l_not_hash_found  := TRUE;
17177             --
17178             END IF;
17179           --
17180           END IF;
17181         --
17182         END LOOP;
17183       --
17184       END IF;
17185     --
17186     END IF;
17187     --
17188     -- If p_old_val and p_new_val is set this means we are trying to retrieve
17189     -- the correct rate for the calculated value.
17190     -- Previously we just cached the first rate we
17191     -- found since we needed the determination code, the correct age,los code,etc
17192     -- By killing the cache and forcing the value to be removed we cache the
17193     -- correct rate profile for the case we need.
17194     --
17195     IF     p_old_val IS NOT NULL
17196        AND p_new_val IS NOT NULL THEN
17197       --
17198       RAISE NO_DATA_FOUND;
17199     --
17200     END IF;
17201     --
17202     p_rec    := g_cache_oiplip_hwf_rt_rec(l_index);
17203   --
17204   -- hr_utility.set_location ('Leaving '||l_package,10);
17205   --
17206   EXCEPTION
17207     --
17208     WHEN NO_DATA_FOUND THEN
17209       --
17210       -- The record has not been cached yet so lets cache it
17211       --
17212       OPEN c1;
17213       --
17214       FETCH c1 INTO g_cache_oiplip_hwf_rt_rec(l_index);
17215       -- PERFNEW
17216       IF c1%NOTFOUND THEN
17217          --
17218          l_c2notfound := false;
17219          OPEN c2;
17220          FETCH c2 INTO g_cache_oiplip_hwf_rt_rec(l_index);
17221          IF c2%NOTFOUND THEN
17222             --
17223             l_c2notfound := true;
17224             --
17225          END IF;
17226          CLOSE c2;
17227          --
17228       END IF;
17229       -- PERFNEW
17230       IF     p_old_val IS NULL
17231          AND p_new_val IS NULL THEN
17232         --
17233         IF c1%NOTFOUND and l_c2notfound THEN  -- PERFNEW
17234           --
17235           if NOT g_cache_oiplip_hwf_rt_rec.EXISTS(l_index) then
17239         --
17236             g_cache_oiplip_hwf_rt_rec(l_index).id     := p_oiplip_id;
17237             g_cache_oiplip_hwf_rt_rec(l_index).exist  := 'N';
17238           end if;
17240         END IF;
17241       --
17242       END IF;
17243       --
17244       p_rec  := g_cache_oiplip_hwf_rt_rec(l_index);
17245       --
17246       CLOSE c1;
17247   --
17248   END get_hours_oiplip_rate;
17249 --
17250   PROCEDURE get_hours_rate(
17251     p_pgm_id            IN            NUMBER
17252    ,p_pl_id             IN            NUMBER
17253    ,p_oipl_id           IN            NUMBER
17254    ,p_plip_id           IN            NUMBER
17255    ,p_ptip_id           IN            NUMBER
17256    ,p_oiplip_id         IN            NUMBER
17257    ,p_old_val           IN            NUMBER DEFAULT NULL
17258    ,p_new_val           IN            NUMBER DEFAULT NULL
17259    ,p_business_group_id IN            NUMBER
17260    ,p_effective_date    IN            DATE
17261    ,p_rec               OUT NOCOPY    g_cache_hwf_rec_obj) IS
17262     --
17263     l_package VARCHAR2(80) := g_package || '.get_hours_rate';
17264   --
17265   BEGIN
17266     --
17267     -- hr_utility.set_location ('Entering '||l_package,10);
17268     --
17269     -- Derive which data type we are dealing with
17270     --
17271     IF p_pgm_id IS NOT NULL THEN
17272       --
17273       get_hours_pgm_rate(p_pgm_id=> p_pgm_id
17274        ,p_old_val           => p_old_val
17275        ,p_new_val           => p_new_val
17276        ,p_business_group_id => p_business_group_id
17277        ,p_effective_date    => p_effective_date
17278        ,p_rec               => p_rec);
17279     --
17280     ELSIF p_pl_id IS NOT NULL THEN
17281       --
17282       get_hours_pl_rate(p_pl_id=> p_pl_id
17283        ,p_old_val           => p_old_val
17284        ,p_new_val           => p_new_val
17285        ,p_business_group_id => p_business_group_id
17286        ,p_effective_date    => p_effective_date
17287        ,p_rec               => p_rec);
17288     --
17289     ELSIF p_oipl_id IS NOT NULL THEN
17290       --
17291       get_hours_oipl_rate(p_oipl_id=> p_oipl_id
17292        ,p_old_val           => p_old_val
17293        ,p_new_val           => p_new_val
17294        ,p_business_group_id => p_business_group_id
17295        ,p_effective_date    => p_effective_date
17296        ,p_rec               => p_rec);
17297     --
17298     ELSIF p_plip_id IS NOT NULL THEN
17299       --
17300       get_hours_plip_rate(p_plip_id=> p_plip_id
17301        ,p_old_val           => p_old_val
17302        ,p_new_val           => p_new_val
17303        ,p_business_group_id => p_business_group_id
17304        ,p_effective_date    => p_effective_date
17305        ,p_rec               => p_rec);
17306     --
17307     ELSIF p_ptip_id IS NOT NULL THEN
17308       --
17309       get_hours_ptip_rate(p_ptip_id=> p_ptip_id
17310        ,p_old_val           => p_old_val
17311        ,p_new_val           => p_new_val
17312        ,p_business_group_id => p_business_group_id
17313        ,p_effective_date    => p_effective_date
17314        ,p_rec               => p_rec);
17315     --
17316     ELSIF p_oiplip_id IS NOT NULL THEN
17317       --
17318       get_hours_oiplip_rate(p_oiplip_id=> p_oiplip_id
17319        ,p_old_val           => p_old_val
17320        ,p_new_val           => p_new_val
17321        ,p_business_group_id => p_business_group_id
17322        ,p_effective_date    => p_effective_date
17323        ,p_rec               => p_rec);
17324     --
17325     END IF;
17326   --
17327   -- hr_utility.set_location ('Leaving '||l_package,10);
17328   --
17329   END get_hours_rate;
17330 --
17331   PROCEDURE clear_down_cache IS
17332     --
17333     l_package VARCHAR2(80) := g_package || '.clear_down_cache';
17334   --
17335   BEGIN
17336     --
17337     -- hr_utility.set_location ('Entering '||l_package,10);
17338     --
17339     -- Clear down all caches
17340     --
17341     g_cache_pl_los_el_rec.delete;
17342     g_cache_oipl_los_el_rec.delete;
17343     g_cache_plip_los_el_rec.delete;
17344     g_cache_ptip_los_el_rec.delete;
17345     g_cache_pgm_los_el_rec.delete;
17346     g_cache_pl_los_rt_rec.delete;
17347     g_cache_oipl_los_rt_rec.delete;
17348     g_cache_plip_los_rt_rec.delete;
17349     g_cache_ptip_los_rt_rec.delete;
17350     g_cache_oiplip_los_rt_rec.delete;
17351     g_cache_pgm_los_rt_rec.delete;
17352     g_cache_stated_los_rec.delete;
17353     g_cache_pl_age_el_rec.delete;
17354     g_cache_oipl_age_el_rec.delete;
17355     g_cache_plip_age_el_rec.delete;
17356     g_cache_ptip_age_el_rec.delete;
17357     g_cache_pgm_age_el_rec.delete;
17358     g_cache_pl_age_rt_rec.delete;
17359     g_cache_oipl_age_rt_rec.delete;
17360     g_cache_plip_age_rt_rec.delete;
17361     g_cache_ptip_age_rt_rec.delete;
17362     g_cache_oiplip_age_rt_rec.delete;
17363     g_cache_pgm_age_rt_rec.delete;
17364     g_cache_stated_age_rec.delete;
17365     g_cache_pl_clf_el_rec.delete;
17366     g_cache_oipl_clf_el_rec.delete;
17367     g_cache_plip_clf_el_rec.delete;
17368     g_cache_ptip_clf_el_rec.delete;
17369     g_cache_pgm_clf_el_rec.delete;
17370     g_cache_pl_clf_rt_rec.delete;
17371     g_cache_oipl_clf_rt_rec.delete;
17372     g_cache_plip_clf_rt_rec.delete;
17373     g_cache_oiplip_clf_rt_rec.delete;
17374     g_cache_ptip_clf_rt_rec.delete;
17375     g_cache_pgm_clf_rt_rec.delete;
17376     g_cache_pl_cla_el_rec.delete;
17377     g_cache_oipl_cla_el_rec.delete;
17378     g_cache_plip_cla_el_rec.delete;
17379     g_cache_ptip_cla_el_rec.delete;
17380     g_cache_pgm_cla_el_rec.delete;
17381     g_cache_pl_cla_rt_rec.delete;
17382     g_cache_oipl_cla_rt_rec.delete;
17383     g_cache_plip_cla_rt_rec.delete;
17387     g_cache_pl_pff_el_rec.delete;
17384     g_cache_oiplip_cla_rt_rec.delete;
17385     g_cache_ptip_cla_rt_rec.delete;
17386     g_cache_pgm_cla_rt_rec.delete;
17388     g_cache_oipl_pff_el_rec.delete;
17389     g_cache_plip_pff_el_rec.delete;
17390     g_cache_ptip_pff_el_rec.delete;
17391     g_cache_pgm_pff_el_rec.delete;
17392     g_cache_pl_pff_rt_rec.delete;
17393     g_cache_oipl_pff_rt_rec.delete;
17394     g_cache_plip_pff_rt_rec.delete;
17395     g_cache_oiplip_pff_rt_rec.delete;
17396     g_cache_ptip_pff_rt_rec.delete;
17397     g_cache_pgm_pff_rt_rec.delete;
17398     g_cache_pl_hwf_el_rec.delete;
17399     g_cache_oipl_hwf_el_rec.delete;
17400     g_cache_plip_hwf_el_rec.delete;
17401     g_cache_ptip_hwf_el_rec.delete;
17402     g_cache_pgm_hwf_el_rec.delete;
17403     g_cache_pl_hwf_rt_rec.delete;
17404     g_cache_oipl_hwf_rt_rec.delete;
17405     g_cache_plip_hwf_rt_rec.delete;
17406     g_cache_oiplip_hwf_rt_rec.delete;
17407     g_cache_ptip_hwf_rt_rec.delete;
17408     g_cache_pgm_hwf_rt_rec.delete;
17409   --
17410   -- hr_utility.set_location ('Leaving '||l_package,10);
17411   --
17412   END clear_down_cache;
17413 --
17414 END ben_derive_part_and_rate_cache;