1 PACKAGE BODY as_status_pub AS
2 /* $Header: asxpstab.pls 115.5 2003/01/28 23:10:11 geliu ship $ */
3
4 -- Declare Global Variables
5 G_PKG_NAME CONSTANT VARCHAR2(30) := 'AS_STATUSES_PUB';
6
7 -- Start of Comments
8 --
9 -- API Name : create_status
10 -- Type : Public
11 -- Function : To create status codes using the table handler
12 -- Pre-Reqs : The table handler API AS_STATUSES_PKG.INSERT_ROW
13 -- should exist
14 -- Parameters :
15 -- IN : p_api_version_number IN NUMBER
16 -- p_init_msg_list IN VARCHAR2
17 -- p_commit IN VARCHAR2
18 -- p_validation_level IN NUMBER
19 -- p_status_rec IN STATUS_Rec_Type
20 -- OUT : x_return_status OUT VARCHAR2
21 -- x_msg_count OUT NUMBER
22 -- x_msg_data OUT VARCHAR2
23 -- Version : 2.0
24 -- Purpose : To create status codes in as_statuses_b,_tl,_vl tables
25 -- Notes : This procedure is a public procedure called using the
26 -- public API as_status_pub to create status codes.
27 --
28 -- End of Comments :
29
30 PROCEDURE create_status (
31 p_api_version_number IN NUMBER,
32 p_init_msg_list IN VARCHAR2 ,
33 p_commit IN VARCHAR2 ,
34 p_validation_level IN NUMBER ,
35 p_status_rec IN STATUS_Rec_Type ,
36 x_return_status OUT VARCHAR2,
37 x_msg_count OUT NUMBER,
38 x_msg_data OUT VARCHAR2)
39 IS
40 -- Declaration of local variables and cursors
41 l_api_version NUMBER := p_api_version_number;
42 l_api_name CONSTANT VARCHAR(30) DEFAULT 'CREATE_STATUS';
43 l_count NUMBER;
44 l_row_id VARCHAR2(2000) DEFAULT ' ';
45 l_creation_date DATE ;
46 l_created_by NUMBER ;
47 l_last_update_date DATE ;
48 l_last_updated_by NUMBER ;
49 l_last_update_login NUMBER ;
50 l_status_rank NUMBER ;
51 l_attribute_category VARCHAR2(30) ;
52 l_attribute1 VARCHAR2(150) ;
53 l_attribute2 VARCHAR2(150) ;
54 l_attribute3 VARCHAR2(150) ;
55 l_attribute4 VARCHAR2(150) ;
56 l_attribute5 VARCHAR2(150) ;
57 l_attribute6 VARCHAR2(150) ;
58 l_attribute7 VARCHAR2(150) ;
59 l_attribute8 VARCHAR2(150) ;
60 l_attribute9 VARCHAR2(150) ;
61 l_attribute10 VARCHAR2(150) ;
62 l_attribute11 VARCHAR2(150) ;
63 l_attribute12 VARCHAR2(150) ;
64 l_attribute13 VARCHAR2(150) ;
65 l_attribute14 VARCHAR2(150) ;
66 l_attribute15 VARCHAR2(150) ;
67 l_description VARCHAR2(240) ;
68
69 -- Cursor for checking duplicate status code
70 CURSOR status_dup_cur(p_status_code IN VARCHAR2) IS
71 SELECT 1
72 FROM as_statuses_vl
73 WHERE TRIM(NLS_UPPER(status_code)) = p_status_code; -- trimmed value passed while opening
74
75 BEGIN
76 -- Standard start of api save point
77 SAVEPOINT create_status;
78
79 -- Initialize Message List
80 IF fnd_api.to_boolean (p_init_msg_list)
81 THEN
82 fnd_msg_pub.initialize;
83 END IF;
84
85 -- Standard Call to check api compatibility
86 IF NOT fnd_api.compatible_api_call (
87 l_api_version,
88 p_api_version_number,
89 l_api_name,
90 G_PKG_NAME
91 )
92 THEN
93 fnd_message.set_name('AS', 'AS_INVALID_VERSION');
94 fnd_msg_pub.add;
95 END IF;
96
97 -- Initialize api return status
98 x_return_status := fnd_api.g_ret_sts_success;
99
100 -- Check if the version number passed is 2.0 else error out
101 IF p_api_version_number <> 2.0
102 THEN
103 fnd_message.set_name('AS', 'AS_INVALID_VERSION');
104 fnd_msg_pub.add;
105 END IF;
106
107
108 -- API Body
109 -- Begin Validation Section
110 -- Check for valid values being passed.
111
112 IF (p_status_rec.enabled_flag NOT IN ('Y','N')
113 OR p_status_rec.enabled_flag = FND_API.G_MISS_CHAR
114 OR TRIM(p_status_rec.enabled_flag) IS NULL)
115 THEN
116 fnd_message.set_name('AS', 'AS_ENABLED_FLAG_INVALID');
117 fnd_msg_pub.add;
118 END IF;
119 IF (p_status_rec.lead_flag NOT IN ('Y','N')
120 OR p_status_rec.lead_flag = FND_API.G_MISS_CHAR
121 OR TRIM(p_status_rec.lead_flag) IS NULL)
122 THEN
123 fnd_message.set_name('AS', 'AS_LEAD_FLAG_INVALID');
124 fnd_msg_pub.add;
125 END IF;
126 IF (p_status_rec.opp_flag NOT IN ('Y','N')
127 OR p_status_rec.opp_flag = FND_API.G_MISS_CHAR
128 OR TRIM(p_status_rec.opp_flag) IS NULL)
129 THEN
130 fnd_message.set_name('AS', 'AS_OPP_FLAG_INVALID');
131 fnd_msg_pub.add;
132 END IF;
133 IF (p_status_rec.opp_open_status_flag NOT IN ('Y','N')
134 OR TRIM(p_status_rec.opp_open_status_flag) = FND_API.G_MISS_CHAR
135 OR TRIM(p_status_rec.opp_open_status_flag) IS NULL)
136 THEN
137 fnd_message.set_name('AS', 'AS_OPP_OPEN_FLAG_INVALID');
138 fnd_msg_pub.add;
139 END IF;
140 IF (p_status_rec.opp_decision_date_flag NOT IN ('Y','N')
141 OR p_status_rec.opp_decision_date_flag = FND_API.G_MISS_CHAR
142 OR TRIM(p_status_rec.opp_decision_date_flag) IS NULL)
143 THEN
144 fnd_message.set_name('AS', 'AS_DECISION_FLAG_INVALID');
145 fnd_msg_pub.add;
146 END IF;
147 IF (p_status_rec.forecast_rollup_flag NOT IN ('Y','N')
148 OR p_status_rec.forecast_rollup_flag = FND_API.G_MISS_CHAR
149 OR TRIM(p_status_rec.forecast_rollup_flag) IS NULL)
150 THEN
151 fnd_message.set_name('AS', 'AS_FORECAST_FLAG_INVALID');
152 fnd_msg_pub.add;
153 END IF;
154
155 IF (p_status_rec.win_loss_indicator NOT IN ('W','L')
156 OR p_status_rec.win_loss_indicator= FND_API.G_MISS_CHAR
157 OR TRIM(p_status_rec.win_loss_indicator) IS NULL)
158 THEN
159 fnd_message.set_name('AS', 'AS_WIN_IND_INVALID');
160 fnd_msg_pub.add;
161 END IF;
162
163 -- Check if the required field Meaning is passed
164 IF (p_status_rec.meaning = FND_API.G_MISS_CHAR
165 OR TRIM(p_status_rec.meaning) IS NULL)
166 THEN
167 fnd_message.set_name('AS', 'AS_MEANING');
168 fnd_msg_pub.add;
169 END IF;
170
171 -- End Validation Section
172
173 -- Check for duplicate or uniqueness of the status code
174 -- Open the cursor and fetch the record.
175
176 OPEN status_dup_cur(TRIM(NLS_UPPER(p_status_rec.status_code)));
177 FETCH status_dup_cur INTO l_count;
178 IF (status_dup_cur%FOUND)
179 THEN
180 fnd_message.set_name('AS', 'AS_DUPLICATE_STATUS_CODE');
181 fnd_message.set_token('STATUS_CODE', p_status_rec.status_code);
182 fnd_msg_pub.add;
183 CLOSE status_dup_cur;
184 END IF;
185 CLOSE status_dup_cur;
186
187 -- Check if the Who columns have any values otherwise default them.
188
189 IF (p_status_rec.creation_date = FND_API.G_MISS_DATE)
190 OR TRIM(p_status_rec.creation_date) IS NULL
191 THEN
192 l_creation_date := sysdate;
193 ELSE
194 l_creation_date := p_status_rec.creation_date ;
195 END IF;
196 IF (p_status_rec.created_by = FND_API.G_MISS_NUM)
197 OR TRIM(p_status_rec.created_by) IS NULL
198 THEN
199 l_created_by := fnd_global.user_id;
200 ELSE
201 l_created_by := p_status_rec.created_by ;
202 END IF;
203 IF (p_status_rec.last_update_date = FND_API.G_MISS_DATE)
204 OR TRIM(p_status_rec.last_update_date) IS NULL
205 THEN
206 l_last_update_date := sysdate;
207 ELSE
208 l_last_update_date := p_status_rec.last_update_date;
209 END IF;
210 IF (p_status_rec.last_update_login = FND_API.G_MISS_NUM)
211 OR TRIM(p_status_rec.last_update_login) IS NULL
212 THEN
213 l_last_update_login := fnd_global.login_id;
214 ELSE
215 l_last_update_login := p_status_rec.last_update_login;
216 END IF;
217 IF (p_status_rec.last_updated_by = FND_API.G_MISS_NUM)
218 OR TRIM(p_status_rec.last_updated_by) IS NULL
219 THEN
220 l_last_updated_by := fnd_global.user_id;
221 ELSE
222 l_last_updated_by := p_status_rec.last_updated_by ;
223 END IF;
224
225 -- Check all optional fields if they have g_miss values then
226 -- replace those with null before inserting.
227
228 IF p_status_rec.status_rank = FND_API.G_MISS_NUM
229 THEN
230 l_status_rank := NULL;
231 ELSE
232 l_status_rank := p_status_rec.status_rank;
233 END IF;
234 IF p_status_rec.attribute_category = FND_API.G_MISS_CHAR
235 THEN
236 l_attribute_category := NULL;
237 ELSE
238 l_attribute_category :=p_status_rec.attribute_category;
239 END IF;
240 IF p_status_rec.attribute1 = FND_API.G_MISS_CHAR
241 THEN
242 l_attribute1 := NULL;
243 ELSE
244 l_attribute1 := p_status_rec.attribute1 ;
245 END IF;
246 IF p_status_rec.attribute2 = FND_API.G_MISS_CHAR
247 THEN
248 l_attribute2 := NULL;
249 ELSE
250 l_attribute2 := p_status_rec.attribute2 ;
251 END IF;
252 IF p_status_rec.attribute3 = FND_API.G_MISS_CHAR
253 THEN
254 l_attribute3 := NULL;
255 ELSE
256 l_attribute3 := p_status_rec.attribute3 ;
257 END IF;
258 IF p_status_rec.attribute4 = FND_API.G_MISS_CHAR
259 THEN
260 l_attribute4 := NULL;
261 ELSE
262 l_attribute4 := p_status_rec.attribute4 ;
263 END IF;
264 IF p_status_rec.attribute5 = FND_API.G_MISS_CHAR
265 THEN
266 l_attribute5 := NULL;
267 ELSE
268 l_attribute5 := p_status_rec.attribute5 ;
269 END IF;
270 IF p_status_rec.attribute6 = FND_API.G_MISS_CHAR
271 THEN
272 l_attribute6 := NULL;
273 ELSE
274 l_attribute6 := p_status_rec.attribute6 ;
275 END IF;
276 IF p_status_rec.attribute7 = FND_API.G_MISS_CHAR
277 THEN
278 l_attribute7 := NULL;
279 ELSE
280 l_attribute7 := p_status_rec.attribute7 ;
281 END IF;
282 IF p_status_rec.attribute8 = FND_API.G_MISS_CHAR
283 THEN
284 l_attribute8 := NULL;
285 ELSE
286 l_attribute8 := p_status_rec.attribute8 ;
287 END IF;
288 IF p_status_rec.attribute9 = FND_API.G_MISS_CHAR
289 THEN
290 l_attribute9 := NULL;
291 ELSE
292 l_attribute9 := p_status_rec.attribute9 ;
293 END IF;
294 IF p_status_rec.attribute10 = FND_API.G_MISS_CHAR
295 THEN
296 l_attribute10 := NULL;
297 ELSE
298 l_attribute10 := p_status_rec.attribute10 ;
299 END IF;
300 IF p_status_rec.attribute11 = FND_API.G_MISS_CHAR
301 THEN
302 l_attribute11 := NULL;
303 ELSE
304 l_attribute11 := p_status_rec.attribute11 ;
305 END IF;
306 IF p_status_rec.attribute12 = FND_API.G_MISS_CHAR
307 THEN
308 l_attribute12 := NULL;
309 ELSE
310 l_attribute12 := p_status_rec.attribute12 ;
311 END IF;
312 IF p_status_rec.attribute13 = FND_API.G_MISS_CHAR
313 THEN
314 l_attribute13 := NULL;
315 ELSE
316 l_attribute13 := p_status_rec.attribute13 ;
317 END IF;
318 IF p_status_rec.attribute14 = FND_API.G_MISS_CHAR
319 THEN
320 l_attribute14 := NULL;
321 ELSE
322 l_attribute14 := p_status_rec.attribute14 ;
323 END IF;
324 IF p_status_rec.attribute15 = FND_API.G_MISS_CHAR
325 THEN
326 l_attribute15 := NULL;
327 ELSE
328 l_attribute15 := p_status_rec.attribute15 ;
329 END IF;
330 IF p_status_rec.description = FND_API.G_MISS_CHAR
331 THEN
332 l_description := NULL;
333 ELSE
334 l_description := p_status_rec.description;
335 END IF;
336
337 -- END OF CHECK OF ALL OPTIONAL FIELD FOR g_miss_values
338
339 -- Check for open_status and win_loss validations
340 -- Perform this check before every insert of the status code
341 -- if opp_open_status_flag is Y and win_loss_indicator is NULL or
342 -- if opp_open_status_flag is N and win_loss_indicator is not in W or L
343 -- then insert into as_statuses_b and as_statuses_tl using api.
344 -- else error out with a message.
345
346 IF NOT ((p_status_rec.opp_open_status_flag = 'Y' AND
347 p_status_rec.win_loss_indicator IS NULL)
348 OR (p_status_rec.opp_open_status_flag = 'N' AND
349 p_status_rec.win_loss_indicator IN ('W','L')))
350 THEN
351 fnd_message.set_name('AS', 'AS_INVALID_WL_STATUS_COMBO');
352 fnd_msg_pub.add;
353 END IF;
354
355 IF (FND_MSG_PUB.COUNT_MSG > 0)
356 THEN
357 fnd_message.set_name('AS', 'AS_STATUS_INSERT_FAILED');
358 fnd_msg_pub.add;
359 RAISE fnd_api.g_exc_error;
360 END IF;
361
362
363 -- Insert into as_statuses_b and as_statuses_tl using api
364 -- AS_STATUSES_PKG.INSERT_ROW
365
366 AS_STATUSES_PKG.INSERT_ROW(
367 l_row_id,
368 p_status_rec.status_code,
369 p_status_rec.enabled_flag,
370 p_status_rec.lead_flag,
371 p_status_rec.opp_flag,
372 p_status_rec.opp_open_status_flag,
373 p_status_rec.opp_decision_date_flag,
374 p_status_rec.status_rank,
375 p_status_rec.forecast_rollup_flag,
376 p_status_rec.win_loss_indicator,
377 NULL,
378 l_attribute_category,
379 l_attribute1,
380 l_attribute2,
381 l_attribute3,
382 l_attribute4,
383 l_attribute5,
384 l_attribute6,
385 l_attribute7,
386 l_attribute8,
387 l_attribute9,
388 l_attribute10,
389 l_attribute11,
390 l_attribute12,
391 l_attribute13,
392 l_attribute14,
393 l_attribute15,
394 p_status_rec.meaning,
395 l_description,
396 l_creation_date,
397 l_created_by,
398 l_last_update_date,
399 l_last_updated_by,
400 l_last_update_login);
401
402 -- Standard Check for p_commit
403 IF fnd_api.to_boolean (p_commit)
404 THEN
405 COMMIT WORK;
406 END IF;
407
408 -- Standard call to get message count and if count is 1, get message infor.
409 fnd_msg_pub.count_and_get(
410 p_count => x_msg_count,
411 p_data => x_msg_data
412 );
413
414 -- Handling all the exceptions
415 EXCEPTION
416 WHEN fnd_api.g_exc_error THEN
417 ROLLBACK TO create_status;
418 x_return_status := fnd_api.g_ret_sts_error;
419 fnd_msg_pub.count_and_get (
420 p_count => x_msg_count,
421 p_data => x_msg_data
422 );
423 WHEN fnd_api.g_exc_unexpected_error THEN
424 ROLLBACK TO create_status;
425 x_return_status := fnd_api.g_ret_sts_unexp_error;
426 fnd_msg_pub.count_and_get (
427 p_count => x_msg_count,
428 p_data => x_msg_data
429 );
430 WHEN OTHERS THEN
431 ROLLBACK TO create_status;
432 x_return_status := fnd_api.g_ret_sts_unexp_error;
433 fnd_msg_pub.count_and_get (
434 p_count => x_msg_count,
435 p_data => x_msg_data
436 );
437 END create_status;
438
439 -- Start of Comments
440 --
441 -- API Name : update_status
442 -- Type : Public
443 -- Function : To update the status code using the table handler
444 -- Pre-Reqs : Table Handler AS_STATUSES_PKG.UPDATE_ROW should exist
445 -- Parameters :
446 -- IN : p_api_version_number IN NUMBER
447 -- p_init_msg_list IN VARCHAR2
448 -- p_commit IN VARCHAR2
449 -- p_validation_level IN NUMBER
450 -- p_status_rec IN STATUS_Rec_Type
451 -- OUT : x_return_status OUT VARCHAR2
452 -- x_msg_count OUT NUMBER
453 -- x_msg_data OUT VARCHAR2
454 -- Version : 2.0
455 -- Purpose : To update the status codes in as_statuses_b,tl,vl table
456 -- Notes : This procedure is a public procedure called using the
457 -- public API as_status_pub to update status codes.
458 --
459 -- End of Comments :
460
461 PROCEDURE update_status (
462 p_api_version_number IN NUMBER,
463 p_init_msg_list IN VARCHAR2 ,
464 p_commit IN VARCHAR2 ,
465 p_validation_level IN NUMBER,
466 p_status_rec IN STATUS_Rec_Type ,
467 x_return_status OUT VARCHAR2,
468 x_msg_count OUT NUMBER,
469 x_msg_data OUT VARCHAR2)
470
471 IS
472 -- Declaration of local variables and cursors
473 l_api_version NUMBER:= p_api_version_number;
474 l_api_name CONSTANT VARCHAR(30) DEFAULT 'UPDATE_STATUS';
475
476 l_enabled_flag VARCHAR2(1) ;
477 l_lead_flag VARCHAR2(1) ;
478 l_opp_flag VARCHAR2(1) ;
479 l_opp_open_status_flag VARCHAR2(1) ;
480 l_opp_decision_date_flag VARCHAR2(1) ;
481 l_forecast_rollup_flag VARCHAR2(1) ;
482 l_win_loss_indicator VARCHAR2(1) ;
483
484 v_enabled_flag VARCHAR2(1) ;
485 v_lead_flag VARCHAR2(1) ;
486 v_opp_flag VARCHAR2(1) ;
487 v_opp_open_status_flag VARCHAR2(1) ;
488 v_opp_decision_date_flag VARCHAR2(1) ;
489 v_forecast_rollup_flag VARCHAR2(1) ;
490 v_win_loss_indicator VARCHAR2(1) ;
491 l_last_update_date DATE ;
492 v_last_update_date DATE ;
493 l_last_updated_by NUMBER ;
494 l_last_update_login NUMBER ;
495 l_status_rank NUMBER ;
496 l_attribute_category VARCHAR2(30) ;
497 l_attribute1 VARCHAR2(150) ;
498 l_attribute2 VARCHAR2(150) ;
499 l_attribute3 VARCHAR2(150) ;
500 l_attribute4 VARCHAR2(150) ;
501 l_attribute5 VARCHAR2(150) ;
502 l_attribute6 VARCHAR2(150) ;
503 l_attribute7 VARCHAR2(150) ;
504 l_attribute8 VARCHAR2(150) ;
505 l_attribute9 VARCHAR2(150) ;
506 l_attribute10 VARCHAR2(150) ;
507 l_attribute11 VARCHAR2(150) ;
508 l_attribute12 VARCHAR2(150) ;
509 l_attribute13 VARCHAR2(150) ;
510 l_attribute14 VARCHAR2(150) ;
511 l_attribute15 VARCHAR2(150) ;
512 l_meaning VARCHAR2(240) ;
513 l_description VARCHAR2(240) ;
514 v_status_rank NUMBER ;
515 v_attribute_category VARCHAR2(30) ;
516 v_attribute1 VARCHAR2(150) ;
517 v_attribute2 VARCHAR2(150) ;
518 v_attribute3 VARCHAR2(150) ;
519 v_attribute4 VARCHAR2(150) ;
520 v_attribute5 VARCHAR2(150) ;
521 v_attribute6 VARCHAR2(150) ;
522 v_attribute7 VARCHAR2(150) ;
523 v_attribute8 VARCHAR2(150) ;
524 v_attribute9 VARCHAR2(150) ;
525 v_attribute10 VARCHAR2(150) ;
526 v_attribute11 VARCHAR2(150) ;
527 v_attribute12 VARCHAR2(150) ;
528 v_attribute13 VARCHAR2(150) ;
529 v_attribute14 VARCHAR2(150) ;
530 v_attribute15 VARCHAR2(150) ;
531 v_meaning VARCHAR2(240) ;
532 v_description VARCHAR2(240) ;
533 l_current_last_update_date DATE;
534
535
536 CURSOR get_update_row_cur(p_status_code in VARCHAR2) IS
537 SELECT last_update_date,
538 enabled_flag,
539 lead_flag,
540 opp_flag,
541 opp_open_status_flag ,
542 opp_decision_date_flag,
543 forecast_rollup_flag,
544 win_loss_indicator,
545 attribute_category,
546 attribute1,
547 attribute2,
548 attribute3,
549 attribute4,
550 attribute5,
551 attribute6,
552 attribute7,
553 attribute8,
554 attribute9,
555 attribute10,
556 attribute11,
557 attribute12,
558 attribute13,
559 attribute14,
560 attribute15,
561 meaning,
562 description,
563 status_rank
564 FROM as_statuses_vl
565 WHERE TRIM(NLS_UPPER(status_code)) = p_status_code; -- trimmed value passed while opening
566
567 CURSOR lock_row_for_update(p_status_code in VARCHAR2) IS
568 SELECT last_update_date
569 FROM as_statuses_vl
570 WHERE TRIM(NLS_UPPER(status_code)) = p_status_code; -- trimmed value passed while opening
571
572
573
574 BEGIN
575
576 -- Standard start of api save point
577 SAVEPOINT update_status;
578
579 -- Initialize Message List
580 IF fnd_api.to_boolean (p_init_msg_list)
581 THEN
582 fnd_msg_pub.initialize;
583 END IF;
584
585 -- Standard Call to check api compatibility
586 IF NOT fnd_api.compatible_api_call (
587 l_api_version,
588 p_api_version_number,
589 l_api_name,
590 G_PKG_NAME
591 )
592 THEN
593 fnd_message.set_name('AS', 'AS_INVALID_VERSION');
594 fnd_msg_pub.add;
595 END IF;
596
597 -- Initialize api return status
598 x_return_status := fnd_api.g_ret_sts_success;
599
600 -- Check if the version number passed is 2.0 else error out
601 IF p_api_version_number <> 2.0
602 THEN
603 fnd_message.set_name('AS', 'AS_INVALID_VERSION');
604 fnd_msg_pub.add;
605 END IF;
606
607
608 -- API Body
609 -- Fetch all the column values into local variables from the database before
610 -- checking to see if the value passed in the input paramater was G_MISS or not.
611 -- If the input parameter was G_MISS then replace the value with the fetched value
612 -- from the database
613
614 OPEN get_update_row_cur(TRIM(NLS_UPPER(p_status_rec.status_code)));
615 FETCH get_update_row_cur
616 INTO l_last_update_date,
617 l_enabled_flag,
618 l_lead_flag,
619 l_opp_flag,
620 l_opp_open_status_flag ,
621 l_opp_decision_date_flag,
622 l_forecast_rollup_flag,
623 l_win_loss_indicator,
624 l_attribute_category,
625 l_attribute1,
626 l_attribute2,
627 l_attribute3,
628 l_attribute4,
629 l_attribute5,
630 l_attribute6,
631 l_attribute7,
632 l_attribute8,
633 l_attribute9,
634 l_attribute10,
635 l_attribute11,
636 l_attribute12,
637 l_attribute13,
638 l_attribute14,
639 l_attribute15,
640 l_meaning,
641 l_description,
642 l_status_rank;
643
644 IF get_update_row_cur%NOTFOUND
645 THEN
646 CLOSE get_update_row_cur;
647 RAISE fnd_api.g_exc_unexpected_error;
648 END IF;
649
650 -- checking for G_MISS..and replace with original values if necessary
651 -- Validation for open_status_flag and win loss indicator needs to be done here..
652
653 IF p_status_rec.opp_open_status_flag = FND_API.G_MISS_CHAR
654 THEN
655 v_opp_open_status_flag := l_opp_open_status_flag;
656 ELSE
657 IF p_status_rec.opp_open_status_flag = 'Y'
658 THEN
659 v_opp_open_status_flag := p_status_rec.opp_open_status_flag ;
660 v_win_loss_indicator := NULL;
661 ELSIF p_status_rec.opp_open_status_flag = 'N'
662 THEN
663 v_opp_open_status_flag := p_status_rec.opp_open_status_flag ;
664 IF p_status_rec.win_loss_indicator = FND_API.G_MISS_CHAR
665 OR TRIM(p_status_rec.win_loss_indicator) IS NULL
666 THEN
667 v_win_loss_indicator := l_win_loss_indicator;
668 ELSIF v_win_loss_indicator NOT IN ('W','L')
669 AND v_win_loss_indicator IS NOT NULL
670 THEN
671 fnd_message.set_name('AS', 'AS_WIN_IND_INVALID');
672 fnd_msg_pub.add;
673 ELSE
674 v_win_loss_indicator := p_status_rec.win_loss_indicator;
675 END IF;
676 ELSE
677 fnd_message.set_name('AS', 'AS_OPP_OPEN_FLAG_INVALID');
678 fnd_msg_pub.add;
679 END IF;
680 END IF;
681
682 IF p_status_rec.enabled_flag = FND_API.G_MISS_CHAR
683 THEN
684 v_enabled_flag := l_enabled_flag;
685 ELSE
686 v_enabled_flag := p_status_rec.enabled_flag ;
687 END IF;
688 IF p_status_rec.lead_flag = FND_API.G_MISS_CHAR
689 THEN
690 v_lead_flag := l_lead_flag ;
691 ELSE
692 v_lead_flag := p_status_rec.lead_flag ;
693 END IF;
694 IF p_status_rec.opp_flag = FND_API.G_MISS_CHAR
695 THEN
696 v_opp_flag := l_opp_flag ;
697 ELSE
698 v_opp_flag := p_status_rec.opp_flag;
699 END IF;
700 IF p_status_rec.opp_decision_date_flag = FND_API.G_MISS_CHAR
701 THEN
702 v_opp_decision_date_flag := l_opp_decision_date_flag ;
703 ELSE
704 v_opp_decision_date_flag := p_status_rec.opp_decision_date_flag ;
705 END IF;
706 IF p_status_rec.forecast_rollup_flag = FND_API.G_MISS_CHAR
707 THEN
708 v_forecast_rollup_flag := l_forecast_rollup_flag ;
709 ELSE
710 v_forecast_rollup_flag := p_status_rec.forecast_rollup_flag ;
711 END IF;
712 IF p_status_rec.status_rank = FND_API.G_MISS_NUM
713 THEN
714 v_status_rank := l_status_rank;
715 ELSE
716 v_status_rank := p_status_rec.status_rank ;
717 END IF;
718 IF p_status_rec.attribute_category = FND_API.G_MISS_CHAR
719 THEN
720 v_attribute_category := l_attribute_category;
721 ELSE
722 v_attribute_category := p_status_rec.attribute_category;
723 END IF;
724 IF p_status_rec.attribute1 = FND_API.G_MISS_CHAR
725 THEN
726 v_attribute1 := l_attribute1 ;
727 ELSE
728 v_attribute1 := p_status_rec.attribute1;
729 END IF;
730 IF p_status_rec.attribute2 = FND_API.G_MISS_CHAR
731 THEN
732 v_attribute2 := l_attribute2 ;
733 ELSE
734 v_attribute2 := p_status_rec.attribute2;
735 END IF;
736 IF p_status_rec.attribute3 = FND_API.G_MISS_CHAR
737 THEN
738 v_attribute3 := l_attribute3 ;
739 ELSE
740 v_attribute3 := p_status_rec.attribute3 ;
741 END IF;
742 IF p_status_rec.attribute4 = FND_API.G_MISS_CHAR
743 THEN
744 v_attribute4 := l_attribute4 ;
745 ELSE
746 v_attribute4 := p_status_rec.attribute4;
747 END IF;
748 IF p_status_rec.attribute5 = FND_API.G_MISS_CHAR
749 THEN
750 v_attribute5 := l_attribute5 ;
751 ELSE
752 v_attribute5 := p_status_rec.attribute5;
753 END IF;
754 IF p_status_rec.attribute6 = FND_API.G_MISS_CHAR
755 THEN
756 v_attribute6 := l_attribute6 ;
757 ELSE
758 v_attribute6 := p_status_rec.attribute6;
759 END IF;
760 IF p_status_rec.attribute7 = FND_API.G_MISS_CHAR
761 THEN
762 v_attribute7 := l_attribute7 ;
763 ELSE
764 v_attribute7 := p_status_rec.attribute7;
765 END IF;
766 IF p_status_rec.attribute8 = FND_API.G_MISS_CHAR
767 THEN
768 v_attribute8 := l_attribute8 ;
769 ELSE
770 v_attribute8 := p_status_rec.attribute8;
771 END IF;
772 IF p_status_rec.attribute9 = FND_API.G_MISS_CHAR
773 THEN
774 v_attribute9 := l_attribute9 ;
775 ELSE
776 v_attribute9 := p_status_rec.attribute9;
777 END IF;
778 IF p_status_rec.attribute10 = FND_API.G_MISS_CHAR
779 THEN
780 v_attribute10 := l_attribute10 ;
781 ELSE
782 v_attribute10 := p_status_rec.attribute10;
783 END IF;
784 IF p_status_rec.attribute11 = FND_API.G_MISS_CHAR
785 THEN
786 v_attribute11 := l_attribute11 ;
787 ELSE
788 v_attribute11 := p_status_rec.attribute11;
789 END IF;
790 IF p_status_rec.attribute12 = FND_API.G_MISS_CHAR
791 THEN
792 v_attribute12 := l_attribute12 ;
793 ELSE
794 v_attribute12 := p_status_rec.attribute12;
795 END IF;
796 IF p_status_rec.attribute13 = FND_API.G_MISS_CHAR
797 THEN
798 v_attribute13 := l_attribute13 ;
799 ELSE
800 v_attribute13 := p_status_rec.attribute13;
801 END IF;
802 IF p_status_rec.attribute14 = FND_API.G_MISS_CHAR
803 THEN
804 v_attribute14 := l_attribute14 ;
805 ELSE
806 v_attribute14 := p_status_rec.attribute14;
807 END IF;
808 IF p_status_rec.attribute15 = FND_API.G_MISS_CHAR
809 THEN
810 v_attribute15 := l_attribute15 ;
811 ELSE
812 v_attribute15 := p_status_rec.attribute15;
813 END IF;
814 IF p_status_rec.meaning = FND_API.G_MISS_CHAR
815 THEN
816 v_meaning := l_meaning ;
817 ELSE
818 v_meaning := p_status_rec.meaning;
819 END IF;
820 IF p_status_rec.description = FND_API.G_MISS_CHAR
821 THEN
822 v_description := l_description ;
823 ELSE
824 v_description := p_status_rec.description;
825 END IF;
826
827 -- Check to see if values were passed for the who colums
828 -- if not default them.
829 IF p_status_rec.last_update_date = FND_API.G_MISS_DATE
830 OR TRIM(p_status_rec.last_update_date) IS NULL
831 THEN
832 l_last_update_date := SYSDATE;
833 ELSE
834 l_last_update_date := p_status_rec.last_update_date ;
835 END IF;
836
837 IF p_status_rec.last_update_login = FND_API.G_MISS_NUM
838 OR TRIM(p_status_rec.last_update_login) IS NULL
839 THEN
840 l_last_update_login := fnd_global.login_id;
841 ELSE
842 l_last_update_login := p_status_rec.last_update_login;
843 END IF;
844
845 IF p_status_rec.last_updated_by = FND_API.G_MISS_NUM
846 OR TRIM(p_status_rec.last_updated_by) IS NULL
847 THEN
848 l_last_updated_by := fnd_global.user_id;
849 ELSE
850 l_last_updated_by := p_status_rec.last_updated_by;
851 END IF;
852
853 -- Check for valid values being passed
854
855 IF TRIM(p_status_rec.win_loss_indicator) NOT IN ('W','L', NULL)
856 THEN
857 fnd_message.set_name('AS', 'AS_WIN_IND_INVALID');
858 fnd_msg_pub.add;
859 ELSE
860 v_win_loss_indicator:=p_status_rec.win_loss_indicator;
861 END IF;
862 IF v_enabled_flag NOT IN ('Y','N')
863 THEN
864 fnd_message.set_name('AS', 'AS_ENABLED_FLAG_INVALID');
865 fnd_msg_pub.add;
866 END IF;
867 IF v_lead_flag NOT IN ('Y','N')
868 THEN
869 fnd_message.set_name('AS', 'AS_LEAD_FLAG_INVALID');
870 fnd_msg_pub.add;
871 END IF;
872 IF v_opp_flag NOT IN ('Y','N')
873 THEN
874 fnd_message.set_name('AS', 'AS_OPP_FLAG_INVALID');
875 fnd_msg_pub.add;
876 END IF;
877 IF v_opp_decision_date_flag NOT IN ('Y','N')
878 THEN
879 fnd_message.set_name('AS', 'AS_DECISION_FLAG_INVALID');
880 fnd_msg_pub.add;
881 END IF;
882 IF v_forecast_rollup_flag NOT IN ('Y','N')
883 THEN
884 fnd_message.set_name('AS', 'AS_FORECAST_FLAG_INVALID');
885 fnd_msg_pub.add;
886 END IF;
887
888 -- if opp_open_status_flag is Y and win_loss_indicator IS NULL else
889 -- if opp_open_status_flag is N and win_loss_indicator not in W or L
890 -- then update into as_statuses_b and as_statuses_tl using api.
891
892 IF NOT ((v_opp_open_status_flag = 'Y' AND
893 TRIM(v_win_loss_indicator) IS NULL)
894 OR (v_opp_open_status_flag ='N' AND
895 v_win_loss_indicator IN ('W','L')))
896 THEN
897 fnd_message.set_name('AS', 'AS_INVALID_WL_STATUS_COMBO');
898 fnd_message.set_token('WIN_LOSS_IND', p_status_rec.win_loss_indicator);
899 fnd_msg_pub.add;
900 END IF;
901
902 IF (FND_MSG_PUB.COUNT_MSG > 0)
903 THEN
904 fnd_message.set_name('AS', 'AS_STATUS_UPDATE_FAILED');
905 fnd_msg_pub.add;
906 RAISE fnd_api.g_exc_error;
907 END IF;
908
909 -- Lock the row for update. Check to see if the fetched value is same still.
910 -- If they are same then update the record else give a message that the row has been
911 -- updated by others.
912
913 OPEN lock_row_for_update(TRIM(NLS_UPPER(p_status_rec.status_code)));
914 FETCH lock_row_for_update INTO l_current_last_update_date;
915 IF lock_row_for_update%NOTFOUND
916 THEN
917 CLOSE lock_row_for_update;
918 RAISE fnd_api.g_exc_unexpected_error;
919 END IF;
920
921 IF l_last_update_date <> l_current_last_update_date
922 THEN
923 fnd_message.set_name('AS', 'AS_RECORD_UPDATED');
924 fnd_msg_pub.add;
925 RAISE fnd_api.g_exc_error;
926 END IF;
927
928 AS_STATUSES_PKG.UPDATE_ROW(
929 p_status_rec.status_code,
930 v_enabled_flag,
931 v_lead_flag,
932 v_opp_flag,
933 v_opp_open_status_flag,
934 v_opp_decision_date_flag,
935 v_status_rank,
936 v_forecast_rollup_flag,
937 v_win_loss_indicator,
938 NULL,
939 v_attribute_category,
940 v_attribute1,
941 v_attribute2,
942 v_attribute3,
943 v_attribute4,
944 v_attribute5,
945 v_attribute6,
946 v_attribute7,
947 v_attribute8,
948 v_attribute9,
949 v_attribute10,
950 v_attribute11,
951 v_attribute12,
952 v_attribute13,
953 v_attribute14,
954 v_attribute15,
955 v_meaning,
956 v_description,
957 l_last_update_date,
958 l_last_updated_by,
959 l_last_update_login);
960
961
962 -- Standard Check for p_commit
963 IF fnd_api.to_boolean (p_commit)
964 THEN
965 COMMIT WORK;
966 END IF;
967
968 -- Close all opened cursors
969 CLOSE get_update_row_cur; -- closed after update...
970 CLOSE lock_row_for_update ;
971
972
973 -- Standard call to get message count and if count is 1, get message infor.
974 fnd_msg_pub.count_and_get(
975 p_count => x_msg_count,
976 p_data => x_msg_data
977 );
978
979 -- Handling all Exceptions
980 EXCEPTION
981 WHEN fnd_api.g_exc_error THEN
982 ROLLBACK TO update_status;
983 x_return_status := fnd_api.g_ret_sts_error;
984 fnd_msg_pub.count_and_get (
985 p_count => x_msg_count,
986 p_data => x_msg_data
987 );
988 WHEN fnd_api.g_exc_unexpected_error THEN
989 ROLLBACK TO update_status;
990 x_return_status := fnd_api.g_ret_sts_unexp_error;
991 fnd_msg_pub.count_and_get (
992 p_count => x_msg_count,
993 p_data => x_msg_data
994 );
995 WHEN OTHERS THEN
996 ROLLBACK TO update_status;
997 x_return_status := fnd_api.g_ret_sts_unexp_error;
998 fnd_msg_pub.count_and_get (
999 p_count => x_msg_count,
1000 p_data => x_msg_data
1001 );
1002
1003 END update_status;
1004 END as_status_pub;