DBA Data[Home] [Help]

PACKAGE BODY: APPS.CZ_SECURITY_PVT

Source


1 PACKAGE BODY cz_security_pvt
2 /*      $Header: czsecurb.pls 120.4 2007/09/05 20:38:54 smanna ship $       */
3 
4 AS
5 
6 -----Pkg body declarations
7 TYPE ref_cursor IS REF CURSOR;
8 
9 -----exception declarations
10 FUNCTION_NAME_NULL       EXCEPTION;
11 PRIVILEGE_IS_NULL        EXCEPTION;
12 INVALID_PRIVILEGE        EXCEPTION;
13 INSTANCE_SET_ERR         EXCEPTION;
14 MENU_ID_NOT_FOUND        EXCEPTION;
15 OBJECT_ID_NOT_FOUND      EXCEPTION;
16 PRIV_ALREADY_EXISTS      EXCEPTION;
17 NO_PRIV_EXISTS           EXCEPTION;
18 NO_ENTITY_ACCESS_CONTROL EXCEPTION;
19 ENTITY_IS_ALREADY_LOCKED EXCEPTION;
20 HAS_NO_LOCK_PRIV         EXCEPTION;
21 INVALID_USER_NAME        EXCEPTION;
22 INVALID_APPLICATION      EXCEPTION;
23 INVALID_RESPONSIBILITY   EXCEPTION;
24 USER_NAME_NULL           EXCEPTION;
25 APPL_NAME_NULL           EXCEPTION;
26 RESP_NAME_NULL           EXCEPTION;
27 NO_LOCK_CONTROL_REQUIRED EXCEPTION;
28 NO_LOCKS_REQD_FOR_EDIT   EXCEPTION;
29 NULL_USER_NAME           EXCEPTION;
30 RESP_IS_NULL             EXCEPTION;
31 ENTITY_ROLE_IS_NULL      EXCEPTION;
32 INVALID_ROLE             EXCEPTION;
33 INVALID_UI_STYLE         EXCEPTION;
34 PROJECT_IS_LOCKED        EXCEPTION;
35 ENTITY_LOCKED_BY_USER    EXCEPTION;
36 ENTITY_LOCKED_OTH_USER   EXCEPTION;
37 MODEL_LOCKED             EXCEPTION;
38 
39 ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
40 ---get default acces profile value
41 FUNCTION get_default_access_profile
42 RETURN VARCHAR2
43 IS
44 l_return_value VARCHAR2(100):= '0';
45 BEGIN
46   l_return_value := FND_PROFILE.value(DEFAULT_ENTITY_ACCESS);
47   RETURN l_return_value ;
48 END get_default_access_profile;
49 
50 ------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
51 -----get profile value
52 FUNCTION get_profile_value(p_profile IN VARCHAR2)
53 RETURN VARCHAR2
54 IS
55 l_profile_value VARCHAR2(30);
56 
57 BEGIN
58  IF (p_profile IS NOT NULL) THEN
59     l_profile_value := FND_PROFILE.value(p_profile);
60  ELSE
61     l_profile_value := NULL;
62  END IF;
63  RETURN l_profile_value;
64 END get_profile_value;
65 
66 ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
67 -----function that returns function_id for a function name
68 FUNCTION get_function_id (p_function_name IN VARCHAR2)
69 RETURN NUMBER
70 IS
71 l_function_id NUMBER := 0;
72 BEGIN
73     SELECT function_id
74     INTO   l_function_id
75     FROM   fnd_form_functions
76     WHERE  function_name = UPPER(p_function_name);
77     RETURN l_function_id;
78 EXCEPTION
79 WHEN NO_DATA_FOUND THEN
80  l_function_id := 0;
81  RETURN l_function_id;
82 END get_function_id ;
83 
84 --------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
85 PROCEDURE log_lock_history (p_entity_type IN NUMBER,
86                             p_entity_id   IN NUMBER,
87                             p_event       IN VARCHAR2,
88                             p_event_note  IN VARCHAR2)
89 IS
90 
91 BEGIN
92   insert into cz_lock_history (ENTITY_TYPE,INSTANCE_PK1_VALUE,INSTANCE_PK2_VALUE,INSTANCE_PK3_VALUE
93 ,INSTANCE_PK4_VALUE,EVENT,EVENT_DATE,USER_NAME,EVENT_NOTE)
94   VALUES (p_entity_type,p_entity_id ,0,0,0,p_event,sysdate,FND_GLOBAL.user_name,p_event_note);
95 EXCEPTION
96 WHEN OTHERS THEN
97   NULL;  ----message needs to be logged
98 END log_lock_history ;
99 
100 ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
101 -----function that returns the menu id for a menu name
102 FUNCTION get_menu_id_for_menuname (p_menu_name IN VARCHAR2)
103 RETURN NUMBER
104 IS
105 l_menu_id      NUMBER := 0;
106 BEGIN
107       SELECT  menu_id
108       INTO   l_menu_id
109       FROM   fnd_menus
110       WHERE  fnd_menus.menu_name = p_menu_name
111       AND    fnd_menus.type = SECURITY_MENU;
112       RETURN l_menu_id;
113 EXCEPTION
114 WHEN NO_DATA_FOUND THEN
115     l_menu_id := 0;
116     RETURN l_menu_id;
117 END get_menu_id_for_menuname;
118 
119 ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
120 -----Function that returns a menu_id for a function name
121 -----
122 FUNCTION get_menu_id_for_func_name(p_function_name IN VARCHAR2,
123                                    p_menu_name     IN VARCHAR2)
124 RETURN NUMBER
125 IS
126 
127 l_menu_id      NUMBER := 0;
128 
129 BEGIN
130      SELECT  menu_id
131       INTO   l_menu_id
132       FROM   fnd_compiled_menu_functions
133       WHERE  fnd_compiled_menu_functions.function_id IN (SELECT function_id
134                                                          FROM   fnd_form_functions
135                                                          WHERE  fnd_form_functions.function_name = p_function_name)
136       AND  fnd_compiled_menu_functions.menu_id = (SELECT menu_id
137                                                   FROM   fnd_menus
138                                                   WHERE  fnd_menus.menu_name = p_menu_name);
139       RETURN l_menu_id;
140 EXCEPTION
141 WHEN NO_DATA_FOUND THEN
142       RETURN l_menu_id;
143 END get_menu_id_for_func_name;
144 
145 ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
146 -----function that returns an object_id for an entity type
147 FUNCTION get_object_id (p_entity_type IN VARCHAR2)
148 RETURN NUMBER
149 IS
150 
151 l_object_id NUMBER := 0;
152 
153 BEGIN
154       SELECT object_id
155       INTO   l_object_id
156       FROM   fnd_objects
157       WHERE  obj_name = UPPER(p_entity_type);
158       RETURN l_object_id;
159 EXCEPTION
160 WHEN NO_DATA_FOUND THEN
161       l_object_id := 0;
162       RETURN l_object_id;
163 END get_object_id ;
164 
165 ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
166 ----function that returns the instance_set_id for a given object_name
167 ----and predicate
168 FUNCTION get_instance_set_id(p_object_id IN NUMBER,
169                              p_predicate IN VARCHAR2)
170 RETURN NUMBER
171 IS
172 
173 l_instance_set_id NUMBER := 0;
174 BEGIN
175     SELECT instance_set_id
176     INTO   l_instance_set_id
177     FROM   FND_OBJECT_INSTANCE_SETS
178     WHERE  object_id = p_object_id
179     AND    instance_set_name = UPPER(p_predicate);
180     RETURN l_instance_set_id;
181 EXCEPTION
182 WHEN NO_DATA_FOUND THEN
183   l_instance_set_id := 0;
184   RETURN l_instance_set_id;
185 END get_instance_set_id;
186 ---------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
187 FUNCTION get_priv(p_instance_set_id IN NUMBER,
188                 p_menu_id IN VARCHAR2,
189                 p_user_name IN VARCHAR2)
190 RETURN VARCHAR2
191 IS
192 l_check_grant VARCHAR2(1) := 'F';
193 BEGIN
194   SELECT 'T'
195   INTO   l_check_grant
196   FROM   fnd_grants
197   WHERE  grantee_key     = UPPER(p_user_name)
198   AND    instance_set_id = p_instance_set_id
199   AND    menu_id         = p_menu_id;
200   RETURN l_check_grant;
201 EXCEPTION
202 WHEN OTHERS THEN
203   l_check_grant := 'F';
204   RETURN l_check_grant;
205 END;
206 
207 -------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
208 FUNCTION get_grant_access(p_model_id IN NUMBER)
209 RETURN VARCHAR2  IS
210 l_user_name VARCHAR2(100) := 'NOUSER';
211 l_priv      VARCHAR2(1) := 'N';
212 l_cur            REF_CURSOR;
213 BEGIN
214   l_user_name := FND_GLOBAL.user_name;
215   OPEN l_cur FOR 'SELECT '||l_user_name||'_MANAGE FROM  CZ_GRANTS_ON_ENTITIES_VIEW
216                   WHERE model_id = '||p_model_id||' AND  entity_type = ''MODEL'' ';
217   LOOP
218       FETCH l_cur INTO l_priv;
219       EXIT WHEN l_cur%NOTFOUND;
220   END LOOP;
221   CLOSE l_cur;
222   RETURN l_priv;
223 EXCEPTION
224 WHEN OTHERS THEN
225   RETURN l_priv;
226 END get_grant_access;
227 --------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
228 -- Stubbed as part of the bug 4861666, as this code is not utilized
229 -- in the system due to the obsoletion of "View Entity Access" feature
230 PROCEDURE GET_CZ_ACCESS_SUMMARY (p_model_id NUMBER)
231 AS
232 BEGIN
233   NULL;
234 END GET_CZ_ACCESS_SUMMARY ;
235 --------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
236 PROCEDURE create_grants_on_models_v
237 AS
238 CURSOR C1 IS SELECT obj_name from fnd_objects;
239 l_column_name fnd_objects.obj_name%TYPE;
240 l_execute_str VARCHAR2(2000);
241 
242 BEGIN
243     l_execute_str := 'CREATE OR REPLACE VIEW CZ_GRANTS_ON_MODELS as SELECT model_id, object_name as model_name,';
244     OPEN C1;
245     LOOP
246        FETCH C1 INTO l_column_name;
247        EXIT WHEN C1%NOTFOUND;
248        l_execute_str := l_execute_str||' '||l_column_name||',';
249     END LOOP;
250     CLOSE C1;
251     l_execute_str := RTRIM(l_execute_str,',');
252     l_execute_str := l_execute_str ||', cz_security_pvt.get_grant_access(model_id) as has_grant_access ' ||
253      ' FROM CZ_GRANTS_ON_ENTITIES_VIEW WHERE entity_type = ''MODEL'' ';
254     EXECUTE IMMEDIATE l_execute_str;
255 EXCEPTION
256 WHEN OTHERS THEN
257    RAISE;
258 END create_grants_on_models_v;
259 
260 ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
261 -- Stubbed as part of the bug 4861666, as this code is not utilized
262 -- in the system due to the obsoletion of "View Entity Access" feature
263 PROCEDURE GET_CZ_GRANTS_VIEW
264 AS
265 BEGIN
266   NULL;
267 END GET_CZ_GRANTS_VIEW;
268 
269 ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
270 -----function that returns predicate for an entity type
271 FUNCTION get_instance_set_name(p_entity_type IN VARCHAR2,
272                                p_instance_pk1_value IN NUMBER)
273 RETURN VARCHAR2
274 IS
275 
276 l_set_name VARCHAR2(30);
277 
278 BEGIN
279    IF (p_entity_type = cz_security_pvt.MODEL) THEN
280       l_set_name := 'CZ_MODEL:'||to_char(p_instance_pk1_value);
281    ELSIF (p_entity_type = cz_security_pvt.UI) THEN
282       l_set_name := 'CZ_UI_DEF_ID:'||to_char(p_instance_pk1_value);
283    ELSIF (p_entity_type = cz_security_pvt.RULEFOLDER) THEN
284       l_set_name := 'CZ_RULEFOLDER:'||to_char(p_instance_pk1_value);
285    END IF;
286    RETURN l_set_name ;
287 END get_instance_set_name;
288 
289 ---------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
290 -----function that returns predicate for an entity type
291 FUNCTION get_predicate(p_entity_type IN VARCHAR2,
292                        p_instance_pk1_value IN NUMBER)
293 RETURN VARCHAR2
294 IS
295 
296 l_predicate VARCHAR2(4000);
297 
298 BEGIN
299    IF (p_entity_type = cz_security_pvt.MODEL) THEN
300       l_predicate := 'DEVL_PROJECT_ID='||p_instance_pk1_value;
301    ELSIF (p_entity_type = cz_security_pvt.UI) THEN
302       l_predicate := 'DEVL_PROJECT_ID='||p_instance_pk1_value;
303    ELSIF (p_entity_type = cz_security_pvt.RULEFOLDER) THEN
304       l_predicate := 'RULE_FOLDER_ID='||p_instance_pk1_value;
305    END IF;
306    RETURN l_predicate;
307 END get_predicate;
308 
309 ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
310 -----procedure to grant privilege
311 PROCEDURE grant_privilege(p_api_version           IN NUMBER,
312                           p_user_name          IN VARCHAR2,
313                           p_entity_role           IN VARCHAR2,
314                           p_instance_pk1_value IN NUMBER,
315                           x_return_status           OUT NOCOPY VARCHAR2,
316                           x_msg_count           OUT NOCOPY NUMBER,
317                           x_msg_data           OUT NOCOPY VARCHAR2)
318 IS
319 
320 l_api_name        CONSTANT VARCHAR2(30) := 'grant_privilege';
321 l_api_version     CONSTANT NUMBER       := 1.0;
322 l_user_name       fnd_grants.grantee_key%TYPE;
323 l_ctx_resp_id     fnd_grants.CTX_RESP_ID%TYPE;
324 l_privilege       VARCHAR2(100);
325 l_menu_name       VARCHAR2(100);
326 l_menu_id            NUMBER;
327 l_object_id       NUMBER;
328 l_instance_set_id NUMBER;
329 l_resp_id            NUMBER;
330 l_function_name   fnd_form_functions.function_name%TYPE;
331 l_check_grant      NUMBER := 0;
332 l_inst_name       VARCHAR2(30);
333 l_entity_type     VARCHAR2(30);
334 
335 
336 BEGIN
337       x_return_status := 'S';
338       x_msg_count := 0;
339         ---check api version
340         IF NOT FND_API.Compatible_API_Call(l_api_version,p_api_version,l_api_name,G_PKG_NAME) THEN
341             RAISE G_INCOMPATIBLE_API;
342         END IF;
343 
344       ----default user name
345       IF (p_user_name IS NULL) THEN
346            l_user_name := FND_GLOBAL.USER_NAME;
347       ELSE
348            l_user_name := p_user_name;
349       END IF;
350 
351       IF (l_user_name IS NULL) THEN
352             RAISE NULL_USER_NAME;
353       END IF;
354 
355       IF (p_entity_role IS NULL) THEN
356             RAISE ENTITY_ROLE_IS_NULL;
357       END IF;
358       l_menu_id    := get_menu_id_for_menuname(p_entity_role);
359       IF (l_menu_id = 0) THEN
360             RAISE MENU_ID_NOT_FOUND;
361       END IF;
362 
363       IF (p_entity_role = cz_security_pvt.MANAGE_MODEL_ROLE) THEN
364             l_entity_type := cz_security_pvt.MODEL;
365                  l_inst_name := 'CZ_MODEL:'||p_instance_pk1_value;
366       ELSIF (p_entity_role = cz_security_pvt.EDIT_MODEL_ROLE) THEN
367             l_entity_type := cz_security_pvt.MODEL;
368                  l_inst_name := 'CZ_MODEL:'||p_instance_pk1_value;
369       ELSIF (p_entity_role = cz_security_pvt.EDIT_RULE_ROLE) THEN
370             l_entity_type := cz_security_pvt.RULEFOLDER;
371                l_inst_name := 'CZ_RULEFOLDER:'||p_instance_pk1_value;
372       ELSIF (p_entity_role = cz_security_pvt.EDIT_UI_ROLE) THEN
373             l_entity_type := cz_security_pvt.UI;
374                l_inst_name := 'CZ_UI_DEF_ID:'||p_instance_pk1_value;
375       ELSE
376             RAISE INVALID_ROLE;
377       END IF;
378 
379       ----get object id from fnd_objects
380       l_object_id := get_object_id(l_entity_type);
381       IF (l_object_id = 0) THEN
382             RAISE OBJECT_ID_NOT_FOUND;
383       END IF;
384 
385       -----initialize resp id
386       l_resp_id := FND_GLOBAL.resp_id;
387       IF (l_resp_id IS NULL) THEN
388             RAISE RESP_IS_NULL;
389       END IF;
390 
391       ----get instance_set_id
392       l_instance_set_id := get_instance_set_id(l_object_id,l_inst_name);
393       IF (l_instance_set_id = 0) THEN
394             RAISE INSTANCE_SET_ERR;
395       END IF;
396 
397       ---check if grant exists
398       BEGIN
399             SELECT 1
400             INTO   l_check_grant
401             FROM   fnd_grants
402             WHERE  grantee_key     = UPPER(l_user_name)
403             AND    instance_set_id = l_instance_set_id
404             AND    menu_id         = l_menu_id
405             AND    object_id       = l_object_id;
406       EXCEPTION
407       WHEN OTHERS THEN
408             l_check_grant := 0;
409       END;
410 
411       IF (l_check_grant = 1) THEN
412             RAISE PRIV_ALREADY_EXISTS;
413       ELSE
414         ----insert into fnd_grants table
415         INSERT INTO FND_GRANTS ( GRANT_GUID,GRANTEE_TYPE,GRANTEE_KEY,MENU_ID,START_DATE,OBJECT_ID
416                               ,INSTANCE_TYPE,INSTANCE_SET_ID,INSTANCE_PK1_VALUE,INSTANCE_PK2_VALUE
417                               ,INSTANCE_PK3_VALUE,INSTANCE_PK4_VALUE,INSTANCE_PK5_VALUE,CREATED_BY
418                               ,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN
419                               ,CTX_SECGRP_ID,CTX_RESP_ID,CTX_RESP_APPL_ID,CTX_ORG_ID)
420         VALUES (sys_guid(),'GLOBAL',p_user_name,l_menu_id,sysdate,l_object_id
421              ,'INSTANCE',l_instance_set_id,p_instance_pk1_value,'*NULL*','*NULL*','*NULL*','*NULL*',FND_GLOBAL.USER_ID,
422              sysdate,FND_GLOBAL.USER_ID,sysdate,FND_GLOBAL.USER_ID,-1,l_resp_id,-1,-1);
423       END IF;
424 EXCEPTION
425 WHEN G_INCOMPATIBLE_API THEN
426     x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_API_VERSION_ERR','CODEVERSION',l_api_version,'VERSION',p_api_version);
427     x_return_status := FND_API.G_RET_STS_ERROR;
431     x_return_status := FND_API.G_RET_STS_ERROR;
428     x_msg_count := 1;
429 WHEN NULL_USER_NAME THEN
430     x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_USER_IS_NULL');
432     x_msg_count := 1;
433 WHEN RESP_IS_NULL THEN
434     x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_RESP_IS_NULL');
435     x_return_status := FND_API.G_RET_STS_ERROR;
436     x_msg_count := 1;
437 WHEN INVALID_ROLE THEN
438     x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_INVALID_ROLE');
439     x_return_status := FND_API.G_RET_STS_ERROR;
440     x_msg_count := 1;
441 WHEN FUNCTION_NAME_NULL THEN
442     x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_FUNC_NAME_IS_NULL');
443     x_return_status := FND_API.G_RET_STS_ERROR;
444     x_msg_count := 1;
445 WHEN ENTITY_ROLE_IS_NULL THEN
446     x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_ENTITY_ROLE_IS_NULL');
447     x_return_status := FND_API.G_RET_STS_ERROR;
448     x_msg_count := 1;
449 WHEN MENU_ID_NOT_FOUND THEN
450     x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_INVALID_ROLE', 'Privilege', p_entity_role  );
451     x_return_status := FND_API.G_RET_STS_ERROR;
452     x_msg_count := 1;
453 WHEN OBJECT_ID_NOT_FOUND THEN
454     x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_OBJECT_ID_ERR', 'object_id',l_entity_type);
455     x_return_status := FND_API.G_RET_STS_ERROR;
456     x_msg_count := 1;
457 WHEN INSTANCE_SET_ERR THEN
458     x_msg_data  := CZ_UTILS.GET_TEXT('CZ_INVALID_INSTANCE_SET', 'SET',l_inst_name,
459                                      'ENTITY_TYPE',l_entity_type, 'ERROR', SQLERRM);
460     x_msg_count := 1;
461     x_return_status := FND_API.G_RET_STS_ERROR;
462 WHEN PRIV_ALREADY_EXISTS THEN
463       NULL;   ---not necessary to return a message
464 WHEN OTHERS THEN
465     x_msg_data := SQLERRM;
466     x_return_status := FND_API.G_RET_STS_ERROR;
467 END grant_privilege;
468 
469 ----------------------------------------------------------------
470 ------revoke privilege on an entity
471 PROCEDURE revoke_privilege(p_api_version           IN NUMBER,
472                           p_user_name          IN VARCHAR2,
473                           p_entity_role           IN VARCHAR2,
474                           p_instance_pk1_value IN NUMBER,
475                           x_return_status           OUT NOCOPY VARCHAR2,
476                           x_msg_count           OUT NOCOPY NUMBER,
477                           x_msg_data           OUT NOCOPY VARCHAR2)
478 IS
479 
480 l_api_name          CONSTANT VARCHAR2(30) := 'revoke_privilege';
481 l_api_version       CONSTANT NUMBER       := 1.0;
482 l_object_id         NUMBER;
483 l_instance_set_id   NUMBER;
484 l_predicate         VARCHAR2(2000);
485 l_menu_id           NUMBER;
486 l_function_id       NUMBER;
487 l_check_grant       NUMBER := 0;
488 l_instance_set_name VARCHAR2(30);
489 l_entity_type       VARCHAR2(30);
490 
491 BEGIN
492       x_return_status := 'S';
493       x_msg_count := 0;
494       ---check api version
495       IF NOT FND_API.Compatible_API_Call(l_api_version,p_api_version,l_api_name,G_PKG_NAME) THEN
496         RAISE G_INCOMPATIBLE_API;
497       END IF;
498 
499       IF (p_entity_role IS NULL) THEN
500             RAISE ENTITY_ROLE_IS_NULL;
501       END IF;
502       l_menu_id := get_menu_id_for_menuname(p_entity_role);
503       IF (l_menu_id = 0) THEN
504             RAISE MENU_ID_NOT_FOUND;
505       END IF;
506 
507       IF (p_entity_role = cz_security_pvt.MANAGE_MODEL_ROLE) THEN
508             l_entity_type := cz_security_pvt.MODEL;
509       ELSIF (p_entity_role = cz_security_pvt.EDIT_MODEL_ROLE) THEN
510             l_entity_type := cz_security_pvt.MODEL;
511       ELSIF (p_entity_role = cz_security_pvt.EDIT_RULE_ROLE) THEN
512             l_entity_type := cz_security_pvt.RULEFOLDER;
513       ELSIF (p_entity_role = cz_security_pvt.EDIT_UI_ROLE) THEN
514             l_entity_type := cz_security_pvt.UI;
515       ELSE
516             RAISE INVALID_ROLE;
517       END IF;
518 
519      -----get object_id
520      l_object_id := get_object_id (l_entity_type);
521      IF (l_object_id = 0) THEN
522        RAISE OBJECT_ID_NOT_FOUND;
523      END IF;
524 
525      ----get predicate
526      l_instance_set_name := get_instance_set_name(l_entity_type,p_instance_pk1_value);
527 
528      -----get instance_set_id
529      l_instance_set_id := get_instance_set_id(l_object_id,l_instance_set_name);
530 
531       ----check if privilege actually exists
532      SELECT 1
533      INTO   l_check_grant
534      FROM   fnd_grants
535      WHERE  grantee_key     = UPPER(p_user_name)
536      AND    instance_set_id = l_instance_set_id
537      AND    menu_id         = l_menu_id
538      AND    object_id       = l_object_id;
539 
540      IF (l_check_grant <> 1) THEN
541             RAISE NO_PRIV_EXISTS;   ---do we need to do a check and return an error message
542      ELSE
543            DELETE FROM fnd_grants
544            WHERE  grantee_key = UPPER(p_user_name)
545            AND    menu_id = l_menu_id
546            AND    object_id = l_object_id
547            AND    instance_set_id = l_instance_set_id
548            AND    instance_pk1_value = to_char(p_instance_pk1_value);
549      END IF;
550 EXCEPTION
551 WHEN G_INCOMPATIBLE_API THEN
552     x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_API_VERSION_ERR','CODEVERSION',l_api_version,'VERSION',p_api_version);
553     x_return_status := FND_API.G_RET_STS_ERROR;
557 WHEN INVALID_ENTITY_TYPE THEN
554 WHEN OBJECT_ID_NOT_FOUND THEN
555     x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_OBJECT_ID_ERR', 'object_id', l_entity_type);
556     x_return_status := FND_API.G_RET_STS_ERROR;
558     x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_INVALID_ENTITY_TYP', 'OBJECTTYPE', l_entity_type);
559     x_return_status := FND_API.G_RET_STS_ERROR;
560 WHEN ENTITY_ROLE_IS_NULL THEN
561     x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_ENTITY_ROLE_IS_NULL');
562     x_return_status := FND_API.G_RET_STS_ERROR;
563     x_msg_count := 1;
564 WHEN MENU_ID_NOT_FOUND THEN
565     x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_INVALID_ROLE', 'Privilege', p_entity_role  );
566     x_return_status := FND_API.G_RET_STS_ERROR;
567     x_msg_count := 1;
568 WHEN NO_PRIV_EXISTS THEN
569     x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_NO_PRIV_EXISTS');
570     -----x_return_status := FND_API.G_RET_STS_ERROR;
571 WHEN OTHERS THEN
572     x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_FATAL_ERR', 'SQLERRM', SQLERRM);
573     x_return_status := FND_API.G_RET_STS_ERROR;
574 END revoke_privilege;
575 
576 -------------------------------------------------------------
577 PROCEDURE revoke_privilege(p_api_version            IN NUMBER,
578                            p_instance_pk1_value IN NUMBER,
579                            x_return_status      OUT NOCOPY VARCHAR2,
580                            x_msg_count            OUT NOCOPY NUMBER,
581                            x_msg_data           OUT NOCOPY VARCHAR2)
582 IS
583 
584 l_object_id         NUMBER;
585 l_instance_set_id   NUMBER;
586 l_predicate         VARCHAR2(2000);
587 l_menu_id           NUMBER;
588 l_function_id       NUMBER;
589 l_check_grant       NUMBER := 0;
590 l_instance_set_name VARCHAR2(30);
591 l_entity_type       VARCHAR2(30);
592 
593 BEGIN
594       l_entity_type := cz_security_pvt.MODEL;
595       l_object_id := get_object_id (l_entity_type);
596       l_instance_set_name := get_instance_set_name(l_entity_type,p_instance_pk1_value);
597       l_instance_set_id := get_instance_set_id(l_object_id,l_instance_set_name);
598       l_menu_id := get_menu_id_for_menuname(cz_security_pvt.MANAGE_MODEL_ROLE);
599 
600       DELETE FROM fnd_grants WHERE  menu_id = l_menu_id AND object_id = l_object_id
601       AND instance_set_id = l_instance_set_id AND instance_pk1_value = to_char(p_instance_pk1_value);
602 
603       l_object_id := get_object_id (l_entity_type);
604       l_instance_set_name := get_instance_set_name(l_entity_type,p_instance_pk1_value);
605       l_instance_set_id := get_instance_set_id(l_object_id,l_instance_set_name);
606       l_menu_id := get_menu_id_for_menuname(cz_security_pvt.EDIT_MODEL_ROLE);
607 
608       DELETE FROM fnd_grants WHERE  menu_id = l_menu_id AND object_id = l_object_id
609       AND instance_set_id = l_instance_set_id AND instance_pk1_value = to_char(p_instance_pk1_value);
610 
611       l_entity_type := cz_security_pvt.RULEFOLDER;
612       l_object_id := get_object_id (l_entity_type);
613       l_instance_set_name := get_instance_set_name(l_entity_type,p_instance_pk1_value);
614       l_instance_set_id := get_instance_set_id(l_object_id,l_instance_set_name);
615       l_menu_id := get_menu_id_for_menuname(cz_security_pvt.EDIT_RULE_ROLE);
616 
617       DELETE FROM fnd_grants WHERE  menu_id = l_menu_id AND object_id = l_object_id
618       AND instance_set_id = l_instance_set_id AND instance_pk1_value = to_char(p_instance_pk1_value);
619 
620       l_entity_type := cz_security_pvt.UI;
621       l_object_id := get_object_id (l_entity_type);
622       l_instance_set_name := get_instance_set_name(l_entity_type,p_instance_pk1_value);
623       l_instance_set_id := get_instance_set_id(l_object_id,l_instance_set_name);
624       l_menu_id := get_menu_id_for_menuname(cz_security_pvt.EDIT_UI_ROLE);
625 
626       DELETE FROM fnd_grants WHERE  menu_id = l_menu_id AND object_id = l_object_id
627       AND instance_set_id = l_instance_set_id AND instance_pk1_value = to_char(p_instance_pk1_value);
628 END;
629 
630 --------------------------------------------------------------------
631 --------check privilege
632 ----@p_api_version : api version current version is 1.0
633 ----@p_user_name : fnd user ex: OPERATIONS
634 ----@p_function_name : fnd function , function name of the task
635 ----@p_entity_type   : Fnd_objects.obj_name ex MODEL, UI RULEFOLDER
636 ----for the above use global constants
637 ----@p_instance_pk1_value : primary key of the object ex devl_project_id or rule_folder_id
638 FUNCTION has_privileges  (p_api_version        IN NUMBER,
639                           p_user_name          IN VARCHAR2,
640                           p_function_name      IN VARCHAR2,
641                           p_entity_type        IN VARCHAR2,
642                           p_instance_pk1_value IN NUMBER)
643 RETURN VARCHAR2
644 IS
645 
646 l_priv VARCHAR2(100) := 'T';
647 l_profile_value VARCHAR2(1000);
648 l_api_name      CONSTANT VARCHAR2(1000) := 'has_privileges';
649 l_api_version   CONSTANT NUMBER         := 1.0;
650 l_function_name  fnd_form_functions.function_name%TYPE;
651 l_user_name      VARCHAR2(40);
652 BEGIN
653     ---check api version
654    IF NOT FND_API.Compatible_API_Call(l_api_version,p_api_version,l_api_name,G_PKG_NAME) THEN
655       RAISE G_INCOMPATIBLE_API;
656    END IF;
657    l_profile_value := get_profile_value(USE_ENTITY_ACCESS_CONTROL);
658    IF ( (l_profile_value <> 'Y') ) THEN
659       RAISE NO_ENTITY_ACCESS_CONTROL;
660    ELSE
661       l_priv := 'T';
662    END IF;
666     l_priv := 'F';
663    RETURN l_priv;
664 EXCEPTION
665 WHEN G_INCOMPATIBLE_API THEN
667     RETURN l_priv;
668 WHEN NO_ENTITY_ACCESS_CONTROL THEN
669     l_priv := 'T';
670     RETURN l_priv;
671 END has_privileges;
672 
673 ---------------------------------------------------
674 FUNCTION has_privileges  (p_function_name      IN VARCHAR2,
675                           p_entity_type        IN VARCHAR2,
676                           p_instance_pk1_value IN NUMBER)
677 RETURN VARCHAR2
678 IS
679 l_function_name fnd_form_functions.function_name%TYPE;
680 l_user_name       VARCHAR2(40);
681 BEGIN
682   RETURN 'T';
683 EXCEPTION
684 WHEN OTHERS THEN
685     RETURN 'U';
686 END has_privileges;
687 
688 ------------------------------------------------------------------------
689 -----check lock on a entity
690 FUNCTION is_locked (p_entity_name           IN VARCHAR2,
691                     p_primary_key          IN VARCHAR2,
692                     p_primary_key_value IN NUMBER )
693 RETURN VARCHAR2
694 IS
695 
696 l_checkout_user      VARCHAR2(40) := NULL;
697 checkout_cur       ref_cursor;
698 
699 BEGIN
700       OPEN checkout_cur FOR 'SELECT checkout_user FROM '||p_entity_name||'
701                              WHERE  '||p_primary_key||' = '||p_primary_key_value;
702       LOOP
703             FETCH checkout_cur INTO l_checkout_user;
704             EXIT WHEN checkout_cur%NOTFOUND;
705       END LOOP;
706       CLOSE checkout_cur;
707       RETURN l_checkout_user;
708 END is_locked ;
709 --------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
710 PROCEDURE lock_entity(p_model_id IN NUMBER,
711                           x_return_status OUT NOCOPY VARCHAR2,
712                           x_msg_data      OUT NOCOPY VARCHAR2)
713 IS
714 BEGIN
715   x_return_status := FND_API.G_RET_STS_SUCCESS;
716   x_msg_data      := '';
717 END lock_entity ;
718 
719 --------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
720 PROCEDURE unlock_entity(p_model_id      IN NUMBER,
721                          x_return_status OUT NOCOPY VARCHAR2,
722                          x_msg_data      OUT NOCOPY VARCHAR2)
723 IS
724 BEGIN
725   x_return_status := FND_API.G_RET_STS_SUCCESS;
726   x_msg_data      := '';
727 END unlock_entity;
728 
729 ---------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
730 PROCEDURE get_entities_to_lock(p_entity_type     IN VARCHAR2,
731                                p_entity_id       IN NUMBER,
732                                x_locked_entities OUT NOCOPY number_type_tbl)
733 IS
734 
735 rec_count                     NUMBER := 0;
736 l_ui_style             cz_ui_defs.ui_style%TYPE;
737 l_devl_project_id      cz_ui_defs.devl_project_id%TYPE;
738 l_cz_ui_defs_id_tbl    number_type_tbl;
739 l_cz_ui_defs_style_tbl varchar_type_tbl;
740 
741 BEGIN
742  IF (p_entity_type = cz_security_pvt.MODEL) THEN
743     -----get all model entities to lock
744     BEGIN
745       SELECT distinct component_id
746       BULK
747       COLLECT
748       INTO   x_locked_entities
749       FROM   cz_model_ref_expls
750       WHERE  cz_model_ref_expls.model_id = p_entity_id
751       AND    cz_model_ref_expls.deleted_flag = '0'
752       AND    cz_model_ref_expls.ps_node_type = 263;
753     EXCEPTION
754     WHEN NO_DATA_FOUND THEN
755       NULL;
756     END;
757 
758     rec_count := x_locked_entities.COUNT + 1;
759     x_locked_entities(rec_count) := p_entity_id;
760 
761  ELSIF (p_entity_type = cz_security_pvt.UI) THEN
762 
763     -----get UI style
764     BEGIN
765      SELECT ui_style
766      INTO   l_ui_style
767      FROM   cz_ui_defs
768      WHERE  cz_ui_defs.devl_project_id = p_entity_id
769      AND    cz_ui_defs.deleted_flag = '0';
770     EXCEPTION
771     WHEN NO_DATA_FOUND THEN
772          NULL;
773     END;
774     -----get all UI entities to lock
775     IF (l_ui_style IN ('0','3') ) THEN
776 
777      BEGIN
778       SELECT ui_def_ref_id
779       BULK
780       COLLECT
781       INTO       x_locked_entities
782       FROM   cz_ui_nodes
783       WHERE  cz_ui_nodes.deleted_flag = '0'
784       AND    cz_ui_nodes.ui_def_ref_id IS NOT NULL
785       AND    cz_ui_nodes.ui_def_id = p_entity_id;
786      EXCEPTION
787      WHEN NO_DATA_FOUND THEN
788          NULL;
789      END;
790 
791      rec_count := x_locked_entities.COUNT + 1;
792      x_locked_entities(rec_count) := p_entity_id;
793 
794     ELSIF (l_ui_style = '7') THEN
795 
796       BEGIN
797        SELECT ref_ui_def_id
798        BULK
799        COLLECT
800        INTO   x_locked_entities
801        FROM   cz_ui_refs
802        WHERE  cz_ui_refs.ui_def_id = p_entity_id
803        AND    cz_ui_refs.deleted_flag = '0'
804        AND    cz_ui_refs.ref_ui_def_id IN (SELECT ui_def_id
805                                         FROM   cz_ui_defs
806                                         WHERE  cz_ui_defs.deleted_flag = '0'
807                                          AND   cz_ui_defs.ui_style = '7');
808      EXCEPTION
809      WHEN NO_DATA_FOUND THEN
810          NULL;
811      END;
812      rec_count := x_locked_entities.COUNT + 1;
813      x_locked_entities(rec_count) := p_entity_id;
814    END IF;
815 
819     BEGIN
816  ELSIF (p_entity_type = cz_security_pvt.RULEFOLDER) THEN
817     -----get all RULEFOLDER entities to lock
818     -----Do we user connect by or developer will handle it
820      SELECT rule_folder_id
821      BULK
822      COLLECT
823      INTO   x_locked_entities
824      FROM   cz_rule_folders
825      WHERE  cz_rule_folders.object_type = 'RFL'
826      AND    cz_rule_folders.deleted_flag = '0'
827      AND    cz_rule_folders.rule_folder_id = p_entity_id;
828      EXCEPTION
829     WHEN NO_DATA_FOUND THEN
830       NULL;
831     END;
832  END IF;
833 EXCEPTION
834 WHEN OTHERS THEN
835     RAISE;
836 END get_entities_to_lock;
837 
838 ------------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
839 PROCEDURE get_already_locked_entities(p_entity_type       IN  VARCHAR2,
840                                       p_entity_id         IN  NUMBER,
841                                       x_locked_entities   OUT NOCOPY number_type_tbl,
842                                       x_checkout_user_tbl OUT NOCOPY varchar_type_tbl)
843 IS
844 
845 rec_count                NUMBER := 0;
846 l_ui_style          cz_ui_defs.ui_style%TYPE;
847 l_locked_entities   number_type_tbl;
848 l_checkout_user_tbl varchar_type_tbl;
849 
850 BEGIN
851  IF (p_entity_type = cz_security_pvt.MODEL) THEN
852     -----get all model entities to lock
853     SELECT component_id
854     BULK
855     COLLECT
856     INTO   l_locked_entities
857     FROM   cz_model_ref_expls
858     WHERE  model_id = p_entity_id
859     AND    deleted_flag = '0'
860     AND    component_id IN (SELECT devl_project_id
861                             FROM   cz_devl_projects
862                             WHERE  cz_devl_projects.deleted_flag = '0'
863                                 AND    checkout_user IS NOT NULL );
864 
865    IF (l_locked_entities.COUNT > 0) THEN
866       FOR J IN l_locked_entities.FIRST..l_locked_entities.LAST
867       LOOP
868           SELECT checkout_user
869           BULK
870           COLLECT
871           INTO   l_checkout_user_tbl
872           FROM   cz_ps_nodes
873           WHERE  cz_ps_nodes.ps_node_id = l_locked_entities(j)
874            AND   cz_ps_nodes.deleted_flag = '0'
875            AND   cz_ps_nodes.checkout_user IS NOT NULL;
876 
877           IF (l_checkout_user_tbl.COUNT > 0) THEN
878              rec_count := x_locked_entities.COUNT + 1;
879              x_locked_entities(rec_count) := l_locked_entities(j);
880              x_checkout_user_tbl(rec_count) := l_checkout_user_tbl(1);
881           END IF;
882       END LOOP;
883    END IF;
884 
885  ELSIF (p_entity_type = cz_security_pvt.UI) THEN
886 
887     -----get UI style
888     SELECT ui_style
889     INTO   l_ui_style
890     FROM   cz_ui_defs
891     WHERE  cz_ui_defs.ui_def_id = p_entity_id
892     AND    cz_ui_defs.deleted_flag = '0';
893 
894     -----get all UI entities to lock
895     IF (l_ui_style IN ('0','3') ) THEN
896 
897       SELECT ui_def_ref_id
898       BULK
899       COLLECT
900       INTO       l_locked_entities
901       FROM   cz_ui_nodes
902       WHERE  deleted_flag = '0'
903       AND    ui_def_ref_id IS NOT NULL
904       AND    ui_def_id = p_entity_id;
905 
906       IF (l_locked_entities.COUNT > 0) THEN
907          FOR J IN l_locked_entities.FIRST..l_locked_entities.LAST
908          LOOP
909             SELECT checkout_user
910             BULK
911             COLLECT
912             INTO   l_checkout_user_tbl
913             FROM   cz_ui_defs
914             WHERE  cz_ui_defs.ui_def_id = l_locked_entities(j)
915             AND    cz_ui_defs.deleted_flag = '0'
916             AND    cz_ui_defs.checkout_user IS NOT NULL;
917 
918             IF (l_checkout_user_tbl.COUNT > 0) THEN
919              rec_count := x_locked_entities.COUNT + 1;
920              x_locked_entities(rec_count) := l_locked_entities(j);
921              x_checkout_user_tbl(rec_count) := l_checkout_user_tbl(1);
922             END IF;
923          END LOOP;
924       END IF;
925 
926     ELSIF (l_ui_style = '7') THEN
927 
928       SELECT ref_ui_def_id
929       BULK
930       COLLECT
931       INTO   l_locked_entities
932       FROM   cz_ui_refs
933       WHERE  cz_ui_refs.ui_def_id = p_entity_id
934       AND    cz_ui_refs.deleted_flag = '0'
935       AND    cz_ui_refs.ref_ui_def_id  IN (SELECT ui_def_id
936                                     FROM  cz_ui_defs x
937                                     WHERE x.deleted_flag = '0'
938                                     AND   x.checkout_user IS NOT NULL
939                                     AND   x.ui_style = '7');
940 
941       IF (l_locked_entities.COUNT > 0) THEN
942          FOR J IN l_locked_entities.FIRST..l_locked_entities.LAST
943          LOOP
944             SELECT checkout_user
945             BULK
946             COLLECT
947             INTO   l_checkout_user_tbl
948             FROM   cz_ui_defs
949             WHERE  cz_ui_defs.ui_def_id = l_locked_entities(j)
950             AND    cz_ui_defs.deleted_flag = '0'
951             AND    cz_ui_defs.checkout_user IS NOT NULL;
952 
953             IF (l_checkout_user_tbl.COUNT > 0) THEN
954              rec_count := x_locked_entities.COUNT + 1;
958          END LOOP;
955              x_locked_entities(rec_count) := l_locked_entities(j);
956              x_checkout_user_tbl(rec_count) := l_checkout_user_tbl(1);
957             END IF;
959       END IF;
960    END IF;
961 
962  ELSIF (p_entity_type = cz_security_pvt.RULEFOLDER) THEN
963 
964     -----get all RULEFOLDER entities to lock
965     -----Do we user connect by or developer will handle it
966     SELECT rule_folder_id,checkout_user
967     BULK
968     COLLECT
969     INTO   x_locked_entities,x_checkout_user_tbl
970     FROM   cz_rule_folders
971     WHERE  cz_rule_folders.object_type = 'RFL'
972     AND    cz_rule_folders.deleted_flag = '0'
973     AND    cz_rule_folders.devl_project_id = p_entity_id
974     AND    cz_rule_folders.checkout_user IS NOT NULL;
975 
976  END IF;
977 EXCEPTION
978 WHEN OTHERS THEN
979     RAISE;
980 END get_already_locked_entities;
981 
982 ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
983 PROCEDURE  update_to_lock_entities(p_entity_type IN VARCHAR2,
984                                    p_user_name   IN VARCHAR2,
985                                    p_entities_to_lock IN number_type_tbl)
986 IS
987 
988 l_table_name VARCHAR2(128);
989 l_primary_key_name VARCHAR2(128);
990 l_user_id NUMBER := FND_GLOBAL.USER_ID;
991 l_str VARCHAR2(2000);
992 l_event_note    VARCHAR2(2000);
993 l_entity        NUMBER;
994 BEGIN
995    IF (p_entity_type = cz_security_pvt.MODEL) THEN
996       l_table_name := 'cz_devl_projects';
997       l_primary_key_name := 'devl_project_id';
998       l_entity := 2;
999    ELSIF (p_entity_type = cz_security_pvt.UI) THEN
1000       l_table_name := 'cz_ui_defs';
1001       l_primary_key_name := 'ui_def_id';
1002       l_entity := 3;
1003    ELSIF (p_entity_type = cz_security_pvt.RULEFOLDER) THEN
1004       l_table_name := 'cz_rule_folders';
1005       l_primary_key_name := 'rule_folder_id';
1006       l_entity := 4;
1007    END IF;
1008 
1009    IF (p_entities_to_lock.COUNT > 0) THEN
1010       FOR toLock IN p_entities_to_lock.FIRST..p_entities_to_lock.LAST
1011       LOOP
1012           EXECUTE IMMEDIATE
1013         'UPDATE '||l_table_name||'  SET checkout_user = :1 WHERE  '||l_primary_key_name||'  = :2  '
1014          USING p_user_name,p_entities_to_lock(toLock);
1015       END LOOP;
1016    END IF;
1017 EXCEPTION
1018 WHEN OTHERS THEN
1019    RAISE;
1020 END update_to_lock_entities;
1021 
1022 ---------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1023 PROCEDURE  update_to_unlock_entities(p_entity_type   IN VARCHAR2,
1024                                 p_entities_to_unlock IN number_type_tbl)
1025 IS
1026 
1027 BEGIN
1028    update_to_lock_entities(p_entity_type,'',p_entities_to_unlock);
1029 EXCEPTION
1030 WHEN OTHERS THEN
1031    RAISE;
1032 END update_to_unlock_entities;
1033 
1034 ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1035 ------function that checks if it is necessary to lock
1036 ------a model
1037 PROCEDURE is_lock_required (p_lock_profile  IN VARCHAR2,
1038                              x_return_status OUT NOCOPY VARCHAR2,
1039                             x_msg_data      OUT NOCOPY VARCHAR2,
1040                             x_msg_count     OUT NOCOPY NUMBER)
1041 IS
1042 l_profile_value VARCHAR2(100);
1043 PROFILE_VALUE_NULL EXCEPTION;
1044 
1045 BEGIN
1046   l_profile_value := FND_PROFILE.value(p_lock_profile);
1047   IF (l_profile_value IS NULL) THEN
1048      RAISE PROFILE_VALUE_NULL;
1049   END IF;
1050 
1051   IF ( (l_profile_value = 'Y') OR (l_profile_value = 'YES') )  THEN
1052       x_return_status := 'Y';
1053   ELSE
1054       x_return_status := 'N';
1055   END IF;
1056 EXCEPTION
1057 WHEN PROFILE_VALUE_NULL THEN
1058    x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_PROFILE_NULL');
1059    x_msg_count := 1;
1060    x_return_status := 'U';
1061 WHEN OTHERS THEN
1062    x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_PRIV_FATAL_ERR', 'ERR', SQLERRM);
1063    x_msg_count := 1;
1064    x_return_status := 'U';
1065 END is_lock_required ;
1066 
1067 ------------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1068 -----procedure to lock entity
1069 PROCEDURE lock_entity   (p_api_version            IN NUMBER,
1070                             p_user_name           IN VARCHAR2,
1071                             p_entity_type         IN VARCHAR2,
1072                             p_instance_pk1_value  IN NUMBER,
1073                             p_lock_type           IN VARCHAR2,
1074                             x_locked_entities     OUT NOCOPY number_type_tbl,
1075                             x_return_status       OUT NOCOPY VARCHAR2,
1076                             x_msg_count           OUT NOCOPY NUMBER,
1077                             x_msg_data            OUT NOCOPY VARCHAR2)
1078 IS
1079 BEGIN
1080   x_return_status := FND_API.G_RET_STS_SUCCESS;
1081   x_msg_count     := 0;
1082   x_msg_data      := '';
1083 END lock_entity;
1084 
1085 ---------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1086 -----procedure called by back end PL/SQL API(s)
1087 -----to lock an entity
1088 PROCEDURE lock_entity (p_model_id IN NUMBER,
1089                        p_function_name IN VARCHAR2,
1090                           x_locked_entities  OUT NOCOPY number_type_tbl,
1091                           x_return_status    OUT NOCOPY VARCHAR2,
1092                           x_msg_count        OUT NOCOPY NUMBER,
1096   x_return_status := FND_API.G_RET_STS_SUCCESS;
1093                           x_msg_data         OUT NOCOPY VARCHAR2)
1094 IS
1095 BEGIN
1097   x_msg_count     := 0;
1098   x_msg_data      := '';
1099 END lock_entity;
1100 
1101 --------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1102 -----API used for Developer check out
1103 PROCEDURE lock_entity (p_model_id IN NUMBER,
1104                        p_function_name IN VARCHAR2,
1105                           x_return_status    OUT NOCOPY VARCHAR2,
1106                           x_msg_count        OUT NOCOPY NUMBER,
1107                           x_msg_data         OUT NOCOPY VARCHAR2)
1108 IS
1109 BEGIN
1110   x_return_status := FND_API.G_RET_STS_SUCCESS;
1111   x_msg_count     := 0;
1112   x_msg_data      := '';
1113 END lock_entity;
1114 
1115 --------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1116 PROCEDURE lock_entity   (p_api_version            IN NUMBER,
1117                             p_user_name           IN VARCHAR2,
1118                             p_entity_type         IN VARCHAR2,
1119                             p_instance_pk1_value  IN NUMBER,
1120                             p_lock_type           IN VARCHAR2,
1121                             x_return_status       OUT NOCOPY VARCHAR2,
1122                             x_msg_count           OUT NOCOPY NUMBER,
1123                             x_msg_data            OUT NOCOPY VARCHAR2)
1124 IS
1125 BEGIN
1126   x_return_status := FND_API.G_RET_STS_SUCCESS;
1127   x_msg_count     := 0;
1128   x_msg_data      := '';
1129 END lock_entity;
1130 
1131 ---------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1132 PROCEDURE unlock_entity  (p_api_version           IN NUMBER,
1133                           p_user_name          IN VARCHAR2,
1134                           p_entity_type             IN VARCHAR2,
1135                           p_instance_pk1_value IN NUMBER,
1136                           p_locked_entities    IN OUT NOCOPY number_type_tbl,
1137                           x_return_status OUT NOCOPY VARCHAR2,
1138                           x_msg_count     OUT NOCOPY NUMBER,
1139                           x_msg_data      OUT NOCOPY VARCHAR2)
1140 IS
1141 
1142 l_api_name      CONSTANT VARCHAR2(30) := 'ulock_entity';
1143 l_api_version   CONSTANT NUMBER       := 1.0;
1144 l_user_priv     VARCHAR2(1);
1145 l_function_name fnd_form_functions.function_name%TYPE;
1146 l_proj_id          NUMBER := 0;
1147 l_locked_entities_tbl number_type_tbl;
1148 BEGIN
1149   x_return_status := FND_API.G_RET_STS_SUCCESS;
1150   x_msg_count     := 0;
1151   x_msg_data      := '';
1152 END unlock_entity;
1153 
1154 -------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1155 PROCEDURE unlock_entity  (p_model_id IN NUMBER,
1156                           p_function_name IN VARCHAR2,
1157                           p_locked_entities IN OUT NOCOPY number_type_tbl,
1158                           x_return_status OUT NOCOPY VARCHAR2,
1159                           x_msg_count     OUT NOCOPY NUMBER,
1160                           x_msg_data      OUT NOCOPY VARCHAR2)
1161 IS
1162 BEGIN
1163   x_return_status := FND_API.G_RET_STS_SUCCESS;
1164   x_msg_count     := 0;
1165   x_msg_data      := '';
1166 END unlock_entity;
1167 
1168 ------------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1169 PROCEDURE unlock_entity  (p_model_id      IN NUMBER,
1170                           p_function_name IN VARCHAR2,
1171                           x_return_status OUT NOCOPY VARCHAR2,
1172                           x_msg_count     OUT NOCOPY NUMBER,
1173                           x_msg_data      OUT NOCOPY VARCHAR2)
1174 IS
1175 BEGIN
1176   x_return_status := FND_API.G_RET_STS_SUCCESS;
1177   x_msg_count     := 0;
1178   x_msg_data      := '';
1179 END unlock_entity;
1180 
1181 ------------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1182 PROCEDURE unlock_model (p_model_id IN NUMBER,
1183                          x_return_status    OUT NOCOPY VARCHAR2,
1184                          x_msg_count        OUT NOCOPY NUMBER,
1185                          x_msg_data         OUT NOCOPY VARCHAR2)
1186 IS
1187 BEGIN
1188     x_return_status := 'T';
1189     x_msg_count     := 0;
1190     x_msg_data      := '';
1191 END unlock_model;
1192 
1193 ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1194 PROCEDURE unlock_entity   (p_api_version          IN NUMBER,
1195                             p_user_name           IN VARCHAR2,
1196                             p_entity_type         IN VARCHAR2,
1197                             p_instance_pk1_value  IN NUMBER,
1198                             p_lock_type           IN VARCHAR2,
1199                             x_return_status       OUT NOCOPY VARCHAR2,
1200                             x_msg_count           OUT NOCOPY NUMBER,
1201                             x_msg_data            OUT NOCOPY VARCHAR2)
1202 IS
1203 BEGIN
1204   x_return_status := FND_API.G_RET_STS_SUCCESS;
1205   x_msg_count     := 0;
1206   x_msg_data      := '';
1207 END unlock_entity;
1208 
1209 ------------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1210 FUNCTION get_user_id(p_user_name IN VARCHAR2)
1211 RETURN NUMBER
1212 IS
1213 
1214 l_user_id NUMBER := 0;
1215 
1216 BEGIN
1217   SELECT user_id
1218    INTO  l_user_id
1219    FROM  fnd_user
1220   WHERE  user_name = UPPER(p_user_name);
1221   RETURN l_user_id;
1222 END get_user_id;
1223 
1224 ------------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1228 
1225 FUNCTION get_application_id(p_application IN VARCHAR2)
1226 RETURN NUMBER
1227 IS
1229 l_application_id NUMBER := 0;
1230 
1231 BEGIN
1232   SELECT application_id
1233    INTO  l_application_id
1234    FROM  fnd_application
1235   WHERE  application_short_name = UPPER(p_application);
1236   RETURN l_application_id ;
1237 END get_application_id;
1238 
1239 ------------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1240 FUNCTION get_responsibility_id(p_responsibility IN VARCHAR2)
1241 RETURN NUMBER
1242 IS
1243 
1244 l_responsibility_id NUMBER := 0;
1245 
1246 BEGIN
1247   SELECT responsibility_id
1248    INTO  l_responsibility_id
1249    FROM  fnd_responsibility
1250   WHERE  responsibility_key = UPPER(p_responsibility)
1251    AND   application_id = 708;
1252   RETURN l_responsibility_id;
1253 END get_responsibility_id;
1254 
1255 ------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1256 ------procedure called by back end PL/SQL API(s)
1257 ------to check if the user has privilege to execute
1258 ------the stored procedure on the model
1259 PROCEDURE has_privileges(p_model_id IN NUMBER,
1260                     p_function_name IN VARCHAR2,
1261                     x_return_status OUT NOCOPY VARCHAR2,
1262                     x_msg_data      OUT NOCOPY VARCHAR2,
1263                     x_msg_count     OUT NOCOPY NUMBER)
1264 IS
1265 BEGIN
1266    x_return_status := HAS_PRIVILEGE;
1267    x_msg_count     := 0;
1268    x_msg_data      := '';
1269 END has_privileges;
1270 
1271 -------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1272 ----This API would return 'T' if the user has edit access on atleast one entity (MODEL,UI,RULEFOLDER),
1273 -----otherwise it will return 'F'.
1274 -----This is used for the enable or disable the edit icon in the repository.
1275 FUNCTION has_model_privileges(p_model_id IN NUMBER)
1276 RETURN VARCHAR2
1277 IS
1278 BEGIN
1279     RETURN 'T';
1280 END has_model_privileges;
1281 
1282 ------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1283 -----procedure called by back end API(s) to check for priv
1284 -----and locking entities
1285 PROCEDURE check_priv_and_lock_entity (p_api_version     IN  NUMBER,
1286                                       p_user_name       IN  VARCHAR2,
1287                                       p_responsibility  IN  VARCHAR2,
1288                                       p_application     IN  VARCHAR2,
1289                                       p_entity_type     IN  VARCHAR2,
1290                                       p_instance_pk1_value  IN NUMBER,
1291                                       x_locked_entities OUT NOCOPY number_type_tbl,
1292                                       x_return_status   OUT NOCOPY VARCHAR2,
1293                                       x_msg_count       OUT NOCOPY NUMBER,
1294                                       x_msg_data        OUT NOCOPY VARCHAR2)
1295 IS
1296 
1297 l_api_name       CONSTANT VARCHAR2(30) := 'check_priv_and_lock_entity';
1298 l_api_version    CONSTANT NUMBER       := 1.0;
1299 l_user_id        NUMBER := 0;
1300 l_application_id NUMBER := 0;
1301 l_resp_id        NUMBER := 0;
1302 l_profile_value  VARCHAR2(255) := '';
1303 
1304 BEGIN
1305   x_return_status := FND_API.G_RET_STS_SUCCESS;
1306   x_msg_count     := 0;
1307 
1308   ---check api version
1309   IF NOT FND_API.Compatible_API_Call(l_api_version,p_api_version,l_api_name,G_PKG_NAME) THEN
1310     RAISE G_INCOMPATIBLE_API;
1311   END IF;
1312 
1313   -----check if models have to be locked for global operations
1314   l_profile_value := get_profile_value(LOCK_MODELS_FOR_GLOPS);
1315   IF (l_profile_value = 'NO') THEN
1316       RAISE NO_LOCK_CONTROL_REQUIRED;
1317   END IF;
1318 
1319   ----get user id
1320   IF (p_user_name IS NULL) THEN
1321      RAISE USER_NAME_NULL;
1322   END IF;
1323 
1324   l_user_id := get_user_id(p_user_name);
1325   IF (l_user_id = 0) THEN
1326      RAISE INVALID_USER_NAME;
1327   END IF;
1328 
1329   ----get application id
1330   IF (p_application IS NULL) THEN
1331      RAISE APPL_NAME_NULL;
1332   END IF;
1333 
1334   l_application_id := get_application_id(p_application);
1335   IF (l_application_id = 0) THEN
1336       RAISE INVALID_APPLICATION;
1337   END IF;
1338 
1339   ----get responsibility id
1340   IF (p_responsibility IS NULL) THEN
1341      RAISE RESP_NAME_NULL;
1342   END IF;
1343 
1344   l_resp_id := get_responsibility_id(p_responsibility);
1345   IF (l_resp_id = 0) THEN
1346     RAISE INVALID_RESPONSIBILITY;
1347   END IF;
1348 
1349   ----fnd initialize
1350   fnd_global.apps_initialize(l_user_id,l_resp_id,l_application_id);
1351 
1352   -----lock entity
1353   cz_security_pvt.lock_entity (p_api_version,
1354                                p_user_name,
1355                                p_entity_type,
1356                                p_instance_pk1_value,
1357                                DEEP_LOCK,
1358                                x_locked_entities,
1359                                x_return_status,
1360                                x_msg_count,
1361                                x_msg_data);
1362 
1363   IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1364      x_msg_data  := CZ_UTILS.GET_TEXT('CZ_SEC_LOCK_ENTITY_ERR');
1365      x_msg_count := 1;
1366      x_return_status := FND_API.G_RET_STS_ERROR;
1367   END IF;
1368 
1369 EXCEPTION
1373    x_return_status := FND_API.G_RET_STS_ERROR;
1370 WHEN G_INCOMPATIBLE_API THEN
1371    x_msg_data  := CZ_UTILS.GET_TEXT('CZ_SEC_API_VERSION_ERR','CODEVERSION',l_api_version,'VERSION',p_api_version);
1372    x_msg_count := 1;
1374 WHEN NO_LOCK_CONTROL_REQUIRED THEN
1375    NULL; ----do nothing
1376 WHEN USER_NAME_NULL THEN
1377    x_msg_data  := CZ_UTILS.GET_TEXT('CZ_SEC_USER_NAME_NULL');
1378    x_msg_count := 1;
1379    x_return_status := FND_API.G_RET_STS_ERROR;
1380 WHEN INVALID_USER_NAME THEN
1381    x_msg_data  := CZ_UTILS.GET_TEXT('CZ_SEC_INVALID_USER_NAME','USERNAME',p_user_name);
1382    x_msg_count := 1;
1383    x_return_status := FND_API.G_RET_STS_ERROR;
1384 WHEN APPL_NAME_NULL THEN
1385    x_msg_data  := CZ_UTILS.GET_TEXT('CZ_SEC_APPL_NAME_NULL');
1386    x_msg_count := 1;
1387    x_return_status := FND_API.G_RET_STS_ERROR;
1388 WHEN RESP_NAME_NULL THEN
1389    x_msg_data  := CZ_UTILS.GET_TEXT('CZ_SEC_RESP_NAME_NULL');
1390    x_msg_count := 1;
1391    x_return_status := FND_API.G_RET_STS_ERROR;
1392 WHEN INVALID_APPLICATION THEN
1393    x_msg_data  := CZ_UTILS.GET_TEXT('CZ_SEC_INVALID_APPLICATION','APPLICATION',p_application);
1394    x_msg_count := 1;
1395    x_return_status := FND_API.G_RET_STS_ERROR;
1396 WHEN INVALID_RESPONSIBILITY THEN
1397    x_msg_data  := CZ_UTILS.GET_TEXT('CZ_SEC_INVALID_RESPONSIBILITY','RESPONSIBILITY',p_responsibility);
1398    x_msg_count := 1;
1399    x_return_status := FND_API.G_RET_STS_ERROR;
1400 WHEN OTHERS THEN
1401    x_msg_data  := SQLERRM;
1402    x_msg_count := 1;
1403    x_return_status := FND_API.G_RET_STS_ERROR;
1404 END check_priv_and_lock_entity;
1405 
1406 -------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1407 FUNCTION are_models_locked (p_model_id IN NUMBER)
1408 RETURN VARCHAR2
1409 IS
1410 l_models  number_type_tbl;
1411 l_status  VARCHAR2(2000);
1412 rec_count NUMBER := 0;
1413 l_checkout_user VARCHAR2(40) := '';
1414 l_model_id      NUMBER := 0;
1415 MODEL_ID_IS_NULL EXCEPTION;
1416 
1417 BEGIN
1418    l_status   := '0';
1419    IF (p_model_id IS NULL) THEN
1420       RAISE MODEL_ID_IS_NULL;
1421    END IF;
1422 
1423    SELECT component_id
1424    BULK
1425    COLLECT
1426    INTO   l_models
1427    FROM   cz_model_ref_expls
1428    WHERE  model_id = p_model_id
1429    AND    ps_node_type = 263
1430    AND    deleted_flag = '0';
1431 
1432    rec_count := l_models.COUNT + 1;
1433    l_models(rec_count) := p_model_id;
1434 
1435    IF (l_models.COUNT > 0) THEN
1436       FOR modelId IN l_models.FIRST..l_models.LAST
1437       LOOP
1438           l_model_id := l_models(modelId);
1439           SELECT checkout_user
1440            INTO  l_checkout_user
1441           FROM   cz_devl_projects
1442           WHERE  cz_devl_projects.devl_project_id = l_model_id
1443            AND   cz_devl_projects.deleted_flag = '0';
1444 
1445          IF (l_checkout_user IS NULL) THEN
1446                l_status := '0';
1447          ELSIF (l_checkout_user = FND_GLOBAL.user_name) THEN
1448                l_status := '1';
1449          ELSE
1450                l_status := '2';
1451                EXIT;
1452          END IF;
1453        END LOOP;
1454     END IF;
1455 RETURN l_status;
1456 EXCEPTION
1457 WHEN MODEL_ID_IS_NULL THEN
1458    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_MODEL_ID_NULL');
1459    RETURN l_status;
1460 WHEN OTHERS THEN
1461   l_status := SQLERRM;
1462   RETURN l_status;
1463 END are_models_locked;
1464 
1465 ------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1466 FUNCTION are_models_locked (p_model_id IN NUMBER, p_checkout_user IN VARCHAR2)
1467 RETURN VARCHAR2
1468 IS
1469 l_models  number_type_tbl;
1470 l_status  VARCHAR2(2000);
1471 l_checkout_user_tbl varchar_type_tbl;
1472 
1473 BEGIN
1474    l_status   := '0';
1475    SELECT checkout_user
1476    BULK
1477    COLLECT
1478    INTO   l_checkout_user_tbl
1479    FROM   cz_devl_projects
1480    WHERE  cz_devl_projects.devl_project_id IN ( SELECT component_id
1481                                                   FROM cz_model_ref_expls
1482                                                  WHERE model_id = p_model_id
1483                                                    AND ps_node_type = 263
1484                                                    AND deleted_flag = '0')
1485 
1486    AND    cz_devl_projects.deleted_flag = '0'
1487    AND    cz_devl_projects.checkout_user IS NOT NULL;
1488 
1489    IF (l_checkout_user_tbl.COUNT > 0) THEN
1490       FOR I IN l_checkout_user_tbl.FIRST..l_checkout_user_tbl.LAST
1491       LOOP
1492           IF (l_checkout_user_tbl(i) = FND_GLOBAL.user_name) THEN
1493                l_status := '1';
1494           ELSIF (l_checkout_user_tbl(i) <> FND_GLOBAL.user_name) THEN
1495                l_status := '2';
1496                EXIT;
1497          END IF;
1498       END LOOP;
1499     END IF;
1500 RETURN l_status;
1501 EXCEPTION
1502 WHEN OTHERS THEN
1503   l_status := SQLERRM;
1504   RETURN l_status;
1505 END are_models_locked;
1506 
1507 ------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1508 FUNCTION check_devl_project(p_entity_id IN NUMBER,
1509                             p_entity IN VARCHAR2)
1510 RETURN VARCHAR2
1511 IS
1512 l_checkout_user VARCHAR2(40);
1513 l_proj_id       NUMBER := 0 ;
1514 l_status          VARCHAR2(1) := '0';
1518   ELSIF (p_entity = cz_security_pvt.UI) THEN
1515 BEGIN
1516   IF (p_entity = cz_security_pvt.MODEL) THEN
1517      l_proj_id := p_entity_id;
1519      SELECT devl_project_id INTO l_proj_id
1520      FROM   cz_ui_defs
1521      WHERE  ui_def_id = p_entity_id
1522       AND   deleted_flag = '0';
1523   ELSIF (p_entity = cz_security_pvt.RULEFOLDER) THEN
1524     begin
1525      SELECT devl_project_id INTO l_proj_id
1526      FROM   cz_rule_folders
1527      WHERE  rule_folder_id = p_entity_id
1528       AND   object_type = 'RFL'
1529       AND   deleted_flag = '0';
1530     exception
1531     when no_data_found then
1532        null;
1533     end;
1534   END IF;
1535 
1536   begin
1537     SELECT checkout_user INTO l_checkout_user
1538     FROM  cz_devl_projects
1539     WHERE cz_devl_projects.devl_project_id = l_proj_id;
1540   exception
1541   when no_data_found then
1542     null;
1543   end;
1544 
1545   IF ( (l_checkout_user IS NOT NULL) AND (l_checkout_user = FND_GLOBAL.user_name) ) THEN
1546       RETURN '3';
1547   ELSIF ( (l_checkout_user IS NOT NULL) AND (l_checkout_user <> FND_GLOBAL.user_name) ) THEN
1548       RETURN '4';
1549   ELSE
1550       RETURN '0';
1551   END IF;
1552 EXCEPTION
1553 WHEN OTHERS tHEN
1554    RETURN l_status;
1555 END check_devl_project;
1556 
1557 ------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1558 FUNCTION check_devl_project(p_checkout_user IN VARCHAR2)
1559 RETURN VARCHAR2
1560 IS
1561 BEGIN
1562   IF ( (p_checkout_user IS NOT NULL) AND (p_checkout_user = FND_GLOBAL.user_name) ) THEN
1563       RETURN '3';
1564   ELSIF ( (p_checkout_user IS NOT NULL) AND (p_checkout_user <> FND_GLOBAL.user_name) ) THEN
1565       RETURN '4';
1566   ELSE
1567       RETURN '0';
1568   END IF;
1569 EXCEPTION
1570 WHEN OTHERS tHEN
1571    RETURN '0';
1572 END check_devl_project;
1573 
1574 ------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1575 FUNCTION lock_model_structure (p_model_id IN NUMBER)
1576 RETURN VARCHAR2
1577 IS
1578 l_ret_status    VARCHAR2(1);
1579 l_checkout_user VARCHAR2(40);
1580 l_event_note    VARCHAR2(2000);
1581 
1582 BEGIN
1583   l_ret_status := 'T';
1584   BEGIN
1585      SELECT checkout_user
1586      INTO   l_checkout_user
1587      FROM   cz_ps_nodes
1588      WHERE  ps_node_id = p_model_id;
1589   EXCEPTION
1590   WHEN NO_DATA_FOUND THEN
1591       l_checkout_user := NULL;
1592   END;
1593 
1594   IF (l_checkout_user IS NULL) THEN
1595         UPDATE cz_ps_nodes
1596         SET    checkout_user = FND_GLOBAL.user_name
1597         WHERE  ps_node_id = p_model_id;
1598 
1599        l_event_note := CZ_UTILS.GET_TEXT('CZ_SEC_LOCK_MODEL_STRUCTURE',
1600                                         'LOCKEDBY',FND_GLOBAL.user_name,'LOCKDATE',
1601                                         to_char(sysdate,'mm-dd-yyyy hh24:mi:ss'));
1602        log_lock_history (2,p_model_id,'LOCK_STRUCTURE',l_event_note);
1603   ELSIF (l_checkout_user <> FND_GLOBAL.user_name) THEN
1604         l_ret_status := 'F';
1605   END IF;
1606   RETURN  l_ret_status;
1607 EXCEPTION
1608 WHEN OTHERS THEN
1609   RETURN 'F';
1610 END lock_model_structure ;
1611 ------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1612 FUNCTION is_model_structure_locked (p_model_id IN NUMBER)
1613 RETURN VARCHAR2
1614 IS
1615 
1616 l_status  VARCHAR2(2000) := '0';
1617 l_checkout_user VARCHAR2(40) := '';
1618 MODEL_ID_IS_NULL EXCEPTION;
1619 
1620 BEGIN
1621    l_status   := '0';
1622    IF (p_model_id IS NULL) THEN
1623       RAISE MODEL_ID_IS_NULL;
1624    END IF;
1625 
1626    l_status  := check_devl_project(p_model_id,cz_security_pvt.MODEL);
1627    IF (l_status IN ('3','4')) THEN
1628       RAISE MODEL_LOCKED;
1629    END IF;
1630 
1631    SELECT checkout_user
1632    INTO   l_checkout_user
1633    FROM   cz_ps_nodes
1634    WHERE  cz_ps_nodes.ps_node_id = p_model_id
1635    AND    cz_ps_nodes.deleted_flag = '0';
1636 
1637    IF (l_checkout_user IS NULL) THEN
1638          l_status := '0';
1639    ELSIF (l_checkout_user = FND_GLOBAL.user_name) THEN
1640          l_status := '1';
1641    ELSE
1642          l_status := '2';
1643    END IF;
1644    RETURN l_status;
1645 EXCEPTION
1646 WHEN NO_DATA_FOUND THEN
1647    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_NO_MODEL_FOUND', 'MODELID', p_model_id);
1648    RETURN l_status;
1649 WHEN MODEL_LOCKED THEN
1650       RETURN l_status;
1651 WHEN MODEL_ID_IS_NULL THEN
1652    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_MODEL_ID_NULL');
1653    RETURN l_status;
1654 WHEN OTHERS THEN
1655   l_status := SQLERRM;
1656   RETURN l_status;
1657 END is_model_structure_locked;
1658 
1659 --------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1660 FUNCTION unlock_model_structure (p_model_id IN NUMBER)
1661 RETURN VARCHAR2
1662 IS
1663 l_ret_status    VARCHAR2(1) := 'T';
1664 l_checkout_user VARCHAR2(40);
1665 l_event_note    VARCHAR2(2000);
1666 BEGIN
1667   l_ret_status :=  check_devl_project(p_model_id,cz_security_pvt.MODEL);
1668   IF (l_ret_status <> '0')  THEN
1669       RETURN 'F';
1670   ELSE
1671       l_ret_status := 'T';
1672   END IF;
1673 
1677      FROM   cz_ps_nodes
1674   BEGIN
1675      SELECT checkout_user
1676      INTO   l_checkout_user
1678      WHERE  ps_node_id = p_model_id;
1679   EXCEPTION
1680   WHEN NO_DATA_FOUND THEN
1681       l_checkout_user := NULL;
1682   END;
1683 
1684   IF ( (l_checkout_user IS NOT NULL) AND (l_checkout_user = FND_GLOBAL.user_name) )  THEN
1685         UPDATE cz_ps_nodes
1686         SET   checkout_user = NULL
1687         WHERE  ps_node_id = p_model_id;
1688 
1689         l_event_note := CZ_UTILS.GET_TEXT('CZ_SEC_UNLOCK_MODEL_STRUCTURE',
1690                 'UNLOCKEDBY',FND_GLOBAL.user_name,'UNLOCKDATE',to_char(sysdate,'mm-dd-yyyy hh24:mi:ss'));
1691          log_lock_history (2,p_model_id,'UNLOCK_STRUCTURE',l_event_note);
1692   ELSIF ( (l_checkout_user IS NOT NULL) AND (l_checkout_user <> FND_GLOBAL.user_name) )THEN
1693         l_ret_status := 'F';
1694   END IF;
1695   RETURN  l_ret_status;
1696 EXCEPTION
1697 WHEN OTHERS THEN
1698   RETURN 'F';
1699 END unlock_model_structure ;
1700 
1701 --------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1702 FUNCTION is_root_ui_locked (p_ui_def_id IN NUMBER)
1703 RETURN VARCHAR2
1704 IS
1705 l_ui_bl             number_type_tbl;
1706 l_status            VARCHAR2(2000);
1707 rec_count           NUMBER := 0;
1708 l_checkout_user     VARCHAR2(40) := '';
1709 l_checkout_user_tbl varchar_type_tbl;
1710 UI_DEF_ID_IS_NULL   EXCEPTION;
1711 
1712 BEGIN
1713   l_status   := '0';
1714   IF (p_ui_def_id IS NULL) THEN
1715       RAISE UI_DEF_ID_IS_NULL;
1716   END IF;
1717 
1718   l_status  := check_devl_project(p_ui_def_id,cz_security_pvt.UI);
1719   IF ( (l_status = '3') OR (l_status = '4') )   THEN
1720       RAISE MODEL_LOCKED;
1721   END IF;
1722 
1723   get_already_locked_entities(cz_security_pvt.UI,p_ui_def_id,l_ui_bl,l_checkout_user_tbl);
1724   IF (l_checkout_user_tbl.COUNT > 0) THEN
1725       FOR uiId IN l_checkout_user_tbl.FIRST..l_checkout_user_tbl.LAST
1726       LOOP
1727          IF ( (l_checkout_user IS NOT NULL) AND (l_checkout_user_tbl(uiId) <> FND_GLOBAL.user_name)) THEN
1728               l_status := CZ_UTILS.GET_TEXT('CZ_SEC_ENTITY_IS_LOCKED','ObjectId', cz_security_pvt.UI,
1729                                     'Id',l_ui_bl(uiId),'User', l_checkout_user_tbl(uiId) );
1730              EXIT;
1731          END IF;
1732        END LOOP;
1733   END IF;
1734 RETURN l_status;
1735 EXCEPTION
1736 WHEN UI_DEF_ID_IS_NULL THEN
1737    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_UI_DEF_ID_NULL');
1738    RETURN l_status;
1739 WHEN MODEL_LOCKED THEN
1740    RETURN l_status;
1741 WHEN OTHERS THEN
1742   l_status := SQLERRM;
1743   RETURN l_status;
1744 END is_root_ui_locked ;
1745 
1746 ------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1747 FUNCTION is_ui_def_locked (p_ui_def_id IN NUMBER)
1748 RETURN VARCHAR2
1749 IS
1750 
1751 l_status             VARCHAR2(2000);
1752 l_checkout_user   VARCHAR2(40) := '';
1753 UI_DEF_ID_IS_NULL EXCEPTION;
1754 
1755 BEGIN
1756    l_status   := '0';
1757    IF (p_ui_def_id IS NULL) THEN
1758       RAISE UI_DEF_ID_IS_NULL;
1759    END IF;
1760 
1761   l_status  := check_devl_project(p_ui_def_id,cz_security_pvt.UI);
1762   IF ( (l_status = '3') OR (l_status = '4') ) THEN
1763       RAISE MODEL_LOCKED;
1764   END IF;
1765 
1766    SELECT checkout_user
1767    INTO   l_checkout_user
1768    FROM   cz_ui_defs
1769    WHERE  cz_ui_defs.ui_def_id = p_ui_def_id
1770    AND    cz_ui_defs.deleted_flag = '0';
1771 
1772    IF (l_checkout_user IS NULL) THEN
1773          l_status := '0';
1774    ELSIF (l_checkout_user = FND_GLOBAL.user_name) THEN
1775          l_status := '1';
1776    ELSE
1777          l_status := '2';
1778    END IF;
1779    RETURN l_status;
1780 EXCEPTION
1781 WHEN NO_DATA_FOUND THEN
1782    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_NO_MODEL_FOUND', 'UIDEFID', p_ui_def_id);
1783    RETURN l_status;
1784 WHEN MODEL_LOCKED THEN
1785    RETURN l_status;
1786 WHEN UI_DEF_ID_IS_NULL THEN
1787    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_UI_DEF_ID_NULL');
1788    RETURN l_status;
1789 WHEN OTHERS THEN
1790   l_status := SQLERRM;
1791   RETURN l_status;
1792 END is_ui_def_locked ;
1793 
1794 ----->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1795 FUNCTION is_ui_def_locked (p_ui_def_id IN NUMBER,
1796                            p_checkout_user IN VARCHAR2)
1797 RETURN VARCHAR2
1798 IS
1799 
1800 l_status              VARCHAR2(2000);
1801 l_checkout_user   VARCHAR2(40) := '';
1802 
1803 BEGIN
1804    l_status   := '0';
1805    IF (l_checkout_user = FND_GLOBAL.user_name) THEN
1806          l_status := '1';
1807    ELSIF (l_checkout_user <> FND_GLOBAL.user_name) THEN
1808          l_status := '2';
1809    END IF;
1810    RETURN l_status;
1811 EXCEPTION
1812 WHEN OTHERS THEN
1813   l_status := SQLERRM;
1814   RETURN l_status;
1815 END is_ui_def_locked ;
1816 
1817 ----->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1818 FUNCTION lock_ui_def (p_ui_def_id IN NUMBER)
1819 RETURN VARCHAR2
1820 IS
1821 l_ret_status VARCHAR2(1);
1822 l_checkout_user VARCHAR2(40);
1823 l_event_note VARCHAR2(2000);
1824 BEGIN
1825   l_ret_status := 'T';
1826   BEGIN
1830      WHERE  ui_def_id = p_ui_def_id ;
1827      SELECT checkout_user
1828      INTO   l_checkout_user
1829      FROM   cz_ui_defs
1831   EXCEPTION
1832   WHEN NO_DATA_FOUND THEN
1833       l_checkout_user := NULL;
1834   END;
1835 
1836   IF (l_checkout_user IS NULL) THEN
1837         UPDATE cz_ui_defs
1838         SET    checkout_user = FND_GLOBAL.user_name
1839         WHERE  ui_def_id = p_ui_def_id ;
1840         l_event_note := CZ_UTILS.GET_TEXT('CZ_SEC_LOCK_UI_EVENT',
1841                 'LOCKEDBY',FND_GLOBAL.user_name,'LOCKDATE',to_char(sysdate,'mm-dd-yyyy hh24:mi:ss'));
1842          log_lock_history (3,p_ui_def_id,'LOCK_UI',l_event_note);
1843   ELSIF (l_checkout_user <> FND_GLOBAL.user_name) THEN
1844         l_ret_status := 'F';
1845   END IF;
1846   RETURN  l_ret_status;
1847 EXCEPTION
1848 WHEN OTHERS THEN
1849   RETURN 'F';
1850 END lock_ui_def ;
1851 
1852 ------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1853 FUNCTION unlock_ui_def (p_ui_def_id IN NUMBER)
1854 RETURN VARCHAR2
1855 IS
1856 l_ret_status VARCHAR2(1) := 'T';
1857 l_checkout_user VARCHAR2(40);
1858 l_event_note VARCHAR2(2000);
1859 BEGIN
1860   l_ret_status :=  check_devl_project(p_ui_def_id,cz_security_pvt.UI);
1861   IF (l_ret_status <> '0')  THEN
1862       RETURN 'F';
1863   ELSE
1864       l_ret_status := 'T';
1865   END IF;
1866 
1867   BEGIN
1868      SELECT checkout_user
1869      INTO   l_checkout_user
1870      FROM   cz_ui_defs
1871      WHERE  ui_def_id = p_ui_def_id ;
1872   EXCEPTION
1873   WHEN NO_DATA_FOUND THEN
1874       l_checkout_user := NULL;
1875   END;
1876 
1877   IF ( (l_checkout_user IS NOT NULL) AND (l_checkout_user = FND_GLOBAL.user_name) )  THEN
1878         UPDATE cz_ui_defs
1879         SET   checkout_user = NULL
1880         WHERE  ui_def_id = p_ui_def_id ;
1881         l_event_note := CZ_UTILS.GET_TEXT('CZ_SEC_UNLOCK_UI_EVENT',
1882                 'UNLOCKEDBY',FND_GLOBAL.user_name,'UNLOCKDATE',to_char(sysdate,'mm-dd-yyyy hh24:mi:ss'));
1883          log_lock_history (3,p_ui_def_id,'UNLOCK_UI',l_event_note);
1884   ELSIF ( (l_checkout_user IS NOT NULL) AND (l_checkout_user <> FND_GLOBAL.user_name) )THEN
1885         l_ret_status := 'F';
1886   END IF;
1887   RETURN  l_ret_status;
1888 EXCEPTION
1889 WHEN OTHERS THEN
1890   RETURN 'F';
1891 END unlock_ui_def ;
1892 
1893 ---------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1894 FUNCTION is_root_rulefolder_locked (p_model_id IN NUMBER)
1895 RETURN VARCHAR2
1896 IS
1897 l_rule_tbl          number_type_tbl;
1898 l_status            VARCHAR2(2000);
1899 rec_count           NUMBER := 0;
1900 l_checkout_user     VARCHAR2(40) := '';
1901 l_checkout_user_tbl varchar_type_tbl;
1902 l_user_name              VARCHAR2(40) := FND_GLOBAL.user_name;
1903 MODELID_IS_NULL   EXCEPTION;
1904 
1905 BEGIN
1906   l_status   := '0';
1907   IF (p_model_id IS NULL) THEN
1908       RAISE MODELID_IS_NULL;
1909   END IF;
1910 
1911   l_status  := check_devl_project(p_model_id,cz_security_pvt.RULEFOLDER);
1912   IF ( (l_status = '3') OR (l_status = '4') ) THEN
1913       RAISE MODEL_LOCKED;
1914   END IF;
1915 
1916   get_already_locked_entities(cz_security_pvt.RULEFOLDER,p_model_id,l_rule_tbl,l_checkout_user_tbl);
1917   IF (l_checkout_user_tbl.COUNT > 0) THEN
1918       FOR FldId IN l_checkout_user_tbl.FIRST..l_checkout_user_tbl.LAST
1919       LOOP
1920          l_checkout_user := l_checkout_user_tbl(FldId);
1921             IF (l_checkout_user IS NULL) THEN
1922                l_status := '0';
1923             ELSIF (l_checkout_user = FND_GLOBAL.user_name) THEN
1924                l_status := '1';
1925             ELSE
1926               l_status := '2';
1927             EXIT;
1928             END IF;
1929        END LOOP;
1930   END IF;
1931 RETURN l_status;
1932 EXCEPTION
1933 WHEN MODELID_IS_NULL THEN
1934    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_MODELID_IS_NULL');
1935    RETURN l_status;
1936 WHEN MODEL_LOCKED THEN
1937    RETURN l_status;
1938 WHEN OTHERS THEN
1939   l_status := SQLERRM;
1940   RETURN l_status;
1941 END is_root_rulefolder_locked ;
1942 
1943 ------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1944 FUNCTION is_root_rulefolder_locked (p_model_id IN NUMBER, p_checkout_user IN VARCHAR2)
1945 RETURN VARCHAR2
1946 IS
1947 l_rule_tbl          number_type_tbl;
1948 l_status            VARCHAR2(2000);
1949 rec_count           NUMBER := 0;
1950 l_checkout_user     VARCHAR2(40) := '';
1951 l_checkout_user_tbl varchar_type_tbl;
1952 l_user_name              VARCHAR2(40) := FND_GLOBAL.user_name;
1953 
1954 BEGIN
1955   l_status   := '0';
1956   SELECT rule_folder_id,checkout_user
1957   BULK
1958   COLLECT
1959   INTO   l_rule_tbl,l_checkout_user_tbl
1960   FROM   cz_rule_folders
1961   WHERE  cz_rule_folders.object_type = 'RFL'
1962   AND    cz_rule_folders.deleted_flag = '0'
1963   AND    cz_rule_folders.devl_project_id = p_model_id
1964   AND    cz_rule_folders.checkout_user IS NOT NULL;
1965 
1966   IF (l_checkout_user_tbl.COUNT > 0) THEN
1967       FOR FldId IN l_checkout_user_tbl.FIRST..l_checkout_user_tbl.LAST
1968       LOOP
1969          l_checkout_user := l_checkout_user_tbl(FldId);
1970             IF (l_checkout_user = FND_GLOBAL.user_name) THEN
1971                l_status := '1';
1975             END IF;
1972             ELSIF (l_checkout_user <> FND_GLOBAL.user_name) THEN
1973               l_status := '2';
1974             EXIT;
1976        END LOOP;
1977   END IF;
1978 RETURN l_status;
1979 EXCEPTION
1980 WHEN OTHERS THEN
1981   l_status := SQLERRM;
1982   RETURN l_status;
1983 END is_root_rulefolder_locked ;
1984 
1985 ------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1986 FUNCTION is_rulefolder_lockable (p_rule_folder_id IN NUMBER)
1987 RETURN VARCHAR2
1988 IS
1989 
1990 l_status                   VARCHAR2(2000);
1991 l_checkout_user        VARCHAR2(40) := '';
1992 l_parent_user          VARCHAR2(40) := '';
1993 l_user_name                 VARCHAR2(40) := FND_GLOBAL.user_name;
1994 l_parent_rule_folder_id NUMBER := 0;
1995 l_fld_user             VARCHAR2(40) := '';
1996 
1997 RULE_FOLDER_ID_IS_NULL EXCEPTION;
1998 CURSOR checkout_user_cur IS
1999        select checkout_user
2000        FROM   cz_rule_folders
2001        where deleted_flag = '0'
2002        and object_type = 'RFL'
2003        and checkout_user is not null
2004        start with  rule_folder_id = p_rule_folder_id
2005       connect by prior parent_rule_folder_id = rule_folder_id;
2006 
2007 BEGIN
2008    l_status   := 'Y';
2009    IF (p_rule_folder_id IS NULL) THEN
2010       RAISE RULE_FOLDER_ID_IS_NULL;
2011    END IF;
2012 
2013   l_status  := check_devl_project(p_rule_folder_id,cz_security_pvt.RULEFOLDER);
2014   IF ( (l_status = '3') OR (l_status = '4') ) THEN
2015       l_status := 'N';
2016       RAISE MODEL_LOCKED;
2017   ELSE
2018       l_status := 'Y';
2019   END IF;
2020 
2021   BEGIN
2022      SELECT checkout_user INTO l_fld_user
2023      FROM   cz_rule_folders
2024      WHERE  cz_rule_folders.rule_folder_id = p_rule_folder_id
2025       AND   cz_rule_folders.object_type = 'RFL';
2026   EXCEPTION
2027   WHEN OTHERS THEN
2028     l_fld_user := NULL;
2029   END;
2030 
2031   IF ( (l_fld_user IS NOT NULL) AND (l_fld_user = FND_GLOBAL.user_name) ) THEN
2032       RETURN 'Y';
2033   ELSIF ( (l_fld_user IS NOT NULL) AND (l_fld_user <> FND_GLOBAL.user_name) ) THEN
2034       RETURN 'N';
2035   END IF;
2036 
2037   BEGIN
2038       SELECT checkout_user,parent_rule_folder_id
2039       INTO   l_parent_user,l_parent_rule_folder_id
2040       FROM   cz_rule_folders
2041       WHERE  cz_rule_folders.rule_folder_id = (SELECT parent_rule_folder_id
2042                                                FROM   cz_rule_folders
2043                                                WHERE  rule_folder_id = p_rule_folder_id
2044                                                AND    object_type = 'RFL'
2045                                                AND    deleted_flag = '0')
2046       AND   cz_rule_folders.object_type = 'RFL';
2047   EXCEPTION
2048   WHEN OTHERS THEN
2049       l_parent_rule_folder_id := 0;
2050       l_parent_user := NULL;
2051   END;
2052 
2053   IF (l_parent_user IS NOT NULL) THEN ----AND (l_parent_user <> FND_GLOBAL.user_name) THEN
2054         l_status := 'N';
2055         RAISE MODEL_LOCKED;
2056   END IF;
2057 
2058  IF (l_parent_rule_folder_id > 0) THEN
2059 
2060     OPEN checkout_user_cur;
2061     LOOP
2062       FETCH checkout_user_cur INTO l_checkout_user;
2063       EXIT WHEN checkout_user_cur%NOTFOUND;
2064            IF ( (l_checkout_user IS NOT NULL) ) THEN
2065             l_status := 'N';
2066             EXIT;
2067       END IF;
2068      END LOOP;
2069      CLOSE checkout_user_cur;
2070   END IF;
2071   RETURN l_status;
2072 EXCEPTION
2073 WHEN NO_DATA_FOUND THEN
2074    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_NO_MODEL_FOUND','RULEFOLDERID',p_rule_folder_id );
2075    RETURN l_status;
2076 WHEN MODEL_LOCKED THEN
2077    RETURN l_status;
2078 WHEN RULE_FOLDER_ID_IS_NULL THEN
2079    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_RULE_FOLDER_ID_NULL');
2080    RETURN l_status;
2081 WHEN OTHERS THEN
2082   l_status := SQLERRM;
2083   RETURN l_status;
2084 END is_rulefolder_lockable;
2085 
2086 -------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2087 FUNCTION is_rulefolder_locked (p_rule_folder_id IN NUMBER)
2088 RETURN VARCHAR2
2089 IS
2090 
2091 l_status                   VARCHAR2(2000);
2092 l_checkout_user        VARCHAR2(40) := '';
2093 l_user_name                 VARCHAR2(40) := FND_GLOBAL.user_name;
2094 l_is_locakable         VARCHAR2(2000) := 'N';
2095 RULE_FOLDER_ID_IS_NULL EXCEPTION;
2096 
2097 BEGIN
2098    l_status   := '0';
2099    IF (p_rule_folder_id IS NULL) THEN
2100       RAISE RULE_FOLDER_ID_IS_NULL;
2101    END IF;
2102 
2103   l_status  := check_devl_project(p_rule_folder_id,cz_security_pvt.RULEFOLDER);
2104   IF (l_status IN ('3','4')) THEN
2105       RAISE MODEL_LOCKED;
2106   END IF;
2107 
2108    l_is_locakable := is_rulefolder_lockable(p_rule_folder_id);
2109    IF (l_is_locakable <> 'Y') THEN
2110       l_status := '2';
2111       RAISE MODEL_LOCKED;
2112    END IF;
2113 
2114    BEGIN
2115       SELECT checkout_user
2116       INTO   l_checkout_user
2117       FROM   cz_rule_folders
2118       WHERE  cz_rule_folders.rule_folder_id = p_rule_folder_id
2119       AND    cz_rule_folders.object_type = 'RFL'
2123        l_checkout_user := NULL;
2120       AND    cz_rule_folders.deleted_flag = '0';
2121    EXCEPTION
2122    WHEN NO_DATA_FOUND THEN
2124    END;
2125 
2126    IF (l_checkout_user IS NULL) THEN
2127          l_status := '0';
2128    ELSIF (l_checkout_user = FND_GLOBAL.user_name) THEN
2129          l_status := '1';
2130    ELSE
2131          l_status := '2';
2132    END IF;
2133   RETURN l_status;
2134 EXCEPTION
2135 WHEN NO_DATA_FOUND THEN
2136    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_NO_MODEL_FOUND','RULEFOLDERID',p_rule_folder_id );
2137    RETURN l_status;
2138 WHEN MODEL_LOCKED THEN
2139    RETURN l_status;
2140 WHEN RULE_FOLDER_ID_IS_NULL THEN
2141    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_RULE_FOLDER_ID_NULL');
2142    RETURN l_status;
2143 WHEN OTHERS THEN
2144   l_status := SQLERRM;
2145   RETURN l_status;
2146 END is_rulefolder_locked;
2147 
2148 ------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2149 FUNCTION lock_rulefolder(p_rule_folder_id IN NUMBER)
2150 RETURN VARCHAR2
2151 IS
2152 l_ret_status    VARCHAR2(1);
2153 l_rule_fld_tbl  number_type_tbl;
2154 l_checkout_user_tbl varchar_type_tbl;
2155 rec_count          NUMBER := 0;
2156 l_checkout_user VARCHAR2(40) := '';
2157 l_event_note    VARCHAR2(2000);
2158 BEGIN
2159   l_ret_status := 'T';
2160   BEGIN
2161      SELECT checkout_user
2162      INTO   l_checkout_user
2163      FROM   cz_rule_folders
2164      WHERE  rule_folder_id = p_rule_folder_id
2165       AND   deleted_flag = '0'
2166       AND   object_type = 'RFL';
2167   EXCEPTION
2168   WHEN NO_DATA_FOUND THEN
2169       l_checkout_user := NULL;
2170   END;
2171 
2172   IF (l_checkout_user IS NULL) THEN
2173     BEGIN
2174        select rule_folder_id,checkout_user
2175        BULK
2176        COLLECT
2177        INTO   l_rule_fld_tbl,l_checkout_user_tbl
2178        FROM   cz_rule_folders
2179        where deleted_flag = '0'
2180        and object_type = 'RFL'
2181        start with  rule_folder_id = p_rule_folder_id
2182       connect by prior rule_folder_id = parent_rule_folder_id;
2183     EXCEPTION
2184     WHEN NO_DATA_FOUND THEN
2185        NULL;
2186     END;
2187 
2188     IF (l_checkout_user_tbl.COUNT > 0) THEN
2189        FOR FldId IN l_checkout_user_tbl.FIRST..l_checkout_user_tbl.LAST
2190        LOOP
2191          l_checkout_user := l_checkout_user_tbl(FldId);
2192          IF ( (l_checkout_user IS NOT NULL) AND (l_checkout_user <> FND_GLOBAL.user_name) ) THEN
2193               RETURN 'F';
2194             END IF;
2195        END LOOP;
2196     END IF;
2197 
2198     IF (l_rule_fld_tbl.COUNT > 0) THEN
2199       FOR I IN l_rule_fld_tbl.FIRST..l_rule_fld_tbl.LAST
2200       LOOP
2201            UPDATE cz_rule_folders
2202            SET    checkout_user = FND_GLOBAL.user_name
2203                WHERE  rule_folder_id = l_rule_fld_tbl(i)
2204             AND  object_type = 'RFL';
2205                l_event_note := CZ_UTILS.GET_TEXT('CZ_SEC_LOCK_RFL_EVENT',
2206                 'LOCKEDBY',FND_GLOBAL.user_name,'LOCKDATE',to_char(sysdate,'mm-dd-yyyy hh24:mi:ss'));
2207             log_lock_history (4,p_rule_folder_id,'LOCK_RULEFOLDER',l_event_note);
2208       END LOOP;
2209     END IF;
2210   ELSIF (l_checkout_user <> FND_GLOBAL.user_name) THEN
2211         l_ret_status := 'F';
2212   END IF;
2213   RETURN  l_ret_status;
2214 EXCEPTION
2215 WHEN OTHERS THEN
2216   RETURN 'F';
2217 END lock_rulefolder;
2218 
2219 ------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2220 FUNCTION unlock_rulefolder(p_rule_folder_id IN NUMBER)
2221 RETURN VARCHAR2
2222 IS
2223 l_ret_status     VARCHAR2(1) := 'T';
2224 l_checkout_user  VARCHAR2(40);
2225 l_rule_fld_tbl   number_type_tbl;
2226 l_event_note     VARCHAR2(2000);
2227 BEGIN
2228   l_ret_status :=  check_devl_project(p_rule_folder_id,cz_security_pvt.RULEFOLDER);
2229   IF (l_ret_status <> '0')  THEN
2230       RETURN 'F';
2231   ELSE
2232       l_ret_status := 'T';
2233   END IF;
2234 
2235   BEGIN
2236      SELECT checkout_user
2237      INTO   l_checkout_user
2238      FROM   cz_rule_folders
2239      WHERE  rule_folder_id = p_rule_folder_id
2240      AND    object_type = 'RFL';
2241   EXCEPTION
2242   WHEN NO_DATA_FOUND THEN
2243       l_checkout_user := NULL;
2244   END;
2245 
2246   IF ( (l_checkout_user IS NOT NULL) AND (l_checkout_user = FND_GLOBAL.user_name) )  THEN
2247     BEGIN
2248        select rule_folder_id
2249        BULK
2250        COLLECT
2251        INTO   l_rule_fld_tbl
2252        FROM   cz_rule_folders
2253        where deleted_flag = '0'
2254        and object_type = 'RFL'
2255        start with  rule_folder_id = p_rule_folder_id
2256       connect by prior rule_folder_id = parent_rule_folder_id;
2257     EXCEPTION
2258     WHEN NO_DATA_FOUND THEN
2259        NULL;
2260     END;
2261 
2262     IF (l_rule_fld_tbl.COUNT > 0) THEN
2263       FOR I IN l_rule_fld_tbl.FIRST..l_rule_fld_tbl.LAST
2264       LOOP
2265           UPDATE cz_rule_folders
2266           SET    checkout_user = NULL
2267           WHERE  rule_folder_id = l_rule_fld_tbl(i)
2268             AND  object_type = 'RFL';
2269                 l_event_note := CZ_UTILS.GET_TEXT('CZ_SEC_UNLOCK_RFL_EVENT',
2273     END IF;
2270                 'UNLOCKEDBY',FND_GLOBAL.user_name,'UNLOCKDATE',to_char(sysdate,'mm-dd-yyyy hh24:mi:ss'));
2271             log_lock_history (4,p_rule_folder_id,'UNLOCK_RULEFOLDER',l_event_note);
2272       END LOOP;
2274   ELSIF ( (l_checkout_user IS NOT NULL) AND (l_checkout_user <> FND_GLOBAL.user_name) )THEN
2275         l_ret_status := 'F';
2276   END IF;
2277   RETURN  l_ret_status;
2278 EXCEPTION
2279 WHEN OTHERS THEN
2280   RETURN 'F';
2281 END unlock_rulefolder;
2282 
2283 ---------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2284 FUNCTION is_model_locked (p_model_id IN NUMBER)
2285 RETURN VARCHAR2
2286 IS
2287 l_ui_tbl             number_type_tbl;
2288 l_are_models_locked  VARCHAR2(2000) := '0';
2289 l_are_uis_locked     VARCHAR2(2000) := '0';
2290 l_are_rulefld_locked VARCHAR2(2000) := '0';
2291 l_is_structure_locked VARCHAR2(2000) := '0';
2292 l_checkout_user      VARCHAR2(40);
2293 BEGIN
2294    ----check devl proj
2295   SELECT checkout_user
2296   INTO   l_checkout_user
2297   FROM   cz_devl_projects
2298   WHERE  cz_devl_projects.devl_project_id = p_model_id;
2299 
2300   IF ( (l_checkout_user IS NOT NULL) AND (l_checkout_user = FND_GLOBAL.user_name) ) THEN
2301        RETURN '1';
2302   ELSIF ((l_checkout_user IS NOT NULL) AND (l_checkout_user <> FND_GLOBAL.user_name) ) THEN
2303        RETURN '2';
2304   END IF;
2305 
2306    ---check model structure
2307    l_are_models_locked   := are_models_locked (p_model_id);
2308    l_is_structure_locked := is_model_structure_locked (p_model_id);
2309    IF ( (l_is_structure_locked = '2') OR (l_is_structure_locked = '4') ) THEN
2310        RETURN l_is_structure_locked ;
2311    END IF;
2312 
2313    BEGIN
2314       SELECT ui_def_id
2315       BULK
2316       COLLECT
2317       INTO   l_ui_tbl
2318       FROM   cz_ui_defs
2319       WHERE  cz_ui_defs.devl_project_id = p_model_id
2320       AND    cz_ui_defs.deleted_flag = '0'
2321       AND    cz_ui_defs.checkout_user IS NOT NULL;
2322    EXCEPTION
2323    WHEN NO_DATA_FOUND THEN
2324       NULL;
2325    END;
2326 
2327    ----check uis
2328    IF (l_ui_tbl.COUNT > 0) THEN
2329       FOR ui IN l_ui_tbl.FIRST..l_ui_tbl.LAST
2330       LOOP
2331          l_are_uis_locked := is_ui_def_locked (l_ui_tbl(ui));
2332          IF (l_are_uis_locked NOT IN ('0','1') ) THEN
2333             EXIT;
2334          END IF;
2335       END LOOP;
2336    END IF;
2337 
2338    ---check rulefolders
2339    l_are_rulefld_locked := is_root_rulefolder_locked (p_model_id);
2340    IF ( (l_are_models_locked = '0') AND (l_are_rulefld_locked = '0')
2341       AND (l_are_uis_locked = '0') AND (l_is_structure_locked = '0') ) THEN
2342       RETURN '0';
2343    ELSE
2344       RETURN '3';
2345    END IF;
2346 EXCEPTION
2347 WHEN OTHERS THEN
2348     RETURN 'U';
2349 END is_model_locked;
2350 
2351 ---------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2352 FUNCTION is_model_locked (p_model_id IN NUMBER, p_checkout_user IN VARCHAR2, p_username IN VARCHAR2)
2353 RETURN VARCHAR2
2354 IS
2355 l_ui_tbl             number_type_tbl;
2356 l_are_models_locked  VARCHAR2(2000) := '0';
2357 l_are_uis_locked     VARCHAR2(2000) := '0';
2358 l_are_rulefld_locked VARCHAR2(2000) := '0';
2359 l_checkout_user      VARCHAR2(40);
2360 l_ui_checkout_tbl    varchar_type_tbl;
2361 
2362 
2363 BEGIN
2364   IF ( (p_checkout_user IS NOT NULL) AND (p_checkout_user = FND_GLOBAL.user_name) ) THEN
2365        RETURN '1';
2366   ELSIF ((p_checkout_user IS NOT NULL) AND (p_checkout_user <> FND_GLOBAL.user_name) ) THEN
2367        RETURN '2';
2368   END IF;
2369 
2370   ---check model structure
2371   l_are_models_locked := are_models_locked (p_model_id,p_checkout_user);
2372 
2373    BEGIN
2374       SELECT ui_def_id,checkout_user
2375       BULK
2376       COLLECT
2377       INTO   l_ui_tbl,l_ui_checkout_tbl
2378       FROM   cz_ui_defs
2379       WHERE  cz_ui_defs.devl_project_id = p_model_id
2380       AND    cz_ui_defs.deleted_flag = '0'
2381       AND    cz_ui_defs.checkout_user IS NOT NULL;
2382    EXCEPTION
2383    WHEN NO_DATA_FOUND THEN
2384       NULL;
2385    END;
2386 
2387    ----check uis
2388    IF (l_ui_tbl.COUNT > 0) THEN
2389       FOR ui IN l_ui_tbl.FIRST..l_ui_tbl.LAST
2390       LOOP
2391          l_are_uis_locked := is_ui_def_locked (l_ui_tbl(ui),l_ui_checkout_tbl(ui));
2392          IF (l_are_uis_locked NOT IN ('0','1') ) THEN
2393             EXIT;
2394          END IF;
2395       END LOOP;
2396    END IF;
2397 
2398    ---check rulefolders
2399    l_are_rulefld_locked := is_root_rulefolder_locked (p_model_id,p_checkout_user);
2400    IF ( (l_are_models_locked = '0') AND (l_are_rulefld_locked = '0')
2401       AND (l_are_uis_locked = '0') ) THEN
2402       RETURN '0';
2403    ELSE
2404       RETURN '3';
2405    END IF;
2406 EXCEPTION
2407 WHEN OTHERS THEN
2408     RETURN 'U';
2409 END is_model_locked;
2410 
2411 ----------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2412 -----check lock on a entity
2413 PROCEDURE is_model_locked (p_devl_project_id IN VARCHAR2,
2414                               x_return_status         OUT NOCOPY VARCHAR2,
2415                           x_msg_count         OUT NOCOPY NUMBER,
2419 l_checkout_user      VARCHAR2(40) := NULL;
2416                           x_msg_data         OUT NOCOPY VARCHAR2)
2417 IS
2418 
2420 l_deleted_flag      VARCHAR2(1)  := '0';
2421 MODEL_DELETED     EXCEPTION;
2422 MODEL_IS_LOCKED   EXCEPTION;
2423 
2424 BEGIN
2425     x_return_status := 'F';
2426     x_msg_count := 0;
2427     x_msg_data := '';
2428     SELECT checkout_user,deleted_flag INTO l_checkout_user,l_deleted_flag
2429     FROM   cz_devl_projects
2430     WHERE  cz_devl_projects.devl_project_id = p_devl_project_id;
2431 
2432     IF (l_deleted_flag = '1') THEN
2433         RAISE MODEL_DELETED;
2434     END IF;
2435 
2436     IF (l_checkout_user IS NOT NULL) THEN
2437       RAISE MODEL_IS_LOCKED;
2438     END IF;
2439 EXCEPTION
2440 WHEN MODEL_DELETED THEN
2441    x_return_status := 'T';
2442    x_msg_count := 1;
2443    x_msg_data := CZ_UTILS.GET_TEXT('CZ_MODEL_DOES_NOT_EXIST', 'PROJID', p_devl_project_id);
2444 WHEN MODEL_IS_LOCKED THEN
2445    x_return_status := 'T';
2446    x_msg_count := 1;
2447    x_msg_data := CZ_UTILS.GET_TEXT('CZ_MODEL_IS_LOCKED', 'USER', l_checkout_user);
2448 WHEN OTHERS THEN
2449    x_return_status := 'T';
2450    x_msg_count := 1;
2451    x_msg_data := CZ_UTILS.GET_TEXT('CZ_SEC_FATAL_ERR', 'ERROR', SQLERRM);
2452 END is_model_locked ;
2453 
2454 ------------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2455 FUNCTION is_model_lockable (p_model_id IN NUMBER)
2456 RETURN VARCHAR2
2457 IS
2458 l_ui_tbl             number_type_tbl;
2459 l_are_models_locked  VARCHAR2(2000) := '0';
2460 l_are_uis_locked     VARCHAR2(2000) := '0';
2461 l_are_rulefld_locked VARCHAR2(2000) := '0';
2462 l_checkout_user      VARCHAR2(40);
2463 
2464 BEGIN
2465    ----check devl proj
2466   SELECT checkout_user
2467   INTO   l_checkout_user
2468   FROM   cz_devl_projects
2469   WHERE  cz_devl_projects.devl_project_id = p_model_id;
2470 
2471   IF ( (l_checkout_user IS NOT NULL) AND (l_checkout_user = FND_GLOBAL.user_name) ) THEN
2472        RETURN 'Y';
2473   ELSIF ((l_checkout_user IS NOT NULL) AND (l_checkout_user <> FND_GLOBAL.user_name) ) THEN
2474        RETURN 'N';
2475   END IF;
2476 
2477    ---check model structure
2478    l_are_models_locked := are_models_locked (p_model_id);
2479 
2480    BEGIN
2481       SELECT ui_def_id
2482       BULK
2483       COLLECT
2484       INTO   l_ui_tbl
2485       FROM   cz_ui_defs
2486       WHERE  cz_ui_defs.devl_project_id = p_model_id
2487       AND    cz_ui_defs.deleted_flag = '0';
2488    EXCEPTION
2489    WHEN NO_DATA_FOUND THEN
2490       NULL;
2491    END;
2492 
2493    ----check uis
2494    IF (l_ui_tbl.COUNT > 0) THEN
2495       FOR ui IN l_ui_tbl.FIRST..l_ui_tbl.LAST
2496       LOOP
2497          l_are_uis_locked := is_ui_def_locked (l_ui_tbl(ui));
2498          IF (l_are_uis_locked NOT IN ('0','1') ) THEN
2499             EXIT;
2500          END IF;
2501       END LOOP;
2502    END IF;
2503 
2504    ---check rulefolders
2505    l_are_rulefld_locked := is_root_rulefolder_locked (p_model_id);
2506    IF ( (l_are_models_locked = '0') AND (l_are_rulefld_locked = '0')
2507       AND (l_are_uis_locked = '0') ) THEN
2508       RETURN 'Y';
2509    ELSE
2510       RETURN 'N';
2511    END IF;
2512 EXCEPTION
2513 WHEN OTHERS THEN
2514     RETURN 'U';
2515 END is_model_lockable;
2516 
2517 ------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2518 FUNCTION is_model_editable (p_model_id IN NUMBER)
2519 RETURN VARCHAR2
2520 IS
2521 l_has_priv_status VARCHAR2(1) := 'F';
2522 l_is_lockable     VARCHAR2(1) := 'T';
2523 l_status VARCHAR2(1) := 'N';
2524 l_checkout_user VARCHAR2(40);
2525 l_profile_value  VARCHAR2(100);
2526 BEGIN
2527   SELECT checkout_user
2528   INTO l_checkout_user
2529   FROM  cz_devl_projects
2530   WHERE devl_project_id = p_model_id
2531   AND   deleted_flag = '0';
2532 
2533   IF ( (l_checkout_user IS NOT NULL) AND (l_checkout_user <> FND_GLOBAL.user_name) ) THEN
2534        l_is_lockable := 'F';
2535   END IF;
2536   l_has_priv_status := has_model_privileges(p_model_id);
2537   IF ((l_has_priv_status = 'T') AND (l_is_lockable = 'T') ) THEN
2538     RETURN 'T';
2539   ELSE
2540     RETURN 'F';
2541   END IF;
2542 END;
2543 
2544 ------->>>>>>>>>>>>>>>>>>>>>>>>>>
2545 FUNCTION is_model_editable (p_model_id IN NUMBER, p_checkout_user IN VARCHAR2, p_user_name IN VARCHAR2)
2546 RETURN VARCHAR2
2547 IS
2548 l_has_priv_status VARCHAR2(1) := 'F';
2549 l_is_lockable     VARCHAR2(1) := 'T';
2550 l_status VARCHAR2(1) := 'N';
2551 l_checkout_user VARCHAR2(40);
2552 l_profile_value  VARCHAR2(100);
2553 BEGIN
2554   IF ( (p_checkout_user IS NOT NULL) AND (p_checkout_user <> FND_GLOBAL.user_name) ) THEN
2555        l_is_lockable := 'F';
2556   END IF;
2557   IF ((g_has_priv_status = 'T') AND (l_is_lockable = 'T') ) THEN
2558     RETURN 'T';
2559   ELSE
2560     RETURN 'F';
2561   END IF;
2562 END;
2563 
2564 -------->>>>>>>>>>>>>>>>>>>>>>>>>>
2565 FUNCTION is_structure_editable (p_model_id IN NUMBER)
2566 RETURN VARCHAR2
2567 IS
2568 l_has_priv_status VARCHAR2(1) := 'F';
2569 l_is_lockable     VARCHAR2(1) := 'N';
2570 l_status VARCHAR2(1) := 'N';
2574   l_is_lockable     := is_model_structure_locked (p_model_id);
2571 l_profile_value  VARCHAR2(100);
2572 BEGIN
2573   l_has_priv_status := has_model_privileges(p_model_id);
2575   l_profile_value   := FND_PROFILE.value(LOCK_MODELS_FOR_EDIT);
2576 
2577   IF (l_profile_value = 'N') THEN
2578         IF ((l_has_priv_status = 'T') AND (l_is_lockable = '0') ) THEN
2579           RETURN 'F';
2580       ELSIF ((l_has_priv_status = 'T') AND (l_is_lockable = '1') ) THEN
2581            RETURN 'T';
2582       ELSIF ((l_has_priv_status = 'T') AND (l_is_lockable = '3') ) THEN
2583           RETURN 'T';
2584       ELSE
2585           RETURN 'F';
2586         END IF;
2587   ELSIF (l_profile_value = 'Y') THEN
2588       IF ((l_has_priv_status = 'T') AND (l_is_lockable = '0')) THEN
2589           RETURN 'F';
2590       ELSIF ((l_has_priv_status = 'T') AND (l_is_lockable IN ('1','3'))  ) THEN
2591               RETURN 'T';
2592       ELSE
2593           RETURN 'F';
2594         END IF;
2595   END IF;
2596 
2597 END is_structure_editable ;
2598 
2599 ------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2600 FUNCTION is_ui_def_editable(p_ui_def_id IN NUMBER)
2601 RETURN VARCHAR2
2602 
2603 IS
2604 l_has_priv_status VARCHAR2(1) := 'F';
2605 l_is_lockable     VARCHAR2(2000) := 'N';
2606 l_status             VARCHAR2(1) := 'N';
2607 l_proj_id             NUMBER;
2608 l_profile_value  VARCHAR2(100);
2609 BEGIN
2610   SELECT devl_project_id INTO l_proj_id FROM cz_ui_defs WHERE ui_def_id = p_ui_def_id ;
2611   l_has_priv_status := has_privileges(1.0,FND_GLOBAL.user_name,LOCK_UI_FUNC,cz_security_pvt.UI,l_proj_id);
2612   l_is_lockable     := is_ui_def_locked(p_ui_def_id);
2613   l_profile_value   := FND_PROFILE.value(LOCK_MODELS_FOR_EDIT);
2614   IF (l_profile_value = 'N') THEN
2615         IF ((l_has_priv_status = 'T') AND (l_is_lockable = '0') ) THEN
2616           RETURN 'F';
2617       ELSIF ((l_has_priv_status = 'T') AND (l_is_lockable = '1') ) THEN
2618            RETURN 'T';
2619       ELSIF ((l_has_priv_status = 'T') AND (l_is_lockable = '3') ) THEN
2620           RETURN 'T';
2621       ELSE
2622           RETURN 'F';
2623         END IF;
2624   ELSIF (l_profile_value = 'Y') THEN
2625       IF ((l_has_priv_status = 'T') AND (l_is_lockable = '0')) THEN
2626           RETURN 'F';
2627       ELSIF ((l_has_priv_status = 'T') AND (l_is_lockable IN ('1','3'))  ) THEN
2628               RETURN 'T';
2629       ELSE
2630           RETURN 'F';
2631         END IF;
2632   END IF;
2633 END is_ui_def_editable;
2634 
2635 ------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2636 FUNCTION is_rulefolder_editable(p_rulefolder_id IN NUMBER)
2637 RETURN VARCHAR2
2638 
2639 IS
2640 l_has_priv_status VARCHAR2(2000) := 'F';
2641 l_is_lockable     VARCHAR2(2000) := 'N';
2642 l_status             VARCHAR2(1) := 'N';
2643 l_profile_value  VARCHAR2(100);
2644 BEGIN
2645   l_has_priv_status := has_privileges(1.0,FND_GLOBAL.user_name,LOCK_RULEFOLDER_FUNC,
2646                                       cz_security_pvt.RULEFOLDER,p_rulefolder_id);
2647   l_is_lockable     := is_rulefolder_locked(p_rulefolder_id);
2648   l_profile_value   := FND_PROFILE.value(LOCK_MODELS_FOR_EDIT);
2649 
2650   IF (l_profile_value = 'N') THEN
2651         IF ((l_has_priv_status = 'T') AND (l_is_lockable = '0') ) THEN
2652           RETURN 'F';
2653       ELSIF ((l_has_priv_status = 'T') AND (l_is_lockable = '1') ) THEN
2654            RETURN 'T';
2655       ELSIF ((l_has_priv_status = 'T') AND (l_is_lockable = '3') ) THEN
2656           RETURN 'T';
2657       ELSE
2658           RETURN 'F';
2659         END IF;
2660   ELSIF (l_profile_value = 'Y') THEN
2661       IF ((l_has_priv_status = 'T') AND (l_is_lockable = '0')) THEN
2662           RETURN 'F';
2663       ELSIF ((l_has_priv_status = 'T') AND (l_is_lockable IN ('1','3'))  ) THEN
2664               RETURN 'T';
2665       ELSE
2666           RETURN 'F';
2667         END IF;
2668   END IF;
2669 END is_rulefolder_editable;
2670 
2671 -----------to be deleted
2672 ------------------to be deletd
2673 FUNCTION is_root_model_locked (p_model_id IN NUMBER)
2674 RETURN VARCHAR2
2675 IS
2676 l_ui_tbl             number_type_tbl;
2677 l_are_models_locked  VARCHAR2(2000) := 'N';
2678 l_are_uis_locked     VARCHAR2(2000) := 'N';
2679 l_are_rulefld_locked VARCHAR2(2000) := 'N';
2680 
2681 BEGIN
2682    ---check model structure
2683    l_are_models_locked := are_models_locked (p_model_id);
2684    BEGIN
2685       SELECT ui_def_id
2686       BULK
2687       COLLECT
2688       INTO   l_ui_tbl
2689       FROM   cz_ui_defs
2690       WHERE  cz_ui_defs.devl_project_id = p_model_id
2691       AND    cz_ui_defs.deleted_flag = '0';
2692    EXCEPTION
2693    WHEN NO_DATA_FOUND THEN
2694       NULL;
2695    END;
2696 
2697    ----check uis
2698    IF (l_ui_tbl.COUNT > 0) THEN
2699       FOR ui IN l_ui_tbl.FIRST..l_ui_tbl.LAST
2700       LOOP
2701          l_are_uis_locked := is_root_ui_locked (l_ui_tbl(ui));
2702          IF (l_are_uis_locked <> 'N') THEN
2703             EXIT;
2704          END IF;
2705       END LOOP;
2706     END IF;
2707 
2708    ---check rulefolders
2709    l_are_rulefld_locked := is_root_rulefolder_locked (p_model_id);
2713    ELSE
2710    IF ( (l_are_models_locked = 'Y') OR (l_are_rulefld_locked = 'Y')
2711       OR (l_are_uis_locked = 'Y') ) THEN
2712       RETURN 'Y';
2714       RETURN 'N';
2715    END IF;
2716 EXCEPTION
2717 WHEN OTHERS THEN
2718     RETURN 'U';
2719 END is_root_model_locked;
2720 
2721 ---------------
2722 FUNCTION is_parent_rulefolder_locked (p_rule_folder_id IN NUMBER)
2723 RETURN VARCHAR2
2724 IS
2725 
2726 l_status             VARCHAR2(2000);
2727 l_checkout_user  VARCHAR2(40) := '';
2728 RULE_FOLDER_ID_IS_NULL EXCEPTION;
2729 
2730 BEGIN
2731    l_status   := 'N';
2732    IF (p_rule_folder_id IS NULL) THEN
2733       RAISE RULE_FOLDER_ID_IS_NULL;
2734    END IF;
2735 
2736    SELECT checkout_user
2737    INTO   l_checkout_user
2738    FROM   cz_rule_folders
2739    WHERE  cz_rule_folders.rule_folder_id = p_rule_folder_id
2740    AND    cz_rule_folders.object_type = 'RFL'
2741    AND    cz_rule_folders.deleted_flag = '0';
2742 
2743    IF ( (l_checkout_user IS NOT NULL) AND (l_checkout_user <> FND_GLOBAL.user_name)) THEN
2744       l_status := CZ_UTILS.GET_TEXT('CZ_SEC_ENTITY_IS_LOCKED','ObjectId', cz_security_pvt.RULEFOLDER,
2745                               'Id',p_rule_folder_id,'User', l_checkout_user);
2746    END IF;
2747    RETURN l_status;
2748 EXCEPTION
2749 WHEN NO_DATA_FOUND THEN
2750    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_NO_MODEL_FOUND','RULEFOLDERID',p_rule_folder_id );
2751    RETURN l_status;
2752 WHEN RULE_FOLDER_ID_IS_NULL THEN
2753    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_RULE_FOLDER_ID_NULL');
2754    RETURN l_status;
2755 WHEN OTHERS THEN
2756   l_status := SQLERRM;
2757   RETURN l_status;
2758 END is_parent_rulefolder_locked;
2759 
2760 ------------
2761 FUNCTION is_parent_ui_locked (p_ui_def_id IN NUMBER)
2762 RETURN VARCHAR2
2763 IS
2764 
2765 l_status             VARCHAR2(2000);
2766 l_checkout_user   VARCHAR2(40) := '';
2767 UI_DEF_ID_IS_NULL EXCEPTION;
2768 
2769 BEGIN
2770    l_status   := 'N';
2771    IF (p_ui_def_id IS NULL) THEN
2772       RAISE UI_DEF_ID_IS_NULL;
2773    END IF;
2774 
2775    SELECT checkout_user
2776    INTO   l_checkout_user
2777    FROM   cz_ui_defs
2778    WHERE  cz_ui_defs.ui_def_id = p_ui_def_id
2779    AND    cz_ui_defs.deleted_flag = '0';
2780 
2781    IF ( (l_checkout_user IS NOT NULL) AND (l_checkout_user <> FND_GLOBAL.user_name)) THEN
2782       l_status := CZ_UTILS.GET_TEXT('CZ_SEC_ENTITY_IS_LOCKED','ObjectId', cz_security_pvt.UI,
2783                               'Id',p_ui_def_id,'User', l_checkout_user);
2784    END IF;
2785    RETURN l_status;
2786 EXCEPTION
2787 WHEN NO_DATA_FOUND THEN
2788    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_NO_MODEL_FOUND', 'UIDEFID', p_ui_def_id);
2789    RETURN l_status;
2790 WHEN UI_DEF_ID_IS_NULL THEN
2791    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_UI_DEF_ID_NULL');
2792    RETURN l_status;
2793 WHEN OTHERS THEN
2794   l_status := SQLERRM;
2795   RETURN l_status;
2796 END is_parent_ui_locked ;
2797 
2798 ----------------------
2799 FUNCTION is_parent_model_locked (p_model_id IN NUMBER)
2800 RETURN VARCHAR2
2801 IS
2802 
2803 l_status  VARCHAR2(2000) := 'N';
2804 l_checkout_user VARCHAR2(40) := '';
2805 MODEL_ID_IS_NULL EXCEPTION;
2806 
2807 BEGIN
2808    l_status   := 'N';
2809    IF (p_model_id IS NULL) THEN
2810       RAISE MODEL_ID_IS_NULL;
2811    END IF;
2812 
2813    SELECT checkout_user
2814    INTO   l_checkout_user
2815    FROM   cz_devl_projects
2816    WHERE  cz_devl_projects.devl_project_id = p_model_id
2817    AND    cz_devl_projects.deleted_flag = '0';
2818 
2819    IF (l_checkout_user IS NOT NULL)  THEN
2820       ------l_status := CZ_UTILS.GET_TEXT('CZ_SEC_ENTITY_IS_LOCKED','ObjectId', cz_security_pvt.MODEL,
2821       -----      'Id',p_model_id,'User', l_checkout_user); */
2822         l_status := 'Y';
2823    ELSE
2824         l_status := 'N';
2825    END IF;
2826    RETURN l_status;
2827 EXCEPTION
2828 WHEN NO_DATA_FOUND THEN
2829    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_NO_MODEL_FOUND', 'MODELID', p_model_id);
2830    RETURN l_status;
2831 WHEN MODEL_ID_IS_NULL THEN
2832    l_status := CZ_UTILS.GET_TEXT('CZ_SEC_MODEL_ID_NULL');
2833    RETURN l_status;
2834 WHEN OTHERS THEN
2835   l_status := SQLERRM;
2836   RETURN l_status;
2837 END is_parent_model_locked;
2838 
2839 ------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2840 FUNCTION has_model_privileges(p_model_id IN NUMBER, p_object_type IN VARCHAR2)
2841 RETURN VARCHAR2
2842 IS
2843 l_return_status VARCHAR2(1);
2844 BEGIN
2845   IF (p_object_type = 'PRJ') THEN
2846     l_return_status := has_model_privileges(p_model_id);
2847   ELSE
2848     l_return_status := 'T';
2849   END IF;
2850   RETURN l_return_status;
2851 END has_model_privileges;
2852 
2853 
2854 FUNCTION is_rulefolder_locked(p_rule_folder_id IN NUMBER,p_object_type IN VARCHAR2)
2855 RETURN VARCHAR2
2856 IS
2857 l_return_status VARCHAR2(1);
2858 BEGIN
2859   IF (p_object_type = 'RFL') THEN
2860     l_return_status := is_rulefolder_locked(p_rule_folder_id);
2861   ELSE
2862     l_return_status := 'T';
2863   END IF;
2864 RETURN l_return_status;
2865 END is_rulefolder_locked;
2869                                 p_parent_rulefolder_id IN NUMBER)
2866 
2867 FUNCTION is_rulefolder_editable(p_rulefolder_id        IN NUMBER,
2868                                 p_object_type          IN VARCHAR2,
2870 RETURN VARCHAR2
2871 IS
2872 l_return_status VARCHAR2(1);
2873 BEGIN
2874   IF (p_object_type = 'RFL') THEN
2875     l_return_status := is_rulefolder_editable(p_rulefolder_id);
2876   ELSE
2877     l_return_status := is_rulefolder_editable(p_parent_rulefolder_id);
2878   END IF;
2879 RETURN l_return_status;
2880 END is_rulefolder_editable;
2881 
2882 
2883 FUNCTION is_model_locked (p_model_id IN NUMBER,p_object_type IN VARCHAR2)
2884 RETURN VARCHAR2
2885 IS
2886 l_return_status VARCHAR2(1);
2887 BEGIN
2888   IF (p_object_type = 'PRJ') THEN
2889     l_return_status := is_model_locked (p_model_id);
2890   ELSE
2891     l_return_status := 'T';
2892   END IF;
2893 RETURN l_return_status;
2894 END is_model_locked;
2895 
2896 ---------------------------------
2897 FUNCTION is_model_locked (p_model_id      IN NUMBER,
2898                           p_object_type   IN VARCHAR2,
2899                           p_checkout_user IN VARCHAR2,
2900                           p_flag          IN NUMBER)
2901 RETURN VARCHAR2
2902 IS
2903 l_return_status VARCHAR2(1);
2904 BEGIN
2905   IF (p_object_type = 'PRJ') THEN
2906     l_return_status := is_model_locked (p_model_id,p_checkout_user,fnd_global.user_name);
2907   ELSE
2908     l_return_status := 'T';
2909   END IF;
2910 RETURN l_return_status;
2911 END is_model_locked;
2912 
2913 -----------------------------------
2914 FUNCTION is_model_editable (p_model_id IN NUMBER,p_object_type IN VARCHAR2)
2915 RETURN VARCHAR2
2916 IS
2917 l_return_status VARCHAR2(1);
2918 BEGIN
2919   IF (p_object_type = 'PRJ') THEN
2920     l_return_status := is_model_editable (p_model_id);
2921   ELSE
2922     l_return_status := 'T';
2923   END IF;
2924 RETURN l_return_status;
2925 END is_model_editable;
2926 
2927 --------------------------------------
2928 FUNCTION is_model_editable (p_model_id IN NUMBER,
2929                             p_object_type IN VARCHAR2,
2930                             p_checkout_user IN VARCHAR2,
2931                             p_flag IN VARCHAR2 )
2932 RETURN VARCHAR2
2933 IS
2934 l_return_status VARCHAR2(1);
2935 BEGIN
2936   IF (p_object_type = 'PRJ') THEN
2937     l_return_status := is_model_editable (p_model_id,p_checkout_user,fnd_global.user_name);
2938   ELSE
2939     l_return_status := 'T';
2940   END IF;
2941 RETURN l_return_status;
2942 END is_model_editable;
2943 
2944 -------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2945 FUNCTION get_user_name(p_user_id IN NUMBER)
2946 RETURN VARCHAR2
2947 IS
2948   l_user_name VARCHAR2(100);
2949 BEGIN
2950   SELECT user_name INTO l_user_name
2951   FROM   fnd_user
2952   WHERE  user_id = p_user_id ;
2953   RETURN l_user_name ;
2954 EXCEPTION
2955 WHEN OTHERS THEN
2956    RETURN 'NONE';
2957 END get_user_name;
2958 
2959 --------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2960 FUNCTION get_resp_name (p_user_id IN NUMBER)
2961 RETURN VARCHAR2
2962 IS
2963 
2964 CURSOR resp_cur IS SELECT responsibility_id from FND_USER_RESP_GROUPS
2965                    WHERE user_id = p_user_id
2966                    AND   responsibility_application_id = 708;
2967 
2968 l_responsibility_id NUMBER := 0;
2969 l_resp_name              VARCHAR2(2000);
2970 l_return_str        VARCHAR2(2000) := NULL;
2971 BEGIN
2972    OPEN resp_cur;
2973    LOOP
2974       FETCH resp_cur INTO l_responsibility_id;
2975       EXIT WHEN resp_cur%NOTFOUND;
2976       SELECT responsibility_name INTO l_resp_name
2977       FROM   fnd_responsibility_tl
2978       WHERE  responsibility_id = l_responsibility_id
2979       AND    language = userenv('LANG');
2980       l_return_str := l_return_str||', '||l_resp_name;
2981    END LOOP;
2982    CLOSE resp_cur;
2983    l_return_str := RTRIM(l_return_str, ', ');
2984    l_return_str := LTRIM(l_return_str, ', ');
2985    return l_return_str;
2986 EXCEPTION
2987 WHEN OTHERS THEN
2988   l_return_str := ' ';
2989   return l_return_str ;
2990 END get_resp_name ;
2991 
2992 ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2993 -- Stubbed as part of the bug 4861666, as this code is not utilized
2994 -- in the system due to the obsoletion of "View Entity Access" feature
2995 PROCEDURE GET_CZ_GRANTS_UPDATE (p_entity_id   IN NUMBER,
2996                                 p_entity_type IN VARCHAR2,
2997                                 p_model_id    IN NUMBER,
2998                                 p_priv        IN VARCHAR2,
2999                                 p_user_name   in varchar2,
3000                                 p_role        in varchar2)
3001 AS
3002 BEGIN
3003   NULL;
3004 END GET_CZ_GRANTS_UPDATE;
3005 -------------------------------------------------
3006 -----11.5.10 + Locking only
3007 ------------------------------------------------
3008 FUNCTION get_locking_profile_value
3009 RETURN VARCHAR2
3010 IS
3011   l_profile_value VARCHAR2(255);
3012 BEGIN
3013   l_profile_value := FND_PROFILE.VALUE(LOCK_REQUIRE_LOCKING);
3014   RETURN  l_profile_value;
3018 PROCEDURE add_to_error_stack(p_model_id IN NUMBER,
3015 END;
3016 
3017 -------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3019                              x_model_name_tbl IN OUT NOCOPY model_name_tbl,
3020                              x_checkout_user_tbl IN OUT NOCOPY checkout_user_tbl)
3021 IS
3022 
3023 BEGIN
3024   SELECT name, checkout_user
3025   BULK
3026   COLLECT
3027   INTO   x_model_name_tbl, x_checkout_user_tbl
3028   FROM   cz_devl_projects
3029   WHERE  cz_devl_projects.devl_project_id IN (SELECT component_id
3030                                     FROM   cz_model_ref_expls
3031                                     WHERE  cz_model_ref_expls.deleted_flag = '0'
3032                                     AND    cz_model_ref_expls.model_id = p_model_id)
3033   AND    (cz_devl_projects.checkout_user IS NOT NULL
3034             AND  cz_devl_projects.checkout_user <> FND_GLOBAL.user_name)
3035   AND   cz_devl_projects.deleted_flag = '0';
3036 EXCEPTION
3037 WHEN OTHERS THEN
3038   NULL;
3039 END;
3040 
3041 --------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3042 PROCEDURE get_checkout_user(p_obj_id IN NUMBER,
3043                            p_obj_type IN VARCHAR2,
3044                            x_checkout_user IN OUT NOCOPY VARCHAR2,
3045                            x_model_name    IN OUT NOCOPY VARCHAR2)
3046 IS
3047 BEGIN
3048   IF (p_obj_type = 'PRJ') THEN
3049       SELECT name, checkout_user
3050       INTO   x_model_name,x_checkout_user
3051       FROM   cz_devl_projects
3052       WHERE  cz_devl_projects.devl_project_id = p_obj_id ;
3053   ELSIF (p_obj_type = 'UIT') THEN
3054       SELECT template_name, checkout_user
3055       INTO   x_model_name,x_checkout_user
3056       FROM   cz_ui_templates
3057       WHERE  cz_ui_templates.template_id = p_obj_id ;
3058   END IF;
3059 EXCEPTION
3060 WHEN OTHERS THEN
3061    NULL;
3062 END get_checkout_user;
3063 
3064 ------------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3065 PROCEDURE get_models_to_lock (p_model_id      IN NUMBER,
3066                              p_references    IN NUMBER,
3067                              x_models_to_lock OUT NOCOPY number_type_tbl)
3068 IS
3069 BEGIN
3070   x_models_to_lock.DELETE;
3071   IF (p_references = 0) THEN
3072       SELECT distinct a.component_id
3073       BULK
3074       COLLECT
3075       INTO   x_models_to_lock
3076       FROM   cz_model_ref_expls a
3077       WHERE  a.model_id = p_model_id
3078       AND    a.deleted_flag = '0'
3079       AND    a.component_id IN ( SELECT devl_project_id
3080                                  FROM   cz_devl_projects
3081                                  WHERE  checkout_user IS NULL
3082                                  AND   devl_project_id = a.component_id  );
3083   ELSIF (p_references = 1) THEN
3084       SELECT  devl_project_id
3085       BULK
3086       COLLECT
3087       INTO    x_models_to_lock
3088        FROM   cz_devl_projects
3089        WHERE  checkout_user IS NULL
3090        AND    devl_project_id = p_model_id;
3091   END IF;
3092 EXCEPTION
3093 WHEN NO_DATA_FOUND THEN
3094       NULL;
3095 END;
3096 
3097 ------------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3098 /*#
3099  * This is the public interface for force unlock operations on a model in Oracle Configurator
3100  * @param p_api_version number.  Current version of the API is 1.0
3101  * @param p_model_id    number.  devl_project_id of the model from cz_devl_projects table
3102  * @param p_unlock_references   A value of FND_API.G_TRUE indicates that the child models if any should be
3103  *                              force unlocked. A value of FND_API.G_FALSE indicates that only the root model
3104  *                              will be unlocked
3105  * @param p_init_msg_list FND_API.G_TRUE if the API should initialize the FND stack, FND_API.G_FALSE if not.
3106  * @param x_return_status standard FND status. (ex:FND_API.G_RET_STS_SUCCESS )
3107  * @param x_msg_count     number of messages on the stack.
3108  * @param x_msg_data      standard FND OUT parameter for message.  Messages are written to the FND error stack
3109  * @rep:scope public
3110  * @rep:product CZ
3111  * @rep:displayname API for working with force unlock operations on a model
3112  * @rep:lifecycle active
3113  * @rep:compatibility S
3114  * @rep:category BUSINESS_ENTITY CZ_SECURITY
3115  */
3116 
3117 PROCEDURE force_unlock_model (p_api_version        IN NUMBER,
3118                               p_model_id           IN NUMBER,
3119                               p_unlock_references  IN VARCHAR2,
3120                               p_init_msg_list      IN VARCHAR2,
3121                               x_return_status     OUT NOCOPY VARCHAR2,
3122                               x_msg_count         OUT NOCOPY NUMBER,
3123                               x_msg_data          OUT NOCOPY VARCHAR2)
3124 IS
3125 
3126 MODELID_IS_NULL         EXCEPTION;
3127 MODEL_UNLOCK_ERR        EXCEPTION;
3128 NO_FORCE_UNLOCK_PRIV    EXCEPTION;
3129 l_model_tbl             cz_security_pvt.number_type_tbl;
3130 l_count                 NUMBER := 0;
3131 l_unlock_references     VARCHAR2(1);
3132 l_has_priv              BOOLEAN;
3133 l_checkout_user     cz_devl_projects.checkout_user%TYPE;
3134 l_model_name        cz_devl_projects.name%TYPE;
3135 
3136 BEGIN
3137    ----initialize FND stack
3138    x_return_status := FND_API.G_RET_STS_SUCCESS;
3142    ----initialize the message stack depending on the input parameter
3139    x_msg_data      := NULL;
3140    x_msg_count     := 0;
3141 
3143    IF(p_init_msg_list = FND_API.G_TRUE)THEN fnd_msg_pub.initialize; END IF;
3144 
3145    ----check if the input parameter p_model_id is NULL
3146    ----if it is NULL raise an exception
3147    IF (p_model_id IS NULL) THEN
3148       RAISE MODELID_IS_NULL;
3149    END IF;  /* end if of IF (p_model_id IS NULL) */
3150 
3151    -----check if the user has privilege to force unlock
3152    -----a model.  If the user has no privilege to force
3153    -----unlock the model raise an exception
3154    l_has_priv := FND_FUNCTION.TEST(UNLOCK_FUNCTION);
3155    IF (NOT l_has_priv) THEN
3156       RAISE NO_FORCE_UNLOCK_PRIV;
3157    END IF; /* IF (NOT l_has_priv) */
3158 
3159    -----validate input parameter p_unlock_references
3160    IF (p_unlock_references IS NULL) THEN
3161       l_unlock_references := DO_NOT_UNLOCK_CHILD_MODELS;
3162    ELSIF (p_unlock_references = FND_API.G_FALSE) THEN
3163       l_unlock_references := DO_NOT_UNLOCK_CHILD_MODELS;
3164    ELSIF (p_unlock_references = FND_API.G_TRUE) THEN
3165       l_unlock_references := UNLOCK_CHILD_MODELS;
3166    END IF; /* end if of (p_unlock_references IS NULL) */
3167 
3168    ------if p_unlock_references IS FND_API.G_TRUE then
3169    ------do the following
3170    IF (l_unlock_references = UNLOCK_CHILD_MODELS) THEN
3171          l_model_tbl.DELETE;
3172          BEGIN
3173                SELECT distinct component_id
3174                BULK
3175                COLLECT
3176                INTO   l_model_tbl
3177                FROM   cz_model_ref_expls
3178                WHERE  model_id = p_model_id
3179                AND    deleted_flag = '0'
3180                AND    ps_node_type IN (263,264);
3181          EXCEPTION
3182          WHEN NO_DATA_FOUND THEN
3183             NULL;
3184          END;
3185          l_count := l_model_tbl.COUNT + 1;
3186          l_model_tbl(l_count) := p_model_id;
3187          IF (l_model_tbl.COUNT > 0) THEN
3188             FOR I IN l_model_tbl.FIRST..l_model_tbl.LAST
3189             LOOP
3190                  UPDATE cz_devl_projects
3191                  SET    cz_devl_projects.checkout_user = NULL,
3192                         cz_devl_projects.checkout_time = NULL
3193                  WHERE  cz_devl_projects.devl_project_id = l_model_tbl(i);
3194                  IF (SQL%ROWCOUNT = 0) THEN
3195                   get_checkout_user(l_model_tbl(i),'PRJ',l_checkout_user,l_model_name);
3196                      RAISE MODEL_UNLOCK_ERR ;
3197                END IF;
3198              END LOOP;
3199           END IF;
3200       ELSE  /* else of IF (l_unlock_references = UNLOCK_CHILD_MODELS) THEN */
3201           UPDATE cz_devl_projects
3202           SET    cz_devl_projects.checkout_user = NULL,
3203                  cz_devl_projects.checkout_time = NULL
3204           WHERE  cz_devl_projects.devl_project_id = p_model_id;
3205 
3206          IF (SQL%ROWCOUNT = 0) THEN
3207             get_checkout_user(p_model_id,'PRJ',l_checkout_user,l_model_name);
3208                     RAISE MODEL_UNLOCK_ERR;
3209          END IF;
3210       END IF; /* end if of IF (l_unlock_references = UNLOCK_CHILD_MODELS) */
3211 COMMIT;
3212 EXCEPTION
3213 WHEN MODELID_IS_NULL THEN
3214    NULL;
3215 WHEN NO_FORCE_UNLOCK_PRIV THEN
3216    x_return_status := FND_API.G_RET_STS_ERROR;
3217    x_msg_count := 1;
3218    FND_MESSAGE.SET_NAME( 'CZ','CZ_NO_FORCE_UNLOCK_PRIV');
3219    --FND_MESSAGE.SET_TOKEN('USERNAME',FND_GLOBAL.USER_NAME);
3220    FND_MSG_PUB.ADD;
3221    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
3222 WHEN MODEL_UNLOCK_ERR THEN
3223    x_return_status := FND_API.G_RET_STS_ERROR;
3224    x_msg_count := 1;
3225    FND_MESSAGE.SET_NAME( 'CZ','CZ_MODEL_UNLOCK_ERR');
3226    FND_MESSAGE.SET_TOKEN('MODELNAME', l_model_name);
3227    FND_MESSAGE.SET_TOKEN('USERNAME', l_checkout_user);
3228    FND_MSG_PUB.ADD;
3229    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
3230 WHEN OTHERS THEN
3231    x_return_status := FND_API.G_RET_STS_ERROR;
3232    x_msg_count := 1;
3233    get_checkout_user(p_model_id, 'PRJ', l_checkout_user, l_model_name);
3234    x_msg_data := CZ_UTILS.GET_TEXT('CZ_UNLOCK_FATAL_ERR', 'OBJECTNAME', l_model_name, 'SQLERRM', SQLERRM);
3235    fnd_msg_pub.count_and_get(p_count => x_msg_count, p_data  => x_msg_data);
3236 END force_unlock_model;
3237 
3238 --------------------
3239 /*#
3240  * This is the public interface for force unlock operations on a UI content template in Oracle Configurator
3241  * @param p_api_version number.  Current version of the API is 1.0
3242  * @param p_template_id number.  Template_id of the template from cz_ui_templates table
3243  * @param p_init_msg_list FND_API.G_TRUE if the API should initialize the FND stack, FND_API.G_FALSE if not.
3244  * @param x_return_status standard FND status. (ex:FND_API.G_RET_STS_SUCCESS )
3245  * @param x_msg_count     number of messages on the stack.
3246  * @param x_msg_data      standard FND OUT parameter for message.  Messages are written to the FND error stack
3247  * @rep:scope public
3248  * @rep:product CZ
3249  * @rep:displayname API for working with force unlock operations on a UI content template
3250  * @rep:lifecycle active
3251  * @rep:compatibility S
3252  * @rep:category BUSINESS_ENTITY CZ_SECURITY
3253  */
3257                                  p_init_msg_list  IN VARCHAR2,
3254 
3255 PROCEDURE force_unlock_template (p_api_version    IN NUMBER,
3256                                  p_template_id    IN NUMBER,
3258                                  x_return_status OUT NOCOPY VARCHAR2,
3259                                  x_msg_count     OUT NOCOPY NUMBER,
3260                                  x_msg_data      OUT NOCOPY VARCHAR2)
3261 IS
3262 
3263 templateID_IS_NULL      EXCEPTION;
3264 template_UNLOCK_ERR     EXCEPTION;
3265 NO_FORCE_UNLOCK_PRIV    EXCEPTION;
3266 l_template_tbl          cz_security_pvt.number_type_tbl;
3267 l_count                 NUMBER := 0;
3268 l_unlock_references     VARCHAR2(1);
3269 l_has_priv              BOOLEAN;
3270 l_checkout_user         cz_devl_projects.checkout_user%TYPE;
3271 l_template_name         cz_devl_projects.name%TYPE;
3272 
3273 BEGIN
3274 
3275    ----initialize FND stack
3276    x_return_status := FND_API.G_RET_STS_SUCCESS;
3277    x_msg_data      := NULL;
3278    x_msg_count     := 0;
3279 
3280    ----initialize the message stack depending on the input parameter
3281    IF(p_init_msg_list = FND_API.G_TRUE)THEN fnd_msg_pub.initialize; END IF;
3282 
3283    ----check if the input parameter p_template_id is NULL
3284    ----if it is NULL raise an exception
3285    IF (p_template_id IS NULL) THEN
3286       RAISE templateID_IS_NULL;
3287    END IF; /* IF (p_template_id IS NULL) */
3288 
3289    -----check if the user has privilege to force unlock
3290    -----a template.  If the user has no privilege to force
3291    -----unlock the template then raise an exception
3292    l_has_priv := FND_FUNCTION.TEST(UNLOCK_FUNCTION);
3293    IF (NOT l_has_priv) THEN
3294       RAISE NO_FORCE_UNLOCK_PRIV;
3295    END IF; /* IF (NOT l_has_priv) */
3296 
3297    -----unlock the template by setting the checkout user
3298    -----and check out time to NULL
3299    UPDATE cz_ui_templates
3300    SET    cz_ui_templates.checkout_user = NULL,
3301           cz_ui_templates.checkout_time = NULL
3302    WHERE  cz_ui_templates.template_id = p_template_id;
3303 
3304    IF (SQL%ROWCOUNT = 0) THEN
3305       get_checkout_user(p_template_id,'UIT',l_checkout_user,l_template_name);
3306       RAISE template_UNLOCK_ERR;
3307    END IF;
3308 COMMIT;
3309 EXCEPTION
3310 WHEN TEMPLATEID_IS_NULL THEN
3311    NULL;
3312 WHEN NO_FORCE_UNLOCK_PRIV THEN
3313    x_return_status := FND_API.G_RET_STS_ERROR;
3314    x_msg_count := 1;
3315    FND_MESSAGE.SET_NAME( 'CZ','CZ_NO_FORCE_UNLOCK_PRIV');
3316    --FND_MESSAGE.SET_TOKEN('USERNAME',FND_GLOBAL.USER_NAME);
3317    FND_MSG_PUB.ADD;
3318    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
3319 WHEN TEMPLATE_UNLOCK_ERR THEN
3320    x_return_status := FND_API.G_RET_STS_ERROR;
3321    x_msg_count := 1;
3322    FND_MESSAGE.SET_NAME( 'CZ','CZ_UNLOCK_TMPL_ERR');
3323    FND_MESSAGE.SET_TOKEN('TEMPLATENAME', l_template_name);
3324    FND_MESSAGE.SET_TOKEN('USERNAME', l_checkout_user);
3325    FND_MSG_PUB.ADD;
3326    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
3327 WHEN OTHERS THEN
3328    x_return_status := FND_API.G_RET_STS_ERROR;
3329    x_msg_count := 1;
3330    get_checkout_user(p_template_id, 'UIT', l_checkout_user, l_template_name);
3331    x_msg_data := CZ_UTILS.GET_TEXT('CZ_UNLOCK_FATAL_ERR', 'OBJECTNAME', l_template_name, 'SQLERRM', SQLERRM);
3332    fnd_msg_pub.count_and_get(p_count => x_msg_count, p_data  => x_msg_data);
3333 END force_unlock_template;
3334 
3335 --------------------
3336 /*#
3337  * This is the public interface for lock operations on a UI content template in Oracle Configurator
3338  * @param p_api_version number.  Current version of the API is 1.0
3339  * @param p_template_id number.  Template_id of the template from cz_ui_templates table
3340  * @param p_commit_flag A value of FND_API.G_TRUE indicates that the a commit be issued at the end of the
3341  *          the procedure. A value of FND_API.G_FALSE indicates that no COMMIT is done.
3342  * @param p_init_msg_list FND_API.G_TRUE if the API should initialize the FND stack, FND_API.G_FALSE if not.
3343  * @param x_return_status standard FND status. (ex:FND_API.G_RET_STS_SUCCESS )
3344  * @param x_msg_count     number of messages on the stack.
3345  * @param x_msg_data      standard FND OUT parameter for message.  Messages are written to the FND error stack
3346  * @rep:scope public
3347  * @rep:product CZ
3348  * @rep:displayname API for working with force lock operations on a UI content template
3349  * @rep:lifecycle active
3350  * @rep:compatibility S
3351  * @rep:category BUSINESS_ENTITY CZ_SECURITY
3352  */
3353 
3354 PROCEDURE lock_template(p_api_version       IN NUMBER,
3355                         p_template_id       IN NUMBER,
3356                         p_commit_flag       IN VARCHAR2,
3357                         p_init_msg_list     IN VARCHAR2,
3358                         x_return_status    OUT NOCOPY VARCHAR2,
3359                         x_msg_count        OUT NOCOPY NUMBER,
3360                         x_msg_data         OUT NOCOPY VARCHAR2)
3361 IS
3362 
3363 l_checkout_user     cz_ui_templates.checkout_user%TYPE;
3364 l_template_name     cz_ui_templates.template_name%TYPE;
3365 TEMPLATE_IS_LOCKED  EXCEPTION;
3366 TEMPLATEID_IS_NULL  EXCEPTION;
3367 NO_LOCKING_REQUIRED EXCEPTION;
3368 l_commit_flag       VARCHAR2(1);
3369 l_lock_profile      VARCHAR2(3);
3370 
3371 BEGIN
3372 
3373    ----initialize FND stack
3377 
3374    x_return_status := FND_API.G_RET_STS_SUCCESS;
3375    x_msg_data      := NULL;
3376    x_msg_count     := 0;
3378    ----initialize the message stack depending on the input parameter
3379    IF(p_init_msg_list = FND_API.G_TRUE)THEN fnd_msg_pub.initialize; END IF;
3380 
3381    ----check if locking is enabled
3382    ----if the site level profile for locking is not enabled then
3383    ----there is no need to do locking
3384    l_lock_profile := get_locking_profile_value;
3385    IF (UPPER(NVL(l_lock_profile,'Y')) IN ('N','NO')) THEN
3386       RAISE NO_LOCKING_REQUIRED;
3387    END IF; /*IF (UPPER(NVL(l_lock_profile,'Y')) IN ('N','NO')) */
3388 
3389    -----check if the input parameter p_template_id
3390    -----has a value
3391    IF (p_template_id IS NULL) THEN
3392       RAISE TEMPLATEID_IS_NULL;
3393    END IF; /* IF (p_template_id IS NULL) */
3394 
3395    -----initialize l_commit_flag
3396    IF (p_commit_flag IS NULL) THEN
3397       l_commit_flag := DO_NOT_COMMIT;
3398    ELSIF (p_commit_flag = FND_API.G_TRUE) THEN
3399       l_commit_flag := DO_COMMIT;
3400    ELSIF (p_commit_flag = FND_API.G_FALSE) THEN
3401       l_commit_flag := DO_NOT_COMMIT;
3402    END IF; /* IF (p_commit_flag IS NULL) */
3403 
3404    -----set the checkout_user and checkout_time
3405    UPDATE cz_ui_templates
3406      SET  cz_ui_templates.checkout_user = FND_GLOBAL.user_name,
3407           cz_ui_templates.checkout_time = sysdate
3408    WHERE  cz_ui_templates.template_id = p_template_id
3409     AND   (cz_ui_templates.checkout_user IS NULL);
3410    IF (SQL%ROWCOUNT = 0) THEN
3411          get_checkout_user(p_template_id,'UIT',l_checkout_user,l_template_name);
3412          IF(l_checkout_user<>FND_GLOBAL.user_name AND l_checkout_user is not null)
3413          THEN
3414              RAISE TEMPLATE_IS_LOCKED;
3415          END IF;
3416    END IF;
3417 IF (l_commit_flag = DO_COMMIT) THEN COMMIT; END IF;  /* IF (l_commit_flag = '0') */
3418 EXCEPTION
3419 WHEN NO_LOCKING_REQUIRED THEN
3420    NULL;
3421 WHEN TEMPLATEID_IS_NULL THEN
3422    NULL;
3423 WHEN TEMPLATE_IS_LOCKED THEN
3424    x_return_status := FND_API.G_RET_STS_ERROR;
3425    FND_MESSAGE.SET_NAME( 'CZ','CZ_LOCK_TEMPLATE_ERR');
3426    FND_MESSAGE.SET_TOKEN('TEMPLATENAME', l_template_name);
3427    FND_MESSAGE.SET_TOKEN('USERNAME' , l_checkout_user);
3428    FND_MSG_PUB.ADD;
3429    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data, p_encoded => FND_API.G_FALSE);
3430 WHEN OTHERS THEN
3431    x_return_status := FND_API.G_RET_STS_ERROR;
3432    x_msg_count := 1;
3433    get_checkout_user(p_template_id, 'UIT', l_checkout_user, l_template_name);
3434    FND_MESSAGE.SET_NAME('CZ','CZ_LOCK_FATAL_ERR');
3435    FND_MESSAGE.SET_TOKEN('OBJECTNAME', l_template_name);
3436    FND_MESSAGE.SET_TOKEN('SQLERRM', SQLERRM);
3437    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
3438 END lock_template;
3439 
3440 --------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3441 /*#
3442  * This is the public interface for lock operations on a UI content template in Oracle Configurator
3443  * @param p_api_version number.  Current version of the API is 1.0
3444  * @param p_templates_to_lock array of templates to lock
3445  * @param p_commit_flag A value of FND_API.G_TRUE indicates that the a commit be issued at the end of the
3446  *          the procedure. A value of FND_API.G_FALSE indicates that no COMMIT is done.
3447  * @param p_init_msg_list FND_API.G_TRUE if the API should initialize the FND stack, FND_API.G_FALSE if not.
3448  * @param x_locked_templates templates locked by this procedure
3449  * @param x_return_status standard FND status. (ex:FND_API.G_RET_STS_SUCCESS )
3450  * @param x_msg_count     number of messages on the stack.
3451  * @param x_msg_data      standard FND OUT parameter for message.  Messages are written to the FND error stack
3452  * @rep:scope public
3453  * @rep:product CZ
3454  * @rep:displayname API for working with force lock operations on a UI content template
3455  * @rep:lifecycle active
3456  * @rep:compatibility S
3457  * @rep:category BUSINESS_ENTITY CZ_SECURITY
3458  */
3459 PROCEDURE lock_template(p_api_version            IN  NUMBER,
3460                         p_templates_to_lock      IN  cz_security_pvt.number_type_tbl,
3461                         p_commit_flag            IN  VARCHAR2,
3462                         p_init_msg_list          IN  VARCHAR2,
3463                         x_locked_templates       OUT NOCOPY cz_security_pvt.number_type_tbl,
3464                         x_return_status          OUT NOCOPY VARCHAR2,
3465                         x_msg_count              OUT NOCOPY NUMBER,
3466                         x_msg_data               OUT NOCOPY VARCHAR2)
3467 IS
3468 
3469 NO_TEMPLATES_IDS EXCEPTION;
3470 l_count          NUMBER;
3471 l_checkout_user  cz_ui_templates.checkout_user%TYPE;
3472 l_return_status  VARCHAR2(1);
3473 
3474 BEGIN
3475 
3476    x_return_status := FND_API.G_RET_STS_SUCCESS;
3477 
3478    ----initialize the message stack depending on the input parameter
3479    IF(p_init_msg_list = FND_API.G_TRUE)THEN fnd_msg_pub.initialize; END IF;
3480 
3481    -----check if the input parameter p_template_id
3482    -----has a value
3483    IF (p_templates_to_lock.COUNT = 0) THEN
3484       RAISE NO_TEMPLATES_IDS;
3485    END IF; /* IF (p_templates_to_lock.COUNT = 0) */
3486 
3487    IF (p_templates_to_lock.COUNT > 0) THEN
3491          BEGIN
3488       FOR I IN p_templates_to_lock.FIRST..p_templates_to_lock.LAST
3489       LOOP
3490          l_checkout_user := NULL;
3492             SELECT checkout_user
3493              INTO  l_checkout_user
3494             FROM   cz_ui_templates
3495             WHERE  template_id = p_templates_to_lock(i)
3496              AND   checkout_user = FND_GLOBAL.user_name;
3497          EXCEPTION
3498          WHEN NO_DATA_FOUND THEN
3499             l_checkout_user := NULL;
3500          END;
3501 
3502          IF (l_checkout_user IS NULL) THEN
3503             l_count := x_locked_templates.COUNT + 1;
3504             x_locked_templates(l_count) := p_templates_to_lock(i);
3505             cz_security_pvt.lock_template(1.0,
3506                         p_templates_to_lock(i),
3507                         FND_API.G_FALSE,
3508                         FND_API.G_FALSE,
3509                         l_return_status,
3510                         x_msg_count,
3511                         x_msg_data);
3512            IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3513               x_return_status := FND_API.G_RET_STS_ERROR;
3514            END IF;
3515         END IF;
3516       END LOOP;
3517    END IF;
3518    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data,p_encoded => FND_API.G_FALSE);
3519    IF (p_commit_flag =  FND_API.G_TRUE) THEN COMMIT; END IF;  /* IF (p_commit_flag = '0') */
3520 EXCEPTION
3521 WHEN NO_TEMPLATES_IDS THEN
3522    NULL;
3523 WHEN OTHERS THEN
3524    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3525    x_return_status := SQLERRM;
3526    x_msg_count := 1;
3527    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
3528 END lock_template;
3529 
3530 ------------------------------
3531 ---------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3532 /*#
3533  * This is the public interface for unlock operations on a UI content template in Oracle Configurator
3534  * @param p_template_id number.  Template_id of the template from cz_ui_templates table
3535  * @param p_init_msg_list FND_API.G_TRUE if the API should initialize the FND stack, FND_API.G_FALSE if not.
3536  * @param x_return_status standard FND status. (ex:FND_API.G_RET_STS_SUCCESS )
3537  * @param x_msg_count     number of messages on the stack.
3538  * @param x_msg_data      standard FND OUT parameter for message.  Messages are written to the FND error stack
3539  * @rep:scope public
3540  * @rep:product CZ
3541  * @rep:displayname API for working with unlock operations on a UI content template
3542  * @rep:lifecycle active
3543  * @rep:compatibility S
3544  * @rep:category BUSINESS_ENTITY CZ_SECURITY
3545  */
3546 
3547 PROCEDURE unlock_template(p_api_version      IN NUMBER,
3548                           p_template_id      IN NUMBER,
3549                           p_init_msg_list    IN VARCHAR2,
3550                           x_return_status    OUT NOCOPY VARCHAR2,
3551                           x_msg_count        OUT NOCOPY NUMBER,
3552                           x_msg_data         OUT NOCOPY VARCHAR2)
3553 IS
3554 
3555 TEMPLATEID_IS_NULL       EXCEPTION;
3556 TEMPLATE_UNLOCK_ERR      EXCEPTION;
3557 NO_LOCKING_REQUIRED      EXCEPTION;
3558 l_count                  NUMBER := 0;
3559 l_checkout_user          cz_ui_templates.checkout_user%TYPE;
3560 l_template_name          cz_ui_templates.template_name%TYPE;
3561 l_commit_flag            VARCHAR2(1);
3562 l_lock_profile           VARCHAR2(3);
3563 
3564 BEGIN
3565    ----initialize FND stack
3566    x_return_status := FND_API.G_RET_STS_SUCCESS;
3567    x_msg_count := 0;
3568    x_msg_data  := NULL;
3569    ----initialize the message stack depending on the input parameter
3570    IF(p_init_msg_list = FND_API.G_TRUE)THEN fnd_msg_pub.initialize; END IF;
3571 
3572    -----check if the input parameter p_template_id
3573    -----has a value
3574    IF (p_template_id IS NULL) THEN
3575       RAISE TEMPLATEID_IS_NULL;
3576    END IF; /* IF (p_template_id IS NULL) */
3577 
3578    ----check if locking is enabled
3579    ----if the site level profile for locking is not enabled then
3580    ----there is no need to do unlocking
3581    l_lock_profile := get_locking_profile_value;
3582    IF (UPPER(NVL(l_lock_profile,'Y')) IN ('N','NO')) THEN
3583       RAISE NO_LOCKING_REQUIRED;
3584    END IF; /* IF (UPPER(NVL(l_lock_profile,'Y')) IN ('N','NO')) */
3585 
3586    -----set the checkout_user and checkout_time
3587    UPDATE cz_ui_templates
3588    SET    cz_ui_templates.checkout_user = NULL,
3589           cz_ui_templates.checkout_time = NULL
3590    WHERE  cz_ui_templates.template_id = p_template_id
3591    AND   (cz_ui_templates.checkout_user IS NULL
3592       OR    cz_ui_templates.checkout_user = FND_GLOBAL.user_name);
3593    IF (SQL%ROWCOUNT = 0) THEN
3594       get_checkout_user(p_template_id,'UIT',l_checkout_user,l_template_name);
3595            RAISE TEMPLATE_UNLOCK_ERR;
3596    END IF; /* IF (SQL%ROWCOUNT = 0) */
3597 EXCEPTION
3598 WHEN NO_LOCKING_REQUIRED THEN
3599    NULL;
3600 WHEN TEMPLATEID_IS_NULL THEN
3601    NULL;
3602 WHEN TEMPLATE_UNLOCK_ERR THEN
3603    x_return_status := FND_API.G_RET_STS_ERROR;
3604    x_msg_count := 1;
3605    FND_MESSAGE.SET_NAME( 'CZ','CZ_UNLOCK_TMPL_ERR');
3606    FND_MESSAGE.SET_TOKEN('TEMPLATENAME', l_template_name);
3607    FND_MESSAGE.SET_TOKEN('USERNAME', l_checkout_user);
3608    FND_MSG_PUB.ADD;
3612    x_msg_count := 1;
3609    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
3610 WHEN OTHERS THEN
3611    x_return_status := FND_API.G_RET_STS_ERROR;
3613    get_checkout_user(p_template_id, 'UIT', l_checkout_user, l_template_name);
3614    x_msg_data := CZ_UTILS.GET_TEXT('CZ_UNLOCK_FATAL_ERR', 'OBJECTNAME', l_template_name, 'SQLERRM', SQLERRM);
3615    fnd_msg_pub.count_and_get(p_count => x_msg_count, p_data  => x_msg_data);
3616 END unlock_template;
3617 
3618 ----------------------
3619 PROCEDURE unlock_template(p_api_version IN  NUMBER,
3620                         p_templates_to_unlock    IN  cz_security_pvt.number_type_tbl,
3621                         p_commit_flag            IN  VARCHAR2,
3622                         p_init_msg_list          IN  VARCHAR2,
3623                         x_return_status          OUT NOCOPY VARCHAR2,
3624                         x_msg_count              OUT NOCOPY NUMBER,
3625                         x_msg_data               OUT NOCOPY VARCHAR2)
3626 IS
3627 
3628 NO_TEMPLATES_IDS EXCEPTION;
3629 l_return_status  VARCHAR2(1);
3630 
3631 BEGIN
3632 
3633    x_return_status := FND_API.G_RET_STS_SUCCESS;
3634    x_msg_count := 0;
3635    ----initialize the message stack depending on the input parameter
3636    IF(p_init_msg_list = FND_API.G_TRUE)THEN fnd_msg_pub.initialize; END IF;
3637 
3638    -----check if the input parameter p_template_id
3639    -----has a value
3640    IF (p_templates_to_unlock.COUNT = 0) THEN
3641       RAISE NO_TEMPLATES_IDS;
3642    END IF; /* IF (p_templates_to_lock.COUNT = 0) */
3643 
3644    IF (p_templates_to_unlock.COUNT > 0) THEN
3645       FOR I IN p_templates_to_unlock.FIRST..p_templates_to_unlock.LAST
3646       LOOP
3647           cz_security_pvt.unlock_template(1.0,
3648                         p_templates_to_unlock(i),
3649                         FND_API.G_FALSE,
3650                         l_return_status,
3651                         x_msg_count,
3652                         x_msg_data);
3653            IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3654               x_return_status := FND_API.G_RET_STS_ERROR;
3655            END IF;
3656       END LOOP;
3657    END IF;
3658    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
3659    IF (p_commit_flag =  FND_API.G_TRUE) THEN COMMIT; END IF;  /* IF (p_commit_flag = '0') */
3660 EXCEPTION
3661 WHEN NO_TEMPLATES_IDS THEN
3662    NULL;
3663 WHEN OTHERS THEN
3664    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3665    x_return_status := SQLERRM;
3666    x_msg_count := 1;
3667    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
3668 END unlock_template;
3669 
3670 ---------------------
3671 /*#
3672  * This is the public interface for lock operations on a model in Oracle Configurator
3673  * @param p_model_id    number.  devl_project_id of the model from cz_devl_projects table
3674  * @param p_lock_child_models   A value of FND_API.G_TRUE indicates that the child models if any should be
3675  *                              locked. A value of FND_API.G_FALSE indicates that only the root model
3676  *                              will be locked
3677  * @param p_commit_flag A value of FND_API.G_TRUE indicates that the a commit be issued at the end of the
3678  *          the procedure. A value of FND_API.G_FALSE indicates that no COMMIT is done.
3679  * @param p_init_msg_list FND_API.G_TRUE if the API should initialize the FND stack, FND_API.G_FALSE if not.
3680  * @param x_locked_entities Contains models locked by this procedure call.  This when passed as an input parameter
3681            to unlock_model API would ensure that only those models that have been locked by the lock API are unlocked.  Models
3682  *         that were previously locked would not be unlocked (by the same user).  The retaining of the lock state
3683  *         is done only during implicit locks and not when an unlock is done from developer.
3684  * @param x_return_status standard FND status. (ex:FND_API.G_RET_STS_SUCCESS )
3685  * @param x_msg_count     number of messages on the stack.
3686  * @param x_msg_data      standard FND OUT parameter for message.  Messages are written to the FND error stack
3687  * @rep:scope public
3688  * @rep:product CZ
3689  * @rep:displayname API for working with lock operations on a model
3690  * @rep:lifecycle active
3691  * @rep:compatibility S
3692  * @rep:category BUSINESS_ENTITY CZ_SECURITY
3693  *
3694  * Validations: The lock_model API validates the following:
3695  *              1. validate input parameters
3696  *              2. Check for the profile value 'CZ: Require Locking'. If 'Yes' then lock model
3697  *                 otherwise return a status of 'S'
3698  *              3. When doing a lock on the model and its children, if any of the model(s)
3699  *                 are locked by a different user (it is ok to be locked by the same user)
3700  *                 an exception is raised.
3701  *                 The error messages are written to the FND stack and there would be one message
3702  *                 for each model locked by a different user.
3703  *                 The message would contain the name of the model and the user who locked it.
3704  *
3705  * Error reporting: Messages are written to FND error stack.  The caller would have to get all the
3706  *                  messages from the stack.  No messages are logged to cz_db_logs.
3707  *
3708  * Usage
3712  *                             p_commit_flag =>  FND_API.G_TRUE,
3709  * lock model and its children  :    cz_security_pvt.lock_model(
3710  *                             p_model_id => <devl_project_id of the model>,
3711  *                             p_lock_child_models =>  FND_API.G_TRUE,
3713  *                             p_init_msg_list => FND_API.G_TRUE,
3714  *                             x_prev_locked_entities =>  l_locked_entities,
3715  *                             x_return_status => x_return_status,
3716  *                             x_msg_count =>   x_msg_count,
3717  *                             x_msg_data =>   x_msg_data);
3718  *
3719  * lock root model only         :    cz_security_pvt.lock_model(
3720  *                             p_model_id => <devl_project_id of the model>,
3721  *                             p_lock_child_models =>  FND_API.G_FALSE,
3722  *                             p_commit_flag =>  FND_API.G_TRUE,
3723  *                             p_init_msg_list => FND_API.G_TRUE,
3724  *                             x_locked_entities =>  l_locked_entities,
3725  *                             x_return_status => x_return_status,
3726  *                             x_msg_count =>   x_msg_count,
3727  *                             x_msg_data =>   x_msg_data);
3728  */
3729 
3730 PROCEDURE lock_model(p_api_version            IN NUMBER,
3731                      p_model_id               IN NUMBER,
3732                      p_lock_child_models      IN VARCHAR2,
3733                      p_commit_flag            IN VARCHAR2,
3734                      p_init_msg_list          IN VARCHAR2,
3735                      x_locked_entities  OUT NOCOPY number_type_tbl,
3736                      x_return_status         OUT NOCOPY VARCHAR2,
3737                      x_msg_count             OUT NOCOPY NUMBER,
3738                      x_msg_data              OUT NOCOPY VARCHAR2)
3739 IS
3740 
3741 l_checkout_user       cz_devl_projects.checkout_user%TYPE;
3742 l_model_name          cz_devl_projects.name%TYPE;
3743 l_model_name_tbl      cz_security_pvt.model_name_tbl;
3744 l_checkout_user_tbl   cz_security_pvt.checkout_user_tbl;
3745 MODEL_IS_LOCKED       EXCEPTION;
3746 MODELID_IS_NULL       EXCEPTION;
3747 INVALID_MODEL_ID	    EXCEPTION;
3748 NO_LOCKING_REQUIRED   EXCEPTION;
3749 LOCK_SINGLE_MODEL_ERR EXCEPTION;
3750 l_model_tbl           cz_security_pvt.number_type_tbl;
3751 l_prev_locked_models  cz_security_pvt.number_type_tbl;
3752 l_count               NUMBER := 0;
3753 l_lock_child_models   VARCHAR2(1);
3754 l_commit_flag         VARCHAR2(1);
3755 l_lock_profile        VARCHAR2(3);
3756 l_model_id		    cz_devl_projects.devl_project_id%TYPE;
3757 l_seeded_flag		    cz_rp_entries.seeded_flag%TYPE;
3758 
3759 BEGIN
3760    ----initialize FND stack
3761    x_return_status := FND_API.G_RET_STS_SUCCESS;
3762    x_msg_data      := NULL;
3763    x_msg_count     := 0;
3764    x_locked_entities.DELETE;
3765 
3766    ----initialize the message stack depending on the input parameter
3767    IF(p_init_msg_list = FND_API.G_TRUE)THEN fnd_msg_pub.initialize; END IF;
3768 
3769    ----check if locking is enabled
3770    ----if the site level profile for locking is not enabled then
3771    ----there is no need to do locking
3772    l_lock_profile := get_locking_profile_value;
3773    IF (UPPER(NVL(l_lock_profile,'Y')) IN ('N','NO')) THEN
3774       RAISE NO_LOCKING_REQUIRED;
3775    END IF;
3776 
3777     ----check if the input parameter p_model_id
3778    -----has a value
3779    IF (p_model_id IS NULL) THEN
3780       RAISE MODELID_IS_NULL;
3781    ELSE
3782      BEGIN
3783        SELECT devl_project_id, seeded_flag
3784        INTO   l_model_id, l_seeded_flag
3785        FROM   cz_rp_entries a, cz_devl_projects b
3786        WHERE  b.devl_project_id = p_model_id
3787        AND    b.devl_project_id = a.object_id
3788        AND    a.deleted_flag = '0'
3789        AND    b.deleted_flag = '0'
3790        AND    a.object_type='PRJ';
3791      EXCEPTION
3792      WHEN NO_DATA_FOUND THEN
3793        RAISE INVALID_MODEL_ID;
3794      END;
3795    END IF; /* IF (p_model_id IS NULL) */
3796 
3797    IF (l_seeded_flag = '1') THEN
3798       RAISE NO_LOCKING_REQUIRED;
3799    END IF;
3800 
3801    -----initialize l_commit_flag
3802    IF (p_commit_flag IS NULL) THEN
3803       l_commit_flag := DO_NOT_COMMIT;
3804    ELSIF (p_commit_flag = FND_API.G_TRUE) THEN
3805       l_commit_flag := DO_COMMIT;
3806    ELSIF (p_commit_flag = FND_API.G_FALSE) THEN
3807       l_commit_flag := DO_NOT_COMMIT;
3808    END IF; /* IF (p_commit_flag IS NULL) */
3809 
3810    IF (p_lock_child_models IS NULL) THEN
3811       l_lock_child_models := DO_NOT_LOCK_CHILD_MODELS;
3812    ELSIF (p_lock_child_models = FND_API.G_TRUE) THEN
3813       l_lock_child_models := LOCK_CHILD_MODELS;
3814    ELSIF (p_lock_child_models = FND_API.G_FALSE) THEN
3815       l_lock_child_models := DO_NOT_LOCK_CHILD_MODELS;
3816    END IF; /* IF (p_lock_child_models IS NULL) */
3817 
3818    IF (l_lock_child_models = LOCK_CHILD_MODELS) THEN
3819          l_model_tbl.DELETE;
3820       get_models_to_lock(p_model_id,0,x_locked_entities);
3821          BEGIN
3822                SELECT distinct component_id
3823                BULK
3824                COLLECT
3825                INTO   l_model_tbl
3826                FROM   cz_model_ref_expls
3827                WHERE  model_id = p_model_id
3828                AND    deleted_flag = '0'
3829                AND    ps_node_type IN (263,264);
3830          EXCEPTION
3834          l_count := l_model_tbl.COUNT + 1;
3831          WHEN NO_DATA_FOUND THEN
3832             NULL;
3833          END;
3835          l_model_tbl(l_count) := p_model_id;
3836           IF (l_model_tbl.COUNT > 0) THEN
3837             FOR I IN l_model_tbl.FIRST..l_model_tbl.LAST
3838             LOOP
3839                  l_count := 0;
3840                  UPDATE cz_devl_projects
3841                  SET    cz_devl_projects.checkout_user = FND_GLOBAL.user_name,
3842                         cz_devl_projects.checkout_time = sysdate
3843                  WHERE  cz_devl_projects.devl_project_id = l_model_tbl(i)
3844                  AND    (cz_devl_projects.checkout_user IS NULL)
3845                  AND    cz_devl_projects.deleted_flag = '0';
3846 
3847                 l_count := SQL%ROWCOUNT;
3848                 IF (l_count = 0)
3849                 THEN
3850                   get_checkout_user(l_model_tbl(i),'PRJ',l_checkout_user,l_model_name);
3851                   IF(l_checkout_user<>FND_GLOBAL.user_name AND l_checkout_user is not null)
3852                   THEN
3853                   RAISE MODEL_IS_LOCKED;
3854                   END IF;
3855                 END IF;
3856              END LOOP;
3857           END IF;
3858       ELSE
3859           l_count := 0;
3860           get_models_to_lock(p_model_id,1,x_locked_entities);
3861           UPDATE cz_devl_projects
3862           SET    cz_devl_projects.checkout_user = FND_GLOBAL.user_name,
3863                  cz_devl_projects.checkout_time = SYSDATE
3864           WHERE  cz_devl_projects.devl_project_id = p_model_id
3865           AND    (cz_devl_projects.checkout_user IS NULL);
3866           l_count := SQL%ROWCOUNT;
3867            IF (l_count = 0)
3868            THEN
3869                get_checkout_user(p_model_id,'PRJ',l_checkout_user,l_model_name);
3870                IF(l_checkout_user<>FND_GLOBAL.user_name AND l_checkout_user is not null)
3871                THEN
3872                  RAISE LOCK_SINGLE_MODEL_ERR;
3873                END IF;
3874           END IF;
3875       END IF; /* IF (l_lock_child_models = LOCK_CHILD_MODELS) */
3876 IF (l_commit_flag = DO_COMMIT) THEN
3877       COMMIT;
3878 END IF; /* IF (l_commit_flag = 1) */
3879 EXCEPTION
3880 WHEN INVALID_MODEL_ID THEN
3881    x_return_status := FND_API.G_RET_STS_ERROR;
3882    x_msg_count := 1;
3883    FND_MESSAGE.SET_NAME( 'CZ','CZ_INVALID_MODEL_ID');
3884    FND_MSG_PUB.ADD;
3885    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
3886 WHEN LOCK_SINGLE_MODEL_ERR THEN
3887    x_return_status := FND_API.G_RET_STS_ERROR;
3888    x_msg_count := 1;
3889    FND_MESSAGE.SET_NAME( 'CZ','CZ_LOCK_MODEL_ERR');
3890    FND_MESSAGE.SET_TOKEN('MODELNAME', l_model_name);
3891    FND_MESSAGE.SET_TOKEN('USERNAME', l_checkout_user);
3892    FND_MSG_PUB.ADD;
3893    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
3894 WHEN NO_LOCKING_REQUIRED THEN
3895    NULL;
3896 WHEN MODELID_IS_NULL THEN
3897    NULL;
3898 WHEN MODEL_IS_LOCKED THEN
3899    x_return_status := FND_API.G_RET_STS_ERROR;
3900    add_to_error_stack(p_model_id,l_model_name_tbl,l_checkout_user_tbl);
3901    IF (l_model_name_tbl.COUNT > 0) THEN
3902      FOR I IN l_model_name_tbl.FIRST..l_model_name_tbl.LAST
3903      LOOP
3904        x_msg_count := x_msg_count + 1;
3905        FND_MESSAGE.SET_NAME('CZ', 'CZ_LOCK_MODEL_ERR');
3906        FND_MESSAGE.SET_TOKEN('MODELNAME', l_model_name_tbl(i));
3907        FND_MESSAGE.SET_TOKEN('USERNAME',l_checkout_user_tbl(i));
3908        FND_MSG_PUB.ADD;
3909      END LOOP;
3910    END IF;
3911    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
3912 WHEN OTHERS THEN
3913    x_return_status := FND_API.G_RET_STS_ERROR;
3914    x_msg_count := 1;
3915    get_checkout_user(p_model_id, 'PRJ', l_checkout_user, l_model_name);
3916    FND_MESSAGE.SET_NAME('CZ','CZ_LOCK_FATAL_ERR');
3917    FND_MESSAGE.SET_TOKEN('OBJECTNAME', l_model_name);
3918    FND_MESSAGE.SET_TOKEN('SQLERRM', SQLERRM);
3919    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
3920 END lock_model;
3921 
3922 ---------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3923 /*#
3924  * This is the public interface for unlock operations on a model in Oracle Configurator
3925  * @param p_model_id    number. devl_project_id of the model from cz_devl_projects table
3926  * @param p_unlock_child_models A value of FND_API.G_TRUE indicates that the child models if any should be
3927  *                              unlocked. A value of FND_API.G_FALSE indicates that only the root model
3928  *                              will be unlocked
3929  * @param p_models_to_unlock would contain an array of model id(s) that have been populated with
3930  * locked models during the execution of the lock model API.  The unlock_model API will unlock only the models
3931  * in this array .
3932  * @param p_init_msg_list FND_API.G_TRUE if the API should initialize the FND stack, FND_API.G_FALSE if not.
3933  * @param x_return_status standard FND status. (ex:FND_API.G_RET_STS_SUCCESS )
3934  * @param x_msg_count     number of messages on the stack.
3935  * @param x_msg_data      standard FND OUT parameter for message.  Messages are written to the FND error stack
3936  * @rep:scope public
3937  * @rep:product CZ
3938  * @rep:displayname API for working with unlock operations on a model
3939  * @rep:lifecycle active
3940  * @rep:compatibility S
3941  * @rep:category BUSINESS_ENTITY CZ_SECURITY
3942  *
3946  * p_models_to_unlock :    cz_security_pvt.unlock_model(
3943  * Usage
3944  *
3945  * unlock models in the array
3947  *                             p_commit_flag =>  FND_API.G_TRUE,
3948  *                             p_models_to_unlock =>  l_locked_entities,
3949  *                             p_init_msg_list => FND_API.G_TRUE,
3950  *                             x_return_status => x_return_status,
3951  *                             x_msg_count =>   x_msg_count,
3952  *                             x_msg_data =>   x_msg_data);
3953  *
3954  */
3955 
3956 PROCEDURE unlock_model(p_api_version         IN NUMBER,
3957                        p_commit_flag         IN VARCHAR2,
3958                        p_models_to_unlock    IN number_type_tbl,
3959                        p_init_msg_list       IN VARCHAR2,
3960                        x_return_status      OUT NOCOPY VARCHAR2,
3961                        x_msg_count          OUT NOCOPY NUMBER,
3962                        x_msg_data           OUT NOCOPY VARCHAR2)
3963 IS
3964 l_return_status VARCHAR2(1);
3965 l_msg_count     NUMBER;
3966 l_msg_data      VARCHAR2(2000);
3967 
3968 BEGIN
3969    ----initialize FND stack
3970    x_return_status := FND_API.G_RET_STS_SUCCESS;
3971    IF (p_init_msg_list = FND_API.G_TRUE) THEN
3972       FND_MSG_PUB.initialize;
3973    END IF;
3974 
3975    IF (p_models_to_unlock.COUNT > 0) THEN
3976       FOR I IN p_models_to_unlock.FIRST..p_models_to_unlock.LAST
3977       LOOP
3978 	  unlock_model(1.0,p_models_to_unlock(i),FND_API.G_FALSE,FND_API.G_FALSE,
3979 			   l_return_status,l_msg_count,l_msg_data);
3980         IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3981             x_return_status := FND_API.G_RET_STS_ERROR;
3982         END IF;
3983       END LOOP;
3984     END IF;
3985    IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3986     fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
3987    END IF;
3988     IF (p_commit_flag = FND_API.G_TRUE) THEN
3989  	  COMMIT;
3990     END IF;
3991 END unlock_model;
3992 
3993 ---------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3994 PROCEDURE unlock_model(p_api_version         IN NUMBER,
3995                        p_model_id            IN NUMBER,
3996                        p_commit_flag         IN VARCHAR2,
3997                        p_init_msg_list       IN VARCHAR2,
3998                        x_return_status      OUT NOCOPY VARCHAR2,
3999                        x_msg_count          OUT NOCOPY NUMBER,
4000                        x_msg_data           OUT NOCOPY VARCHAR2)
4001 IS
4002 
4003 MODEL_IS_NOT_UNLOCKED   EXCEPTION;
4004 MODELID_IS_NULL         EXCEPTION;
4005 MODEL_UNLOCK_ERR        EXCEPTION;
4006 NO_LOCKING_REQUIRED     EXCEPTION;
4007 l_model_tbl             cz_security_pvt.number_type_tbl;
4008 l_count                 NUMBER := 0;
4009 l_checkout_user         cz_devl_projects.checkout_user%TYPE;
4010 l_model_name_tbl        cz_security_pvt.model_name_tbl;
4011 l_checkout_user_tbl     cz_security_pvt.checkout_user_tbl;
4012 l_model_name            cz_devl_projects.name%TYPE;
4013 l_commit_flag           VARCHAR2(1);
4014 l_lock_profile          VARCHAR2(3);
4015 
4016 BEGIN
4017    ----initialize FND stack
4018    x_return_status := FND_API.G_RET_STS_SUCCESS;
4019    x_msg_data      := NULL;
4020    x_msg_count     := 0;
4021 
4022    ----initialize the message stack depending on the input parameter
4023    IF(p_init_msg_list = FND_API.G_TRUE)THEN fnd_msg_pub.initialize; END IF;
4024 
4025    -----check if the input parameter p_model_id
4026    -----has a value
4027    IF (p_model_id IS NULL) THEN
4028       RAISE MODELID_IS_NULL;
4029    END IF; /* IF (p_model_id IS NULL) */
4030 
4031    ----check if locking is enabled
4032    ----if the site level profile for locking is not enabled then
4033    ----there is no need to do locking
4034    l_lock_profile := get_locking_profile_value;
4035    IF (UPPER(NVL(l_lock_profile,'Y')) IN ('N','NO')) THEN
4036       RAISE NO_LOCKING_REQUIRED;
4037    END IF; /* IF (UPPER(NVL(l_lock_profile,'Y')) IN ('N','NO')) */
4038 
4039    -----initialize l_commit_flag
4040    IF (p_commit_flag IS NULL) THEN
4041       l_commit_flag := DO_NOT_COMMIT;
4042    ELSIF (p_commit_flag = FND_API.G_TRUE) THEN
4043       l_commit_flag := DO_COMMIT;
4044    ELSIF (p_commit_flag = FND_API.G_FALSE) THEN
4045       l_commit_flag := DO_NOT_COMMIT;
4046    END IF; /* IF (p_commit_flag IS NULL) */
4047 
4048 
4049    UPDATE cz_devl_projects
4050    SET    cz_devl_projects.checkout_user = NULL,
4051           cz_devl_projects.checkout_time = NULL
4052    WHERE  cz_devl_projects.devl_project_id = p_model_id
4053    AND   (cz_devl_projects.checkout_user IS NULL
4054    OR    cz_devl_projects.checkout_user = FND_GLOBAL.user_name);
4055 
4056    IF (SQL%ROWCOUNT = 0) THEN
4057        get_checkout_user(p_model_id,'PRJ',l_checkout_user,l_model_name);
4058        RAISE MODEL_UNLOCK_ERR;
4059     END IF;
4060 IF (l_commit_flag = DO_COMMIT) THEN COMMIT; END IF;
4061 EXCEPTION
4062 WHEN NO_LOCKING_REQUIRED THEN
4063    NULL;
4064 WHEN MODELID_IS_NULL THEN
4065    NULL;
4066 WHEN MODEL_UNLOCK_ERR THEN
4067    x_return_status := FND_API.G_RET_STS_ERROR;
4068    add_to_error_stack(p_model_id,l_model_name_tbl,l_checkout_user_tbl);
4069    IF (l_model_name_tbl.COUNT > 0) THEN
4070      FOR I IN l_model_name_tbl.FIRST..l_model_name_tbl.LAST
4074        FND_MESSAGE.SET_TOKEN('MODELNAME', l_model_name_tbl(i));
4071      LOOP
4072          x_msg_count := x_msg_count + 1;
4073        FND_MESSAGE.SET_NAME( 'CZ','CZ_MODEL_UNLOCK_ERR');
4075        FND_MESSAGE.SET_TOKEN('USERNAME', l_checkout_user_tbl(i));
4076        FND_MSG_PUB.ADD;
4077      END LOOP;
4078    END IF;
4079    fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
4080 WHEN OTHERS THEN
4081    x_return_status := FND_API.G_RET_STS_ERROR;
4082    get_checkout_user(p_model_id, 'PRJ', l_checkout_user, l_model_name);
4083    x_msg_data := CZ_UTILS.GET_TEXT('CZ_UNLOCK_FATAL_ERR', 'OBJECTNAME', l_model_name, 'SQLERRM', SQLERRM);
4084    fnd_msg_pub.count_and_get(p_count => x_msg_count, p_data  => x_msg_data);
4085 END unlock_model;
4086 ---------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4087 ------wrappers
4088 
4089 PROCEDURE lock_template(p_api_version       IN NUMBER,
4090                         p_template_id       IN NUMBER,
4091                         p_init_msg_list     IN VARCHAR2,
4092                         x_return_status    OUT NOCOPY VARCHAR2,
4093                         x_msg_count        OUT NOCOPY NUMBER,
4094                         x_msg_data         OUT NOCOPY VARCHAR2)
4095 IS
4096 
4097 l_init_msg_list     VARCHAR2(1) := FND_API.G_FALSE;
4098 
4099 BEGIN
4100 
4101    IF(p_init_msg_list = DO_INIT_MSG_LIST)THEN l_init_msg_list := FND_API.G_TRUE; END IF;
4102 
4103    lock_template(p_api_version, p_template_id, FND_API.G_FALSE, l_init_msg_list, x_return_status,
4104                  x_msg_count, x_msg_data);
4105 END;
4106 
4107 ----------------
4108 PROCEDURE unlock_template(p_api_version       IN NUMBER,
4109                           p_template_id       IN NUMBER,
4110                           p_force_unlock      IN VARCHAR2,
4111                           p_init_msg_list     IN VARCHAR2,
4112                           x_return_status    OUT NOCOPY VARCHAR2,
4113                           x_msg_count        OUT NOCOPY NUMBER,
4114                           x_msg_data         OUT NOCOPY VARCHAR2)
4115 IS
4116 
4117 l_init_msg_list     VARCHAR2(1) := FND_API.G_FALSE;
4118 
4119 BEGIN
4120 
4121   IF(p_init_msg_list = DO_INIT_MSG_LIST)THEN l_init_msg_list := FND_API.G_TRUE; END IF;
4122 
4123   IF (p_force_unlock = '0') THEN
4124     unlock_template(p_api_version, p_template_id, l_init_msg_list, x_return_status, x_msg_count, x_msg_data);
4125   ELSE
4126     force_unlock_template (p_api_version, p_template_id, l_init_msg_list, x_return_status, x_msg_count,
4127                            x_msg_data);
4128   END IF;
4129 END;
4130 
4131 --------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4132 ----For developer
4133 PROCEDURE lock_model(p_api_version       IN NUMBER,
4134                      p_model_id          IN NUMBER,
4135                      p_lock_child_models IN VARCHAR2,
4136                      p_commit_flag       IN VARCHAR2,
4137                      p_init_msg_list     IN VARCHAR2,
4138                      x_return_status    OUT NOCOPY VARCHAR2,
4139                      x_msg_count        OUT NOCOPY NUMBER,
4140                      x_msg_data         OUT NOCOPY VARCHAR2)
4141 IS
4142 
4143 l_models_locked_tbl number_type_tbl;
4144 l_lock_child_models VARCHAR2(1) := FND_API.G_FALSE;
4145 l_commit_flag       VARCHAR2(1) := FND_API.G_FALSE;
4146 l_init_msg_list     VARCHAR2(1) := FND_API.G_FALSE;
4147 
4148 BEGIN
4149 
4150   IF(p_lock_child_models = LOCK_CHILD_MODELS)THEN l_lock_child_models := FND_API.G_TRUE; END IF;
4151   IF(p_commit_flag = DO_COMMIT)THEN l_commit_flag := FND_API.G_TRUE; END IF;
4152   IF(p_init_msg_list = DO_INIT_MSG_LIST)THEN l_init_msg_list := FND_API.G_TRUE; END IF;
4153 
4154   lock_model(p_api_version, p_model_id, l_lock_child_models, l_commit_flag, l_init_msg_list,
4155              l_models_locked_tbl, x_return_status, x_msg_count, x_msg_data);
4156 END;
4157 
4158 ---------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4159 ----Wrappers to be used by Import, Publishing, Logic Gen and UI Gen. Hide the p_init_msg_list parameter.
4160 ----The message list is not initialized.
4161 PROCEDURE lock_model(p_api_version           IN NUMBER,
4162                      p_model_id              IN NUMBER,
4163                      p_lock_child_models     IN VARCHAR2,
4164                      p_commit_flag           IN VARCHAR2,
4165                      x_locked_entities OUT NOCOPY number_type_tbl,
4166                      x_return_status        OUT NOCOPY VARCHAR2,
4167                      x_msg_count            OUT NOCOPY NUMBER,
4168                      x_msg_data             OUT NOCOPY VARCHAR2)
4169 IS
4170 BEGIN
4171 
4172   lock_model(p_api_version, p_model_id, p_lock_child_models, FND_API.G_TRUE, FND_API.G_FALSE,
4173              x_locked_entities, x_return_status, x_msg_count, x_msg_data);
4174 END;
4175 
4176 PROCEDURE unlock_model(p_api_version        IN  NUMBER,
4177                        p_commit_flag        IN  VARCHAR2,
4178                        p_models_to_unlock   IN  number_type_tbl,
4179                        x_return_status      OUT NOCOPY VARCHAR2,
4180                        x_msg_count          OUT NOCOPY NUMBER,
4181                        x_msg_data           OUT NOCOPY VARCHAR2)
4182 IS
4183 BEGIN
4184 
4185   unlock_model(p_api_version,p_commit_flag,p_models_to_unlock,
4186 		   FND_API.G_FALSE, x_return_status,x_msg_count,x_msg_data);
4187 END;
4188 
4192 		    p_model_id              IN NUMBER,
4189 ---------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4190 ----unlock model for rule import
4191 PROCEDURE unlock_model (p_api_version   IN NUMBER,
4193                 x_return_status         OUT NOCOPY VARCHAR2,
4194                 x_msg_count             OUT NOCOPY NUMBER,
4195                 x_msg_data              OUT NOCOPY VARCHAR2)
4196 IS
4197 
4198 BEGIN
4199   ----initialize FND stack
4200    FND_MSG_PUB.initialize;
4201    x_return_status := FND_API.G_RET_STS_SUCCESS;
4202    x_msg_data      := NULL;
4203    x_msg_count     := 0;
4204 
4205    cz_security_pvt.unlock_model(1.0,p_model_id,FND_API.G_FALSE,FND_API.G_FALSE,
4206                                x_return_status,x_msg_count,x_msg_data);
4207 
4208 END unlock_model;
4209 
4210 ----------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4211 PROCEDURE unlock_model(p_api_version         IN NUMBER,
4212                        p_models_to_unlock    IN SYSTEM.CZ_NUMBER_TBL_TYPE,
4213                        p_commit_flag         IN VARCHAR2,
4214                        p_init_msg_list       IN VARCHAR2,
4215                        x_return_status      OUT NOCOPY VARCHAR2,
4216                        x_msg_count          OUT NOCOPY NUMBER,
4217                        x_msg_data           OUT NOCOPY VARCHAR2)
4218 
4219 IS
4220   l_api_name  CONSTANT VARCHAR2(30) := 'unlock_model';
4221   l_msg_count     NUMBER;
4222   l_msg_data      VARCHAR2(2000);
4223   l_return_status VARCHAR2(1);
4224  BEGIN
4225   x_return_status := FND_API.G_RET_STS_SUCCESS;
4226   IF (p_init_msg_list = FND_API.G_TRUE) THEN
4227       FND_MSG_PUB.initialize;
4228       x_msg_data      := NULL;
4229       x_msg_count     := 0;
4230   END IF;
4231 
4232   IF (p_models_to_unlock.COUNT > 0) THEN
4233      FOR I IN p_models_to_unlock.FIRST..p_models_to_unlock.LAST
4234      LOOP
4235          cz_security_pvt.unlock_model(1.0,
4236                                      p_models_to_unlock(i),
4237                                      FND_API.G_FALSE,
4238                                      FND_API.G_FALSE,
4239                                      l_return_status,
4240                                      l_msg_count,
4241                                      l_msg_data);
4242         IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
4243            x_return_status := FND_API.G_RET_STS_ERROR;
4244         END IF;
4245      END LOOP;
4246      IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
4247        fnd_msg_pub.count_and_get(FND_API.G_FALSE, x_msg_count, x_msg_data);
4248      END IF;
4249   END IF;
4250   IF (p_commit_flag = FND_API.G_TRUE) THEN COMMIT; END IF;
4251 EXCEPTION
4252   WHEN OTHERS THEN
4253     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4254     fnd_msg_pub.add_exc_msg(G_PKG_NAME, l_api_name);
4255     fnd_msg_pub.count_and_get(FND_API.G_FALSE, x_msg_count, x_msg_data);
4256 END;
4257 
4258 ---------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4259 END cz_security_pvt;