DBA Data[Home] [Help]

PACKAGE BODY: APPS.AS_SALES_LEAD_RANKS_PVT

Source


1 PACKAGE BODY AS_SALES_LEAD_RANKS_PVT AS
2 /* #$Header: asxvrnkb.pls 115.24 2004/01/23 23:48:36 chchandr ship $ */
3 -- Start of Comments
4 -- Package name     : AS_SALES_LEAD_RANKS_PVT
5 -- Purpose          : to add ranks into AS_SALES_LEAD_RANKS_B and _TL
6 -- History          : 07/24/2000 raverma created
7 -- NOTE             :
8 -- End of Comments
9 
10     G_PKG_NAME      CONSTANT VARCHAR2(30) := 'AS_SALES_LEAD_RANKS_PVT';
11     G_FILE_NAME     CONSTANT VARCHAR2(12) := 'asxvrnkb.pls';
12     /*
13     G_APPL_ID       NUMBER := FND_GLOBAL.Prog_Appl_Id;
14     G_LOGIN_ID      NUMBER := FND_GLOBAL.Conc_Login_Id;
15     G_PROGRAM_ID    NUMBER := FND_GLOBAL.Conc_Program_Id;
16     G_USER_ID       NUMBER := FND_GLOBAL.User_Id;
17     G_REQUEST_ID    NUMBER := FND_GLOBAL.Conc_Request_Id;
18     G_VERSION_NUM   NUMBER := 1.0;
19     */
20 
21 AS_DEBUG_HIGH_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_HIGH);
22 AS_DEBUG_LOW_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW);
23 AS_DEBUG_MEDIUM_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_MEDIUM);
24 AS_DEBUG_ERROR_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_ERROR);
25 
26 PROCEDURE Validate_Score_Range (
27     P_Init_Msg_List       IN   VARCHAR2     := FND_API.G_FALSE,
28     P_Validation_mode     IN   VARCHAR2,
29     p_sales_lead_rank_rec IN   AS_SALES_LEAD_RANKS_PUB.sales_lead_rank_rec_type,
30     p_is_old_engine       IN  VARCHAR2,
31     X_Return_Status       OUT NOCOPY  VARCHAR2,
32     X_Msg_Count           OUT NOCOPY  NUMBER,
33     X_Msg_Data            OUT NOCOPY  VARCHAR2
34     )
35 IS
36     CURSOR C_Get_Ranks (c_min NUMBER, c_max NUMBER) IS
37         SELECT rank_id
38         FROM   AS_SALES_LEAD_RANKS_B
39         WHERE  enabled_flag = 'Y'
40                and ((min_score <= c_min and max_score >= c_min )
41                     or (min_score <= c_max and max_score >= c_max));
42 
43     CURSOR c_get_count (c_min NUMBER, c_max NUMBER) IS
44 	   SELECT count(*)
45         FROM   AS_SALES_LEAD_RANKS_B
46         WHERE  enabled_flag = 'Y'
47                and ((min_score <= c_min and max_score >= c_min )
48                     or (min_score <= c_max and max_score >= c_max));
49 
50     l_rank_id  NUMBER;
51     l_count    NUMBER;
52 
53 BEGIN
54       -- Initialize message list IF p_init_msg_list is set to TRUE.
55       IF FND_API.to_Boolean( p_init_msg_list )
56       THEN
57           FND_MSG_PUB.initialize;
58       END IF;
59 
60       -- Initialize API return status to SUCCESS
61       x_return_status := FND_API.G_RET_STS_SUCCESS;
62      IF upper(nvl(p_sales_lead_rank_rec.enabled_flag,'N')) = 'Y'
63      THEN
64       -- Validate if the score range overlap with other ranks' range
65       OPEN C_Get_Ranks (p_sales_lead_rank_rec.min_score,
66                         p_sales_lead_rank_rec.max_score);
67       FETCH C_Get_Ranks INTO l_rank_id;
68 
69       IF C_Get_Ranks%FOUND
70       THEN
71           -- 120400 ffang For bug 1520911, if the record to be updated is not
72 	     -- the same record, then fail.
73           OPEN c_get_count (p_sales_lead_rank_rec.min_score,
74                         p_sales_lead_rank_rec.max_score);
75           FETCH c_get_count into l_count;
76           CLOSE c_get_count;
77 
78           -- ffang 040501, for bug 1713105, check if rank_id is null
79           -- IF (l_count = 1 and p_sales_lead_rank_rec.rank_id <> l_rank_id)
80           IF (l_count = 1 and nvl(p_sales_lead_rank_rec.rank_id,0) <> l_rank_id)
81              or (l_count > 1)
82           THEN
83               IF (AS_DEBUG_LOW_ON) THEN
84 
85               AS_UTILITY_PVT.Debug_Message(FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW,
86                                        'Score range overlay: '||
87                                        p_sales_lead_rank_rec.min_score || '-' ||
88                                        p_sales_lead_rank_rec.max_score);
89               END IF;
90 
91 	      IF p_is_old_engine = 'Y'
92 	        THEN
93 		      AS_UTILITY_PVT.Set_Message(
94 		          p_msg_level     => FND_MSG_PUB.G_MSG_LVL_ERROR,
95 			  p_msg_name      => 'ASF_RANKSCORE_OVERLAP',
96 	                  p_token1        => 'MEANING',
97 		          p_token1_value  => p_sales_lead_rank_rec.meaning);
98 		ELSE
99 		      AS_UTILITY_PVT.Set_Message(
100 		          p_msg_level     => FND_MSG_PUB.G_MSG_LVL_ERROR,
101 			  p_msg_name      => 'AS_PREC_RANKSCORE_OVERLAP',
102 	                  p_token1        => 'MEANING',
103 		          p_token1_value  => p_sales_lead_rank_rec.meaning);
104 		END IF;
105               x_return_status := FND_API.G_RET_STS_ERROR;
106           END IF;
107       END IF;
108       CLOSE C_Get_Ranks;
109      END IF;
110 
111       -- Standard call to get message count and IF count is 1, get message info.
112       FND_MSG_PUB.Count_And_Get
113       (  p_count          =>   x_msg_count,
114          p_data           =>   x_msg_data );
115 
116 END Validate_Score_Range;
117 
118 
119 PROCEDURE Validate_Rank_Meaning (
120     P_Init_Msg_List       IN   VARCHAR2     := FND_API.G_FALSE,
121     P_Validation_mode     IN   VARCHAR2,
122     p_sales_lead_rank_rec IN   AS_SALES_LEAD_RANKS_PUB.sales_lead_rank_rec_type,
123     X_Return_Status       OUT NOCOPY  VARCHAR2,
124     X_Msg_Count           OUT NOCOPY  NUMBER,
125     X_Msg_Data            OUT NOCOPY  VARCHAR2
126     )
127 IS
128     CURSOR C_Get_Meaning (c_meaning VARCHAR2) IS
129         SELECT b.rank_id
130         FROM   AS_SALES_LEAD_RANKS_B b, AS_SALES_LEAD_RANKS_TL tl
131         WHERE  b.rank_id = tl.rank_id
132                and b.enabled_flag = 'Y'
133                and tl.meaning = c_meaning;
134 
135     l_rank_id  NUMBER;
136 
137 BEGIN
138       -- Initialize message list IF p_init_msg_list is set to TRUE.
139       IF FND_API.to_Boolean( p_init_msg_list )
140       THEN
141           FND_MSG_PUB.initialize;
142       END IF;
143 
144       -- Initialize API return status to SUCCESS
145       x_return_status := FND_API.G_RET_STS_SUCCESS;
146      IF upper(nvl(p_sales_lead_rank_rec.enabled_flag,'N')) = 'Y'
147      THEN
148       -- Validate if the meaning is duplicate
149       OPEN C_Get_Meaning (p_sales_lead_rank_rec.meaning);
150       FETCH C_Get_Meaning INTO l_rank_id;
151       IF C_Get_Meaning%FOUND
152       THEN
153           -- ffang 040501, for bug 1713105, check if rank_id is null
154           -- IF p_sales_lead_rank_rec.rank_id <> l_rank_id
155           IF nvl(p_sales_lead_rank_rec.rank_id,0) <> l_rank_id
156           THEN
157               IF (AS_DEBUG_LOW_ON) THEN
158 
159               AS_UTILITY_PVT.Debug_Message(FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW,
160                          'Duplicate rank : '|| p_sales_lead_rank_rec.meaning);
161               END IF;
162 
163               AS_UTILITY_PVT.Set_Message(
164                   p_msg_level     => FND_MSG_PUB.G_MSG_LVL_ERROR,
165                   p_msg_name      => 'ASF_DUPLICATE_RANK',
166                   p_token1        => 'MEANING',
167                   p_token1_value  =>  p_sales_lead_rank_rec.meaning);
168 
169               x_return_status := FND_API.G_RET_STS_ERROR;
170           END IF;
171       END IF;
172       CLOSE C_Get_Meaning;
173       END IF;
174       -- Standard call to get message count and IF count is 1, get message info.
175       FND_MSG_PUB.Count_And_Get
176       (  p_count          =>   x_msg_count,
177          p_data           =>   x_msg_data );
178 
179 END Validate_Rank_Meaning;
180 
181 
182 PROCEDURE Validate_PRECEDENCE (
183     P_Init_Msg_List              IN   VARCHAR2     := FND_API.G_FALSE,
184     P_Validation_mode            IN   VARCHAR2,
185     P_PRECEDENCE                 IN   NUMBER,
186     p_sales_lead_rank_id         IN   NUMBER,
187     X_Return_Status              OUT NOCOPY  VARCHAR2,
188     X_Msg_Count                  OUT NOCOPY  NUMBER,
189     X_Msg_Data                   OUT NOCOPY  VARCHAR2
190     )
191 IS
192     CURSOR C_Get_Rating (c_precedence NUMBER) IS
193         SELECT rank_id
194         FROM   AS_SALES_LEAD_RANKS_B
195         WHERE  enabled_flag = 'Y'
196         AND    min_score = c_precedence;
197 
198     l_sales_lead_rank_id   NUMBER;
199 
200 BEGIN
201 
202       -- Initialize message list if p_init_msg_list is set to TRUE.
203       IF FND_API.to_Boolean( p_init_msg_list )
204       THEN
205           FND_MSG_PUB.initialize;
206       END IF;
207 
208 
209       -- Initialize API return status to SUCCESS
210       x_return_status := FND_API.G_RET_STS_SUCCESS;
211 
212       -- validate NOT NULL column
213       IF(p_PRECEDENCE is NULL OR p_PRECEDENCE = FND_API.G_MISS_NUM)
214       THEN
215           AS_UTILITY_PVT.Set_Message(
216               p_msg_level     => FND_MSG_PUB.G_MSG_LVL_ERROR,
217               p_msg_name      => 'API_MISSING_ID',
218               p_token1        => 'PRECEDENCE',
219               p_token1_value  => p_PRECEDENCE);
220           x_return_status := FND_API.G_RET_STS_ERROR;
221       END IF;
222 
223 
224       IF(p_validation_mode = AS_UTILITY_PVT.G_CREATE)
225       THEN
226           -- Hint: Validate data
227           -- IF p_PRECEDENCE is not NULL and p_PRECEDENCE <> G_MISS_CHAR
228           -- verify if data is valid
229           -- if data is not valid : x_return_status := FND_API.G_RET_STS_ERROR;
230 
231       OPEN C_Get_Rating(p_PRECEDENCE);
232       FETCH C_Get_Rating INTO l_sales_lead_rank_id;
233 
234       IF C_Get_Rating%FOUND
235       THEN
236           AS_UTILITY_PVT.Set_Message(
237               p_msg_level     => FND_MSG_PUB.G_MSG_LVL_ERROR,
238               p_msg_name      => 'AS_DUPE_PRECEDENCE');
239 
240           x_return_status := FND_API.G_RET_STS_ERROR;
241       END IF;
242       CLOSE C_Get_Rating;
243 
244       ELSIF(p_validation_mode = AS_UTILITY_PVT.G_UPDATE)
245       THEN
246           -- Hint: Validate data
247           -- IF p_PRECEDENCE <> G_MISS_CHAR
248           -- verify if data is valid
249           -- if data is not valid : x_return_status := FND_API.G_RET_STS_ERROR;
250 
251       OPEN C_Get_Rating(p_PRECEDENCE);
252       FETCH C_Get_Rating INTO l_sales_lead_rank_id;
253 
254       IF C_Get_Rating%FOUND
255       THEN
256         IF (l_sales_lead_rank_id <> p_sales_lead_rank_id) THEN
257             AS_UTILITY_PVT.Set_Message(
258               p_msg_level     => FND_MSG_PUB.G_MSG_LVL_ERROR,
259               p_msg_name      => 'AS_DUPE_PRECEDENCE');
260 
261           x_return_status := FND_API.G_RET_STS_ERROR;
262 
263         END IF;
264 
265       END IF;
266       CLOSE C_Get_Rating;
267 
268       END IF;
269 
270       -- Standard call to get message count and if count is 1, get message info.
271       FND_MSG_PUB.Count_And_Get
272       (  p_count          =>   x_msg_count,
273          p_data           =>   x_msg_data
274       );
275 
276 END Validate_PRECEDENCE;
277 
278 
279 PROCEDURE Validate_USED_RANK (
280     P_Init_Msg_List              IN   VARCHAR2     := FND_API.G_FALSE,
281     P_Validation_mode            IN   VARCHAR2,
282     P_Sales_Lead_Rank_Id         IN   NUMBER,
283     X_Return_Status              OUT NOCOPY  VARCHAR2,
284     X_Msg_Count                  OUT NOCOPY  NUMBER,
285     X_Msg_Data                   OUT NOCOPY  VARCHAR2
286     )
287 IS
288     CURSOR C_Get_Lead_Using_Rank (c_sales_lead_rank_id NUMBER) IS
289         SELECT 1
290         FROM   AS_SALES_LEADS
291         WHERE  lead_rank_id = c_sales_lead_rank_id;
292     l_dummy NUMBER;
293     l_default_profile NUMBER;
294     l_sql_text VARCHAR2(500);
295 
296     TYPE c_attr_type IS REF CURSOR;
297     lc_rule_cursor c_attr_type;
298 
299     BEGIN
300 
301       -- Initialize message list if p_init_msg_list is set to TRUE.
302       IF FND_API.to_Boolean( p_init_msg_list )
303       THEN
304           FND_MSG_PUB.initialize;
305       END IF;
306 
307 
308       -- Initialize API return status to SUCCESS
309       x_return_status := FND_API.G_RET_STS_SUCCESS;
310 
311 
312       l_default_profile := to_number( nvl(fnd_profile.value('AS_DEFAULT_LEAD_ENGINE_RANK'), '-1'));
313 
314       IF (p_validation_mode = AS_UTILITY_PVT.G_UPDATE) THEN
315 
316 	-- first check if profile is using this rating
317       	if (p_sales_lead_rank_id = l_default_profile) then
318       		AS_UTILITY_PVT.Set_Message(
319                     p_msg_level     => FND_MSG_PUB.G_MSG_LVL_ERROR,
320                     p_msg_name      => 'AS_USED_RANK');
321 
322       	        --x_return_status := FND_API.G_RET_STS_ERROR;
323           	raise FND_API.G_EXC_ERROR;
324 
325 
326     	end if;
327 
328     	-- now check if any lead is using this rating.
329 
330     	OPEN C_Get_Lead_Using_Rank(p_sales_lead_rank_id);
331         FETCH C_Get_Lead_Using_Rank INTO l_dummy;
332 
333 
334 	IF C_Get_Lead_Using_Rank%FOUND
335 	THEN
336 	  AS_UTILITY_PVT.Set_Message(
337 	    p_msg_level     => FND_MSG_PUB.G_MSG_LVL_ERROR,
338 	    p_msg_name      => 'AS_USED_RANK');
339           CLOSE C_Get_Lead_Using_Rank;
340 	  raise FND_API.G_EXC_ERROR;
341 	END IF;
342 	CLOSE C_Get_Lead_Using_Rank;
343 
344 
345 
346     	-- now check if any rule is referring to this rating.
347 
348     	l_sql_text := 'select 1 from pv_process_rules_b where process_type = ''LEAD_RATING'' and action_value = to_char(:p_sales_lead_rank_id)';
349 
350     	OPEN lc_rule_cursor FOR l_sql_text USING p_sales_lead_rank_id;
351     	FETCH lc_rule_cursor INTO l_dummy;
352     	CLOSE lc_rule_cursor;
353 
354     	if (l_dummy = 1)
355     	then
356     	  AS_UTILITY_PVT.Set_Message(
357 		    p_msg_level     => FND_MSG_PUB.G_MSG_LVL_ERROR,
358 		    p_msg_name      => 'AS_USED_RANK');
359 
360 	  raise FND_API.G_EXC_ERROR;
361     	end if;
362 
363 
364       END IF;
365 
366 
367       -- Standard call to get message count and if count is 1, get message info.
368       FND_MSG_PUB.Count_And_Get
369       (  p_count          =>   x_msg_count,
370          p_data           =>   x_msg_data
371       );
372 
373 END Validate_USED_RANK;
374 
375 
376 
377 
378 PROCEDURE Create_Rank (
379     p_api_version         IN NUMBER := 2.0,
380     p_init_msg_list       IN VARCHAR2 := FND_API.G_FALSE,
381     p_commit              IN VARCHAR2 := FND_API.G_FALSE,
382     p_validation_level    IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
383     x_return_status       OUT NOCOPY VARCHAR2,
384     x_msg_count           OUT NOCOPY NUMBER,
385     x_msg_data            OUT NOCOPY VARCHAR2,
386     p_sales_lead_rank_rec IN AS_SALES_LEAD_RANKS_PUB.sales_lead_rank_rec_type,
387     x_sales_lead_rank_id  OUT NOCOPY NUMBER)
388 IS
389     l_api_name        CONSTANT VARCHAR2(30) := 'Create_Rank';
390     l_api_version     CONSTANT NUMBER := 2.0;
391     l_return_status   VARCHAR2(1);
392     l_msg_count       NUMBER;
393     l_msg_data        VARCHAR2(32767);
394     l_commit          VARCHAR2(1);
395     l_sales_lead_rank_rec AS_SALES_LEAD_RANKS_PUB.sales_lead_rank_rec_type;
396     l_rank_id         NUMBER;
397     l_dummy CHAR(1);
398     l_new_min_score NUMBER;
399     l_new_max_score NUMBER;
400     l_is_old_engine   VARCHAR2(1) := 'Y';
401 
402     CURSOR c1 IS
403       SELECT 'X' FROM AS_SALES_LEAD_RANKS_B
404       WHERE rank_id = p_sales_lead_rank_rec.RANK_ID;
405 
406     CURSOR c2 IS
407       SELECT MAX(MIN_SCORE) FROM AS_SALES_LEAD_RANKS_B;
408 
409 
410 BEGIN
411      -- Standard start of API savepoint
412      SAVEPOINT     Create_Rank_PVT;
413 
414      -- Standard call to check for call compatibility
415      IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version,
416                                         l_api_name, G_PKG_NAME)
417      THEN
418           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
419      END IF;
420 
421      -- Initialize message list if p_init_msg_list is set to TRUE
422      IF FND_API.To_Boolean(p_init_msg_list) THEN
423           FND_MSG_PUB.initialize;
424      END IF;
425 
426      -- Initialize API return status to success
427      x_return_status := FND_API.G_RET_STS_SUCCESS;
428 
429      -- API body
430      OPEN c1;
431      FETCH c1 INTO l_dummy;
432      IF c1%FOUND THEN
433          CLOSE c1;
434          --dbms_output.put_line('duplicate found ');
435          FND_MESSAGE.SET_NAME('AS', 'AS_DUPE_RANK');
436          -- Add message to API message list
437          FND_MSG_PUB.Add;
438          RAISE FND_API.G_EXC_ERROR;
439      END IF;
440      CLOSE c1;
441 
442   /*  OPEN c2;
443     FETCH c2 into l_new_min_score;
444     IF c2%NOTFOUND THEN
445        l_new_min_score := 0;
446     ELSE
447     	l_new_min_score := l_new_min_score + 1;
448     END IF;
449     CLOSE c2;
450 
451     l_new_max_score := l_new_min_score; */
452 
453     l_sales_lead_rank_rec := p_sales_lead_rank_rec;
454 
455     /*l_sales_lead_rank_rec.min_score := l_new_min_score;
456     l_sales_lead_rank_rec.max_score := l_new_max_score;
457  */
458 
459  /*
460    Code to ensure that both new and old rank and rating engines work together
461  */
462 
463     IF l_sales_lead_rank_rec.max_score is NULL
464 	THEN
465 	l_sales_lead_rank_rec.max_score := l_sales_lead_rank_rec.min_score;
466 	l_is_old_engine   := 'N';
467     END IF;
468 
469 
470  /* The Validate precedence routine is called only if the caller is the new rating setup screen*/
471 
472     IF	l_is_old_engine = 'N'
473       THEN
474 	     Validate_PRECEDENCE(
475 		   p_init_msg_list          => FND_API.G_FALSE,
476 		   p_validation_mode        => AS_UTILITY_PVT.G_CREATE,
477 		   p_PRECEDENCE             => P_SALES_LEAD_RANK_Rec.MIN_SCORE,
478 	           p_SALES_LEAD_RANK_ID     => -1,
479 		   x_return_status          => x_return_status,
480 		   x_msg_count              => x_msg_count,
481 		   x_msg_data               => x_msg_data);
482 	       IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
483 		   raise FND_API.G_EXC_ERROR;
484 	     END IF;
485    END IF; /* end if l_is_old_engine = 'N' */
486 
487 
488 /*
489      -- Check score range
490      Validate_Score_Range (
491          P_Init_Msg_List       => FND_API.G_FALSE,
492          P_Validation_mode     => AS_UTILITY_PVT.G_CREATE,
493          p_sales_lead_rank_rec => l_sales_lead_rank_rec,
494 	 p_is_old_engine       => l_is_old_engine,
495          X_Return_Status       => x_return_status,
496          X_Msg_Count           => x_msg_count,
497          X_Msg_Data            => x_msg_data
498          );
499 
500      IF x_return_status<>FND_API.G_RET_STS_SUCCESS THEN
501          RAISE FND_API.G_EXC_ERROR;
502      END IF;
503 
504 */
505 
506 
507      -- Check duplicate rank
508      Validate_Rank_Meaning (
509          P_Init_Msg_List       => FND_API.G_FALSE,
510          P_Validation_mode     => AS_UTILITY_PVT.G_CREATE,
511          p_sales_lead_rank_rec => l_sales_lead_rank_rec,
512          X_Return_Status       => x_return_status,
513          X_Msg_Count           => x_msg_count,
514          X_Msg_Data            => x_msg_data
515          );
516 
517      IF x_return_status<>FND_API.G_RET_STS_SUCCESS THEN
518          RAISE FND_API.G_EXC_ERROR;
519      END IF;
520 
521      -- get the nextval from the sequence as rank_id
522      select as_sales_lead_ranks_s.nextval into l_rank_id from dual;
523      -- this is being commented out since this occurs before now
524      --l_sales_lead_rank_rec := p_sales_lead_rank_rec;
525      l_sales_lead_rank_rec.rank_id := l_rank_id;
526 
527      --  X_CREATION_DATE in DATE,
528      --  X_CREATED_BY in NUMBER,
529 
530      --dbms_output.put_line('before insert Row');
531      AS_SALES_LEAD_RANKS_PKG.Insert_Row(
532          x_RANK_ID            => l_sales_lead_rank_rec.RANK_ID,
533          x_MIN_SCORE          => l_sales_lead_rank_rec.MIN_SCORE,
534 -- use the same min_score as the max_score as well. Ignore the max_score passed in
535 
536          x_MAX_SCORE          => l_sales_lead_rank_rec.MAX_SCORE,
537          x_enabled_flag       => l_sales_lead_rank_rec.enabled_flag,
538          x_meaning            => l_sales_lead_rank_rec.meaning,
539          x_description        => l_sales_lead_rank_rec.description,
540          x_creation_date      => sysdate,
541          x_created_by         => FND_GLOBAL.user_id,
542          X_LAST_UPDATE_DATE   => sysdate,
543          X_LAST_UPDATED_BY    => FND_GLOBAL.user_id,
544          X_LAST_UPDATE_LOGIN  => FND_GLOBAL.user_id
545          );
546      x_sales_lead_rank_id := l_sales_lead_rank_rec.rank_id;
547      --dbms_output.put_line('private API returns ' || x_return_status);
548 
549      -- End of API body
550 
551      -- Standard check of p_commit
552      IF FND_API.To_Boolean(p_commit) THEN
553           COMMIT WORK;
554      END IF;
555 
556      -- Standard call to get message count and if count is 1, get message info
557      FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
558 
559 EXCEPTION
560 
561      WHEN FND_API.G_EXC_ERROR THEN
562           ROLLBACK TO Create_Rank_PVT;
563           x_return_status := FND_API.G_RET_STS_ERROR;
564           FND_MSG_PUB.Count_And_Get(
565               p_count => x_msg_count,
566               p_data => x_msg_data);
567 
568      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
569           ROLLBACK TO Create_Rank_PVT;
570           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
571           FND_MSG_PUB.Count_And_Get(
572               p_count => x_msg_count,
573               p_data => x_msg_data);
574 
575      WHEN OTHERS THEN
576           ROLLBACK TO Create_Rank_PVT;
577           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
578           IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
579                FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
580           END IF;
581           FND_MSG_PUB.Count_And_Get(
582               p_count => x_msg_count,
583               p_data => x_msg_data);
584 END Create_Rank;
585 
586 
587 PROCEDURE Update_Rank (
588     p_api_version         IN NUMBER := 2.0,
589     p_init_msg_list       IN VARCHAR2 := FND_API.G_FALSE,
590     p_commit              IN VARCHAR2 := FND_API.G_FALSE,
591     p_validation_level    IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
592     x_return_status       OUT NOCOPY VARCHAR2,
593     x_msg_count           OUT NOCOPY NUMBER,
594     x_msg_data            OUT NOCOPY VARCHAR2,
595     p_sales_lead_rank_rec IN AS_SALES_LEAD_RANKS_PUB.sales_lead_rank_rec_type)
596 IS
597     l_api_name        CONSTANT VARCHAR2(30) := 'Update_Rank';
598     l_api_version     CONSTANT NUMBER := 2.0;
599     l_return_status   VARCHAR2(1);
600     l_msg_count       NUMBER;
601     l_msg_data        VARCHAR2(32767);
602     l_sales_lead_rank_rec AS_SALES_LEAD_RANKS_PUB.sales_lead_rank_rec_type;
603     l_dummy CHAR(1);
604     l_is_old_engine   VARCHAR2(1) := 'Y';
605 
606     CURSOR c1 IS
607         SELECT enabled_flag, min_score FROM AS_SALES_LEAD_RANKS_B
608         WHERE rank_id = p_sales_lead_rank_rec.RANK_ID;
609     l_enabled_flag    VARCHAR(1);
610     l_min_score       NUMBER;
611     l_request_id      NUMBER;
612 
613     -- 120400 ffang, update API should check if the record has been update by
614     -- someone else or not.
615     CURSOR c_get_last_update IS
616         SELECT last_update_date FROM AS_SALES_LEAD_RANKS_B
617         WHERE rank_id = p_sales_lead_rank_rec.RANK_ID;
618     l_last_update_date  DATE;
619 
620 BEGIN
621     -- Standard start of API savepoint
622     SAVEPOINT     Update_Rank_PVT;
623 
624     -- Standard call to check for call compatibility
625     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version,
626                                        l_api_name, G_PKG_NAME)
627     THEN
628         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
629     END IF;
630 
631     -- Initialize message list if p_init_msg_list is set to TRUE
632     IF FND_API.To_Boolean(p_init_msg_list) THEN
633         FND_MSG_PUB.initialize;
634     END IF;
635 
636     l_sales_lead_rank_rec := p_sales_lead_rank_rec;
637 
638     -- Initialize API return status to success
639     x_return_status := FND_API.G_RET_STS_SUCCESS;
640 
641     -- API body
642     OPEN c1;
643     FETCH c1 INTO l_enabled_flag, l_min_score;
644     IF (c1%NOTFOUND) THEN
645       CLOSE c1;
646       RAISE NO_DATA_FOUND;
647     END IF;
648     CLOSE c1;
649 
650     -- 120400 ffang, Check Whether record has been changed by someone else
651     IF (p_sales_lead_rank_rec.last_update_date is NULL or
652         p_sales_lead_rank_rec.last_update_date = FND_API.G_MISS_Date )
653     THEN
654         IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
655         THEN
656              FND_MESSAGE.Set_Name('AS', 'API_MISSING_ID');
657              FND_MESSAGE.Set_Token('COLUMN', 'LAST_UPDATE_DATE', FALSE);
658              FND_MSG_PUB.ADD;
659         END IF;
660         raise FND_API.G_EXC_ERROR;
661     END IF;
662 
663     OPEN c_get_last_update;
664     FETCH c_get_last_update into l_last_update_date;
665     IF (c_get_last_update%NOTFOUND) THEN
666         IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
667         THEN
668             FND_MESSAGE.Set_Name('AS', 'API_MISSING_UPDATE_TARGET');
669             FND_MESSAGE.Set_Token ('INFO', 'SALES_LEAD_RANK', FALSE);
670             FND_MSG_PUB.Add;
671         END IF;
672         CLOSE c_get_last_update;
673 
674         raise FND_API.G_EXC_ERROR;
675     END IF;
676     CLOSE c_get_last_update;
677 
678     IF (p_sales_lead_rank_rec.last_update_date <> l_last_update_date)
679     THEN
680         IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
681         THEN
682             FND_MESSAGE.Set_Name('AS', 'API_RECORD_CHANGED');
683             FND_MESSAGE.Set_Token('INFO', 'SALES_LEAD', FALSE);
684             FND_MSG_PUB.ADD;
685         END IF;
686         raise FND_API.G_EXC_ERROR;
687     END IF;
688 
689     -- Check score range
690     -- 120200 FFANG for bug 1520911
691     -- Only validate score range when either min score or max score passed in
692     -- then do the validataion
693 
694 
695 
696 
697     IF p_sales_lead_rank_rec.min_score is not null
698     THEN
699 
700         IF l_sales_lead_rank_rec.max_score is NULL
701 		THEN
702 		l_sales_lead_rank_rec.max_score := l_sales_lead_rank_rec.min_score;
703 		l_is_old_engine   := 'N';
704 
705         END IF;
706 
707  /* The Validate precedence routine is called only if the caller is the new rating setup screen*/
708 
709 	IF l_is_old_engine = 'N'
710 	THEN
711 	    Validate_PRECEDENCE(
712 		   p_init_msg_list          => FND_API.G_FALSE,
713 		   p_validation_mode        => AS_UTILITY_PVT.G_UPDATE,
714 		   p_PRECEDENCE             => P_SALES_LEAD_RANK_Rec.MIN_SCORE,
715 	       p_sales_lead_rank_id     => P_SALES_LEAD_RANK_Rec.RANK_ID,
716 		   x_return_status          => x_return_status,
717 		   x_msg_count              => x_msg_count,
718 		   x_msg_data               => x_msg_data);
719 	       IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
720 		   raise FND_API.G_EXC_ERROR;
721 	     END IF;
722          END IF;
723 
724 /*
725 	-- Check score range
726         Validate_Score_Range (
727            P_Init_Msg_List       => FND_API.G_FALSE,
728            P_Validation_mode     => AS_UTILITY_PVT.G_CREATE,
729            p_sales_lead_rank_rec => l_sales_lead_rank_rec,
730            p_is_old_engine       => l_is_old_engine,
731            X_Return_Status       => x_return_status,
732            X_Msg_Count           => x_msg_count,
733            X_Msg_Data            => x_msg_data
734            );
735 
736        IF x_return_status<>FND_API.G_RET_STS_SUCCESS THEN
737            RAISE FND_API.G_EXC_ERROR;
738        END IF;
739 */
740     END IF;
741 
742     -- Check duplicate rank only when meaning is passed in
743     IF p_sales_lead_rank_rec.meaning is not null THEN
744          Validate_Rank_Meaning (
745              P_Init_Msg_List       => FND_API.G_FALSE,
746              P_Validation_mode     => AS_UTILITY_PVT.G_UPDATE,
747              p_sales_lead_rank_rec => p_sales_lead_rank_rec,
748              X_Return_Status       => x_return_status,
749              X_Msg_Count           => x_msg_count,
750              X_Msg_Data            => x_msg_data
751              );
752 
753          IF x_return_status<>FND_API.G_RET_STS_SUCCESS THEN
754              RAISE FND_API.G_EXC_ERROR;
755          END IF;
756     END IF;
757 
758 
759     -- Cannot disable a rank if used by profile or by a lead
760     IF (l_enabled_flag = 'Y' and p_sales_lead_rank_rec.enabled_flag <> 'Y') THEN
761          Validate_USED_RANK(
762              P_Init_Msg_List       => FND_API.G_FALSE,
763              P_Validation_mode     => AS_UTILITY_PVT.G_UPDATE,
764              p_sales_lead_rank_id =>  p_sales_lead_rank_rec.rank_id,
765              X_Return_Status       => x_return_status,
766              X_Msg_Count           => x_msg_count,
767              X_Msg_Data            => x_msg_data
768              );
769 
770          IF x_return_status<>FND_API.G_RET_STS_SUCCESS THEN
771              RAISE FND_API.G_EXC_ERROR;
772          END IF;
773     END IF;
774 
775 
776 
777     --dbms_output.put_line('before update Row');
778     AS_SALES_LEAD_RANKS_PKG.Update_Row(
779         x_RANK_ID            => l_sales_lead_rank_rec.RANK_ID,
780         x_MIN_SCORE          => l_sales_lead_rank_rec.MIN_SCORE,
781         x_MAX_SCORE          => l_sales_lead_rank_rec.MAX_SCORE,
782         x_enabled_flag       => l_sales_lead_rank_rec.enabled_flag,
783         x_meaning            => l_sales_lead_rank_rec.meaning,
784         x_description        => l_sales_lead_rank_rec.description,
785         X_LAST_UPDATE_DATE   => sysdate,
786         X_LAST_UPDATED_BY    => FND_GLOBAL.user_id,
787         X_LAST_UPDATE_LOGIN  => FND_GLOBAL.user_id
788         );
789 
790     IF l_min_score <> p_sales_lead_rank_rec.min_score
791     THEN
792         -- Run concurrent program for the rank.
793         -- Update as_sales_leads.lead_rank_score and
794         -- as_accesses_all.lead_rank_score
795         l_request_id := FND_REQUEST.SUBMIT_REQUEST('AS',
796                             'ASXSLRS',
797                             'Update LEAD_RANK_SCORE',
798                             '',
799                             FALSE,
800                             p_sales_lead_rank_rec.rank_id,
801                             p_sales_lead_rank_rec.min_score);
802 
803     END IF;
804     -- End of API body
805 
806     -- Standard check of p_commit
807     IF FND_API.To_Boolean(p_commit) THEN
808           COMMIT WORK;
809     END IF;
810 
811     -- Standard call to get message count and if count is 1, get message info
812     FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
813 
814 EXCEPTION
815     WHEN FND_API.G_EXC_ERROR THEN
816           ROLLBACK TO Update_Rank_PVT;
817           x_return_status := FND_API.G_RET_STS_ERROR;
818           FND_MSG_PUB.Count_And_Get(
819                p_count => x_msg_count,
820                p_data => x_msg_data);
821 
822     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
823           ROLLBACK TO Update_Rank_PVT;
824           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
825           FND_MSG_PUB.Count_And_Get(
826                p_count => x_msg_count,
827                p_data => x_msg_data);
828 
829     WHEN OTHERS THEN
830           ROLLBACK TO Update_Rank_PVT;
831           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
832           IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
833                FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
834           END IF;
835           FND_MSG_PUB.Count_And_Get(
836                p_count => x_msg_count,
837                p_data => x_msg_data);
838 END Update_Rank;
839 
840 
841 Procedure Delete_Rank (
842     p_api_version         IN NUMBER := 2.0,
843     p_init_msg_list       IN VARCHAR2 := FND_API.G_FALSE,
844     p_commit              IN VARCHAR2 := FND_API.G_FALSE,
845     p_validation_level    IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
846     x_return_status       OUT NOCOPY VARCHAR2,
847     x_msg_count           OUT NOCOPY NUMBER,
848     x_msg_data            OUT NOCOPY VARCHAR2,
849     p_sales_lead_rank_id  IN NUMBER)
850 IS
851     l_api_name        CONSTANT VARCHAR2(30) := 'Delete_Rank';
852     l_api_version     CONSTANT NUMBER := 2.0;
853     l_return_status   VARCHAR2(1);
854     l_msg_count       NUMBER;
855     l_msg_data        VARCHAR2(32767);
856     l_sales_lead_rank_id NUMBER;
857     l_dummy CHAR(1);
858     l_default_profile NUMBER;
859     l_sql_text VARCHAR2(500);
860     l_dummy2 NUMBER;
861 
862     TYPE c_attr_type IS REF CURSOR;
863     lc_rule_cursor c_attr_type;
864 
865 
866     CURSOR C_Get_Lead_Using_Rank (c_sales_lead_rank_id NUMBER) IS
867         SELECT 1
868         FROM   AS_SALES_LEADS
869         WHERE  lead_rank_id = c_sales_lead_rank_id;
870 
871 
872     CURSOR c1 IS
873         SELECT 'X' FROM AS_SALES_LEAD_RANKS_B
874         WHERE rank_id = p_sales_lead_rank_id;
875 
876 BEGIN
877     -- Standard start of API savepoint
878     SAVEPOINT     Delete_Rank_PVT;
879 
880     -- Standard call to check for call compatibility
881     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version,
882                                        l_api_name, G_PKG_NAME)
883     THEN
884         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
885     END IF;
886 
887     -- Initialize message list if p_init_msg_list is set to TRUE
888     IF FND_API.To_Boolean(p_init_msg_list) THEN
889         FND_MSG_PUB.initialize;
890     END IF;
891 
892     l_sales_lead_rank_id := p_sales_lead_rank_id;
893 
894  FND_MSG_PUB.G_MSG_LEVEL_THRESHOLD := FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW;
895 
896 
897 
898     -- Initialize API return status to success
899     x_return_status := FND_API.G_RET_STS_SUCCESS;
900 
901 
902     -- API body
903     OPEN c1;
904     FETCH c1 INTO l_dummy;
905     --dbms_output.put_line('dummy ' || l_dummy);
906     IF (c1%NOTFOUND) THEN
907         CLOSE c1;
908         --dbms_output.put_line('no data found');
909         RAISE NO_DATA_FOUND;
910     END IF;
911     CLOSE c1;
912 
913 
914     --Validate if seeded rank. If seeded, it should be locked. User delete
915     -- not allowed. A good check for seeded rank is that rank_id < 10000
916 
917     if (l_sales_lead_rank_id < 10000) then
918     	AS_UTILITY_PVT.Set_Message(
919                   p_msg_level     => FND_MSG_PUB.G_MSG_LVL_ERROR,
920                   p_msg_name      => 'AS_SEEDED_RANK');
921 
922          raise FND_API.G_EXC_ERROR;
923     end if;
924 
925     --Do not allow delete on any grade which is referred by any Lead
926     --otherwise it will throw BIM report OUT NOCOPY of sink), disable the rank if
927     -- not to be used.
928 
929           OPEN C_Get_Lead_Using_Rank(l_sales_lead_rank_id);
930 	      FETCH C_Get_Lead_Using_Rank INTO l_dummy;
931 
932 
933 	      IF C_Get_Lead_Using_Rank%FOUND
934 	      THEN
935     		  AS_UTILITY_PVT.Set_Message(
936     		      p_msg_level     => FND_MSG_PUB.G_MSG_LVL_ERROR,
937     		      p_msg_name      => 'AS_USED_RANK');
938 
939     		  CLOSE C_Get_Lead_Using_Rank;
940     		  raise FND_API.G_EXC_ERROR;
941 	      END IF;
942 	      CLOSE C_Get_Lead_Using_Rank;
943 
944     -- Do not allow delete on any grade which is set in the profile value
945 
946           l_default_profile := to_number( nvl(fnd_profile.value('AS_DEFAULT_LEAD_ENGINE_RANK'), '-1'));
947 
948 
949 	      if (l_sales_lead_rank_id = l_default_profile) then
950 		      AS_UTILITY_PVT.Set_Message(
951         		  p_msg_level     => FND_MSG_PUB.G_MSG_LVL_ERROR,
952 		          p_msg_name      => 'AS_USED_RANK');
953 
954        	   	  raise FND_API.G_EXC_ERROR;
955 
956            end if;
957 
958 
959    -- now check if any rule is referring to this rating.
960 
961 	l_sql_text := 'select 1 from pv_process_rules_b where process_type = ''LEAD_RATING'' and action_value = to_char(:l_sales_lead_rank_id)';
962 
963 	OPEN lc_rule_cursor FOR l_sql_text USING l_sales_lead_rank_id;
964 	FETCH lc_rule_cursor INTO l_dummy2;
965 	CLOSE lc_rule_cursor;
966 
967 	if (l_dummy2= 1)
968 	then
969 	  AS_UTILITY_PVT.Set_Message(
970 		    p_msg_level     => FND_MSG_PUB.G_MSG_LVL_ERROR,
971 		    p_msg_name      => 'AS_USED_RANK');
972 
973 	  raise FND_API.G_EXC_ERROR;
974 	end if;
975 
976 
977 
978     AS_SALES_LEAD_RANKS_PKG.Delete_Row(X_RANK_ID => l_sales_lead_rank_id);
979     -- End of API body
980 
981 
982 
983 
984     -- Standard check of p_commit
985     IF FND_API.To_Boolean(p_commit) THEN
986         COMMIT WORK;
987     END IF;
988 
989     -- Standard call to get message count and if count is 1, get message info
990     FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
991 
992 EXCEPTION
993     WHEN FND_API.G_EXC_ERROR THEN
994           ROLLBACK TO Delete_Rank_PVT;
995           x_return_status := FND_API.G_RET_STS_ERROR;
996           FND_MSG_PUB.Count_And_Get(
997               p_count => x_msg_count,
998               p_data => x_msg_data);
999 
1000     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1001           ROLLBACK TO Delete_Rank_PVT;
1002           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1003           FND_MSG_PUB.Count_And_Get(
1004               p_count => x_msg_count,
1005               p_data => x_msg_data);
1006 
1007     WHEN OTHERS THEN
1008           ROLLBACK TO Delete_Rank_PVT;
1009           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1010           IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1011                FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
1012           END IF;
1013           FND_MSG_PUB.Count_And_Get(
1014               p_count => x_msg_count,
1015               p_data => x_msg_data);
1016 END DELETE_RANK;
1017 
1018 
1019 PROCEDURE UPDATE_LEAD_RANK_SCORE(
1020   ERRBUF                  OUT NOCOPY VARCHAR2,
1021   RETCODE                 OUT NOCOPY VARCHAR2,
1022   X_LEAD_RANK_ID          IN         NUMBER,
1023   X_LEAD_RANK_SCORE       IN         NUMBER)
1024 IS
1025 BEGIN
1026     --Update the as_sales_leads.lead_rank_score
1027     Write_log (1, 'Updating the as_sales_leads.lead_rank_score');
1028     UPDATE as_sales_leads sl
1029        SET sl.lead_rank_score = x_lead_rank_score
1030          , sl.last_update_date = sysdate
1031          , sl.last_updated_by = fnd_global.user_id
1032          , sl.last_update_login = fnd_global.conc_login_id
1033      WHERE sl.lead_rank_id = x_lead_rank_id;
1034 
1035     --Update the as_accesses_all.lead_rank_score
1036     Write_log (1, 'Updating the as_accesses_all.lead_rank_score');
1037     UPDATE AS_ACCESSES_ALL acc
1038        SET acc.lead_rank_score = x_lead_rank_score
1039          , acc.last_update_date = sysdate
1040          , acc.last_updated_by = fnd_global.user_id
1041          , acc.last_update_login = fnd_global.conc_login_id
1042      WHERE acc.sales_lead_id IN
1043             (select sl.sales_lead_id
1044              from as_sales_leads sl
1045              where sl.lead_rank_id = x_lead_rank_id);
1046 
1047 EXCEPTION
1048     WHEN FND_API.G_EXC_ERROR THEN
1049          ERRBUF := ERRBUF || sqlerrm;
1050          RETCODE := FND_API.G_RET_STS_ERROR;
1051          ROLLBACK;
1052          Write_log (1, 'Error in as_sales_lead_ranks_pvt.update_lead_rank_score');
1053          Write_log (1, 'SQLCODE ' || to_char(SQLCODE) ||
1054                    ' SQLERRM ' || substr(SQLERRM, 1, 100));
1055     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1056          ERRBUF := ERRBUF||sqlerrm;
1057          RETCODE := FND_API.G_RET_STS_UNEXP_ERROR;
1058          ROLLBACK;
1059          Write_Log(1, 'Unexpected error in as_sales_lead_ranks_pvt.update_lead_rank_score');
1060     WHEN others THEN
1061         ERRBUF := SQLERRM;
1062         RETCODE := FND_API.G_RET_STS_UNEXP_ERROR;
1063         ROLLBACK;
1064         Write_Log(1, 'Exception: others in as_sales_lead_ranks_pvt.update_lead_rank_score');
1065             Write_Log(1, 'SQLCODE ' || to_char(SQLCODE) ||
1066                  ' SQLERRM ' || substr(SQLERRM, 1, 100));
1067 end UPDATE_LEAD_RANK_SCORE;
1068 
1069 
1070 PROCEDURE Write_Log(p_which NUMBER, p_msg VARCHAR2) IS
1071 BEGIN
1072     FND_FILE.put(p_which, p_msg);
1073     FND_FILE.new_line(p_which, 1);
1074 END Write_Log;
1075 
1076 END AS_SALES_LEAD_RANKS_PVT;