DBA Data[Home] [Help]

PACKAGE BODY: APPS.AMW_SETUP_RISK_TYPES_PVT

Source


1 PACKAGE BODY AMW_SETUP_RISK_TYPES_PVT as
2 /* $Header: amwvrtpb.pls 120.1 2006/04/17 07:43:39 appldev noship $ */
3 
4 -- ===============================================================
5 -- Package name
6 --          AMW_SETUP_RISK_TYPES_PVT
7 -- Purpose
8 -- 		  	for handling setup risk type actions
9 --
10 -- History
11 -- 		  	07/14/2004    tsho     Creates
12 -- ===============================================================
13 
14 
15 G_PKG_NAME 	CONSTANT VARCHAR2(30)	:= 'AMW_SETUP_RISK_TYPES_PVT';
16 G_FILE_NAME CONSTANT VARCHAR2(12) 	:= 'amwvrtpb.pls';
17 
18 -- ===============================================================
19 -- Procedure name
20 --          Reassign_Risk_Type
21 -- Purpose
22 -- 		  	Reassign specified risk type to other parent risk type.
23 -- ===============================================================
24 PROCEDURE Reassign_Risk_Type(
25     p_setup_risk_type_id         IN   NUMBER,
26     p_parent_setup_risk_type_id  IN   NUMBER
27 )IS
28 BEGIN
29     null;
30 END Reassign_Risk_Type;
31 
32 
33 -- ===============================================================
34 -- Procedure name
35 --          Delete_Risk_Types
36 -- Purpose
37 -- 		  	Delete specified risk type and its descendant.
38 --          Delete associations records in AMW_COMPLIANCE_ENV_ASSOCS
39 --          for the specified risk type and its descendant.
40 -- ===============================================================
41 PROCEDURE Delete_Risk_Types(
42     p_setup_risk_type_id  IN         NUMBER,
43     p_init_msg_list       IN         VARCHAR2   := FND_API.G_FALSE,
44     p_commit              IN         VARCHAR2   := FND_API.G_FALSE,
45     p_validate_only       IN         VARCHAR2   := FND_API.G_FALSE,
46     x_return_status       OUT NOCOPY VARCHAR2,
47     x_msg_count           OUT NOCOPY NUMBER,
48     x_msg_data            OUT NOCOPY VARCHAR2
49 )IS
50   l_setup_risk_type_id NUMBER;
51 
52   -- store the target setup risk types
53   l_risk_type_list G_NUMBER_TABLE;
54 
55   i NUMBER;
56 
57 BEGIN
58   -- create savepoint if p_commit is true
59   IF p_commit = FND_API.G_TRUE THEN
60     SAVEPOINT Delete_Risk_Types_Save;
61   END IF;
62 
63   -- initialize message list if p_init_msg_list is set to true
64   if FND_API.to_boolean(nvl(p_init_msg_list, FND_API.G_FALSE)) then
65     fnd_msg_pub.initialize;
66   end if;
67 
68   l_setup_risk_type_id := p_setup_risk_type_id;
69   l_risk_type_list := GET_ALL_DESCENDANTS(l_setup_risk_type_id);
70 
71   IF (l_risk_type_list.FIRST is not NULL) THEN
72     FOR i in 0 .. l_risk_type_list.LAST LOOP
73       delete from AMW_SETUP_RISK_TYPES_B
74       where SETUP_RISK_TYPE_ID = l_risk_type_list(i);
75     END LOOP; -- end of for
76 
77     FOR i in 0 .. l_risk_type_list.LAST LOOP
78       delete from AMW_SETUP_RISK_TYPES_TL
79       where SETUP_RISK_TYPE_ID = l_risk_type_list(i)
80       and SETUP_RISK_TYPE_ID not in (
81         select SETUP_RISK_TYPE_ID from AMW_SETUP_RISK_TYPES_B
82       )
83       and SETUP_RISK_TYPE_ID not in (
84         select PARENT_SETUP_RISK_TYPE_ID from AMW_SETUP_RISK_TYPES_B
85         where parent_setup_risk_type_id is not null
86       );
87     END LOOP; -- end of for
88 
89     FOR i in 0 .. l_risk_type_list.LAST LOOP
90       delete from AMW_RISK_TYPE
91       where RISK_TYPE_CODE = (
92         select RISK_TYPE_CODE
93         from AMW_SETUP_RISK_TYPES_B
94         where SETUP_RISK_TYPE_ID = l_risk_type_list(i)
95       );
96     END LOOP; -- end of for
97 
98   END IF; -- end of if: l_risk_type_list
99 
100   EXCEPTION
101   WHEN FND_API.G_EXC_ERROR THEN
102         IF p_commit = FND_API.G_TRUE THEN
103               ROLLBACK TO Delete_Risk_Types_Save;
104         END IF;
105 
106         x_return_status := FND_API.G_RET_STS_ERROR;
107 
108         fnd_msg_pub.count_and_get(p_count   =>   x_msg_count,
109                                   p_data    =>   x_msg_data);
110 
111   WHEN OTHERS THEN
112        IF p_commit = FND_API.G_TRUE THEN
113               ROLLBACK TO Delete_Risk_Types_Save;
114        END IF;
115 
116        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
117 
118        fnd_msg_pub.add_exc_msg(p_pkg_name       =>    'AMW_SETUP_RISK_TYPES_PVT',
119                                p_procedure_name =>    'Delete_Risk_Types',
120                                p_error_text     =>     SUBSTRB(SQLERRM,1,240));
121 
122        fnd_msg_pub.count_and_get(p_count   =>   x_msg_count,
123                                  p_data    =>   x_msg_data);
124 
125 END Delete_Risk_Types;
126 
127 
128 -- ===============================================================
129 -- Procedure name
130 --          InValidate_Risk_Types
131 -- Purpose
132 -- 		  	InValidate(End-Date) specified risk type and its descendants.
133 -- Notes
134 --          Should update those descendant's end_date to be the same as its end_date
135 --          if the descendant's end_date is null or end_date is later than its end_date.
136 --          At any point of time, child's(descendant) end_date cannot be later than
137 --          parent's end_date.(aka, if parent risk type is invalid, so is all its descendants).
138 -- ===============================================================
139 PROCEDURE InValidate_Risk_Types(
140     p_setup_risk_type_id  IN         NUMBER,
141     p_end_date            IN         DATE,
142     p_init_msg_list       IN         VARCHAR2   := FND_API.G_FALSE,
143     p_commit              IN         VARCHAR2   := FND_API.G_FALSE,
144     p_validate_only       IN         VARCHAR2   := FND_API.G_FALSE,
145     x_return_status       OUT NOCOPY VARCHAR2,
146     x_msg_count           OUT NOCOPY NUMBER,
147     x_msg_data            OUT NOCOPY VARCHAR2
148 ) IS
149 
150   l_setup_risk_type_id NUMBER;
151 
152   -- store the target setup risk types
153   l_risk_type_list G_NUMBER_TABLE;
154 
155   i NUMBER;
156 
157 BEGIN
158   -- create savepoint if p_commit is true
159   IF p_commit = FND_API.G_TRUE THEN
160     SAVEPOINT InValidate_Risk_Types_Save;
161   END IF;
162 
163   -- initialize message list if p_init_msg_list is set to true
164   if FND_API.to_boolean(nvl(p_init_msg_list, FND_API.G_FALSE)) then
165     fnd_msg_pub.initialize;
166   end if;
167 
168   -- initialize return status to success
169   x_return_status := fnd_api.g_ret_sts_success;
170 
171 
172   l_setup_risk_type_id := p_setup_risk_type_id;
173   l_risk_type_list := GET_ALL_DESCENDANTS(l_setup_risk_type_id);
174 
175   IF (l_risk_type_list.FIRST is not NULL) THEN
176     -- update its end_date
177     update AMW_SETUP_RISK_TYPES_B
178        set END_DATE = p_end_date
179      where SETUP_RISK_TYPE_ID = l_risk_type_list(0);
180 
181     -- should update those descendant's end_date to be the same as its end_date
182     -- if the descendant's end_date is null or end_date is later than its end_date
183     FOR i in 1 .. l_risk_type_list.LAST LOOP
184       --DBMS_OUTPUT.PUT_LINE(' l_risk_type_list('||i||') = '||l_risk_type_list(i));
185       update AMW_SETUP_RISK_TYPES_B
186          set END_DATE = p_end_date
187        where SETUP_RISK_TYPE_ID = l_risk_type_list(i)
188          and (END_DATE IS NULL OR END_DATE > p_end_date);
189     END LOOP; -- end of for
190   END IF; -- end of if: l_risk_type_list
191 
192   EXCEPTION
193   WHEN FND_API.G_EXC_ERROR THEN
194         IF p_commit = FND_API.G_TRUE THEN
195               ROLLBACK TO InValidate_Risk_Types_Save;
196         END IF;
197 
198         x_return_status := FND_API.G_RET_STS_ERROR;
199 
200         fnd_msg_pub.count_and_get(p_count   =>   x_msg_count,
201                                   p_data    =>   x_msg_data);
202 
203   WHEN OTHERS THEN
204        IF p_commit = FND_API.G_TRUE THEN
205               ROLLBACK TO InValidate_Risk_Types_Save;
206        END IF;
207 
208        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
209 
210        fnd_msg_pub.add_exc_msg(p_pkg_name       =>    'AMW_SETUP_RISK_TYPES_PVT',
211                                p_procedure_name =>    'InValidate_Risk_Types',
212                                p_error_text     =>     SUBSTRB(SQLERRM,1,240));
213 
214        fnd_msg_pub.count_and_get(p_count   =>   x_msg_count,
215                                  p_data    =>   x_msg_data);
216 
217 END InValidate_Risk_Types;
218 
219 
220 -- ===============================================================
221 -- Function name
222 --          RISK_TYPE_PRESENT
223 -- Purpose
224 -- 		    return non translated character (Y/N) to indicate the
225 --          selected(associated) Setup Risk Type to specified RiskRevId
226 -- ===============================================================
227 FUNCTION RISK_TYPE_PRESENT (
228     p_risk_rev_id         IN         NUMBER,
229     p_risk_type_code      IN         VARCHAR2
230 ) RETURN VARCHAR2 IS
231 
232 n     number;
233 BEGIN
234    select count(*)
235    into n
236    from amw_risk_type
237    where risk_rev_id = p_risk_rev_id
238    and   risk_type_code = p_risk_type_code;
239 
240    if n > 0 then
241        return 'Y';
242    else
243        return 'N';
244    end if;
245 END   RISK_TYPE_PRESENT;
246 
247 
248 -- ===============================================================
249 -- Function name
250 --          RISK_TYPE_PRESENT_MEAN
251 -- Purpose
252 -- 		    return translated meaning (Yes/No) to indicate the
253 --          selected(associated) Setup Risk Type to specified RiskRevId
254 -- ===============================================================
255 FUNCTION RISK_TYPE_PRESENT_MEAN (
256     p_risk_rev_id         IN         NUMBER,
257     p_risk_type_code      IN         VARCHAR2
258 ) RETURN VARCHAR2 IS
259 
260 n     number;
261 yes   varchar2(80);
262 no    varchar2(80);
263 BEGIN
264    select count(*)
265    into n
266    from amw_risk_type
267    where risk_rev_id = p_risk_rev_id
268    and   risk_type_code = p_risk_type_code;
269 
270    select meaning
271    into yes
272    from fnd_lookups
273    where lookup_type='YES_NO'
274    and lookup_code='Y';
275 
276    select meaning
277    into no
278    from fnd_lookups
279    where lookup_type='YES_NO'
280    and lookup_code='N';
281 
282    if n > 0 then
283        return yes;
284    else
285        return no;
286    end if;
287 END   RISK_TYPE_PRESENT_MEAN;
288 
289 
290 -- ===============================================================
291 -- Function name
292 --          IS_SELF_DESCENDANT_ASSOC_TO_RISK
293 -- Purpose
294 -- 		    return non translated character (Y/N) to indicate if the
295 --          Setup Risk Type or at least one of its descendants are
296 --          associated to specified RiskRevId under specfied compliance
297 -- ===============================================================
298 FUNCTION IS_DESCENDANT_ASSOC_TO_RISK (
299     p_risk_rev_id         IN         NUMBER,
300     p_setup_risk_type_id  IN         NUMBER,
301     p_compliance_env_id   IN         NUMBER
302 ) RETURN VARCHAR2 IS
303 
304   l_setup_risk_type_id NUMBER;
305   l_risk_rev_id NUMBER;
306   l_compliance_env_id NUMBER;
307 
308   -- store the setup risk types
309   l_risk_type_list G_NUMBER_TABLE;
310 
311   i NUMBER;
312   l_dummy NUMBER;
313   isDescendantAssociatedToRisk VARCHAR2(1);
314 
315   -- find if specified risk type or any of its descendants are associated with the specified risk_rev_id
316   cursor is_assoc_risk_c (l_setup_risk_type_id IN NUMBER, l_risk_rev_id IN NUMBER, l_compliance_env_id IN NUMBER) is
317       SELECT assoc.risk_type_id
318         from amw_risk_type assoc,
319              amw_setup_risk_types_b rt,
320              amw_compliance_env_assocs compEnv
321        where assoc.risk_rev_id = l_risk_rev_id
322          and rt.setup_risk_type_id = l_setup_risk_type_id
323          and assoc.risk_type_code = rt.risk_type_code
324          and compEnv.object_type = 'SETUP_RISK_TYPE'
325          and compEnv.pk1 = l_setup_risk_type_id
326          and compEnv.compliance_env_id = l_compliance_env_id;
327 
328 BEGIN
329 
330   isDescendantAssociatedToRisk := 'N';
331   l_setup_risk_type_id := p_setup_risk_type_id;
332   l_risk_rev_id := p_risk_rev_id;
333   l_compliance_env_id := p_compliance_env_id;
334   l_risk_type_list := GET_ALL_DESCENDANTS(l_setup_risk_type_id);
335 
336   IF (l_risk_type_list.FIRST is not NULL) THEN
337     FOR i in 0 .. l_risk_type_list.LAST LOOP
338       OPEN is_assoc_risk_c (l_risk_type_list(i), l_risk_rev_id, l_compliance_env_id);
339       FETCH is_assoc_risk_c INTO l_dummy;
340       CLOSE is_assoc_risk_c;
341 
342       IF (l_dummy is not NULL) THEN
343         isDescendantAssociatedToRisk := 'Y';
344         EXIT;
345       END IF;
346 
347     END LOOP;
348   END IF;
349 
350   return isDescendantAssociatedToRisk;
351 
352 END IS_DESCENDANT_ASSOC_TO_RISK;
353 
354 
355 
356 -- ===============================================================
357 -- Procedure name
358 --          PROCESS_RISK_TYPE_ASSOCS
359 -- Purpose
360 -- 		    Update the risk-riskTypes associations(store in table AMW_RISK_TYPE)
361 --          depending on the specified p_select_flag .
362 -- ===============================================================
366                    p_validate_only       IN         VARCHAR2   := FND_API.G_FALSE,
363 PROCEDURE PROCESS_RISK_TYPE_ASSOCS (
364                    p_init_msg_list       IN         VARCHAR2   := FND_API.G_FALSE,
365                    p_commit              IN         VARCHAR2   := FND_API.G_FALSE,
367                    p_select_flag         IN         VARCHAR2,
368                    p_risk_rev_id         IN         NUMBER,
369                    p_risk_type_code      IN         VARCHAR2,
370                    x_return_status       OUT NOCOPY VARCHAR2,
371                    x_msg_count           OUT NOCOPY NUMBER,
372                    x_msg_data            OUT NOCOPY VARCHAR2
373 )IS
374 
375 l_creation_date         date;
376 l_created_by            number;
377 l_last_update_date      date;
378 l_last_updated_by       number;
379 l_last_update_login     number;
380 l_risk_type_assoc_id    number;
381 l_object_version_number number;
382 
383 BEGIN
384 
385   -- create savepoint if p_commit is true
386      IF p_commit = FND_API.G_TRUE THEN
387           SAVEPOINT setup_risk_type_assoc_save;
388      END IF;
389 
390   -- initialize message list if p_init_msg_list is set to true
391      if FND_API.to_boolean(nvl(p_init_msg_list, FND_API.G_FALSE)) then
392           fnd_msg_pub.initialize;
393      end if;
394 
395   -- initialize return status to success
396      x_return_status := fnd_api.g_ret_sts_success;
397 
398      delete from amw_risk_type
399      where risk_rev_id = p_risk_rev_id
400      and   risk_type_code = p_risk_type_code;
401 
402      if (p_select_flag = 'Y') then
403           l_creation_date := SYSDATE;
404           l_created_by := FND_GLOBAL.USER_ID;
405           l_last_update_date := SYSDATE;
406           l_last_updated_by := FND_GLOBAL.USER_ID;
407           l_last_update_login := FND_GLOBAL.USER_ID;
408           l_object_version_number := 1;
409 
410           select amw_risk_type_s.nextval into l_risk_type_assoc_id from dual;
411 
412           insert into amw_risk_type (risk_type_id,
413                                      risk_rev_id,
414                                      risk_type_code,
415                                      creation_date,
416                                      created_by,
417                                      last_update_date,
418                                      last_updated_by,
419                                      last_update_login,
420                                      object_version_number)
421           values (l_risk_type_assoc_id,
422                   p_risk_rev_id,
423                   p_risk_type_code,
424                   l_creation_date,
425                   l_created_by,
426                   l_last_update_date,
427                   l_last_updated_by,
428                   l_last_update_login,
429                   l_object_version_number);
430 
431        end if;
432   EXCEPTION
433   WHEN FND_API.G_EXC_ERROR THEN
434         IF p_commit = FND_API.G_TRUE THEN
435               ROLLBACK TO setup_risk_type_assoc_save;
436         END IF;
437 
438         x_return_status := FND_API.G_RET_STS_ERROR;
439 
440         fnd_msg_pub.count_and_get(p_count   =>   x_msg_count,
441                                   p_data    =>   x_msg_data);
442 
443   WHEN OTHERS THEN
444        IF p_commit = FND_API.G_TRUE THEN
445               ROLLBACK TO setup_risk_type_assoc_save;
446        END IF;
447 
448        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
449 
450        fnd_msg_pub.add_exc_msg(p_pkg_name       =>    'AMW_SETUP_RISK_TYPES_PVT',
451                                p_procedure_name =>    'PROCESS_RISK_TYPE_ASSOCS',
452                                p_error_text     =>     SUBSTRB(SQLERRM,1,240));
453 
454        fnd_msg_pub.count_and_get(p_count   =>   x_msg_count,
455                                  p_data    =>   x_msg_data);
456 
457 END PROCESS_RISK_TYPE_ASSOCS;
458 
459 
460 -- ===============================================================
461 -- Function name
462 --          GET_ALL_DESCENDANTS
463 -- Purpose
464 -- 		    to get all the descendants of specified risk type
465 -- ===============================================================
466 FUNCTION GET_ALL_DESCENDANTS (
467     p_setup_risk_type_id         IN         NUMBER
468 ) RETURN G_NUMBER_TABLE IS
469 
470   l_setup_risk_type_id NUMBER;
471 
472   -- store the target setup risk types
473   risk_type_list G_NUMBER_TABLE;
474   risk_type_list_cur PLS_INTEGER;
475   risk_type_list_size PLS_INTEGER;
476   tbl_risk_type_id G_NUMBER_TABLE;
477 
478   -- find the direct children of specified setup risk type
479   cursor get_child_risk_type_c (l_setup_risk_type_id IN NUMBER) is
480       SELECT SETUP_RISK_TYPE_ID
481         from amw_setup_risk_types_b
482        where PARENT_SETUP_RISK_TYPE_ID  = l_setup_risk_type_id;
483 
484   -- find how many direct children of specified setup risk type
485   cursor get_child_count_c (l_setup_risk_type_id IN NUMBER) is
486       SELECT count(*)
487         from amw_setup_risk_types_b
488        where PARENT_SETUP_RISK_TYPE_ID  = l_setup_risk_type_id;
489 
490   last_index PLS_INTEGER;
491   i NUMBER;
492   n NUMBER;
493 
494 
495 BEGIN
496 
497   risk_type_list_cur := 0;
498   risk_type_list_size := 1;
499   risk_type_list(0) := p_setup_risk_type_id;
500 
501   WHILE (risk_type_list_cur < risk_type_list_size) LOOP
502     l_setup_risk_type_id := risk_type_list(risk_type_list_cur);
503 
504     OPEN get_child_risk_type_c (l_setup_risk_type_id);
505     FETCH get_child_risk_type_c BULK COLLECT INTO tbl_risk_type_id;
506     CLOSE get_child_risk_type_c;
507 
511         last_index := 0;
508     BEGIN
509       -- see if we found out any children
510       IF (tbl_risk_type_id.FIRST is NULL) THEN
512       ELSE
513         last_index := tbl_risk_type_id.LAST;
514       END IF;
515     EXCEPTION
516       WHEN others THEN
517         last_index := 0;
518     END;
519 
520 
521     FOR i in 1 .. last_index LOOP
522       risk_type_list(risk_type_list_size) := tbl_risk_type_id(i);
523       --DBMS_OUTPUT.PUT_LINE(' put into risk_type_list => '||tbl_risk_type_id(i));
524       risk_type_list_size := risk_type_list_size + 1;
525     END LOOP; -- end of for: last_index
526 
527     -- advance to next risk type on working list
528     risk_type_list_cur := risk_type_list_cur + 1;
529 
530   END LOOP; -- end of while: risk_type_list_cur
531 
532   RETURN risk_type_list;
533 
534 END GET_ALL_DESCENDANTS;
535 
536 
537 -- ===============================================================
538 -- Function name
539 --          IS_DESCENDANT
540 -- Purpose
541 -- 		    return 'Y' if the passed-in p_target_setup_risk_type is the descendants
542 --          of specified risk type (p_setup_risk_type_id)
543 -- Notes
544 --          one is not oneself's descendant
545 --          aka, if p_target_setup_risk_type_id == p_setup_risk_type_id,
546 --          the return value is 'N'.
547 -- ===============================================================
548 FUNCTION IS_DESCENDANT (
549     p_target_setup_risk_type_id  IN         NUMBER,
550     p_setup_risk_type_id         IN         NUMBER
551 ) RETURN VARCHAR2 IS
552 
553   l_setup_risk_type_id NUMBER;
554 
555   -- store the setup risk types
556   l_risk_type_list G_NUMBER_TABLE;
557 
558   i NUMBER;
559   isDescendant VARCHAR2(1);
560 
561 BEGIN
562   isDescendant := 'N';
563   l_setup_risk_type_id := p_setup_risk_type_id;
564   l_risk_type_list := GET_ALL_DESCENDANTS(l_setup_risk_type_id);
565 
566   IF (l_risk_type_list.FIRST is not NULL) THEN
567     FOR i in 1 .. l_risk_type_list.LAST LOOP
568       IF (l_risk_type_list(i) = p_target_setup_risk_type_id) THEN
569         isDescendant := 'Y';
570         EXIT;
571       END IF;
572     END LOOP;
573   END IF;
574 
575   return isDescendant;
576 
577 END IS_DESCENDANT;
578 
579 
580 -- ===============================================================
581 -- Function name
582 --          IS_PARENT
583 -- Purpose
584 -- 		    return 'Y' if the passed-in p_target_setup_risk_type is the direct parent
585 --          of specified risk type (p_setup_risk_type_id)
586 -- ===============================================================
587 FUNCTION IS_PARENT (
588     p_target_setup_risk_type_id  IN         NUMBER,
589     p_setup_risk_type_id         IN         NUMBER
590 ) RETURN VARCHAR2
591 IS
592   l_setup_risk_type_id NUMBER;
593   l_parent_setup_risk_type_id NUMBER;
594   isParent VARCHAR2(1);
595 
596   -- find the direct parent of specified setup risk type
597   cursor get_parent_risk_type_c (l_setup_risk_type_id IN NUMBER) is
598       SELECT PARENT_SETUP_RISK_TYPE_ID
599         from amw_setup_risk_types_b
600        where SETUP_RISK_TYPE_ID  = l_setup_risk_type_id;
601 
602 BEGIN
603   isParent := 'N';
604   l_setup_risk_type_id := p_setup_risk_type_id;
605 
606   OPEN get_parent_risk_type_c (l_setup_risk_type_id);
607   FETCH get_parent_risk_type_c INTO l_parent_setup_risk_type_id;
608   CLOSE get_parent_risk_type_c;
609 
610   IF (l_parent_setup_risk_type_id = p_target_setup_risk_type_id)THEN
611     isParent := 'Y';
612   ELSE
613     isParent := 'N';
614   END IF;
615 
616   return isParent;
617 
618 END IS_PARENT;
619 
620 
621 
622 
623 -- ===============================================================
624 -- Function name
625 --          CAN_HAVE_CHILD
626 -- Purpose
627 -- 		    return non translated character (Y/N) to indicate the
628 --          specified parent_setup_risk_type can have target setup_risk_type as child.
629 -- History
630 --          10/06/2004 tsho: bug 3902475,
631 --          if p_parent_setup_risk_type_id is the current direct parent of p_target_setup_risk_type_id
632 --          will return 'N' to prevent current parent shows up in LOV list
633 -- ===============================================================
634 FUNCTION CAN_HAVE_CHILD (
635     p_target_setup_risk_type_id   IN         NUMBER,
636     p_parent_setup_risk_type_id   IN         NUMBER
637 ) RETURN VARCHAR2 IS
638 
639   l_setup_risk_type_id NUMBER;
640   l_isParent VARCHAR2(1);
641   last_index NUMBER;
642   canHaveChild VARCHAR2(1);
643 
644   -- store the associated compliance env
645   compliance_env_list G_NUMBER_TABLE;
646 
647   -- find the associated compliance env of specified setup risk type
648   cursor get_assoc_env_c (l_setup_risk_type_id IN NUMBER) is
649       SELECT COMPLIANCE_ENV_ID
650         from amw_compliance_env_assocs
651        where OBJECT_TYPE = 'SETUP_RISK_TYPE'
652          and PK1 = l_setup_risk_type_id;
653 
654 BEGIN
655     l_setup_risk_type_id := p_target_setup_risk_type_id;
656     l_isParent := IS_PARENT (p_target_setup_risk_type_id  => p_parent_setup_risk_type_id,
657                              p_setup_risk_type_id         => p_target_setup_risk_type_id);
658     canHaveChild := 'Y';
659 
660     -- 10/06/2004 tsho: bug 3902475, should return 'N'
661     -- if p_parent_setup_risk_type_id is the current direct parent of p_target_setup_risk_type_id
662     IF (l_isParent = 'Y' ) THEN
663       return 'N';
664     END IF;
665 
669     END IF;
666     -- if parent is the root (can always add child to root)
667     IF (p_parent_setup_risk_type_id = -1) THEN
668       return 'Y';
670 
671     OPEN get_assoc_env_c (l_setup_risk_type_id);
672     FETCH get_assoc_env_c BULK COLLECT INTO compliance_env_list;
673     CLOSE get_assoc_env_c;
674 
675     BEGIN
676       -- see if we found out any children
677       IF (compliance_env_list.FIRST is NULL) THEN
678         last_index := 0;
679       ELSE
680         last_index := compliance_env_list.LAST;
681       END IF;
682     EXCEPTION
683       WHEN others THEN
684         last_index := 0;
685     END;
686 
687 
688     FOR i in 1 .. last_index LOOP
689       -- if the passed-in p_parent_setup_risk_type_id is not yet associated with compliance_env_list(i)
690       -- than p_parent_setup_risk_type_id cannot have child p_target_setup_risk_type_id
691       IF ('N' = AMW_COMPLIANCE_ENV_ASSOCS_PVT.COMPLIANCE_ENVS_PRESENT(
692                             p_compliance_env_id => compliance_env_list(i)
693                            ,p_object_type       => 'SETUP_RISK_TYPE'
694                            ,p_pk1               => p_parent_setup_risk_type_id)) THEN
695         canHaveChild := 'N';
696         exit;
697       END IF;
698     END LOOP;
699 
700   return canHaveChild;
701 
702 END CAN_HAVE_CHILD;
703 
704 
705 -- ===============================================================
706 -- Procedure name
707 --          IS_ASSOC_TO_RISK
708 -- Purpose
709 -- 		    x_is_assoc_to_risk is 'Y' if at least ONE of the passed-in
710 --          p_setup_risk_type and its descendants
711 --          are currently associated with risks in ame_risk_type table.
712 -- ===============================================================
713 PROCEDURE IS_ASSOC_TO_RISK (
714     p_init_msg_list       IN         VARCHAR2   := FND_API.G_FALSE,
715     p_commit              IN         VARCHAR2   := FND_API.G_FALSE,
716     p_validate_only       IN         VARCHAR2   := FND_API.G_FALSE,
717     p_setup_risk_type_id  IN         NUMBER,
718     x_is_assoc_to_risk    OUT NOCOPY VARCHAR2,
719     x_return_status       OUT NOCOPY VARCHAR2,
720     x_msg_count           OUT NOCOPY NUMBER,
721     x_msg_data            OUT NOCOPY VARCHAR2
722 ) IS
723 
724   l_setup_risk_type_id NUMBER;
725 
726   -- store the setup risk types
727   l_risk_type_list G_NUMBER_TABLE;
728 
729   i NUMBER;
730   l_dummy NUMBER;
731   isAssociatedToRisk VARCHAR2(1);
732 
733   -- find if there's associated risk of specified setup risk type
734   cursor get_assoc_risk_count_c (l_setup_risk_type_id IN NUMBER) is
735       SELECT count(*)
736         from amw_risk_type assoc,
737              amw_setup_risk_types_b rt
738        where rt.setup_risk_type_id = l_setup_risk_type_id
739          and assoc.risk_type_code = rt.risk_type_code;
740 
741 BEGIN
742   -- create savepoint if p_commit is true
743   IF p_commit = FND_API.G_TRUE THEN
744     SAVEPOINT IS_ASSOC_TO_RISK_SAVE;
745   END IF;
746 
747   -- initialize message list if p_init_msg_list is set to true
748   if FND_API.to_boolean(nvl(p_init_msg_list, FND_API.G_FALSE)) then
749     fnd_msg_pub.initialize;
750   end if;
751 
752   -- initialize return status to success
753   x_return_status := fnd_api.g_ret_sts_success;
754 
755   x_is_assoc_to_risk := 'N';
756   isAssociatedToRisk := 'N';
757   l_setup_risk_type_id := p_setup_risk_type_id;
758   l_risk_type_list := GET_ALL_DESCENDANTS(l_setup_risk_type_id);
759 
760   IF (l_risk_type_list.FIRST is not NULL) THEN
761     FOR i in 0 .. l_risk_type_list.LAST LOOP
762       OPEN get_assoc_risk_count_c (l_risk_type_list(i));
763       FETCH get_assoc_risk_count_c INTO l_dummy;
764       CLOSE get_assoc_risk_count_c;
765 
766       IF (l_dummy > 0) THEN
767         isAssociatedToRisk := 'Y';
768         EXIT;
769       END IF;
770 
771     END LOOP;
772   END IF;
773 
774   x_is_assoc_to_risk := isAssociatedToRisk;
775 
776   EXCEPTION
777   WHEN FND_API.G_EXC_ERROR THEN
778         IF p_commit = FND_API.G_TRUE THEN
779               ROLLBACK TO IS_ASSOC_TO_RISK_SAVE;
780         END IF;
781 
782         x_return_status := FND_API.G_RET_STS_ERROR;
783 
784         fnd_msg_pub.count_and_get(p_count   =>   x_msg_count,
785                                   p_data    =>   x_msg_data);
786 
787   WHEN OTHERS THEN
788        IF p_commit = FND_API.G_TRUE THEN
789               ROLLBACK TO IS_ASSOC_TO_RISK_SAVE;
790        END IF;
791 
792        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
793 
794        fnd_msg_pub.add_exc_msg(p_pkg_name       =>    'AMW_SETUP_RISK_TYPES_PVT',
795                                p_procedure_name =>    'Delete_Risk_Types',
796                                p_error_text     =>     SUBSTRB(SQLERRM,1,240));
797 
798        fnd_msg_pub.count_and_get(p_count   =>   x_msg_count,
799                                  p_data    =>   x_msg_data);
800 
801 END IS_ASSOC_TO_RISK;
802 
803 
804 -- ----------------------------------------------------------------------
805 
806 END AMW_SETUP_RISK_TYPES_PVT;