DBA Data[Home] [Help]

PACKAGE BODY: APPS.AMS_ACCESS_DENORM_PVT

Source


1 PACKAGE BODY AMS_access_denorm_PVT AS
2  /* $Header: amsvdenb.pls 115.13 2004/06/16 10:49:19 vmodur ship $ */
3  g_pkg_name   CONSTANT VARCHAR2(30):='AMS_access_denorm_PVT';
4 AMS_DEBUG_HIGH_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_HIGH);
5 AMS_DEBUG_LOW_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW);
6 AMS_DEBUG_MEDIUM_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_MEDIUM);
7 
8 /* sunkumar: 02-10-03 overloaded insert resource to error_message also */
9 
10 PROCEDURE insert_resource( p_resource_id    IN  NUMBER
11                           , p_object_type    IN  VARCHAR2
12                           , p_object_id      IN  NUMBER
13                           , p_edit_metrics   IN  VARCHAR2
14                           , x_return_status  OUT NOCOPY VARCHAR2
15 			  , x_msg_count      OUT NOCOPY NUMBER
16                           , x_msg_data       OUT NOCOPY VARCHAR2
17                           )
18 IS
19 
20 l_api_name    CONSTANT VARCHAR2(30) := 'insert_resource';
21 
22 BEGIN
23 
24   insert_resource( p_resource_id    =>  p_resource_id
25                    , p_object_type    =>  p_object_type
26                    , p_object_id      =>  p_object_id
27                    , p_edit_metrics   =>  p_edit_metrics
28 		   );
29 
30   x_return_status := FND_API.G_RET_STS_SUCCESS;
31 
32 EXCEPTION
33     WHEN OTHERS THEN
34           x_return_status := FND_API.g_ret_sts_unexp_error ;
35           IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.g_msg_lvl_unexp_error)
36           THEN
37              FND_MSG_PUB.add_exc_msg (g_pkg_name, l_api_name);
38           END IF;
39           FND_MSG_PUB.count_and_get (
40             p_encoded => FND_API.g_false,
41             p_count   => x_msg_count,
42             p_data    => x_msg_data
43           );
44 
45 END;
46 
47 
48 
49 PROCEDURE insert_resource( p_resource_id    IN  NUMBER
50                           , p_object_type    IN  VARCHAR2
51                           , p_object_id      IN  NUMBER
52                           , p_edit_metrics   IN  VARCHAR2
53                           , x_return_status  OUT NOCOPY VARCHAR2
54                           )
55 IS
56 BEGIN
57 
58   insert_resource( p_resource_id    =>  p_resource_id
59                    , p_object_type    =>  p_object_type
60                    , p_object_id      =>  p_object_id
61                    , p_edit_metrics   =>  p_edit_metrics
62                    );
63 
64   x_return_status := FND_API.G_RET_STS_SUCCESS;
65 
66 EXCEPTION
67   WHEN OTHERS THEN
68     x_return_status := FND_API.G_RET_STS_ERROR;
69 END;
70 
71 
72 
73 /* sunkumar: 02-10-03 overloaded update resource to add error_message also */
74 PROCEDURE update_resource( p_resource_id    IN  NUMBER
75                           , p_object_type    IN  VARCHAR2
76                           , p_object_id      IN  NUMBER
77                           , p_edit_metrics   IN  VARCHAR2
78                           , x_return_status  OUT NOCOPY VARCHAR2
79 			  , x_msg_count      OUT NOCOPY NUMBER
80                           , x_msg_data       OUT NOCOPY VARCHAR2
81                           )
82 IS
83 
84 l_api_name    CONSTANT VARCHAR2(30) := 'update_resource';
85 
86 BEGIN
87 
88     update_resource( p_resource_id    =>  p_resource_id
89                    , p_object_type    =>  p_object_type
90                    , p_object_id      =>  p_object_id
91                    , p_edit_metrics   =>  p_edit_metrics
92 		   );
93 
94   x_return_status := FND_API.G_RET_STS_SUCCESS;
95 
96 EXCEPTION
97     WHEN OTHERS THEN
98           x_return_status := FND_API.g_ret_sts_unexp_error ;
99           IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.g_msg_lvl_unexp_error)
100           THEN
101              FND_MSG_PUB.add_exc_msg (g_pkg_name, l_api_name);
102           END IF;
103           FND_MSG_PUB.count_and_get (
104             p_encoded => FND_API.g_false,
105             p_count   => x_msg_count,
106             p_data    => x_msg_data
107           );
108 
109 END;
110 
111 
112 PROCEDURE update_resource( p_resource_id    IN  NUMBER
113                           , p_object_type    IN  VARCHAR2
114                           , p_object_id      IN  NUMBER
115                           , p_edit_metrics   IN  VARCHAR2
116                           , x_return_status  OUT NOCOPY VARCHAR2
117                           )
118 IS
119 BEGIN
120 
121   update_resource( p_resource_id    =>  p_resource_id
122                   , p_object_type    =>  p_object_type
123                   , p_object_id      =>  p_object_id
124                   , p_edit_metrics   =>  p_edit_metrics
125                   );
126 
127   x_return_status := FND_API.G_RET_STS_SUCCESS;
128 
129 EXCEPTION
130   WHEN OTHERS THEN
131     x_return_status := FND_API.G_RET_STS_ERROR;
132 END;
133 
134 
135 /* sunkumar: 02-10-03 overloaded delete resource to add error_message also */
136 PROCEDURE  delete_resource( p_resource_id    IN  NUMBER
137                           , p_object_type    IN  VARCHAR2
138                           , p_object_id      IN  NUMBER
139                           , p_edit_metrics   IN  VARCHAR2
140                           , x_return_status  OUT NOCOPY VARCHAR2
141 			  , x_msg_count      OUT NOCOPY NUMBER
142                           , x_msg_data       OUT NOCOPY VARCHAR2
143                           )
144 IS
145 
146 l_api_name    CONSTANT VARCHAR2(30) := 'delete_resource';
147 
148 BEGIN
149 
150     delete_resource( p_resource_id    =>  p_resource_id
151                    , p_object_type    =>  p_object_type
152                    , p_object_id      =>  p_object_id
153                    , p_edit_metrics   =>  p_edit_metrics
154 		   );
155 
156   x_return_status := FND_API.G_RET_STS_SUCCESS;
157 
158 EXCEPTION
159     WHEN OTHERS THEN
160           x_return_status := FND_API.g_ret_sts_unexp_error ;
161           IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.g_msg_lvl_unexp_error)
162           THEN
163              FND_MSG_PUB.add_exc_msg (g_pkg_name, l_api_name);
164           END IF;
165           FND_MSG_PUB.count_and_get (
166             p_encoded => FND_API.g_false,
167             p_count   => x_msg_count,
168             p_data    => x_msg_data
169           );
170 
171 END;
172 
173 
174 PROCEDURE delete_resource( p_resource_id    IN  NUMBER
175                           , p_object_type    IN  VARCHAR2
176                           , p_object_id      IN  NUMBER
177                           , p_edit_metrics   IN  VARCHAR2
178                           , x_return_status  OUT NOCOPY VARCHAR2
179                           )
180 IS
181 BEGIN
182 
183   delete_resource( p_resource_id    =>  p_resource_id
184                    , p_object_type    =>  p_object_type
185                    , p_object_id      =>  p_object_id
186                    , p_edit_metrics   =>  p_edit_metrics
187                    );
188 
189   x_return_status := FND_API.G_RET_STS_SUCCESS;
190 EXCEPTION
191   WHEN OTHERS THEN
192     x_return_status := FND_API.G_RET_STS_ERROR;
193 END;
194 
195 PROCEDURE insert_resource( p_resource_id     IN  NUMBER
196                          , p_object_type     IN  VARCHAR2
197                          , p_object_id       IN  NUMBER
198                          , p_edit_metrics    IN  VARCHAR2
199                          )
200 IS
201   l_user_id NUMBER := fnd_global.user_id;
202   l_login_id NUMBER := fnd_global.conc_login_id;
203   l_sysdate DATE := SYSDATE;
204 BEGIN
205 
206   INSERT INTO ams_act_access_denorm
207          (  access_denorm_id
208           , resource_id
209           , edit_metrics_yn
210           , object_type
211           , object_id
212           , source_code
213           , creation_date
214           , created_by
215           , last_update_date
216           , last_updated_by
217           , last_update_login
218           )
219     SELECT  ams_act_access_denorm_s.nextval
220           , p_resource_id
221           , p_edit_metrics
222           , p_object_type
223           , p_object_id
224           , ams_access_pvt.get_source_code(p_object_type,p_object_id)
225           , l_sysdate
226           , l_user_id
227           , l_sysdate
228           , l_user_id
229           , l_login_id
230     FROM dual
231     WHERE NOT EXISTS (  SELECT 1
235                           AND object_id   = p_object_id
232                         FROM ams_act_access_denorm
233                         WHERE resource_id = p_resource_id
234                           AND object_type = p_object_type
236                       );
237 
238   IF SQL%NOTFOUND THEN
239     IF p_edit_metrics = 'Y' THEN
240       UPDATE ams_act_access_denorm
241         SET edit_metrics_yn = p_edit_metrics,
242           last_updated_by = l_user_id,
243           last_update_date = l_sysdate,
244           last_update_login = l_login_id
245       WHERE object_type = p_object_type
246         AND object_id   = p_object_id
247         AND resource_id = p_resource_id
248         AND edit_metrics_yn = 'N' ;
249     END IF;
250   END IF;
251 END insert_resource;
252 
253 
254 PROCEDURE update_resource( p_resource_id     IN  NUMBER
255                          , p_object_type     IN  VARCHAR2
256                          , p_object_id       IN  NUMBER
257                          , p_edit_metrics    IN  VARCHAR2
258                          )
259 IS
260   l_user_id NUMBER := fnd_global.user_id;
261   l_login_id NUMBER := fnd_global.conc_login_id;
262   l_sysdate DATE := SYSDATE;
263 
264   CURSOR what_is_edit_metrics(  c_resource_id IN NUMBER
265                               , c_object_type IN VARCHAR2
266                               , c_object_id IN NUMBER
267                             )
268   IS
269     SELECT edit_metrics_yn
270     FROM ams_act_access_denorm
271     WHERE object_type = p_object_type
272       AND object_id   = p_object_id
273       AND resource_id = p_resource_id;
274 
275 l_edit_metrics VARCHAR2(1);
276 
277 BEGIN
278 
279 IF p_edit_metrics = 'Y' THEN
280 
281  UPDATE ams_act_access_denorm
282     SET edit_metrics_yn = p_edit_metrics
283       , last_updated_by = l_user_id
284       , last_update_date = l_sysdate
285       , last_update_login = l_login_id
286   WHERE object_type = p_object_type
287     AND object_id   = p_object_id
288     AND resource_id = p_resource_id
289     AND edit_metrics_yn = 'N';
290 
291 ELSIF p_edit_metrics = 'N' THEN
292 
293   OPEN what_is_edit_metrics( p_resource_id
294                            , p_object_type
295                            , p_object_id);
296   FETCH what_is_edit_metrics INTO l_edit_metrics;
297   CLOSE what_is_edit_metrics;
298 
299  IF l_edit_metrics <> 'N' THEN
300 
301  UPDATE ams_act_access_denorm aacd
302     SET edit_metrics_yn = p_edit_metrics
303     , last_updated_by = l_user_id
304     , last_update_date = l_sysdate
305     , last_update_login = l_login_id
306   WHERE object_type = p_object_type
307     AND object_id   = p_object_id
308     AND resource_id = p_resource_id
309     AND edit_metrics_yn = 'Y'
310     AND not exists ( SELECT 1
311                      FROM ams_act_access aac,
312                           jtf_rs_groups_denorm jgd,
313                           jtf_rs_group_members jgm
314                      WHERE aac.arc_act_access_to_object = p_object_type
315                        AND aac.act_access_to_object_id   = p_object_id
316                        AND arc_user_or_role_type = 'GROUP'
317                        AND user_or_role_id = jgd.parent_group_id
318                        AND jgd.group_id  = jgm.group_id
319                        AND jgd.start_date_active <= TRUNC(SYSDATE)
320                        AND NVL(jgd.end_date_active,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)
324                        AND aac.admin_flag='Y' );
321                        AND jgm.delete_flag='N'
322                        AND jgm.resource_id = aacd.resource_id
323                        AND aac.delete_flag = 'N'
325   END IF;
326 
327  END IF;
328 
329 END;
330 
331 PROCEDURE delete_resource( p_resource_id     IN  NUMBER
332                           , p_object_type     IN  VARCHAR2
333                           , p_object_id       IN  NUMBER
334                           , p_edit_metrics    IN  VARCHAR2
335                           )
336   IS
337   l_user_id NUMBER := fnd_global.user_id;
338   l_login_id NUMBER := fnd_global.conc_login_id;
339   l_sysdate DATE := SYSDATE;
340 
341 BEGIN
342 
343   DELETE FROM  AMS_ACT_ACCESS_DENORM aacd
344   WHERE resource_id = p_resource_id
345     AND object_type = p_object_type
346     AND object_id   = p_object_id
347     AND not exists (   SELECT 1
348                      FROM ams_act_access aac,
349                           jtf_rs_groups_denorm jgd,
350                           jtf_rs_group_members jgm            -- INtroduce soft DELETE flag FOR resources.
351                      WHERE aac.arc_act_access_to_object = p_object_type
352                        AND aac.act_access_to_object_id   = p_object_id
353                        AND arc_user_or_role_type = 'GROUP'
354                        AND user_or_role_id = jgd.parent_group_id
355                        AND jgd.group_id  = jgm.group_id
356                        AND jgd.start_date_active <= TRUNC(SYSDATE)
357                        AND NVL(jgd.end_date_active,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)
358                        AND jgm.resource_id = p_resource_id
359                        AND jgm.delete_flag = 'N'
360                        AND aac.delete_flag = 'N'
361                     UNION ALL
362                        SELECT 1
363                          FROM ams_act_access
364                         WHERE arc_act_access_to_object = p_object_type
365                           AND act_access_to_object_id = p_object_id
366                           AND arc_user_or_role_type = 'USER'
367                           AND user_or_role_id   =  aacd.resource_id
368                     );
369 
370 
371   IF p_edit_metrics = 'Y' THEN
372     UPDATE ams_act_access_denorm  aacd
373        SET edit_metrics_yn = 'N'
374         , last_updated_by = l_user_id
375         , last_update_date = l_sysdate
376         , last_update_login = l_login_id
377      WHERE object_type = p_object_type
378        AND object_id   = p_object_id
379        AND resource_id = p_resource_id
380        AND resource_id not IN (SELECT jgm.resource_id
381                                 FROM ams_act_access aac,
382                                      jtf_rs_groups_denorm jgd,
383                                      jtf_rs_group_members jgm
384                                WHERE aac.arc_act_access_to_object = p_object_type
385                                  AND aac.act_access_to_object_id   = p_object_id
386                                  AND arc_user_or_role_type = 'GROUP'
387                                  AND user_or_role_id = jgd.parent_group_id
388                                  AND jgd.group_id  = jgm.group_id
389                                  AND jgd.start_date_active <= TRUNC(SYSDATE)
390                                  AND NVL(jgd.end_date_active,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)
391                                  AND jgm.delete_flag='N'
392                                  AND jgm.resource_id = aacd.resource_id
393                                  AND aac.delete_flag = 'N')
394        AND edit_metrics_yn = 'Y' ;
395 
396    END IF;
397 
398  END;
399 
400 PROCEDURE insert_group(  p_group_id      IN  NUMBER
401                        , p_object_type   IN  VARCHAR2
402                        , p_object_id     IN  NUMBER
403                        , p_edit_metrics  IN  VARCHAR2
404                        )
405 IS
406   l_user_id NUMBER := fnd_global.user_id;
407   l_login_id NUMBER := fnd_global.conc_login_id;
408   l_sysdate DATE := SYSDATE;
409 BEGIN
410 
411 -- If the resource already exists as part of another group or as user AND
412 -- if that group or user's edit metrics is 'N', update to 'Y'.
413 
414   IF p_edit_metrics = 'Y' THEN
415     UPDATE ams_act_access_denorm aacd
416     SET edit_metrics_yn = p_edit_metrics
417       , last_updated_by = l_user_id
418       , last_update_date = l_sysdate
419       , last_update_login = l_login_id
420     WHERE object_type = p_object_type
421       AND object_id   = p_object_id
422       AND resource_id IN  ( SELECT jgm.resource_id
423                               FROM jtf_rs_groups_denorm jgd,
424                                    jtf_rs_group_members jgm
425                              WHERE jgd.parent_group_id = p_group_id
426                                AND jgd.group_id = jgm.group_id
427                                AND jgd.start_date_active <= TRUNC(SYSDATE)
428                                AND NVL(jgd.end_date_active,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)
429                                AND jgm.delete_flag='N'
430                           )
431       AND edit_metrics_yn = 'N' ;
432   END IF;
433 
434   -- insert if a resource in a group doesnot exist in the denorm
435   INSERT INTO ams_act_access_denorm
436          (  access_denorm_id
437           , resource_id
438           , edit_metrics_yn
442           , creation_date
439           , object_type
440           , object_id
441           , source_code
443           , created_by
444           , last_update_date
445           , last_updated_by
446           , last_update_login
447           )
448     SELECT ams_act_access_denorm_s.nextval
449        , resource_id
450        , p_edit_metrics
451        , p_object_type
452        , p_object_id
453        , ams_access_pvt.get_source_code(p_object_type,p_object_id)
454        , l_sysdate
455        , l_user_id
456        , l_sysdate
457        , l_user_id
458        , l_login_id
459     FROM (
460       SELECT DISTINCT resource_id
461       FROM jtf_rs_groups_denorm jgd,
462         jtf_rs_group_members jgm
463       WHERE jgd.parent_group_id = p_group_id
464         AND jgd.group_id = jgm.group_id
465         AND jgd.start_date_active <= TRUNC(SYSDATE)
466         AND NVL(jgd.end_date_active,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)
467         AND jgm.delete_flag='N'
468         AND NOT EXISTS (  SELECT 1
469                           FROM ams_act_access_denorm
470                           WHERE resource_id = jgm.resource_id
471                             AND object_type = p_object_type
472                             AND object_id   = p_object_id)
473                         );
474 end insert_group;
475 
476 
477 PROCEDURE update_group(  p_group_id       IN  NUMBER
478                        , p_object_type   IN  VARCHAR2
479                        , p_object_id     IN  NUMBER
480                        , p_edit_metrics  IN  VARCHAR2
481                        )
482   IS
483   l_user_id NUMBER := fnd_global.user_id;
484   l_login_id NUMBER := fnd_global.conc_login_id;
485   l_sysdate DATE := SYSDATE;
486 
487 BEGIN
488 
489   IF p_edit_metrics = 'Y' THEN
490     UPDATE ams_act_access_denorm aacd
491     SET edit_metrics_yn = p_edit_metrics
492       , last_updated_by = l_user_id
493       , last_update_date = l_sysdate
494       , last_update_login = l_login_id
495     WHERE object_type = p_object_type
496       AND object_id   = p_object_id
497       AND edit_metrics_yn = 'N'
498       AND EXISTS (  SELECT 1
499                     FROM ams_act_access aac,
500                       jtf_rs_groups_denorm jgd,
501                       jtf_rs_group_members jgm
502                     WHERE aac.arc_act_access_to_object = p_object_type
503                       AND aac.act_access_to_object_id   = p_object_id
504                       AND arc_user_or_role_type = 'GROUP'
505                       AND user_or_role_id = p_group_id
506                       AND user_or_role_id = jgd.parent_group_id
507                       AND jgd.group_id  = jgm.group_id
508                       AND jgd.start_date_active <= TRUNC(SYSDATE)
509                       AND NVL(jgd.end_date_active,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)
510                       AND jgm.delete_flag='N'
511                       AND jgm.resource_id = aacd.resource_id
512                       AND aac.delete_flag = 'N'  );
513 
514   ELSIF p_edit_metrics = 'N' THEN
515   -- individual owners allready in denorm,
516   -- update entries if the resource is part of the group heirarchy
517   --   AND the resource is not part of a group which has edit metrics as 'Y'
518   -- added by VMODUR 13-MAR-2003
519   -- The Owner may be part of the above groups and should not be updated
520     UPDATE ams_act_access_denorm aacd
521     SET edit_metrics_yn = p_edit_metrics
522       , last_updated_by = l_user_id
523       , last_update_date = l_sysdate
524       , last_update_login = l_login_id
525     WHERE object_type = p_object_type
526       AND object_id   = p_object_id
527       AND edit_metrics_yn = 'Y'
528       /* Roliing back perf suggested change
529       AND EXISTS (  SELECT 1
530                     FROM ams_act_access aac,
531                       jtf_rs_groups_denorm jgd,
532                       jtf_rs_group_members jgm
533                     WHERE aac.arc_act_access_to_object = p_object_type
534                       AND aac.act_access_to_object_id   = p_object_id
535                       AND arc_user_or_role_type = 'GROUP'
536                       AND user_or_role_id = jgd.parent_group_id
537                       AND jgd.group_id  = jgm.group_id
538                       AND jgd.start_date_active <= TRUNC(SYSDATE)
539                       AND NVL(jgd.end_date_active,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)
540                       AND jgm.delete_flag='N'
541                       AND jgm.resource_id = aacd.resource_id
542                       AND aac.delete_flag = 'N'
543 		      AND NVL(aac.admin_flag,'N')='N'          --anchaudh 21-MAR-03
544                   )
545 */
546          AND EXISTS (  SELECT 1
547                     FROM ams_act_access aac,
548                       jtf_rs_groups_denorm jgd,
549                       jtf_rs_group_members jgm
550                     WHERE aac.arc_act_access_to_object = p_object_type
551                       AND aac.act_access_to_object_id   = p_object_id
552                       AND arc_user_or_role_type = 'GROUP'
553                       AND user_or_role_id = jgd.parent_group_id
554                       AND jgd.group_id  = jgm.group_id
555                       AND jgd.start_date_active <= TRUNC(SYSDATE)
556                       AND NVL(jgd.end_date_active,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)
557                       AND jgm.delete_flag='N'
558                       AND jgm.resource_id = aacd.resource_id
562                         FROM ams_act_access aac,
559                       AND aac.delete_flag = 'N'
560                   )
561       AND NOT EXISTS (  SELECT 1
563                           jtf_rs_groups_denorm jgd,
564                           jtf_rs_group_members jgm
565                         WHERE aac.arc_act_access_to_object = p_object_type
566                           AND aac.act_access_to_object_id   = p_object_id
567                           AND arc_user_or_role_type = 'GROUP'
568                           AND user_or_role_id = jgd.parent_group_id
569                           AND jgd.group_id  = jgm.group_id
570                           AND jgd.start_date_active <= TRUNC(SYSDATE)
571                           AND NVL(jgd.end_date_active,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)
572                           AND jgm.delete_flag='N'
573                           AND jgm.resource_id = aacd.resource_id
574                           AND aac.delete_flag = 'N'
575                           AND aac.admin_flag='Y'
576                       )
577       AND NOT EXISTS (   SELECT 1
578                          FROM ams_act_access aac
579                         WHERE aac.act_access_to_object_id  = p_object_id
580 			  AND aac.arc_act_access_to_object = p_object_type
581                           AND aac.user_or_role_id = aacd.resource_id
582                           AND aac.arc_user_or_role_type = 'USER'
583                           AND aac.delete_flag = 'N'
584                           AND aac.admin_flag = 'Y'
585                       );
586   END IF;
587 END update_group;
588 
589 PROCEDURE delete_group( p_group_id      IN  NUMBER
590                       , p_object_type   IN  VARCHAR2
591                       , p_object_id     IN  NUMBER
592                       , p_edit_metrics  IN  VARCHAR2
593                       )
594   IS
595   l_user_id NUMBER := fnd_global.user_id;
596   l_login_id NUMBER := fnd_global.conc_login_id;
597   l_sysdate DATE := SYSDATE;
598  -- First DELETE groups
599 BEGIN
600   -- Delete if resource belongs to the group that is being deleted
601   -- AND it does not exist as part of any other group
602   -- or exist as 'USER' FOR the object.
603   DELETE FROM  ams_act_access_denorm aacd
604   WHERE object_type = p_object_type
605     AND object_id = p_object_id
606     AND resource_id IN (  SELECT jgm.resource_id
607                           FROM jtf_rs_groups_denorm jgd,
608                             jtf_rs_group_members jgm
609                           WHERE jgd.parent_group_id = p_group_id
610                           AND jgd.group_id = jgm.group_id
611                           AND jgd.start_date_active <= TRUNC(SYSDATE)
612                           -- delete every group even if it was end dated earlier than SYSDATE - SVEERAVE 05/15/02
613                           -- AND NVL(jgd.end_date_active,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)
614                           AND jgm.delete_flag='N' )
615     AND NOT EXISTS ( SELECT 1
616                      FROM ams_act_access aac,
617                           jtf_rs_groups_denorm jgd,
618                           jtf_rs_group_members jgm
619                      WHERE aac.arc_act_access_to_object = p_object_type
620                        AND aac.act_access_to_object_id   = p_object_id
621                        AND arc_user_or_role_type = 'GROUP'
622                        AND aac.delete_flag = 'N'
623                        AND user_or_role_id = jgd.parent_group_id
624                        AND jgd.group_id  = jgm.group_id
625                        AND jgd.start_date_active <= TRUNC(SYSDATE)
626                        AND NVL(jgd.end_date_active,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)
627                        AND jgm.delete_flag = 'N'
628                        AND jgm.resource_id = aacd.resource_id
629                      UNION ALL
630                         SELECT 1
631                         FROM ams_act_access
632                         WHERE arc_act_access_to_object = p_object_type
633                           AND act_access_to_object_id = p_object_id
634                           AND arc_user_or_role_type = 'USER'
635                           AND user_or_role_id   =  aacd.resource_id ) ;
636 
637 -- If a group that is being deleted has edit metrics 'N',
638 -- we do not need to handle because it won't change any thing,
639 -- but if it is 'Y' that is being deleted
640 -- then we have to evaluate if resource belongs to another group but with edit_metrics_yn
641 
642   IF p_edit_metrics = 'Y' THEN
643 
644     UPDATE ams_act_access_denorm aacd
645     SET edit_metrics_yn = 'N'
646       , last_updated_by = l_user_id
647       , last_update_date = l_sysdate
648       , last_update_login = l_login_id
649     WHERE object_type = p_object_type
650       AND object_id   = p_object_id
651       AND resource_id NOT IN (  SELECT jgm.resource_id
652                                 FROM ams_act_access aac,
653                                   jtf_rs_groups_denorm jgd,
654                                   jtf_rs_group_members jgm
655                                 WHERE aac.arc_act_access_to_object = p_object_type
656                                   AND aac.act_access_to_object_id   = p_object_id
657                                   AND arc_user_or_role_type = 'GROUP'
658                                   AND user_or_role_id = jgd.parent_group_id
659                                   AND jgd.group_id  = jgm.group_id
660                                   AND jgd.start_date_active <= TRUNC(SYSDATE)
661                                   AND NVL(jgd.end_date_active,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)
665                                   AND aac.delete_flag = 'N'
662                                   AND jgm.delete_flag='N'
663                                   AND jgm.resource_id = aacd.resource_id
664                                   AND aac.admin_flag = 'Y'
666                                 UNION ALL
667                                   SELECT user_or_role_id
668                                   FROM ams_act_access
669                                   WHERE arc_act_access_to_object = p_object_type
670                                     AND act_access_to_object_id = p_object_id
671                                     AND arc_user_or_role_type = 'USER'
672                                     AND user_or_role_id   =  aacd.resource_id
673                                     AND admin_flag = 'Y'
674                               )
675       AND edit_metrics_yn = 'Y';
676 
677  END IF;
678 
679 end delete_group;
680 
681 
682 PROCEDURE refresh_group(  p_group_id      IN  NUMBER
683                         , p_object_type   IN  VARCHAR2
684                         , p_object_id     IN  NUMBER
685                         , p_edit_metrics  IN  VARCHAR2
686                       )
687   IS
688 BEGIN
689   -- add new resources which are not present in the denorm table.
690   insert_group(  p_group_id     => p_group_id
691                , p_object_type  => p_object_type
692                , p_object_id    => p_object_id
693                , p_edit_metrics => p_edit_metrics
694               );
695   -- update the edit metrics in the denorm table.
696   update_group(  p_group_id     => p_group_id
697                , p_object_type  => p_object_type
698                , p_object_id    => p_object_id
699                , p_edit_metrics => p_edit_metrics
700               );
701   -- delete the resources in the denorm table which are end-dated,
702   -- or no longer present in the group.
703   -- this deleted resource should not be part of any other active group or the user of
704   -- the object.
705   DELETE FROM  ams_act_access_denorm aacd
706   WHERE aacd.object_type = p_object_type
707     AND aacd.object_id = p_object_id
708     AND NOT EXISTS (  SELECT 1                                               --anchaudh 21-MAR-03
709                               FROM jtf_rs_groups_denorm jgd,
710                                 jtf_rs_group_members jgm
711                               WHERE jgd.parent_group_id = p_group_id
712                                 AND jgd.group_id = jgm.group_id
713                                 AND jgd.start_date_active <= TRUNC(SYSDATE)
714                                 AND NVL(jgd.end_date_active,SYSDATE) >= TRUNC(SYSDATE)
715                                 AND jgm.delete_flag='N'
716 			        AND jgm.resource_id = aacd.resource_id)              --anchaudh 21-MAR-03
717     AND NOT EXISTS ( SELECT 1
718                      FROM ams_act_access aac,
719                           jtf_rs_groups_denorm jgd,
720                           jtf_rs_group_members jgm
721                      WHERE aac.arc_act_access_to_object = p_object_type
722                        AND aac.act_access_to_object_id   = p_object_id
723                        AND arc_user_or_role_type = 'GROUP'
724                        AND aac.delete_flag = 'N'
725                        AND user_or_role_id = jgd.parent_group_id
726                        AND jgd.group_id  = jgm.group_id
727                        AND jgd.start_date_active <= TRUNC(SYSDATE)
728                        AND NVL(jgd.end_date_active,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)
729                        AND jgm.delete_flag = 'N'
730                        AND jgm.resource_id = aacd.resource_id)
731      AND NOT EXISTS (                                                                           --anchaudh 21-MAR-03
732                         SELECT 1
733                         FROM ams_act_access
734                         WHERE arc_act_access_to_object = p_object_type
735                           AND act_access_to_object_id = p_object_id
736                           AND arc_user_or_role_type = 'USER'
737                           AND user_or_role_id   =  aacd.resource_id ) ;
738 END refresh_group;
739 
740 PROCEDURE ams_object_denorm ( errbuf       OUT NOCOPY VARCHAR2
741                             , retcode      OUT NOCOPY VARCHAR2
742                             , p_object_id   IN NUMBER
743                             , p_object_type IN VARCHAR2 )
744  IS
745   CURSOR cur_get_object_changes IS
746   SELECT arc_user_or_role_type
747         ,user_or_role_id
748         ,act_access_to_object_id
749         ,arc_act_access_to_object
750         ,admin_flag
751     FROM ams_act_access
752    WHERE act_access_to_object_id = p_object_id
753      AND arc_act_access_to_object = p_object_type
754      AND arc_user_or_role_type = 'GROUP'
755      AND delete_flag = 'N';
756 
757  l_user_id NUMBER  := fnd_global.user_id;
758  l_login_id NUMBER := fnd_global.conc_login_id;
759  l_sysdate DATE    := SYSDATE;
760 
761 BEGIN
762 
763   DELETE FROM ams_act_access_denorm aacd
764   WHERE aacd.object_type = p_object_type
765     AND aacd.object_id   = p_object_id;
766 
767  INSERT INTO ams_act_access_denorm
768          (
769             access_denorm_id
770           , resource_id
771           , edit_metrics_yn
772           , object_type
773           , object_id
774           , source_code
775           , creation_date
776           , created_by
780           )
777           , last_update_date
778           , last_updated_by
779           , last_update_login
781  SELECT ams_act_access_denorm_s.nextval
782         ,user_or_role_id
783         ,admin_flag
784         ,arc_act_access_to_object
785         ,act_access_to_object_id
786         ,ams_access_pvt.get_source_code(arc_act_access_to_object,act_access_to_object_id)
787         ,l_sysdate
788         ,l_user_id
789         ,l_sysdate
790         ,l_user_id
791         ,l_login_id
792  FROM  ams_act_access
793  WHERE arc_act_access_to_object = p_object_type
794    AND act_access_to_object_id = p_object_id
795    AND arc_user_or_role_type = 'USER';
796 
797   FOR object_rec IN cur_get_object_changes LOOP
798 
799    insert_group( object_rec.user_or_role_id
800                 ,object_rec.arc_act_access_to_object
801                 ,object_rec.act_access_to_object_id
802                 ,object_rec.admin_flag
803               );
804 
805   END LOOP;
806 
807   DELETE FROM ams_act_access
808   WHERE arc_user_or_role_type = 'GROUP'
809     AND arc_act_access_to_object = p_object_type
810     AND act_access_to_object_id = p_object_id
811     AND delete_flag = 'Y' ;
812 
813   RETCODE := 0;
814 EXCEPTION
815 WHEN OTHERS THEN
816   RETCODE := 2;
817   ERRBUF := SQLERRM;
818 END;
819 
820 /*
821   Modified to include an additional parameter to run in full mode.
822   This concurrent program picks the groups associated with the object, and
823   populates the resources in that group in the ams_act_access_denorm table.
824   By default, it will pick only the groups which are modified after the most recent
825   previous run date of conc. program.
826   However, user can choose to run it in full mode, in which it will refresh every group
827   from the object.
828 */
829 PROCEDURE ams_access_denorm ( errbuf  OUT NOCOPY VARCHAR2
830                             , retcode OUT NOCOPY VARCHAR2
831                             , p_full_mode IN  VARCHAR2 := Fnd_Api.G_FALSE
832                             )
833 IS
834   l_user_id NUMBER  := fnd_global.user_id;
835   l_login_id NUMBER := fnd_global.conc_login_id;
836   l_sysdate DATE    := SYSDATE;
837   l_last_run_date      DATE;
838   l_program_application_id NUMBER := 530;
839   l_concurrent_program_id  NUMBER;
840 
841   -- Get just the delta records for incremental mode
842   CURSOR cur_get_access_changes (p_last_run_date DATE) IS
843     SELECT user_or_role_id
844        ,act_access_to_object_id
845        ,arc_act_access_to_object
846        ,admin_flag
847        ,delete_flag
848        ,creation_date
849        ,last_update_date
850     FROM ams_act_access
851     WHERE arc_user_or_role_type = 'GROUP'
852       AND last_update_date >= p_last_run_date;
853 
854   -- Get all the records needed for full mode.
855   CURSOR cur_get_all_access IS
856     SELECT user_or_role_id
857        ,act_access_to_object_id
858        ,arc_act_access_to_object
859        ,admin_flag
860        ,delete_flag
861        ,creation_date
862        ,last_update_date
863     FROM ams_act_access
864     WHERE arc_user_or_role_type = 'GROUP';
865 
866   CURSOR cur_get_conc_program_id IS
867     SELECT concurrent_program_id
868     FROM fnd_concurrent_programs
869     WHERE application_id = 530
870     AND concurrent_program_name = 'AMSADENO';
871 
872   CURSOR cur_get_latest_start_date IS
873     SELECT max(actual_start_date)
874     FROM fnd_concurrent_requests
875     WHERE program_application_id = l_program_application_id
876       AND concurrent_program_id =  l_concurrent_program_id
877       AND status_code = 'C'
878       AND phase_code = 'C';
879 
880   -- Used only once i.e the first time ever this concurrent program is run
881   -- Commenting this as we cannot rely on this statement as last_update_date
882   -- could be even changed while a new object is created.
883   /*
884   CURSOR cur_get_latest_run_date IS
885     SELECT max(last_update_date)
886       FROM ams_act_access_denorm;
887   */
888 BEGIN
889 
890   OPEN cur_get_conc_program_id;
891   FETCH cur_get_conc_program_id INTO l_concurrent_program_id;
892   CLOSE cur_get_conc_program_id;
893   -- Get the most recent conc. request, and use that to drive the delta.
894   OPEN cur_get_latest_start_date ;
895   FETCH cur_get_latest_start_date  INTO l_last_run_date;
896   CLOSE cur_get_latest_start_date ;
897 
898   IF (l_last_run_date IS NULL) OR p_full_mode IN (Fnd_Api.G_TRUE, 'Y') THEN
899     FOR l_all_access_rec IN cur_get_all_access LOOP
900       IF (l_all_access_rec.delete_flag = 'Y')  THEN
901         delete_group(  p_group_id     => l_all_access_rec.user_or_role_id
902                      , p_object_type  => l_all_access_rec.arc_act_access_to_object
903                      , p_object_id    => l_all_access_rec.act_access_to_object_id
904                      , p_edit_metrics => l_all_access_rec.admin_flag
905                      );
906       ELSIF (l_all_access_rec.delete_flag = 'N') THEN
907         refresh_group( p_group_id     => l_all_access_rec.user_or_role_id
908                      , p_object_type  => l_all_access_rec.arc_act_access_to_object
909                      , p_object_id    => l_all_access_rec.act_access_to_object_id
913     END LOOP;
910                      , p_edit_metrics => l_all_access_rec.admin_flag
911                      );
912       END IF;
914   ELSE
915     --l_last_run_date := SYSDATE  - 1000000;
916     FOR access_rec IN cur_get_access_changes(l_last_run_date) LOOP
917       IF ((access_rec.creation_date > l_last_run_date) AND (access_rec.delete_flag = 'N') ) THEN
918         insert_group(  p_group_id     => access_rec.user_or_role_id
919                      , p_object_type  => access_rec.arc_act_access_to_object
920                      , p_object_id    => access_rec.act_access_to_object_id
921                      , p_edit_metrics => access_rec.admin_flag
922                      );
923       ELSIF ( (access_rec.last_update_date > l_last_run_date) AND (access_rec.delete_flag = 'Y') ) THEN
924         delete_group(  p_group_id     => access_rec.user_or_role_id
925                      , p_object_type  => access_rec.arc_act_access_to_object
926                      , p_object_id    => access_rec.act_access_to_object_id
927                      , p_edit_metrics => access_rec.admin_flag
928                      );
929 
930       ELSIF ( (access_rec.last_update_date > l_last_run_date) AND (access_rec.delete_flag = 'N') ) THEN
931        --dbms_output.put_line('-- Only change that could have happened is that edit metrics could have changed.');
932         update_group(  p_group_id     => access_rec.user_or_role_id
933                      , p_object_type  => access_rec.arc_act_access_to_object
934                      , p_object_id    => access_rec.act_access_to_object_id
935                      , p_edit_metrics => access_rec.admin_flag
936                     );
937       END IF;
938     END LOOP; -- for     FOR access_rec IN cur_get_access_changes(l_last_run_date) LOOP
939   END IF; --  IF p_full_mode IN (Fnd_Api.G_TRUE, 'Y') THEN
940 
941   -- delete all the deleted group associations.
942   DELETE ams_act_access
943   WHERE arc_user_or_role_type = 'GROUP'
944     AND delete_flag = 'Y' ;
945 
946   -- return the success code.
947   retcode := 0;
948 EXCEPTION
949 WHEN OTHERS THEN
950   ROLLBACK;
951   RETCODE := 2;
952   ERRBUF := SQLERRM;
953 END ams_access_denorm;
954 /*
955 
956 PROCEDURE jtf_access_denorm ( errbuf OUT NOCOPY VARCHAR2
957                             , retcode OUT NOCOPY VARCHAR2)
958 IS
959 
960  l_user_id NUMBER := fnd_global.user_id;
961  l_login_id NUMBER := fnd_global.conc_login_id;
962  l_sysdate DATE := sysdate;
963  l_program_application_id NUMBER := 530;
964  l_concurrent_program_id  NUMBER;
965 
966 -- CURSOR to operate on groups that are DELETEd
967 CURSOR cur_get_object_grp_res( p_last_run_date DATE)  IS
968   SELECT  act.act_access_to_object_id
969         , act.arc_act_access_to_object
970         , jrg.group_id
971         , admin_flag
972     FROM  ams_act_access act,
973           JTF_RS_GROUPS_B jrg
974    WHERE act.arc_user_or_role_type = 'GROUP'
975      AND act.user_or_role_id= jrg.group_id
976      AND  jrg.last_update_date >= p_last_run_date
977      AND  jrg.end_date_active <= trunc(sysdate)
978      AND  act.delete_flag = 'N';
979 
980 -- CURSOR to operate on group relations that are created or DELETEd
981 CURSOR cur_get_obj_grp_relation_res( p_last_run_date DATE) IS
982   SELECT jrg.group_id
983          , jrg.start_date_active
984          , act.act_access_to_object_id
985          , act.arc_act_access_to_object
986          , jrg.creation_date
987          , jrg.last_update_date
988          , jrg.end_date_active
989         , act.admin_flag
990     FROM ams_act_access act,
991          jtf_rs_grp_relations jrg
992    WHERE act.arc_user_or_role_type = 'GROUP'
993      AND act.user_or_role_id= jrg.group_id
994      AND jrg.last_update_date >= p_last_run_date
995      AND act.delete_flag = 'N';
996 
997 -- CURSOR to operate on group members that are created or DELETEd
998 CURSOR cur_get_object_res_groups( p_last_run_date DATE) IS
999 SELECT  aac.act_access_to_object_id
1000       , aac.arc_act_access_to_object
1001       , jgm.resource_id
1002       , jgm.delete_flag
1003       , jgm.creation_date
1004       , jgm.last_update_date
1005       ,aac.admin_flag
1006  FROM ams_act_access aac,
1007        jtf_rs_groups_denorm jrg,
1008        jtf_rs_group_members jgm
1009 WHERE aac.arc_user_or_role_type =  'GROUP'
1010   AND aac.user_or_role_id= jrg.parent_group_id
1011   AND jrg.group_id = jgm.group_id
1012   AND jrg.start_date_active <= trunc(sysdate)
1013   AND nvl(jrg.end_date_active,trunc(sysdate)) >= trunc(sysdate)
1014   AND jgm.last_update_date >= p_last_run_date
1015   AND aac.delete_flag='N';
1016 
1017 CURSOR cur_get_conc_program_id IS
1018 SELECT concurrent_program_id
1019   FROM fnd_concurrent_programs
1020  WHERE application_id = 530
1021  AND concurrent_program_name = 'AMSJDENO';
1022 
1023 CURSOR cur_get_latest_start_date IS
1024 SELECT MAX(actual_start_date)
1025   FROM fnd_concurrent_requests
1026  WHERE program_application_id = l_program_application_id
1027    AND concurrent_program_id =  l_concurrent_program_id
1028    AND status_code = 'C'
1029    AND phase_code = 'C';
1030 
1031 -- Used only once i.e the first time ever this concurrent program is run
1032 CURSOR cur_get_latest_run_date IS
1033 SELECT MAX(last_update_date)
1034   FROM ams_act_access_denorm;
1035 
1039 
1036 l_last_run_date date;
1037 
1038 BEGIN
1040 OPEN cur_get_conc_program_id;
1041 FETCH cur_get_conc_program_id INTO l_concurrent_program_id;
1042 CLOSE cur_get_conc_program_id;
1043 
1044 OPEN cur_get_latest_start_date;
1045 FETCH cur_get_latest_start_date INTO l_last_run_date;
1046 CLOSE cur_get_latest_start_date;
1047 
1048 IF l_last_run_date is null THEN
1049 OPEN cur_get_latest_run_date;
1050 FETCH cur_get_latest_run_date INTO l_last_run_date;
1051 CLOSE cur_get_latest_run_date;
1052 END IF;
1053 -- l_last_run_date := sysdate  - 1000000;
1054 FOR grp_res_rec IN cur_get_object_grp_res(l_last_run_date) LOOP
1055     --dbms_output.put_line(' groups  ');
1056 
1057     delete_group( p_group_id      =>  grp_res_rec.group_id
1058                 , p_object_type   => grp_res_rec.arc_act_access_to_object
1059                 , p_object_id     => grp_res_rec.act_access_to_object_id
1060                 , p_edit_metrics  => grp_res_rec.admin_flag
1061                 );
1062 
1063 END LOOP;
1064 
1065 FOR grprel_res_rec IN cur_get_obj_grp_relation_res(l_last_run_date) LOOP
1066            --dbms_output.put_line(' group relations ');
1067 
1068  IF (     (grprel_res_rec.creation_date >= l_last_run_date )
1069       AND (nvl(grprel_res_rec.start_date_active,sysdate) <= sysdate)
1070       AND ( nvl(grprel_res_rec.end_date_active,sysdate) >= sysdate)
1071     )
1072  THEN
1073        --dbms_output.put_line(' insert group relations ');
1074 
1075    insert_group( p_group_id     => grprel_res_rec.group_id
1076                , p_object_type  => grprel_res_rec.arc_act_access_to_object
1077                , p_object_id    => grprel_res_rec.act_access_to_object_id
1078                , p_edit_metrics => grprel_res_rec.admin_flag
1079                );
1080 
1081  ELSIF ( nvl(grprel_res_rec.end_date_active,sysdate) <= sysdate ) THEN
1082        --dbms_output.put_line(' DELETE group relations ');
1083 
1084    delete_group( p_group_id     => grprel_res_rec.group_id
1085                , p_object_type  => grprel_res_rec.arc_act_access_to_object
1086                , p_object_id    => grprel_res_rec.act_access_to_object_id
1087                , p_edit_metrics => grprel_res_rec.admin_flag
1088                );
1089 
1090  END IF;
1091 
1092 
1093 END LOOP;
1094 
1095 FOR grpmembers_rec IN cur_get_object_res_groups(l_last_run_date) LOOP
1096           --dbms_output.put_line(' DELETE group members');
1097     IF ((grpmembers_rec.creation_date >= l_last_run_date )
1098         AND ( grpmembers_rec.delete_flag = 'N')   )
1099     THEN
1100           -- dbms_output.put_line(' insert group members');
1101 
1102       insert_resource( p_resource_id   =>  grpmembers_rec.resource_id
1103                      , p_object_type   =>  grpmembers_rec.arc_act_access_to_object
1104                      , p_object_id     =>  grpmembers_rec.act_access_to_object_id
1105                      , p_edit_metrics  =>  grpmembers_rec.admin_flag
1106                      );
1107 
1108     ELSIF ( (grpmembers_rec.delete_flag = 'Y') ) THEN
1109         --dbms_output.put_line(' DELETE group members');
1110 
1111       delete_resource( p_resource_id   =>  grpmembers_rec.resource_id
1112                      , p_object_type   =>  grpmembers_rec.arc_act_access_to_object
1113                      , p_object_id     =>  grpmembers_rec.act_access_to_object_id
1114                      , p_edit_metrics  =>  grpmembers_rec.admin_flag
1115                      );
1116     END IF;
1117 
1118 END LOOP;
1119 retcode := 0;
1120 end;
1121 */
1122 
1123 PROCEDURE jtf_access_denorm (  errbuf OUT NOCOPY VARCHAR2
1124                              , retcode OUT NOCOPY VARCHAR2
1125                             )
1126 IS
1127 
1128   l_user_id NUMBER := fnd_global.user_id;
1129   l_login_id NUMBER := fnd_global.conc_login_id;
1130   l_sysdate DATE := SYSDATE;
1131   l_program_application_id NUMBER := 530;
1132   l_concurrent_program_id  NUMBER;
1133 
1134   -- CURSOR to operate on groups that are deleted
1135   CURSOR cur_get_del_grp(p_last_run_date DATE)  IS
1136     SELECT  act.act_access_to_object_id
1137           , act.arc_act_access_to_object
1138           , jrg.group_id
1139           , admin_flag
1140     FROM  ams_act_access act,
1141           jtf_rs_groups_b jrg
1142     WHERE act.arc_user_or_role_type = 'GROUP'
1143       AND act.user_or_role_id= jrg.group_id
1144       AND act.delete_flag = 'N'
1145 --      AND  jrg.last_update_date >= p_last_run_date -- this will not pick any rows which are end dated in future.
1146       AND jrg.end_date_active IS NOT NULL
1147       AND jrg.end_date_active >= p_last_run_date -- added to pick only the rows which are ending after previous run.
1148       AND jrg.end_date_active <= TRUNC(SYSDATE) ;
1149 
1150   -- CURSOR to get group members that are created through new child group relationship
1151   -- or got created because of changing the start date of child relationship after previous run
1152   -- or got created manually in the main group or child group.
1153   -- Replaced the following cursor - Replace OR's with unions as suggested by Perf Team in
1154   -- Bug 3071312
1155   /*
1156   CURSOR cur_get_crt_res(p_last_run_date DATE) IS
1157     SELECT  aac.act_access_to_object_id
1158         , aac.arc_act_access_to_object
1159         , jgm.resource_id
1160         , jgm.last_update_date
1161         , aac.admin_flag
1162     FROM ams_act_access aac,
1163        jtf_rs_groups_denorm jrg,
1164        jtf_rs_group_members jgm
1165     WHERE
1169         AND jgm.delete_flag = 'N'
1166       ( aac.arc_user_or_role_type =  'GROUP'
1167         AND aac.user_or_role_id= jrg.parent_group_id
1168         AND aac.delete_flag='N'
1170         AND jrg.group_id = jgm.group_id
1171         AND jrg.start_date_active >= p_last_run_date
1172         AND jrg.start_date_active <= TRUNC(SYSDATE)
1173        )
1174       OR
1175       ( aac.arc_user_or_role_type =  'GROUP'
1176         AND aac.user_or_role_id= jrg.parent_group_id
1177         AND aac.delete_flag='N'
1178         AND jgm.delete_flag = 'N'
1182        )
1179         AND jrg.group_id = jgm.group_id
1180         AND jrg.last_update_date > p_last_run_date
1181         AND jrg.start_date_active <= TRUNC(SYSDATE)
1183       OR
1184       ( aac.arc_user_or_role_type =  'GROUP'
1185         AND aac.user_or_role_id= jrg.parent_group_id
1186         AND aac.delete_flag='N'
1187         AND jgm.delete_flag = 'N'
1188         AND jrg.group_id = jgm.group_id
1189         AND jgm.creation_date > p_last_run_date
1190       );
1191   */
1192   CURSOR cur_get_crt_res(p_last_run_date DATE) IS
1193     SELECT  aac.act_access_to_object_id
1194         , aac.arc_act_access_to_object
1195         , jgm.resource_id
1196         , jgm.last_update_date
1197         , aac.admin_flag
1198     FROM ams_act_access aac,
1199        jtf_rs_groups_denorm jrg,
1200        jtf_rs_group_members jgm
1201    WHERE
1202       ( aac.arc_user_or_role_type =  'GROUP'
1203         AND aac.user_or_role_id= jrg.parent_group_id
1204         AND aac.delete_flag='N'
1205         AND jgm.delete_flag = 'N'
1206         AND jrg.group_id = jgm.group_id
1207         AND jrg.start_date_active >= p_last_run_date
1208         AND jrg.start_date_active <= TRUNC(SYSDATE)
1209        )
1210  UNION
1211     SELECT  aac.act_access_to_object_id
1212         , aac.arc_act_access_to_object
1213         , jgm.resource_id
1214         , jgm.last_update_date
1215         , aac.admin_flag
1216     FROM ams_act_access aac,
1217        jtf_rs_groups_denorm jrg,
1218        jtf_rs_group_members jgm
1219    WHERE
1220       ( aac.arc_user_or_role_type =  'GROUP'
1221         AND aac.user_or_role_id= jrg.parent_group_id
1222         AND aac.delete_flag='N'
1223         AND jgm.delete_flag = 'N'
1224         AND jrg.group_id = jgm.group_id
1225         AND jrg.last_update_date > p_last_run_date
1226         AND jrg.start_date_active <= TRUNC(SYSDATE)
1227        )
1228   UNION
1229     SELECT  aac.act_access_to_object_id
1230         , aac.arc_act_access_to_object
1231         , jgm.resource_id
1232         , jgm.last_update_date
1233         , aac.admin_flag
1234     FROM ams_act_access aac,
1235        jtf_rs_groups_denorm jrg,
1236        jtf_rs_group_members jgm
1237    WHERE
1238       ( aac.arc_user_or_role_type =  'GROUP'
1239         AND aac.user_or_role_id= jrg.parent_group_id
1240         AND aac.delete_flag='N'
1241         AND jgm.delete_flag = 'N'
1242         AND jrg.group_id = jgm.group_id
1243         AND jgm.creation_date > p_last_run_date
1244       );
1245 
1246   -- CURSOR to get group members that are deleted by end-dating child group relationship
1247   -- or those changed end-date in the child group relationship after previous run
1248   -- or got deleted manually.
1249   -- Cursor replaced by those suggested by Perf Team as per Bug 3071312
1250   /*
1251   CURSOR cur_get_del_res(p_last_run_date DATE) IS
1252     SELECT  aac.act_access_to_object_id
1253         , aac.arc_act_access_to_object
1254         , jgm.resource_id
1255         , jgm.last_update_date
1256         , aac.admin_flag
1257     FROM ams_act_access aac,
1258        jtf_rs_groups_denorm jrg,
1259        jtf_rs_group_members jgm
1260     WHERE
1261       ( aac.arc_user_or_role_type =  'GROUP'
1262         AND aac.user_or_role_id= jrg.parent_group_id
1263         AND aac.delete_flag='N'
1264         AND jrg.group_id = jgm.group_id
1265         AND jrg.end_date_active IS NOT NULL
1266         AND jrg.end_date_active >= p_last_run_date
1267         AND jrg.end_date_active <= TRUNC(SYSDATE)
1268        )
1269       OR
1270       ( aac.arc_user_or_role_type =  'GROUP'
1271         AND aac.user_or_role_id= jrg.parent_group_id
1272         AND aac.delete_flag='N'
1273         AND jrg.group_id = jgm.group_id
1274         AND jrg.last_update_date > p_last_run_date
1275         AND jrg.end_date_active IS NOT NULL
1276         AND jrg.end_date_active <= TRUNC(SYSDATE)
1277        )
1278       OR
1279       ( aac.arc_user_or_role_type =  'GROUP'
1280         AND aac.user_or_role_id= jrg.parent_group_id
1281         AND aac.delete_flag='N'
1282         AND jgm.delete_flag = 'Y'
1283         AND jrg.group_id = jgm.group_id
1284         AND jgm.last_update_date >= p_last_run_date
1285       );
1286 */
1287   CURSOR cur_get_del_res(p_last_run_date DATE) IS
1288     SELECT  aac.act_access_to_object_id
1289         , aac.arc_act_access_to_object
1290         , jgm.resource_id
1291         , jgm.last_update_date
1292         , aac.admin_flag
1293     FROM ams_act_access aac,
1294        jtf_rs_groups_denorm jrg,
1295        jtf_rs_group_members jgm
1296     WHERE
1297       ( aac.arc_user_or_role_type =  'GROUP'
1298         AND aac.user_or_role_id= jrg.parent_group_id
1299         AND aac.delete_flag='N'
1300         AND jrg.group_id = jgm.group_id
1301         AND jrg.end_date_active IS NOT NULL
1302         AND jrg.end_date_active >= p_last_run_date
1303         AND jrg.end_date_active <= TRUNC(SYSDATE)
1304        )
1305     UNION
1306     SELECT  aac.act_access_to_object_id
1307         , aac.arc_act_access_to_object
1308         , jgm.resource_id
1309         , jgm.last_update_date
1310         , aac.admin_flag
1311     FROM ams_act_access aac,
1312        jtf_rs_groups_denorm jrg,
1313        jtf_rs_group_members jgm
1314     WHERE
1315       ( aac.arc_user_or_role_type =  'GROUP'
1316         AND aac.user_or_role_id= jrg.parent_group_id
1317         AND aac.delete_flag='N'
1318         AND jrg.group_id = jgm.group_id
1319         AND jrg.last_update_date > p_last_run_date
1320         AND jrg.end_date_active IS NOT NULL
1321         AND jrg.end_date_active <= TRUNC(SYSDATE)
1322        )
1323     UNION
1324     SELECT  aac.act_access_to_object_id
1325         , aac.arc_act_access_to_object
1326         , jgm.resource_id
1330        jtf_rs_groups_denorm jrg,
1327         , jgm.last_update_date
1328         , aac.admin_flag
1329     FROM ams_act_access aac,
1331        jtf_rs_group_members jgm
1332     WHERE
1333       ( aac.arc_user_or_role_type =  'GROUP'
1334         AND aac.user_or_role_id= jrg.parent_group_id
1335         AND aac.delete_flag='N'
1336         AND jgm.delete_flag = 'Y'
1337         AND jrg.group_id = jgm.group_id
1338         AND jgm.last_update_date >= p_last_run_date
1339       );
1340 
1341   CURSOR cur_get_conc_program_id IS
1342     SELECT concurrent_program_id
1343     FROM fnd_concurrent_programs
1344     WHERE concurrent_program_name = 'AMSJDENO';
1345 
1346   CURSOR cur_get_latest_start_date IS
1347     SELECT MAX(actual_start_date)
1348     FROM fnd_concurrent_requests
1349     WHERE program_application_id = l_program_application_id
1350       AND concurrent_program_id =  l_concurrent_program_id
1351       AND status_code = 'C'
1352       AND phase_code = 'C';
1353 
1354   -- Used only once i.e the first time ever this concurrent program is run
1355   -- Use the minimum last_update_date
1356   CURSOR cur_get_latest_run_date IS
1357     SELECT MIN(last_update_date)
1358     FROM ams_act_access_denorm;
1359   l_last_run_date DATE;
1360 
1361 BEGIN
1362 
1363   OPEN cur_get_conc_program_id;
1364   FETCH cur_get_conc_program_id INTO l_concurrent_program_id;
1365   CLOSE cur_get_conc_program_id;
1366 
1367   OPEN cur_get_latest_start_date;
1368   FETCH cur_get_latest_start_date INTO l_last_run_date;
1369   CLOSE cur_get_latest_start_date;
1370 
1371   IF l_last_run_date IS NULL THEN
1372     OPEN cur_get_latest_run_date;
1373     FETCH cur_get_latest_run_date INTO l_last_run_date;
1374     CLOSE cur_get_latest_run_date;
1375   END IF;
1376 
1377   -- handle all the groups which are directly associated to the objects, and are deleted.
1378   FOR l_del_grp_rec IN cur_get_del_grp(l_last_run_date) LOOP
1379    --dbms_output.put_line(' groups  ');
1380     delete_group( p_group_id      => l_del_grp_rec.group_id
1381                 , p_object_type   => l_del_grp_rec.arc_act_access_to_object
1382                 , p_object_id     => l_del_grp_rec.act_access_to_object_id
1383                 , p_edit_metrics  => l_del_grp_rec.admin_flag
1384                 );
1385   END LOOP;
1386 
1387   -- create all the resources which are added manually in the main group or child group
1388   -- and, also create all the resources came via new child group relations.
1389   FOR l_crt_res_rec IN cur_get_crt_res(l_last_run_date) LOOP
1390     --dbms_output.put_line(' groups  ');
1391     insert_resource( p_resource_id   =>  l_crt_res_rec.resource_id
1392                    , p_object_type   =>  l_crt_res_rec.arc_act_access_to_object
1393                    , p_object_id     =>  l_crt_res_rec.act_access_to_object_id
1394                    , p_edit_metrics  =>  l_crt_res_rec.admin_flag
1395                    );
1396   END LOOP;
1397 
1398   -- delete all the resources which are deleted manually in the main group or child group
1399   -- and, also deleted because child group relationship is end-dated.
1400   FOR l_del_res_rec IN cur_get_del_res(l_last_run_date) LOOP
1401       --dbms_output.put_line(' DELETE group members');
1402       delete_resource( p_resource_id   =>  l_del_res_rec.resource_id
1403                      , p_object_type   =>  l_del_res_rec.arc_act_access_to_object
1404                      , p_object_id     =>  l_del_res_rec.act_access_to_object_id
1405                      , p_edit_metrics  =>  l_del_res_rec.admin_flag
1406                      );
1407   END LOOP;
1408   retcode := 0;
1409 EXCEPTION
1410 WHEN OTHERS THEN
1411   ROLLBACK;
1412   RETCODE := 2;
1413   ERRBUF := SQLERRM;
1414 end jtf_access_denorm;
1415 end ams_access_denorm_pvt;