DBA Data[Home] [Help]

PACKAGE BODY: APPS.PV_ENRQ_BINS_PVT

Source


1 package body Pv_Enrq_Bins_PVT as
2    /* $Header: pvxvbinb.pls 120.5 2006/05/11 11:54:47 dgottlie ship $*/
3    --  Start of Comments
4    --
5    -- NAME
6    --   Pv_Enrq_Bins_PVT
7    --
8    -- PURPOSE
9    --   This package contains  API's for displaying data in program enrollment bins.
10       --
11    -- HISTORY
12    --   11/12/2002        pukken          CREATION
13    --   08/01/2003        pukken  changed the API for 11.15.10 changes
14    --   18-FEB-2004       pukken  fix for bug 3443733
15    --   15-jun-2004       pukken  fix for bug 3695436
16    --   04-MAR-2005       pukken to develop ER 4208712
17    --   22-NOV-2005       ktsao   fix for bug 4749395
18    --   18-JAN-2006       ktsao   fix for bug 4948563
19    --   28-MAR-2006       ktsao   fix for bug 5116650
20    -- NOTE        :
21    -- Copyright (c) 2002 Oracle Corporation Redwood Shores, California, USA
22    --                          All rights reserved.
23 
24    g_pkg_name    CONSTANT VARCHAR2 (30) := 'Pv_Enrq_Bins_PVT';
25    g_file_name   CONSTANT VARCHAR2 (15) := 'pvxvbinb.pls';
26    g_program_mode   CONSTANT VARCHAR2 (15) := 'BINS';
27 
28    PV_DEBUG_HIGH_ON CONSTANT boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_HIGH);
29    PV_DEBUG_LOW_ON CONSTANT boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW);
30    PV_DEBUG_MEDIUM_ON CONSTANT boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_MEDIUM);
31 
32 
33 FUNCTION getInviteHeaderId(p_partner_id in number,p_program_id in NUMBER,p_invite_type_code in VARCHAR2)
34 RETURN NUMBER is
35    l_invite_header_id NUMBER:=null ;
36 
37    CURSOR rec_cur(p_ptr_id number,p_prgm_id number,p_inv_type_code VARCHAR2) IS
38    SELECT max(invite_header_id)
39    FROM   PV_PG_INVITE_HEADERS_b
40    WHERE  partner_id=p_ptr_id
41    AND    nvl(invite_end_date,sysdate+1)>sysdate
42    AND    invite_for_program_id =p_prgm_id
43    AND    invite_type_code =p_inv_type_code;
44 
45 
46 
47 BEGIN
48    OPEN rec_cur(p_partner_id,p_program_id,p_invite_type_code);
49       FETCH rec_cur into l_invite_header_id;
50    CLOSE rec_cur;
51    RETURN  l_invite_header_id;
52 
53 EXCEPTION
54 
55    WHEN OTHERS THEN
56       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
57 END getInviteHeaderId;
58 
59 
60 --------------------------------------------------------------------------
61    -- FUNCTION
62    --   isGlobalEnrolled
63    --
64    -- PURPOSE
65    --   To check whether the global partner of the given subsidiary partner has active or future membership
66    --   In a given program or in the upgrade path of the given program
67    -- IN
68    --   p_program_id       NUMBER
69    --   p_subs_partner_id  NUMBER  this should be subsidiary partner Id
70    -- OUT
71    --     is a boolean value
72 
73 FUNCTION isGlobalEnrolled(p_program_id in NUMBER, p_subs_partner_id in number)
74 RETURN BOOLEAN IS
75 
76    CURSOR isenroll_csr(p_prgm_id NUMBER,p_global_ptr_id NUMBER) IS
77    Select 'X' from dual
78    WHERE EXISTS
79    (
80       select membership_id from pv_pg_memberships
81       where membership_status_code in ('ACTIVE','FUTURE')
82       AND  partner_id=p_global_ptr_id
83       AND program_id IN
84       (
85          select CHANGE_to_program_id from pv_pg_enrl_change_rules
86          where change_direction_code='UPGRADE'
87          AND  ACTIVE_FLAG='Y'
88          START with  change_from_program_id=p_prgm_id
89          CONNECT by CHANGE_FROM_PROGRAM_id=PRIOR CHANGE_to_program_id
90          and CHANGE_TO_PROGRAM_ID<>PRIOR CHANGE_FROM_PROGRAM_Id
91          union select p_prgm_id FROM DUAL
92        )
93    );
94 
95 
96    CURSOR global_id_csr(p_sub_ptr_id NUMBER) IS
97    SELECT   glob_prof.partner_id
98    FROM     pv_partner_profiles subs_prof
99            ,pv_partner_profiles glob_prof
100            ,hz_relationships rel
101    WHERE  rel.subject_id=subs_prof.partner_party_id
102    AND    rel.relationship_code = 'SUBSIDIARY_OF'
103    AND    rel.relationship_type = 'PARTNER_HIERARCHY'
104    AND    rel.status = 'A'
105    AND    NVL(rel.start_date, SYSDATE) <= SYSDATE
106    AND    NVL(rel.end_date, SYSDATE) >= SYSDATE
107    AND    subs_prof.partner_id=p_sub_ptr_id
108    AND    REL.OBJECT_ID=glob_prof.partner_party_id;
109 
110    l_global_ptr_id NUMBER;
111    l_global_enrolled VARCHAR2(1);
112    is_global_enrolled boolean:=false;
113 
114 BEGIN
115 
116 
117    OPEN global_id_csr(p_subs_partner_id);
118       FETCH global_id_csr INTO l_global_ptr_id;
119    CLOSE global_id_csr;
120 
121    IF  l_global_ptr_id IS NOT NULL THEN
122 
123       OPEN isenroll_csr(p_program_id,l_global_ptr_id);
124          FETCH isenroll_csr INTO l_global_enrolled;
125       CLOSE isenroll_csr;
126 
127       IF l_global_enrolled='X' THEN
128 
129          is_global_enrolled:=true;
130       END IF;
131    END IF;
132    RETURN is_global_enrolled;
133 
134 EXCEPTION
135    WHEN NO_DATA_FOUND THEN
136       RETURN FALSE;
137    WHEN OTHERS THEN
138       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
139 END isGlobalEnrolled;
140 
141 PROCEDURE new_programs
142 (
143    p_api_version_number          IN   NUMBER
144    ,p_init_msg_list              IN   VARCHAR2     := FND_API.G_FALSE
145    ,p_commit                     IN   VARCHAR2     := FND_API.G_FALSE
146    ,p_validation_level           IN   NUMBER       := FND_API.G_VALID_LEVEL_FULL
147    ,p_partner_id                 IN   NUMBER
148    ,p_member_type                IN   VARCHAR2
149    ,p_isprereq_eval              IN   VARCHAR2     :='Y'
150    ,x_enrq_param_cur             OUT  NOCOPY enrq_param_ref
151    ,x_return_status              OUT  NOCOPY VARCHAR2
152    ,x_msg_count                  OUT  NOCOPY NUMBER
153    ,x_msg_data                   OUT  NOCOPY VARCHAR2
154 ) IS
155 
156 
157    CURSOR prgm_csr(ptnr_id IN NUMBER) IS
158    SELECT pvppb.program_id program_id
159           ,pvppb.program_name program_name
160           ,pvppb.citem_version_id citem_version_id
161           ,pvppb.global_mmbr_reqd_flag global_mmbr_reqd_flag
162           ,pvppb.prereq_process_rule_id prereq_process_rule_id
163           ,pvppb.no_fee_flag no_fee_flag
164           ,pvppb.vad_invite_allow_flag vad_invite_allow_flag
165    FROM   pv_partner_program_type_b pvpptb
166           ,pv_partner_program_vl pvppb
167    WHERE  pvppb.program_status_code = 'ACTIVE'
168    AND    pvppb.program_level_code ='MEMBERSHIP'
169    AND    pvppb.enabled_flag = 'Y'
170    AND    nvl(pvppb.allow_enrl_until_date, sysdate) > sysdate-1
171    AND    pvppb.program_type_id = pvpptb.program_type_ID
172    AND    pvpptb.ACTIVE_FLAG = 'Y'
173    AND    pvpptb.enabled_flag = 'Y'
174    -- AND    inv.invite_type_code(+)='INVITE'
175    AND    EXISTS
176           (
177              SELECT 'X' FROM pv_program_partner_types pvppt
178              WHERE pvppt.partner_type IN
179              (
180                 SELECT attr_value
181                 FROM   pv_enty_attr_values pveav
182                 WHERE  pveav.enabled_flag = 'Y'
183                 AND pveav.latest_flag = 'Y'
184                 AND pveav.entity = 'PARTNER'
185                 AND pveav.entity_id =  ptnr_id
186                 AND pveav.attribute_id = 3
187              )
188 	     AND    pvpptb.program_type_id = pvppt.program_type_id
189           )
190    AND    pvppb.program_id NOT IN
191           (
192              SELECT rules.change_to_program_id
193              FROM   pv_pg_enrl_change_rules rules
194              WHERE  change_direction_code = 'UPGRADE'
195              AND    effective_from_date <= sysdate
196              AND    nvl(effective_to_date, sysdate) >= sysdate
197              AND    active_flag = 'Y'
198           )
199     /* AND   EXISTS -- check for pre-populated cache for pre-req evaluation
200         ( SELECT 1
201           FROM pv_pg_elig_programs elig
202           WHERE elig.program_id = pvppb.program_id
203           AND elig.partner_id = ptnr_id
204         ) */
205    	;
206 
207 
208    CURSOR enrl_csr(ptr_id NUMBER ,prgm_id NUMBER) IS
209    SELECT enrl_request_id,request_status_code,enrollment_type_code
210    FROM   pv_pg_enrl_requests
211    WHERE  enrl_request_id=
212          (
213             SELECT max(enrl_request_id)
214             FROM   pv_pg_enrl_requests
215             WHERE  partner_id=ptr_id
216             AND    program_id=prgm_id
217          );
218 
219    CURSOR memb_csr(enrl_id NUMBER) IS
220    SELECT  membership_id,membership_status_code
221    FROM    pv_pg_memberships
222    WHERE   enrl_request_id=enrl_id;
223 
224    CURSOR prgm_wo_prereq_csr(ptnr_id IN NUMBER) IS
225    SELECT pvppb.program_id program_id
226          ,pvppb.global_mmbr_reqd_flag global_mmbr_reqd_flag
227          ,pvppb.prereq_process_rule_id prereq_process_rule_id
228          ,pvppb.no_fee_flag no_fee_flag
229          ,pvppb.vad_invite_allow_flag vad_invite_allow_flag
230    FROM   pv_partner_program_type_b pvpptb ,pv_partner_program_vl pvppb
231    WHERE  pvppb.program_status_code = 'ACTIVE'
232    AND    pvppb.program_level_code ='MEMBERSHIP'
233    AND    pvppb.enabled_flag = 'Y'
234    AND    nvl(pvppb.allow_enrl_until_date, sysdate) > sysdate-1
235    AND    pvppb.program_type_id = pvpptb.program_type_ID
236    AND    pvpptb.ACTIVE_FLAG = 'Y'
237    AND    pvpptb.enabled_flag = 'Y'
238    AND    EXISTS
239           (
240              SELECT 'X' FROM pv_program_partner_types pvppt
241              WHERE pvppt.partner_type IN
242              (
243                 SELECT attr_value
244                 FROM   pv_enty_attr_values pveav
245                 WHERE  pveav.enabled_flag = 'Y'
246                 AND pveav.latest_flag = 'Y'
247                 AND pveav.entity = 'PARTNER'
248                 AND pveav.entity_id = ptnr_id
249                 AND pveav.attribute_id = 3
250              )
251 	     AND    pvpptb.program_type_id = pvppt.program_type_id
252           )
253    AND    pvppb.program_id NOT IN
254           (
255              SELECT rules.change_to_program_id
256              FROM   pv_pg_enrl_change_rules rules
257              WHERE  change_direction_code = 'UPGRADE'
258              AND    effective_from_date <= sysdate
259              AND    nvl(effective_to_date, sysdate) >= sysdate
260              AND    active_flag = 'Y'
261           );
262 
263 
264    l_enrq_param_tbl  PV_ENRL_REQ_PARAM_TBL := PV_ENRL_REQ_PARAM_TBL ();
265    l_api_name           CONSTANT VARCHAR2(30) := 'new_programs';
266    l_api_version_number  CONSTANT NUMBER       := 1.0;
267    l_request_status_code  VARCHAR2(30):=null;
268    l_membership_status_code VARCHAR2(30);
269    l_enrl_request_id NUMBER;
270    l_membership_id NUMBER;
271    l_enrollment_type_code VARCHAR2(30);
272    l_user_id NUMBER;
273    counter NUMBER:=1;
274    l_eligible_flag boolean:=true;
275    TYPE csr_type IS REF CURSOR;
276 
277    prereq_csr csr_type ;
278    l_query_str1  VARCHAR2(1200);
279 
280    l_cache      VARCHAR2(1);
281 BEGIN
282    --Standard call to check for call compatibility.
283    IF NOT FND_API.Compatible_API_Call ( l_api_version_number
284                                        ,p_api_version_number
285                                        ,l_api_name
286                                       ,G_PKG_NAME
287                                      )
288 
289    THEN
290       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
291    END IF;
292 
293    -- Initialize message list if p_init_msg_list is set to TRUE.
294    IF FND_API.to_Boolean( p_init_msg_list )
295    THEN
296       FND_MSG_PUB.initialize;
297    END IF;
298 
299    -- Debug Message
300    IF (PV_DEBUG_HIGH_ON) THEN
301       PVX_UTILITY_PVT.debug_message('Private API: ' || l_api_name || 'start');
302    END IF;
303    -- Initialize API return status to SUCCESS
304 
305    x_return_status := FND_API.G_RET_STS_SUCCESS;
306    --l_query_str1:= 'SELECT ''X''  FROM pv_pg_elig_programs elig  WHERE elig.partner_id=' || to_char(p_partner_id) || 'AND elig.program_id =';
307    l_query_str1:= 'SELECT ''X''  FROM pv_pg_elig_programs elig  WHERE elig.partner_id=:1' || 'AND elig.program_id =:2';
308 
309    IF p_isprereq_eval='Y' THEN -- This check is to query the pre_req cache data as well
310       FOR rec_prgm in prgm_csr(p_partner_id) LOOP
311          l_request_status_code:=null;
312          l_enrl_request_id:=null;
313          l_enrollment_type_code:=null;
314          l_membership_status_code:=null;
315          l_eligible_flag:=true;
316          l_cache:=null;
317          --prereq evalution being moved as a dynamic query becase of theissue
318          --with this package getting invalidated after running the cincrurrent ptogram to refresh the cache.
319 
320           OPEN prereq_csr FOR l_query_str1 USING p_partner_id,rec_prgm.program_id;
321             FETCH prereq_csr INTO l_cache;
322          CLOSE prereq_csr;
323 
324          IF l_cache='X' THEN
325 
326             IF p_member_type='SUBSIDIARY' THEN
327                IF rec_prgm.global_mmbr_reqd_flag='Y' THEN
328                   l_eligible_flag:=isGlobalEnrolled(rec_prgm.program_id,p_partner_id);
329                END IF;
330             END If;
331 
332             IF l_eligible_flag=true THEN
333                OPEN enrl_csr(p_partner_id,rec_prgm.program_id);
334                   FETCH enrl_csr INTO l_enrl_request_id,l_request_status_code,l_enrollment_type_code;
335                CLOSE enrl_csr;
336 
337                IF l_request_status_code IS NULL  THEN
338                    --populate the table
339                   -- ----dbms_output.PUT_LINE('inside enrollment null');
340                   l_enrq_param_tbl.EXTEND(1);
341                   ----dbms_output.PUT_LINE('after extend ');
342                   l_enrq_param_tbl(counter) := PV_ENRL_REQ_PARAM
343                                               (
344                                                  rec_prgm.program_id
345                                                  ,rec_prgm.program_name
346                                                  ,rec_prgm.citem_version_id
347                                                  , getInviteHeaderId(p_partner_id ,rec_prgm.program_id , 'INVITE')
348                                                 -- ,rec_prgm.invite_header_id
349                                                  ,null
350                                                  ,null
351                                                  ,null -- enrollment request id
352                                                  ,null -- enrollment type  code
353                                                  ,null --  enrollment custome set up id
354                                                  ,rec_prgm.prereq_process_rule_id
355                                                  ,rec_prgm.no_fee_flag
356                                                  ,rec_prgm.vad_invite_allow_flag
357                                               );
358 
359 
360                   counter:=counter+1;
361                -- Fixed for bug 4749395
362                ELSIF (  l_request_status_code ='REJECTED' OR l_request_status_code='CANCELLED' ) and l_enrollment_type_code IN ('NEW') THEN
363                   l_enrq_param_tbl.EXTEND(1);
364                   ----dbms_output.PUT_LINE('after extend ');
365                   l_enrq_param_tbl(counter) := PV_ENRL_REQ_PARAM
366                                               (
370                                                  , getInviteHeaderId(p_partner_id ,rec_prgm.program_id , 'INVITE')
367                                                  rec_prgm.program_id
368                                                  ,rec_prgm.program_name
369                                                  ,rec_prgm.citem_version_id
371                                                  --,rec_prgm.invite_header_id
372                                                  ,null
373                                                  ,null
374                                                  ,null -- enrollment request id
375                                                  ,null -- enrollment type  code
376                                                  ,null --  enrollment custome set up id
377                                                  ,rec_prgm.prereq_process_rule_id
378                                                  ,rec_prgm.no_fee_flag
379                                                  ,rec_prgm.vad_invite_allow_flag
380                                               );
381 
382                   counter:=counter+1;
383 
384                ELSIF   l_request_status_code ='APPROVED' AND l_enrollment_type_code IN ('NEW','RENEW','UPGRADE') THEN
385                   OPEN memb_csr(l_enrl_request_id);
386                      FETCH memb_csr INTO l_membership_id,l_membership_status_code;
387                   CLOSE memb_csr;
388                   IF l_membership_status_code='TERMINATED' THEN
389                      l_enrq_param_tbl.EXTEND(1);
390                      l_enrq_param_tbl(counter) := PV_ENRL_REQ_PARAM
391                                                  (
392                                                       rec_prgm.program_id
393                                                       ,rec_prgm.program_name
394                                                       ,rec_prgm.citem_version_id
395                                                       , getInviteHeaderId(p_partner_id ,rec_prgm.program_id , 'INVITE')
396                                                       --,rec_prgm.invite_header_id
397                                                       ,to_char(l_membership_id)
398                                                       ,null
399                                                       ,null -- enrollment request id
400                                                       ,null -- enrollment type  code
401                                                       ,null --  enrollment custome set up id
402                                                       ,rec_prgm.prereq_process_rule_id
403                                                       ,rec_prgm.no_fee_flag
404                                                       ,rec_prgm.vad_invite_allow_flag
405                                                  );
406 
407                      counter:=counter+1;
408                   END IF;
409                END IF;
410             END IF;
411          END IF; -- end of if , for pre-req evaluation..
412       END LOOP;
413    ELSIF p_isprereq_eval='N' THEN
414       /** --this block will get all the programs that the partner is eligible to join without going
415       -- against the prereq tables. This would be only called incase of invite flow where
416       -- a new partner is created and wants to invite the partner into a program.
417       -- At this time, the list of new programs would be given out from this block
418       -- and the prereq evaluation would be done for the list of programs returned by this block
419       */
420       FOR rec_prgm in prgm_wo_prereq_csr(p_partner_id) LOOP
421          l_eligible_flag:=true;
422          IF p_member_type='SUBSIDIARY' THEN
423             IF rec_prgm.global_mmbr_reqd_flag='Y' THEN
424                l_eligible_flag:=isGlobalEnrolled(rec_prgm.program_id,p_partner_id);
425             END IF;
426          END IF;
427          IF l_eligible_flag=true THEN
428             l_enrq_param_tbl.EXTEND(1);
429             l_enrq_param_tbl(counter) := PV_ENRL_REQ_PARAM (
430                                                              rec_prgm.program_id
431                                                              ,null
432                                                              ,null
433                                                              ,null
434                                                              ,null
435                                                              ,null
436                                                              ,null -- enrollment request id
437                                                              ,null -- enrollment type  code
438                                                              ,null --  enrollment custome set up id
439                                                              ,rec_prgm.prereq_process_rule_id
440                                                              ,rec_prgm.no_fee_flag
441                                                              ,rec_prgm.vad_invite_allow_flag
442                                                           );
443 
444             counter:=counter+1;
445          END IF;
446       END LOOP;
447    END IF;
448 
449    ----dbms_output.PUT_LINE('before for looop ');
450 
451    --We'll query l_enrq_param_tbl  once all the programs related parameters are populated in l_enrq_param_tbl.
452 
453    OPEN x_enrq_param_cur  FOR  SELECT * FROM TABLE( CAST (l_enrq_param_tbl  AS PV_ENRL_REQ_PARAM_TBL)) order by upper(programname) asc;
454 
455    -- Check for commit
456    IF FND_API.to_boolean(p_commit) THEN
457       COMMIT;
458    END IF;
462       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
459 
460 EXCEPTION
461    WHEN  FND_API.G_EXC_UNEXPECTED_ERROR THEN
463       -- Standard call to get message count and if count=1, get the message
464       FND_MSG_PUB.Count_And_Get (
465             p_encoded => FND_API.G_FALSE,
466             p_count => x_msg_count,
467             p_data  => x_msg_data
468       );
469 
470    WHEN OTHERS THEN
471       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
472       IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
473       THEN
474          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
475       END IF;
476       -- Standard call to get message count and if count=1, get the message
477       FND_MSG_PUB.Count_And_Get (
478             p_encoded => FND_API.G_FALSE,
479             p_count => x_msg_count,
480             p_data  => x_msg_data
481       );
482 END new_programs;
483 
484 
485 PROCEDURE renewable_programs
486 (
487    p_api_version_number          IN   NUMBER
488    ,p_init_msg_list              IN   VARCHAR2     := FND_API.G_FALSE
489    ,p_commit                     IN   VARCHAR2     := FND_API.G_FALSE
490    ,p_validation_level           IN   NUMBER       := FND_API.G_VALID_LEVEL_FULL
491    ,p_partner_id                 IN   NUMBER
492    ,p_member_type                IN   VARCHAR2
493    ,p_isprereq_eval              IN   VARCHAR2     :='Y'
494    ,x_enrq_param_cur             OUT  NOCOPY enrq_param_ref
495    ,x_return_status              OUT  NOCOPY VARCHAR2
496    ,x_msg_count                  OUT  NOCOPY NUMBER
497    ,x_msg_data                   OUT  NOCOPY VARCHAR2
498 ) IS
499 
500    CURSOR prgm_csr1(ptr_id IN NUMBER) IS
501    SELECT pvppb.program_id program_id
502           ,pvppb.program_name program_name
503           ,pvppb.citem_version_id citem_version_id
504           ,pvppb.global_mmbr_reqd_flag global_mmbr_reqd_flag
505           ,pvppb.prereq_process_rule_id prereq_process_rule_id
506           ,pvppb.no_fee_flag no_fee_flag
507           ,pvppb.vad_invite_allow_flag vad_invite_allow_flag
508           ,memb.membership_id membership_id
509           ,memb.membership_status_code membership_status_code
510           ,memb.original_end_date original_end_date
511          -- ,inv.invite_header_id invite_header_id
512    FROM   pv_partner_program_type_b pvpptb
513           ,pv_partner_program_vl pvppb
514           ,pv_pg_memberships  memb
515          -- ,pv_pg_invite_headers_b inv
516    WHERE  pvppb.program_status_code = 'ACTIVE'
517    AND    pvppb.program_level_code ='MEMBERSHIP'
518    AND    pvppb.enabled_flag = 'Y'
519    AND    nvl(pvppb.allow_enrl_until_date, sysdate) > sysdate-1
520    AND    pvppb.program_type_id = pvpptb.program_type_ID
521    AND    pvpptb.ACTIVE_FLAG = 'Y'
522    AND    pvpptb.enabled_flag = 'Y'
523    --AND    inv.partner_id (+) =  ptr_id
524    --AND    inv.invite_for_program_id (+) = pvppb.program_id
525   -- AND    NVL(inv.invite_end_date, sysdate+1) > sysdate
526    --AND    inv.invite_type_code(+)='INVITE'
527    AND    EXISTS
528           (   SELECT 'X' FROM pv_program_partner_types pvppt
529               WHERE pvppt.partner_type IN
530               (
531                  SELECT attr_value
532                  FROM   pv_enty_attr_values pveav
533                  WHERE  pveav.enabled_flag = 'Y'
534                  AND pveav.latest_flag = 'Y'
535                  AND pveav.entity = 'PARTNER'
536                  AND pveav.entity_id = ptr_id
537                  AND pveav.attribute_id = 3
538               )
539    	   AND    pvpptb.program_type_id = pvppt.program_type_id
540           )
541    AND    pvppb.program_id =memb.program_id
542    AND    memb.membership_id =
543           (   SELECT max(membership_id)
544               FROM   PV_PG_MEMBERSHIPS
545               WHERE  program_id=memb.program_id
546               AND    partner_id=ptr_id
547               AND    MEMBERSHIP_STATUS_CODE IN ('ACTIVE','EXPIRED')
548 
549           )
550    /*AND EXISTS -- check for pre-populated cache for pre-req evaluation
551         ( SELECT 1
552           FROM pv_pg_elig_programs elig
553           WHERE elig.program_id = pvppb.program_id
554           AND elig.partner_id = ptr_id
555         )*/
556         ;
557 
558    CURSOR notify_rule_csr(program_id NUMBER) IS
559    SELECT  decode(send_notif_before_unit, 'PV_MONTHS',add_months(sysdate,send_notif_before_value)
560                                           ,'PV_WEEKS', sysdate+ send_notif_before_value*7
561    		   		       ,'PV_DAYS', sysdate+send_notif_before_value,null) cdate
562 
563    FROM  pv_ge_notif_rules_b
564    WHERE arc_notif_for_entity_code = 'PRGM'
565    AND notif_for_entity_id = program_id
566    AND notif_type_code = 'PG_MEM_EXP'
567    AND active_flag = 'Y';
568 
569    CURSOR enrl_csr(ptr_id NUMBER ,prgm_id NUMBER) IS
570    SELECT enrl_request_id,request_status_code ,enrollment_type_code
571    FROM   pv_pg_enrl_requests
572    WHERE  enrl_request_id=
573          (
574              SELECT max(enrl_request_id)
575              FROM   pv_pg_enrl_requests
576              WHERE	 partner_id=ptr_id
577              AND    program_id=prgm_id
578              AND    enrollment_type_code='RENEW'
579          );
580 
581 
582    CURSOR upgrade_rule_csr(prgm_id NUMBER,ptr_id NUMBER) IS
583    SELECT  'X'
584               FROM   pv_pg_enrl_change_rules rules
588               AND    active_flag = 'Y'
585               WHERE  change_direction_code = 'UPGRADE'
586               AND    effective_from_date <= sysdate
587               AND    nvl(effective_to_date, sysdate) >= sysdate
589               AND    change_from_program_id=prgm_id
590               AND
591               EXISTS
592               (   SELECT enrl_request_id
593                   FROM   pv_pg_enrl_requests
594                   WHERE  partner_id=ptr_id
595                   AND    request_status_code IN ('AWAITING_APPROVAL','APPROVED','INCOMPLETE')
596                   AND    program_id=rules.change_to_program_id
597                );
598 
599    CURSOR memb_csr(enrl_id NUMBER) IS
600    SELECT  membership_status_code
601    FROM    pv_pg_memberships
602    WHERE   enrl_request_id=enrl_id;
603 
604    l_enrq_param_tbl  PV_ENRL_REQ_PARAM_TBL := PV_ENRL_REQ_PARAM_TBL ();
605    l_api_name           CONSTANT VARCHAR2(30) := 'renewable_programs';
606    l_api_version_number  CONSTANT NUMBER       := 1.0;
607    l_request_status_code  VARCHAR2(30);
608    l_membership_status_code VARCHAR2(30);
609    l_enrl_request_id NUMBER;
610    l_membership_id NUMBER;
611    counter NUMBER:=1;
612    --l_flag varchar2(1):='Y';
613    l_upgrade_exists varchar2(1):=null;
614    l_cdate DATE:=null;
615    l_enrollment_type_code VARCHAR2(30);
616    l_user_id NUMBER;
617    l_eligible_flag boolean:=true;
618    isValid  boolean:=false;
619    TYPE csr_type IS REF CURSOR;
620    prereq_csr csr_type ;
621    l_query_str1  VARCHAR2(1200);
622 
623    l_cache      VARCHAR2(1);
624 
625 BEGIN
626 
627    --Standard call to check for call compatibility.
628    IF NOT FND_API.Compatible_API_Call ( l_api_version_number
629                                        ,p_api_version_number
630                                        ,l_api_name
631                                       ,G_PKG_NAME
632                                      )
633 
634    THEN
635       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
636    END IF;
637 
638    -- Initialize message list if p_init_msg_list is set to TRUE.
639    IF FND_API.to_Boolean( p_init_msg_list )
640    THEN
641       FND_MSG_PUB.initialize;
642    END IF;
643 
644    -- Debug Message
645    IF (PV_DEBUG_HIGH_ON) THEN
646       PVX_UTILITY_PVT.debug_message('Private API: ' || l_api_name || 'start');
647    END IF;
648    -- Initialize API return status to SUCCESS
649    x_return_status := FND_API.G_RET_STS_SUCCESS;
650    --l_query_str1:= 'SELECT ''X''  FROM pv_pg_elig_programs elig  WHERE elig.partner_id=' || to_char(p_partner_id) || 'AND elig.program_id =';
651    l_query_str1:= 'SELECT ''X''  FROM pv_pg_elig_programs elig  WHERE elig.partner_id=:1' || 'AND elig.program_id =:2';
652    FOR rec_p in prgm_csr1(p_partner_id) LOOP
653       l_eligible_flag:=true;
654       l_cdate:=null ;
655       l_upgrade_exists:=null;
656       l_request_status_code:=null;
657       isValid :=false;
658       l_cache:=null;
659 
660 
661       OPEN prereq_csr FOR l_query_str1 USING p_partner_id,rec_p.program_id;
662          FETCH prereq_csr INTO l_cache;
663       CLOSE prereq_csr;
664 
665       IF l_cache='X' THEN
666 
667          --this if clause is to check if the partner is eligible for early renewal
668          IF rec_p.membership_status_code='ACTIVE' THEN
669             OPEN notify_rule_csr(rec_p.program_id);
670                FETCH notify_rule_csr INTO l_cdate;
671             CLOSE notify_rule_csr;
672             IF  l_cdate is not null  THEN
673                IF rec_p.original_end_date>l_cdate THEN
674                   l_eligible_flag:=false;
675                 ELSE
676                   l_eligible_flag:=true;
677                END IF;
678             ELSE
679                l_eligible_flag:=false;
680             END IF;
681          END IF;
682 
683          --if the member type is subsidiary,check whether global has enrolled
684          IF p_member_type='SUBSIDIARY' AND rec_p.membership_status_code='EXPIRED' AND rec_p.global_mmbr_reqd_flag='Y' THEN
685             l_eligible_flag:=isGlobalEnrolled(rec_p.program_id,p_partner_id);
686          END IF;
687 
688          IF l_eligible_flag=true THEN
689             OPEN enrl_csr(p_partner_id,rec_p.program_id);
690                FETCH enrl_csr INTO l_enrl_request_id,l_request_status_code,l_enrollment_type_code;
691             CLOSE enrl_csr;
692             IF l_request_status_code IS NULL OR l_request_status_code IN ( 'REJECTED','CANCELLED') THEN
693 
694 
695                --check whether there is an upgrade request from this program to some other program
696                OPEN upgrade_rule_csr(rec_p.program_id,p_partner_id);
697                   FETCH upgrade_rule_csr INTO l_upgrade_exists;
698                CLOSE upgrade_rule_csr;
699 
700                IF l_upgrade_exists IS  NULL THEN
701                   isValid:=true;
702 
703                END IF;
704             ELSIF l_request_status_code='APPROVED' THEN
705                OPEN memb_csr(l_enrl_request_id);
706                   FETCH memb_csr INTO l_membership_status_code;
707                CLOSE memb_csr;
708                IF l_membership_status_code IN ( 'EXPIRED', 'DOWNGRADED' ) THEN
709                   isValid:=true;
710                END IF;
711             END IF;
712             IF isValid=true THEN
713                l_enrq_param_tbl.EXTEND(1);
717                                                                ,rec_p.citem_version_id
714                l_enrq_param_tbl(counter) := PV_ENRL_REQ_PARAM(
715                                                                rec_p.program_id
716                                                                ,rec_p.program_name
718                                                                , getInviteHeaderId(p_partner_id ,rec_p.program_id , 'INVITE')
719                                                                --,rec_p.invite_header_id
720                                                                ,rec_p.membership_id
721                                                                ,null
722                                                                ,null -- enrollment request id
723                                                                ,null -- enrollment type  code
724                                                                ,null --  enrollment custome set up id
725                                                                ,rec_p.prereq_process_rule_id
726                                                                ,rec_p.no_fee_flag
727                                                                ,rec_p.vad_invite_allow_flag
728 
729                                                             );
730 
731 
732                 counter:=counter+1;
733             END IF;
734          END IF;   -- end  of if , if eligible
735       END IF; -- end of if for preewquite cache
736    END LOOP;-- END OF FOR LOOP
737 
738    -- open ref cursor by querying l_enrq_param_tbl once all the programs related parameters are populated in l_enrq_param_tbl.
739    Open x_enrq_param_cur  for  select * from TABLE(cast (l_enrq_param_tbl  as PV_ENRL_REQ_PARAM_TBL)) order by upper(programname) asc;
740 
741    -- Check for commit
742    IF FND_API.to_boolean(p_commit) THEN
743       COMMIT;
744    END IF;
745 
746 EXCEPTION
747    WHEN  FND_API.G_EXC_UNEXPECTED_ERROR THEN
748       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
749       -- Standard call to get message count and if count=1, get the message
750       FND_MSG_PUB.Count_And_Get (
751             p_encoded => FND_API.G_FALSE,
752             p_count => x_msg_count,
753             p_data  => x_msg_data
754       );
755 
756    WHEN OTHERS THEN
757       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
758       IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
759       THEN
760          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
761       END IF;
762       -- Standard call to get message count and if count=1, get the message
763       FND_MSG_PUB.Count_And_Get (
764             p_encoded => FND_API.G_FALSE,
765             p_count => x_msg_count,
766             p_data  => x_msg_data
767       );
768 END renewable_programs;
769 
770 
771 PROCEDURE upgradable_programs
772 (
773    p_api_version_number          IN   NUMBER
774    ,p_init_msg_list              IN   VARCHAR2     := FND_API.G_FALSE
775    ,p_commit                     IN   VARCHAR2     := FND_API.G_FALSE
776    ,p_validation_level           IN   NUMBER       := FND_API.G_VALID_LEVEL_FULL
777    ,p_partner_id                 IN   NUMBER
778    ,p_member_type                IN   VARCHAR2
779    ,p_isprereq_eval              IN   VARCHAR2     :='Y'
780    ,x_enrq_param_cur             OUT  NOCOPY enrq_param_ref
781    ,x_return_status              OUT  NOCOPY VARCHAR2
782    ,x_msg_count                  OUT  NOCOPY NUMBER
783    ,x_msg_data                   OUT  NOCOPY VARCHAR2
784 ) IS
785 
786    /** pick up all programs of the active memberships for that partner.
787    pick up the to_programs for all these programs from upgrade rules table.
788    see  whether there is an Active,upgraded membership in memberships table
789    if there is none,display this program.
790    if this TO program exist in memberships table,don't pick it up...
791    else pick it up..
792    also query the prereq tables
793    */
794    CURSOR upgrd_prgm_csr(p_ptr_id NUMBER ) IS
795    SELECT  rules.change_to_program_id program_id
796        ,pvppb.program_name program_name
797        ,pvppb.citem_version_id citem_version_id
798        ,memb.membership_id membership_id
799        ,rules.change_from_program_id change_from_program_id
800        ,rules.enrl_change_rule_id enrl_change_rule_id
801        ,pvppb.global_mmbr_reqd_flag global_mmbr_reqd_flag
802        ,pvppb.prereq_process_rule_id prereq_process_rule_id
803        ,pvppb.no_fee_flag no_fee_flag
804        ,pvppb.vad_invite_allow_flag vad_invite_allow_flag
805    FROM   pv_pg_enrl_change_rules rules
806       ,pv_pg_memberships memb
807       ,pv_partner_program_vl pvppb
808       ,pv_partner_program_type_b pvpptb
809 
810    WHERE  pvppb.program_status_code = 'ACTIVE'
811    AND    pvppb.program_level_code ='MEMBERSHIP'
812    AND    pvppb.enabled_flag = 'Y'
813    AND    nvl(pvppb.allow_enrl_until_date, sysdate) > sysdate-1
814    AND    pvppb.program_type_id = pvpptb.program_type_ID
815    AND    pvpptb.ACTIVE_FLAG = 'Y'
816    AND    pvpptb.enabled_flag = 'Y'
817    AND    rules.change_from_program_id=memb.program_id
818    AND    memb.partner_id=p_ptr_id
819    --AND    memb.membership_status_code in ('ACTIVE' , 'UPGRADED')
820    AND  memb.program_id= (
821                            SELECT memb10.program_id
822                            FROM   pv_pg_memberships  memb10
823 			   WHERE memb10.membership_id =
824 			   (   SELECT max(membership_id)
825                                FROM   pv_pg_memberships memb9
829 			      AND    memb10.membership_status_code in ('ACTIVE' , 'UPGRADED')
826                                WHERE  memb9.program_id=memb.program_id
827                                AND    memb9.partner_id=memb.partner_id
828 			      )
830                          )
831 
832    AND    rules.change_direction_code = 'UPGRADE'
833    AND    rules.effective_from_date <= sysdate
834    AND    nvl(rules.effective_to_date, sysdate) >= sysdate
835    AND    rules.active_flag = 'Y'
836    AND    rules.change_to_program_id=pvppb.program_id
837    AND    rules.change_to_program_id not in (
838                        /*SELECT memb2.program_id
839                        FROM   pv_pg_memberships memb2
840                        WHERE  memb2.program_id=rules.change_to_program_id
841                        AND    memb2.partner_id=memb.partner_id
842                        AND    memb2.membership_status_code in ('ACTIVE','UPGRADED','EXPIRED')
843                        */
844                        SELECT memb2.program_id
845                        FROM    pv_pg_memberships memb2
846                        WHERE  memb2.membership_id =
847                        (
848                           SELECT max(membership_id)
849                           FROM   pv_pg_memberships memb3
850                           WHERE  memb3.program_id=rules.change_to_program_id
851                           AND    memb3.partner_id=memb.partner_id
852 
853                        )
854                        AND    memb2.membership_status_code in ('ACTIVE','UPGRADED','EXPIRED','FUTURE')
855 
856                     )
857    AND    EXISTS
858        (   SELECT 'X' FROM pv_program_partner_types pvppt
859            WHERE pvppt.partner_type IN
860            (
861               SELECT attr_value
862               FROM   pv_enty_attr_values pveav
863               WHERE  pveav.enabled_flag = 'Y'
864               AND pveav.latest_flag = 'Y'
865               AND pveav.entity = 'PARTNER'
866               AND pveav.entity_id =p_ptr_id
867               AND pveav.attribute_id = 3
868            )
869       AND    pvpptb.program_type_id = pvppt.program_type_id
870    )
871   /* AND EXISTS -- check for pre-populated cache for pre-req evaluation
872            ( SELECT 1
873              FROM pv_pg_elig_programs elig
874              WHERE elig.program_id = pvppb.program_id
875              AND elig.partner_id = p_ptr_id
876            )
877            */
878    order by rules.change_to_program_id desc;
879 
880    CURSOR enrl_csr(ptr_id NUMBER ,prgm_id NUMBER) IS
881    SELECT enrq.enrl_request_id,enrq.request_status_code,enrq.enrollment_type_code, memb.membership_status_code
882    FROM   pv_pg_enrl_requests enrq
883           , pv_pg_memberships memb
884    WHERE  enrq.enrl_request_id=
885       (
886           SELECT max(enrl_request_id)
887           FROM   pv_pg_enrl_requests
888           WHERE	 partner_id=ptr_id
889           AND    program_id=prgm_id
890 
891       )
892       and enrq.enrl_request_id=memb.enrl_request_id(+);
893 
894 
895 
896    l_enrq_param_tbl  PV_ENRL_REQ_PARAM_TBL := PV_ENRL_REQ_PARAM_TBL ();
897    l_api_name           CONSTANT VARCHAR2(30) := 'upgradable_programs';
898    l_api_version_number  CONSTANT NUMBER       := 1.0;
899    l_eligible_flag boolean:=true;
900    l_memb_flag boolean:=true;
901    l_request_status_code  VARCHAR2(30):=null;
902    l_membership_status_code VARCHAR2(30);
903    l_enrl_request_id NUMBER;
904    l_membership_id NUMBER;
905    l_enrollment_type_code VARCHAR2(30);
906    l_prevMembrId  VARCHAR2(1000);
907    l_upgrdRlId VARCHAR2(1000);
908    counter NUMBER:=0;
909    l_program_id NUMBER:=NULL;
910    TYPE csr_type IS REF CURSOR;
911    prereq_csr csr_type ;
912    l_query_str1  VARCHAR2(1200);
913 
914    l_cache      VARCHAR2(1);
915 
916 BEGIN
917 
918    --Standard call to check for call compatibility.
919    IF NOT FND_API.Compatible_API_Call ( l_api_version_number
920                                        ,p_api_version_number
921                                        ,l_api_name
922                                       ,G_PKG_NAME
923                                      )
924 
925    THEN
926       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
927    END IF;
928 
929    -- Initialize message list if p_init_msg_list is set to TRUE.
930    IF FND_API.to_Boolean( p_init_msg_list )
931    THEN
932       FND_MSG_PUB.initialize;
933    END IF;
934 
935    -- Debug Message
936    IF (PV_DEBUG_HIGH_ON) THEN
937       PVX_UTILITY_PVT.debug_message('Private API: ' || l_api_name || 'start');
938    END IF;
939    -- Initialize API return status to SUCCESS
940    x_return_status := FND_API.G_RET_STS_SUCCESS;
941    --l_query_str1:= 'SELECT ''X''  FROM pv_pg_elig_programs elig  WHERE elig.partner_id=' || to_char(p_partner_id) || 'AND elig.program_id =';
942    l_query_str1:= 'SELECT ''X''  FROM pv_pg_elig_programs elig  WHERE elig.partner_id=:1' || 'AND elig.program_id =:2';
943    FOR rec_prgm in upgrd_prgm_csr(p_partner_id) LOOP
944        l_eligible_flag:=true;
945        l_cache:=null;
946        l_memb_flag  :=true;
947 
948        OPEN prereq_csr FOR l_query_str1 USING p_partner_id,rec_prgm.program_id ;
949           FETCH prereq_csr INTO l_cache;
950        CLOSE prereq_csr;
951 
952        IF l_cache='X' THEN
956 
953           IF p_member_type='SUBSIDIARY'  AND rec_prgm.global_mmbr_reqd_flag='Y' THEN
954              l_eligible_flag:=isGlobalEnrolled(rec_prgm.program_id,p_partner_id);
955           END IF;
957           IF l_eligible_flag=true THEN
958              OPEN enrl_csr(p_partner_id,rec_prgm.program_id);
959                 FETCH enrl_csr INTO l_enrl_request_id,l_request_status_code,l_enrollment_type_code,l_membership_status_code;
960              CLOSE enrl_csr;
961              IF l_request_status_code IS NULL OR l_request_status_code IN ( 'REJECTED','CANCELLED', 'APPROVED' ) THEN
962                 -- the logic here is , the query could fetch you the same program more than once
963                 -- if there is multiple upgrade path. so intially l_program_id is null
964                 -- in the next loop, if the program_id is same, then the previous membership id and
965                 -- upgrade rule id is concatenated. if not , the l_enrq_param_tbl is extended and initialised
966                 IF l_enrollment_type_code ='APPROVED' THEN
967                    IF l_membership_status_code ='ACTIVE' THEN
968                       l_memb_flag :=false;
969                    ELSE
970                       l_memb_flag :=true;
971                    END IF;
972                 END IF;
973 
974                 IF l_memb_flag =true THEN
975 
976                    IF l_program_id=rec_prgm.program_id THEN
977                       l_prevMembrId:=l_prevMembrId || ':' || to_char(rec_prgm.membership_id);
978                       l_upgrdRlId:=l_upgrdRlId || ':' || to_char(rec_prgm.enrl_change_rule_id);
979                       l_enrq_param_tbl(counter) := PV_ENRL_REQ_PARAM(
980                                                                       rec_prgm.program_id
981                                                                       ,rec_prgm.program_name
982                                                                       ,rec_prgm.citem_version_id
983                                                                       , getInviteHeaderId(p_partner_id ,rec_prgm.program_id , 'UPGRADE')
984                                                                       --,rec_prgm.invite_header_id
985                                                                       ,l_prevMembrId
986                                                                       , l_upgrdRlId
987                                                                       ,null -- enrollment request id
988                                                                       ,null -- enrollment type  code
989                                                                       ,null --  enrollment custome set up id
990                                                                       ,rec_prgm.prereq_process_rule_id
991                                                                       ,rec_prgm.no_fee_flag
992                                                                       ,rec_prgm.vad_invite_allow_flag
993 
994                                                                    );
995 
996                    ELSE
997                       counter:=counter+1;
998                       l_prevMembrId:=to_char(rec_prgm.membership_id);
999                       l_upgrdRlId:=to_char(rec_prgm.enrl_change_rule_id);
1000                       l_enrq_param_tbl.EXTEND(1);
1001                       l_enrq_param_tbl(counter) := PV_ENRL_REQ_PARAM(
1002                                                                       rec_prgm.program_id
1003                                                                       ,rec_prgm.program_name
1004                                                                       ,rec_prgm.citem_version_id
1005                                                                       ,getInviteHeaderId(p_partner_id ,rec_prgm.program_id , 'UPGRADE')
1006                                                                       ,to_char(rec_prgm.membership_id)
1007                                                                       ,to_char(rec_prgm.enrl_change_rule_id)
1008                                                                       ,null -- enrollment request id
1009                                                                       ,null -- enrollment type  code
1010                                                                       ,null --  enrollment custome set up id
1011                                                                       ,rec_prgm.prereq_process_rule_id
1012                                                                       ,rec_prgm.no_fee_flag
1013                                                                       ,rec_prgm.vad_invite_allow_flag
1014                                                                   );
1015                       l_program_id:=rec_prgm.program_id;
1016                    END IF;
1017                 END IF;
1018              END IF;
1019           END IF;--end of if ,if the program is eligible
1020           l_request_status_code:=null;
1021        END IF; -- end of if for preewquite cache
1022    END LOOP;
1023 
1024    --We'll query l_enrq_param_tbl  once all the programs related parameters are populated in l_enrq_param_tbl.
1025    Open x_enrq_param_cur  for  select * from TABLE(cast (l_enrq_param_tbl  as PV_ENRL_REQ_PARAM_TBL)) order by upper(programname) asc;
1026 
1027    -- Check for commit
1028   IF FND_API.to_boolean(p_commit) THEN
1029      COMMIT;
1030   END IF;
1031 
1032 EXCEPTION
1033    WHEN  FND_API.G_EXC_UNEXPECTED_ERROR THEN
1034       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1035       -- Standard call to get message count and if count=1, get the message
1036       FND_MSG_PUB.Count_And_Get (
1037             p_encoded => FND_API.G_FALSE,
1038             p_count => x_msg_count,
1042    WHEN OTHERS THEN
1039             p_data  => x_msg_data
1040       );
1041 
1043       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1044       IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1045       THEN
1046          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
1047       END IF;
1048       -- Standard call to get message count and if count=1, get the message
1049       FND_MSG_PUB.Count_And_Get (
1050             p_encoded => FND_API.G_FALSE,
1051             p_count => x_msg_count,
1052             p_data  => x_msg_data
1053       );
1054 END upgradable_programs;
1055 
1056 
1057 PROCEDURE incomplete_programs
1058 (
1059    p_api_version_number          IN   NUMBER
1060    ,p_init_msg_list              IN   VARCHAR2     := FND_API.G_FALSE
1061    ,p_commit                     IN   VARCHAR2     := FND_API.G_FALSE
1062    ,p_validation_level           IN   NUMBER       := FND_API.G_VALID_LEVEL_FULL
1063    ,p_partner_id                 IN   NUMBER
1064    ,p_member_type                IN   VARCHAR2
1065    ,p_isprereq_eval              IN   VARCHAR2     :='Y'
1066    ,x_enrq_param_cur             OUT  NOCOPY enrq_param_ref
1067    ,x_return_status              OUT  NOCOPY VARCHAR2
1068    ,x_msg_count                  OUT  NOCOPY NUMBER
1069    ,x_msg_data                   OUT  NOCOPY VARCHAR2
1070 )   IS
1071 
1072    CURSOR incomplet_csr(p_ptr_id NUMBER ) IS
1073    SELECT enrq.enrl_request_id
1074           ,enrq.enrollment_type_code
1075           ,enrq.program_id
1076           ,enrq.custom_setup_id
1077           ,pvppb.program_name
1078           ,pvppb.citem_version_id
1079           ,pvppb.global_mmbr_reqd_flag
1080           ,pvppb.prereq_process_rule_id prereq_process_rule_id
1081           ,pvppb.no_fee_flag no_fee_flag
1082           ,pvppb.vad_invite_allow_flag vad_invite_allow_flag
1083    FROM    pv_partner_program_type_b pvpptb
1084           ,pv_partner_program_vl pvppb
1085           ,pv_pg_enrl_requests enrq
1086    WHERE  pvppb.program_status_code = 'ACTIVE'
1087    AND    pvppb.program_level_code ='MEMBERSHIP'
1088    AND    pvppb.enabled_flag = 'Y'
1089    AND    nvl(pvppb.allow_enrl_until_date, sysdate) > sysdate-1
1090    AND    pvppb.program_type_id = pvpptb.program_type_ID  AND  pvpptb.ACTIVE_FLAG = 'Y'
1091    AND    pvpptb.enabled_flag = 'Y'
1092    AND    EXISTS
1093           (   SELECT 'X'
1094               FROM    pv_program_partner_types pvppt
1095               WHERE   pvppt.partner_type
1096               IN     (  SELECT attr_value
1097                         FROM   pv_enty_attr_values pveav
1098                         WHERE  pveav.enabled_flag = 'Y'
1099                         AND    pveav.latest_flag = 'Y'
1100                         AND    pveav.entity = 'PARTNER'
1101                         AND pveav.entity_id =p_ptr_id
1102                         AND pveav.attribute_id = 3
1103                      )
1104               AND    pvpptb.program_type_id = pvppt.program_type_id
1105           )
1106    AND    enrq.enrl_request_id =
1107           (   SELECT max(enrl_request_id)
1108               FROM   pv_pg_enrl_requests
1109               WHERE  partner_id= p_ptr_id
1110               AND    program_id=pvppb.PROGRAM_ID
1111               AND   request_status_code='INCOMPLETE'
1112           )
1113    /*AND EXISTS -- check for pre-populated cache for pre-req evaluation
1114            ( SELECT 1
1115              FROM pv_pg_elig_programs elig
1116              WHERE elig.program_id = pvppb.program_id
1117              AND elig.partner_id = p_ptr_id
1118            )
1119            */
1120            ;
1121 
1122    l_enrq_param_tbl  PV_ENRL_REQ_PARAM_TBL := PV_ENRL_REQ_PARAM_TBL ();
1123    l_api_name           CONSTANT VARCHAR2(30) := 'incomplete_programs';
1124    l_api_version_number  CONSTANT NUMBER       := 1.0;
1125    counter NUMBER:=0;
1126    TYPE csr_type IS REF CURSOR;
1127    prereq_csr  csr_type ;
1128    l_query_str1  VARCHAR2(1200);
1129 
1130    l_cache       VARCHAR2(1);
1131 
1132 BEGIN
1133 
1134    --Standard call to check for call compatibility.
1135    IF NOT FND_API.Compatible_API_Call ( l_api_version_number
1136                                        ,p_api_version_number
1137                                        ,l_api_name
1138                                       ,G_PKG_NAME
1139                                      )
1140 
1141    THEN
1142       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1143    END IF;
1144 
1145    -- Initialize message list if p_init_msg_list is set to TRUE.
1146    IF FND_API.to_Boolean( p_init_msg_list )
1147    THEN
1148       FND_MSG_PUB.initialize;
1149    END IF;
1150 
1151    -- Debug Message
1152    IF (PV_DEBUG_HIGH_ON) THEN
1153       PVX_UTILITY_PVT.debug_message('Private API: ' || l_api_name || 'start');
1154    END IF;
1155    -- Initialize API return status to SUCCESS
1156    x_return_status := FND_API.G_RET_STS_SUCCESS;
1157 
1158    -- logic to get the list of new programs that partner is eligible to see goes here.
1159    --Add each of program, add the following parameter values to the following   table
1160    --l_query_str1:= 'SELECT ''X''  FROM pv_pg_elig_programs elig  WHERE elig.partner_id=' || to_char(p_partner_id) || 'AND elig.program_id =';
1161    l_query_str1:= 'SELECT ''X''  FROM pv_pg_elig_programs elig  WHERE elig.partner_id=:1' || 'AND elig.program_id =:2';
1162    FOR rec_prgm in incomplet_csr(p_partner_id) LOOP
1166           FETCH prereq_csr INTO l_cache;
1163        l_cache:=null;
1164 
1165        OPEN prereq_csr FOR l_query_str1 USING p_partner_id,rec_prgm.program_id ;
1167        CLOSE prereq_csr;
1168 
1169        IF l_cache='X' THEN
1170           counter:=counter+1;
1171           l_enrq_param_tbl.EXTEND(1);
1172           l_enrq_param_tbl(counter) := PV_ENRL_REQ_PARAM(  rec_prgm.program_id
1173                                                         ,rec_prgm.program_name
1174                                                         ,rec_prgm.citem_version_id
1175                                                         ,null -- need to clarify business logic here
1176                                                         ,null -- previous membership id
1177                                                         ,null -- upgrade rule id
1178                                                         ,rec_prgm.enrl_request_id -- enrollment request id
1179                                                         ,rec_prgm.enrollment_type_code -- enrollment type  code
1180                                                         ,rec_prgm.custom_setup_id --  enrollment custome set up id
1181                                                         ,rec_prgm.prereq_process_rule_id
1182                                                         ,rec_prgm.no_fee_flag
1183                                                         ,rec_prgm.vad_invite_allow_flag
1184 
1185                                                      );
1186       END IF; -- end of if for preewquite cache
1187    END LOOP;
1188 
1189    --We'll query l_enrq_param_tbl  once all the programs related parameters are populated in l_enrq_param_tbl.
1190    Open x_enrq_param_cur  for  select * from TABLE(cast (l_enrq_param_tbl  as PV_ENRL_REQ_PARAM_TBL)) order by upper(programname) asc;
1191 
1192    -- Check for commit
1193   IF FND_API.to_boolean(p_commit) THEN
1194      COMMIT;
1195   END IF;
1196 
1197 EXCEPTION
1198    WHEN  FND_API.G_EXC_UNEXPECTED_ERROR THEN
1199       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1200       -- Standard call to get message count and if count=1, get the message
1201       FND_MSG_PUB.Count_And_Get (
1202             p_encoded => FND_API.G_FALSE,
1203             p_count => x_msg_count,
1204             p_data  => x_msg_data
1205       );
1206 
1207    WHEN OTHERS THEN
1208       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1209       IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1210       THEN
1211          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
1212       END IF;
1213       -- Standard call to get message count and if count=1, get the message
1214       FND_MSG_PUB.Count_And_Get (
1215             p_encoded => FND_API.G_FALSE,
1216             p_count => x_msg_count,
1217             p_data  => x_msg_data
1218       );
1219 END incomplete_programs;
1220 
1221 
1222 PROCEDURE newAndInCompletePrograms
1223 (
1224    p_api_version_number          IN   NUMBER
1225    ,p_init_msg_list              IN   VARCHAR2     := FND_API.G_FALSE
1226    ,p_commit                     IN   VARCHAR2     := FND_API.G_FALSE
1227    ,p_validation_level           IN   NUMBER       := FND_API.G_VALID_LEVEL_FULL
1228    ,p_partner_id                 IN   NUMBER
1229    ,p_member_type                IN   VARCHAR2
1230    ,p_isprereq_eval              IN   VARCHAR2     :='Y'
1231    ,x_enrq_param_cur             OUT  NOCOPY enrq_param_ref
1232    ,x_return_status              OUT  NOCOPY VARCHAR2
1233    ,x_msg_count                  OUT  NOCOPY NUMBER
1234    ,x_msg_data                   OUT  NOCOPY VARCHAR2
1235 ) IS
1236    l_api_name            CONSTANT VARCHAR2(30) := 'newAndInCompletePrograms';
1237    l_api_version_number  CONSTANT NUMBER       := 1.0;
1238    l_new_enrq_param_ref      enrq_param_ref;
1239    l_inc_enrq_param_ref      enrq_param_ref;
1240    --l_newinc_enrq_param_ref   enrq_param_ref;
1241    l_nienrq_param_tbl  PV_ENRL_REQ_PARAM_TBL := PV_ENRL_REQ_PARAM_TBL ();
1242    l_programId         NUMBER;
1243    l_programName       VARCHAR2(60);
1244    l_citemVersionId    NUMBER;
1245    l_inviteHeaderId    NUMBER;
1246    l_prevMembrId       VARCHAR2(1000) ;
1247    l_upgrdRlId         VARCHAR2(1000);
1248    l_enrlId            NUMBER;
1249    l_enrlTypeCode      VARCHAR2(30);
1250    l_enrlCustSetupId   NUMBER;
1251    l_prereqProcessRuleId NUMBER;
1252    l_no_fee           VARCHAR2(1);
1253    l_vad_invite        VARCHAR2(1);
1254      counter NUMBER:=1;
1255 BEGIN
1256     --Standard call to check for call compatibility.
1257    IF NOT FND_API.Compatible_API_Call ( l_api_version_number
1258                                        ,p_api_version_number
1259                                        ,l_api_name
1260                                       ,G_PKG_NAME
1261                                      )
1262 
1263    THEN
1264       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1265    END IF;
1266 
1267    -- Initialize message list if p_init_msg_list is set to TRUE.
1268    IF FND_API.to_Boolean( p_init_msg_list )
1269    THEN
1270       FND_MSG_PUB.initialize;
1271    END IF;
1272 
1273    -- Debug Message
1274    IF (PV_DEBUG_HIGH_ON) THEN
1275       PVX_UTILITY_PVT.debug_message('Private API: ' || l_api_name || 'start');
1276    END IF;
1277    -- Initialize API return status to SUCCESS
1278    x_return_status := FND_API.G_RET_STS_SUCCESS;
1279    new_programs
1280    (
1284       ,p_validation_level           => p_validation_level
1281       p_api_version_number          => p_api_version_number
1282       ,p_init_msg_list              => p_init_msg_list
1283       ,p_commit                     => p_commit
1285       ,p_partner_id                 => p_partner_id
1286       ,p_member_type                => p_member_type
1287       ,p_isprereq_eval              => p_isprereq_eval
1288       ,x_enrq_param_cur             => l_new_enrq_param_ref
1289       ,x_return_status              => x_return_status
1290       ,x_msg_count                  => x_msg_count
1291       ,x_msg_data                   => x_msg_data
1292    );
1293    LOOP
1294    -- you need to fetch all of it even though you don't neeed it.
1295       FETCH  l_new_enrq_param_ref  into   l_programId, l_programName, l_citemVersionId, l_inviteHeaderId,       l_prevMembrId   , l_upgrdRlId ,
1296             l_enrlId , l_enrlTypeCode, l_enrlCustSetupId,l_prereqProcessRuleId, l_no_fee, l_vad_invite;
1297 
1298       EXIT WHEN l_new_enrq_param_ref%NOTFOUND;
1299 
1300        IF  l_programId IS NOT NULL THEN
1301          l_nienrq_param_tbl.EXTEND(1);
1302          l_nienrq_param_tbl(counter) := PV_ENRL_REQ_PARAM(  l_programId
1303                                                            ,l_programName
1304                                                            , l_citemVersionId
1305                                                            , l_inviteHeaderId
1306                                                            ,l_prevMembrId
1307                                                            ,l_upgrdRlId
1308                                                            ,l_enrlId -- enrollment request id
1309                                                            ,l_enrlTypeCode -- enrollment type  code
1310                                                            ,l_enrlCustSetupId--  enrollment custome set up id
1311                                                            ,l_prereqProcessRuleId
1312                                                            ,l_no_fee
1313                                                            ,l_vad_invite
1314 
1315                                                         );
1316          counter:=counter+1;
1317       END IF;
1318 
1319 
1320 
1321    END LOOP;
1322    close  l_new_enrq_param_ref ;
1323 
1324    incomplete_programs
1325    (
1326       p_api_version_number          => p_api_version_number
1327       ,p_init_msg_list              => p_init_msg_list
1328       ,p_commit                     => p_commit
1329       ,p_validation_level           => p_validation_level
1330       ,p_partner_id                 => p_partner_id
1331       ,p_member_type                => p_member_type
1332       ,p_isprereq_eval              => p_isprereq_eval
1333       ,x_enrq_param_cur             => l_inc_enrq_param_ref
1334       ,x_return_status              => x_return_status
1335       ,x_msg_count                  => x_msg_count
1336       ,x_msg_data                   => x_msg_data
1337    );
1338 
1339    LOOP
1340    -- you need to fetch all of it even though you don't neeed it.
1341       FETCH  l_inc_enrq_param_ref   into   l_programId, l_programName, l_citemVersionId, l_inviteHeaderId,       l_prevMembrId   , l_upgrdRlId ,
1342             l_enrlId , l_enrlTypeCode, l_enrlCustSetupId,l_prereqProcessRuleId, l_no_fee, l_vad_invite;
1343 
1344       EXIT WHEN l_inc_enrq_param_ref%NOTFOUND;
1345 
1346        IF  l_programId IS NOT NULL THEN
1347          l_nienrq_param_tbl.EXTEND(1);
1348          l_nienrq_param_tbl(counter) := PV_ENRL_REQ_PARAM(  l_programId
1349                                                            ,l_programName
1350                                                            , l_citemVersionId
1351                                                            , l_inviteHeaderId
1352                                                            ,l_prevMembrId
1353                                                            ,l_upgrdRlId
1354                                                            ,l_enrlId -- enrollment request id
1355                                                            ,l_enrlTypeCode -- enrollment type  code
1356                                                            ,l_enrlCustSetupId--  enrollment custome set up id
1360 
1357                                                            ,l_prereqProcessRuleId
1358                                                            ,l_no_fee
1359                                                            ,l_vad_invite
1361                                                         );
1362          counter:=counter+1;
1363       END IF;
1364 
1365 
1366 
1367    END LOOP;
1368    close  l_inc_enrq_param_ref ;
1369 
1370 
1371    OPEN x_enrq_param_cur  FOR  SELECT * FROM TABLE( CAST (l_nienrq_param_tbl  AS PV_ENRL_REQ_PARAM_TBL)) order by upper(programname) asc;
1372 
1373 
1374    -- Check for commit
1375    IF FND_API.to_boolean(p_commit) THEN
1376       COMMIT;
1377    END IF;
1378 
1379 EXCEPTION
1380      WHEN  FND_API.G_EXC_UNEXPECTED_ERROR THEN
1381       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1382       -- Standard call to get message count and if count=1, get the message
1383       FND_MSG_PUB.Count_And_Get (
1384             p_encoded => FND_API.G_FALSE,
1385             p_count => x_msg_count,
1386             p_data  => x_msg_data
1387       );
1388 
1389    WHEN OTHERS THEN
1390       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1391       IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1392       THEN
1393          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
1394       END IF;
1395       -- Standard call to get message count and if count=1, get the message
1396       FND_MSG_PUB.Count_And_Get (
1397             p_encoded => FND_API.G_FALSE,
1398             p_count => x_msg_count,
1399             p_data  => x_msg_data
1400       );
1401 END newAndInCompletePrograms;
1402 
1403 PROCEDURE isPartnerEligible
1404 (
1405    p_api_version_number           IN   NUMBER
1406    , p_init_msg_list              IN   VARCHAR2     := FND_API.G_FALSE
1407    , p_commit                     IN   VARCHAR2     := FND_API.G_FALSE
1408    , p_validation_level           IN   NUMBER       := FND_API.G_VALID_LEVEL_FULL
1409    , p_partner_id                 IN   NUMBER
1410    , p_from_program_id            IN   NUMBER
1411    , p_to_program_id              IN   NUMBER
1412    , p_enrq_type                  IN   VARCHAR  -- permitted values here are 'NEW', 'UPGRADE' for 11.5.10.
1413    , x_elig_flag                  OUT  NOCOPY VARCHAR2 -- PASS 'Y' if eligible, PASS 'N' if not eligible
1414    , x_return_status              OUT  NOCOPY VARCHAR2
1415    , x_msg_count                  OUT  NOCOPY NUMBER
1416    , x_msg_data                   OUT  NOCOPY VARCHAR2
1417 )
1418 IS
1419    l_api_name           CONSTANT VARCHAR2(30) := 'isPartnerEligible';
1420    l_api_version_number  CONSTANT NUMBER       := 1.0;
1421    l_global_mmbr_reqd_flag  VARCHAR2(1);
1422    l_eligible_flag boolean:=true;
1423    l_member_type          VARCHAR2(30);
1424    l_request_status_code  VARCHAR2(30);
1425    l_enrollment_type_code VARCHAR2(30);
1426 
1427    CURSOR memb_type( p_ptr_id NUMBER)  IS
1428    SELECT attr_value
1429    FROM   pv_enty_attr_values
1430    WHERE  entity='PARTNER'
1431    AND    entity_id=p_ptr_id
1432    AND    attribute_id=6
1433    AND    latest_flag='Y';
1434 
1435    CURSOR isElig( ptnr_id NUMBER, p_prgm_id NUMBER ) IS
1436    SELECT 'Y' , global_mmbr_reqd_flag
1437    FROM   pv_partner_program_type_b pvpptb
1438           , pv_partner_program_b pvppb
1439    WHERE  program_id=p_prgm_id
1440    AND    nvl(allow_enrl_until_date, sysdate) > sysdate-1
1441    AND    pvppb.program_type_id = pvpptb.program_type_ID
1442    AND    pvpptb.ACTIVE_FLAG = 'Y'
1443    AND    pvpptb.enabled_flag = 'Y'
1444    AND    program_id NOT IN
1445           (
1446              SELECT rules.change_to_program_id
1447              FROM   pv_pg_enrl_change_rules rules
1448              WHERE  change_direction_code = 'UPGRADE'
1449              AND    effective_from_date <= sysdate
1450              AND    nvl(effective_to_date, sysdate) >= sysdate
1451              AND    active_flag = 'Y'
1452           )
1453    AND    EXISTS
1454           (
1455              SELECT 'X'
1456              FROM pv_program_partner_types pvppt
1457              WHERE pvppt.partner_type IN
1458              (
1459                 SELECT attr_value
1460                 FROM   pv_enty_attr_values pveav
1461                 WHERE  pveav.enabled_flag = 'Y'
1462                 AND pveav.latest_flag = 'Y'
1463                 AND pveav.entity = 'PARTNER'
1464                 AND pveav.entity_id = ptnr_id
1465                 AND pveav.attribute_id = 3
1466              )
1467    	  AND    pvpptb.program_type_id = pvppt.program_type_id
1468           )
1469    /*AND    EXISTS -- check for pre-populated cache for pre-req evaluation
1470           (
1471              SELECT 1
1472              FROM pv_pg_elig_programs elig
1473              WHERE elig.program_id = pvppb.program_id
1474              AND elig.partner_id = ptnr_id
1475            )*/
1476            ;
1477 
1478   CURSOR c_upgrade_csr( p_ptr_id IN NUMBER, p_from_id IN NUMBER, p_to_id IN NUMBER) IS
1479   SELECT 'Y'
1480           , global_mmbr_reqd_flag
1481    FROM   pv_pg_enrl_change_rules rules
1482           , pv_pg_memberships memb
1483           , pv_partner_program_vl pvppb
1484           , pv_partner_program_type_b pvpptb
1485    WHERE  pvppb.program_status_code = 'ACTIVE'
1486    AND    pvppb.program_level_code ='MEMBERSHIP'
1487    AND    pvppb.enabled_flag = 'Y'
1488    AND    pvppb.program_id=p_to_id
1489    AND    nvl(pvppb.allow_enrl_until_date, sysdate) > sysdate-1
1490    AND    pvppb.program_type_id = pvpptb.program_type_ID
1491    AND    pvpptb.ACTIVE_FLAG = 'Y'
1492    AND    pvpptb.enabled_flag = 'Y'
1493    AND    memb.program_id=p_from_id
1494    AND    memb.partner_id=p_ptr_id
1495    --AND    memb.membership_status_code in ('ACTIVE' , 'UPGRADED')
1496    AND  memb.program_id= (
1497                            SELECT memb10.program_id
1498                            FROM   pv_pg_memberships  memb10
1499 			   WHERE memb10.membership_id =
1500 			   (   SELECT max(membership_id)
1501                                FROM   pv_pg_memberships memb9
1502                                WHERE  memb9.program_id=memb.program_id
1503                                AND    memb9.partner_id=memb.partner_id
1504 			      )
1505 			      AND    memb10.membership_status_code in ('ACTIVE' , 'UPGRADED')
1506                          )
1507 
1508    AND    rules.change_from_program_id =p_from_id
1509    AND    rules.change_direction_code = 'UPGRADE'
1510    AND    rules.effective_from_date <= sysdate
1511    AND    nvl(rules.effective_to_date, sysdate) >= sysdate
1512    AND    rules.active_flag = 'Y'
1513    AND    rules.change_to_program_id=p_to_id
1514    AND    rules.change_to_program_id not in
1515           (
1516              /* SELECT memb2.program_id
1517               FROM   pv_pg_memberships memb2
1518               WHERE  memb2.program_id=p_to_id
1519               AND    memb2.partner_id=p_ptr_id
1520               AND    memb2.membership_status_code in ('ACTIVE', 'UPGRADED')
1521               */
1522               SELECT memb2.program_id
1523               FROM    pv_pg_memberships memb2
1524               WHERE  memb2.membership_id =
1525               (
1526               SELECT max(membership_id)
1527               FROM   pv_pg_memberships memb3
1528               WHERE  memb3.program_id=rules.change_to_program_id
1529               AND    memb3.partner_id=memb.partner_id
1530               )
1531               AND    memb2.membership_status_code in ('ACTIVE','UPGRADED','EXPIRED')
1532 
1533           )
1534    AND    EXISTS
1535           (
1536              SELECT 'X'
1537              FROM pv_program_partner_types pvppt
1538              WHERE pvppt.partner_type IN
1539              (
1540                 SELECT attr_value
1541                 FROM   pv_enty_attr_values pveav
1542                 WHERE  pveav.enabled_flag = 'Y'
1543                 AND pveav.latest_flag = 'Y'
1544                 AND pveav.entity = 'PARTNER'
1545                 AND pveav.entity_id =  p_ptr_id
1546                 AND pveav.attribute_id = 3
1547              )
1548    	  AND    pvpptb.program_type_id = pvppt.program_type_id
1549           )
1550   /* AND    EXISTS -- check for pre-populated cache for pre-req evaluation
1551           (
1552              SELECT 1
1553              FROM pv_pg_elig_programs elig
1554              WHERE elig.program_id = pvppb.program_id
1555              AND elig.partner_id = p_ptr_id
1556           )
1557           */
1558           ;
1559 
1560    CURSOR enrl_csr( ptr_id IN NUMBER, prgm_id IN NUMBER  ) IS
1561    SELECT request_status_code,enrollment_type_code
1562    FROM   pv_pg_enrl_requests
1563    WHERE  enrl_request_id=
1564    (
1565        SELECT max(enrl_request_id)
1566        FROM   pv_pg_enrl_requests
1567        WHERE	 partner_id=ptr_id
1568        AND    program_id=prgm_id
1569 
1570    );
1571 
1572    TYPE csr_type IS REF CURSOR;
1573    prereq_csr csr_type ;
1574    l_query_str1  VARCHAR2(1200);
1575 
1576    l_cache      VARCHAR2(1):=null;
1577 
1578 BEGIN
1579    SAVEPOINT isPartnerEligible;
1580    --Standard call to check for call compatibility.
1581    IF NOT FND_API.Compatible_API_Call ( l_api_version_number
1582                                        ,p_api_version_number
1583                                        ,l_api_name
1584                                       ,G_PKG_NAME
1585                                      )
1586 
1587    THEN
1588       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1589    END IF;
1590 
1591    -- Initialize message list if p_init_msg_list is set to TRUE.
1592    IF FND_API.to_Boolean( p_init_msg_list )
1593    THEN
1594       FND_MSG_PUB.initialize;
1595    END IF;
1596 
1597    -- Debug Message
1598    IF (PV_DEBUG_HIGH_ON) THEN
1599       PVX_UTILITY_PVT.debug_message('Private API: ' || l_api_name || 'start');
1600    END IF;
1601    -- Initialize API return status to SUCCESS
1602    x_return_status := FND_API.G_RET_STS_SUCCESS;
1603    x_elig_flag := 'N';
1604 
1605    --l_query_str1:= 'SELECT ''X''  FROM pv_pg_elig_programs elig  WHERE elig.partner_id=' || to_char(p_partner_id) || 'AND elig.program_id='|| to_char( p_to_program_id);
1606    l_query_str1:= 'SELECT ''X''  FROM pv_pg_elig_programs elig  WHERE elig.partner_id=:1' || 'AND elig.program_id =:2';
1607 
1608    OPEN prereq_csr FOR l_query_str1 USING p_partner_id, p_to_program_id;
1609       FETCH prereq_csr INTO l_cache;
1610    CLOSE prereq_csr;
1611 
1612    IF l_cache='X' THEN
1613       IF p_enrq_type = 'NEW' THEN
1614 
1615          OPEN isElig( p_partner_id , p_to_program_id  ) ;
1616             FETCH isElig INTO x_elig_flag,l_global_mmbr_reqd_flag;
1617          CLOSE isElig;
1618 
1619          IF x_elig_flag= 'Y' THEN
1620          	OPEN memb_type( p_partner_id );
1621          	   FETCH memb_type INTO l_member_type;
1622          	CLOSE memb_type;
1623          	IF l_member_type='SUBSIDIARY' THEN
1624          	    IF l_global_mmbr_reqd_flag ='Y' THEN
1625                      l_eligible_flag:=isGlobalEnrolled(p_to_program_id ,p_partner_id);
1626                   END IF;
1627                   IF l_eligible_flag=false THEN
1628                      x_elig_flag := 'N' ;
1629                   END IF;
1630               END If;
1631          ELSE
1632             x_elig_flag := 'N' ;
1633          END IF;
1634       ELSIF p_enrq_type = 'UPGRADE' THEN
1635          -- start: if its upgrade
1636          OPEN c_upgrade_csr( p_partner_id , p_from_program_id, p_to_program_id  ) ;
1637             FETCH c_upgrade_csr INTO x_elig_flag,l_global_mmbr_reqd_flag;
1638          CLOSE c_upgrade_csr;
1639 
1640          IF x_elig_flag= 'Y' THEN
1641             OPEN enrl_csr( p_partner_id, p_to_program_id );
1642                FETCH enrl_csr INTO l_request_status_code,l_enrollment_type_code;
1643             CLOSE enrl_csr;
1644             --check whether there is an already an APPROVED enrollment request
1645             -- Fixed for bug 5116650. Only checked for AWAITING_APPROVAL by taking out the APPROVED status
1646             IF ( l_request_status_code IS NOT NULL AND l_request_status_code IN ( 'AWAITING_APPROVAL' ) )  THEN
1647               x_elig_flag :=  'N';
1648 
1649             END IF;
1650 
1651             -- check member type and if its subsidiary , check whether global has enrolled.
1652             IF x_elig_flag= 'Y' THEN
1653 
1654                OPEN memb_type( p_partner_id );
1655                   FETCH memb_type INTO l_member_type;
1656                CLOSE memb_type;
1657                IF l_member_type='SUBSIDIARY' THEN
1658 
1659          	       IF l_global_mmbr_reqd_flag ='Y' THEN
1660          	          l_eligible_flag:=isGlobalEnrolled(p_to_program_id ,p_partner_id);
1661          	       END IF;
1662          	       IF l_eligible_flag=false THEN
1663          	          x_elig_flag := 'N' ;
1664          	       END IF;
1665                END IF;
1666                -- end of member type check
1667             END IF;
1668          ELSE
1669             x_elig_flag := 'N' ;
1670          END IF;
1671       END IF; -- end : if its upgrade
1672    ELSE
1673       x_elig_flag :=  'N';
1674    END IF; -- end of if for preewquite cache
1675    -- Debug Message
1676    IF (PV_DEBUG_HIGH_ON) THEN
1677       PVX_UTILITY_PVT.debug_message('Private API: ' || l_api_name || 'end');
1678    END IF;
1679   -- Check for commit
1680   IF FND_API.to_boolean(p_commit) THEN
1681      COMMIT;
1682   END IF;
1683 
1684 EXCEPTION
1685    WHEN FND_API.G_EXC_ERROR THEN
1686    ROLLBACK TO isPartnerEligible;
1687    x_return_status := FND_API.G_RET_STS_ERROR;
1688    -- Standard call to get message count and if count=1, get the message
1689    FND_MSG_PUB.Count_And_Get (
1690           p_encoded => FND_API.G_FALSE,
1691           p_count   => x_msg_count,
1692           p_data    => x_msg_data
1693    );
1694    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1695    ROLLBACK TO isPartnerEligible;
1696    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1697    -- Standard call to get message count and if count=1, get the message
1698    FND_MSG_PUB.Count_And_Get (
1699           p_encoded => FND_API.G_FALSE,
1700           p_count => x_msg_count,
1701           p_data  => x_msg_data
1702    );
1703    WHEN OTHERS THEN
1704    ROLLBACK TO  isPartnerEligible;
1705    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1706    IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1707    THEN
1708       FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
1709    END IF;
1710    -- Standard call to get message count and if count=1, get the message
1711    FND_MSG_PUB.Count_And_Get (
1712           p_encoded => FND_API.G_FALSE,
1713           p_count => x_msg_count,
1714           p_data  => x_msg_data
1715    );
1716 
1717 END isPartnerEligible;
1718 
1719 END Pv_Enrq_Bins_PVT;