DBA Data[Home] [Help]

PACKAGE BODY: APPS.FUN_RULE_OBJECTS_PUB

Source


1 PACKAGE BODY FUN_RULE_OBJECTS_PUB AS
2 /*$Header: FUNXTMRULROBPUB.pls 120.8.12010000.2 2008/08/06 07:44:30 makansal ship $ */
3 
4 
5 ------------------------------------
6 -- declaration of private procedures
7 ------------------------------------
8 
9 
10 PROCEDURE do_create_rule_object(
11     p_rule_object_rec     IN OUT NOCOPY RULE_OBJECTS_REC_TYPE,
12     x_rule_object_id       OUT NOCOPY    NUMBER,
13     x_return_status        IN OUT NOCOPY VARCHAR2
14 );
15 
16 PROCEDURE do_create_rule_object_instance(
17     p_application_id     IN      NUMBER,
18     p_rule_object_name   IN      VARCHAR2,
19     p_instance_label     IN      VARCHAR2,
20     p_org_id             IN      NUMBER,
21     x_rule_object_id     OUT NOCOPY    NUMBER,
22     x_return_status      IN OUT NOCOPY VARCHAR2
23 );
24 
25 PROCEDURE do_update_rule_object(
26     p_update_instance     IN VARCHAR2 DEFAULT 'N',
27     p_rule_object_rec      IN OUT NOCOPY RULE_OBJECTS_REC_TYPE,
28     p_object_version_number IN OUT NOCOPY   NUMBER,
29     x_return_status         IN OUT NOCOPY   VARCHAR2
30 );
31 
32 --------------------------------------
33 -- private procedures and functions
34 --------------------------------------
35 
36 /*===========================================================================+
37  | PROCEDURE
38  |              do_create_rule_object
39  |
40  | DESCRIPTION
41  |              Creates user customizable objects
42  |
43  | SCOPE - PRIVATE
44  |
45  | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
46  |
47  | ARGUMENTS  : IN:
48  |              OUT:
49  |          IN/ OUT:
50  |                    p_rule_object_rec
51  |                    x_return_status
52  |
53  | RETURNS    : NONE
54  |
55  | NOTES
56  |
57  | MODIFICATION HISTORY
58  |          10-Sep-2004    Amulya Mishra         Created.
59  +===========================================================================*/
60 
61 PROCEDURE do_create_rule_object(
62     p_rule_object_rec     IN OUT NOCOPY RULE_OBJECTS_REC_TYPE,
63     x_rule_object_id       OUT NOCOPY    NUMBER,
64     x_return_status        IN OUT NOCOPY VARCHAR2
65 ) IS
66 
67     l_rowid                      rowid:= NULL;
68 
69 BEGIN
70    -- validate the input record
71     FUN_RULE_VALIDATE_PKG.validate_rule_objects(
72       'C',
73       p_rule_object_rec,
74       l_rowid,
75       x_return_status
76     );
77 
78     IF x_return_status = fnd_api.g_ret_sts_error THEN
79       RAISE fnd_api.g_exc_error;
80     END IF;
81 
82     /********************************************************************************
83       Dont pass X_INSTANCE_LABEL,X_PARENT_RULE_OBJECT_ID,X_ORG_ID
84       on in this API the Rule Object Instance Information. Because, create_rule_object
85       API will not be used to create the Rule Object Instance.
86     *********************************************************************************/
87 
88     FUN_RULE_OBJECTS_PKG.Insert_Row (
89         X_ROWID                                =>l_rowid,
90         X_RULE_OBJECT_ID                       =>p_rule_object_rec.rule_object_id,
91         X_APPLICATION_ID                       =>p_rule_object_rec.application_id,
92         X_RULE_OBJECT_NAME                     =>p_rule_object_rec.rule_object_name,
93         X_RESULT_TYPE                          =>p_rule_object_rec.result_type,
94         X_REQUIRED_FLAG                        =>p_rule_object_rec.required_flag,
95         X_USE_DEFAULT_VALUE_FLAG               =>p_rule_object_rec.use_default_value_flag,
96         X_DEFAULT_APPLICATION_ID               =>p_rule_object_rec.default_application_id,
97         X_DEFAULT_VALUE                        =>p_rule_object_rec.default_value,
98         X_FLEX_VALUE_SET_ID                    =>p_rule_object_rec.flex_value_set_id,
99         X_FLEXFIELD_NAME                       =>p_rule_object_rec.flexfield_name,
100         X_FLEXFIELD_APP_SHORT_NAME             =>p_rule_object_rec.flexfield_app_short_name,
101 	X_MULTI_RULE_RESULT_FLAG               =>p_rule_object_rec.multi_rule_result_flag,
102         X_CREATED_BY_MODULE                    =>p_rule_object_rec.created_by_module,
103         X_USER_RULE_OBJECT_NAME                =>p_rule_object_rec.user_rule_object_name,
104         X_DESCRIPTION                          =>p_rule_object_rec.description,
105         X_USE_INSTANCE_FLAG                    =>p_rule_object_rec.use_instance_flag
106     );
107 
108 END;
109 
110 /*===========================================================================+
111  | PROCEDURE
112  |              do_create_rule_object_instance
113  |
114  | DESCRIPTION
115  |              Creates Rule object Instance
116  |
117  | SCOPE - PRIVATE
118  |
119  | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
120  |
121  | ARGUMENTS  : IN:
122  |              OUT:
123  |          IN/ OUT:
124  |                    p_rule_object_rec
125  |                    x_return_status
126  |
127  | RETURNS    : NONE
128  |
129  | NOTES
130  |
131  | MODIFICATION HISTORY
132  |          27-DEC-2005    Amulya Mishra         Created.
133  +===========================================================================*/
134 
135 PROCEDURE do_create_rule_object_instance(
136     p_application_id     IN      NUMBER,
137     p_rule_object_name   IN      VARCHAR2,
138     p_instance_label     IN      VARCHAR2,
139     p_org_id             IN      NUMBER,
140     x_rule_object_id     OUT NOCOPY    NUMBER,
141     x_return_status      IN OUT NOCOPY VARCHAR2
142 ) IS
143 
144     l_rowid                      rowid:= NULL;
145     l_orig_rule_object_rec       RULE_OBJECTS_REC_TYPE;
146     l_rule_object_instance_rec   RULE_OBJECTS_REC_TYPE;
147     l_rule_object_id             FUN_RULE_OBJECTS_B.RULE_OBJECT_ID%TYPE;
148 
149     x_msg_count                  number;
150     x_msg_data                   varchar2(2000);
151 
152 BEGIN
153 
154     -- Get old records. Will be used by logic to create Rule Object Instance.
155     -- Before creating the Rule Object Instance for a Rule Object Name, we
156     -- need to check if the original rule object instance exists or not.
157     -- So explicitly pass p_instance_label as NULL.
158 
159 
160     get_rule_object_rec (
161         p_rule_object_name                  => p_rule_object_name,
162         p_application_id                    => P_application_id,
163 	p_instance_label                    => NULL,
164         p_org_id                            => NULL,
165         x_rule_object_rec                   => l_orig_rule_object_rec,
166         x_return_status                     => x_return_status,
167         x_msg_count                         => x_msg_count,
168         x_msg_data                          => x_msg_data );
169 
170 
171     IF x_return_status = FND_API.G_RET_STS_ERROR THEN
172         RAISE FND_API.G_EXC_ERROR;
173     ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
174         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
175     END IF;
176 
177     --Validate if the parent rule object has use_instance_flag as Y or not.
178     --If not, then we will raise user defined exception and come out.
179 
180     IF  (NOT UPPER(l_orig_rule_object_rec.use_instance_flag) = 'Y') THEN
181       fnd_message.set_name('FUN', 'FUN_RULE_NO_CREATE_ROB_INST');
182       fnd_msg_pub.add;
183       x_return_status := fnd_api.g_ret_sts_error;
184       RAISE FND_API.G_EXC_ERROR;
185     END IF;
186 
187 
188    --If we have reached here, that means we have got the Rule Object Name for which
189    --we want to create Rule Object Instance.
190 
191    --Assign related values for the instance.
192    l_rule_object_instance_rec := l_orig_rule_object_rec;
193 
194    l_rule_object_instance_rec.instance_label := p_instance_label;
195 
196    --Derive the Rule_Object_Id of original Rule Object and set it as
197    --parent_rule_object_id of the instance.
198 
199    l_rule_object_instance_rec.parent_rule_object_id := l_orig_rule_object_rec.rule_object_id;
200    l_rule_object_instance_rec.org_id := p_org_id;
201 
202 
203    -- validate the input record
204     FUN_RULE_VALIDATE_PKG.validate_rule_object_instance(
205       'C',
206       l_rule_object_instance_rec,
207       l_rowid,
208       x_return_status
209     );
210 
211     IF x_return_status = FND_API.G_RET_STS_ERROR THEN
212         RAISE FND_API.G_EXC_ERROR;
213     ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
214         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
215     END IF;
216 
217     FUN_RULE_OBJECTS_PKG.Insert_Row (
218 		X_ROWID                                =>l_rowid,
219 		X_RULE_OBJECT_ID                       =>NULL,
220 		X_APPLICATION_ID                       =>l_rule_object_instance_rec.application_id,
221 		X_RULE_OBJECT_NAME                     =>l_rule_object_instance_rec.rule_object_name,
222 		X_RESULT_TYPE                          =>l_rule_object_instance_rec.result_type,
223 		X_REQUIRED_FLAG                        =>l_rule_object_instance_rec.required_flag,
224 		X_USE_DEFAULT_VALUE_FLAG               =>l_rule_object_instance_rec.use_default_value_flag,
225 		X_DEFAULT_APPLICATION_ID               =>l_rule_object_instance_rec.default_application_id,
226 		X_DEFAULT_VALUE                        =>l_rule_object_instance_rec.default_value,
227 		X_FLEX_VALUE_SET_ID                    =>l_rule_object_instance_rec.flex_value_set_id,
228 		X_FLEXFIELD_NAME                       =>l_rule_object_instance_rec.flexfield_name,
229 		X_FLEXFIELD_APP_SHORT_NAME             =>l_rule_object_instance_rec.flexfield_app_short_name,
230 		X_MULTI_RULE_RESULT_FLAG               =>l_rule_object_instance_rec.multi_rule_result_flag,
231 		X_CREATED_BY_MODULE                    =>l_rule_object_instance_rec.created_by_module,
232 		X_USER_RULE_OBJECT_NAME                =>l_rule_object_instance_rec.user_rule_object_name,
233 		X_DESCRIPTION                          =>l_rule_object_instance_rec.description,
234 		X_USE_INSTANCE_FLAG                    =>l_rule_object_instance_rec.use_instance_flag,
235 		X_INSTANCE_LABEL                       =>l_rule_object_instance_rec.instance_label,
236 		X_PARENT_RULE_OBJECT_ID                =>l_rule_object_instance_rec.parent_rule_object_id,
237 		X_ORG_ID                               =>l_rule_object_instance_rec.org_id
238     );
239     --Make sure the Rule Object Instance gets created and then select the Rule Object Id
240     --of the new Rule Object Instance.
241 
242     BEGIN
243 	    SELECT RULE_OBJECT_ID INTO X_RULE_OBJECT_ID
244 	    FROM FUN_RULE_OBJECTS_B WHERE RULE_OBJECT_NAME = p_rule_object_name
245 	    AND  APPLICATION_ID = p_application_id
246             AND ( (INSTANCE_LABEL IS NULL AND p_instance_label IS NULL) OR
247  	          (INSTANCE_LABEL IS NOT NULL AND p_instance_label IS NOT NULL AND INSTANCE_LABEL = p_instance_label))
248             AND ( (ORG_ID IS NULL AND p_org_id IS NULL) OR
249    	          ( ORG_ID IS NOT NULL AND p_org_id IS NOT NULL AND ORG_ID = p_org_id))
250             AND PARENT_RULE_OBJECT_ID IS NOT NULL;
251 
252     EXCEPTION
253         WHEN NO_DATA_FOUND THEN
254 	  fnd_message.set_name('FUN', 'FUN_RULE_API_INVALID_ROB');
255 	  fnd_msg_pub.add;
256 	  x_return_status := fnd_api.g_ret_sts_error;
257      END;
258 
259     /**************************************************************************************
260       Since the newly created Rule Object Instance will have the same criteria parameters
261       in FUN_RULE_CRIT_PARAMS_B/_TL table, we need to
262       Create the Criteria Parameters for the Rule Object Instance with Rule_Object_id
263       as X_RULE_OBJECT_ID.
264     **************************************************************************************/
265     FUN_RULE_CRIT_PARAMS_PUB.CREATE_DUP_RULE_CRIT_PARAMS(
266 	    p_init_msg_list           => FND_API.G_FALSE,
267 	    p_from_rule_object_id     => l_orig_rule_object_rec.rule_object_id,
268 	    p_to_rule_object_id       => X_RULE_OBJECT_ID,
269 	    x_return_status           => x_return_status,
270 	    x_msg_count               => x_msg_count,
271 	    x_msg_data                => x_msg_data);
272 
273     IF x_return_status = FND_API.G_RET_STS_ERROR THEN
274 	RAISE FND_API.G_EXC_ERROR;
275     ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
276 	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
277     END IF;
278 
279 
280 END do_create_rule_object_instance;
281 
282 
283 /*===========================================================================+
284  | PROCEDURE
285  |              do_update_rule_object
286  |
287  | DESCRIPTION
288  |              Updates user customizable objects
289  |
290  | SCOPE - PRIVATE
291  |
292  | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
293  |
294  | ARGUMENTS  : IN:
295  |              OUT:
296  |          IN/ OUT:
297  |                    p_rule_object_rec
298  |                    p_object_version_number
299  |                    x_return_status
300  |
301  | RETURNS    : NONE
302  |
303  | NOTES
304  |
305  | MODIFICATION HISTORY
306  |
307  +===========================================================================*/
308 
309 PROCEDURE do_update_rule_object(
310     p_update_instance           IN VARCHAR2 DEFAULT 'N',
311     p_rule_object_rec           IN OUT    NOCOPY RULE_OBJECTS_REC_TYPE,
312     p_object_version_number     IN OUT NOCOPY  NUMBER,
313     x_return_status             IN OUT NOCOPY  VARCHAR2
314 ) IS
315 
316     l_object_version_number             NUMBER;
317     l_rowid                             ROWID;
318 BEGIN
319 
320     -- check whether record has been updated by another user. If not, lock it.
321     BEGIN
322         SELECT OBJECT_VERSION_NUMBER,
323                ROWID
324         INTO   l_object_version_number,
325                l_rowid
326         FROM   FUN_RULE_OBJECTS_B
327         WHERE  RULE_OBJECT_ID = p_rule_object_rec.rule_object_id
328         FOR UPDATE OF rule_object_id NOWAIT;
329 
330 
331         IF NOT ((p_object_version_number is null and l_object_version_number is null)
332                 OR (p_object_version_number = l_object_version_number))
333         THEN
334 
335             FND_MESSAGE.SET_NAME('FUN', 'FUN_RULE_API_RECORD_CHANGED');
336             FND_MESSAGE.SET_TOKEN('TABLE', 'FUN_RULE_OBJECTS');
337             FND_MSG_PUB.ADD;
338             RAISE FND_API.G_EXC_ERROR;
339         END IF;
340 
341         p_object_version_number := nvl(l_object_version_number, 1) + 1;
342 
343     EXCEPTION WHEN NO_DATA_FOUND THEN
344         FND_MESSAGE.SET_NAME('FUN', 'FUN_RULE_API_NO_RECORD');
345         FND_MESSAGE.SET_TOKEN('RECORD', 'FUN_RULE_OBJECTS');
346         FND_MESSAGE.SET_TOKEN('VALUE', 'rule_object_id'||to_char(p_rule_object_rec.rule_object_id));
347         FND_MSG_PUB.ADD;
348         RAISE FND_API.G_EXC_ERROR;
349     END;
350 
351     -- call for validations.
352     IF(    p_update_instance   = 'Y' ) THEN
353       -- call for validations of Rule Object Instance.
354       FUN_RULE_VALIDATE_PKG.validate_rule_object_instance(
355            'U',
356             p_rule_object_rec,
357             l_rowid,
358             x_return_status
359        );
360     ELSE
361       -- call for validations of Rule Object Record
362       FUN_RULE_VALIDATE_PKG.validate_rule_objects(
363             'U',
364              p_rule_object_rec,
365              l_rowid,
366              x_return_status
367       );
368     END IF;
369 
370     IF x_return_status = fnd_api.g_ret_sts_error THEN
371       RAISE fnd_api.g_exc_error;
372     END IF;
373     -- call to table-handler.
374     FUN_RULE_OBJECTS_PKG.Update_Row (
375         X_RULE_OBJECT_ID                       =>p_rule_object_rec.rule_object_id,
376         X_APPLICATION_ID                       =>p_rule_object_rec.application_id,
377         X_RULE_OBJECT_NAME                     =>p_rule_object_rec.rule_object_name,
378         X_RESULT_TYPE                          =>p_rule_object_rec.result_type,
379         X_REQUIRED_FLAG                        =>p_rule_object_rec.required_flag,
380         X_USE_DEFAULT_VALUE_FLAG               =>p_rule_object_rec.use_default_value_flag,
381         X_DEFAULT_APPLICATION_ID               =>p_rule_object_rec.default_application_id,
382         X_DEFAULT_VALUE                        =>p_rule_object_rec.default_value,
383         X_FLEX_VALUE_SET_ID                    =>p_rule_object_rec.flex_value_set_id,
384         X_FLEXFIELD_NAME                       =>p_rule_object_rec.flexfield_name,
385         X_FLEXFIELD_APP_SHORT_NAME             =>p_rule_object_rec.flexfield_app_short_name,
386 	X_MULTI_RULE_RESULT_FLAG               =>p_rule_object_rec.multi_rule_result_flag,
387         X_OBJECT_VERSION_NUMBER                =>p_object_version_number,
388         X_CREATED_BY_MODULE                    =>p_rule_object_rec.created_by_module,
389         X_USER_RULE_OBJECT_NAME                =>p_rule_object_rec.user_rule_object_name,
390         X_DESCRIPTION                          =>p_rule_object_rec.description,
391 	X_USE_INSTANCE_FLAG                    =>p_rule_object_rec.use_instance_flag,
392 	X_INSTANCE_LABEL                       =>p_rule_object_rec.instance_label,
393 	X_PARENT_RULE_OBJECT_ID                =>p_rule_object_rec.parent_rule_object_id,
394         X_ORG_ID                               =>p_rule_object_rec.org_id
395     );
396 END;
397 
398 
399 /**
400  * PROCEDURE create_rule_object
401  *
402  * DESCRIPTION
403  *     Creates User customizable objects.
404  *
405  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
406  *
407  *
408  * ARGUMENTS
409  *   IN:
410  *     p_init_msg_list                Initialize message stack if it is set to
411  *                                    FND_API.G_TRUE. Default is FND_API.G_FALSE.
412  *     p_rule_object_rec             User customizable object record.
413  *   IN/OUT:
414  *   OUT:
415  *     x_return_status                Return status after the call. The status can
416  *                                    be FND_API.G_RET_STS_SUCCESS (success),
417  *                                    FND_API.G_RET_STS_ERROR (error),
418  *                                    FND_API.G_RET_STS_UNEXP_ERROR (unexpected error).
419  *     x_msg_count                    Number of messages in message stack.
420  *     x_msg_data                     Message text if x_msg_count is 1.
421  *
422  * NOTES
423  *
424  * MODIFICATION HISTORY
425  *
426  *   10-Sep-2004    Amulya Mishra       Created.
427  *
428  */
429 
430 PROCEDURE create_rule_object(
431     p_init_msg_list          IN        VARCHAR2 := FND_API.G_FALSE,
432     p_rule_object_rec        IN        RULE_OBJECTS_REC_TYPE,
433     x_rule_object_id          OUT NOCOPY       NUMBER,
434     x_return_status           OUT NOCOPY       VARCHAR2,
435     x_msg_count               OUT NOCOPY       NUMBER,
436     x_msg_data                OUT NOCOPY       VARCHAR2
437 ) IS
438 
439     l_rule_object_rec       RULE_OBJECTS_REC_TYPE:= p_rule_object_rec;
440 
441 BEGIN
442 
443     -- standard start of API savepoint
444     SAVEPOINT create_rule_objects;
445 
446     -- initialize message list if p_init_msg_list is set to TRUE.
447     IF FND_API.to_Boolean(p_init_msg_list) THEN
448         FND_MSG_PUB.initialize;
449     END IF;
450 
451     -- initialize API return status to success.
452     x_return_status := FND_API.G_RET_STS_SUCCESS;
453 
454 
455     -- call to business logic.
456     do_create_rule_object(
457                              l_rule_object_rec,
458                              l_rule_object_rec.rule_object_id,
459                              x_return_status);
460 
461     -- standard call to get message count and if count is 1, get message info.
462     FND_MSG_PUB.Count_And_Get(
463                 p_encoded => FND_API.G_FALSE,
464                 p_count => x_msg_count,
465                 p_data  => x_msg_data);
466 
467 EXCEPTION
468     WHEN FND_API.G_EXC_ERROR THEN
469         ROLLBACK TO create_rule_objects;
470         x_return_status := FND_API.G_RET_STS_ERROR;
471         FND_MSG_PUB.Count_And_Get(
472                                 p_encoded => FND_API.G_FALSE,
473                                 p_count => x_msg_count,
474                                 p_data  => x_msg_data);
475         x_msg_data := FND_MSG_PUB.Get_Detail;
476 
477     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
478         ROLLBACK TO create_rule_objects;
479         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
480         FND_MSG_PUB.Count_And_Get(
481                                 p_encoded => FND_API.G_FALSE,
482                                 p_count => x_msg_count,
483                                 p_data  => x_msg_data);
484         x_msg_data := FND_MSG_PUB.Get_Detail;
485     WHEN OTHERS THEN
486         ROLLBACK TO create_rule_objects;
487         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
488         FND_MESSAGE.SET_NAME('FUN', 'FUN_RULE_API_OTHERS_EXCEP');
489         FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
490         FND_MSG_PUB.ADD;
491         FND_MSG_PUB.Count_And_Get(
492                                 p_encoded => FND_API.G_FALSE,
493                                 p_count => x_msg_count,
494                                 p_data  => x_msg_data);
495         x_msg_data := FND_MSG_PUB.Get_Detail;
496 END create_rule_object;
497 
498 /**
499  * Use this routine to create a rule object instance to be used for rule partitioning.
500  * With this API you can create a record in the FUN_RULE_OBJECTS_B ,
501  * table provided the flag USE_INSTANCE_FLAG is set to 'Y'. This API will return
502  * the rule_object_id of the newly created rule object instance record.
503  *
504  *  p_init_msg_list    Initialize message stack if it is set to FND_API.G_TRUE. Default is FND_API.G_FALSE.
505  *  p_application_id   Application identifier
506  *  p_rule_object_name Name of Rule Object
507  *  p_instance_label   Name of the Instance.
508  *  p_rule_object_id   Internal identifier for the Rule Object
509  *  x_return_status    Return status after the call.
510  *  x_msg_count        Number of messages in message stack.
511  *  x_msg_data         Message text if x_msg_count is 1.
512  *
513  *  27-Dec-2005    Amulya Mishra     Created
514  */
515 
516 PROCEDURE create_rule_object_instance(
517     p_init_msg_list           		 IN      VARCHAR2 := FND_API.G_FALSE,
518     p_application_id                     IN      NUMBER,
519     p_rule_object_name     		 IN      VARCHAR2,
520     p_instance_label                     IN      VARCHAR2,
521     p_org_id                             IN      NUMBER,
522     x_rule_object_id                     OUT NOCOPY    NUMBER,
523     x_return_status           		 OUT NOCOPY     VARCHAR2,
524     x_msg_count               		 OUT NOCOPY     NUMBER,
525     x_msg_data                		 OUT NOCOPY     VARCHAR2
526 )
527 IS
528 
529 BEGIN
530     -- standard start of API savepoint
531     SAVEPOINT create_rule_object_instance;
532 
533     -- initialize message list if p_init_msg_list is set to TRUE.
534     IF FND_API.to_Boolean(p_init_msg_list) THEN
535         FND_MSG_PUB.initialize;
536     END IF;
537 
538     -- initialize API return status to success.
539     x_return_status := FND_API.G_RET_STS_SUCCESS;
540 
541     --Dont create the Rule Object Intance, if it already exists. Simply return to
542     --calling procedure.
543 
544     IF (rule_object_instance_exists(p_application_id , p_rule_object_name , p_instance_label , p_org_id)) THEN
545      BEGIN
546       --This should infact never raise exception if the code flow has reached here.
547 
548       SELECT RULE_OBJECT_ID INTO X_RULE_OBJECT_ID
549       FROM FUN_RULE_OBJECTS_B
550       WHERE RULE_OBJECT_NAME = p_rule_object_name
551       AND   APPLICATION_ID   = p_application_id
552       AND ( (INSTANCE_LABEL IS NULL  AND p_instance_label IS NULL) OR
553 	  (INSTANCE_LABEL IS NOT NULL AND p_instance_label IS NOT NULL AND INSTANCE_LABEL = p_instance_label))
554       AND ( (ORG_ID IS NULL AND p_org_id IS NULL) OR
555 	  ( ORG_ID IS NOT NULL AND p_org_id IS NOT NULL AND ORG_ID = p_org_id))
556       AND PARENT_RULE_OBJECT_ID IS NOT NULL;
557 
558       RETURN;
559 
560      EXCEPTION
561       WHEN NO_DATA_FOUND THEN
562         RETURN;
563 
564      END;
565     -- call to business logic.
566     ELSE
567        do_create_rule_object_instance(
568                     p_application_id,
569                     p_rule_object_name,
570                     p_instance_label,
571                     p_org_id,
572                     x_rule_object_id,
573                     x_return_status);
574     END IF;
575     -- standard call to get message count and if count is 1, get message info.
576     FND_MSG_PUB.Count_And_Get(
577                 p_encoded => FND_API.G_FALSE,
578                 p_count => x_msg_count,
579                 p_data  => x_msg_data);
580 EXCEPTION
581     WHEN FND_API.G_EXC_ERROR THEN
582         ROLLBACK TO create_rule_object_instance;
583         x_return_status := FND_API.G_RET_STS_ERROR;
584         FND_MSG_PUB.Count_And_Get(
585                                 p_encoded => FND_API.G_FALSE,
586                                 p_count => x_msg_count,
587                                 p_data  => x_msg_data);
588         x_msg_data := FND_MSG_PUB.Get_Detail;
589 
590     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
591         ROLLBACK TO create_rule_object_instance;
592         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
593         FND_MSG_PUB.Count_And_Get(
594                                 p_encoded => FND_API.G_FALSE,
595                                 p_count => x_msg_count,
596                                 p_data  => x_msg_data);
597         x_msg_data := FND_MSG_PUB.Get_Detail;
598     WHEN OTHERS THEN
599         ROLLBACK TO create_rule_object_instance;
600         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
601         FND_MESSAGE.SET_NAME('FUN', 'FUN_RULE_API_OTHERS_EXCEP');
602         FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
603         FND_MSG_PUB.ADD;
604         FND_MSG_PUB.Count_And_Get(
605                                 p_encoded => FND_API.G_FALSE,
606                                 p_count => x_msg_count,
607                                 p_data  => x_msg_data);
608         x_msg_data := FND_MSG_PUB.Get_Detail;
609 
610 END create_rule_object_instance;
611 
612 /**
613  * PROCEDURE update_rule_object
614  *
615  * DESCRIPTION
616  *     Updates User customizable objects
617  *
618  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
619  *
620  * ARGUMENTS
621  *   IN:
622  *     p_init_msg_list                Initialize message stack if it is set to
623  *                                    FND_API.G_TRUE. Default is FND_API.G_FALSE.
624  *     p_rules_object_rec             User Customizable Object record.
625  *   IN/OUT:
626  *     p_object_version_number        Used for locking the being updated record.
627  *   OUT:
628  *     x_return_status                Return status after the call. The status can
629  *                                    be FND_API.G_RET_STS_SUCCESS (success),
630  *                                    FND_API.G_RET_STS_ERROR (error),
631  *                                    FND_API.G_RET_STS_UNEXP_ERROR (unexpected error).
632  *     x_msg_count                    Number of messages in message stack.
633  *     x_msg_data                     Message text if x_msg_count is 1.
634  *
635  * NOTES
636  *
637  * MODIFICATION HISTORY
638  *
639  *   10-Sep-2004    Amulya Mishra     Created.
640  *
641  */
642 
643 PROCEDURE update_rule_object (
644     p_init_msg_list             IN     VARCHAR2 := FND_API.G_FALSE,
645     p_rule_object_rec           IN     RULE_OBJECTS_REC_TYPE,
646     p_object_version_number     IN OUT NOCOPY NUMBER,
647     x_return_status             OUT NOCOPY    VARCHAR2,
648     x_msg_count                 OUT NOCOPY    NUMBER,
649     x_msg_data                  OUT NOCOPY    VARCHAR2
650 ) IS
651 
652     l_rule_object_rec                    RULE_OBJECTS_REC_TYPE := p_rule_object_rec;
653     l_old_rule_object_rec                RULE_OBJECTS_REC_TYPE;
654     l_rule_object_id                     number;
655 
656     CURSOR FUN_RULE_OBJECTS_CUR(p_rule_object_id NUMBER) IS
657     SELECT
658       B.RULE_OBJECT_ID,
659       B.APPLICATION_ID,
660       B.RULE_OBJECT_NAME,
661       B.RESULT_TYPE,
662       B.REQUIRED_FLAG,
663       B.USE_DEFAULT_VALUE_FLAG,
664       ATTR.DEFAULT_APPLICATION_ID,
665       ATTR.DEFAULT_VALUE,
666       B.FLEX_VALUE_SET_ID,
667       B.FLEXFIELD_NAME,
668       B.FLEXFIELD_APP_SHORT_NAME,
669       B.MULTI_RULE_RESULT_FLAG,
670       B.CREATED_BY_MODULE,
671       B.OBJECT_VERSION_NUMBER,
672       TL.USER_RULE_OBJECT_NAME,
673       TL.DESCRIPTION,
674       B.USE_INSTANCE_FLAG,
675       B.INSTANCE_LABEL,
676       B.PARENT_RULE_OBJECT_ID,
677       B.ORG_ID
678     FROM FUN_RULE_OBJECTS_B B, FUN_RULE_OBJECTS_TL TL, FUN_RULE_OBJ_ATTRIBUTES ATTR
679     WHERE B.PARENT_RULE_OBJECT_ID = p_rule_object_id
680     AND   B.RULE_OBJECT_ID = ATTR.RULE_OBJECT_ID
681     AND   B.RULE_OBJECT_ID = TL.RULE_OBJECT_ID
682     AND   TL.LANGUAGE = 'US';
683 
684 BEGIN
685     -- standard start of API savepoint
686     SAVEPOINT update_rule_objects;
687 
688     -- initialize message list if p_init_msg_list is set to TRUE.
689     IF FND_API.to_Boolean(p_init_msg_list) THEN
690         FND_MSG_PUB.initialize;
691     END IF;
692 
693     -- initialize API return status to success.
694     x_return_status := FND_API.G_RET_STS_SUCCESS;
695 
696     -- Get old records. Will be used by business event system.
697     get_rule_object_rec (
698         p_rule_object_id                    => l_rule_object_rec.rule_object_id,
699         x_rule_object_rec                   => l_old_rule_object_rec,
700         x_return_status                     => x_return_status,
701         x_msg_count                         => x_msg_count,
702         x_msg_data                          => x_msg_data );
703 
704     IF x_return_status = FND_API.G_RET_STS_ERROR THEN
705         RAISE FND_API.G_EXC_ERROR;
706     ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
707         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
708     END IF;
709 
710 
711     --Make sure to make the fields related to Rule Object Instance as NULL.
712     l_rule_object_rec.instance_label := null;
713     l_rule_object_rec.parent_rule_object_id := null;
714     l_rule_object_rec.org_id := null;
715 
716 
717     -- call to business logic.
718     do_update_rule_object(
719                              'N',  --Update for Rule Object Instance Parameter
720                              l_rule_object_rec,
721                              p_object_version_number,
722                              x_return_status);
723 
724    IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
725 
726        -- standard call to get message count and if count is 1, get message info.
727        FND_MSG_PUB.Count_And_Get(
728                 p_encoded => FND_API.G_FALSE,
729                 p_count => x_msg_count,
730                 p_data  => x_msg_data);
731    END IF;
732 
733 
734    --If USE_INSTANCE_FLAG is Y, then make the update in all instances.
735    --Loop through the cursor and update the Rule Object tables for each instances.
736 
737    IF( UPPER(l_rule_object_rec.use_instance_flag) = 'Y') THEN
738       FOR C_REC IN FUN_RULE_OBJECTS_CUR(l_rule_object_rec.rule_object_id) LOOP
739 
740 
741 	    -- Get old records. Will be used by business event system.
742 
743 	    get_rule_object_rec (
744 		p_rule_object_id                    => C_REC.rule_object_id,
745 		x_rule_object_rec                   => l_old_rule_object_rec,
746 		x_return_status                     => x_return_status,
747 		x_msg_count                         => x_msg_count,
748 		x_msg_data                          => x_msg_data );
749 
750 	    IF x_return_status = FND_API.G_RET_STS_ERROR THEN
751 		RAISE FND_API.G_EXC_ERROR;
752 	    ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
753 		RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
754 	    END IF;
755 
756 	    -- initialize API return status to success.
757 	    x_return_status := FND_API.G_RET_STS_SUCCESS;
758 
759            --Only propagate the changes of parent rule object record to the instance records.
760 
761 	   l_rule_object_rec.rule_object_id	        := c_rec.rule_object_id;
762            l_rule_object_rec.use_instance_flag	        := c_rec.use_instance_flag;
763            l_rule_object_rec.instance_label	        := c_rec.instance_label;
764 
765            --parent_rule_object_id should not be NULL for a Rule Object Instance.
766 	   --This validation is done in do_update_rule_object().
767 
768            l_rule_object_rec.parent_rule_object_id	:= C_REC.parent_rule_object_id;
769            l_rule_object_rec.org_id 	                := C_REC.org_id;
770 
771 
772 	    -- call to business logic.
773 	    do_update_rule_object(
774                                     'Y',  --Update for Rule Object Instance Parameter
775 				     l_rule_object_rec,
776 				     C_REC.OBJECT_VERSION_NUMBER,
777 				     x_return_status);
778 
779 	   IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
780 
781 	       -- standard call to get message count and if count is 1, get message info.
782 	       FND_MSG_PUB.Count_And_Get(
783 			p_encoded => FND_API.G_FALSE,
784 			p_count => x_msg_count,
785 			p_data  => x_msg_data);
786 	   END IF;
787 
788    END LOOP;
789  END IF;
790 
791 
792 EXCEPTION
793     WHEN FND_API.G_EXC_ERROR THEN
794         ROLLBACK TO update_rule_objects;
795         x_return_status := FND_API.G_RET_STS_ERROR;
796         FND_MSG_PUB.Count_And_Get(
797                                 p_encoded => FND_API.G_FALSE,
798                                 p_count => x_msg_count,
799                                 p_data  => x_msg_data);
800 
801     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
802         ROLLBACK TO update_rule_objects;
803         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
804         FND_MSG_PUB.Count_And_Get(
805                                 p_encoded => FND_API.G_FALSE,
806                                 p_count => x_msg_count,
807                                 p_data  => x_msg_data);
808 
809     WHEN OTHERS THEN
810         ROLLBACK TO update_rule_objects;
811         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
812         FND_MESSAGE.SET_NAME('FUN', 'FUN_RULE_API_OTHERS_EXCEP');
813         FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
814         FND_MSG_PUB.ADD;
815         FND_MSG_PUB.Count_And_Get(
816                                 p_encoded => FND_API.G_FALSE,
817                                 p_count => x_msg_count,
818                                 p_data  => x_msg_data);
819 END update_rule_object;
820 
821 
822 /**
823  * PROCEDURE get_rule_object_rec
824  *
825  * DESCRIPTION
826  *     Gets user customizable objects record.
827  *
828  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
829  *     FUN_RULES_PKG.Select_Row
830  *
831  * ARGUMENTS
832  *   IN:
833  *     p_init_msg_list                Initialize message stack if it is set to
834  *                                    FND_API.G_TRUE. Default is FND_API.G_FALSE.
835  *     p_rule_objects                 User customizable objects name.
836  *   IN/OUT:
837  *   OUT:
838  *     x_rule_object_rec              Returned class category record.
839  *     x_return_status                Return status after the call. The status can
840  *                                    be FND_API.G_RET_STS_SUCCESS (success),
841  *                                    FND_API.G_RET_STS_ERROR (error),
842  *                                    FND_API.G_RET_STS_UNEXP_ERROR (unexpected error).
843  *     x_msg_count                    Number of messages in message stack.
844  *     x_msg_data                     Message text if x_msg_count is 1.
845  *
846  * NOTES
847  *
848  * MODIFICATION HISTORY
849  *
850  *   10-Sep-2004    Amulya Mishra         Created.
851  *
852  */
853 
854 PROCEDURE get_rule_object_rec (
855     p_init_msg_list                         IN     VARCHAR2 := FND_API.G_FALSE,
856     p_rule_object_name                      IN     VARCHAR2,
857     p_application_id                        IN     NUMBER,
858     p_instance_label                        IN     VARCHAR2,
859     p_org_id                                IN     NUMBER,
860     x_rule_object_rec                       OUT    NOCOPY RULE_OBJECTS_REC_TYPE,
861     x_return_status                         OUT NOCOPY    VARCHAR2,
862     x_msg_count                             OUT NOCOPY    NUMBER,
863     x_msg_data                              OUT NOCOPY    VARCHAR2
864 ) IS
865 
866 BEGIN
867 
868     --Initialize message list if p_init_msg_list is set to TRUE.
869     IF FND_API.to_Boolean(p_init_msg_list) THEN
870         FND_MSG_PUB.initialize;
871     END IF;
872 
873     --Initialize API return status to success.
874     x_return_status := FND_API.G_RET_STS_SUCCESS;
875 
876     --Check whether primary key has been passed in.
877     IF p_rule_object_name IS NULL OR
878        p_rule_object_name = FND_API.G_MISS_CHAR THEN
879         FND_MESSAGE.SET_NAME( 'FUN', 'FUN_RULE_API_MISSING_COLUMN' );
880         FND_MESSAGE.SET_TOKEN( 'COLUMN', 'rule_object_name' );
881         FND_MSG_PUB.ADD;
882         RAISE FND_API.G_EXC_ERROR;
883     END IF;
884 
885 
886     x_rule_object_rec.rule_object_name := p_rule_object_name;
887     x_rule_object_rec.application_id := p_application_id;
888     x_rule_object_rec.instance_label := p_instance_label;
889     x_rule_object_rec.org_id := p_org_id;
890 
891     FUN_RULE_OBJECTS_PKG.Select_Row (
892         X_RULE_OBJECT_NAME                     =>x_rule_object_rec.rule_object_name,
893 	X_RULE_OBJECT_ID                       =>x_rule_object_rec.rule_object_id,
894 	X_APPLICATION_ID                       =>x_rule_object_rec.application_id,
895 	X_USER_RULE_OBJECT_NAME                =>x_rule_object_rec.user_rule_object_name,
896 	X_DESCRIPTION                          =>x_rule_object_rec.description,
897 	X_RESULT_TYPE                          =>x_rule_object_rec.result_type,
898 	X_REQUIRED_FLAG                        =>x_rule_object_rec.required_flag,
899 	X_USE_DEFAULT_VALUE_FLAG               =>x_rule_object_rec.use_default_value_flag,
900 	X_DEFAULT_APPLICATION_ID               =>x_rule_object_rec.default_application_id,
901 	X_DEFAULT_VALUE                        =>x_rule_object_rec.default_value,
902         X_FLEX_VALUE_SET_ID                    =>x_rule_object_rec.flex_value_set_id,
903         X_FLEXFIELD_NAME                       =>x_rule_object_rec.flexfield_name,
904         X_FLEXFIELD_APP_SHORT_NAME             =>x_rule_object_rec.flexfield_app_short_name,
905 	X_MULTI_RULE_RESULT_FLAG               =>x_rule_object_rec.multi_rule_result_flag,
906 	X_CREATED_BY_MODULE                    =>x_rule_object_rec.created_by_module,
907 	X_USE_INSTANCE_FLAG                    =>x_rule_object_rec.use_instance_flag,
908 	X_INSTANCE_LABEL                       =>x_rule_object_rec.instance_label,
909 	X_PARENT_RULE_OBJECT_ID                =>x_rule_object_rec.parent_rule_object_id,
910         X_ORG_ID                               =>x_rule_object_rec.org_id
911     );
912 
913 
914     --Standard call to get message count and if count is 1, get message info.
915     FND_MSG_PUB.Count_And_Get(
916         p_encoded => FND_API.G_FALSE,
917         p_count => x_msg_count,
918         p_data  => x_msg_data );
919 
920 EXCEPTION
921     WHEN FND_API.G_EXC_ERROR THEN
922         x_return_status := FND_API.G_RET_STS_ERROR;
923 
924         FND_MSG_PUB.Count_And_Get(
925             p_encoded => FND_API.G_FALSE,
926             p_count => x_msg_count,
927             p_data  => x_msg_data );
928 
929     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
930         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
931 
932         FND_MSG_PUB.Count_And_Get(
933             p_encoded => FND_API.G_FALSE,
934             p_count => x_msg_count,
935             p_data  => x_msg_data );
936 
937     WHEN OTHERS THEN
938         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
939 
940         FND_MESSAGE.SET_NAME( 'FUN', 'FUN_RULE_API_OTHERS_EXCEP' );
941         FND_MESSAGE.SET_TOKEN( 'ERROR' ,SQLERRM );
942         FND_MSG_PUB.ADD;
943 
944         FND_MSG_PUB.Count_And_Get(
945             p_encoded => FND_API.G_FALSE,
946             p_count => x_msg_count,
947             p_data  => x_msg_data );
948 
949 END get_rule_object_rec;
950 
951 /**
952  * PROCEDURE get_rule_object_rec
953  *
954  * DESCRIPTION
955  *     Gets Rule objects record for a passed Rule_Object_id
956  *
957  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
958  *     FUN_RULES_PKG.Select_Row
959  *
960  * ARGUMENTS
961  *   IN:
962  *     p_init_msg_list                Initialize message stack if it is set to
963  *                                    FND_API.G_TRUE. Default is FND_API.G_FALSE.
964  *     p_rule_objects                 User customizable objects name.
965  *   IN/OUT:
966  *   OUT:
967  *     x_rule_object_rec              Returned class category record.
968  *     x_return_status                Return status after the call. The status can
969  *                                    be FND_API.G_RET_STS_SUCCESS (success),
970  *                                    FND_API.G_RET_STS_ERROR (error),
971  *                                    FND_API.G_RET_STS_UNEXP_ERROR (unexpected error).
972  *     x_msg_count                    Number of messages in message stack.
973  *     x_msg_data                     Message text if x_msg_count is 1.
974  *
975  * NOTES
976  *
977  * MODIFICATION HISTORY
978  *
979  *   10-Sep-2004    Amulya Mishra         Created.
980  *
981  */
982 
983 PROCEDURE get_rule_object_rec (
984     p_init_msg_list                         IN     VARCHAR2 := FND_API.G_FALSE,
985     p_rule_object_id                        IN     NUMBER,
986     x_rule_object_rec                       OUT    NOCOPY RULE_OBJECTS_REC_TYPE,
987     x_return_status                         OUT NOCOPY    VARCHAR2,
988     x_msg_count                             OUT NOCOPY    NUMBER,
989     x_msg_data                              OUT NOCOPY    VARCHAR2
990 ) IS
991 
992 BEGIN
993 
994     --Initialize message list if p_init_msg_list is set to TRUE.
995     IF FND_API.to_Boolean(p_init_msg_list) THEN
996         FND_MSG_PUB.initialize;
997     END IF;
998 
999     --Initialize API return status to success.
1000     x_return_status := FND_API.G_RET_STS_SUCCESS;
1001 
1002     --Check whether primary key has been passed in.
1003     IF p_rule_object_id IS NULL OR
1004        p_rule_object_id = FND_API.G_MISS_NUM THEN
1005         FND_MESSAGE.SET_NAME( 'FUN', 'FUN_RULE_API_MISSING_COLUMN' );
1006         FND_MESSAGE.SET_TOKEN( 'COLUMN', 'rule_object_id' );
1007         FND_MSG_PUB.ADD;
1008         RAISE FND_API.G_EXC_ERROR;
1009     END IF;
1010 
1011 
1012     x_rule_object_rec.rule_object_id := p_rule_object_id;
1013 
1014     FUN_RULE_OBJECTS_PKG.Select_Row_Rob_Id (
1015         X_RULE_OBJECT_NAME                     =>x_rule_object_rec.rule_object_name,
1016 	X_RULE_OBJECT_ID                       =>x_rule_object_rec.rule_object_id,
1017 	X_APPLICATION_ID                       =>x_rule_object_rec.application_id,
1018 	X_USER_RULE_OBJECT_NAME                =>x_rule_object_rec.user_rule_object_name,
1019 	X_DESCRIPTION                          =>x_rule_object_rec.description,
1020 	X_RESULT_TYPE                          =>x_rule_object_rec.result_type,
1021 	X_REQUIRED_FLAG                        =>x_rule_object_rec.required_flag,
1022 	X_USE_DEFAULT_VALUE_FLAG               =>x_rule_object_rec.use_default_value_flag,
1023 	X_DEFAULT_APPLICATION_ID               =>x_rule_object_rec.default_application_id,
1024 	X_DEFAULT_VALUE                        =>x_rule_object_rec.default_value,
1025         X_FLEX_VALUE_SET_ID                    =>x_rule_object_rec.flex_value_set_id,
1026         X_FLEXFIELD_NAME                       =>x_rule_object_rec.flexfield_name,
1027         X_FLEXFIELD_APP_SHORT_NAME             =>x_rule_object_rec.flexfield_app_short_name,
1028 	X_MULTI_RULE_RESULT_FLAG               =>x_rule_object_rec.multi_rule_result_flag,
1029 	X_CREATED_BY_MODULE                    =>x_rule_object_rec.created_by_module,
1030 	X_USE_INSTANCE_FLAG                    =>x_rule_object_rec.use_instance_flag,
1031 	X_INSTANCE_LABEL                       =>x_rule_object_rec.instance_label,
1032 	X_PARENT_RULE_OBJECT_ID                =>x_rule_object_rec.parent_rule_object_id,
1033         X_ORG_ID                               =>x_rule_object_rec.org_id
1034     );
1035 
1036 
1037     --Standard call to get message count and if count is 1, get message info.
1038     FND_MSG_PUB.Count_And_Get(
1039         p_encoded => FND_API.G_FALSE,
1040         p_count => x_msg_count,
1041         p_data  => x_msg_data );
1042 
1043 EXCEPTION
1044     WHEN FND_API.G_EXC_ERROR THEN
1045         x_return_status := FND_API.G_RET_STS_ERROR;
1046 
1047         FND_MSG_PUB.Count_And_Get(
1048             p_encoded => FND_API.G_FALSE,
1049             p_count => x_msg_count,
1050             p_data  => x_msg_data );
1051 
1052     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1053         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1054 
1055         FND_MSG_PUB.Count_And_Get(
1056             p_encoded => FND_API.G_FALSE,
1057             p_count => x_msg_count,
1058             p_data  => x_msg_data );
1059 
1060     WHEN OTHERS THEN
1061         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1062 
1063         FND_MESSAGE.SET_NAME( 'FUN', 'FUN_RULE_API_OTHERS_EXCEP' );
1064         FND_MESSAGE.SET_TOKEN( 'ERROR' ,SQLERRM );
1065         FND_MSG_PUB.ADD;
1066 
1067         FND_MSG_PUB.Count_And_Get(
1068             p_encoded => FND_API.G_FALSE,
1069             p_count => x_msg_count,
1070             p_data  => x_msg_data );
1071 
1072 END get_rule_object_rec;
1073 
1074 /**
1075  * PROCEDURE delete_rule_object
1076  *
1077  * DESCRIPTION
1078  *     Deletes User customizable objects.
1079  *
1080  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1081  *
1082  *
1083  * ARGUMENTS
1084  *   IN:
1085  *     p_init_msg_list                Initialize message stack if it is set to
1086  *                                    FND_API.G_TRUE. Default is FND_API.G_FALSE.
1087  *     p_rule_object_name             User customizable object Name.
1088  *     p_application_id               Application Id
1089  *   IN/OUT:
1090  *   OUT:
1091  *     x_return_status                Return status after the call. The status can
1092  *                                    be FND_API.G_RET_STS_SUCCESS (success),
1093  *                                    FND_API.G_RET_STS_ERROR (error),
1094  *                                    FND_API.G_RET_STS_UNEXP_ERROR (unexpected error).
1095  *     x_msg_count                    Number of messages in message stack.
1096  *     x_msg_data                     Message text if x_msg_count is 1.
1097  *
1098  * NOTES
1099  *
1100  * MODIFICATION HISTORY
1101  *
1102  *   10-Sep-2004    Amulya Mishra       Created.
1103  *
1104  */
1105 
1106 PROCEDURE delete_rule_object(
1107     p_init_msg_list           IN        VARCHAR2 := FND_API.G_FALSE,
1108     p_rule_object_name        IN        VARCHAR2,
1109     p_application_id	      IN        NUMBER,
1110     x_return_status           OUT NOCOPY       VARCHAR2,
1111     x_msg_count               OUT NOCOPY       NUMBER,
1112     x_msg_data                OUT NOCOPY       VARCHAR2
1113 ) IS
1114 
1115     l_rule_object_id                     number;
1116 
1117     CURSOR FUN_RULE_OBJECTS_CUR(p_rule_object_id NUMBER) IS
1118     SELECT
1119       B.APPLICATION_ID,
1120       B.RULE_OBJECT_NAME,
1121       B.INSTANCE_LABEL,
1122       B.ORG_ID
1123     FROM FUN_RULE_OBJECTS_B B, FUN_RULE_OBJECTS_TL TL, FUN_RULE_OBJ_ATTRIBUTES ATTR
1124     WHERE B.PARENT_RULE_OBJECT_ID = p_rule_object_id
1125     AND   B.RULE_OBJECT_ID = ATTR.RULE_OBJECT_ID
1126     AND   B.RULE_OBJECT_ID = TL.RULE_OBJECT_ID
1127     AND   TL.LANGUAGE = 'US';
1128 
1129 BEGIN
1130 
1131     -- standard start of API savepoint
1132     SAVEPOINT delete_rule_object;
1133 
1134     --Store the rule_object_id first so that it will be used
1135     --to delete the instances later.
1136 
1137     BEGIN
1138      SELECT RULE_OBJECT_ID INTO l_rule_object_id FROM FUN_RULE_OBJECTS_B
1139      WHERE RULE_OBJECT_NAME = p_rule_object_name
1140      AND   APPLICATION_ID   = p_application_id
1141      AND   INSTANCE_LABEL IS NULL
1142      AND   ORG_ID  IS NULL
1143      AND   PARENT_RULE_OBJECT_ID IS NULL;
1144 
1145     EXCEPTION
1146      WHEN NO_DATA_FOUND THEN
1147         FND_MESSAGE.SET_NAME('FUN', 'FUN_RULE_INVALID_ROB');
1148         FND_MSG_PUB.ADD;
1149         RAISE FND_API.G_EXC_ERROR;
1150     END;
1151 
1152     --Instead of calling the delete apis of the tables for each record, from performance point of view
1153     --its better to issue direct delete statement.
1154 
1155     DELETE FROM FUN_RULE_PARAM_VALUES FRPV
1156     WHERE RULE_DETAIL_ID IN (SELECT RULE_DETAIL_ID
1157                              FROM FUN_RULE_DETAILS FRD , FUN_RULE_OBJECTS_B FROB
1158                              WHERE FROB.RULE_OBJECT_ID = FRD.RULE_OBJECT_ID
1159                              AND FROB.RULE_OBJECT_NAME = P_RULE_OBJECT_NAME);
1160 
1161 
1162     DELETE FROM FUN_RULE_CRIT_PARAMS_TL FRCP
1163     WHERE CRITERIA_PARAM_ID IN (SELECT CRITERIA_PARAM_ID
1164                                 FROM FUN_RULE_OBJECTS_B FROB, FUN_RULE_CRIT_PARAMS_B FRCPB
1165 				WHERE FROB.RULE_OBJECT_ID = FRCPB.RULE_OBJECT_ID
1166   			        AND RULE_OBJECT_NAME = P_RULE_OBJECT_NAME);
1167 
1168     DELETE FROM FUN_RULE_CRIT_PARAMS_B FRCP
1169     WHERE RULE_OBJECT_ID IN (SELECT RULE_OBJECT_ID
1170                              FROM FUN_RULE_OBJECTS_B WHERE
1171 			     RULE_OBJECT_NAME = P_RULE_OBJECT_NAME);
1172 
1173     DELETE FROM FUN_RULE_DETAILS FRD
1174     WHERE RULE_OBJECT_ID IN (SELECT RULE_OBJECT_ID
1175                              FROM FUN_RULE_OBJECTS_B WHERE
1176 			     RULE_OBJECT_NAME = P_RULE_OBJECT_NAME);
1177     DELETE FROM FUN_RULE_CRITERIA FRC
1178     WHERE RULE_DETAIL_ID IN (SELECT RULE_DETAIL_ID
1179                              FROM FUN_RULE_DETAILS FRD , FUN_RULE_OBJECTS_B FROB
1180 			     WHERE FROB.RULE_OBJECT_ID = FRD.RULE_OBJECT_ID
1181 			     AND FROB.RULE_OBJECT_NAME = P_RULE_OBJECT_NAME);
1182 
1183     --TEST Related tables deletion starts from here
1184 
1185     DELETE FROM FUN_RULE_TEST_MULTIRULE FRTP
1186     WHERE TEST_ID IN (SELECT TEST_ID
1187 		      FROM FUN_RULE_TESTS FRT , FUN_RULE_OBJECTS_B FROB
1188 		      WHERE FROB.RULE_OBJECT_ID = FRT.RULE_OBJECT_ID
1189 		      AND FROB.RULE_OBJECT_NAME = P_RULE_OBJECT_NAME);
1190 
1191     DELETE FROM FUN_RULE_TEST_RESULTS FRTR
1192     WHERE TEST_ID IN (SELECT TEST_ID
1193                       FROM FUN_RULE_TESTS FRT , FUN_RULE_OBJECTS_B FROB
1194 		      WHERE FROB.RULE_OBJECT_ID = FRT.RULE_OBJECT_ID
1195 		      AND FROB.RULE_OBJECT_NAME = P_RULE_OBJECT_NAME);
1196 
1197     DELETE FROM FUN_RULE_TEST_MVAL_RES FRTMR
1198     WHERE TEST_ID IN (SELECT TEST_ID
1199                       FROM FUN_RULE_TESTS FRT , FUN_RULE_OBJECTS_B FROB
1200 		      WHERE FROB.RULE_OBJECT_ID = FRT.RULE_OBJECT_ID
1201 		      AND FROB.RULE_OBJECT_NAME = P_RULE_OBJECT_NAME);
1202 
1203     DELETE FROM FUN_RULE_TEST_PARAMS FRTP
1204     WHERE TEST_ID IN (SELECT TEST_ID
1205                       FROM FUN_RULE_TESTS FRT , FUN_RULE_OBJECTS_B FROB
1206 		      WHERE FROB.RULE_OBJECT_ID = FRT.RULE_OBJECT_ID
1207 		      AND FROB.RULE_OBJECT_NAME = P_RULE_OBJECT_NAME);
1208 
1209     DELETE FROM FUN_RULE_TESTS FRT
1210     WHERE RULE_OBJECT_ID IN (SELECT RULE_OBJECT_ID
1211                              FROM FUN_RULE_OBJECTS_B WHERE
1212 			     RULE_OBJECT_NAME = P_RULE_OBJECT_NAME);
1213 
1214     -- initialize message list if p_init_msg_list is set to TRUE.
1215     IF FND_API.to_Boolean(p_init_msg_list) THEN
1216         FND_MSG_PUB.initialize;
1217     END IF;
1218 
1219     -- initialize API return status to success.
1220     x_return_status := FND_API.G_RET_STS_SUCCESS;
1221 
1222     -- call to table-handler.
1223     FUN_RULE_OBJECTS_PKG.Delete_Row (
1224         X_RULE_OBJECT_NAME                     =>p_rule_object_name,
1225         X_APPLICATION_ID                       =>p_application_id
1226     );
1227 
1228 
1229    --If USE_INSTANCE_FLAG is Y, then DELETE all instances.
1230    --Loop through the cursor and update the Rule Object tables for each instances.
1231 
1232 
1233    FOR C_REC  IN FUN_RULE_OBJECTS_CUR(l_rule_object_id) LOOP
1234 
1235 	    -- initialize API return status to success.
1236 	    x_return_status := FND_API.G_RET_STS_SUCCESS;
1237 
1238             delete_rule_object_instance(
1239                p_application_id          => C_REC.application_id,
1240                p_rule_object_name        => C_REC.rule_object_name,
1241                p_instance_label          => C_REC.instance_label,
1242                p_org_id                  => C_REC.org_id,
1243                x_return_status           => x_return_status,
1244                x_msg_count               => x_msg_count,
1245                x_msg_data                => x_msg_data);
1246 
1247 
1248 	   IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
1249 
1250 	       -- standard call to get message count and if count is 1, get message info.
1251 	       FND_MSG_PUB.Count_And_Get(
1252 			p_encoded => FND_API.G_FALSE,
1253 			p_count => x_msg_count,
1254 			p_data  => x_msg_data);
1255 	   END IF;
1256 
1257    END LOOP;
1258 
1259     -- standard call to get message count and if count is 1, get message info.
1260     FND_MSG_PUB.Count_And_Get(
1261                 p_encoded => FND_API.G_FALSE,
1262                 p_count => x_msg_count,
1263                 p_data  => x_msg_data);
1264 
1265 EXCEPTION
1266     WHEN FND_API.G_EXC_ERROR THEN
1267         ROLLBACK TO delete_rule_object;
1268         x_return_status := FND_API.G_RET_STS_ERROR;
1269         FND_MSG_PUB.Count_And_Get(
1270                                 p_encoded => FND_API.G_FALSE,
1271                                 p_count => x_msg_count,
1272                                 p_data  => x_msg_data);
1273 
1274     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1275         ROLLBACK TO delete_rule_object;
1276         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1277         FND_MSG_PUB.Count_And_Get(
1278                                 p_encoded => FND_API.G_FALSE,
1279                                 p_count => x_msg_count,
1280                                 p_data  => x_msg_data);
1281 
1282     WHEN OTHERS THEN
1283         ROLLBACK TO delete_rule_object;
1284         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1285         FND_MESSAGE.SET_NAME('FUN', 'FUN_RULE_API_OTHERS_EXCEP');
1286         FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
1287         FND_MSG_PUB.ADD;
1288         FND_MSG_PUB.Count_And_Get(
1289                                 p_encoded => FND_API.G_FALSE,
1290                                 p_count => x_msg_count,
1291                                 p_data  => x_msg_data);
1292 END delete_rule_object;
1293 
1294 
1295 
1296 /**
1297  * Use this routine to delete a rule object instance. The API deletes a record in the
1298  * FUN_RULE_OBJECTS_B table after checking if the USE_INSTANCE_FLAG is Y or not.
1299  *
1300  *
1301  * p_init_msg_list    Initialize message stack if it is set to FND_API.G_TRUE. Default is FND_API.G_FALSE.
1302  * p_application_id   Application identifier
1303  * p_rule_object_name Name of Rule Object
1304  * p_instance_label   Name of the Instance.
1305  * x_return_status    Return status after the call.
1306  * x_msg_count        Number of messages in message stack.
1307  * x_msg_data         Message text if x_msg_count is 1.
1308  *
1309  * 27-Dec-2005    Amulya Mishra     Created
1310  */
1311 
1312 PROCEDURE delete_rule_object_instance(
1313     p_init_msg_list           IN      VARCHAR2 := FND_API.G_FALSE,
1314     p_application_id          IN      NUMBER,
1315     p_rule_object_name        IN      VARCHAR2,
1316     p_instance_label          IN      VARCHAR2,
1317     p_org_id                  IN      NUMBER,
1318     x_return_status           OUT NOCOPY       VARCHAR2,
1319     x_msg_count               OUT NOCOPY       NUMBER,
1320     x_msg_data                OUT NOCOPY       VARCHAR2
1321 ) IS
1322 
1323 l_rule_object_id              NUMBER;
1324 
1325 BEGIN
1326 
1327     -- standard start of API savepoint
1328     SAVEPOINT delete_rule_object_instance;
1329 
1330     --Get the RULE_OBJECT_ID from FUN_RULE_OBJECTS_B for the Rule Instance.
1331     --Use the RULE_OBJECT_ID to delete the records.
1332 
1333     BEGIN
1334       SELECT RULE_OBJECT_ID INTO l_rule_object_id FROM FUN_RULE_OBJECTS_B
1335       WHERE RULE_OBJECT_NAME = p_rule_object_name
1336       AND   APPLICATION_ID   = p_application_id
1337       AND ( (INSTANCE_LABEL IS NULL  AND p_instance_label IS NULL) OR
1338 	  (INSTANCE_LABEL IS NOT NULL AND p_instance_label IS NOT NULL AND INSTANCE_LABEL = p_instance_label))
1339       AND ( (ORG_ID IS NULL AND p_org_id IS NULL) OR
1340 	  ( ORG_ID IS NOT NULL AND p_org_id IS NOT NULL AND ORG_ID = p_org_id))
1341       AND PARENT_RULE_OBJECT_ID IS NOT NULL;
1342 
1343     EXCEPTION
1344     WHEN NO_DATA_FOUND THEN
1345         FND_MESSAGE.SET_NAME('FUN', 'FUN_RULE_NO_INSTANCE');
1346         FND_MESSAGE.SET_TOKEN('INSTANCE_LABEL' ,p_instance_label);
1347         FND_MSG_PUB.ADD;
1348         RAISE FND_API.G_EXC_ERROR;
1349     END;
1350 
1351     --Instead of calling the delete apis of the tables for each record, from performance point of view
1352     --its better to issue direct delete statement.
1353 
1354     DELETE FROM FUN_RULE_PARAM_VALUES FRPV
1355     WHERE RULE_DETAIL_ID IN (SELECT RULE_DETAIL_ID
1356                              FROM FUN_RULE_DETAILS FRD , FUN_RULE_OBJECTS_B FROB
1357                              WHERE FROB.RULE_OBJECT_ID = FRD.RULE_OBJECT_ID
1358                              AND FROB.RULE_OBJECT_NAME = P_RULE_OBJECT_NAME
1359 			     AND FROB.APPLICATION_ID = P_APPLICATION_ID
1360 			    AND ( (INSTANCE_LABEL IS NULL AND p_instance_label IS NULL) OR
1361 				  (INSTANCE_LABEL IS NOT NULL AND p_instance_label IS NOT NULL AND INSTANCE_LABEL = p_instance_label))
1362 			    AND ( (ORG_ID IS NULL AND p_org_id IS NULL) OR
1363 				  ( ORG_ID IS NOT NULL AND p_org_id IS NOT NULL AND ORG_ID = p_org_id))
1364 			    AND PARENT_RULE_OBJECT_ID IS NOT NULL);
1365 
1366 
1367     DELETE FROM FUN_RULE_CRIT_PARAMS_TL FRCP
1368     WHERE CRITERIA_PARAM_ID IN (SELECT CRITERIA_PARAM_ID
1369                                 FROM FUN_RULE_OBJECTS_B FROB, FUN_RULE_CRIT_PARAMS_B FRCPB
1370 				WHERE FROB.RULE_OBJECT_ID = FRCPB.RULE_OBJECT_ID
1371   			        AND RULE_OBJECT_NAME = P_RULE_OBJECT_NAME
1372 				AND FROB.APPLICATION_ID = P_APPLICATION_ID
1373 			    AND ( (INSTANCE_LABEL IS NULL AND p_instance_label IS NULL) OR
1374 				  (INSTANCE_LABEL IS NOT NULL AND p_instance_label IS NOT NULL AND INSTANCE_LABEL = p_instance_label))
1375 			    AND ( (ORG_ID IS NULL AND p_org_id IS NULL) OR
1376 				  ( ORG_ID IS NOT NULL AND p_org_id IS NOT NULL AND ORG_ID = p_org_id))
1377 			    AND PARENT_RULE_OBJECT_ID IS NOT NULL);
1378 
1379 
1380 
1381     DELETE FROM FUN_RULE_CRIT_PARAMS_B FRCP
1382     WHERE RULE_OBJECT_ID IN (SELECT RULE_OBJECT_ID
1383                              FROM FUN_RULE_OBJECTS_B WHERE
1384 			     RULE_OBJECT_NAME = P_RULE_OBJECT_NAME
1385 				AND APPLICATION_ID = P_APPLICATION_ID
1386 			    AND ( (INSTANCE_LABEL IS NULL AND p_instance_label IS NULL) OR
1387 				  (INSTANCE_LABEL IS NOT NULL AND p_instance_label IS NOT NULL AND INSTANCE_LABEL = p_instance_label))
1388 			    AND ( (ORG_ID IS NULL AND p_org_id IS NULL) OR
1389 				  ( ORG_ID IS NOT NULL AND p_org_id IS NOT NULL AND ORG_ID = p_org_id))
1390 			    AND PARENT_RULE_OBJECT_ID IS NOT NULL);
1391 
1392     DELETE FROM FUN_RULE_DETAILS FRD
1393     WHERE RULE_OBJECT_ID IN (SELECT RULE_OBJECT_ID
1394                              FROM FUN_RULE_OBJECTS_B WHERE
1395 			     RULE_OBJECT_NAME = P_RULE_OBJECT_NAME
1396 			     AND APPLICATION_ID = P_APPLICATION_ID
1397 			    AND ( (INSTANCE_LABEL IS NULL AND p_instance_label IS NULL) OR
1398 				  (INSTANCE_LABEL IS NOT NULL AND p_instance_label IS NOT NULL AND INSTANCE_LABEL = p_instance_label))
1399 			    AND ( (ORG_ID IS NULL AND p_org_id IS NULL) OR
1400 				  ( ORG_ID IS NOT NULL AND p_org_id IS NOT NULL AND ORG_ID = p_org_id))
1401 			    AND PARENT_RULE_OBJECT_ID IS NOT NULL);
1402 
1403     DELETE FROM FUN_RULE_CRITERIA FRC
1404     WHERE RULE_DETAIL_ID IN (SELECT RULE_DETAIL_ID
1405                              FROM FUN_RULE_DETAILS FRD , FUN_RULE_OBJECTS_B FROB
1406 			     WHERE FROB.RULE_OBJECT_ID = FRD.RULE_OBJECT_ID
1407 			     AND RULE_OBJECT_NAME = P_RULE_OBJECT_NAME
1408 			     AND FROB.APPLICATION_ID = P_APPLICATION_ID
1409 			    AND ( (INSTANCE_LABEL IS NULL AND p_instance_label IS NULL) OR
1410 				  (INSTANCE_LABEL IS NOT NULL AND p_instance_label IS NOT NULL AND INSTANCE_LABEL = p_instance_label))
1411 			    AND ( (ORG_ID IS NULL AND p_org_id IS NULL) OR
1412 				  ( ORG_ID IS NOT NULL AND p_org_id IS NOT NULL AND ORG_ID = p_org_id))
1413 			    AND PARENT_RULE_OBJECT_ID IS NOT NULL);
1414 
1415 
1416     --TEST Related tables deletion starts from here
1417 
1418     DELETE FROM FUN_RULE_TEST_MULTIRULE FRTP
1419     WHERE TEST_ID IN (SELECT TEST_ID
1420 		      FROM FUN_RULE_TESTS FRT , FUN_RULE_OBJECTS_B FROB
1421 		      WHERE FROB.RULE_OBJECT_ID = FRT.RULE_OBJECT_ID
1422 		      AND RULE_OBJECT_NAME = P_RULE_OBJECT_NAME
1423  		      AND FROB.APPLICATION_ID = P_APPLICATION_ID
1424 			    AND ( (INSTANCE_LABEL IS NULL AND p_instance_label IS NULL) OR
1425 				  (INSTANCE_LABEL IS NOT NULL AND p_instance_label IS NOT NULL AND INSTANCE_LABEL = p_instance_label))
1426 			    AND ( (ORG_ID IS NULL AND p_org_id IS NULL) OR
1427 				  ( ORG_ID IS NOT NULL AND p_org_id IS NOT NULL AND ORG_ID = p_org_id))
1428 			    AND PARENT_RULE_OBJECT_ID IS NOT NULL);
1429 
1430 
1431     DELETE FROM FUN_RULE_TEST_RESULTS FRTR
1432     WHERE TEST_ID IN (SELECT TEST_ID
1433                       FROM FUN_RULE_TESTS FRT , FUN_RULE_OBJECTS_B FROB
1434 		      WHERE FROB.RULE_OBJECT_ID = FRT.RULE_OBJECT_ID
1435 		      AND RULE_OBJECT_NAME = P_RULE_OBJECT_NAME
1436  		      AND FROB.APPLICATION_ID = P_APPLICATION_ID
1437 			    AND ( (INSTANCE_LABEL IS NULL AND p_instance_label IS NULL) OR
1438 				  (INSTANCE_LABEL IS NOT NULL AND p_instance_label IS NOT NULL AND INSTANCE_LABEL = p_instance_label))
1439 			    AND ( (ORG_ID IS NULL AND p_org_id IS NULL) OR
1440 				  ( ORG_ID IS NOT NULL AND p_org_id IS NOT NULL AND ORG_ID = p_org_id))
1441 			    AND PARENT_RULE_OBJECT_ID IS NOT NULL);
1442 
1443 
1444     DELETE FROM FUN_RULE_TEST_MVAL_RES FRTMR
1445     WHERE TEST_ID IN (SELECT TEST_ID
1446                       FROM FUN_RULE_TESTS FRT , FUN_RULE_OBJECTS_B FROB
1447 		      WHERE FROB.RULE_OBJECT_ID = FRT.RULE_OBJECT_ID
1448 		      AND RULE_OBJECT_NAME = P_RULE_OBJECT_NAME
1449 		      AND FROB.APPLICATION_ID = P_APPLICATION_ID
1450 			    AND ( (INSTANCE_LABEL IS NULL AND p_instance_label IS NULL) OR
1451 				  (INSTANCE_LABEL IS NOT NULL AND p_instance_label IS NOT NULL AND INSTANCE_LABEL = p_instance_label))
1452 			    AND ( (ORG_ID IS NULL AND p_org_id IS NULL) OR
1453 				  ( ORG_ID IS NOT NULL AND p_org_id IS NOT NULL AND ORG_ID = p_org_id))
1454 			    AND PARENT_RULE_OBJECT_ID IS NOT NULL);
1455 
1456 
1457     DELETE FROM FUN_RULE_TEST_PARAMS FRTP
1458     WHERE TEST_ID IN (SELECT TEST_ID
1459                       FROM FUN_RULE_TESTS FRT , FUN_RULE_OBJECTS_B FROB
1460 		      WHERE FROB.RULE_OBJECT_ID = FRT.RULE_OBJECT_ID
1461 			     AND RULE_OBJECT_NAME = P_RULE_OBJECT_NAME
1462 			     AND FROB.APPLICATION_ID = P_APPLICATION_ID
1463 			    AND ( (INSTANCE_LABEL IS NULL AND p_instance_label IS NULL) OR
1464 				  (INSTANCE_LABEL IS NOT NULL AND p_instance_label IS NOT NULL AND INSTANCE_LABEL = p_instance_label))
1465 			    AND ( (ORG_ID IS NULL AND p_org_id IS NULL) OR
1466 				  ( ORG_ID IS NOT NULL AND p_org_id IS NOT NULL AND ORG_ID = p_org_id))
1467 			    AND PARENT_RULE_OBJECT_ID IS NOT NULL);
1468 
1469 
1470     DELETE FROM FUN_RULE_TESTS FRT
1471     WHERE RULE_OBJECT_ID IN (SELECT RULE_OBJECT_ID
1472                              FROM FUN_RULE_OBJECTS_B WHERE
1473 			     RULE_OBJECT_NAME = P_RULE_OBJECT_NAME
1474 			     AND APPLICATION_ID = P_APPLICATION_ID
1475 			    AND ( (INSTANCE_LABEL IS NULL AND p_instance_label IS NULL) OR
1476 				  (INSTANCE_LABEL IS NOT NULL AND p_instance_label IS NOT NULL AND INSTANCE_LABEL = p_instance_label))
1477 			    AND ( (ORG_ID IS NULL AND p_org_id IS NULL) OR
1478 				  ( ORG_ID IS NOT NULL AND p_org_id IS NOT NULL AND ORG_ID = p_org_id))
1479 			    AND PARENT_RULE_OBJECT_ID IS NOT NULL);
1480 
1481 
1482     -- initialize message list if p_init_msg_list is set to TRUE.
1483     IF FND_API.to_Boolean(p_init_msg_list) THEN
1484         FND_MSG_PUB.initialize;
1485     END IF;
1486 
1487     -- initialize API return status to success.
1488     x_return_status := FND_API.G_RET_STS_SUCCESS;
1489 
1490     -- call to table-handler.
1491     FUN_RULE_OBJECTS_PKG.Delete_Row (
1492         X_RULE_OBJECT_ID                     =>l_rule_object_id
1493     );
1494 
1495     -- standard call to get message count and if count is 1, get message info.
1496     FND_MSG_PUB.Count_And_Get(
1497                 p_encoded => FND_API.G_FALSE,
1498                 p_count => x_msg_count,
1499                 p_data  => x_msg_data);
1500 
1501 EXCEPTION
1502     WHEN FND_API.G_EXC_ERROR THEN
1503         ROLLBACK TO delete_rule_object_instance;
1504         x_return_status := FND_API.G_RET_STS_ERROR;
1505         FND_MSG_PUB.Count_And_Get(
1506                                 p_encoded => FND_API.G_FALSE,
1507                                 p_count => x_msg_count,
1508                                 p_data  => x_msg_data);
1509 
1510     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1511         ROLLBACK TO delete_rule_object_instance;
1512         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1513         FND_MSG_PUB.Count_And_Get(
1514                                 p_encoded => FND_API.G_FALSE,
1515                                 p_count => x_msg_count,
1516                                 p_data  => x_msg_data);
1517 
1518     WHEN OTHERS THEN
1519         ROLLBACK TO delete_rule_object_instance;
1520         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1521         FND_MESSAGE.SET_NAME('FUN', 'FUN_RULE_API_OTHERS_EXCEP');
1522         FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
1523         FND_MSG_PUB.ADD;
1524         FND_MSG_PUB.Count_And_Get(
1525                                 p_encoded => FND_API.G_FALSE,
1526                                 p_count => x_msg_count,
1527                                 p_data  => x_msg_data);
1528 END delete_rule_object_instance;
1529 
1530 
1531 FUNCTION RULE_OBJECT_USES_PARAMETER(p_rule_object_name IN VARCHAR2,
1532                                     p_parameter_name IN VARCHAR2)
1533 RETURN BOOLEAN
1534 IS
1535     l_dummy     VARCHAR2(1);
1536 BEGIN
1537 
1538     SELECT 'Y' INTO l_dummy
1539     FROM FUN_RULE_CRIT_PARAMS_B FRCP, FUN_RULE_OBJECTS_B FROB
1540     WHERE FROB.RULE_OBJECT_ID = FRCP.RULE_OBJECT_ID
1541     AND FROB.RULE_OBJECT_NAME = p_rule_object_name
1542     AND FRCP.PARAM_NAME = p_parameter_name;
1543 
1544    return TRUE;
1545 EXCEPTION
1546   WHEN NO_DATA_FOUND THEN
1547       return FALSE;
1548   WHEN OTHERS THEN
1549       return FALSE;
1550 END;
1551 
1552 /**
1553  * PROCEDURE rule_object_instance_exists
1554  *
1555  * DESCRIPTION
1556  *     Returns Boolean value based on a Rule Object Instance exists in the
1557  *     FUN_RULE_OBJECTS_B table or not.
1558  *
1559  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1560  *
1561  *
1562  * ARGUMENTS
1563  *   IN:
1564  *     p_application_id               Application Id
1565  *     p_rule_object_name             Rule object Name.
1566  *     p_instance_label               Rule Object Instance Label name
1567  *   IN/OUT:
1568  *   OUT:
1569  *     True , if the rule object instance exists in the table, else returns False.
1570  *
1571  * NOTES
1572  *
1573  * MODIFICATION HISTORY
1574  *
1575  *   27-Dec-2005    Amulya Mishra       Created.
1576  *
1577  */
1578 
1579 FUNCTION rule_object_instance_exists(
1580     p_application_id          IN      NUMBER,
1581     p_rule_object_name        IN      VARCHAR2,
1582     p_instance_label          IN      VARCHAR2,
1583     p_org_id                  IN      NUMBER
1584 ) RETURN BOOLEAN
1585 IS
1586 
1587        l_param_value               VARCHAR2(1);
1588 
1589 
1590 BEGIN
1591     if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
1592       fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'Start FUN_RULE_PUB.rule_object_instance_exists', FALSE);
1593     end if;
1594 
1595     /*
1596        Bug 7040957 - re_written the routine to avoid high parsing as dynamic code is not required under
1597        current case.
1598     */
1599 
1600 
1601       SELECT 'Y' INTO l_param_value
1602       FROM FUN_RULE_OBJECTS_B
1603       WHERE RULE_OBJECT_NAME = p_rule_object_name
1604       AND   APPLICATION_ID   = p_application_id
1605       AND ( (INSTANCE_LABEL IS NULL  AND p_instance_label IS NULL) OR
1606 	  (INSTANCE_LABEL IS NOT NULL AND p_instance_label IS NOT NULL AND INSTANCE_LABEL = p_instance_label))
1607       AND ( (ORG_ID IS NULL AND p_org_id IS NULL) OR
1608 	  ( ORG_ID IS NOT NULL AND p_org_id IS NOT NULL AND ORG_ID = p_org_id))
1609       AND PARENT_RULE_OBJECT_ID IS NOT NULL;
1610 
1611       if (l_param_value = 'Y') then
1612 	   return TRUE;
1613        else
1614 	   return FALSE;
1615        end if;
1616 
1617    EXCEPTION
1618 
1619     WHEN TOO_MANY_ROWS THEN
1620        IF (FND_LOG.LEVEL_EXCEPTION  >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1621          FND_LOG.MESSAGE(FND_LOG.LEVEL_EXCEPTION , 'FUN_RULE_PUB.rule_object_instance_exists:->TO_MANY_ROWS', FALSE);
1622        END IF;
1623        return TRUE;
1624 
1625      WHEN NO_DATA_FOUND THEN
1626        IF (FND_LOG.LEVEL_EXCEPTION  >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1627          FND_LOG.MESSAGE(FND_LOG.LEVEL_EXCEPTION , 'FUN_RULE_PUB.rule_object_instance_exists:->NO_DATA_FOUND', FALSE);
1628        END IF;
1629        return FALSE;
1630 
1631      WHEN OTHERS THEN
1632 
1633        IF (FND_LOG.LEVEL_EXCEPTION  >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1634          FND_LOG.MESSAGE(FND_LOG.LEVEL_EXCEPTION , 'FUN_RULE_PUB.rule_object_instance_exists:->'||SQLERRM, FALSE);
1635        END IF;
1636        RAISE;
1637 END rule_object_instance_exists;
1638 
1639 /**
1640  * FUNCTION rule_object_instance_exists
1641  *
1642  * DESCRIPTION
1643  *     Returns ('Y'/'N') value based on a Rule Object Instance exists in the
1644  *     FUN_RULE_OBJECTS_B table or not.
1645  *
1646  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1647  *
1648  *
1649  * ARGUMENTS
1650  *   IN:
1651  *     p_application_id               Application Id
1652  *     p_rule_object_name             Rule object Name.
1653  *     p_instance_label               Rule Object Instance Label name
1654  *     p_org_id			      Operating Unit
1655  *   IN/OUT:
1656  *   OUT:
1657  *     'Y' , if the rule object instance exists in the table, else returns 'N'.
1658  *
1659  * NOTES
1660  *
1661  * MODIFICATION HISTORY
1662  *
1663  *   18-JUL-2006    A.Hari Krishna       Created.
1664  *
1665  */
1666 FUNCTION rule_object_instance_exists_vc(
1667     p_application_id          IN      NUMBER,
1668     p_rule_object_name        IN      VARCHAR2,
1669     p_instance_label          IN      VARCHAR2,
1670     p_org_id                  IN      NUMBER
1671 
1672 ) RETURN VARCHAR2
1673 
1674 IS
1675 
1676 	return_value               VARCHAR2(1);
1677 
1678 BEGIN
1679 
1680        if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
1681              fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'Start of FUN_RULE_PUB.rule_object_instance_exists', FALSE);
1682        end if;
1683 
1684        if(rule_object_instance_exists(p_application_id,p_rule_object_name,p_instance_label,p_org_id) = TRUE) then
1685             return_value:='Y';
1686        else
1687             return_value:='N';
1688        end if;
1689 
1690        if (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
1691              fnd_log.message(FND_LOG.LEVEL_STATEMENT, 'End of FUN_RULE_PUB.rule_object_instance_exists', FALSE);
1692        end if;
1693 
1694        return return_value;
1695 
1696 END rule_object_instance_exists_vc;
1697 
1698 /**
1699  * PROCEDURE convert_use_instance
1700  *
1701  * DESCRIPTION
1702  *     convert the Rule Object to make it enabling Instance
1703  *     and vice versa.
1704  *
1705  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1706  *
1707  *
1708  * ARGUMENTS
1709  *   IN:
1710  *     p_init_msg_list                Initialize message stack if it is set to
1711  *                                    FND_API.G_TRUE. Default is FND_API.G_FALSE.
1712  *     p_rule_object_id               Internal identifier for the Rule Object
1713  *     p_instance_flag                Use Instance Flag value for the Rule Object
1714  *     p_instance_label               Instance Label to be associated with the Rule Object Instances.
1715  *     p_org_id                       Internal identifier for the organization id to be
1716  *                                    associated with the Rule Object Instances
1717  *   IN/OUT:
1718  *   OUT:
1719  *     x_return_status                Return status after the call. The status can
1720  *                                    be FND_API.G_RET_STS_SUCCESS (success),
1721  *                                    FND_API.G_RET_STS_ERROR (error),
1722  *                                    FND_API.G_RET_STS_UNEXP_ERROR (unexpected error).
1723  *     x_msg_count                    Number of messages in message stack.
1724  *     x_msg_data                     Message text if x_msg_count is 1.
1725  *
1726  * NOTES
1727  *
1728  * MODIFICATION HISTORY
1729  *
1730  *   14-Feb-2006    Amulya Mishra       Created.
1731  *
1732  */
1733 
1734 /*Algorithm for converting the Rule Object Into Instance Anabled and vice-versa.
1735 
1736  If the RULE_OBJECT_ID is for an object instance, error out.
1737  Compare the USE_INSTANCE_FLAG on the rule object with P_INSTANCE_FLAG.
1738    If they are the same, do nothing and exit out.
1739  If P_INSTANCE_FLAG = 'Y' then
1740     Set USE_INSTANCE_FLAG to 'Y' for the rule object.
1741     IF P_INSTANCE_LABEL and/or P_ORG_ID is not null THEN
1742         Create a new instance.
1743         Move all of the original rules and test cases to this new instance.
1744      Else
1745         Delete all of the original rules and test cases.
1746     End if
1747  Else if P_INSTANCE_FLAG = 'N' then
1748     Set USE_INSTANCE_FLAG to 'N' for the rule object
1749     Delete all object instances
1750  Else
1751      Invalid P_INSTANCE_FLAG -- error
1752  End if
1753 
1754  */
1755 
1756 
1757 PROCEDURE convert_use_instance(
1758     p_init_msg_list           		 IN      VARCHAR2 := FND_API.G_FALSE,
1759     p_rule_object_id                     IN      NUMBER,
1760     p_use_instance_flag                  IN      VARCHAR2,
1761     p_instance_label                     IN      VARCHAR2 DEFAULT NULL,
1762     P_ORG_ID                             IN      NUMBER DEFAULT NULL,
1763     x_return_status           		 OUT NOCOPY     VARCHAR2,
1764     x_msg_count               		 OUT NOCOPY     NUMBER,
1765     x_msg_data                		 OUT NOCOPY     VARCHAR2
1766 )
1767 IS
1768     CURSOR C_RULE_OBJECT_INSTANCES(p_rule_object_id NUMBER) IS
1769     SELECT APPLICATION_ID,RULE_OBJECT_NAME,
1770            RULE_OBJECT_ID, INSTANCE_LABEL, ORG_ID
1771     FROM FUN_RULE_OBJECTS_B
1772     WHERE PARENT_RULE_OBJECT_ID = p_rule_object_id;
1773 
1774     x_rule_object_id		FUN_RULE_OBJECTS_B.RULE_OBJECT_ID%TYPE;
1775     l_application_id		FUN_RULE_OBJECTS_B.APPLICATION_ID%TYPE;
1776     l_rule_object_name		FUN_RULE_OBJECTS_B.RULE_OBJECT_NAME%TYPE;
1777     l_parent_rule_object_id	FUN_RULE_OBJECTS_B.PARENT_RULE_OBJECT_ID%TYPE;
1778     l_use_instance_flag         FUN_RULE_OBJECTS_B.USE_INSTANCE_FLAG%TYPE;
1779 
1780 BEGIN
1781     -- standard start of API savepoint
1782     SAVEPOINT convert_use_instance;
1783 
1784     -- initialize message list if p_init_msg_list is set to TRUE.
1785     IF FND_API.to_Boolean(p_init_msg_list) THEN
1786         FND_MSG_PUB.initialize;
1787     END IF;
1788 
1789     -- initialize API return status to success.
1790     x_return_status := FND_API.G_RET_STS_SUCCESS;
1791 
1792     /*The Rule Object Id passed is for an Instance which cannt be processed.
1793      *Only parent Rule Objects should be processed through this method
1794      */
1795 
1796     IF (FUN_RULE_UTILITY_PKG.IS_USE_INSTANCE(p_rule_object_id)) THEN
1797       fnd_message.set_name('FUN', 'FUN_RULE_NO_CONV_ROB_INST');
1798       fnd_msg_pub.add;
1799       x_return_status := fnd_api.g_ret_sts_error;
1800       RAISE FND_API.G_EXC_ERROR;
1801     END IF;
1802 
1803     /*Compare the USE_INSTANCE_FLAG from Database for the Rule Object Id and compare
1804      *with the passed value i.e p_use_instance_flag. If same, then simply exit.
1805      */
1806     --Since we have come here, that means the Rule Object Id record exists in the database.
1807     --So No need to handling exception.
1808 
1809     BEGIN
1810        SELECT USE_INSTANCE_FLAG , APPLICATION_ID, RULE_OBJECT_NAME
1811        INTO l_use_instance_flag, l_application_id, l_rule_object_name
1812        FROM FUN_RULE_OBJECTS_B
1813        WHERE RULE_OBJECT_ID = p_rule_object_id;
1814     END;
1815 
1816     IF (NVL(l_use_instance_flag,'N') = NVL(p_use_instance_flag,'N')) THEN
1817       RETURN;
1818     END IF;
1819 
1820 
1821     IF (UPPER(p_use_instance_flag) = 'Y') THEN
1822 
1823        --Set USE_INSTANCE_FLAG to 'Y' for the rule object.
1824      BEGIN
1825        UPDATE FUN_RULE_OBJECTS_B
1826        SET USE_INSTANCE_FLAG ='Y'
1827        WHERE RULE_OBJECT_ID = p_rule_object_id;
1828      END;
1829 
1830        if ( p_instance_label IS NOT NULL OR
1831              p_org_id  IS NOT NULL) then
1832 
1833 	   --Create a new instance.
1834 
1835 	   create_rule_object_instance(
1836                  p_application_id    => l_application_id,
1837                  p_rule_object_name  => l_rule_object_name,
1838                  p_instance_label    => p_instance_label,
1839                  p_org_id            => p_org_id,
1840                  x_rule_object_id    => x_rule_object_id,
1841                  x_return_status     => x_return_status,
1842                  x_msg_count         => x_msg_count ,
1843                  x_msg_data          => x_msg_data
1844            );
1845 
1846           -- Move all of the original rules and test cases to this new instance.
1847           BEGIN
1848            UPDATE FUN_RULE_DETAILS
1849 	   SET RULE_OBJECT_ID = x_rule_object_id
1850 	   WHERE RULE_OBJECT_ID = p_rule_object_id;
1851           END;
1852 
1853 	  BEGIN
1854 	   UPDATE FUN_RULE_TESTS
1855 	   SET RULE_OBJECT_ID = x_rule_object_id
1856 	   WHERE RULE_OBJECT_ID = p_rule_object_id;
1857           END;
1858        else
1859            --Delete all of the original rules and test cases.
1860 
1861            delete_rule_object(
1862                p_rule_object_name  => l_rule_object_name,
1863                p_application_id	   => l_application_id,
1864                x_return_status     => x_return_status,
1865                x_msg_count         => x_msg_count ,
1866                x_msg_data          => x_msg_data
1867            );
1868 
1869        end if;
1870 
1871     ELSIF (UPPER(p_use_instance_flag) = 'N') THEN
1872 
1873       --Select the parent rule object id for this instance.
1874       BEGIN
1875         SELECT PARENT_RULE_OBJECT_ID
1876         INTO l_parent_rule_object_id
1877         FROM FUN_RULE_OBJECTS_B
1878         WHERE RULE_OBJECT_ID = p_rule_object_id;
1879       END;
1880 
1881       --Set USE_INSTANCE_FLAG to 'N' for the rule object
1882       BEGIN
1883        UPDATE FUN_RULE_OBJECTS_B
1884        SET USE_INSTANCE_FLAG ='N',
1885            INSTANCE_LABEL    = null,
1886 	   ORG_ID            = null,
1887 	   PARENT_RULE_OBJECT_ID = null
1888        WHERE RULE_OBJECT_ID = p_rule_object_id;
1889       END;
1890 
1891      --Delete all object instances
1892 
1893      FOR c_rec IN C_RULE_OBJECT_INSTANCES(p_rule_object_id)
1894      LOOP
1895         delete_rule_object_instance(
1896                 p_application_id          => c_rec.application_id,
1897                 p_rule_object_name        => c_rec.rule_object_name,
1898                 p_instance_label          => c_rec.instance_label,
1899                 p_org_id                  => c_rec.org_id,
1900                 x_return_status           => x_return_status,
1901                 x_msg_count               => x_msg_count,
1902                 x_msg_data                => x_msg_data
1903          );
1904      END LOOP;
1905 
1906     ELSE
1907       --Invalid P_USE_INSTANCE_FLAG
1908 
1909       fnd_message.set_name('FUN', 'FUN_RULE_INVALID_INST_FLAG');
1910       fnd_msg_pub.add;
1911       x_return_status := fnd_api.g_ret_sts_error;
1912       RAISE FND_API.G_EXC_ERROR;
1913     END IF;
1914 
1915 EXCEPTION
1916     WHEN FND_API.G_EXC_ERROR THEN
1917         ROLLBACK TO convert_use_instance;
1918         x_return_status := FND_API.G_RET_STS_ERROR;
1919         FND_MSG_PUB.Count_And_Get(
1920                                 p_encoded => FND_API.G_FALSE,
1921                                 p_count => x_msg_count,
1922                                 p_data  => x_msg_data);
1923         x_msg_data := FND_MSG_PUB.Get_Detail;
1924 
1925     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1926         ROLLBACK TO convert_use_instance;
1927         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1928         FND_MSG_PUB.Count_And_Get(
1929                                 p_encoded => FND_API.G_FALSE,
1930                                 p_count => x_msg_count,
1931                                 p_data  => x_msg_data);
1932         x_msg_data := FND_MSG_PUB.Get_Detail;
1933     WHEN OTHERS THEN
1934         ROLLBACK TO convert_use_instance;
1935         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1936         FND_MESSAGE.SET_NAME('FUN', 'FUN_RULE_API_OTHERS_EXCEP');
1937         FND_MESSAGE.SET_TOKEN('ERROR' ,SQLERRM);
1938         FND_MSG_PUB.ADD;
1939         FND_MSG_PUB.Count_And_Get(
1940                                 p_encoded => FND_API.G_FALSE,
1941                                 p_count => x_msg_count,
1942                                 p_data  => x_msg_data);
1943         x_msg_data := FND_MSG_PUB.Get_Detail;
1944 END convert_use_instance;
1945 
1946 END FUN_RULE_OBJECTS_PUB;