DBA Data[Home] [Help]

PACKAGE BODY: APPS.JTF_RS_GRP_MEMBERSHIP_PUB

Source


1 PACKAGE BODY jtf_rs_grp_membership_pub AS
2   /* $Header: jtfrsrmb.pls 120.0 2005/05/11 08:21:40 appldev ship $ */
3 
4   /*****************************************************************************************
5    ******************************************************************************************/
6 
7   /* Package variables. */
8 
9   G_PKG_NAME         VARCHAR2(30) := 'JTF_RS_GRP_MEMBERSHIP_PUB';
10 
11 
12 
13 PROCEDURE create_group_membership
14  (P_API_VERSION           IN   NUMBER,
15    P_INIT_MSG_LIST        IN   VARCHAR2   DEFAULT  FND_API.G_FALSE,
16    P_COMMIT               IN   VARCHAR2   DEFAULT  FND_API.G_FALSE,
17    P_RESOURCE_ID          IN   NUMBER,
18    P_GROUP_ID             IN   NUMBER,
19    P_ROLE_ID              IN   NUMBER,
20    P_START_DATE           IN   DATE,
21    P_END_DATE             IN   DATE DEFAULT NULL,
22    X_RETURN_STATUS        OUT NOCOPY  VARCHAR2,
23    X_MSG_COUNT            OUT NOCOPY  NUMBER,
24    X_MSG_DATA             OUT NOCOPY  VARCHAR2
25   ) IS
26 
27     l_api_version         constant number := 1.0;
28     l_api_name            constant varchar2(30) := 'CREATE_GROUP_MEMBERSHIP';
29     l_return_status       varchar2(100) := fnd_api.g_ret_sts_success;
30     l_msg_count           number;
31     l_msg_data            varchar2(2000);
32 
33     /* Out Parameters  for Create Role Relation*/
34 
35     l_role_relate_id         number;
36     l_role_relate_id_old     number;
37     l_object_version_number  number;
38     l_object_version_number_old  number;
39     l_start_date_active      date;
40     l_end_date_active        date;
41     l_resource_start_date    date;
42     l_resource_end_date      date;
43     l_resource_name          varchar2(240);
44     l_group_name             varchar2(240);
45 
46     /* Out Parameters  for Create Group Member*/
47 
48     l_group_member_id     number;
49 
50     /* Cursor  Variables to get role realtions */
51 
52     cursor chk_role_relate(l_role_id number, l_resource_id number)
53     is
54     select   role_relate_id,start_date_active,end_date_active,object_version_number
55     from     jtf_rs_role_relations
56     where    role_id = l_role_id
57     and      role_resource_id = l_resource_id
58     and      role_resource_type = 'RS_INDIVIDUAL'
59     and      nvl(delete_flag, 'N') <> 'Y'
60     order by start_date_active desc;
61 
62     cursor get_resource_dates(l_resource_id number)
63     is
64     select   start_date_active,
65              end_date_active,
66              resource_name
67     from     jtf_rs_resource_extns_vl
68     where    resource_id = l_resource_id;
69 
70     cursor get_group_name(l_group_id number)
71     is
72     select   group_name
73     from     jtf_rs_groups_vl
74     where    group_id = l_group_id;
75 
76     /* Cursor  Variables to check group member exists or not */
77 
78     cursor check_group_member_exists(l_group_id number, l_resource_id number)
79     is
80     select   group_member_id
81     from     jtf_rs_group_members
82     where    group_id = l_group_id
83     and      resource_id = l_resource_id
84     and      nvl(delete_flag, 'N') <> 'Y';
85 
86     cursor role_type_dtl(l_role_id number)
87     is
88     select   trunc(lkp.start_date_active),
89              trunc(lkp.end_date_active)
90     from     fnd_lookups lkp, jtf_rs_roles_b rol
91     where    rol.role_id = l_role_id
92     and      lkp.lookup_type = 'JTF_RS_ROLE_TYPE'
93     and      lkp.lookup_code = rol.role_type_code;
94 
95     l_role_type_start_date  date;
96     l_role_type_end_date    date;
97     l_new_role_start_date   date;
98     l_new_role_end_date     date;
99 
100 BEGIN
101     x_return_status := fnd_api.g_ret_sts_success;
102 
103     savepoint cr_grp_memship;
104 
105  --Initialize the message List   if P_INIT_MSG_LIST is set to TRUE
106     if fnd_api.tO_BOOLEAN(p_init_msg_list)
107     then
108        fnd_msg_pub.Initialize;
109     end if;
110 
111     open get_resource_dates(p_resource_id);
112     fetch get_resource_dates
113     into  l_resource_start_date,
114           l_resource_end_date,
115           l_resource_name;
116     close get_resource_dates;
117 
118     if (p_role_id is not null) then
119 
120        open role_type_dtl(p_role_id);
121        fetch role_type_dtl
122        into  l_role_type_start_date,
123              l_role_type_end_date;
124        close role_type_dtl;
125 
126     open chk_role_relate(p_role_id,p_resource_id);
127     fetch chk_role_relate
128     into  l_role_relate_id,
129           l_start_date_active,
130           l_end_date_active,
131           l_object_version_number;
132     if chk_role_relate%NOTFOUND
133     then
134 --dbms_output.put_line(' resource id = ' || to_char(p_resource_id));
135 --dbms_output.put_line(' role id = ' || to_char(p_role_id));
136        /* Calling the role relate api's to create resource role relation */
137 
138 /* Added the following if condition to fix bug # 2941784 (suggested by Hari)
139 After deriving the date effectivity for resource role membership,
140 the below condition will look for role type date effectivity also.
141 Resource role membership start date will be the greatest of derived start date and role type start date.
142 Resource role membership end date will be the least of derived end date and role type end date.  */
143 
144        if ( l_role_type_end_date is NULL OR
145              ( trunc(l_role_type_end_date) >= trunc(l_resource_start_date))) then
146 
147           l_new_role_start_date := greatest(l_resource_start_date, l_role_type_start_date);
148 
149           if  (l_resource_end_date is NULL and l_role_type_end_date is NULL) then
150              l_new_role_end_date := l_resource_end_date;
151           elsif (l_resource_end_date is NULL and l_role_type_end_date is NOT NULL) then
152              l_new_role_end_date := l_role_type_end_date;
153           elsif (l_resource_end_date is NOT NULL and l_role_type_end_date is NULL) then
154              l_new_role_end_date := l_resource_end_date;
155           else
156              l_new_role_end_date := least(l_resource_end_date, l_role_type_end_date);
157           end if;
158        else
159           l_new_role_start_date := l_resource_start_date;
160           l_new_role_end_date := l_resource_end_date;
161        end if;
162 
163        jtf_rs_role_relate_pub.create_resource_role_relate
164                    (p_api_version          => 1.0
165                    ,p_init_msg_list        => fnd_api.g_false
166                    ,p_commit               => fnd_api.g_false
167                    ,p_role_resource_type   => 'RS_INDIVIDUAL'
168                    ,p_role_resource_id     => p_resource_id
169                    ,p_role_id              => p_role_id
170                    ,p_role_code            => null
171                    ,p_start_date_active    => l_new_role_start_date
172                    ,p_end_date_active      => l_new_role_end_date
173                    ,x_return_status        => l_return_status
174                    ,x_msg_count            => l_msg_count
175                    ,x_msg_data             => l_msg_data
176                    ,x_role_relate_id       => l_role_relate_id
177                    );
178       if not (l_return_status = fnd_api.g_ret_sts_success) THEN
179          raise fnd_api.g_exc_unexpected_error;
180       end if;
181 
182     else
183 
184     if (p_start_date >= l_start_date_active) and (p_start_date <= nvl(l_end_date_active,p_start_date))
185     then
186        if ((p_end_date > l_end_date_active) or p_end_date is NULL) and (l_end_date_active is NOT NULL)
187        then
188 --          dbms_output.put_line('update the role end date with ' ||to_char(l_resource_end_date));
189 
190 /* Added the following if condition to fix bug # 2941784 (suggested by Hari)
191 After deriving the new end date of resource role membership,
192 the below condition will look for role type date effectivity also.
193 Resource role membership end date will be the least of derived end date and role type end date.  */
194 
195           l_new_role_start_date := l_start_date_active;
196 
197           if  (l_resource_end_date is NULL and l_role_type_end_date is NULL) then
198              l_new_role_end_date := l_resource_end_date;
199           elsif (l_resource_end_date is NULL and l_role_type_end_date is NOT NULL) then
200              l_new_role_end_date := l_role_type_end_date;
201           elsif (l_resource_end_date is NOT NULL and l_role_type_end_date is NULL) then
202              l_new_role_end_date := l_resource_end_date;
203           else
204              l_new_role_end_date := least(l_resource_end_date, l_role_type_end_date);
205           end if;
206 
207           jtf_rs_role_relate_pvt.update_resource_role_relate
208                 (P_API_VERSION          => 1.0,
209                  P_INIT_MSG_LIST        => fnd_api.g_false,
210                  P_COMMIT               => fnd_api.g_false,
211                  P_ROLE_RELATE_ID       => l_role_relate_id,
212                  P_START_DATE_ACTIVE    => l_new_role_start_date,
213                  P_END_DATE_ACTIVE      => l_new_role_end_date,
214                  P_OBJECT_VERSION_NUM   => l_object_version_number,
215                  X_RETURN_STATUS        => l_return_status,
216                  X_MSG_COUNT            => l_msg_count,
217                  X_MSG_DATA             => l_msg_data);
218           if not (l_return_status = fnd_api.g_ret_sts_success) THEN
219               raise fnd_api.g_exc_unexpected_error;
220           end if;
221        else
222 --          dbms_output.put_line('no need to update the role');
223        null;
224        end if;
225     elsif (p_start_date >= l_start_date_active)
226     then
227 --          dbms_output.put_line('update the role end date with ' ||to_char(l_resource_end_date));
228 
229 /* Added the following if condition to fix bug # 2941784 (suggested by Hari)
230 After deriving the end date of resource role membership,
231 the below condition will look for role type date effectivity also.
232 Resource role membership end date will be the least of derived end date and role type end date.  */
233 
234           l_new_role_start_date := l_start_date_active;
235 
236           if  (l_resource_end_date is NULL and l_role_type_end_date is NULL) then
237              l_new_role_end_date := l_resource_end_date;
238           elsif (l_resource_end_date is NULL and l_role_type_end_date is NOT NULL) then
239              l_new_role_end_date := l_role_type_end_date;
240           elsif (l_resource_end_date is NOT NULL and l_role_type_end_date is NULL) then
241              l_new_role_end_date := l_resource_end_date;
242           else
243              l_new_role_end_date := least(l_resource_end_date, l_role_type_end_date);
244           end if;
245 
246           jtf_rs_role_relate_pvt.update_resource_role_relate
247                 (P_API_VERSION          => 1.0,
248                  P_INIT_MSG_LIST        => fnd_api.g_false,
249                  P_COMMIT               => fnd_api.g_false,
250                  P_ROLE_RELATE_ID       => l_role_relate_id,
251                  P_START_DATE_ACTIVE    => l_new_role_start_date,
252                  P_END_DATE_ACTIVE      => l_new_role_end_date,
253                  P_OBJECT_VERSION_NUM   => l_object_version_number,
254                  X_RETURN_STATUS        => l_return_status,
255                  X_MSG_COUNT            => l_msg_count,
256                  X_MSG_DATA             => l_msg_data);
257           if not (l_return_status = fnd_api.g_ret_sts_success) THEN
258               raise fnd_api.g_exc_unexpected_error;
259           end if;
260     elsif (p_start_date < l_start_date_active)
261     then
262        fetch chk_role_relate into l_role_relate_id_old,l_start_date_active,l_end_date_active,l_object_version_number_old;
263        if chk_role_relate%NOTFOUND
264        then
265            l_start_date_active := l_resource_start_date;
266        else
267            l_start_date_active := l_end_date_active+1;
268        end if;
269 --       dbms_output.put_line('update role start date with'|| to_char(l_end_date_active+1) || ' the role end date with'||to_char(l_resource_end_date));
270 
271 /* Added the following if condition to fix bug # 2941784 (suggested by Hari)
272 After deriving the start date and end date resource role membership,
273 the below condition will look for role type date effectivity also.
274 Resource role membership start date will be the greatest of derived start date and role type start date.
275 Resource role membership end date will be the least of derived end date and role type end date.  */
276 
277           if ( l_role_type_end_date is NULL OR
278                 ( trunc(l_role_type_end_date) >= trunc(l_start_date_active))) then
279 
280              l_new_role_start_date := greatest(l_start_date_active, l_role_type_start_date);
281 
282              if  (l_resource_end_date is NULL and l_role_type_end_date is NULL) then
283                 l_new_role_end_date := l_resource_end_date;
284              elsif (l_resource_end_date is NULL and l_role_type_end_date is NOT NULL) then
285                 l_new_role_end_date := l_role_type_end_date;
286              elsif (l_resource_end_date is NOT NULL and l_role_type_end_date is NULL) then
287                 l_new_role_end_date := l_resource_end_date;
288              else
289                 l_new_role_end_date := least(l_resource_end_date, l_role_type_end_date);
290              end if;
291           else
292              l_new_role_start_date := l_start_date_active;
293              l_new_role_end_date := l_resource_end_date;
294           end if;
295 
296           jtf_rs_role_relate_pvt.update_resource_role_relate
297                 (P_API_VERSION          => 1.0,
298                  P_INIT_MSG_LIST        => fnd_api.g_false,
299                  P_COMMIT               => fnd_api.g_false,
300                  P_ROLE_RELATE_ID       => l_role_relate_id,
301                  P_START_DATE_ACTIVE    => l_new_role_start_date,
302                  P_END_DATE_ACTIVE      => l_new_role_end_date,
303                  P_OBJECT_VERSION_NUM   => l_object_version_number,
304                  X_RETURN_STATUS        => l_return_status,
305                  X_MSG_COUNT            => l_msg_count,
306                  X_MSG_DATA             => l_msg_data);
307           if not (l_return_status = fnd_api.g_ret_sts_success) THEN
308               raise fnd_api.g_exc_unexpected_error;
309           end if;
310 
311     end if;
312 
313     end if;
314 
315     close chk_role_relate;
316     end if;
317 --dbms_output.put_line(' resource role_relate id = ' || to_char(l_role_relate_id));
318 
319     open  check_group_member_exists(p_group_id, p_resource_id);
320     fetch check_group_member_exists
321     into  l_group_member_id;
322     if check_group_member_exists%NOTFOUND
323     then
324 
325         jtf_rs_group_members_pub.create_resource_group_members
326                    (p_api_version          => 1.0
327                    ,p_init_msg_list        => fnd_api.g_false
328                    ,p_commit               => fnd_api.g_false
329                    ,p_group_id             => p_group_id
330                    ,p_group_number         => null
331                    ,p_resource_id          => p_resource_id
332                    ,p_resource_number      => null
333                    ,x_return_status        => l_return_status
334                    ,x_msg_count            => l_msg_count
335                    ,x_msg_data             => l_msg_data
336                    ,x_group_member_id      => l_group_member_id
337                   );
338 
339         if not (l_return_status = fnd_api.g_ret_sts_success) THEN
340            raise fnd_api.g_exc_unexpected_error;
341         end if;
342      else
343          if (p_role_id is null) then
344             open get_group_name(p_group_id);
345             fetch get_group_name
346             into  l_group_name;
347             close get_group_name;
348 
349 --   hk_debug_proc(l_resource_name ||' is already a member of '||l_group_name);
350 
351             fnd_message.set_name('JTF', 'JTF_RS_RESOURCE_EXISTS_GROUP');
352             fnd_message.set_token('P_RESOURCE',l_resource_name);
353             fnd_message.set_token('P_GROUP',l_group_name);
354             fnd_msg_pub.add;
355             RAISE fnd_api.g_exc_unexpected_error;
356 
357          end if;
358      end if;
359 --dbms_output.put_line('group_member_id id = ' || to_char(l_group_member_id));
360 
361        /* Calling the role relate api's to create resource role relation */
362     if (p_role_id is not null) then
363     jtf_rs_role_relate_pub.create_resource_role_relate
364                   (p_api_version          => 1.0
365                   ,p_init_msg_list        => fnd_api.g_false
366                   ,p_commit               => fnd_api.g_false
367                   ,p_role_resource_type   => 'RS_GROUP_MEMBER'
368                   ,p_role_resource_id     => l_group_member_id
369                   ,p_role_id              => p_role_id
370                   ,p_role_code            => null
371                   ,p_start_date_active    => p_start_date
372                   ,p_end_date_active      => p_end_date
373                   ,x_return_status        => l_return_status
374                   ,x_msg_count            => l_msg_count
375                   ,x_msg_data             => l_msg_data
376                   ,x_role_relate_id       => l_role_relate_id
377                   );
378 
379     if not (l_return_status = fnd_api.g_ret_sts_success) THEN
380        raise fnd_api.g_exc_unexpected_error;
381     end if;
382     end if;
383 
384 --dbms_output.put_line(' group role_relate id = ' || to_char(l_role_relate_id));
385 
386     if fnd_api.to_boolean(p_commit)
387     then
388        commit work;
389     end if;
390 
391  fnd_msg_pub.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
392 
393  exception
394     when fnd_api.g_exc_unexpected_error
395     then
396       rollback to cr_grp_memship;
397       x_return_status := fnd_api.g_ret_sts_error;
398       fnd_msg_pub.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
399     WHEN fnd_api.g_exc_error
400     THEN
401       ROLLBACK TO cr_grp_memship;
402       x_return_status := fnd_api.g_ret_sts_error;
403       FND_MSG_PUB.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
404     when others
405     then
406       rollback to cr_grp_memship;
407       fnd_message.set_name ('JTF', 'JTF_RS_UNEXP_ERROR');
408       fnd_message.set_token('P_SQLCODE',SQLCODE);
409       fnd_message.set_token('P_SQLERRM',SQLERRM);
410       fnd_message.set_token('P_API_NAME',l_api_name);
411       FND_MSG_PUB.add;
412       x_return_status := fnd_api.g_ret_sts_unexp_error;
413       fnd_msg_pub.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
414 
415 END create_group_membership;
416 
417 PROCEDURE update_group_membership
418  (P_API_VERSION           IN   NUMBER,
419    P_INIT_MSG_LIST        IN   VARCHAR2   DEFAULT  FND_API.G_FALSE,
420    P_COMMIT               IN   VARCHAR2   DEFAULT  FND_API.G_FALSE,
421    P_RESOURCE_ID          IN   NUMBER,
422    P_ROLE_ID              IN   NUMBER,
423    P_ROLE_RELATE_ID       IN   NUMBER,
424    P_START_DATE           IN   DATE DEFAULT  FND_API.G_MISS_DATE,
425    P_END_DATE             IN   DATE DEFAULT  FND_API.G_MISS_DATE,
426    P_OBJECT_VERSION_NUM   IN   NUMBER,
427    X_RETURN_STATUS        OUT NOCOPY VARCHAR2,
428    X_MSG_COUNT            OUT NOCOPY NUMBER,
429    X_MSG_DATA             OUT NOCOPY VARCHAR2
430   ) IS
431 
432     l_api_version         constant number := 1.0;
433     l_api_name            constant varchar2(30) := 'UPDATE_GROUP_MEMBERSHIP';
434     l_return_status       varchar2(100) := fnd_api.g_ret_sts_success;
435     l_msg_count           number;
436     l_msg_data            varchar2(2000);
437     l_object_version_num  number := p_object_version_num;
438 
439     /* Out Parameters  for Create Role Relation*/
440 
441     l_role_relate_id         number;
442     l_role_relate_id_old     number;
443     l_object_version_number  number;
444     l_object_version_number_old  number;
445     l_start_date_active      date;
446     l_end_date_active        date;
447     l_resource_start_date    date;
448     l_resource_end_date      date;
449 
450     /* Cursor  Variables to get role realtions */
451 
452     cursor chk_role_relate(l_role_id number, l_resource_id number)
453     is
454     select   role_relate_id,start_date_active,end_date_active,object_version_number
455     from     jtf_rs_role_relations
456     where    role_id = l_role_id
457     and      role_resource_id = l_resource_id
458     and      role_resource_type = 'RS_INDIVIDUAL'
459     and      nvl(delete_flag, 'N') <> 'Y'
460     order by start_date_active desc;
461 
462     cursor get_resource_dates(l_resource_id number)
463     is
464     select   start_date_active,
465              end_date_active
466     from     jtf_rs_resource_extns
467     where    resource_id = l_resource_id;
468 
469     cursor role_type_dtl(l_role_id number)
470     is
471     select   trunc(lkp.start_date_active),
472              trunc(lkp.end_date_active)
473     from     fnd_lookups lkp, jtf_rs_roles_b rol
474     where    rol.role_id = l_role_id
475     and      lkp.lookup_type = 'JTF_RS_ROLE_TYPE'
476     and      lkp.lookup_code = rol.role_type_code;
477 
478     l_role_type_start_date  date;
479     l_role_type_end_date    date;
480     l_new_role_start_date   date;
481     l_new_role_end_date     date;
482 
483 BEGIN
484     x_return_status := fnd_api.g_ret_sts_success;
485 
486     savepoint upd_grp_memship;
487 
488  --Initialize the message List   if P_INIT_MSG_LIST is set to TRUE
489     if fnd_api.tO_BOOLEAN(p_init_msg_list)
490     then
491        fnd_msg_pub.Initialize;
492     end if;
493 
494     open get_resource_dates(p_resource_id);
495     fetch get_resource_dates
496     into  l_resource_start_date,
497           l_resource_end_date;
498     close get_resource_dates;
499 
500     open role_type_dtl(p_role_id);
501     fetch role_type_dtl
502     into  l_role_type_start_date,
503           l_role_type_end_date;
504     close role_type_dtl;
505 
506     open chk_role_relate(p_role_id,p_resource_id);
507     fetch chk_role_relate
508     into  l_role_relate_id,
509           l_start_date_active,
510           l_end_date_active,
511           l_object_version_number;
512 
513     if (p_start_date >= l_start_date_active) and (p_start_date <= nvl(l_end_date_active,p_start_date))
514     then
515        if (p_end_date > l_end_date_active) and (l_end_date_active is NOT NULL)
516        then
517 --          dbms_output.put_line('update the role end date with ' ||to_char(l_resource_end_date));
518 
519 /* Added the following if condition to fix bug # 2941784 (suggested by Hari)
520 After deriving the end date of resource role membership,
521 the below condition will look for role type date effectivity also.
522 Resource role membership end date will be the least of derived end date and role type end date.  */
523 
524           l_new_role_start_date := l_start_date_active;
525 
526           if  (l_resource_end_date is NULL and l_role_type_end_date is NULL) then
527              l_new_role_end_date := l_resource_end_date;
528           elsif (l_resource_end_date is NULL and l_role_type_end_date is NOT NULL) then
529              l_new_role_end_date := l_role_type_end_date;
530           elsif (l_resource_end_date is NOT NULL and l_role_type_end_date is NULL) then
531              l_new_role_end_date := l_resource_end_date;
532           else
533              l_new_role_end_date := least(l_resource_end_date, l_role_type_end_date);
534           end if;
535 
536           jtf_rs_role_relate_pub.update_resource_role_relate
537                 (P_API_VERSION          => 1.0,
538                  P_INIT_MSG_LIST        => fnd_api.g_false,
539                  P_COMMIT               => fnd_api.g_false,
540                  P_ROLE_RELATE_ID       => l_role_relate_id,
541                  P_START_DATE_ACTIVE    => l_new_role_start_date,
542                  P_END_DATE_ACTIVE      => l_new_role_end_date,
543                  P_OBJECT_VERSION_NUM   => l_object_version_number,
544                  X_RETURN_STATUS        => l_return_status,
545                  X_MSG_COUNT            => l_msg_count,
546                  X_MSG_DATA             => l_msg_data);
547           if not (l_return_status = fnd_api.g_ret_sts_success) THEN
548               raise fnd_api.g_exc_unexpected_error;
549           end if;
550        else
551 --          dbms_output.put_line('no need to update the role');
552        null;
553        end if;
554     elsif (p_start_date >= l_start_date_active)
555     then
556 --          dbms_output.put_line('update the role end date with ' ||to_char(l_resource_end_date));
557 
558 /* Added the following if condition to fix bug # 2941784 (suggested by Hari)
559 After deriving the end date of resource role membership,
560 the below condition will look for role type date effectivity also.
561 Resource role membership end date will be the least of derived end date and role type end date.  */
562 
563           l_new_role_start_date := l_start_date_active;
564 
565           if  (l_resource_end_date is NULL and l_role_type_end_date is NULL) then
566              l_new_role_end_date := l_resource_end_date;
567           elsif (l_resource_end_date is NULL and l_role_type_end_date is NOT NULL) then
568              l_new_role_end_date := l_role_type_end_date;
569           elsif (l_resource_end_date is NOT NULL and l_role_type_end_date is NULL) then
570              l_new_role_end_date := l_resource_end_date;
571           else
572              l_new_role_end_date := least(l_resource_end_date, l_role_type_end_date);
573           end if;
574 
575           jtf_rs_role_relate_pub.update_resource_role_relate
576                 (P_API_VERSION          => 1.0,
577                  P_INIT_MSG_LIST        => fnd_api.g_false,
578                  P_COMMIT               => fnd_api.g_false,
579                  P_ROLE_RELATE_ID       => l_role_relate_id,
580                  P_START_DATE_ACTIVE    => l_new_role_start_date,
581                  P_END_DATE_ACTIVE      => l_new_role_end_date,
582                  P_OBJECT_VERSION_NUM   => l_object_version_number,
583                  X_RETURN_STATUS        => l_return_status,
584                  X_MSG_COUNT            => l_msg_count,
585                  X_MSG_DATA             => l_msg_data);
586           if not (l_return_status = fnd_api.g_ret_sts_success) THEN
587               raise fnd_api.g_exc_unexpected_error;
588           end if;
589     elsif (p_start_date < l_start_date_active)
590     then
591        fetch chk_role_relate into l_role_relate_id_old,l_start_date_active,l_end_date_active,l_object_version_number_old;
592        if chk_role_relate%NOTFOUND
593        then
594            l_start_date_active := l_resource_start_date;
595        else
596            l_start_date_active := l_end_date_active+1;
597        end if;
598 --       dbms_output.put_line('update role start date with'|| to_char(l_end_date_active+1) || ' the role end date with'||to_char(l_resource_end_date));
599 
600 /* Added the following if condition to fix bug # 2941784 (suggested by Hari)
601 After deriving the start date and end date of resource role membership,
602 the below condition will look for role type date effectivity also.
603 Resource role membership start date will be the greatest of derived start date and role type start date.
604 Resource role membership end date will be the least of derived end date and role type end date.  */
605 
606           if ( l_role_type_end_date is NULL OR
607                 ( trunc(l_role_type_end_date) >= trunc(l_start_date_active))) then
608 
609              l_new_role_start_date := greatest(l_start_date_active, l_role_type_start_date);
610 
611              if  (l_resource_end_date is NULL and l_role_type_end_date is NULL) then
612                 l_new_role_end_date := l_resource_end_date;
613              elsif (l_resource_end_date is NULL and l_role_type_end_date is NOT NULL) then
614                 l_new_role_end_date := l_role_type_end_date;
615              elsif (l_resource_end_date is NOT NULL and l_role_type_end_date is NULL) then
616                 l_new_role_end_date := l_resource_end_date;
617              else
618                 l_new_role_end_date := least(l_resource_end_date, l_role_type_end_date);
619              end if;
620           else
621              l_new_role_start_date := l_start_date_active;
622              l_new_role_end_date := l_resource_end_date;
623           end if;
624 
625           jtf_rs_role_relate_pub.update_resource_role_relate
626                 (P_API_VERSION          => 1.0,
627                  P_INIT_MSG_LIST        => fnd_api.g_false,
628                  P_COMMIT               => fnd_api.g_false,
629                  P_ROLE_RELATE_ID       => l_role_relate_id,
630                  P_START_DATE_ACTIVE    => l_new_role_start_date,
631                  P_END_DATE_ACTIVE      => l_new_role_end_date,
632                  P_OBJECT_VERSION_NUM   => l_object_version_number,
633                  X_RETURN_STATUS        => l_return_status,
634                  X_MSG_COUNT            => l_msg_count,
635                  X_MSG_DATA             => l_msg_data);
636           if not (l_return_status = fnd_api.g_ret_sts_success) THEN
637               raise fnd_api.g_exc_unexpected_error;
638           end if;
639 
640     end if;
641 
642     close chk_role_relate;
643 
644 --dbms_output.put_line(' resource role_relate id = ' || to_char(l_role_relate_id));
645 
646        /* Calling the role relate api's to create resource role relation */
647 
648     jtf_rs_role_relate_pub.update_resource_role_relate
649                   (p_api_version          => 1.0
650                   ,p_init_msg_list        => fnd_api.g_false
651                   ,p_commit               => fnd_api.g_false
652                   ,p_role_relate_id       => p_role_relate_id
653                   ,p_start_date_active    => p_start_date
654                   ,p_end_date_active      => p_end_date
655                   ,p_object_version_num   => l_object_version_num
656                   ,x_return_status        => l_return_status
657                   ,x_msg_count            => l_msg_count
658                   ,x_msg_data             => l_msg_data
659                   );
660 
661     if not (l_return_status = fnd_api.g_ret_sts_success) THEN
662        raise fnd_api.g_exc_unexpected_error;
663     end if;
664 
665 --dbms_output.put_line(' group role_relate id = ' || to_char(l_role_relate_id));
666 
667     if fnd_api.to_boolean(p_commit)
668     then
669        commit work;
670     end if;
671 
672  fnd_msg_pub.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
673 
674  exception
675     when fnd_api.g_exc_unexpected_error
676     then
677       rollback to upd_grp_memship;
678       x_return_status := fnd_api.g_ret_sts_error;
679       fnd_msg_pub.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
680     WHEN fnd_api.g_exc_error
681     THEN
682       ROLLBACK TO upd_grp_memship;
683       x_return_status := fnd_api.g_ret_sts_error;
684       FND_MSG_PUB.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
685     when others
686     then
687       rollback to upd_grp_memship;
688       fnd_message.set_name ('JTF', 'JTF_RS_UNEXP_ERROR');
689       fnd_message.set_token('P_SQLCODE',SQLCODE);
690       fnd_message.set_token('P_SQLERRM',SQLERRM);
691       fnd_message.set_token('P_API_NAME',l_api_name);
692       FND_MSG_PUB.add;
693       x_return_status := fnd_api.g_ret_sts_unexp_error;
694       fnd_msg_pub.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
695 
696 END update_group_membership;
697 
698 PROCEDURE delete_group_membership
699  (P_API_VERSION           IN   NUMBER,
700    P_INIT_MSG_LIST        IN   VARCHAR2   DEFAULT  FND_API.G_FALSE,
701    P_COMMIT               IN   VARCHAR2   DEFAULT  FND_API.G_FALSE,
702    P_GROUP_ID             IN   NUMBER,
703    P_RESOURCE_ID          IN   NUMBER,
704    P_GROUP_MEMBER_ID      IN   NUMBER,
705    P_ROLE_RELATE_ID       IN   NUMBER,
706    P_OBJECT_VERSION_NUM   IN   NUMBER,
707    X_RETURN_STATUS        OUT NOCOPY VARCHAR2,
708    X_MSG_COUNT            OUT NOCOPY NUMBER,
709    X_MSG_DATA             OUT NOCOPY VARCHAR2
710   ) IS
711 
712     l_api_version         constant number := 1.0;
713     l_api_name            constant varchar2(30) := 'DELETE_GROUP_MEMBERSHIP';
714     l_return_status       varchar2(100) := fnd_api.g_ret_sts_success;
715     l_msg_count           number;
716     l_msg_data            varchar2(2000);
717 
718     /* Cursor  Variables to check group member has to be deleted or not */
719 
720     cursor group_member_exists(l_group_member_id number)
721     is
722     select   role_relate_id
723     from     jtf_rs_role_relations
724     where    role_resource_id = l_group_member_id
725     and      role_resource_type = 'RS_GROUP_MEMBER'
726     and      nvl(delete_flag, 'N') <> 'Y';
727 
728     l_role_relete_id  jtf_rs_role_relations.role_relate_id%type;
729 
730     /* Cursor  Variables to get object_version_number for group member */
731 
732     cursor get_obj_ver_num(l_group_member_id number)
733     is
734     select   object_version_number
735     from     jtf_rs_group_members
736     where    group_member_id = l_group_member_id;
737 
738     l_object_version_num  jtf_rs_role_relations.object_version_number%type;
739 
740 BEGIN
741 
742     x_return_status := fnd_api.g_ret_sts_success;
743 
744     savepoint del_grp_memship;
745 
746   --Initialize the message List   if P_INIT_MSG_LIST is set to TRUE
747 
748     if fnd_api.tO_BOOLEAN(p_init_msg_list)
749     then
750        fnd_msg_pub.Initialize;
751     end if;
752 
753     if (p_role_relate_id is not null) then
754          jtf_rs_role_relate_pub.delete_resource_role_relate
755                (P_API_VERSION          => 1.0,
756                 P_INIT_MSG_LIST        => fnd_api.g_false,
757                 P_COMMIT               => fnd_api.g_false,
758                 P_ROLE_RELATE_ID       => p_role_relate_id,
759                 P_OBJECT_VERSION_NUM   => p_object_version_num,
760                 X_RETURN_STATUS        => l_return_status,
761                 X_MSG_COUNT            => l_msg_count,
762                 X_MSG_DATA             => l_msg_data);
763          if not (l_return_status = fnd_api.g_ret_sts_success) THEN
764              raise fnd_api.g_exc_unexpected_error;
765          end if;
766     else
767 --        open group_member_exists(p_group_member_id);
768 --        fetch group_member_exists
769 --        into  l_role_relete_id;
770 --        if group_member_exists%NOTFOUND
771 --        then
772 
773            open get_obj_ver_num(p_group_member_id);
774            fetch get_obj_ver_num
775            into  l_object_version_num;
776            close get_obj_ver_num;
777 
778            jtf_rs_group_members_pub.delete_resource_group_members
779                (P_API_VERSION          => 1.0,
780                 P_INIT_MSG_LIST        => fnd_api.g_false,
781                 P_COMMIT               => fnd_api.g_false,
782                 P_GROUP_ID             => p_group_id,
783                 P_GROUP_NUMBER         => null,
784                 P_RESOURCE_ID          => p_resource_id,
785                 P_RESOURCE_NUMBER      => null,
786                 P_OBJECT_VERSION_NUM   => l_object_version_num,
787                 X_RETURN_STATUS        => l_return_status,
788                 X_MSG_COUNT            => l_msg_count,
789                 X_MSG_DATA             => l_msg_data);
790 
791            if not (l_return_status = fnd_api.g_ret_sts_success) THEN
792               raise fnd_api.g_exc_unexpected_error;
793            end if;
794 --        end if;
795 --        close group_member_exists;
796     end if;
797 
798      if fnd_api.to_boolean(p_commit)
799      then
800        commit work;
801      end if;
802 
803     fnd_msg_pub.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
804 
805     exception
806        when fnd_api.g_exc_unexpected_error
807        then
808          rollback to del_grp_memship;
809          x_return_status := fnd_api.g_ret_sts_error;
810          fnd_msg_pub.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
811        WHEN fnd_api.g_exc_error
812        THEN
813          ROLLBACK TO del_grp_memship;
814          x_return_status := fnd_api.g_ret_sts_error;
815          FND_MSG_PUB.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
816        when others
817        then
818          rollback to del_grp_memship;
819          fnd_message.set_name ('JTF', 'JTF_RS_UNEXP_ERROR');
820          fnd_message.set_token('P_SQLCODE',SQLCODE);
821          fnd_message.set_token('P_SQLERRM',SQLERRM);
822          fnd_message.set_token('P_API_NAME',l_api_name);
823          FND_MSG_PUB.add;
824          x_return_status := fnd_api.g_ret_sts_unexp_error;
825          fnd_msg_pub.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
826 
827 END delete_group_membership;
828 
829 END jtf_rs_grp_membership_pub;