[Home] [Help]
PACKAGE BODY: APPS.PON_EVAL_TEAM_UTIL_PVT
Source
1 PACKAGE BODY PON_EVAL_TEAM_UTIL_PVT AS
2 /* $Header: PONVETUB.pls 120.1 2011/12/17 02:01:56 atjen noship $ */
3
4
5 PROCEDURE send_mng_eval_teams_notif(p_auction_header_id IN NUMBER);
6
7 PROCEDURE send_eval_team_update_notif(p_auction_header_id IN NUMBER,
8 p_member_user_id IN NUMBER);
9
10
11 FUNCTION get_display_name_for_user(p_user_id IN NUMBER)
12 RETURN VARCHAR2
13 IS
14
15 l_party_id NUMBER;
16
17 BEGIN
18
19 SELECT person_party_id
20 INTO l_party_id
21 FROM fnd_user
22 WHERE user_id = p_user_id;
23
24 RETURN pon_locale_pkg.get_party_display_name(l_party_id);
25
26 END get_display_name_for_user;
27
28
29 -- Procedure to store the current setting of evaluation teams
30 PROCEDURE init_mng_eval_teams(p_auction_header_id IN NUMBER)
31 IS
32 BEGIN
33
34 DELETE FROM pon_mng_eval_team_members
35 WHERE auction_header_id = p_auction_header_id;
36
37 DELETE FROM pon_mng_eval_team_sections
38 WHERE auction_header_id = p_auction_header_id;
39
40
41 INSERT INTO pon_mng_eval_team_members
42 (
43 auction_header_id,
44 team_id,
45 user_id,
46 status_code,
47 created_by,
48 creation_date,
49 last_updated_by,
50 last_update_date,
51 last_update_login
52 )
53 SELECT auction_header_id,
54 team_id,
55 user_id,
56 'C',
57 fnd_global.user_id,
58 SYSDATE,
59 fnd_global.user_id,
60 SYSDATE,
61 fnd_global.login_id
62 FROM pon_evaluation_team_members
63 WHERE auction_header_id = p_auction_header_id;
64
65 INSERT INTO pon_mng_eval_team_sections
66 (
67 auction_header_id,
68 team_id,
69 team_name,
70 section_id,
71 status_code,
72 created_by,
73 creation_date,
74 last_updated_by,
75 last_update_date,
76 last_update_login
77 )
78 SELECT pets.auction_header_id,
79 pets.team_id,
80 pet.team_name,
81 pets.section_id,
82 'C',
83 fnd_global.user_id,
84 SYSDATE,
85 fnd_global.user_id,
86 SYSDATE,
87 fnd_global.login_id
88 FROM pon_evaluation_team_sections pets,
89 pon_evaluation_teams pet
90 WHERE pets.auction_header_id = p_auction_header_id
91 AND pet.auction_header_id = p_auction_header_id
92 AND pet.team_id = pets.team_id;
93
94 END init_mng_eval_teams;
95
96
97 -- Procedure to track changes after Manage Evaluation Teams
98 PROCEDURE process_mng_eval_teams(p_auction_header_id IN NUMBER)
99 IS
100 BEGIN
101
102 -- 1. Track sections to be excluded from evaluations
103
104 MERGE INTO pon_mng_eval_bid_sections pmebs
105 USING (SELECT pbh.bid_number,
106 pmets.section_id
107 FROM pon_mng_eval_team_members pmetm,
108 pon_mng_eval_team_sections pmets,
109 pon_bid_headers pbh,
110 fnd_user fu
111 WHERE pmetm.auction_header_id = p_auction_header_id
112 AND pmets.auction_header_id = p_auction_header_id
113 AND pmetm.team_id = pmets.team_id
114 AND (pmetm.user_id, pmets.section_id) NOT IN
115 (SELECT petm.user_id,
116 pets.section_id
117 FROM pon_evaluation_team_members petm,
118 pon_evaluation_team_sections pets
119 WHERE petm.auction_header_id = p_auction_header_id
120 AND pets.auction_header_id = p_auction_header_id
121 AND petm.team_id = pets.team_id
122 )
123 AND pbh.auction_header_id = p_auction_header_id
124 AND pbh.bid_status IN ('ACTIVE', 'DRAFT')
125 AND pbh.evaluation_flag = 'Y'
126 AND pbh.evaluator_id = fu.person_party_id
127 AND fu.user_id = pmetm.user_id
128 ) bs_deleted
129 ON (pmebs.auction_header_id = p_auction_header_id AND
130 pmebs.bid_number = bs_deleted.bid_number AND
131 pmebs.section_id = bs_deleted.section_id
132 )
133 WHEN MATCHED THEN
134 UPDATE SET status_code = 'X' WHERE status_code = 'A'
135 DELETE WHERE status_code = 'X'
136 WHEN NOT MATCHED THEN
137 INSERT (auction_header_id,
138 bid_number,
139 section_id,
140 status_code,
141 created_by,
142 creation_date,
143 last_updated_by,
144 last_update_date,
145 last_update_login
146 )
147 VALUES (p_auction_header_id,
148 bs_deleted.bid_number,
149 bs_deleted.section_id,
150 'D',
151 fnd_global.user_id,
152 SYSDATE,
153 fnd_global.user_id,
154 SYSDATE,
155 fnd_global.login_id
156 );
157
158
159 -- 2. Track new sections for the evaluations
160
161 MERGE INTO pon_mng_eval_bid_sections pmebs
162 USING (SELECT pbh.bid_number,
163 pets.section_id
164 FROM pon_evaluation_team_members petm,
165 pon_evaluation_team_sections pets,
166 pon_bid_headers pbh,
167 fnd_user fu
168 WHERE petm.auction_header_id = p_auction_header_id
169 AND pets.auction_header_id = p_auction_header_id
170 AND petm.team_id = pets.team_id
171 AND (petm.user_id, pets.section_id) NOT IN
172 (SELECT pmetm.user_id,
173 pmets.section_id
174 FROM pon_mng_eval_team_members pmetm,
175 pon_mng_eval_team_sections pmets
176 WHERE pmetm.auction_header_id = p_auction_header_id
177 AND pmets.auction_header_id = p_auction_header_id
178 AND pmetm.team_id = pmets.team_id
179 )
180 AND pbh.auction_header_id = p_auction_header_id
181 AND bid_status IN ('ACTIVE', 'DRAFT')
182 AND pbh.evaluation_flag = 'Y'
183 AND pbh.evaluator_id = fu.person_party_id
184 AND fu.user_id = petm.user_id
185 ) bs_added
186 ON (pmebs.auction_header_id = p_auction_header_id AND
187 pmebs.bid_number = bs_added.bid_number AND
188 pmebs.section_id = bs_added.section_id
189 )
190 WHEN MATCHED THEN
191 UPDATE SET status_code = 'A' WHERE status_code = 'D'
192 WHEN NOT MATCHED THEN
193 INSERT (auction_header_id,
194 bid_number,
195 section_id,
196 status_code,
197 created_by,
198 creation_date,
199 last_updated_by,
200 last_update_date,
201 last_update_login
202 )
203 VALUES (p_auction_header_id,
204 bs_added.bid_number,
205 bs_added.section_id,
206 'A',
207 fnd_global.user_id,
208 SYSDATE,
209 fnd_global.user_id,
210 SYSDATE,
211 fnd_global.login_id
212 );
213
214
215 -- 3. Track changes in team members
216
217 UPDATE pon_mng_eval_team_members
218 SET status_code = 'D'
219 WHERE auction_header_id = p_auction_header_id
220 AND (team_id, user_id) NOT IN
221 (SELECT team_id,
222 user_id
223 FROM pon_evaluation_team_members
224 WHERE auction_header_id = p_auction_header_id
225 );
226
227 INSERT INTO pon_mng_eval_team_members
228 (
229 auction_header_id,
230 team_id,
231 user_id,
232 status_code,
233 created_by,
234 creation_date,
235 last_updated_by,
236 last_update_date,
237 last_update_login
238 )
239 SELECT auction_header_id,
240 team_id,
241 user_id,
242 'A',
243 fnd_global.user_id,
244 SYSDATE,
245 fnd_global.user_id,
246 SYSDATE,
247 fnd_global.login_id
248 FROM pon_evaluation_team_members
249 WHERE auction_header_id = p_auction_header_id
250 AND (team_id, user_id) NOT IN
251 (SELECT team_id,
252 user_id
253 FROM pon_mng_eval_team_members
254 WHERE auction_header_id = p_auction_header_id
255 );
256
257
258 -- 4. Track changes in team sections assignment
259
260 UPDATE pon_mng_eval_team_sections
261 SET status_code = 'D'
262 WHERE auction_header_id = p_auction_header_id
263 AND (team_id, section_id) NOT IN
264 (SELECT team_id,
265 section_id
266 FROM pon_evaluation_team_sections
267 WHERE auction_header_id = p_auction_header_id
268 );
269
270 INSERT INTO pon_mng_eval_team_sections
271 (
272 auction_header_id,
273 team_id,
274 team_name,
275 section_id,
276 status_code,
277 created_by,
278 creation_date,
279 last_updated_by,
280 last_update_date,
281 last_update_login
282 )
283 SELECT pets.auction_header_id,
284 pets.team_id,
285 pet.team_name,
286 pets.section_id,
287 'A',
288 fnd_global.user_id,
289 SYSDATE,
290 fnd_global.user_id,
291 SYSDATE,
292 fnd_global.login_id
293 FROM pon_evaluation_team_sections pets,
294 pon_evaluation_teams pet
295 WHERE pets.auction_header_id = p_auction_header_id
296 AND pet.auction_header_id = p_auction_header_id
297 AND pet.team_id = pets.team_id
298 AND (pets.team_id, pets.section_id) NOT IN
299 (SELECT team_id,
300 section_id
301 FROM pon_mng_eval_team_sections
302 WHERE auction_header_id = p_auction_header_id
303 );
304
305
306 -- 5. Clear the evaluation scores
307
308 UPDATE pon_team_member_attr_scores
309 SET score = NULL
310 WHERE auction_header_id = p_auction_header_id
311 AND (bid_number, section_id) IN
312 (SELECT bid_number,
313 section_id
314 FROM pon_mng_eval_bid_sections
315 WHERE auction_header_id = p_auction_header_id
316 AND status_code = 'D'
317 );
318
319 UPDATE pon_bid_attribute_values
320 SET score = NULL,
321 weighted_score = NULL
322 WHERE auction_header_id = p_auction_header_id
323 AND auction_line_number = -1
324 AND (bid_number, attr_group_seq_number) IN
325 (SELECT pmebs.bid_number,
326 pas.attr_group_seq_number
327 FROM pon_mng_eval_bid_sections pmebs,
328 pon_auction_sections pas
329 WHERE pmebs.auction_header_id = p_auction_header_id
330 AND pmebs.status_code = 'D'
331 AND pas.auction_header_id = p_auction_header_id
332 AND pas.section_id = pmebs.section_id
333 );
334
335
336 -- 6. Send notifications
337
338 send_mng_eval_teams_notif(p_auction_header_id);
339
340 END process_mng_eval_teams;
341
342 -- Procedure to send notifications after Manage Evaluation Teams
343 PROCEDURE send_mng_eval_teams_notif(p_auction_header_id IN NUMBER)
344 IS
345
346 CURSOR c_notify_members
347 IS
348 SELECT user_id
349 FROM pon_neg_team_members
350 WHERE auction_header_id = p_auction_header_id
351 AND (user_id IN (SELECT pmetm.user_id
352 FROM pon_mng_eval_team_members pmetm,
353 pon_mng_eval_team_sections pmets
354 WHERE pmetm.auction_header_id = p_auction_header_id
355 AND pmets.auction_header_id = p_auction_header_id
356 AND pmets.team_id = pmetm.team_id
357 AND ((pmetm.status_code = 'A' AND
358 pmets.status_code IN ('A', 'C'))
359 OR
360 (pmetm.status_code = 'D' AND
361 pmets.status_code IN ('C', 'D'))
362 OR
363 (pmetm.status_code = 'C' AND
364 pmets.status_code IN ('A', 'D'))
365 )
366 )
367 OR
368 menu_name = 'PON_SOURCING_EDITNEG'
369 );
370
371 TYPE notify_member_tbl_type IS TABLE OF c_notify_members%ROWTYPE;
372
373 l_notify_members_tbl notify_member_tbl_type;
374
375 BEGIN
376
377 OPEN c_notify_members;
378 FETCH c_notify_members BULK COLLECT INTO l_notify_members_tbl;
379 CLOSE c_notify_members;
380
381 FOR i IN 1..l_notify_members_tbl.COUNT LOOP
382 send_eval_team_update_notif(p_auction_header_id,
383 l_notify_members_tbl(i).user_id);
384 END LOOP;
385
386 END send_mng_eval_teams_notif;
387
388 -- Procedure to notify member of evaluation team updates
389 PROCEDURE send_eval_team_update_notif(p_auction_header_id IN NUMBER,
390 p_member_user_id IN NUMBER)
391 IS
392
393 CURSOR c_auction_details
394 IS
395 SELECT pah.document_number,
396 pah.auction_title,
397 hz.party_name preparer_tp_name,
398 pad.message_suffix
399 FROM pon_auction_headers_all pah,
400 pon_auc_doctypes pad,
401 hz_parties hz
402 WHERE pah.auction_header_id = p_auction_header_id
403 AND pad.doctype_id = pah.doctype_id
404 AND hz.party_id = pah.trading_partner_id;
405
406 l_language_code VARCHAR2(3);
407 l_doc_number pon_auction_headers_all.document_number%TYPE;
408 l_auction_title pon_auction_headers_all.auction_title%TYPE;
409 l_preparer_tp_name hz_parties.party_name%TYPE;
410 l_msg_suffix pon_auc_doctypes.message_suffix%TYPE;
411 l_doc_type VARCHAR2(50);
412 l_member_user_name fnd_user.user_name%TYPE;
413 l_et_update_subject VARCHAR2(2000);
414 l_neg_summary_url VARCHAR2(2000);
415
416 l_sequence NUMBER;
417 l_itemtype VARCHAR2(8) := 'PONAUCT';
418 l_itemkey VARCHAR2(240);
419
420 BEGIN
421
422 pon_profile_util_pkg.get_wf_language(p_member_user_id, l_language_code);
423 pon_auction_pkg.set_session_language(NULL, l_language_code);
424
425
426 OPEN c_auction_details;
427 FETCH c_auction_details
428 INTO l_doc_number, l_auction_title, l_preparer_tp_name, l_msg_suffix;
429 CLOSE c_auction_details;
430
431 l_doc_type := pon_auction_pkg.getMessage('PON_AUCTION', '_' || l_msg_suffix);
432
433 SELECT user_name
434 INTO l_member_user_name
435 FROM fnd_user
436 WHERE user_id = p_member_user_id;
437
438 fnd_message.set_name('PON', 'PON_SM_ET_UPDATE_SUB');
439 fnd_message.set_token('DOC_TYPE', l_doc_type);
440 fnd_message.set_token('DOC_NUMBER', l_doc_number);
441 fnd_message.set_token('AUCTION_TITLE', l_auction_title);
442 l_et_update_subject := fnd_message.get;
443
444 l_neg_summary_url := pon_wf_utl_pkg.get_dest_page_url
445 ( p_dest_func => 'PON_NEG_SUMMARY',
446 p_notif_performer => 'BUYER'
447 );
448
449
450 SELECT pon_auction_wf_s.nextval
451 INTO l_sequence
452 FROM dual;
453
454 l_itemkey := p_auction_header_id || '-' || l_sequence;
455
456 wf_engine.CreateProcess(itemtype => l_itemtype,
457 itemkey => l_itemkey,
458 process => 'MNG_EVAL_TEAM_UPDATE');
459
460
461 wf_engine.SetItemAttrText(itemtype => l_itemtype,
462 itemkey => l_itemkey,
463 aname => 'AUCTION_ID',
464 avalue => p_auction_header_id);
465
466 wf_engine.SetItemAttrText(itemtype => l_itemtype,
467 itemkey => l_itemkey,
468 aname => 'MEMBER_USER_ID',
469 avalue => p_member_user_id);
470
471 wf_engine.SetItemAttrText(itemtype => l_itemtype,
472 itemkey => l_itemkey,
473 aname => 'DOC_TYPE',
474 avalue => l_doc_type);
475
476 wf_engine.SetItemAttrText(itemtype => l_itemtype,
477 itemkey => l_itemkey,
478 aname => 'DOC_NUMBER',
479 avalue => l_doc_number);
480
481 wf_engine.SetItemAttrText(itemtype => l_itemtype,
482 itemkey => l_itemkey,
483 aname => 'AUCTION_TITLE',
484 avalue => l_auction_title);
485
486 wf_engine.SetItemAttrText(itemtype => l_itemtype,
487 itemkey => l_itemkey,
488 aname => 'PREPARER_TP_NAME',
489 avalue => l_preparer_tp_name);
490
491 wf_engine.SetItemAttrText(itemtype => l_itemtype,
492 itemkey => l_itemkey,
493 aname => 'ORIGIN_USER_NAME',
494 avalue => fnd_global.user_name);
495
496 wf_engine.SetItemAttrText(itemtype => l_itemtype,
497 itemkey => l_itemkey,
498 aname => 'RECIPIENT_ROLE',
499 avalue => l_member_user_name);
500
501 wf_engine.SetItemAttrText(itemtype => l_itemtype,
502 itemkey => l_itemkey,
503 aname => 'MNG_EVAL_TEAM_UPDATE_SUBJECT',
504 avalue => l_et_update_subject);
505
506 wf_engine.SetItemAttrText(itemtype => l_itemtype,
507 itemkey => l_itemkey,
508 aname => 'MNG_EVAL_TEAM_UPDATE_BODY',
509 avalue => 'plsqlclob:' ||
510 'pon_eval_team_util_pvt.' ||
511 'gen_eval_team_update_body/' ||
512 l_itemtype || ':' ||
513 l_itemkey);
514
515 wf_engine.SetItemAttrText(itemtype => l_itemtype,
516 itemkey => l_itemkey,
517 aname => 'NEG_SUMMARY_URL',
518 avalue => l_neg_summary_url);
519
520
521 wf_engine.SetItemOwner(itemtype => l_itemtype,
522 itemkey => l_itemkey,
523 owner => fnd_global.user_name);
524
525 wf_engine.StartProcess(itemtype => l_itemtype,
526 itemkey => l_itemkey);
527
528
529 pon_auction_pkg.unset_session_language;
530
531 END send_eval_team_update_notif;
532
533
534 PROCEDURE gen_eval_team_update_body(p_document_id IN VARCHAR2,
535 p_display_type IN VARCHAR2,
536 x_document IN OUT NOCOPY CLOB,
537 x_document_type IN OUT NOCOPY VARCHAR2)
538 IS
539
540 CURSOR c_changed_team_members(p_auction_header_id IN NUMBER,
541 p_member_user_id IN NUMBER)
542 IS
543 SELECT pmetm.user_id,
544 pmets.team_name,
545 pas.section_name,
546 pmetm.status_code
547 FROM pon_mng_eval_team_members pmetm,
548 pon_mng_eval_team_sections pmets,
549 pon_auction_sections pas
550 WHERE pmetm.auction_header_id = p_auction_header_id
551 AND pmets.auction_header_id = p_auction_header_id
552 AND pas.auction_header_id = p_auction_header_id
553 AND pmets.team_id = pmetm.team_id
554 AND pas.section_id = pmets.section_id
555 AND ((pmetm.status_code = 'A' AND
556 pmets.status_code IN ('A', 'C'))
557 OR
558 (pmetm.status_code = 'D' AND
559 pmets.status_code IN ('C', 'D'))
560 )
561 AND pmetm.user_id = NVL(p_member_user_id, pmetm.user_id)
562 ORDER BY pmetm.status_code,
563 pmetm.user_id,
564 pmets.team_name,
565 pas.attr_group_seq_number;
566
567 CURSOR c_changed_team_sections(p_auction_header_id IN NUMBER,
568 p_member_user_id IN NUMBER)
569 IS
570 SELECT pmets.team_name,
571 pas.section_name,
572 pmets.status_code
573 FROM pon_mng_eval_team_members pmetm,
574 pon_mng_eval_team_sections pmets,
575 pon_auction_sections pas
576 WHERE pmetm.auction_header_id = p_auction_header_id
577 AND pmets.auction_header_id = p_auction_header_id
578 AND pas.auction_header_id = p_auction_header_id
579 AND pmets.team_id = pmetm.team_id
580 AND pas.section_id = pmets.section_id
581 AND pmetm.status_code = 'C'
582 AND pmets.status_code IN ('A', 'D')
583 AND pmetm.user_id = p_member_user_id
584 ORDER BY pmets.status_code,
585 pmets.team_name,
586 pas.attr_group_seq_number;
587
588 CURSOR c_changed_team_sections_all(p_auction_header_id IN NUMBER)
589 IS
590 SELECT pmets.team_name,
591 pas.section_name,
592 pmets.status_code
593 FROM pon_mng_eval_team_sections pmets,
594 pon_auction_sections pas
595 WHERE pmets.auction_header_id = p_auction_header_id
596 AND pas.auction_header_id = p_auction_header_id
597 AND pas.section_id = pmets.section_id
598 AND pmets.status_code IN ('A', 'D')
599 ORDER BY pmets.status_code,
600 pmets.team_name,
601 pas.attr_group_seq_number;
602
603 CURSOR c_notification_id(p_itemtype IN VARCHAR2,
604 p_itemkey IN VARCHAR2)
605 IS
606 SELECT notification_id
607 FROM wf_item_activity_statuses
608 WHERE item_type = p_itemtype
609 AND item_key = p_itemkey
610 AND assigned_user IS NOT NULL;
611
612 CURSOR c_has_full_access(p_auction_header_id IN NUMBER,
613 p_member_user_id IN NUMBER)
614 IS
615 SELECT 'Y'
616 FROM pon_neg_team_members
617 WHERE auction_header_id = p_auction_header_id
618 AND user_id = p_member_user_id
619 AND menu_name = 'PON_SOURCING_EDITNEG';
620
621 TYPE team_members_rec_type IS RECORD
622 ( user_id NUMBER,
623 team_name VARCHAR2(80),
624 sections VARCHAR2(4000),
625 status_code VARCHAR2(1)
626 );
627
628 TYPE team_sections_rec_type IS RECORD
629 ( team_name VARCHAR2(80),
630 sections VARCHAR2(4000),
631 status_code VARCHAR2(1)
632 );
633
634 TYPE team_members_tbl_type IS TABLE OF team_members_rec_type;
635 TYPE team_sections_tbl_type IS TABLE OF team_sections_rec_type;
636
637 l_team_members_tbl team_members_tbl_type := team_members_tbl_type();
638 l_team_sections_tbl team_sections_tbl_type := team_sections_tbl_type();
639
640 l_team_members_rec team_members_rec_type;
641 l_team_sections_rec team_sections_rec_type;
642
643 l_user_id NUMBER;
644 l_team_name pon_evaluation_teams.team_name%TYPE;
645 l_section_name pon_auction_sections.section_name%TYPE;
646 l_status_code VARCHAR2(1);
647
648 l_itemtype VARCHAR2(8);
649 l_itemkey VARCHAR2(240);
650
651 l_auction_header_id pon_auction_headers_all.auction_header_id%TYPE;
652 l_member_user_id fnd_user.user_id%TYPE;
653 l_doc_type VARCHAR2(50);
654 l_doc_number pon_auction_headers_all.document_number%TYPE;
655 l_neg_summary_url VARCHAR2(2000);
656 l_notification_id NUMBER;
657 l_has_full_access VARCHAR2(1);
658
659 l_language_code VARCHAR2(3);
660 l_msg_name VARCHAR2(30);
661 l_document VARCHAR2(32000) := fnd_global.newline;
662
663 BEGIN
664
665 l_itemtype := SUBSTR(p_document_id, 1, INSTR(p_document_id, ':') - 1);
666 l_itemkey := SUBSTR(p_document_id, INSTR(p_document_id, ':') + 1,
667 LENGTH(p_document_id));
668
669 l_auction_header_id := wf_engine.GetItemAttrText(itemtype => l_itemtype,
670 itemkey => l_itemkey,
671 aname => 'AUCTION_ID');
672
673 l_member_user_id := wf_engine.GetItemAttrText(itemtype => l_itemtype,
674 itemkey => l_itemkey,
675 aname => 'MEMBER_USER_ID');
676
677 l_doc_type := wf_engine.GetItemAttrText(itemtype => l_itemtype,
678 itemkey => l_itemkey,
679 aname => 'DOC_TYPE');
680
681 l_doc_number := wf_engine.GetItemAttrText(itemtype => l_itemtype,
682 itemkey => l_itemkey,
683 aname => 'DOC_NUMBER');
684
685 l_neg_summary_url := wf_engine.GetItemAttrText
686 ( itemtype => l_itemtype,
687 itemkey => l_itemkey,
688 aname => 'NEG_SUMMARY_URL'
689 );
690
691 OPEN c_notification_id(l_itemtype, l_itemkey);
692 FETCH c_notification_id INTO l_notification_id;
693 CLOSE c_notification_id;
694
695 IF (l_notification_id IS NOT NULL) THEN
696 l_neg_summary_url := REPLACE(l_neg_summary_url,
697 'NID', l_notification_id);
698 END IF;
699
700 OPEN c_has_full_access(l_auction_header_id, l_member_user_id);
701 FETCH c_has_full_access INTO l_has_full_access;
702 CLOSE c_has_full_access;
703
704
705 -- 1. Get list of changed team members and their section assigments
706
707 IF (l_has_full_access = 'Y') THEN
708 OPEN c_changed_team_members(l_auction_header_id, NULL);
709 ELSE
710 OPEN c_changed_team_members(l_auction_header_id, l_member_user_id);
711 END IF;
712
713 LOOP
714 FETCH c_changed_team_members
715 INTO l_user_id, l_team_name, l_section_name, l_status_code;
716
717 EXIT WHEN c_changed_team_members%NOTFOUND;
718
719 IF (l_team_members_rec.user_id = l_user_id AND
720 l_team_members_rec.team_name = l_team_name AND
721 l_team_members_rec.status_code = l_status_code)
722 THEN
723 l_team_members_rec.sections := l_team_members_rec.sections || ', ' ||
724 l_section_name;
725 ELSE
726 IF (l_team_members_rec.user_id IS NOT NULL) THEN
727 l_team_members_tbl.EXTEND();
728 l_team_members_tbl(l_team_members_tbl.LAST) := l_team_members_rec;
729 END IF;
730
731 l_team_members_rec.user_id := l_user_id;
732 l_team_members_rec.team_name := l_team_name;
733 l_team_members_rec.sections := l_section_name;
734 l_team_members_rec.status_code := l_status_code;
735 END IF;
736
737 END LOOP;
738
739 IF (l_team_members_rec.user_id IS NOT NULL) THEN
740 l_team_members_tbl.EXTEND();
741 l_team_members_tbl(l_team_members_tbl.LAST) := l_team_members_rec;
742 END IF;
743
744 CLOSE c_changed_team_members;
745
746
747 -- 2. Get list of changed team sections assignment
748
749 IF (l_has_full_access = 'Y') THEN
750
751 OPEN c_changed_team_sections_all(l_auction_header_id);
752
753 LOOP
754 FETCH c_changed_team_sections_all
755 INTO l_team_name, l_section_name, l_status_code;
756
757 EXIT WHEN c_changed_team_sections_all%NOTFOUND;
758
759 IF (l_team_sections_rec.team_name = l_team_name AND
760 l_team_sections_rec.status_code = l_status_code)
761 THEN
762 l_team_sections_rec.sections := l_team_sections_rec.sections || ', ' ||
763 l_section_name;
764 ELSE
765 IF (l_team_sections_rec.team_name IS NOT NULL) THEN
766 l_team_sections_tbl.EXTEND();
767 l_team_sections_tbl(l_team_sections_tbl.LAST) := l_team_sections_rec;
768 END IF;
769
770 l_team_sections_rec.team_name := l_team_name;
771 l_team_sections_rec.sections := l_section_name;
772 l_team_sections_rec.status_code := l_status_code;
773 END IF;
774
775 END LOOP;
776
777 IF (l_team_sections_rec.team_name IS NOT NULL) THEN
778 l_team_sections_tbl.EXTEND();
779 l_team_sections_tbl(l_team_sections_tbl.LAST) := l_team_sections_rec;
780 END IF;
781
782 CLOSE c_changed_team_sections_all;
783
784 ELSE
785
786 OPEN c_changed_team_sections(l_auction_header_id, l_member_user_id);
787
788 LOOP
789 FETCH c_changed_team_sections
790 INTO l_team_name, l_section_name, l_status_code;
791
792 EXIT WHEN c_changed_team_sections%NOTFOUND;
793
794 IF (l_team_sections_rec.team_name = l_team_name AND
795 l_team_sections_rec.status_code = l_status_code)
796 THEN
797 l_team_sections_rec.sections := l_team_sections_rec.sections || ', ' ||
798 l_section_name;
799 ELSE
800 IF (l_team_sections_rec.team_name IS NOT NULL) THEN
801 l_team_sections_tbl.EXTEND();
802 l_team_sections_tbl(l_team_sections_tbl.LAST) := l_team_sections_rec;
803 END IF;
804
805 l_team_sections_rec.team_name := l_team_name;
806 l_team_sections_rec.sections := l_section_name;
807 l_team_sections_rec.status_code := l_status_code;
808 END IF;
809
810 END LOOP;
811
812 IF (l_team_sections_rec.team_name IS NOT NULL) THEN
813 l_team_sections_tbl.EXTEND();
814 l_team_sections_tbl(l_team_sections_tbl.LAST) := l_team_sections_rec;
815 END IF;
816
817 CLOSE c_changed_team_sections;
818
819 END IF;
820
821
822 -- 3. Construct the message body based on the above 2 lists
823
824 pon_profile_util_pkg.get_wf_language(l_member_user_id, l_language_code);
825 pon_auction_pkg.set_session_language(NULL, l_language_code);
826
827 FOR i IN 1..l_team_members_tbl.COUNT LOOP
828
829 l_team_members_rec := l_team_members_tbl(i);
830
831 IF (l_team_members_rec.status_code = 'A') THEN
832 l_msg_name := 'PON_SM_ET_MEMBER_ADDED';
833 ELSE
834 l_msg_name := 'PON_SM_ET_MEMBER_REMOVED';
835 END IF;
836
837 IF (p_display_type = 'text/html') THEN
838 l_msg_name := l_msg_name || '_HB';
839 ELSE
840 l_msg_name := l_msg_name || '_TB';
841 END IF;
842
843 fnd_message.set_name('PON', l_msg_name);
844 fnd_message.set_token
845 ( 'TEAM_MEMBER',
846 get_display_name_for_user(l_team_members_rec.user_id)
847 );
848 fnd_message.set_token('DOC_TYPE', l_doc_type);
849 fnd_message.set_token('DOC_NUMBER', l_doc_number);
850 fnd_message.set_token('TEAM_NAME', l_team_members_rec.team_name);
851 fnd_message.set_token('SECTIONS', l_team_members_rec.sections);
852
853 IF (p_display_type = 'text/html') THEN
854 fnd_message.set_token('NEG_SUMMARY_URL', l_neg_summary_url);
855 END IF;
856
857 l_document := l_document || fnd_message.get;
858
859 END LOOP;
860
861 FOR i IN 1..l_team_sections_tbl.COUNT LOOP
862
863 l_team_sections_rec := l_team_sections_tbl(i);
864
865 IF (l_team_sections_rec.status_code = 'A') THEN
866 l_msg_name := 'PON_SM_ET_SECTION_ADDED';
867 ELSE
868 l_msg_name := 'PON_SM_ET_SECTION_REMOVED';
869 END IF;
870
871 IF (p_display_type = 'text/html') THEN
872 l_msg_name := l_msg_name || '_HB';
873 ELSE
874 l_msg_name := l_msg_name || '_TB';
875 END IF;
876
877 fnd_message.set_name('PON', l_msg_name);
878
879 fnd_message.set_token('TEAM_NAME', l_team_sections_rec.team_name);
880 fnd_message.set_token('SECTIONS', l_team_sections_rec.sections);
881 fnd_message.set_token('DOC_TYPE', l_doc_type);
882 fnd_message.set_token('DOC_NUMBER', l_doc_number);
883
884 IF (p_display_type = 'text/html') THEN
885 fnd_message.set_token('NEG_SUMMARY_URL', l_neg_summary_url);
886 END IF;
887
888 l_document := l_document || fnd_message.get;
889
890 END LOOP;
891
892 wf_notification.WriteToClob(x_document, l_document);
893
894 pon_auction_pkg.unset_session_language;
895
896 END gen_eval_team_update_body;
897
898
899 PROCEDURE send_eval_update_scorer_notif(p_bid_number IN NUMBER)
900 IS
901
902 CURSOR c_auction_details
903 IS
904 SELECT pah.document_number,
905 pah.auction_header_id,
906 pah.auction_title,
907 hz.party_name preparer_tp_name,
908 pad.message_suffix
909 FROM pon_bid_headers pbh,
910 pon_auction_headers_all pah,
911 pon_auc_doctypes pad,
912 hz_parties hz
913 WHERE pbh.bid_number = p_bid_number
914 AND pah.auction_header_id = pbh.auction_header_id
915 AND pad.doctype_id = pah.doctype_id
916 AND hz.party_id = pah.trading_partner_id;
917
918 CURSOR c_notify_scorer
919 IS
920 SELECT DISTINCT
921 fus.user_name scorer_user_name,
922 pon_locale_pkg.get_party_display_name(pbh.evaluator_id)
923 AS evaluator_name
924 FROM pon_bid_headers pbh,
925 fnd_user fue,
926 pon_evaluation_team_members petm,
927 pon_evaluation_team_sections pets,
928 pon_scoring_team_members pstm,
929 pon_scoring_team_sections psts,
930 fnd_user fus
931 WHERE pbh.bid_number = p_bid_number
932 AND pbh.evaluation_flag = 'Y'
933 AND pbh.evaluator_id = fue.person_party_id
934 AND petm.user_id = fue.user_id
935 AND petm.auction_header_id = pbh.auction_header_id
936 AND pets.auction_header_id = pbh.auction_header_id
937 AND pets.team_id = petm.team_id
938 AND fus.user_id = pstm.user_id
939 AND pstm.auction_header_id = pbh.auction_header_id
940 AND psts.auction_header_id = pbh.auction_header_id
941 AND psts.team_id = pstm.team_id
942 AND psts.section_id = pets.section_id
943 AND psts.section_id IN
944 (SELECT pas.section_id
945 FROM pon_auction_sections pas,
946 pon_auction_attributes paa
947 WHERE pas.auction_header_id = pbh.auction_header_id
948 AND paa.auction_header_id = pbh.auction_header_id
949 AND paa.attr_group_seq_number = pas.attr_group_seq_number
950 AND paa.line_number= -1
951 AND paa.internal_attr_flag = 'Y'
952 AND paa.scoring_method = 'MANUAL'
953 );
954
955 TYPE notify_tbl_type IS TABLE OF c_notify_scorer%ROWTYPE;
956
957 l_notify_tbl notify_tbl_type;
958
959 l_doc_number pon_auction_headers_all.document_number%TYPE;
960 l_auction_header_id pon_auction_headers_all.auction_header_id%TYPE;
961 l_auction_title pon_auction_headers_all.auction_title%TYPE;
962 l_preparer_tp_name hz_parties.party_name%TYPE;
963 l_msg_suffix pon_auc_doctypes.message_suffix%TYPE;
964 l_language_code VARCHAR2(3);
965 l_doc_type VARCHAR2(50);
966 l_eval_update_sub VARCHAR2(2000);
967 l_neg_summary_url VARCHAR2(2000);
968
969 l_sequence NUMBER;
970 l_itemtype VARCHAR2(8) := 'PONAUCT';
971 l_itemkey VARCHAR2(240);
972
973 BEGIN
974
975 OPEN c_notify_scorer;
976 FETCH c_notify_scorer BULK COLLECT INTO l_notify_tbl;
977 CLOSE c_notify_scorer;
978
979 IF (l_notify_tbl.COUNT = 0) THEN
980 RETURN;
981 END IF;
982
983
984 OPEN c_auction_details;
985 FETCH c_auction_details INTO l_doc_number,
986 l_auction_header_id,
987 l_auction_title,
988 l_preparer_tp_name,
989 l_msg_suffix;
990 CLOSE c_auction_details;
991
992
993 FOR i IN 1..l_notify_tbl.COUNT LOOP
994
995 pon_profile_util_pkg.get_wf_language(l_notify_tbl(i).scorer_user_name,
996 l_language_code);
997 pon_auction_pkg.set_session_language(NULL, l_language_code);
998
999
1000 l_doc_type := pon_auction_pkg.getMessage('PON_AUCTION', '_'||l_msg_suffix);
1001
1002 fnd_message.set_name('PON', 'PON_SM_EVAL_UPDATE_SCORER_SUB');
1003 fnd_message.set_token('DOC_TYPE', l_doc_type);
1004 fnd_message.set_token('DOC_NUMBER', l_doc_number);
1005 fnd_message.set_token('AUCTION_TITLE', l_auction_title);
1006 l_eval_update_sub := fnd_message.get;
1007
1008 l_neg_summary_url := pon_wf_utl_pkg.get_dest_page_url
1009 ( p_dest_func => 'PON_NEG_SUMMARY',
1010 p_notif_performer => 'BUYER'
1011 );
1012
1013
1014 SELECT pon_auction_wf_s.nextval
1015 INTO l_sequence
1016 FROM dual;
1017
1018 l_itemkey := l_auction_header_id || '-' || l_sequence;
1019
1020 wf_engine.CreateProcess(itemtype => l_itemtype,
1021 itemkey => l_itemkey,
1022 process => 'NOTIFY_SCORER_EVAL_UPDATE');
1023
1024 wf_engine.SetItemAttrText(itemtype => l_itemtype,
1025 itemkey => l_itemkey,
1026 aname => 'AUCTION_ID',
1027 avalue => l_auction_header_id);
1028
1029 wf_engine.SetItemAttrText(itemtype => l_itemtype,
1030 itemkey => l_itemkey,
1031 aname => 'DOC_TYPE',
1032 avalue => l_doc_type);
1033
1034 wf_engine.SetItemAttrText(itemtype => l_itemtype,
1035 itemkey => l_itemkey,
1036 aname => 'DOC_NUMBER',
1037 avalue => l_doc_number);
1038
1039 wf_engine.SetItemAttrText(itemtype => l_itemtype,
1040 itemkey => l_itemkey,
1041 aname => 'AUCTION_TITLE',
1042 avalue => l_auction_title);
1043
1044 wf_engine.SetItemAttrText(itemtype => l_itemtype,
1045 itemkey => l_itemkey,
1046 aname => 'PREPARER_TP_NAME',
1047 avalue => l_preparer_tp_name);
1048
1049 wf_engine.SetItemAttrText(itemtype => l_itemtype,
1050 itemkey => l_itemkey,
1051 aname => 'ORIGIN_USER_NAME',
1052 avalue => fnd_global.user_name);
1053
1054 wf_engine.SetItemAttrText(itemtype => l_itemtype,
1055 itemkey => l_itemkey,
1056 aname => 'RECIPIENT_ROLE',
1057 avalue => l_notify_tbl(i).scorer_user_name);
1058
1059 wf_engine.SetItemAttrText(itemtype => l_itemtype,
1060 itemkey => l_itemkey,
1061 aname => 'TEAM_MEMBER',
1062 avalue => l_notify_tbl(i).evaluator_name);
1063
1064 wf_engine.SetItemAttrText(itemtype => l_itemtype,
1065 itemkey => l_itemkey,
1066 aname => 'EVAL_UPDATE_SCORER_SUBJECT',
1067 avalue => l_eval_update_sub);
1068
1069 wf_engine.SetItemAttrText(itemtype => l_itemtype,
1070 itemkey => l_itemkey,
1071 aname => 'EVAL_UPDATE_SCORER_BODY',
1072 avalue => 'plsqlclob:' ||
1073 'pon_eval_team_util_pvt.' ||
1074 'gen_eval_update_scorer_body/' ||
1075 l_itemtype || ':' ||
1076 l_itemkey);
1077
1078 wf_engine.SetItemAttrText(itemtype => l_itemtype,
1079 itemkey => l_itemkey,
1080 aname => 'NEG_SUMMARY_URL',
1081 avalue => l_neg_summary_url);
1082
1083
1084 wf_engine.SetItemOwner(itemtype => l_itemtype,
1085 itemkey => l_itemkey,
1086 owner => fnd_global.user_name);
1087
1088 wf_engine.StartProcess(itemtype => l_itemtype,
1089 itemkey => l_itemkey);
1090
1091
1092 pon_auction_pkg.unset_session_language;
1093
1094 END LOOP;
1095
1096 END send_eval_update_scorer_notif;
1097
1098
1099 PROCEDURE gen_eval_update_scorer_body(p_document_id IN VARCHAR2,
1100 p_display_type IN VARCHAR2,
1101 x_document IN OUT NOCOPY CLOB,
1102 x_document_type IN OUT NOCOPY VARCHAR2)
1103 IS
1104
1105 CURSOR c_notification_id(p_itemtype IN VARCHAR2,
1106 p_itemkey IN VARCHAR2)
1107 IS
1108 SELECT notification_id
1109 FROM wf_item_activity_statuses
1110 WHERE item_type = p_itemtype
1111 AND item_key = p_itemkey
1112 AND assigned_user IS NOT NULL;
1113
1114 l_itemtype VARCHAR2(8);
1115 l_itemkey VARCHAR2(240);
1116
1117 l_team_member VARCHAR2(240);
1118 l_neg_summary_url VARCHAR2(2000);
1119 l_doc_type VARCHAR2(50);
1120 l_doc_number pon_auction_headers_all.document_number%TYPE;
1121 l_auction_title pon_auction_headers_all.auction_title%TYPE;
1122 l_scorer_user_name fnd_user.user_name%TYPE;
1123 l_notification_id NUMBER;
1124
1125 l_language_code VARCHAR2(3);
1126 l_document VARCHAR2(32000);
1127
1128 BEGIN
1129
1130 l_itemtype := SUBSTR(p_document_id, 1, INSTR(p_document_id, ':') - 1);
1131 l_itemkey := SUBSTR(p_document_id, INSTR(p_document_id, ':') + 1,
1132 LENGTH(p_document_id));
1133
1134 l_team_member := wf_engine.GetItemAttrText(itemtype => l_itemtype,
1135 itemkey => l_itemkey,
1136 aname => 'TEAM_MEMBER');
1137
1138 l_doc_type := wf_engine.GetItemAttrText(itemtype => l_itemtype,
1139 itemkey => l_itemkey,
1140 aname => 'DOC_TYPE');
1141
1142 l_doc_number := wf_engine.GetItemAttrText(itemtype => l_itemtype,
1143 itemkey => l_itemkey,
1144 aname => 'DOC_NUMBER');
1145
1146 l_auction_title := wf_engine.GetItemAttrText(itemtype => l_itemtype,
1147 itemkey => l_itemkey,
1148 aname => 'AUCTION_TITLE');
1149
1150 l_scorer_user_name := wf_engine.GetItemAttrText
1151 ( itemtype => l_itemtype,
1152 itemkey => l_itemkey,
1153 aname => 'RECIPIENT_ROLE'
1154 );
1155
1156 l_neg_summary_url := wf_engine.GetItemAttrText
1157 ( itemtype => l_itemtype,
1158 itemkey => l_itemkey,
1159 aname => 'NEG_SUMMARY_URL'
1160 );
1161
1162 OPEN c_notification_id(l_itemtype, l_itemkey);
1163 FETCH c_notification_id INTO l_notification_id;
1164 CLOSE c_notification_id;
1165
1166 IF (l_notification_id IS NOT NULL) THEN
1167 l_neg_summary_url := REPLACE(l_neg_summary_url,
1168 'NID', l_notification_id);
1169 END IF;
1170
1171
1172 pon_profile_util_pkg.get_wf_language(l_scorer_user_name, l_language_code);
1173 pon_auction_pkg.set_session_language(NULL, l_language_code);
1174
1175 IF (p_display_type = 'text/html') THEN
1176 fnd_message.set_name('PON', 'PON_SM_EVAL_UPDATE_SCORER_HB');
1177 ELSE
1178 fnd_message.set_name('PON', 'PON_SM_EVAL_UPDATE_SCORER_TB');
1179 END IF;
1180
1181 fnd_message.set_token('TEAM_MEMBER', l_team_member);
1182 fnd_message.set_token('DOC_TYPE', l_doc_type);
1183 fnd_message.set_token('DOC_NUMBER', l_doc_number);
1184 fnd_message.set_token('AUCTION_TITLE', l_auction_title);
1185 fnd_message.set_token('NEG_SUMMARY_URL', l_neg_summary_url);
1186 l_document := fnd_message.get;
1187
1188 wf_notification.WriteToClob(x_document, l_document);
1189
1190 pon_auction_pkg.unset_session_language;
1191
1192 END gen_eval_update_scorer_body;
1193
1194
1195 END PON_EVAL_TEAM_UTIL_PVT;