DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_DISTRIBUTION_LIST_UTILS

Source


1 PACKAGE BODY PA_DISTRIBUTION_LIST_UTILS AS
2  /* $Header: PATDLUTB.pls 120.3.12010000.5 2008/11/15 09:55:50 acprakas ship $ */
3 
4  Function Check_valid_dist_list_id (
5                         p_list_id in Number )
6  return boolean
7  IS
8  Cursor C1 is
9  Select 'X' from pa_distribution_lists
10  where list_id = p_list_id;
11 
12  l_dummy   varchar2(1);
13  l_return_status  boolean := TRUE;
14  Begin
15   Open C1;
16   fetch C1 into l_dummy;
17   if (C1%NOTFOUND) then
18    l_return_status := FALSE;
19   else
20    l_return_status := TRUE;
21   end if;
22   close C1;
23 
24   return l_return_status;
25 
26  Exception
27   When others then
28    RAISE;
29 
30  End Check_valid_dist_list_id;
31 
32  Function Check_dist_list_name_exists (
33                         p_list_id   in number default null,
34                         p_list_name in varchar2)
35  return boolean
36  IS
37   Cursor C1 is
38   Select list_id
39   from pa_distribution_lists
40   where name = p_list_name
41   and (p_list_id is null
42        OR p_list_id <> list_id) ;
43 
44   l_list_id   Number := 0;
45   l_return_status boolean := FALSE;
46 
47  Begin
48   Open C1;
49   fetch C1 into l_list_id;
50   if C1%NOTFOUND then
51      l_return_status  := FALSE;
52   else
53      l_return_status := TRUE;
54   end if;
55   close C1;
56   return l_return_status;
57 
58  Exception
59   When others then
60    RAISE;
61 
62  End Check_dist_list_name_exists;
63 
64  Function get_dist_list_id (
65                         p_list_name in varchar2 )
66  return number
67  IS
68   Cursor C1 is
69   Select list_id
70   from pa_distribution_lists
71   where name = p_list_name;
72 
73   l_list_id   Number := 0;
74 
75  Begin
76   Open C1;
77   fetch C1 into l_list_id;
78   if C1%NOTFOUND then
79      l_list_id  := -1;
80   end if;
81   close C1;
82   return l_list_id;
83 
84  Exception
85   When others then
86    RAISE;
87  End get_dist_list_id;
88 
89  Function Check_valid_recipient_type (
90                         p_recipient_type in varchar2 )
91  return boolean
92  IS
93   l_return_code boolean := TRUE;
94   l_dummy   varchar2(1);
95   Cursor C1 is
96   Select 'X'
97   from pa_lookups
98   where lookup_type = 'PA_RECIPIENT_TYPES'
99   and lookup_code = p_recipient_type;
100  Begin
101    open C1;
102    fetch C1 into l_dummy;
103    if (C1%NOTFOUND) then
104     l_return_code := FALSE;
105    end if;
106    close C1;
107    return l_return_code;
108  End Check_valid_recipient_type;
109 
110  Function Check_valid_recipient_id (
111                         p_recipient_type in varchar2,
112                         p_recipient_id   in varchar2 )
113  return boolean
114  IS
115  Begin
116    return TRUE;
117  End Check_valid_recipient_id;
118 
119  Function Check_valid_access_level (
120                         p_access_level in number)
121  return boolean
122  IS
123  Begin
124    return TRUE;
125  End Check_valid_access_level;
126 
127  Function Check_valid_menu_id (
128                         p_menu_id in Number )
129  return boolean
130  IS
131  Cursor C1 is
132  Select 'X' from fnd_menus
133  where menu_id = p_menu_id;
134 
135  l_dummy   varchar2(1);
136  l_return_status  boolean := TRUE;
137  Begin
138   Open C1;
139   fetch C1 into l_dummy;
140   if (C1%NOTFOUND) then
141    l_return_status := FALSE;
142   else
143    l_return_status := TRUE;
144   end if;
145   close C1;
146 
147   return l_return_status;
148 
149  Exception
150   When others then
151    RAISE;
152 
153  End Check_valid_menu_id;
154 
155 
156 FUNCTION get_access_level (
157   p_object_type        IN   VARCHAR2,
158   p_object_id          IN   VARCHAR2,
159   p_user_id            IN   NUMBER  DEFAULT FND_GLOBAL.USER_ID,
160   x_return_status      OUT  NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
161   x_msg_count          OUT  NOCOPY NUMBER, --File.Sql.39 bug 4440895
162   x_msg_data           OUT  NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
163   p_context_object_type IN  VARCHAR2 DEFAULT NULL,
164   p_context_object_id   IN  VARCHAR2 DEFAULT NULL
165 ) RETURN NUMBER
166 IS
167   l_access_level NUMBER;
168   l_return_value NUMBER := 0;
169   l_resource_id NUMBER;           -- Bug 2717635
170   l_party_id NUMBER;
171   l_object_type VARCHAR2(30) := p_context_object_type;
172   l_object_id NUMBER := p_context_object_id;
173 
174   CURSOR c_list_ids IS
175   SELECT list_id
176   FROM pa_object_dist_lists
177   WHERE object_type = p_object_type
178     AND object_id = p_object_id;
179 
180   /* Bug 2717635 in the following query, selected from table pa_project_parties
181      in place of view pa_project_parties_v to improve the performance
182      Also passed another parameter to this cursor c_access_level ie
183      cp_resource_id which passes the resource_id for a corresponding user_id
184      for join with table pa_project_parties
185      Also there is a cartesian joint with fnd_user which is not required, hence removing it*/
186 
187   CURSOR c_access_level(cp_list_id NUMBER) IS  -- Bug 2717635
188   SELECT MAX(access_level) access_level FROM (
189   SELECT access_level
190   FROM pa_dist_list_items i,
191        pa_project_parties p    -- Bug 2717635
192   WHERE i.list_id = cp_list_id
193     AND i.recipient_type = 'PROJECT_PARTY'
194     AND p.project_party_id = i.recipient_id
195     AND p.resource_id = l_resource_id    -- Bug 2717635
196     AND p.object_type = l_object_type
197     AND p.object_id = l_object_id
198   UNION ALL
199   SELECT access_level
200   FROM pa_dist_list_items i,
201        pa_project_parties p   -- Bug 2717635
202        /* fnd_user u */       -- Bug 2717635
203   WHERE i.list_id = cp_list_id
204     AND i.recipient_type = 'PROJECT_ROLE'
205     AND p.project_role_id = i.recipient_id
206     AND p.resource_id = l_resource_id  -- Bug 2717635
207     AND p.object_type = l_object_type
208     AND p.object_id = l_object_id
209   UNION ALL
210   SELECT access_level
211   FROM pa_dist_list_items
212   WHERE list_id = cp_list_id
213     AND recipient_type = 'ALL_PROJECT_PARTIES'
214     AND EXISTS (SELECT 'Y' FROM pa_project_parties  -- Bug 2717635
215                 WHERE resource_id = l_resource_id  -- Bug 2717635
216                   AND object_type = l_object_type
217                   AND object_id = l_object_id)
218   UNION ALL
219   SELECT access_level
220   FROM pa_dist_list_items
221   WHERE list_id = cp_list_id
222     AND recipient_type = 'HZ_PARTY'
223     AND recipient_id = l_party_id);
224 
225 BEGIN
226   x_return_status := 'S';
227 
228   IF p_context_object_type IS NULL AND
229      p_object_type = 'PA_OBJECT_PAGE_LAYOUT' THEN
230     SELECT object_type, object_id
231     INTO l_object_type, l_object_id
232     FROM pa_object_page_layouts
233     WHERE object_page_layout_id = p_object_id;
234   END IF;
235 
236   l_resource_id := pa_resource_utils.get_resource_id(NULL,p_user_id);   -- Bug 2717635
237   l_party_id := pa_utils.get_party_id(p_user_id);
238 
239   FOR l_rec IN c_list_ids LOOP
240 --dbms_output.put_line('list_id='||l_rec.list_id);
241     OPEN c_access_level(l_rec.list_id);   -- Bug 2717635
242     FETCH c_access_level INTO l_access_level;
243 --dbms_output.put_line('access_level='||l_access_level);
244     IF c_access_level%FOUND AND l_access_level>l_return_value THEN
245       l_return_value := l_access_level;
246     END IF;
247   END LOOP;
248 
249   RETURN l_return_value;
250 
251 EXCEPTION
252    WHEN FND_API.G_EXC_ERROR THEN
253      x_return_status := 'E';
254 
255    WHEN OTHERS THEN
256      x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
257      fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_OBJECT_DIST_LISTS_UTILS',
258                              p_procedure_name => 'GET_ACCESS_LEVEL',
259                              p_error_text     => SUBSTRB(SQLERRM,1,240));
260 END get_access_level;
261 
262 PROCEDURE get_dist_list (
263   p_object_type        IN   VARCHAR2,
264   p_object_id          IN   VARCHAR2,
265   p_access_level       IN   NUMBER,
266   x_user_names         OUT  NOCOPY PA_VC_1000_150, --File.Sql.39 bug 4440895
267   x_full_names         OUT  NOCOPY PA_VC_1000_150, --File.Sql.39 bug 4440895
268   x_email_addresses    OUT  NOCOPY PA_VC_1000_150, --File.Sql.39 bug 4440895
269   x_return_status      OUT  NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
270   x_msg_count          OUT  NOCOPY NUMBER, --File.Sql.39 bug 4440895
271   x_msg_data           OUT  NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
272 )
273 IS
274   l_object_type VARCHAR2(30);
275   l_object_id NUMBER;
276   l_return_value NUMBER := 0;
277   i NUMBER;
278 
279   CURSOR c_list_ids IS
280   SELECT list_id
281   FROM pa_object_dist_lists
282   WHERE object_type = p_object_type
283     AND object_id = p_object_id;
284 
285   --Bug# 4284420: Modified the cursor to avoid selecting end-dated fnd_users
286   CURSOR c_dist_list(cp_list_id NUMBER) IS
287   SELECT DISTINCT user_name, full_name, email_address FROM (
288   SELECT p.user_name user_name,
289          p.resource_source_name full_name,
290          p.email_address email_address
291   FROM pa_dist_list_items i,
292        pa_project_parties_v p,
293        fnd_user u
294   WHERE i.list_id = cp_list_id
295     AND i.access_level >= p_access_level
296     AND i.recipient_type = 'PROJECT_PARTY'
297     AND p.project_party_id = i.recipient_id
298     AND p.object_type = l_object_type
299     AND p.object_id = l_object_id
300     AND u.user_name=p.user_name
301     AND (TRUNC(SYSDATE) BETWEEN TRUNC(u.start_date) AND NVL(TRUNC(u.end_date),SYSDATE))
302     AND trunc(sysdate) between p.start_date_active and nvl(p.end_date_active,sysdate + 1)
303   UNION ALL
304   SELECT p.user_name user_name,
305          p.resource_source_name full_name,
306          p.email_address email_address
307   FROM pa_dist_list_items i,
308        pa_project_parties_v p,
309        fnd_user u
310   WHERE i.list_id = cp_list_id
311     AND i.access_level >= p_access_level
312     AND i.recipient_type = 'PROJECT_ROLE'
313     AND p.project_role_id = i.recipient_id
314     AND p.object_type = l_object_type
315     AND p.object_id = l_object_id
316     AND u.user_name=p.user_name
317     AND (TRUNC(SYSDATE) BETWEEN TRUNC(u.start_date) AND NVL(TRUNC(u.end_date),SYSDATE))
318     AND trunc(sysdate) between p.start_date_active and nvl(p.end_date_active,sysdate + 1)
319   UNION ALL
320   SELECT p.user_name user_name,
321          p.resource_source_name full_name,
322          p.email_address email_address
323   FROM pa_project_parties_v p,
324        fnd_user u
325   WHERE EXISTS (SELECT 1 FROM pa_dist_list_items i
326                 WHERE i.list_id = cp_list_id
327                   AND i.access_level >= p_access_level
328                   AND i.recipient_type = 'ALL_PROJECT_PARTIES')
329     AND p.object_type = l_object_type
330     AND p.object_id = l_object_id
331     AND u.user_name=p.user_name
332     AND (TRUNC(SYSDATE) BETWEEN TRUNC(u.start_date) AND NVL(TRUNC(u.end_date),SYSDATE))
333     AND trunc(sysdate) between p.start_date_active and nvl(p.end_date_active,sysdate + 1)
334   UNION ALL
335   SELECT u.user_name user_name,
336          hzp.party_name full_name,
337          hzp.email_address email_address
338   FROM pa_dist_list_items i,
339        hz_parties hzp,
340        fnd_user u
341   WHERE i.list_id = cp_list_id
342     AND i.access_level >= p_access_level
343     AND i.recipient_type = 'HZ_PARTY'
344     AND hzp.party_id = i.recipient_id
345     AND SUBSTR(hzp.orig_system_reference, 1, 3) <> 'PER'
346     AND u.person_party_id (+) = hzp.party_id
347 -- Bug 4527617. Replaced customer_id with person_party_id.
348     AND (TRUNC(SYSDATE) BETWEEN TRUNC(u.start_date) AND NVL(TRUNC(u.end_date),SYSDATE))
349   UNION ALL
350   SELECT u.user_name user_name,
351          per.full_name full_name,
352          per.email_address email_address
353   FROM pa_dist_list_items i,
354        per_all_people_f per,
355        fnd_user u
356   WHERE i.list_id = cp_list_id
357     AND i.access_level >= p_access_level
358     AND i.recipient_type = 'HZ_PARTY'
359     AND per.party_id = i.recipient_id
360 --Bug 2722021 added filter on eff dates
361     AND (TRUNC(SYSDATE) BETWEEN TRUNC(per.effective_start_date)
362 			    AND TRUNC(per.effective_end_date))
363     AND u.employee_id (+) = per.person_id
364     AND (TRUNC(SYSDATE) BETWEEN TRUNC(u.start_date) AND NVL(TRUNC(u.end_date),SYSDATE))
365   UNION ALL
366   SELECT NULL user_name,
367          NULL full_name,
368          recipient_id email_address
369   FROM pa_dist_list_items i
370   WHERE i.list_id = cp_list_id
371     AND i.access_level >= p_access_level
372     AND i.recipient_type = 'EMAIL_ADDRESS');
373 
374 BEGIN
375   x_return_status := 'S';
376 
377   IF p_object_type = 'PA_OBJECT_PAGE_LAYOUT' THEN
378     SELECT object_type, object_id
379     INTO l_object_type, l_object_id
380     FROM pa_object_page_layouts
381     WHERE object_page_layout_id = p_object_id;
382 --dbms_output.put_line('object_id='||l_object_id);
383   ELSE
384 --dbms_output.put_line('unhandled object type');
385     x_return_status := 'U';
386     RETURN;
387   END IF;
388 
389   FOR l_rec IN c_list_ids LOOP
390 --dbms_output.put_line('list_id='||l_rec.list_id);
391     FOR l_rec1 IN c_dist_list(l_rec.list_id) LOOP
392 --dbms_output.put_line('email='||l_rec1.email_address);
393       IF x_user_names IS NULL THEN
394         x_user_names := PA_VC_1000_150(l_rec1.user_name);
395       ELSE
396         x_user_names.EXTEND;
397         x_user_names(x_user_names.COUNT) := l_rec1.user_name;
398       END IF;
399 
400       IF x_full_names IS NULL THEN
401         x_full_names := PA_VC_1000_150(l_rec1.full_name);
402       ELSE
403         x_full_names.EXTEND;
404         x_full_names(x_full_names.COUNT) := l_rec1.full_name;
405       END IF;
406 
407       IF x_email_addresses IS NULL THEN
408         x_email_addresses := PA_VC_1000_150(l_rec1.email_address);
409       ELSE
410         x_email_addresses.EXTEND;
411         x_email_addresses(x_email_addresses.COUNT) := l_rec1.email_address;
412       END IF;
413 
414     END LOOP;
415   END LOOP;
416 
417 EXCEPTION
418    WHEN FND_API.G_EXC_ERROR THEN
419      x_return_status := 'E';
420    WHEN OTHERS THEN
421 --dbms_output.put_line('unhandled exception');
422      x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
423      fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_OBJECT_DIST_LISTS_UTILS',
424                              p_procedure_name => 'GET_ACCESS_LEVEL',
425                              p_error_text     => SUBSTRB(SQLERRM,1,240));
426 END get_dist_list;
427 
428 
429 /* Added for Bug 6843694
430  * Returns the list of people to whom email notification has to be sent (username, fullname and email id)
431  * Used in the Status Report flow
432  */
433 PROCEDURE get_dist_list_email (
434         p_object_type        IN   VARCHAR2,
435         p_object_id          IN   VARCHAR2,
436         p_access_level       IN   NUMBER,
437         x_user_names         OUT  NOCOPY PA_VC_1000_150,
438         x_full_names         OUT  NOCOPY PA_VC_1000_150,
439         x_email_addresses    OUT  NOCOPY PA_VC_1000_150,
440         x_return_status      OUT  NOCOPY VARCHAR2,
441         x_msg_count          OUT  NOCOPY NUMBER,
442         x_msg_data           OUT  NOCOPY VARCHAR2
443 )
444 IS
445         l_object_type VARCHAR2(30);
449 
446         l_object_id NUMBER;
447         l_return_value NUMBER := 0;
448         i NUMBER;
450         CURSOR c_list_ids IS
451         SELECT list_id
452         FROM pa_object_dist_lists
453         WHERE object_type = p_object_type
454         AND object_id = p_object_id;
455 
456         /*
457          * 1. Modified this cursor to filter out records based on the value of the email column
458          *    in pa_dist_list_items.
459          * 2. Retrieve all team members if 'Send Status Report by email to all project team members'
460          *    is selected.
461          * 3. Removed the condition SELECT for ALL_PROJECT_PARTIES as this has nothing to do with
462          *    email notifications.
463          * 4. Null handled the SELECTs for customers and non team members.
464          */
465         CURSOR c_dist_list(cp_list_id NUMBER) IS
466         SELECT DISTINCT user_name, full_name, email_address FROM (
467                 SELECT        p.user_name user_name,
468                         p.resource_source_name full_name,
469                         p.email_address email_address
470                 FROM        pa_dist_list_items i,
471                         pa_project_parties_v p,
472                         fnd_user u
473                 WHERE        i.list_id = cp_list_id
474                         AND i.access_level >= p_access_level
475                         AND i.recipient_type = 'PROJECT_PARTY'
476                         AND p.project_party_id = i.recipient_id
477                         AND p.object_type = l_object_type
478                         AND p.object_id = l_object_id
479                         AND u.user_name=p.user_name
480                         AND (TRUNC(SYSDATE) BETWEEN TRUNC(u.start_date) AND NVL(TRUNC(u.end_date),SYSDATE))
481 			AND trunc(sysdate) between p.start_date_active and nvl(p.end_date_active,sysdate + 1)
482                         AND NVL(i.email, 'Y') <> 'N'
483                 UNION ALL
484                 SELECT        p.user_name user_name,
485                         p.resource_source_name full_name,
486                         p.email_address email_address
487                 FROM        pa_dist_list_items i,
488                         pa_project_parties_v p,
489                         fnd_user u
490                 WHERE        i.list_id = cp_list_id
491                         AND i.access_level >= p_access_level
492                         AND i.recipient_type = 'PROJECT_ROLE'
493                         AND p.project_role_id = i.recipient_id
494                         AND p.object_type = l_object_type
495                         AND p.object_id = l_object_id
496                         AND u.user_name=p.user_name
497                         AND (TRUNC(SYSDATE) BETWEEN TRUNC(u.start_date) AND NVL(TRUNC(u.end_date),SYSDATE))
498 			AND trunc(sysdate) between p.start_date_active and nvl(p.end_date_active,sysdate + 1)
499                         AND NVL(i.email, 'Y') <> 'N'
500                 UNION ALL
501                 SELECT        u.user_name user_name,
502                         hzp.party_name full_name,
503                         hzp.email_address email_address
504                 FROM        pa_dist_list_items i,
505                         hz_parties hzp,
506                         fnd_user u
507                 WHERE        i.list_id = cp_list_id
508                 AND        i.access_level >= p_access_level
509                         AND i.recipient_type = 'HZ_PARTY'
510                         AND hzp.party_id = i.recipient_id
511                         AND SUBSTR(hzp.orig_system_reference, 1, 3) <> 'PER'
512                         AND u.customer_id (+) = hzp.party_id
513                         AND ((u.customer_id IS NULL) OR
514                                 (TRUNC(SYSDATE) BETWEEN TRUNC(u.start_date) AND NVL(TRUNC(u.end_date),SYSDATE)))
515                         AND nvl(i.email, 'Y') <> 'N'
516                 UNION ALL
517                 SELECT        u.user_name user_name,
518                         per.full_name full_name,
519                         per.email_address email_address
520                 FROM        pa_dist_list_items i,
521                         per_all_people_f per,
522                         fnd_user u
523                 WHERE        i.list_id = cp_list_id
524                         AND i.access_level >= p_access_level
525                         AND i.recipient_type = 'HZ_PARTY'
526                         AND per.party_id = i.recipient_id
527                         AND (TRUNC(SYSDATE) BETWEEN TRUNC(per.effective_start_date)
528                                             AND TRUNC(per.effective_end_date))
529                         AND u.employee_id (+) = per.person_id
530                         AND ((u.employee_id IS NULL) OR
531                                 (TRUNC(SYSDATE) BETWEEN TRUNC(u.start_date) AND NVL(TRUNC(u.end_date),SYSDATE)))
532                         AND nvl(i.email, 'Y') <> 'N'
533                 UNION ALL
534                 SELECT        NULL user_name,
535                         NULL full_name,
536                         recipient_id email_address
537                 FROM        pa_dist_list_items i
538                 WHERE        i.list_id = cp_list_id
539                 AND        i.access_level >= p_access_level
540                 AND        i.recipient_type = 'EMAIL_ADDRESS'
541                 AND nvl(i.email, 'Y') <> 'N'
542                 -- Send Status Report by email to all project team members
543                 UNION ALL
544                 SELECT        DISTINCT p.user_name user_name,
545                         p.resource_source_name full_name,
546                         p.email_address email_address
547                 FROM        pa_project_parties_v p,
548                         fnd_user u
549                 WHERE EXISTS (        SELECT 1
550                                 FROM        pa_dist_list_items i
551                                 WHERE        i.list_id = cp_list_id
552                                 AND        i.access_level >= p_access_level
553                                 AND        i.recipient_type = 'EMAIL_ALL'
554                         )
555                 AND p.object_type = l_object_type
556                 AND p.object_id = l_object_id
557                 AND u.user_name=p.user_name
558                 AND (TRUNC(SYSDATE) BETWEEN TRUNC(u.start_date) AND NVL(TRUNC(u.end_date),SYSDATE))
559 		AND trunc(sysdate) between p.start_date_active and nvl(p.end_date_active,sysdate + 1)
560                 AND p.party_type IN ('EMPLOYEE', 'PERSON')
561         );
562 
563 
564 BEGIN
565         x_return_status := 'S';
566 
567         IF p_object_type = 'PA_OBJECT_PAGE_LAYOUT' THEN
568                 SELECT object_type, object_id
569                 INTO l_object_type, l_object_id
570                 FROM pa_object_page_layouts
571                 WHERE object_page_layout_id = p_object_id;
572 
573         ELSE
574                 x_return_status := 'U';
575                 RETURN;
576         END IF;
577 
578         FOR l_rec IN c_list_ids LOOP
579                 FOR l_rec1 IN c_dist_list(l_rec.list_id) LOOP
580                         IF x_user_names IS NULL THEN
581                                 x_user_names := PA_VC_1000_150(l_rec1.user_name);
582                         ELSE
583                                 x_user_names.EXTEND;
584                                 x_user_names(x_user_names.COUNT) := l_rec1.user_name;
585                         END IF;
586 
587                         IF x_full_names IS NULL THEN
588                                 x_full_names := PA_VC_1000_150(l_rec1.full_name);
589                         ELSE
590                                 x_full_names.EXTEND;
591                                 x_full_names(x_full_names.COUNT) := l_rec1.full_name;
592                         END IF;
593 
594                         IF x_email_addresses IS NULL THEN
595                                 x_email_addresses := PA_VC_1000_150(l_rec1.email_address);
596                         ELSE
597                                 x_email_addresses.EXTEND;
598                                 x_email_addresses(x_email_addresses.COUNT) := l_rec1.email_address;
599                         END IF;
600 
601                 END LOOP;
602         END LOOP;
603 
604 EXCEPTION
605         WHEN FND_API.G_EXC_ERROR THEN
606                 x_return_status := 'E';
607         WHEN OTHERS THEN
608                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
609                 fnd_msg_pub.add_exc_msg(p_pkg_name       => 'PA_OBJECT_DIST_LISTS_UTILS',
610                                         p_procedure_name => 'GET_DIST_LIST_EMAIL',
611                                         p_error_text     => SUBSTRB(SQLERRM,1,240));
612 END get_dist_list_email;
613 
614 -- added by atwang....copies the distribution list
615 
616    PROCEDURE copy_dist_list
617     ( p_object_type_from IN VARCHAR2,
618       p_object_id_from IN NUMBER,
619       p_object_type_to IN VARCHAR2,
620       p_object_id_to IN  NUMBER,
621       P_CREATED_BY 		in NUMBER default fnd_global.user_id,
622       P_CREATION_DATE 	in DATE default sysdate,
623       P_LAST_UPDATED_BY 	in NUMBER default fnd_global.user_id,
624       P_LAST_UPDATE_DATE 	in DATE default sysdate,
625       P_LAST_UPDATE_LOGIN 	in NUMBER default fnd_global.user_id,
626       x_return_status      OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
627       x_msg_count          OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
631 
628       x_msg_data           OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
629       )
630     IS
632           -- Enter the procedure variables here. As shown below
633      l_object_type VARCHAR2(30);
634      l_object_id NUMBER;
635      l_resource_type_id NUMBER(15);
636      l_resource_source_id NUMBER(15);
637      l_project_role_id NUMBER(15);
638      l_list_id_from NUMBER(15);
639      l_list_id_to NUMBER(15);
640      l_recipient_type VARCHAR2(30);
641      l_recipient_id VARCHAR2(150);
642      l_access_level NUMBER(2);
643      l_email VARCHAR2(2);
644      l_menu_id NUMBER(15);
645      l_list_item_id NUMBER(15);
646      l_count NUMBER(15);
647      l_project_party_id NUMBER(15);
648 
649 
650 
651     CURSOR get_object IS SELECT object_id, object_type
652                 FROM pa_object_page_layouts
653                 WHERE page_type_code = 'PPR'
654                 AND object_page_layout_id = p_object_id_to;
655 
656     CURSOR get_list_id_from IS SELECT list_id
657                 FROM pa_object_dist_lists
658                 WHERE object_type = p_object_type_from
659                 AND object_id = p_object_id_from;
660 
661     CURSOR get_list_id_to IS SELECT list_id
662                 FROM pa_object_dist_lists
663                 WHERE object_type = p_object_type_to
664                 AND object_id = p_object_id_to;
665 
666     CURSOR get_project_party_to IS SELECT b.project_party_id
667                 FROM pa_project_parties a, pa_project_parties b
668                 WHERE a.project_party_id = l_recipient_id
669                 AND b.object_type = a.object_type
670                 AND b.object_id = l_object_id
671                 AND b.resource_type_id = a.resource_type_id
672                 AND b.resource_source_id = a.resource_source_id
673                 AND b.project_role_id = a.project_role_id;
674 
675     CURSOR get_list_items IS SELECT recipient_type, recipient_id, access_level, email, menu_id
676                 FROM pa_dist_list_items
677                 WHERE list_id = l_list_id_from;
678 
679 
680     BEGIN
681 
682 -- Check to see that no distribution list currently exists
683         OPEN get_list_id_to;
684         FETCH get_list_id_to INTO l_list_id_to;
685         IF get_list_id_to%FOUND THEN
686             CLOSE get_list_id_to;
687             x_return_status := FND_API.G_RET_STS_ERROR;
688             fnd_message.set_name('PA','PA_DL_LIST_ID_INV');
689             fnd_msg_pub.add();
690             fnd_msg_pub.count_and_get(p_count => x_msg_count,
691                                       p_data  => x_msg_data);
692             return;
693         END IF;
694         CLOSE get_list_id_to;
695         OPEN get_object;
696         FETCH get_object INTO  l_object_id,l_object_type;
697         CLOSE get_object;
698 
699         OPEN get_list_id_from;
700         FETCH get_list_id_from INTO l_list_id_from;
701         CLOSE get_list_id_from;
702         select pa_distribution_lists_s.nextVal into l_list_id_to from dual;
703 
704         -- create new entry into pa_distribution_lists
705 
706         PA_DISTRIBUTION_LISTS_PVT.CREATE_DIST_LIST(P_VALIDATE_ONLY => 'F',
707                                                     P_LIST_ID => l_list_id_to,
708                                                     P_NAME => l_list_id_to,
709                                                     P_DESCRIPTION => l_list_id_to,
710                                                     x_return_status => x_return_status,
711                                                     x_msg_count => x_msg_count,
712                                                     x_msg_data => x_msg_data);
713         IF x_return_status<>'S' THEN
714             RETURN;
715         END IF;
716 
717         -- create new entry into pa_object_dist_lists table
718 
719         PA_OBJECT_DIST_LISTS_PVT.CREATE_OBJECT_DIST_LIST(P_VALIDATE_ONLY => 'F',
720                                                             P_LIST_ID => l_list_id_to,
721                                                             P_OBJECT_TYPE => p_object_type_to,
722                                                            P_OBJECT_ID => p_object_id_to,
723                                                             x_return_status => x_return_status,
724                                                             x_msg_count => x_msg_count,
725                                                             x_msg_data => x_msg_data);
726         IF x_return_status<>'S' THEN
727             RETURN;
728         END IF;
729 
730             --Loop to copy all items
731         FOR c_list_item IN get_list_items LOOP
732                 l_recipient_type := c_list_item.recipient_type;
733                 l_recipient_id := c_list_item.recipient_id;
734                 l_access_level := c_list_item.access_level;
735                 l_email := c_list_item.email;
736                 l_menu_id := c_list_item.menu_id;
737 
738                 -- If the item is a project_party type, need to find the corresponding project_party_id for
739                 -- the new object
740 
741                 IF (l_recipient_type = 'PROJECT_PARTY') THEN
742                     OPEN get_project_party_to;
743                     FETCH get_project_party_to INTO l_project_party_id;
744                     CLOSE get_project_party_to;
745                     l_recipient_id := l_project_party_id;
746                 END IF;
747 
748 
749                 select pa_dist_list_items_s.nextVal into l_list_item_id from dual;
750 
751                 PA_DISTRIBUTION_LISTS_PVT.CREATE_DIST_LIST_ITEM(P_VALIDATE_ONLY => 'F',
752                                                               P_LIST_ITEM_ID => l_list_item_id,
753                                                               P_LIST_ID => l_list_id_to,
754                                                               P_RECIPIENT_TYPE => l_recipient_type,
755                                                               P_RECIPIENT_ID => l_recipient_id,
756                                                               P_ACCESS_LEVEL => l_access_level,
757                                                               P_EMAIL => l_email,
758                                                               P_MENU_ID => l_menu_id,
759                                                               x_return_status => x_return_status,
760                                                               x_msg_count => x_msg_count,
761                                                               x_msg_data => x_msg_data);
762 
763                  IF x_return_status<>'S' THEN
764                     RETURN;
765                  END IF;
766         END LOOP;
767    END;
768 
769  Function Check_valid_dist_list_item_id (
770                         p_list_item_id in Number )
771  return VARCHAR2
772  IS
773  Cursor C1 is
774  Select 'X' from pa_dist_list_items
775  where list_item_id = p_list_item_id;
776 
777  l_dummy   varchar2(1);
778  l_return_status  varchar2(1) := 'T';
779  Begin
780   Open C1;
781   fetch C1 into l_dummy;
782   if (C1%NOTFOUND) then
783    l_return_status := 'F';
784   else
785    l_return_status := 'T';
786   end if;
787   close C1;
788 
789   return l_return_status;
790 
791  Exception
792   When others then
793    RAISE;
794 
795  End Check_valid_dist_list_item_id;
796 
797 
798 
799 
800 END  PA_DISTRIBUTION_LIST_UTILS;