1 PACKAGE BODY PON_AWARD_PKG as
2 -- $Header: PONAWRDB.pls 120.63.12020000.5 2013/04/29 12:04:55 hvutukur ship $
3
4 -- a collection that stores numbers
5 TYPE integerList IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
6
7 g_debug_mode CONSTANT VARCHAR2(1) := NVL(FND_PROFILE.VALUE('AFLOG_ENABLED'),'N');
8
9 procedure award_child_line(
10 p_auction_header_id IN Number,
11 p_line_num IN Number,
12 p_award_lines IN t_award_lines,
13 p_auctioneer_id IN Number);
14
15 /* Bug : 16721126 : This function checks if supplier placed offer on a line or not?
16 * If supplier does not place offer on a line, record is deleted
17 * from pon_bid_item_prices table.
18 */
19 FUNCTION check_bid_line_exist(p_auction_header_id IN Number,
20 p_bid_number IN NUMBER,
21 p_line_number IN NUMBER)
22 RETURN NUMBER
23 IS
24
25 l_count NUMBER := 0;
26 BEGIN
27
28 SELECT Count(1)
29 INTO l_count
30 FROM pon_bid_item_prices
31 WHERE auction_header_id = p_auction_header_id
32 AND bid_number = p_bid_number
33 AND auction_line_number = p_line_number;
34
35 RETURN l_count;
36
37 END check_bid_line_exist;
38
39 -- choli update for emd
40 PROCEDURE NotifyEmdAdmin(
41 p_auction_header_id NUMBER, -- 2
42 p_emd_admin_name VARCHAR2, -- 3
43 p_auction_tp_name VARCHAR2, -- 4
44 p_auction_title VARCHAR2, -- 5
45 p_auction_header_id_encrypted VARCHAR2, -- 6
46 x_doc_number_dsp PON_AUCTION_HEADERS_ALL.DOCUMENT_NUMBER%TYPE) IS
47
48
49
50 x_number_awarded NUMBER;
51 x_number_rejected NUMBER;
52 x_sequence NUMBER;
53 x_itemtype VARCHAR2(8) := 'PONAWARD';
54 x_itemkey VARCHAR2(50);
55 x_bid_list VARCHAR2(1);
56 x_progress VARCHAR2(3);
57 x_bid_contact_tp_dp_name varchar2(240);
58 x_auction_type varchar2(30);
59 x_auction_type_name varchar2(30) := '';
60 x_event_title varchar2(80);
61 x_event_id NUMBER;
62 x_auction_open_bidding_date DATE;
63 x_auction_close_bidding_date DATE;
64 x_language_code VARCHAR2(3) := null;
65 x_timezone VARCHAR2(80);
66 x_newstarttime DATE;
67 x_newendtime DATE;
68 x_newawardtime DATE;
69 x_doctype_group_name VARCHAR2(60);
70 x_msg_suffix VARCHAR2(3) := '';
71
72 x_auction_round_number NUMBER;
73 x_doctype_id_value NUMBER;
74 x_oex_timezone VARCHAR2(80);
75 x_bidder_contact_id NUMBER;
76 x_timezone_disp VARCHAR2(240);
77 x_bid VARCHAR2(10);
78 x_bid_caps VARCHAR2(10);
79 x_note_to_supplier PON_BID_HEADERS.NOTE_TO_SUPPLIER%TYPE;
80 x_view_quote_url_supplier VARCHAR2(2000);
81 x_award_date PON_AUCTION_HEADERS_ALL.AWARD_DATE%TYPE;
82 x_trading_partner_contact_name PON_AUCTION_HEADERS_ALL.TRADING_PARTNER_CONTACT_NAME%TYPE;
83 x_tp_display_name PON_BID_HEADERS.TRADING_PARTNER_NAME%TYPE;
84 x_tp_address_name PON_BID_HEADERS.VENDOR_SITE_CODE%TYPE;
85 x_preview_date DATE;
86 x_preview_date_in_tz DATE;
87 x_timezone1_disp VARCHAR2(240);
88 x_has_items_flag PON_AUCTION_HEADERS_ALL.HAS_ITEMS_FLAG%TYPE;
89 x_staggered_closing_interval NUMBER;
90 x_staggered_close_note VARCHAR2(1000);
91 x_bid_award_status PON_BID_HEADERS.AWARD_STATUS%TYPE;
92
93
94
95 BEGIN
96
97 IF ( fnd_log.level_unexpected >= fnd_log.g_current_runtime_level) THEN
98 fnd_log.string(log_level => fnd_log.level_unexpected
99 ,module => 'pon_award_pkg.NotifyEmdAdmin'
100 ,message => 'Start calling NotifyEmdAdmin');
101 END IF;
102 x_progress := '010';
103
104 --
105 -- Get the bidder's language code so that the c1_bid_info
106 -- has right value for x_language_code
107 --
108 IF p_emd_admin_name is not null THEN
109 PON_PROFILE_UTIL_PKG.GET_WF_LANGUAGE(p_emd_admin_name,x_language_code);
110 END IF;
111
112 -- Set the userenv language so the message token (attribute) values that we retrieve using the
113 -- getMessage call return the message in the correct language => x_language_code
114
115
116 pon_auction_pkg.SET_SESSION_LANGUAGE(null, x_language_code);
117
118 --
119 -- Get next value in sequence for itemkey
120 --
121
122 SELECT pon_auction_wf_acbid_s.nextval
123 INTO x_sequence
124 FROM dual;
125
126 --
127 -- get the contact name and auction type
128 --
129
130
131 x_progress := '020';
132
133
134
135 x_itemkey := (to_char(p_emd_admin_name)||'-'||to_char(x_sequence));
136
137 x_progress := '022';
138
139 --
140 -- Create the wf process
141 --
142
143 wf_engine.CreateProcess(itemtype => x_itemtype,
144 itemkey => x_itemkey,
145 process => 'NOTIFY_EMD_ADMIN_PROCESS');
146
147 --
148 -- Set all the item attributes
149 --
150 wf_engine.SetItemAttrNumber (itemtype => x_itemtype,
151 itemkey => x_itemkey,
152 aname => 'AUCTION_ID',
153 avalue => p_auction_header_id);
154 /* Setting the Company header attribute */
155 wf_engine.SetItemAttrText(itemtype => x_itemtype
156 ,itemkey => x_itemkey
157 ,aname => 'AUCTION_TP_NAME'
158 ,avalue => p_auction_tp_name);
159 /* wf_engine.SetItemAttrText (itemtype => x_itemtype,
160 itemkey => x_itemkey,
161 aname => 'PON_AUC_WF_AWARD_SUBJECT',
162 avalue => pon_auction_pkg.getMessage('PON_AUC_WF_AWARD_SUBJECT', x_msg_suffix,
163 'DOC_NUMBER', x_doc_number_dsp,
164 'AUCTION_TITLE', pon_auction_pkg.replaceHtmlChars(p_auction_title))); */
165
166 wf_engine.SetItemAttrText (itemtype => x_itemtype,
167 itemkey => x_itemkey,
168 aname => 'PON_AUC_WF_AWARD_SUBJECT',
169 avalue => 'Auction' || x_doc_number_dsp || '(' || p_auction_title || ') has been awarded');
170 /* Setting the negotiation title header attribute */
171 wf_engine.SetItemAttrText(itemtype => x_itemtype
172 ,itemkey => x_itemkey
173 ,aname => 'AUCTION_TITLE'
174 ,avalue => pon_auction_pkg.replaceHtmlChars(p_auction_title));
175 wf_engine.SetItemAttrText (itemtype => x_itemtype,
176 itemkey => x_itemkey,
177 aname => 'AUCTION_TYPE_NAME',
178 avalue => x_auction_type_name);
179
180 wf_engine.SetItemAttrText (itemtype => x_itemtype,
181 itemkey => x_itemkey,
182 aname => 'EMD_APPROVER',
183 avalue => p_emd_admin_name);
184 -- Bug 4295915: Set the workflow owner
185 wf_engine.SetItemAttrText (itemtype => x_itemtype,
186 itemkey => x_itemkey,
187 aname => 'ORIGIN_USER_NAME',
188 avalue => fnd_global.user_name);
189
190 wf_engine.SetItemOwner(itemtype => x_itemtype,
191 itemkey => x_itemkey,
192 owner => fnd_global.user_name);
193
194
195 --
196 -- Start the workflow
197 --
198
199 wf_engine.StartProcess(itemtype => x_itemtype,
200 itemkey => x_itemkey );
201 pon_auction_pkg.UNSET_SESSION_LANGUAGE;
202
203 x_progress := '029';
204 IF ( fnd_log.level_unexpected >= fnd_log.g_current_runtime_level) THEN
205 fnd_log.string(log_level => fnd_log.level_unexpected
206 ,module => 'pon_award_pkg.NotifyEmdAdmin'
207 ,message => 'End calling NotifyEmdAdmin');
208 END IF;
209
210 END;
211
212 PROCEDURE update_all_bid_item_prices
213 (
214 p_bid_number IN NUMBER,
215 p_award_status IN VARCHAR2,
216 p_award_date IN DATE,
217 p_auctioneer_id IN NUMBER
218 ) IS
219
220 l_max_line_number NUMBER;
221 l_batch_size NUMBER;
222 l_batch_start NUMBER;
223 l_batch_end NUMBER;
224 l_commit_flag BOOLEAN;
225
226 BEGIN
227
228 -- by default, we do not want to commit intermittently
229 l_commit_flag := FALSE;
230
231 -- just set award_qty same as bid_qty
232 select nvl(max(line_number),0)
233 into l_max_line_number
234 from pon_bid_item_prices
235 where bid_number = p_bid_number
236 AND auction_line_number <> -1; --Unsolicited Lines Project : Fetch only solicitation lines.
237
238 l_batch_size := PON_LARGE_AUCTION_UTIL_PKG.BATCH_SIZE;
239
240 l_batch_start := 1;
241 IF (l_max_line_number <l_batch_size) THEN
242 l_batch_end := l_max_line_number;
243 ELSE
244 l_commit_flag := TRUE; -- commit if we are going to loop over multiple times
245 l_batch_end := l_batch_size;
246 END IF;
247
248
249 WHILE (l_batch_start <= l_max_line_number) LOOP --{ main-batching-loop
250
251 UPDATE PON_BID_ITEM_PRICES pbip
252 SET
253 (pbip.award_status,
254 pbip.award_quantity,
255 pbip.award_date,
256 pbip.last_update_date,
257 pbip.last_updated_by,
258 pbip.award_price,
259 pbip.award_shipment_number) =
260 (
261 select
262 p_award_status,
263 decode (paip.group_type, 'LOT_LINE', null,
264 'GROUP', null,
265 decode (paha.contract_type, 'BLANKET',paip.quantity,
266 decode (paip.order_type_lookup_code, 'FIXED PRICE', 1,
267 'AMOUNT', 1,
268 'RATE', 1, pbip.quantity ))),
269 p_award_date,
270 p_award_date,
271 p_auctioneer_id,
272 pbip.price,
273 null
274 from
275 pon_auction_item_prices_all paip,
276 pon_auction_headers_all paha
277 where pbip.bid_number = p_bid_number
278 and pbip.auction_header_id = paip.auction_header_id
279 and pbip.line_number = paip.line_number
280 and paha.auction_header_id = pbip.auction_header_id
281 )
282 where
283 pbip.bid_number = p_bid_number and
284 pbip.line_number >= l_batch_start and
285 pbip.line_number <= l_batch_end AND
286 pbip.auction_line_number IN (SELECT line_number
287 FROM pon_auction_item_prices_all
288 WHERE auction_header_id = pbip.auction_header_id
289 AND Nvl(award_status, 'NO') <> 'COMPLETED'); --Staggered Awards project
290
291 l_batch_start := l_batch_end + 1;
292
293 IF (l_batch_end + l_batch_size > l_max_line_number) THEN
294 l_batch_end := l_max_line_number;
295 ELSE
296 l_batch_end := l_batch_end + l_batch_size;
297 END IF;
298
299
300 IF(l_commit_flag = TRUE) THEN
301 COMMIT;
302 END IF;
303
304 END LOOP; --} --end-loop
305
306 END update_all_bid_item_prices;
307
308
309 PROCEDURE update_all_auction_item_prices
310 (
311 p_auction_id IN NUMBER,
312 p_bid_number IN NUMBER,
313 p_award_date IN DATE,
314 p_auctioneer_id IN NUMBER
315 ) IS
316
317 l_batch_size NUMBER;
318 l_batch_start NUMBER;
319 l_batch_end NUMBER;
320 l_max_line_number NUMBER;
321 l_commit_flag BOOLEAN;
322
323 BEGIN
324
325 -- by default, we do not want to commit intermittently
326 l_commit_flag := FALSE;
327
328 select nvl(max(line_number),0)
329 into l_max_line_number
330 from pon_auction_item_prices_all
331 where auction_header_id = p_auction_id;
332
333 l_batch_size := PON_LARGE_AUCTION_UTIL_PKG.BATCH_SIZE;
334
335 l_batch_start := 1;
336
337 IF (l_max_line_number <l_batch_size) THEN
338 l_batch_end := l_max_line_number;
339 ELSE
340 l_commit_flag := TRUE; -- commit if we are going to loop over multiple times
341 l_batch_end := l_batch_size;
342 END IF;
343
344 WHILE (l_batch_start <= l_max_line_number) LOOP --{ main-batching-loop
345
346 UPDATE pon_auction_item_prices_all paip
347 SET
348 (paip.award_status,
349 paip.awarded_quantity,
350 paip.award_mode,
351 paip.last_update_date,
352 paip.last_updated_by) =
353 (
354 select
355 decode (pbip.award_status, 'AWARDED', 'AWARDED', 'REJECTED', 'AWARDED', 'PARTIAL', 'AWARDED', to_char(null)),
356 decode (paip.group_type, 'LOT_LINE', null,
357 'GROUP', null,
358 decode (paip.order_type_lookup_code, 'FIXED PRICE', 1,
359 'AMOUNT', 1,
360 'RATE', 1,
361 decode (paha.contract_type, 'BLANKET', 1, 'CONTRACT', 1, pbip.quantity) ) ),
362 g_AWARD_QUOTE,
363 p_award_date,
364 p_auctioneer_id
365 from
366 pon_bid_item_prices pbip,
367 pon_auction_headers_all paha
368 where pbip.bid_number = p_bid_number
369 and pbip.auction_header_id = paip.auction_header_id
370 and pbip.line_number = paip.line_number
371 and paha.auction_header_id = pbip.auction_header_id
372 )
373 where
374 paip.auction_header_id = p_auction_id and
375 paip.line_number >= l_batch_start and
376 paip.line_number <= l_batch_end AND
377 Nvl(paip.award_status, 'NO') <> 'COMPLETED'; --Staggered Awards project
378
379 l_batch_start := l_batch_end + 1;
380
381 IF (l_batch_end + l_batch_size > l_max_line_number) THEN
382 l_batch_end := l_max_line_number;
383 ELSE
384 l_batch_end := l_batch_end + l_batch_size;
385 END IF;
386
387 IF(l_commit_flag = TRUE) THEN
388 COMMIT;
389 END IF;
390
391 END LOOP; --} --end-loop- batching
392
393 --
394 END update_all_auction_item_prices;
395
396
397
398 -- This method is kind of redundant because we now use the
399 -- award status flag to determine which item is awarded and
400 -- which is not.
401 -- So removed all the old code to delete unawarded items and only
402 -- doing an update of the award quantity
403
404 PROCEDURE clean_unawarded_items (p_batch_id IN NUMBER) IS
405
406 BEGIN
407
408 -- update the award quantity to 0 for those fields that have award quantity
409 -- less than 0
410 UPDATE pon_award_items_interface
411 SET award_quantity = 0
412 WHERE batch_id = p_batch_id
413 AND award_quantity < 0;
414
415 COMMIT;
416
417 END clean_unawarded_items;
418
419
420 /*
421 Reject the active bids on negotiation items that were not awarded
422 and cancel backing requisitions for the items, if any
423 */
424 PROCEDURE reject_unawarded_active_bids(p_auction_header_id IN NUMBER,
425 p_user_id IN NUMBER,
426 p_note_to_rejected IN VARCHAR2,
427 p_neg_has_lines IN VARCHAR2) IS
428
429 -- select all active bid items for for which award decision is not made.
430 -- this includes auction lines with no award decision made
431 -- and auction lines with award decision made but have bid items unawarded
432 CURSOR active_bid_lines(p_auction_header_id NUMBER) IS
433 select al.line_number,
434 al.line_origination_code,
435 nvl(al.award_status,'NO'),
436 bl.bid_number,
437 bl.order_number,
438 bl.award_quantity
439 from pon_auction_item_prices_all al,
440 pon_bid_item_prices bl,
441 pon_bid_headers bh
442 where al.auction_header_id = p_auction_header_id
443 and bl.auction_header_id = al.auction_header_id
444 and bl.line_number = al.line_number
445 and bh.bid_number = bl.bid_number
446 and nvl(bh.bid_status,'NONE') = 'ACTIVE'
447 -- we get lines with award decision made but have some bids unawarded
448 --and nvl(al.award_status,'NO') = 'NO'
449 and nvl(bl.award_status,'NO') = 'NO';
450
451 -- FPK: CPA select all active bids for which award decision is not made.
452 CURSOR active_bid_headers(p_auction_header_id NUMBER) IS
453 select nvl(ah.award_status,'NO'),
454 bh.bid_number
455 from pon_auction_headers_all ah,
456 pon_bid_headers bh
457 where bh.auction_header_id = p_auction_header_id
458 and bh.auction_header_id = ah.auction_header_id
459 and nvl(bh.bid_status,'NONE') = 'ACTIVE'
460 and nvl(bh.award_status,'NO') = 'NO';
461
462
463 x_line_number pon_auction_item_prices_all.line_number%type;
464 x_old_line_number pon_auction_item_prices_all.line_number%type;
465 x_line_origination_code pon_auction_item_prices_all.line_origination_code%type;
466 x_bid_number pon_bid_headers.bid_number%type;
467 x_order_number pon_bid_headers.order_number%type;
468 x_award_quantity pon_bid_item_prices.award_quantity%type;
469 x_line_award_status pon_auction_item_prices_all.award_status%type;
470 x_stored_note_to_rejected pon_acceptances.reason%type;
471 x_error_code VARCHAR2(20);
472
473 x_bid_number_list integerList;
474 x_bid_number_found BOOLEAN;
475 x_count NUMBER;
476
477 -- FPK: CPA
478 x_header_award_status PON_BID_HEADERS.AWARD_STATUS%TYPE;
479
480 --Bug : 14134092
481 l_is_line_type_enabled VARCHAR2(1);
482
483 BEGIN
484
485 --Bug : 14134092 : If line type structure changes are enabled, then fund allocation will be done for all lines.
486 l_is_line_type_enabled := PON_CLM_UTIL_PKG.get_line_structure_enabled(p_auction_header_id => p_auction_header_id);
487
488 IF p_neg_has_lines = 'Y' THEN -- FPK: CPA
489 open active_bid_lines(p_auction_header_id); --Bug : 14134092
490 loop
491 fetch active_bid_lines
492 into x_line_number,
493 x_line_origination_code,
494 x_line_award_status,
495 x_bid_number,
496 x_order_number,
497 x_award_quantity;
498 exit when active_bid_lines%notfound;
499 -- "AND x_line_award_status = 'NO'" condition added
500 -- to ensure ONLY lines with NO award decision made are put back into the pool.
501 --Bug : 14134092 : If an unsol line linked to autocreated sol line is awarded, donot take req back to pool.
502 if (x_line_origination_code = 'REQUISITION' AND x_line_award_status = 'NO'
503 AND PON_UNSOL_UTIL_PKG.CAN_PUT_REQ_IN_POOL(p_auction_header_id, x_line_number, l_is_line_type_enabled) = 'Y') then
504 PON_AUCTION_PKG.CANCEL_NEGOTIATION_REF_BY_LINE(p_auction_header_id, x_line_number, x_error_code);
505 end if;
506 /*
507 -- reject the bid line (note that reject shares the same
508 -- procedure as award)
509 award_bid (x_order_number, -- p_order_number
510 p_user_id, -- p_auctioneer_id
511 p_auction_header_id, -- p_auction_header_id
512 x_bid_number, -- p_bid_number
513 x_line_number, -- p_auction_line_number
514 x_award_quantity, -- p_award_quantity
515 'REJECTED', -- p_award_status
516 p_note_to_rejected, -- p_reason
517 sysdate, -- p_award_date,
518 null, -- p_originPartyId: obsolete
519 null, -- p_originUserId: obsolete
520 null, -- p_currency: obsolete
521 null -- p_billType: obsolete
522 );
523 */
524 -- added for the new award flow in FPJ
525 -- Need to take care of notes in pon_acceptances.
526 update_single_bid_item_prices
527 (
528 x_bid_number,
529 x_line_number,
530 'REJECTED',
531 x_award_quantity,
532 sysdate,
533 p_user_id
534 );
535
536 -- determine if the bid number of the bid line has been added to the list
537 x_bid_number_found := FALSE;
538
539 FOR i IN 1 .. x_bid_number_list.COUNT LOOP
540 IF x_bid_number = x_bid_number_list(i) THEN
541 x_bid_number_found := TRUE;
542 EXIT;
543 END IF;
544 END LOOP;
545
546 -- if not, add it to the list
547 IF NOT(x_bid_number_found) THEN
548 x_bid_number_list(x_bid_number_list.COUNT + 1) := x_bid_number;
549 END IF;
550
551 -- complete or award item disposition as necessary
552 -- there could be multiple bids for the same line
553 -- only need to call it once for each line
554 IF (x_old_line_number is null OR
555 x_old_line_number <> x_line_number) THEN
556 x_old_line_number := x_line_number;
557
558 IF (x_line_award_status = 'NO') THEN
559 -- Update acceptances for the lines with no award decision made
560 update_unawarded_acceptances(
561 p_auction_header_id, -- auction header id
562 x_line_number, -- line number
563 p_note_to_rejected, --note to rejected suppliers
564 SYSDATE, -- award_date
565 p_user_id);
566 ELSE
567 -- Update acceptances for the lines with award decision already made
568 x_stored_note_to_rejected := null;
569 x_count := 0;
570 SELECT count(*) INTO x_count FROM pon_acceptances
571 WHERE auction_header_id = p_auction_header_id
572 AND line_number = x_line_number
573 AND ACCEPTANCE_TYPE = 'REJECTED';
574 --
575 IF x_count > 0 THEN
576 -- rejection note exists and carried over for rejected suppliers
577 SELECT distinct REASON INTO x_stored_note_to_rejected
578 FROM pon_acceptances
579 WHERE auction_header_id = p_auction_header_id
580 AND line_number = x_line_number
581 AND ACCEPTANCE_TYPE = 'REJECTED';
582 END IF;
583 --
584 update_unawarded_acceptances(
585 p_auction_header_id, -- auction header id
586 x_line_number, -- line number
587 x_stored_note_to_rejected, --note to rejected suppliers
588 SYSDATE, -- award_date
589 p_user_id);
590 END IF;
591 award_item_disposition (p_auction_header_id, x_line_number, 0);
592 END IF;
593
594 END LOOP;
595 CLOSE active_bid_lines;
596
597 -- update the award status for the bids whose lines were rejected
598 FOR i IN 1 .. x_bid_number_list.COUNT LOOP
599 update_single_bid_header(x_bid_number_list(i), p_user_id);
600 END LOOP;
601
602 -- update the award status for the auction that was bidded on
603 -- if any bid line was rejected
604 IF x_bid_number_list.COUNT > 0 THEN
605 update_auction_headers(p_auction_header_id, g_AWARD_LINE, SYSDATE, p_user_id, 'Y');
606 END IF;
607 ELSE -- negotiation does not have lines
608 OPEN active_bid_headers(p_auction_header_id);
609 LOOP
610 FETCH active_bid_headers
611 INTO x_header_award_status, x_bid_number;
612 EXIT WHEN active_bid_headers%NOTFOUND;
613
614 -- determine if the bid number has been added to the list
615 x_bid_number_found := FALSE;
616
617 FOR i IN 1 .. x_bid_number_list.COUNT LOOP
618 IF x_bid_number = x_bid_number_list(i) THEN
619 x_bid_number_found := TRUE;
620 EXIT;
621 END IF;
622 END LOOP;
623
624 -- if not, add it to the list
625 IF NOT(x_bid_number_found) THEN
626 x_bid_number_list(x_bid_number_list.COUNT + 1) := x_bid_number;
627 END IF;
628 END LOOP;
629 CLOSE active_bid_headers;
630
631 -- update the award status for the active bids in this auction where no
632 -- award decision made (all bids will be rejected)
633 FORALL k IN 1..x_bid_number_list.COUNT
634
635 UPDATE PON_BID_HEADERS
636 SET AWARD_STATUS = 'REJECTED',
637 AWARD_DATE = SYSDATE, /* new column created as part of CPA project.
638 It will be updated only when negotiation does
639 not have lines. */
640 last_update_date = SYSDATE,
641 last_updated_by = p_user_id
642 WHERE bid_number = x_bid_number_list(k);
643
644 -- update the award status for the auction that was bidded on
645 -- and no award decision made
646 IF x_bid_number_list.COUNT > 0 THEN
647 update_auction_headers(p_auction_header_id, g_AWARD_QUOTE, SYSDATE,
648 p_user_id, 'N');
649 END IF;
650 END IF; -- IF neg. has lines
651 END reject_unawarded_active_bids;
652
653 ----------------------------------------------------------------
654 -- Complete award process for a negotiation
655 -- mirrors NegotiationDoc.completeAward which is gone after
656 -- migration to OA
657 -- also contains some logic from reviewComplete.jsp
658 ----------------------------------------------------------------
659
660 PROCEDURE complete_award (p_auction_header_id_encrypted IN VARCHAR2,
661 p_auction_header_id IN NUMBER,
662 p_note_to_rejected IN VARCHAR2,
663 p_shared_award_decision IN VARCHAR2,
664 p_user_id IN NUMBER,
665 p_create_po_flag IN VARCHAR2,
666 p_source_reqs_flag IN VARCHAR2,
667 p_no_bids_flag IN VARCHAR2,
668 p_has_backing_reqs_flag IN VARCHAR2,
669 p_outcome_status IN VARCHAR2,
670 p_has_scoring_teams_flag IN VARCHAR2,
671 p_scoring_lock_tpc_id IN NUMBER,
672 p_finally_complete IN VARCHAR2 DEFAULT 'N') IS
673
674 x_line_number pon_auction_item_prices_all.line_number%type;
675 x_line_origination_code pon_auction_item_prices_all.line_origination_code%type;
676 x_error_code VARCHAR2(20);
677 x_awarded_quantity NUMBER;
678 l_neg_has_lines PON_AUCTION_HEADERS_ALL.HAS_ITEMS_FLAG%TYPE; -- FPK: CPA
679
680 --Business Events Changes
681 x_return_status VARCHAR2(20);
682 x_msg_count NUMBER;
683 x_msg_data VARCHAR2(2000);
684
685 -- select items without any bids that had backing requisitions
686 /*Bug : 14134092 : If there are no bids for autocreated lines, check if any unsol lines are linked
687 and line type is enabled. */
688 CURSOR items_with_reqs_no_bids(p_auction_header_id NUMBER, p_is_line_type_enabled VARCHAR2) IS
689 SELECT line_number, line_origination_code
690 FROM PON_AUCTION_ITEM_PRICES_ALL paip
691 WHERE auction_header_id = p_auction_header_id
692 AND nvl(number_of_bids,0) = 0
693 AND line_origination_code = 'REQUISITION'
694 AND NOT EXISTS
695 (SELECT 1
696 FROM pon_auction_headers_all pah,
697 pon_bid_item_prices pbip,
698 pon_bid_item_references pbir
699 WHERE pah.auction_header_id = p_auction_header_id
700 AND Nvl(pah.ALLOW_UNSOL_OFFER_LINES,'N') = 'Y'
701 AND pbip.auction_header_id = pah.auction_header_id
702 AND pbip.auction_line_number = -1
703 AND Nvl(pbip.award_status, 'REJECTED') = 'AWARDED'
704 AND pbir.auction_header_id = pbip.auction_header_id
705 AND pbir.line_number = pbip.line_number
706 AND pbir.auction_line_number = paip.line_number
707 AND pbir.link_done_by = 'BOTH'
708 AND p_is_line_type_enabled = 'Y');
709
710
711 CURSOR auction_items_all (p_auction_header_id NUMBER) IS
712 SELECT line_number, nvl(awarded_quantity, 0)
713 FROM PON_AUCTION_ITEM_PRICES_ALL
714 WHERE auction_header_id = p_auction_header_id;
715
716 --Line Type and Structute Changes Project
717 CURSOR c_has_linked_pr_refs IS
718 SELECT Count(*) FROM pon_backing_requisitions
719 WHERE auction_header_id = p_auction_header_id;
720
721 l_linked_pr_refs_count NUMBER;
722
723 -- Unsolicited Lines Project
724 l_allow_unsol_lines VARCHAR2(1);
725 l_neg_has_unsol_lines VARCHAR2(1);
726
727 --Bug : 14134092
728 l_is_line_type_enabled VARCHAR2(1);
729
730 --Staggered Awards project
731 l_allow_stag_awards VARCHAR2(1);
732 l_has_unawarded_lines VARCHAR2(1);
733 l_unawarded_line_count NUMBER;
734 l_line_count NUMBER;
735
736
737 BEGIN
738
739 l_neg_has_lines := PON_AUCTION_PKG.neg_has_lines(p_auction_header_id); -- FPK: CPA
740
741 select nvl(allow_staggered_awards, 'N') into l_allow_stag_awards from pon_auction_headers_all where auction_header_id = p_auction_header_id;
742
743 select count(DISTINCT line_number) into l_unawarded_line_count from pon_auction_item_prices_all where auction_header_id = p_auction_header_id and nvl(award_status,'NO') = 'NO';
744
745 select count(DISTINCT line_number) into l_line_count from pon_auction_item_prices_all where auction_header_id = p_auction_header_id;
746
747 if (l_unawarded_line_count > 0 AND l_unawarded_line_count <> l_line_count AND p_finally_complete <> 'Y') then
748 l_has_unawarded_lines := 'Y';
749 else
750 l_has_unawarded_lines := 'N';
751 end if;
752 ----
753 -- Unsolicited Lines Project
754 l_allow_unsol_lines := PON_UNSOL_UTIL_PKG.ARE_UNSOL_LINES_ALLOWED(p_auction_header_id);
755 IF l_allow_unsol_lines = 'Y' THEN
756 l_neg_has_unsol_lines := PON_UNSOL_UTIL_PKG.HAS_UNSOL_LINES(p_auction_header_id);
757 ELSE
758 l_neg_has_unsol_lines := 'N';
759 END IF;
760 -- End Unsolicited Lines Project
761
762 -- Donot put back the req is staggered awarding is enabled and neg is partially awarded
763 if (p_create_po_flag <> 'Y' and p_has_backing_reqs_flag = 'Y' and (l_allow_stag_awards <> 'Y' or l_has_unawarded_lines = 'N')) then
764 -- put requisitions back in pool if auction
765 -- has backing req and no outcome creation
766 PON_AUCTION_PKG.CANCEL_NEGOTIATION_REF(p_auction_header_id, x_error_code);
767 end if;
768
769 --Line Type and Structute Changes Project
770 OPEN c_has_linked_pr_refs;
771 FETCH c_has_linked_pr_refs INTO l_linked_pr_refs_count;
772 CLOSE c_has_linked_pr_refs;
773
774 -- put requisitions back in pool if auction
775 -- has backing req and no outcome creation
776 -- Donot put back the req is staggered awarding is enabled and sol is partially awarded
777 IF (p_create_po_flag <> 'Y' and l_linked_pr_refs_count > 0 and (l_allow_stag_awards <> 'Y' or l_has_unawarded_lines = 'N')) then
778 po_negotiations_sv1.update_sol_ref_delete_all(p_auction_header_id => p_auction_header_id,
779 p_delete_pbr_yn => 'N',
780 x_return_status => x_return_status,
781 x_error_msg => x_msg_data,
782 x_error_code => x_error_code);
783 END IF;
784
785 /* FPK: CPA
786 If negotiation has lines: for all items that have active bids but are not awarded,
787 reject the active bids and cancel backing requisitions, if any
788 If negotiation does not have lines: reject all active bids that were not awarded n
789 nor rejected (no award decision was made)
790 */
791 /* Unsolicited lines project : If unsol lines are allowed and any offer has unsol lines, call a different procedure
792 * to reject unawarded neg and unsol lines.
793 */
794 --Donot reject un awarded lines if staggered awards are enabled
795 if (l_allow_stag_awards = 'N' OR (l_allow_stag_awards = 'Y' AND l_has_unawarded_lines = 'N')) then
796 IF l_neg_has_unsol_lines = 'Y' THEN
797 PON_UNSOL_AWARD_PKG.reject_unawarded_unsol_bids(p_auction_header_id, p_user_id, p_note_to_rejected);
798 ELSE
799 reject_unawarded_active_bids(p_auction_header_id, p_user_id, p_note_to_rejected, l_neg_has_lines);
800 END IF;
801 end if;
802
803 IF l_neg_has_unsol_lines = 'Y' THEN
804 PON_UNSOL_UTIL_PKG.DUPLICATE_UNSOL_AWARDED_LINES(p_auction_header_id);
805 END IF;
806
807 --Bug : 14134092
808 l_is_line_type_enabled := PON_CLM_UTIL_PKG.get_line_structure_enabled(p_auction_header_id => p_auction_header_id);
809
810 /* Line structure changes project:
811 When completing award, copy all the PR references of lines awarded to pon_bid_backing_requisitions table.
812 We can award unsolicited lines and relate to solicited lines. So, we should copy all PR references to pon_bid_backing_requisitions*/
813
814 --CLM-LnSc-st
815 --copy only IF(IS CLm PO, outcome document is award and if encumberence is 'on' and if Outcome Document is created.
816
817 --Bug : 14134092
818 IF(l_is_line_type_enabled = 'Y' AND p_create_po_flag = 'Y') THEN
819
820 create_pon_bid_back_req(p_auction_header_id);
821 END IF;
822 --CLM-LnSc-end
823
824 -- Requisitions should be put back into the pool if
825 -- an item has received no bids and the buyer
826 -- is completing the auction
827
828 IF l_neg_has_lines = 'Y' THEN -- FPK: CPA
829 --Bug : 14134092
830 open items_with_reqs_no_bids(p_auction_header_id, l_is_line_type_enabled);
831 loop
832
833 /*
834 rrkulkar-large-auction-support changes
835 modified the cursor to simply loop over the exact set of lines
836 rather than looping over all the lines, and filtering the lines
837 in the cursor-loop by adding an if condition
838
839 */
840 fetch items_with_reqs_no_bids
841 into x_line_number,
842 x_line_origination_code;
843 exit when items_with_reqs_no_bids%notfound;
844
845 PON_AUCTION_PKG.CANCEL_NEGOTIATION_REF_BY_LINE(p_auction_header_id, x_line_number, x_error_code);
846
847 end loop;
848 close items_with_reqs_no_bids;
849 --
850
851 /*
852 rrkulkar-large-auction-support changes
853 instead of looping over all the lines, we can update all
854 lines in a single query
855
856 */
857
858 /*
859 rrkulkar-large-auction-support : commented out the call to complete_item_disposition
860 need to add batching here
861 */
862 --complete award should update only for awarded lines as COMPLETED if staggered awards are enabled
863 if l_allow_stag_awards = 'Y' and l_has_unawarded_lines = 'Y' then
864 update pon_auction_item_prices_all
865 set AWARD_STATUS = 'COMPLETED',
866 LAST_UPDATE_DATE = sysdate,
867 AWARDED_QUANTITY = nvl(awarded_quantity,0)
868 where auction_header_id = p_auction_header_id
869 and AWARD_STATUS = 'AWARDED';
870 else
871 update pon_auction_item_prices_all
872 set AWARD_STATUS = 'COMPLETED',
873 LAST_UPDATE_DATE = sysdate,
874 AWARDED_QUANTITY = nvl(awarded_quantity,0)
875 where auction_header_id = p_auction_header_id;
876 end if;
877
878
879 END IF; -- IF l_neg_has_lines = 'Y'
880 --
881 -- if team scoring is enabled, call routine to lock team scoring
882 IF (p_has_scoring_teams_flag = 'Y') THEN
883 -- check to see if the auction was already locked for scoring
884 -- if this were true, the p_scoring_lock_tpc_id will be -1
885 -- as determined in the CompleteAwardAM from where this API is called.
886 IF (p_scoring_lock_tpc_id = -1) THEN
887 NULL;
888 ELSE
889 -- call pvt API to lock scoring
890 IF ( fnd_log.level_unexpected >= fnd_log.g_current_runtime_level) THEN
891 fnd_log.string(log_level => fnd_log.level_unexpected
892 ,module => 'pon_award_pkg.complete_award'
893 ,message => 'before calling private API to lock team scoring');
894 END IF;
895
896 PON_TEAM_SCORING_UTIL_PVT.lock_scoring(p_api_version => 1
897 ,p_auction_header_id => p_auction_header_id
898 ,p_tpc_id => p_scoring_lock_tpc_id
899 ,x_return_status => x_return_status
900 ,x_msg_data => x_msg_data
901 ,x_msg_count => x_msg_count);
902
903 IF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
904 IF ( fnd_log.level_unexpected >= fnd_log.g_current_runtime_level) THEN
905 fnd_log.string(log_level => fnd_log.level_unexpected
906 ,module => 'pon_award_pkg.complete_award'
907 ,message => 'Error while locking team scoring');
908 END IF;
909 END IF;
910 END IF;
911 END IF;
912
913
914 IF l_allow_stag_awards = 'Y' and l_has_unawarded_lines = 'Y' then
915 complete_partial_auction(p_auction_header_id); --retain partial award_status for further awarding
916 ELSE
917 complete_auction (p_auction_header_id);
918 END IF;
919
920 award_notification (p_auction_header_id_encrypted,
921 p_auction_header_id,
922 p_shared_award_decision);
923
924 -- post processing: originally in reviewComplete.jsp
925 -- For no bids we would come directly to this page.
926 -- Thus setShareAwardDecision will be N. We do not want that.
927 -- As otherwise the button will appear in bidViewAuction
928 -- update database w/ outcome status, source req result,
929 -- and award completion date
930 update pon_auction_headers_all
931 set outcome_status = p_outcome_status,
932 award_complete_date = sysdate,
933 source_reqs_flag = p_source_reqs_flag,
934 share_award_decision = decode(p_no_bids_flag, 'Y', 'I', share_award_decision),
935 last_update_date = sysdate
936 where auction_header_id = p_auction_header_id;
937
938 -- Raise Business Event
939 PON_BIZ_EVENTS_PVT.RAISE_NEG_AWRD_COMPLETE_EVENT(
940 p_api_version => 1.0 ,
941 p_init_msg_list => FND_API.G_FALSE,
942 p_commit => FND_API.G_FALSE,
943 p_auction_header_id => p_auction_header_id,
944 p_create_po_flag => p_create_po_flag,
945 x_return_status => x_return_status,
946 x_msg_count => x_msg_count,
947 x_msg_data => x_msg_data);
948
949 END complete_award;
950
951 ----------------------------------------------------------------
952 -- complete auction
953 -- mirrors NegotiationDoc.completeAuction which is gone after
954 -- migration to OA
955 ----------------------------------------------------------------
956
957 PROCEDURE complete_auction (p_auction_header_id IN NUMBER ) IS
958
959 x_event_id pon_auction_headers_all.event_id%type;
960 x_count NUMBER;
961
962 BEGIN
963 -- complete auction header disposition
964 -- clear out the request_id for super-large auctions
965 update pon_auction_headers_all
966 set AWARD_STATUS = 'COMPLETED',
967 AUCTION_STATUS = 'AUCTION_CLOSED',
968 REQUEST_ID = NULL,
969 LAST_UPDATE_DATE = sysdate
970 where auction_header_id = p_auction_header_id;
971
972 -- complete work flow
973 pon_auction_pkg.COMPLETE_AUCTION(p_auction_header_id);
974
975 END complete_auction;
976
977 ----------------------------------------------------------------
978 -- send award notifications
979 -- mirrors NegotiationDoc.awardNotification which is gone after
980 -- migration to OA
981 ----------------------------------------------------------------
982
983 PROCEDURE award_notification (p_auction_header_id_encrypted IN VARCHAR2,
984 p_auction_header_id IN NUMBER,
985 p_shared_award_decision IN VARCHAR2) IS
986
987 x_bid_number pon_bid_headers.bid_number%type;
988 x_bid_tp_contact_name pon_bid_headers.trading_partner_contact_name%type;
989 x_auction_tp_name pon_auction_headers_all.trading_partner_name%type;
990 x_auction_title pon_auction_headers_all.auction_title%type;
991 x_emd_admin_name pon_neg_team_members.user_name%type;
992 x_doc_number_dsp pon_auction_headers_all.document_number%type;
993 CURSOR all_bidders(p_auction_header_id NUMBER) IS
994 select b.bid_number,
995 b.trading_partner_contact_name contact,
996 a.trading_partner_name auctioneer,
997 a.auction_title,
998 a.allow_staggered_awards, --added for staggered award project
999 b.award_status -- added for staggered award project
1000 from pon_bid_headers b,
1001 pon_auction_headers_all a
1002 where b.auction_header_id = p_auction_header_id
1003 and not nvl(b.bid_status,'NONE') in ('ARCHIVED','DISQUALIFIED','DRAFT')
1004 and a.auction_header_id = b.auction_header_id;
1005
1006 -- choli update for emd
1007 CURSOR all_emdAdmins(p_auction_header_id NUMBER) IS
1008 select u.user_name,
1009 a.trading_partner_name auctioneer,
1010 a.auction_title,
1011 a.document_number
1012 from pon_neg_team_members b, pon_auction_headers_all a, fnd_user u
1013 where b.menu_name = 'EMD_ADMIN'
1014 and b.approver_flag = 'Y'
1015 and a.auction_header_id = b.auction_header_id
1016 and u.user_id = b.user_id
1017 and a.auction_header_id = p_auction_header_id;
1018
1019 --Staggered award project
1020 x_bid_award_status pon_bid_headers.award_status%type;
1021 x_allow_staggered_awards pon_auction_headers_all.allow_staggered_awards%TYPE;
1022 x_completed_lines NUMBER;
1023
1024 BEGIN
1025
1026 if (p_shared_award_decision = 'Y') then
1027
1028 -- send a notification to each supplier
1029 open all_bidders(p_auction_header_id);
1030 loop
1031 fetch all_bidders
1032 into x_bid_number,
1033 x_bid_tp_contact_name,
1034 x_auction_tp_name,
1035 x_auction_title,
1036 x_allow_staggered_awards,
1037 x_bid_award_status;
1038 exit when all_bidders%notfound;
1039
1040 SELECT Count(*)
1041 INTO x_completed_lines
1042 FROM pon_bid_item_prices
1043 WHERE auction_header_id = p_auction_header_id
1044 AND bid_number = x_bid_number
1045 AND auction_line_number IN (SELECT line_number FROM pon_auction_item_prices_all WHERE auction_header_id = p_auction_header_id AND Nvl(award_status, 'NO') = 'COMPLETED');
1046
1047 IF x_completed_lines > 0 THEN
1048
1049 pon_auction_pkg.AWARD_BID(x_bid_number,
1050 p_auction_header_id,
1051 x_bid_tp_contact_name,
1052 x_auction_tp_name,
1053 x_auction_title,
1054 p_auction_header_id_encrypted);
1055 END IF;
1056 end loop;
1057 close all_bidders;
1058
1059 -- update pon_auction_headers_all
1060 update pon_auction_headers_all
1061 set SHARE_AWARD_DECISION = p_shared_award_decision
1062 where auction_header_id = p_auction_header_id;
1063
1064 end if;
1065
1066 -- choli update for emd
1067 open all_emdAdmins(p_auction_header_id);
1068 loop
1069 fetch all_emdAdmins
1070 into x_emd_admin_name,
1071 x_auction_tp_name,
1072 x_auction_title,
1073 x_doc_number_dsp;
1074 exit when all_emdAdmins%notfound;
1075
1076 NotifyEmdAdmin(p_auction_header_id,
1077 x_emd_admin_name,
1078 x_auction_tp_name,
1079 x_auction_title,
1080 p_auction_header_id_encrypted,
1081 x_doc_number_dsp);
1082 end loop;
1083 close all_emdAdmins;
1084
1085 END award_notification;
1086
1087 ----------------------------------------------------------------
1088 -- complete item disposition
1089 -- mirrors NegotiationItem.completeDisposition which is gone after
1090 -- migration to OA
1091 ----------------------------------------------------------------
1092
1093 PROCEDURE complete_item_disposition (p_auction_header_id IN NUMBER,
1094 p_line_number IN NUMBER,
1095 p_award_quantity IN NUMBER) IS
1096
1097 BEGIN
1098 update pon_auction_item_prices_all
1099 set AWARD_STATUS = 'COMPLETED',
1100 LAST_UPDATE_DATE = sysdate,
1101 AWARDED_QUANTITY = p_award_quantity
1102 where auction_header_id = p_auction_header_id
1103 and line_number = p_line_number;
1104
1105 END complete_item_disposition;
1106
1107
1108 ----------------------------------------------------------------
1109 -- award item disposition
1110 -- mirrors complete_item_disposition
1111 -- except that pon_auction_item_prices_all.award_status column is set to AWARDED (instead of COMPLETED)
1112 ----------------------------------------------------------------
1113
1114 PROCEDURE award_item_disposition (p_auction_header_id IN NUMBER,
1115 p_line_number IN NUMBER,
1116 p_award_quantity IN NUMBER) IS
1117
1118 BEGIN
1119 update pon_auction_item_prices_all
1120 set AWARD_STATUS = 'AWARDED',
1121 LAST_UPDATE_DATE = sysdate,
1122 AWARDED_QUANTITY = p_award_quantity
1123 where auction_header_id = p_auction_header_id
1124 and line_number = p_line_number;
1125
1126 END award_item_disposition;
1127
1128
1129 /* ELINs project : This procedure will award exhibit lines associated to particular line
1130 Call this procedure in AWARD_BY_LINE mode.
1131 */
1132 PROCEDURE award_exhibit_lines(p_auction_header_id IN Number,
1133 p_line_num IN Number,
1134 p_award_lines IN t_award_lines,
1135 p_auctioneer_id IN Number)
1136
1137 IS
1138 Cursor exhibitsCursor Is
1139 select paip.line_number
1140 from pon_auction_exhibit_details paed,
1141 pon_auction_item_prices_all paip
1142 where paed.auction_header_id = p_auction_header_id
1143 and paed.associated_to_line = p_line_num
1144 AND paip.auction_header_id = paed.auction_header_id
1145 AND paip.exhibit_number IS NOT NULL
1146 AND paip.exhibit_number = paed.exhibit_number ;
1147
1148 l_award_price pon_bid_item_prices.award_price%TYPE;
1149 l_award_quantity pon_bid_item_prices.award_quantity%TYPE;
1150 l_size NUMBER;
1151 l_index NUMBER;
1152 l_auction_award_qty NUMBER;
1153
1154 BEGIN
1155 IF (g_debug_mode = 'Y') THEN
1156 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1157 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.award_exhibit_lines', 'Entering procedure with p_auction_header_id : ' || p_auction_header_id || ' p_line_num : ' || p_line_num || ' ,p_auctioneer_id : '|| p_auctioneer_id);
1158 END IF;
1159 END IF;
1160
1161 FOR elin IN exhibitsCursor LOOP
1162 --This will mark current exhibit line with appropriate award status
1163 award_child_line(p_auction_header_id, elin.line_number, p_award_lines, p_auctioneer_id);
1164
1165 l_auction_award_qty := 0;
1166 l_size := p_award_lines.count;
1167
1168 FOR l_index IN 1..l_size LOOP
1169 l_award_price := NULL;
1170 l_award_quantity := NULL;
1171
1172 /* Bug : 16721126 : Update award_price, award_quantity only when offer exists on a line */
1173 IF check_bid_line_exist(p_auction_header_id, p_award_lines(l_index).bid_Number, elin.line_number) = 1 THEN
1174
1175 SELECT decode(pbip.award_status, 'REJECTED', null,
1176 decode (paip.order_type_lookup_code,
1177 'FIXED PRICE', 1,
1178 'AMOUNT', 1,
1179 'RATE', decode (paip.purchase_basis, 'TEMP LABOR', pbip.quantity, 1), pbip.quantity ))
1180 INTO l_award_quantity
1181 FROM pon_bid_item_prices pbip,
1182 pon_auction_item_prices_all paip
1183 WHERE pbip.bid_number = p_award_lines(l_index).bid_Number
1184 AND pbip.auction_line_number = elin.line_number
1185 AND paip.auction_header_id = pbip.auction_header_id
1186 AND paip.line_number = pbip.line_number;
1187
1188 l_auction_award_qty := l_auction_award_qty + Nvl(l_award_quantity,0);
1189
1190 IF (l_award_quantity <> 0 ) THEN
1191
1192 SELECT decode(pbip.award_status, 'REJECTED', null,
1193 pbip.per_unit_price_component + pbip.fixed_amount_component /l_award_quantity)
1194 INTO l_award_price
1195 FROM pon_bid_item_prices pbip,
1196 pon_auction_item_prices_all paip
1197 WHERE pbip.bid_number = p_award_lines(l_index).bid_Number
1198 AND pbip.auction_line_number = elin.line_number
1199 AND paip.auction_header_id = pbip.auction_header_id
1200 AND paip.line_number = pbip.line_number;
1201
1202 END IF;
1203
1204 UPDATE pon_bid_item_prices pbip
1205 SET award_price = l_award_price,
1206 award_quantity = l_award_quantity
1207 WHERE pbip.bid_number = p_award_lines(l_index).bid_Number
1208 AND pbip.auction_line_number = elin.line_number;
1209
1210 END IF; -- End check_bid_line_exist
1211
1212 END LOOP; -- End p_award_lines loop
1213
1214 UPDATE pon_auction_item_prices_all paip
1215 SET paip.awarded_quantity = decode (paip.order_type_lookup_code,
1216 'FIXED PRICE', 1,
1217 'AMOUNT', 1,
1218 'RATE', decode (paip.purchase_basis, 'TEMP LABOR', l_auction_award_qty, 1),l_auction_award_qty )
1219 WHERE auction_header_id = p_auction_header_id
1220 AND line_number = elin.line_number;
1221
1222 END LOOP; --End exhibitsCursor loop
1223
1224 END award_exhibit_lines;
1225
1226
1227 /* ELINs project : This procedure will award parent exhibit line. */
1228 PROCEDURE award_elin_parent_line(p_auction_header_id IN Number,
1229 p_line_num IN Number,
1230 p_award_lines IN t_award_lines,
1231 p_auctioneer_id IN Number)
1232 IS
1233 l_parent_line pon_auction_item_prices_all.line_number%TYPE;
1234 is_parent_slin VARCHAR2(1);
1235 l_award_price pon_bid_item_prices.award_price%TYPE;
1236 l_award_quantity pon_bid_item_prices.award_quantity%TYPE;
1237 l_size NUMBER;
1238 l_index NUMBER;
1239 l_auction_award_qty NUMBER;
1240 l_award_status VARCHAR2(10);
1241 BEGIN
1242 -- This sql gets parent line for an elin. Also whether parent is clin/slin.
1243 SELECT paed.associated_to_line, Decode(Nvl(paip_parent.group_line_id, -1), -1, 'N', 'Y')
1244 INTO l_parent_line, is_parent_slin
1245 FROM pon_auction_item_prices_all paip_elin,
1246 pon_auction_exhibit_details paed,
1247 pon_auction_item_prices_all paip_parent
1248 WHERE paip_elin.auction_header_id = p_auction_header_id
1249 AND paip_elin.line_number = p_line_num
1250 AND paed.auction_header_id = paip_elin.auction_header_id
1251 AND paed.exhibit_number = paip_elin.exhibit_number
1252 AND paip_parent.auction_header_id = paed.auction_header_id
1253 AND paip_parent.line_number = paed.associated_to_line;
1254
1255 l_auction_award_qty := 0;
1256 l_size := p_award_lines.count;
1257
1258 /* Update elin parent line with appropriate award status.
1259 * Update only when award_status is 'REJECTED'.
1260 */
1261 FOR l_index IN 1..l_size LOOP
1262
1263 /* Bug : 16721126 : Update parent only when offer exisits on parent line. */
1264 IF check_bid_line_exist(p_auction_header_id, p_award_lines(l_index).bid_number, l_parent_line) = 1 THEN
1265 UPDATE PON_BID_ITEM_PRICES
1266 set award_status = p_award_lines(l_index).award_status,
1267 award_date = p_award_lines(l_index).award_date,
1268 last_update_date = p_award_lines(l_index).award_date,
1269 last_updated_by = p_auctioneer_id
1270 where bid_number = p_award_lines(l_index).bid_number
1271 and line_number = l_parent_line
1272 AND Nvl(award_status, 'REJECTED') = 'REJECTED';
1273
1274 if ( (l_award_status is NULL) AND
1275 ((p_award_lines(l_index).award_status = 'AWARDED') OR
1276 -- (p_award_lines(l_index).award_status = 'REJECTED') OR -- bug#9741473
1277 (p_award_lines(l_index).award_status = 'PARTIAL')
1278 )) THEN
1279 l_award_status := 'AWARDED';
1280 end if;
1281 END IF; --end check_bid_line_exist() = 1
1282
1283 END LOOP;
1284 -- update only when award_status = 'REJECTED'
1285 UPDATE pon_auction_item_prices_all
1286 set award_status = l_award_status,
1287 last_update_date = sysdate,
1288 last_updated_by = p_auctioneer_id
1289 where auction_header_id = p_auction_header_id
1290 and line_number = l_parent_line
1291 AND Nvl(award_status, 'REJECTED') = 'REJECTED';
1292
1293 FOR l_index IN 1..l_size LOOP
1294 l_award_price := NULL;
1295 l_award_quantity := NULL;
1296
1297 /* Bug : 16721126 : Update parent only when offer exisits on parent line. */
1298 IF check_bid_line_exist(p_auction_header_id, p_award_lines(l_index).bid_number, l_parent_line) = 1 THEN
1299 SELECT decode(pbip.award_status, 'REJECTED', null,
1300 decode (paip.order_type_lookup_code,
1301 'FIXED PRICE', 1,
1302 'AMOUNT', 1,
1303 'RATE', decode (paip.purchase_basis, 'TEMP LABOR', pbip.quantity, 1), pbip.quantity ))
1304 INTO l_award_quantity
1305 FROM pon_bid_item_prices pbip,
1306 pon_auction_item_prices_all paip
1307 WHERE pbip.bid_number = p_award_lines(l_index).bid_Number
1308 AND pbip.auction_line_number = l_parent_line
1309 AND paip.auction_header_id = pbip.auction_header_id
1310 AND paip.line_number = pbip.line_number;
1311
1312 l_auction_award_qty := l_auction_award_qty + Nvl(l_award_quantity,0);
1313
1314 IF (l_award_quantity <> 0 ) THEN
1315
1316 SELECT decode(pbip.award_status, 'REJECTED', null,
1317 pbip.per_unit_price_component + pbip.fixed_amount_component /l_award_quantity)
1318 INTO l_award_price
1319 FROM pon_bid_item_prices pbip,
1320 pon_auction_item_prices_all paip
1321 WHERE pbip.bid_number = p_award_lines(l_index).bid_Number
1322 AND pbip.auction_line_number = l_parent_line
1323 AND paip.auction_header_id = pbip.auction_header_id
1324 AND paip.line_number = pbip.line_number;
1325
1326 END IF;
1327
1328 UPDATE pon_bid_item_prices pbip
1329 SET award_price = l_award_price,
1330 award_quantity = l_award_quantity
1331 WHERE pbip.bid_number = p_award_lines(l_index).bid_Number
1332 AND pbip.auction_line_number = l_parent_line;
1333
1334 END IF; --end check_bid_line_exist(p_auction_header_id, p_award_lines(l_index).bid_number, l_parent_line) = 1
1335
1336
1337 END LOOP; -- End p_award_lines loop
1338
1339 --If exhibit parent line is SLIN, mark parent info clin.
1340 IF(is_parent_slin = 'Y') THEN
1341 award_parent_line(p_auction_header_id, l_parent_line, p_award_lines, p_auctioneer_id);
1342 ELSE
1343 --If parent line is clin, update info slins.
1344 award_info_slin_lines(p_auction_header_id, l_parent_line, p_award_lines, p_auctioneer_id);
1345 END IF;
1346
1347 UPDATE pon_auction_item_prices_all paip
1348 SET paip.awarded_quantity = decode (paip.order_type_lookup_code,
1349 'FIXED PRICE', 1,
1350 'AMOUNT', 1,
1351 'RATE', decode (paip.purchase_basis, 'TEMP LABOR', l_auction_award_qty, 1),l_auction_award_qty )
1352 WHERE auction_header_id = p_auction_header_id
1353 AND line_number = l_parent_line;
1354
1355
1356 END award_elin_parent_line;
1357
1358 --
1359 ----------------------------------------------------------------
1360 -- handles awarding for award by quote, award by line, award line
1361 -- procedure added by snatu on 08/15/03
1362 -- Coded for FPJ
1363 ----------------------------------------------------------------
1364 PROCEDURE award_auction
1365 ( p_auctioneer_id IN NUMBER
1366 , p_auction_header_id IN NUMBER
1367 , p_last_update_date IN DATE
1368 , p_mode IN VARCHAR2
1369 , p_line_num IN NUMBER
1370 , p_award_table IN PON_AWARD_TABLE
1371 , p_note_to_accepted IN VARCHAR2
1372 , p_note_to_rejected IN VARCHAR2
1373 , p_batch_id IN NUMBER
1374 , x_status OUT NOCOPY VARCHAR2
1375 )
1376 IS
1377 --
1378 l_counter BINARY_INTEGER;
1379 l_size NUMBER;
1380 l_index BINARY_INTEGER;
1381 l_rec PON_AWARD_REC;
1382 --
1383 l_award_lines t_award_lines;
1384 -- FPK: CPA
1385 l_awarded_bid_headers t_awarded_bid_headers;
1386 l_neg_has_lines PON_AUCTION_HEADERS_ALL.HAS_ITEMS_FLAG%TYPE;
1387
1388 l_matrix_index NUMBER;
1389 --
1390 l_current_bid_number NUMBER;
1391 l_bid_list_index NUMBER;
1392 l_tmp_award_quantity NUMBER;
1393 l_group_type pon_auction_item_prices_all.group_type%TYPE;
1394 l_award_date DATE;
1395 TYPE BID_LIST_TYPE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
1396 l_bid_list BID_LIST_TYPE;
1397 l_winning_bid NUMBER;
1398 l_neg_contract_type pon_auction_headers_all.contract_type%TYPE;
1399
1400 --
1401 l_has_quantity_tiers pon_auction_item_prices_all.has_quantity_tiers%TYPE;
1402 l_award_shipment_number NUMBER;
1403 l_suffix VARCHAR2(2);
1404
1405 --Unsolicited Lines Project
1406 l_allow_unsol_lines pon_auction_headers_all.ALLOW_UNSOL_OFFER_LINES%TYPE;
1407
1408 --Staggered Awards project
1409 l_allow_staggered_awards pon_auction_headers_all.ALLOW_STAGGERED_AWARDS%TYPE;
1410 l_total_agreed_amt pon_bid_headers.po_agreed_amount%TYPE;
1411
1412 l_org_id pon_auction_headers_all.org_id%TYPE;
1413 l_doctype_id pon_auction_headers_all.doctype_id%TYPE;
1414 l_are_exhibits_enabled VARCHAR2(1);
1415 --
1416 BEGIN
1417 --
1418 --
1419 IF (g_debug_mode = 'Y') THEN
1420 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1421 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.AWARD_AUCTION', 'Entering procedure with p_auctioneer_id: ' || p_auctioneer_id );
1422 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.AWARD_AUCTION',' p_last_update_date : '|| p_last_update_date || ' ,p_mode : '|| p_mode || ' ,p_line_num : '|| p_line_num);
1423 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.AWARD_AUCTION',' p_batch_id : '|| p_batch_id || ' ,p_auction_header_id : ' || p_auction_header_id );
1424 END IF;
1425 END IF;
1426
1427 l_neg_has_lines := PON_AUCTION_PKG.neg_has_lines(p_auction_header_id);
1428
1429 select contract_type,Nvl(ALLOW_UNSOL_OFFER_LINES,'Y'),
1430 Nvl(allow_staggered_awards, 'N'), org_id, doctype_id --ELINs project
1431 into l_neg_contract_type,l_allow_unsol_lines, -- Unsolicited Lines Project
1432 l_allow_staggered_awards, l_org_id, l_doctype_id --ELINs project
1433 from pon_auction_headers_all
1434 where auction_header_id = p_auction_header_id
1435 and rownum =1;
1436
1437 --ELINs project
1438 l_are_exhibits_enabled := PON_EXHIBITS_PKG.IS_EXHIBITS_ENABLED(l_org_id, l_doctype_id);
1439
1440 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1441 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.AWARD_AUCTION.AUCTION_ID:' || p_auction_header_id,'START');
1442 END IF;
1443
1444 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1445 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.AWARD_AUCTION.l_are_exhibits_enabled:' || l_are_exhibits_enabled,'');
1446 END IF;
1447 --
1448 l_matrix_index := 0;
1449 l_award_date := SYSDATE;
1450 --
1451 IF (p_mode = g_AWARD_QUOTE) THEN
1452
1453 --Donot reject the other lines when only few lines are awarded and allo_staggered_awards flag is Y
1454 IF(l_allow_staggered_awards = 'Y') THEN
1455 clear_unawarded_draft_awards (p_auction_header_id, p_line_num, l_award_date, p_auctioneer_id, l_neg_has_lines);
1456 ELSE
1457 clear_draft_awards (p_auction_header_id, p_line_num, l_award_date, p_auctioneer_id, l_neg_has_lines);
1458 END IF;
1459
1460 /* Unsolicited Lines Project : If unsol lines are allowed, clear unsolicited lines award
1461 on all non-winning bids.
1462 */
1463 --Commenting as the clearing is taken care by the save unsol lines award logic in java
1464 --IF l_allow_unsol_lines = 'Y' THEN
1465 -- PON_UNSOL_AWARD_PKG.clear_loosing_unsol_awards(p_auction_header_id,p_auctioneer_id,p_award_table,l_award_date);
1466 --END IF;
1467
1468 /* update auction-header by nulling out the request-id */
1469
1470 update pon_auction_headers_all
1471 set request_id = to_number(null)
1472 where auction_header_id = p_auction_header_id;
1473
1474 -- Need to expand all the AWARDED bids to build the lines
1475 l_size := p_award_table.COUNT;
1476 FOR l_index IN 1..l_size LOOP -- Loop through all the bids
1477 l_rec := p_award_table(l_index);
1478 -- Construct Matrix only in case of awarded bids
1479 IF l_rec.award_outcome = g_AWARD_OUTCOME_WIN THEN
1480
1481 IF l_neg_has_lines = 'Y' THEN -- FPK: CPA
1482
1483 l_winning_bid := l_rec.bid_number;
1484
1485 update_all_bid_item_prices(l_winning_bid, get_award_status(l_rec.award_outcome), l_award_date, p_auctioneer_id);
1486
1487 if(l_neg_contract_type in ('BLANKET', 'CONTRACT')) then
1488 update_all_auction_item_prices(p_auction_header_id, l_winning_bid, l_award_date, p_auctioneer_id);
1489 end if;
1490
1491 ELSE -- negotiation does not have lines
1492 -- Build table of active bids.
1493 -- All the bids will have one of the award outcome status: win, lose or no award.
1494 l_matrix_index := l_matrix_index + 1;
1495 l_awarded_bid_headers(l_matrix_index).bid_number := l_rec.bid_number;
1496 l_awarded_bid_headers(l_matrix_index).award_status := get_award_status(l_rec.award_outcome);
1497 l_awarded_bid_headers(l_matrix_index).award_date := l_award_date;
1498 END IF;
1499
1500 --Staggered Awards project
1501 --Add the new agreed amount to already agreed amount
1502 SELECT po_agreed_amount INTO l_total_agreed_amt FROM pon_bid_headers WHERE auction_header_id = p_auction_header_id AND bid_number = l_rec.bid_number;
1503
1504 --update total agreed amount (if any)
1505 IF l_rec.total_agreement_amount is not null THEN
1506 IF l_total_agreed_amt IS NOT NULL THEN
1507 l_total_agreed_amt := l_total_agreed_amt + l_rec.total_agreement_amount;
1508 ELSE
1509 l_total_agreed_amt := l_rec.total_agreement_amount;
1510 END IF;
1511
1512 UPDATE pon_bid_headers
1513 SET po_agreed_amount = l_total_agreed_amt
1514 WHERE bid_number = l_rec.bid_number;
1515 END IF;
1516 END IF; -- IF l_rec.award_outcome = g_AWARD_OUTCOME_WIN
1517 -- update notes
1518 update_notes_for_bid(l_rec.bid_number, l_rec.note_to_supplier, l_rec.internal_note, p_auctioneer_id);
1519 END LOOP;
1520
1521 -- outside the loop, update all auction_lines
1522 -- in case of BPA outcome, we can award multiple bids -> but we will update
1523 -- all auction lines just once
1524
1525 IF (l_neg_has_lines = 'Y') THEN
1526 IF (l_neg_contract_type <> 'BLANKET' and l_neg_contract_type <> 'CONTRACT') THEN
1527 update_all_auction_item_prices(p_auction_header_id, l_winning_bid, l_award_date, p_auctioneer_id);
1528 END IF;
1529 END IF;
1530
1531
1532 END IF ;
1533 --
1534 IF (p_mode = g_AWARD_MULTIPLE_LINES) THEN --{
1535 --Donot reject the other lines when only few lines are awarded and allo_staggered_awards flag is Y
1536 IF(l_allow_staggered_awards = 'Y') THEN
1537 clear_unawarded_draft_awards (p_auction_header_id, p_line_num, l_award_date, p_auctioneer_id, l_neg_has_lines);
1538 ELSE
1539 clear_draft_awards (p_auction_header_id, p_line_num, l_award_date, p_auctioneer_id, l_neg_has_lines);
1540 END IF;
1541 -- Need to set award quantity and award_status
1542 l_size := p_award_table.COUNT;
1543 l_current_bid_number := -1;
1544 --
1545 FOR l_index IN 1..l_size LOOP -- Loop through all the bids
1546 l_rec := p_award_table(l_index);
1547 -- Construct Matrix only in case of awarded bids
1548 IF l_rec.award_outcome = g_AWARD_OUTCOME_WIN THEN
1549 IF ( l_neg_contract_type = 'BLANKET' ) THEN --Get Award Qty FROM Response Qty
1550 SELECT decode (ai.order_type_lookup_code, 'FIXED PRICE', 1, 'AMOUNT', 1, 'RATE', decode(ai.purchase_basis , 'TEMP LABOR' ,bi.quantity, 1) , ai.quantity) INTO l_tmp_award_quantity
1551 FROM pon_bid_item_prices bi, pon_auction_item_prices_all ai
1552 WHERE bi.bid_number = l_rec.bid_number
1553 AND bi.line_number = l_rec.line_number
1554 AND ai.auction_header_id = bi.auction_header_id
1555 AND ai.line_number = bi.line_number;
1556 ELSE ---- Get Award Qty FROM response Qty
1557 SELECT decode (ai.order_type_lookup_code, 'FIXED PRICE', 1, 'AMOUNT', 1, 'RATE', decode(ai.purchase_basis , 'TEMP LABOR' ,bi.quantity, 1) , bi.quantity) INTO l_tmp_award_quantity
1558 FROM pon_bid_item_prices bi, pon_auction_item_prices_all ai
1559 WHERE bi.bid_number = l_rec.bid_number
1560 AND bi.line_number = l_rec.line_number
1561 AND ai.auction_header_id = bi.auction_header_id
1562 AND ai.line_number = bi.line_number;
1563 END IF;
1564 --
1565 SELECT ai.group_type INTO l_group_type
1566 FROM pon_bid_item_prices bi, pon_auction_item_prices_all ai
1567 WHERE bi.bid_number = l_rec.bid_number
1568 AND bi.line_number = l_rec.line_number
1569 AND ai.auction_header_id = bi.auction_header_id
1570 AND ai.line_number = bi.line_number;
1571 --
1572 l_matrix_index := l_matrix_index + 1;
1573 l_award_lines(l_matrix_index).bid_number := l_rec.bid_number;
1574 l_award_lines(l_matrix_index).line_number := l_rec.line_number;
1575 l_award_lines(l_matrix_index).award_status := get_award_status(l_rec.award_outcome);
1576 l_award_lines(l_matrix_index).award_quantity := l_tmp_award_quantity;
1577 l_award_lines(l_matrix_index).award_date := l_award_date;
1578 l_award_lines(l_matrix_index).group_type := l_group_type;
1579 END IF;
1580 -- Update Internal Notes and Notes to Suppliers for each bid
1581 IF (l_current_bid_number <> l_rec.bid_number) THEN
1582 update_notes_for_bid(l_rec.bid_number, l_rec.note_to_supplier, l_rec.internal_note, p_auctioneer_id);
1583
1584 --Staggered Awards project
1585 --Add the new agreed amount to already agreed amount
1586 SELECT po_agreed_amount INTO l_total_agreed_amt FROM pon_bid_headers WHERE auction_header_id = p_auction_header_id AND bid_number = l_rec.bid_number;
1587 --update total agreed amount (if any)
1588 IF l_rec.total_agreement_amount is not null THEN
1589 IF l_total_agreed_amt IS NOT NULL THEN
1590 l_total_agreed_amt := l_total_agreed_amt + l_rec.total_agreement_amount;
1591 ELSE
1592 l_total_agreed_amt := l_rec.total_agreement_amount;
1593 END IF;
1594 UPDATE pon_bid_headers
1595 SET po_agreed_amount = l_total_agreed_amt
1596 WHERE bid_number = l_rec.bid_number;
1597 END IF;
1598
1599 l_current_bid_number := l_rec.bid_number;
1600 END IF;
1601 END LOOP;
1602 END IF; --}
1603 --
1604 IF ((p_mode = g_AWARD_LINE) OR (p_mode = g_AWARD_LINE_H)
1605 OR(p_mode = g_AWARD_GROUP) OR (p_mode = g_AWARD_GROUP_H)) THEN --{
1606 --
1607 -- First, REJECT the group line level awards - No cumulative awards
1608 IF (p_mode = g_AWARD_GROUP) THEN
1609 --Donot reject the other lines when only few lines are awarded and allo_staggered_awards flag is Y
1610 IF(l_allow_staggered_awards = 'Y') THEN
1611 clear_unawarded_draft_awards (p_auction_header_id, p_line_num, l_award_date, p_auctioneer_id, l_neg_has_lines);
1612 ELSE
1613 clear_draft_awards (p_auction_header_id, p_line_num, l_award_date, p_auctioneer_id, l_neg_has_lines);
1614 END IF;
1615 END IF;
1616 --
1617 l_bid_list_index := 0;
1618 SELECT ai.group_type INTO l_group_type
1619 FROM pon_auction_item_prices_all ai
1620 WHERE ai.auction_header_id = p_auction_header_id
1621 AND ai.line_number = p_line_num;
1622 --
1623 -- Getting the suffix to display the error message correctly.
1624 l_suffix := PON_LARGE_AUCTION_UTIL_PKG.GET_DOCTYPE_SUFFIX (p_auction_header_id);
1625
1626 -- Need to set award quantity and award_status
1627 l_size := p_award_table.COUNT;
1628 FOR l_index IN 1..l_size LOOP -- Loop through all the bids
1629 l_rec := p_award_table(l_index);
1630
1631 --R12.1 price tiers changes
1632 select nvl(has_quantity_tiers,'N') into l_has_quantity_tiers
1633 from pon_bid_item_prices
1634 where bid_number = l_rec.bid_number
1635 and line_number = p_line_num;
1636
1637 IF (g_debug_mode = 'Y') THEN
1638 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1639 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.AWARD_AUCTION', 'bid_number ' || l_rec.bid_number ||' ; line number ' ||p_line_num|| ' ; has_quantity_tiers ' || l_has_quantity_tiers);
1640 END IF;
1641 END IF;
1642
1643 -- Construct Matrix in any case (WIN/LOSR)
1644 l_matrix_index := l_matrix_index +1;
1645 l_award_lines(l_matrix_index).bid_number := l_rec.bid_number;
1646 l_award_lines(l_matrix_index).line_number := p_line_num; --l_rec.line_number;
1647 l_award_lines(l_matrix_index).award_status := get_award_status(l_rec.award_outcome);
1648 l_award_lines(l_matrix_index).award_date := l_award_date;
1649 l_award_lines(l_matrix_index).group_type := l_group_type;
1650 --
1651 IF l_rec.award_outcome = g_AWARD_OUTCOME_WIN THEN --{
1652
1653 /*
1654 R12.1 Quantity based price tiers changes
1655 If quantity tiers are present for a line and award quantity is not null
1656 validating if award qty falls within the quantity tiers specified by the supplier
1657 Update the award shipment number acoordingly.
1658 */
1659
1660 IF ( 'Y' = l_has_quantity_tiers AND l_rec.award_quantity IS NOT NULL)
1661 THEN --{
1662 l_award_shipment_number := -1;
1663
1664 select nvl((select pbs.shipment_number
1665 from pon_bid_shipments pbs, pon_auction_item_prices_all paip
1666 where pbs.bid_number = l_rec.bid_number
1667 and pbs.line_number = p_line_num
1668 AND l_rec.award_quantity >= pbs.quantity
1669 AND l_rec.award_quantity <= pbs.max_quantity
1670 AND paip.auction_header_id = pbs.auction_header_id
1671 AND paip.line_number = pbs.line_number ),-1)
1672 into l_award_shipment_number from dual;
1673
1674 IF (g_debug_mode = 'Y') THEN
1675 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1676 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.AWARD_AUCTION', 'award_shipment_number ' || l_award_shipment_number);
1677 END IF;
1678 END IF;
1679
1680 IF ( l_award_shipment_number = -1) THEN --{
1681 -- Insert errors in interface table.
1682 INSERT INTO PON_INTERFACE_ERRORS(
1683 batch_id
1684 , column_name
1685 , error_message_name
1686 , table_name
1687 , INTERFACE_LINE_ID
1688 , expiration_date
1689 , created_by
1690 , creation_date
1691 , last_updated_by
1692 , last_update_date
1693 , last_update_login
1694 , TOKEN1_NAME
1695 , TOKEN1_VALUE
1696 )
1697 Values(
1698 p_batch_id
1699 , fnd_message.get_string('PON','PON_AUCTION_AWARD_QTY')
1700 , 'PON_QUANTITY_TIER_VIOLATION' || l_suffix
1701 , 'PON_BID_ITEM_PRICES'
1702 , p_line_num
1703 , SYSDATE+7
1704 , fnd_global.user_id
1705 , sysdate
1706 , fnd_global.user_id
1707 , sysdate
1708 , fnd_global.login_id
1709 , 'BID_NUM'
1710 , l_rec.bid_number
1711 );
1712
1713
1714 x_status := 'FAILURE';
1715
1716 IF (g_debug_mode = 'Y') THEN
1717 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1718 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.AWARD_AUCTION.AUCTION_ID:' || p_auction_header_id||' bid_number : '||l_rec.bid_number||' line_num: '||p_line_num, 'Quantity Tier Violation');
1719 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT,' award_quantity: '||l_rec.award_quantity,'Quantity Tier Violation');
1720 END IF;
1721 END IF;
1722 --} End of l_shipment_number = -1
1723 ELSE --{ START of l_award_shipment_number != -1,
1724
1725 --
1726 -- Award qty falls withtin the quantity specified by the supplier.
1727 -- saving the corresponding shipment number
1728 --
1729 l_award_lines(l_matrix_index).award_shipment_number := l_award_shipment_number;
1730
1731 END IF; --} END of l_award_shipment_number != -1,
1732 --} End of has_quantity_tiers='Y' and award_quantity not null
1733 ELSE --{ Start of has_quantity_tiers <> 'Y' or award_quantity <> null
1734
1735 --
1736 -- Line does not have quantity tiers so setting the default value as -1.
1737 --
1738 l_award_lines(l_matrix_index).award_shipment_number := -1;
1739
1740 END IF; --} End of has_quantity_tiers <> 'Y' or award_quantity <> null ; END of Quantity tiers loop
1741
1742 l_award_lines(l_matrix_index).award_quantity := l_rec.award_quantity;
1743 l_award_lines(l_matrix_index).note_to_supplier := p_note_to_accepted;
1744
1745 --} End of award_outcome_win
1746 ELSE --{ Start of award_outcome_lose
1747
1748 IF ((x_status is NULL) OR (x_status = 'SUCCESS')) THEN --{
1749 l_award_lines(l_matrix_index).award_quantity := null;
1750 l_award_lines(l_matrix_index).note_to_supplier := p_note_to_rejected;
1751 END IF; --}
1752
1753 END IF; --} End of award_outcome_lose
1754
1755 --Update Notes only in case of Award Line V Page and NOT for Award Line H Page
1756 IF ((p_mode = g_AWARD_LINE OR p_mode = g_AWARD_GROUP) AND ((x_status is NULL) OR (x_status = 'SUCCESS'))) THEN
1757 update_notes_for_bid(l_rec.bid_number, l_rec.note_to_supplier, l_rec.internal_note, p_auctioneer_id);
1758 END IF;
1759 -- Add new bid to the array
1760 l_bid_list_index := l_bid_list_index + 1;
1761 l_bid_list(l_bid_list_index) := l_rec.bid_number;
1762 --
1763 END LOOP;
1764 END IF; --}
1765 --
1766 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1767 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.AWARD_AUCTION.AUCTION_ID:' || p_auction_header_id,'MATRIX BUILT');
1768 END IF;
1769 --
1770 -- Clears the award history in case any for this auction
1771 IF (p_mode = g_AWARD_QUOTE) or (p_mode = g_AWARD_MULTIPLE_LINES) THEN --{
1772
1773 IF l_neg_has_lines = 'Y' THEN -- FPK: CPA
1774 IF(p_mode = g_AWARD_MULTIPLE_LINES) THEN
1775 update_bid_item_prices(p_auction_header_id,l_award_lines,p_auctioneer_id, p_mode);
1776 END IF;
1777 END IF;
1778
1779 update_bid_headers(p_auction_header_id, p_auctioneer_id, l_awarded_bid_headers, l_neg_has_lines);
1780
1781 IF l_neg_has_lines = 'Y' THEN -- FPK: CPA
1782 IF(p_mode = g_AWARD_MULTIPLE_LINES) THEN
1783 update_auction_item_prices(p_auction_header_id, null, l_award_date, p_auctioneer_id, p_mode);
1784 END IF;
1785 END IF;
1786
1787 update_auction_headers(p_auction_header_id, p_mode, l_award_date, p_auctioneer_id, l_neg_has_lines);
1788
1789 IF l_neg_has_lines = 'Y' THEN -- FPK: CPA
1790
1791 bulk_update_pon_acceptances(
1792 p_auction_header_id,
1793 null, null, null,
1794 l_award_date, p_auctioneer_id, p_mode);
1795 END IF;
1796 --}
1797 ELSE --{
1798 update_bid_item_prices(p_auction_header_id,l_award_lines,p_auctioneer_id, p_mode);
1799 l_size := l_bid_list.count;
1800 FOR l_index IN 1..l_size LOOP
1801 update_single_bid_header(l_bid_list(l_index),p_auctioneer_id);
1802 END LOOP;
1803 update_auction_item_prices(p_auction_header_id,p_line_num, l_award_date, p_auctioneer_id, p_mode);
1804 update_auction_headers(p_auction_header_id, p_mode, l_award_date, p_auctioneer_id, l_neg_has_lines);
1805 bulk_update_pon_acceptances(
1806 p_auction_header_id, p_line_num,
1807 p_note_to_accepted, p_note_to_rejected,
1808 l_award_date, p_auctioneer_id, p_mode);
1809
1810 if ( pon_clm_util_pkg.is_neg_document_federal(p_auction_header_id) = 1 ) THEN
1811 if ( pon_clm_util_pkg.is_line_clin(p_auction_header_id,p_line_num) = TRUE ) THEN
1812 if ( pon_clm_util_pkg.does_clin_have_child(p_auction_header_id,p_line_num) = TRUE ) THEN --clin has slin
1813 AWARD_INFO_SLIN_LINES(p_auction_header_id, p_line_num, L_AWARD_LINES, p_auctioneer_id);
1814 end if;
1815 if ( pon_clm_util_pkg.does_line_have_option(p_auction_header_id,p_line_num) = TRUE ) THEN --clin has option
1816 AWARD_option_LINES(p_auction_header_id, p_line_num, L_AWARD_LINES, p_auctioneer_id);
1817 end if;
1818 --ELINs project
1819 IF(l_are_exhibits_enabled = 'Y') THEN
1820 IF(PON_EXHIBITS_PKG.IS_LINE_ELIN(p_auction_header_id, p_line_num) = 'Y') THEN
1821 --This is a exhibit line. Mark parent line as awarded.
1822 AWARD_ELIN_PARENT_LINE(p_auction_header_id, p_line_num, L_AWARD_LINES, p_auctioneer_id);
1823 ELSE
1824 IF(PON_EXHIBITS_PKG.HAS_ELIN_ASSOC_FOR_LINE(p_auction_header_id, p_line_num) = 'Y') THEN
1825 --This line is associated to exhibits, update all exhibit lines as awarded.
1826 AWARD_EXHIBIT_LINES(p_auction_header_id, p_line_num, L_AWARD_LINES, p_auctioneer_id);
1827 END IF;
1828 END IF;
1829 END IF;
1830 else --slin line
1831 if ( pon_clm_util_pkg.does_line_have_option(p_auction_header_id,p_line_num) = TRUE ) THEN --slin has option
1832 AWARD_option_LINES(p_auction_header_id, p_line_num, L_AWARD_LINES, p_auctioneer_id);
1833 AWARD_PARENT_CROSS_LINKED_OPT(p_auction_header_id, p_line_num, L_AWARD_LINES, p_auctioneer_id);
1834 end if;
1835 --ELINs project
1836 IF(l_are_exhibits_enabled = 'Y'
1837 AND PON_EXHIBITS_PKG.HAS_ELIN_ASSOC_FOR_LINE(p_auction_header_id, p_line_num) = 'Y') THEN
1838 --This line is associated to exhibits, update all exhibit lines with award_status.
1839 AWARD_EXHIBIT_LINES(p_auction_header_id, p_line_num, L_AWARD_LINES, p_auctioneer_id);
1840 END IF;--End ELINs project changes
1841
1842 award_parent_line(p_auction_header_id,p_line_num,l_award_lines,p_auctioneer_id);
1843 end if;
1844 end if;
1845 End IF; --}
1846 --
1847 --
1848 --
1849 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1850 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.AWARD_AUCTION.AUCTION_ID:' || p_auction_header_id,'READY_TO_COMMIT');
1851 END IF;
1852 --
1853
1854 /* check if the auction has been modified by some other user
1855 If it has been modified, status returns failure
1856 else this is the only user modifying hte auction
1857 changes are committed to the database in the middle tier
1858 */
1859 IF (((x_status is NULL) OR (x_status = 'SUCCESS')) AND (is_auction_not_updated (p_auction_header_id, p_last_update_date))) THEN
1860 x_status := 'SUCCESS';
1861 -- update the last update date
1862 UPDATE pon_Auction_headers_all
1863 SET last_update_date = SYSDATE
1864 WHERE auction_header_id = p_auction_header_id;
1865 --
1866 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1867 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.AWARD_AUCTION.AUCTION_ID:' || p_auction_header_id,'SUCCEEDED');
1868 END IF;
1869 --
1870 ELSE
1871 x_status := 'FAILURE';
1872 --
1873 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1874 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.AWARD_AUCTION.AUCTION_ID:' || p_auction_header_id,'FAILED');
1875 END IF;
1876 --
1877 END IF;
1878 --
1879 END award_auction;
1880 --
1881 --
1882
1883 --<Sol Project>
1884 --Award CLM SLIN Lines when Parent CLIN Line is Awarded
1885 --
1886 --PROCEDURE AWARD_SLIN_LINES(p_auction_header_id, p_line_num, p_award_status, p_award_date, p_auctioneer_id);
1887
1888
1889
1890 procedure award_child_line(
1891 p_auction_header_id IN Number,
1892 p_line_num IN Number,
1893 p_award_lines IN t_award_lines,
1894 p_auctioneer_id IN Number)
1895 IS
1896 l_award_status varchar2(20);
1897 l_size Number;
1898 l_index Number;
1899 l_awarded_subline NUMBER;
1900
1901 Begin
1902 l_award_status := NULL;
1903 l_size := p_award_lines.count;
1904 for l_index in 1..l_size loop
1905
1906 --Mark Clin AS awarded IF ANY one of slin IS awarded
1907 SELECT Count(*) INTO l_awarded_subline from PON_BID_ITEM_PRICES
1908 WHERE bid_number = p_award_lines(l_index).bid_number
1909 AND group_line_id = p_line_num
1910 AND award_status = 'AWARDED';
1911
1912 IF (l_awarded_subline > 0) THEN
1913 UPDATE PON_BID_ITEM_PRICES
1914 set award_status = 'AWARDED',
1915 award_date = p_award_lines(l_index).award_date,
1916 last_update_date = p_award_lines(l_index).award_date,
1917 last_updated_by = p_auctioneer_id
1918 where bid_number = p_award_lines(l_index).bid_number
1919 and line_number = p_line_num;
1920 ELSE
1921 UPDATE PON_BID_ITEM_PRICES
1922 set award_status = p_award_lines(l_index).award_status,
1923 award_date = p_award_lines(l_index).award_date,
1924 last_update_date = p_award_lines(l_index).award_date,
1925 last_updated_by = p_auctioneer_id
1926 where bid_number = p_award_lines(l_index).bid_number
1927 and line_number = p_line_num;
1928 END IF;
1929
1930 if ( (l_award_status is NULL) AND
1931 ((p_award_lines(l_index).award_status = 'AWARDED') OR
1932 -- (p_award_lines(l_index).award_status = 'REJECTED') OR -- bug#9741473
1933 (p_award_lines(l_index).award_status = 'PARTIAL')
1934 )) THEN
1935 l_award_status := 'AWARDED';
1936 end if;
1937 end loop;
1938 UPDATE pon_auction_item_prices_all
1939 set award_status = l_award_status,
1940 last_update_date = sysdate,
1941 last_updated_by = p_auctioneer_id
1942 where auction_header_id = p_auction_header_id
1943 and line_number = p_line_num;
1944 End Award_Child_Line;
1945
1946 PROCEDURE AWARD_INFO_SLIN_LINES(
1947 p_auction_header_id IN Number,
1948 p_line_num IN Number,
1949 p_award_lines IN t_award_lines,
1950 p_auctioneer_id IN Number)
1951 IS
1952 Cursor slinCursor Is select line_number from pon_auction_item_prices_all where
1953 auction_header_id = p_auction_header_id and group_line_id = p_line_num and nvl(clm_info_flag,'N') = 'Y';
1954 Begin
1955
1956 for slinLine in slinCursor Loop
1957 award_child_line(p_auction_header_id,slinLine.line_number,p_award_lines,p_auctioneer_id);
1958 end loop;
1959
1960 END AWARD_INFO_SLIN_LINES;
1961
1962
1963 PROCEDURE AWARD_option_LINES(
1964 p_auction_header_id IN Number,
1965 p_line_num IN Number,
1966 p_award_lines IN t_award_lines,
1967 p_auctioneer_id IN Number)
1968 IS
1969 Cursor optCursor Is select line_number from pon_auction_item_prices_all where
1970 auction_header_id = p_auction_header_id and clm_base_line_num = p_line_num;
1971 l_award_price pon_bid_item_prices.award_price%TYPE;
1972 l_award_quantity pon_bid_item_prices.award_quantity%TYPE;
1973 l_size NUMBER;
1974 l_index NUMBER;
1975 l_auction_award_qty NUMBER; -- bug 9940219
1976
1977 --ELINs project
1978 l_are_exh_enabled VARCHAR2(1);
1979
1980 Begin
1981
1982 IF (g_debug_mode = 'Y') THEN
1983 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1984 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.AWARD_option_LINES', 'p_auction_header_id ' ||p_auction_header_id || ' p_line_num ' ||p_line_num );
1985 END IF;
1986 END IF;
1987
1988 --ELINs project
1989 l_are_exh_enabled := PON_EXHIBITS_PKG.IS_EXHIBITS_ENABLED_FOR_AUC(p_auction_header_id);
1990
1991 for optLine in optCursor Loop
1992 award_child_line(p_auction_header_id,optLine.line_number,p_award_lines,p_auctioneer_id);
1993
1994 /* ELINs project : Update all elins associated to this option line */
1995 IF(l_are_exh_enabled = 'Y') THEN
1996 award_exhibit_lines(p_auction_header_id,optLine.line_number,p_award_lines,p_auctioneer_id);
1997 END IF;
1998 --End ELINs project changes
1999
2000 l_auction_award_qty := 0;
2001
2002 -- bug 9746442 option line award details should be taken from bid item table
2003 l_size := p_award_lines.count;
2004 for l_index in 1..l_size loop
2005
2006 l_award_price := NULL;
2007 l_award_quantity := NULL;
2008
2009 SELECT decode(pbip.award_status, 'REJECTED', null,
2010 decode (paip.order_type_lookup_code,
2011 'FIXED PRICE', 1,
2012 'AMOUNT', 1,
2013 'RATE', decode (paip.purchase_basis, 'TEMP LABOR', pbip.quantity, 1), pbip.quantity ))
2014 INTO l_award_quantity
2015 FROM pon_bid_item_prices pbip,
2016 pon_auction_item_prices_all paip
2017 WHERE pbip.bid_number = p_award_lines(l_index).bid_Number
2018 AND pbip.auction_line_number = optLine.line_number
2019 AND paip.auction_header_id = pbip.auction_header_id
2020 AND paip.line_number = pbip.line_number;
2021
2022 l_auction_award_qty := l_auction_award_qty + Nvl(l_award_quantity,0);
2023
2024
2025 IF (l_award_quantity <> 0 ) THEN
2026 SELECT decode(pbip.award_status, 'REJECTED', null,
2027 pbip.per_unit_price_component + pbip.fixed_amount_component /l_award_quantity)
2028 INTO l_award_price
2029 FROM pon_bid_item_prices pbip,
2030 pon_auction_item_prices_all paip
2031 WHERE pbip.bid_number = p_award_lines(l_index).bid_Number
2032 AND pbip.auction_line_number = optLine.line_number
2033 AND paip.auction_header_id = pbip.auction_header_id
2034 AND paip.line_number = pbip.line_number;
2035
2036 END IF;
2037
2038 UPDATE pon_bid_item_prices pbip
2039 SET award_price = l_award_price,
2040 award_quantity = l_award_quantity
2041 WHERE pbip.bid_number = p_award_lines(l_index).bid_Number
2042 AND pbip.auction_line_number = optLine.line_number;
2043
2044
2045 END LOOP;
2046
2047 -- bug 9940219
2048 UPDATE pon_auction_item_prices_all paip
2049 SET paip.awarded_quantity = decode (paip.order_type_lookup_code,
2050 'FIXED PRICE', 1,
2051 'AMOUNT', 1,
2052 'RATE', decode (paip.purchase_basis, 'TEMP LABOR', l_auction_award_qty, 1),l_auction_award_qty )
2053 WHERE auction_header_id = p_auction_header_id
2054 AND line_number = optLine.line_number;
2055
2056
2057 end loop;
2058
2059 END AWARD_option_LINES;
2060
2061 PROCEDURE AWARD_PARENT_CROSS_LINKED_OPT(p_auction_header_id IN Number,
2062 p_line_num IN Number,
2063 p_award_LINES IN T_AWARD_LINES,
2064 p_auctioneer_id IN Number)
2065
2066 IS
2067
2068 CURSOR optLineCur IS SELECT line_number FROM pon_auction_item_prices_all WHERE auction_header_id=p_auction_header_id
2069 AND clm_base_line_num=p_line_num AND group_line_id<>(SELECT group_line_id FROM pon_auction_item_prices_all WHERE
2070 line_number=p_line_num AND auction_header_id=p_auction_header_id );
2071
2072 BEGIN
2073
2074 FOR optLine IN optLineCur LOOP
2075
2076 award_parent_line(p_auction_header_id,optLine.line_number,p_award_LINES,p_auctioneer_id);
2077
2078 END LOOP;
2079
2080 END AWARD_PARENT_CROSS_LINKED_OPT;
2081
2082
2083 PROCEDURE AWARD_parent_LINE(
2084 p_auction_header_id IN Number,
2085 p_line_num IN Number,
2086 p_award_lines IN t_award_lines,
2087 p_auctioneer_id IN Number)
2088 IS
2089 l_group_line_id Number;
2090 l_not_awd_lines Number;
2091 l_award_status pon_auction_item_prices_all.award_status%TYPE;
2092 l_award_lines NUMBER;
2093
2094 Begin
2095 select group_line_id,award_status into l_group_line_id,l_award_status from
2096 pon_auction_item_prices_all where
2097 auction_header_id = p_auction_header_id and line_number = p_line_num;
2098 select count(*) into l_not_awd_lines from pon_auction_item_prices_all where
2099 auction_header_id = p_auction_header_id and group_line_id = l_group_line_id
2100 and award_status is null
2101 AND Nvl(clm_info_flag,'N') <> 'Y'; -- bug 9746442
2102 if ( l_not_awd_lines =0 OR l_award_status IS NULL ) then --all lines are awarded
2103 --award the Parent CLIN
2104 award_child_line(p_auction_header_id, l_group_line_id, p_award_lines,p_auctioneer_id);
2105 --clin can have options
2106 award_option_lines(p_auction_header_id,l_group_line_id,p_award_lines,p_auctioneer_id);
2107 --clin can have info lines
2108 award_info_slin_lines(p_auction_header_id,l_group_line_id,p_award_lines,p_auctioneer_id);
2109 end if;
2110
2111 --Line Type and Structure Changes
2112 --Update CLIN as 'AWARDED' if atleast one slin in structure is 'AWARDED'
2113
2114 SELECT Count(*) INTO l_award_lines FROM pon_auction_item_prices_all where
2115 auction_header_id = p_auction_header_id and group_line_id = l_group_line_id
2116 and award_status = 'AWARDED';
2117
2118 IF(l_award_lines> 0) THEN
2119
2120 --award the Parent CLIN
2121 award_child_line(p_auction_header_id, l_group_line_id, p_award_lines,p_auctioneer_id);
2122 END IF;
2123
2124
2125 END AWARD_parent_line;
2126
2127
2128 /* This procedure updates bid exhibit lines associated to i/p bid, line number.
2129 * pon_auction_item_prices will not be updated here as it will be done in
2130 * award_auction procedure for mode = AWARD_MULTIPLE_LINES
2131 * This procedure should be called for Award Multiple Lines mode.
2132 */
2133 PROCEDURE update_bid_exhibit_lines
2134 (
2135 p_auction_id IN NUMBER,
2136 p_contract_type IN VARCHAR2,
2137 p_bid_number IN NUMBER,
2138 p_line_number IN NUMBER,
2139 p_award_status IN VARCHAR2,
2140 p_auctioneer_id IN NUMBER,
2141 p_mode IN VARCHAR2,
2142 p_award_date IN DATE
2143 )
2144 IS
2145
2146 --This cursor gets all the elins associated to particular line.
2147 CURSOR get_elins_for_line IS
2148 SELECT paip.line_number
2149 FROM pon_auction_exhibit_details exhibit,
2150 pon_auction_item_prices_all paip,
2151 pon_bid_item_prices pbip
2152 WHERE exhibit.auction_header_id = p_auction_id
2153 AND exhibit.associated_to_line = p_line_number
2154 AND paip.auction_header_id = exhibit.auction_header_id
2155 AND paip.exhibit_number IS NOT NULL
2156 AND paip.exhibit_number = exhibit.exhibit_number
2157 AND pbip.bid_number = p_bid_number
2158 AND pbip.line_number = paip.line_number;
2159
2160 l_tmp_award_quantity NUMBER;
2161 BEGIN
2162 IF (g_debug_mode = 'Y') THEN
2163 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2164 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.update_bid_exhibit_lines', 'Entering procedure with p_auction_id: ' || p_auction_id );
2165 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.update_bid_exhibit_lines',' p_bid_number : '|| p_bid_number || ' ,p_mode : '|| p_mode || ' ,p_line_number : '|| p_line_number);
2166 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.update_bid_exhibit_lines',' p_award_status : ' || p_award_status );
2167 END IF;
2168 END IF;
2169
2170 FOR elin IN get_elins_for_line LOOP
2171 IF (g_debug_mode = 'Y') THEN
2172 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2173 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.update_bid_exhibit_lines', 'Updating line : ' || elin.line_number );
2174 END IF;
2175 END IF;
2176 IF Nvl(p_award_status, 'REJECTED') = 'AWARDED' THEN
2177 IF ( p_contract_type IN ('BLANKET','CONTRACT') ) THEN --Get Award Qty FROM Response Qty
2178 SELECT decode (ai.order_type_lookup_code, 'FIXED PRICE', 1, 'AMOUNT', 1, 'RATE', decode(ai.purchase_basis , 'TEMP LABOR' ,bi.quantity, 1) , ai.quantity) INTO l_tmp_award_quantity
2179 FROM pon_bid_item_prices bi, pon_auction_item_prices_all ai
2180 WHERE bi.bid_number = p_bid_number
2181 AND bi.line_number = elin.line_number
2182 AND ai.auction_header_id = bi.auction_header_id
2183 AND ai.line_number = bi.line_number;
2184 ELSE ---- Get Award Qty FROM response Qty
2185 SELECT decode (ai.order_type_lookup_code, 'FIXED PRICE', 1, 'AMOUNT', 1, 'RATE', decode(ai.purchase_basis , 'TEMP LABOR' ,bi.quantity, 1) , bi.quantity) INTO l_tmp_award_quantity
2186 FROM pon_bid_item_prices bi, pon_auction_item_prices_all ai
2187 WHERE bi.bid_number = p_bid_number
2188 AND bi.line_number = elin.line_number
2189 AND ai.auction_header_id = bi.auction_header_id
2190 AND ai.line_number = bi.line_number;
2191 END IF;
2192 END IF;
2193 IF (g_debug_mode = 'Y') THEN
2194 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2195 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.update_bid_exhibit_lines', 'Updating line : ' || elin.line_number || ' Quantity : ' ||l_tmp_award_quantity);
2196 END IF;
2197 END IF;
2198
2199 UPDATE PON_BID_ITEM_PRICES pbip
2200 SET award_quantity = Decode(Nvl(p_award_status, 'REJECTED'), 'REJECTED', null, l_tmp_award_quantity),
2201 award_price = Decode(Nvl(p_award_status, 'REJECTED'), 'REJECTED', null,
2202 decode(nvl(l_tmp_award_quantity, 0), 0, pbip.price,
2203 pbip.per_unit_price_component + pbip.fixed_amount_component /l_tmp_award_quantity)),
2204 award_status = p_award_status,
2205 award_date = p_award_date,
2206 last_update_date = p_award_date,
2207 last_updated_by = p_auctioneer_id,
2208 award_shipment_number = NULL
2209 WHERE bid_number = p_bid_number
2210 AND line_Number = elin.line_number;
2211
2212 IF (g_debug_mode = 'Y') THEN
2213 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2214 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.update_bid_exhibit_lines', 'Line Updated : ' || elin.line_number );
2215 END IF;
2216 END IF;
2217
2218 END LOOP;
2219
2220 END update_bid_exhibit_lines;
2221
2222 PROCEDURE update_bid_item_prices
2223 (
2224 p_auction_id IN NUMBER,
2225 p_award_lines IN t_award_lines,
2226 p_auctioneer_id IN NUMBER,
2227 p_mode IN VARCHAR2
2228 )
2229 IS
2230 l_size NUMBER;
2231 l_index NUMBER;
2232 l_group_type pon_auction_item_prices_all.group_type%type;
2233 l_award_quantity pon_bid_item_prices.award_quantity%type;
2234 l_award_shipment_number NUMBER;
2235 --
2236 /* for updating group for each bid's group line,
2237 we maintain an associative array (hashmap equivalant)
2238 in the form of (bid:group_number ==> 1234:56
2239 and once all bid lines are updated, we traverse through this map
2240 and update the required bid groups
2241 */
2242 type bid_line_asso is table of varchar2(30) index by varchar2(30);
2243 l_bid_group_map bid_line_asso;
2244 l_bid_line_key VARCHAR2(30);
2245 l_parent_line_number pon_auction_item_prices_all.parent_line_number%type;
2246 l_bid_number pon_bid_item_prices.bid_number%type;
2247
2248 --ELINs project
2249 l_are_exhibits_enabled VARCHAR2(1);
2250 l_org_id pon_auction_headers_all.org_id%TYPE;
2251 l_doctype_id pon_auction_headers_all.doctype_id%TYPE;
2252 l_contract_type pon_auction_headers_all.contract_type%TYPE;
2253 --
2254 BEGIN
2255
2256 IF (g_debug_mode = 'Y') THEN
2257 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2258 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPDATE_BID_ITEM_PRICES', 'Entering procedure with p_mode: ' || p_mode || ' ,p_auction_id : ' || p_auction_id || ' ,p_auctioneer_id : '|| p_auctioneer_id);
2259 END IF;
2260 END IF;
2261
2262 --ELINs project
2263 SELECT org_id, doctype_id, contract_type INTO l_org_id, l_doctype_id, l_contract_type
2264 FROM pon_auction_headers_all
2265 WHERE auction_header_id = p_auction_id;
2266
2267 l_are_exhibits_enabled := PON_EXHIBITS_PKG.IS_EXHIBITS_ENABLED(l_org_id, l_doctype_id);
2268 IF (g_debug_mode = 'Y') THEN
2269 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2270 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPDATE_BID_ITEM_PRICES', 'Are Exhibits enabled? ' || l_are_exhibits_enabled);
2271 END IF;
2272 END IF;
2273 --End ELINs project
2274
2275
2276
2277 l_size := p_award_lines.COUNT;
2278 -- Loop through the matrix to update bid items and acceptances
2279 FOR l_index IN 1..l_size LOOP
2280 l_group_type := p_award_lines(l_index).group_type;
2281 IF (l_group_type = 'GROUP') THEN
2282 l_award_quantity := null;
2283 ELSE
2284 l_award_quantity := p_award_lines(l_index).award_quantity;
2285 l_award_shipment_number := p_award_lines(l_index).award_shipment_number;
2286 END IF;
2287
2288 IF (g_debug_mode = 'Y') THEN
2289 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2290 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPDATE_BID_ITEM_PRICES', 'l_index : ' || l_index || ' ; award shipment number : ' || l_award_shipment_number || ' ; award quantity : ' || l_award_quantity);
2291 END IF;
2292 END IF;
2293
2294 --
2295 -- Price Tiers Changes. If quantity based price tiers are present call the upd_single_bid_item_prices_qt
2296 -- Api which takes the unit price from pon_bid_shipments according to awarded shipment number.
2297 --
2298
2299 IF ( l_award_shipment_number IS NULL OR
2300 l_award_shipment_number = -1 ) THEN --{
2301 update_single_bid_item_prices
2302 (
2303 p_award_lines(l_index).bid_number,
2304 p_award_lines(l_index).line_number,
2305 p_award_lines(l_index).award_status,
2306 l_award_quantity,
2307 p_award_lines(l_index).award_date,
2308 p_auctioneer_id
2309 );
2310 ELSE
2311
2312 -- Quantity Tiers Case.
2313 upd_single_bid_item_prices_qt
2314 (
2315 p_award_lines(l_index).bid_number,
2316 p_award_lines(l_index).line_number,
2317 p_award_lines(l_index).award_status,
2318 l_award_quantity,
2319 p_award_lines(l_index).award_date,
2320 p_auctioneer_id,
2321 l_award_shipment_number
2322 );
2323 END IF; --}
2324
2325 --ELINs project : If exhibits are enabled, all exhibit lines associated to this line should be updated.
2326 IF(l_are_exhibits_enabled = 'Y' AND p_mode = g_AWARD_MULTIPLE_LINES) THEN
2327 update_bid_exhibit_lines(p_auction_id,
2328 l_contract_type,
2329 p_award_lines(l_index).bid_number,
2330 p_award_lines(l_index).line_number,
2331 p_award_lines(l_index).award_status,
2332 p_auctioneer_id,
2333 p_mode,
2334 p_award_lines(l_index).award_date);
2335
2336 END IF;
2337 --End ELINs project
2338
2339 --
2340 IF ( (p_mode = g_AWARD_MULTIPLE_LINES AND l_group_type = 'LOT')
2341 OR (p_mode = g_AWARD_LINE AND l_group_type = 'LOT')
2342 OR (p_mode = g_AWARD_LINE_H AND l_group_type = 'LOT')
2343 OR (p_mode = g_AWARD_AUTO_RECOMMEND AND l_group_type = 'LOT')
2344 OR (p_mode = g_AWARD_GROUP_H AND l_group_type = 'GROUP')
2345 OR (p_mode = g_AWARD_GROUP AND l_group_type = 'GROUP') ) THEN
2346 award_bi_subline (
2347 p_auction_id,
2348 p_award_lines(l_index).bid_number,
2349 p_award_lines(l_index).line_number,
2350 p_award_lines(l_index).award_status,
2351 p_award_lines(l_index).award_date,
2352 p_auctioneer_id );
2353 ELSIF ( (p_mode = g_AWARD_MULTIPLE_LINES OR p_mode = g_AWARD_LINE
2354 OR p_mode = g_AWARD_LINE_H OR p_mode= g_AWARD_AUTO_RECOMMEND)
2355 AND (l_group_type = 'GROUP_LINE') ) THEN
2356
2357 -- get parent line number
2358 SELECT parent_line_number INTO l_parent_line_number
2359 FROM pon_auction_item_prices_all
2360 WHERE auction_header_id = p_auction_id
2361 AND line_number = p_award_lines(l_index).line_number;
2362
2363 /* Key will be bid:group 1234:56 */
2364 l_bid_line_key := to_char(p_award_lines(l_index).bid_number) || ':' || to_char(l_parent_line_number);
2365 IF NOT (l_bid_group_map.exists(l_bid_line_key)) THEN
2366 l_bid_group_map(l_bid_line_key) := l_bid_line_key;
2367 END IF;
2368 END IF;
2369 END LOOP;
2370 l_bid_line_key := l_bid_group_map.FIRST;
2371 WHILE l_bid_line_key IS NOT NULL LOOP
2372 -- update bid group
2373 l_bid_number := to_number(SUBSTR(l_bid_line_key ,1, instr(l_bid_line_key, ':') -1 ));
2374 l_parent_line_number := to_number(SUBSTR(l_bid_line_key, instr(l_bid_line_key, ':') +1));
2375 -- update parent group
2376 update_bi_group_award(
2377 p_auction_id,
2378 l_bid_number,
2379 l_parent_line_number,
2380 sysdate,
2381 p_auctioneer_id
2382 );
2383
2384 l_bid_line_key := l_bid_group_map.NEXT(l_bid_line_key);
2385 END LOOP;
2386
2387 IF (g_debug_mode = 'Y') THEN
2388 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2389 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPDATE_BID_ITEM_PRICES', 'Returning to the caller.....');
2390 END IF;
2391 END IF;
2392
2393 EXCEPTION
2394 WHEN OTHERS THEN
2395 IF (g_debug_mode = 'Y') THEN
2396 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2397 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPDATE_BID_ITEM_PRICES', 'An exception occurred during the execution. Raising the exception.....');
2398 END IF;
2399 END IF;
2400 RAISE;
2401 --
2402 END update_bid_item_prices;
2403 --
2404 --
2405 PROCEDURE update_single_bid_item_prices
2406 (
2407 p_bid_number IN NUMBER,
2408 p_line_number IN NUMBER,
2409 p_award_status IN VARCHAR2,
2410 p_award_quantity IN NUMBER,
2411 p_award_date IN DATE,
2412 p_auctioneer_id IN NUMBER
2413 )
2414 IS
2415 l_award_price NUMBER;
2416 BEGIN
2417
2418 IF (g_debug_mode = 'Y') THEN
2419 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2420
2421 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPDATE_SINGLE_BID_ITEM_PRICES', 'Entering the procedure for p_bid_number : ' || p_bid_number || ' ; p_line_number : ' || p_line_number);
2422
2423 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPDATE_SINGLE_BID_ITEM_PRICES', 'p_award_quantity : ' || p_award_quantity || ' ;p_award_date : ' || p_award_date || ' ;p_auctioneer_id : ' || p_auctioneer_id);
2424
2425 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPDATE_SINGLE_BID_ITEM_PRICES',' ;p_award_status : ' || p_award_status);
2426
2427 END IF;
2428 END IF;
2429
2430 --
2431 -- Cost Factors Enhancements
2432 -- If award_quantity is not zero or null then use the per unit and fixed amount component and award
2433 -- quantity to calculate the award price
2434 --
2435 SELECT decode(p_award_status, 'REJECTED', null,
2436 decode(nvl(p_award_quantity,0), 0,pbip.price,
2437 pbip.per_unit_price_component + pbip.fixed_amount_component /p_award_quantity))
2438 INTO l_award_price
2439 FROM pon_bid_item_prices pbip,
2440 pon_auction_item_prices_all paip
2441 WHERE pbip.bid_number = p_bid_number
2442 AND pbip.line_number = p_line_number
2443 AND paip.auction_header_id = pbip.auction_header_id
2444 AND paip.line_number = pbip.line_number;
2445
2446 IF (g_debug_mode = 'Y') THEN
2447 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2448 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPDATE_SINGLE_BID_ITEM_PRICES', 'award_price: ' || l_award_price);
2449 END IF;
2450 END IF;
2451
2452 --
2453 -- as this procedure will be called only if price tiers are not applicable so reseting the award_Shipment_number
2454 --
2455 UPDATE PON_BID_ITEM_PRICES
2456 SET award_quantity = p_award_quantity,
2457 award_price = l_award_price,
2458 award_status = p_award_status,
2459 award_date = p_award_date,
2460 last_update_date = p_award_date,
2461 last_updated_by = p_auctioneer_id,
2462 award_shipment_number = NULL
2463 WHERE Bid_number = p_bid_number AND
2464 Line_Number = p_line_number;
2465
2466 IF (g_debug_mode = 'Y') THEN
2467 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2468 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPDATE_SINGLE_BID_ITEM_PRICES', 'PON_BID_ITEM_PRICES has been updated. Returning to the caller....');
2469 END IF;
2470 END IF;
2471
2472 END update_single_bid_item_prices;
2473
2474 /*==========================================================================================================================
2475 * PROCEDURE : upd_single_bid_item_prices_qt
2476 * PARAMETERS: 1. p_bid_number - bid number for which the award_price and shipment no to be updated.
2477 * 2. p_line_number - corresponding line number
2478 * 3. p_award_status - award status 'AWARDED' or 'REJECTED'
2479 * 4. p_award_quantity - The quantity awarded
2480 * 5. p_award_date -- Award Datw
2481 * 6. p_auctioneer_id - Id of person who is saving award
2482 * 7. p_award_shipment_number - Quantity awarded falls in the tiers range corresponding to the shipment number
2483 * COMMENT : This procedure calculates the award price based on the per unit and fixed amount component and
2484 * corresponding to the award shipment number. PON_BID_ITEM_PRICES is updated accordingly
2485 *==========================================================================================================================*/
2486 PROCEDURE upd_single_bid_item_prices_qt
2487 (
2488 p_bid_number IN NUMBER,
2489 p_line_number IN NUMBER,
2490 p_award_status IN VARCHAR2,
2491 p_award_quantity IN NUMBER,
2492 p_award_date IN DATE,
2493 p_auctioneer_id IN NUMBER,
2494 p_award_shipment_number IN NUMBER
2495 )
2496 IS
2497 l_award_price NUMBER;
2498 BEGIN
2499
2500 IF (g_debug_mode = 'Y') THEN
2501 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2502 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPD_SINGLE_BID_ITEM_PRICES_QT', 'Entering the procedure for p_bid_number : ' || p_bid_number || ' ; p_line_number : ' || p_line_number);
2503 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPD_SINGLE_BID_ITEM_PRICES_QT', 'p_award_status : ' || p_award_status || ' ;p_award_quantity : ' || p_award_quantity || ' ;p_award_date : ' || p_award_date);
2504 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPD_SINGLE_BID_ITEM_PRICES_QT',' p_auctioneer_id : ' || p_auctioneer_id || ' ;p_award_shipment_number : ' || p_award_shipment_number);
2505 END IF;
2506 END IF;
2507
2508 --
2509 -- Cost Factors Enhancements
2510 -- If award_quantity is not zero or null then use the per unit and fixed amount component and award
2511 -- quantity to calculate the award price
2512 --
2513
2514 SELECT DECODE(p_award_status, 'REJECTED', NULL,
2515 DECODE (NVL(p_award_quantity,0), 0, pbs.price,
2516 pbs.per_unit_price_component+pbip.fixed_amount_component/p_award_quantity))
2517 INTO l_award_price
2518 FROM pon_bid_item_prices pbip,
2519 pon_auction_item_prices_all paip,
2520 pon_bid_shipments pbs
2521 WHERE pbip.bid_number = p_bid_number
2522 AND pbip.line_number = p_line_number
2523 AND paip.auction_header_id = pbip.auction_header_id
2524 AND paip.line_number = pbip.line_number
2525 AND pbs.bid_number = pbip.bid_number
2526 AND pbs.line_number = pbip.line_number
2527 AND pbs.shipment_number = p_award_shipment_number;
2528
2529 IF (g_debug_mode = 'Y') THEN --{
2530 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN --}
2531 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPD_SINGLE_BID_ITEM_PRICES_QT', 'award_price: ' || l_award_price);
2532 END IF; --}
2533 END IF; --}
2534
2535 UPDATE PON_BID_ITEM_PRICES
2536 SET award_quantity = p_award_quantity,
2537 award_status = p_award_status,
2538 award_date = p_award_date,
2539 last_update_date = p_award_date,
2540 last_updated_by = p_auctioneer_id,
2541 award_price = l_award_price,
2542 award_shipment_number = p_award_shipment_number
2543 WHERE Bid_number = p_bid_number AND
2544 Line_Number = p_line_number;
2545
2546 IF (g_debug_mode = 'Y') THEN
2547 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2548 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPD_SINGLE_BID_ITEM_PRICES_QT', 'PON_BID_ITEM_PRICES has been updated. Returning to the caller....');
2549 END IF;
2550 END IF;
2551
2552 END upd_single_bid_item_prices_qt;
2553
2554 --
2555 --
2556 PROCEDURE update_bid_headers
2557 (
2558 p_auction_id IN NUMBER,
2559 p_auctioneer_id IN NUMBER,
2560 p_awarded_bid_headers IN t_awarded_bid_headers DEFAULT t_emptytbl, -- FPK: CPA
2561 p_neg_has_lines IN VARCHAR2 -- FPK: CPA
2562 )
2563 IS
2564 --
2565
2566 CURSOR c_active_bids (c_auction_id NUMBER) is
2567 SELECT bh.bid_number
2568 FROM pon_bid_headers bh
2569 WHERE bh.auction_header_id = c_auction_id
2570 AND bid_status = 'ACTIVE';
2571
2572 /* Unsolicited Lines Project : New cursor if unsol lines are allowed. Check if lines exist in each bid or not. */
2573 CURSOR c_unsol_active_bids (c_auction_id NUMBER) is
2574 SELECT bh.bid_number,Decode((SELECT Count(*) FROM pon_bid_item_prices pbip WHERE pbip.bid_number = bh.bid_number),0,'N','Y') has_lines
2575 FROM pon_bid_headers bh
2576 WHERE bh.auction_header_id = c_auction_id
2577 AND bid_status = 'ACTIVE';
2578
2579 l_unsol_active_bids_rec c_unsol_active_bids%ROWTYPE; --Unsolicited Lines Project
2580 l_active_bids_rec c_active_bids%ROWTYPE;
2581
2582 -- FPK: CPA
2583 l_index PLS_INTEGER;
2584 l_bid_headers_count PLS_INTEGER :=0; -- generic pon_bid_headers index
2585
2586 -- Declaration of individual elements to avoid ORA-3113 error because
2587 -- FORALL does not allow update of elements using rec(i).field
2588 l_bid_number_tbl Number_tbl_type;
2589 l_award_status_tbl Char25_tbl_type;
2590 l_award_date_tbl Date_tbl_type;
2591 --
2592 l_has_unsol_lines VARCHAR2(1); --Unsolicited Lines Project
2593 l_unsol_lines_allowed VARCHAR2(1); --Unsolicited Lines Project
2594
2595 BEGIN
2596 l_has_unsol_lines := 'N';
2597 /* Unsolicited Lines Project : Check if neg has any unsolcited lines on offers or not. */
2598 l_has_unsol_lines := PON_UNSOL_UTIL_PKG.HAS_UNSOL_LINES(p_auction_id) ;
2599 l_unsol_lines_allowed := PON_UNSOL_UTIL_PKG.ARE_UNSOL_LINES_ALLOWED(p_auction_id) ;
2600
2601 IF p_neg_has_lines = 'Y' OR l_has_unsol_lines = 'Y' THEN -- FPK: CPA
2602 /* Unsolicited Lines Project : If unsol lines are allowed, some offers can have lines
2603 * and others may not have. Call update_single_bid_header procedure only when
2604 * Response has lines.
2605 */
2606 IF l_unsol_lines_allowed = 'Y' THEN
2607 OPEN c_unsol_active_bids (p_auction_id);
2608 LOOP
2609 FETCH c_unsol_active_bids into l_unsol_active_bids_rec;
2610 EXIT WHEN c_unsol_active_bids%NOTFOUND;
2611 IF l_unsol_active_bids_rec.has_lines = 'Y' THEN
2612 update_single_bid_header (l_unsol_active_bids_rec.bid_number,
2613 p_auctioneer_id );
2614 ELSE
2615 /* Award By Quote Mode : If response donot have lines, then header level awarding
2616 * Iterate through p_awarded_bid_headers to get award status
2617 * If this bid is found in p_awarded_bid_headers, then set award status as 'AWARDED'
2618 */
2619 IF p_awarded_bid_headers.count > 0 THEN
2620 FOR l_award_index IN p_awarded_bid_headers.first..p_awarded_bid_headers.last
2621 LOOP
2622 IF l_unsol_active_bids_rec.bid_number = p_awarded_bid_headers(l_award_index).bid_number then
2623 --This is a winning bid, update pon_bid_headers table
2624 UPDATE PON_BID_HEADERS
2625 SET AWARD_STATUS = p_awarded_bid_headers(l_award_index).award_status,
2626 AWARD_DATE = p_awarded_bid_headers(l_award_index).award_date,
2627 last_update_date = SYSDATE,
2628 last_updated_by = p_auctioneer_id
2629 WHERE bid_number = l_unsol_active_bids_rec.bid_number;
2630
2631 END IF; --End if this is a winning bid.
2632 END LOOP;
2633
2634 END IF; --end p_awarded_bid_headers loop
2635
2636 END IF; -- end if bid has lines
2637 END LOOP; --end c_unsol_active_bids loop
2638 CLOSE c_unsol_active_bids;
2639 ELSE
2640 OPEN c_active_bids (p_auction_id);
2641 LOOP
2642 FETCH c_active_bids into l_active_bids_rec;
2643 EXIT WHEN c_active_bids%NOTFOUND;
2644 update_single_bid_header (l_active_bids_rec.bid_number,
2645 p_auctioneer_id );
2646 END LOOP;
2647 CLOSE c_active_bids;
2648 END IF;
2649 ELSE -- negotiation does not have lines
2650 -- Loop through the matrix to update bid headers
2651 -- Map all values into single table arrays to avoid Oracle errors
2652 -- caused by using rec(i).field
2653 IF p_awarded_bid_headers.count > 0 THEN
2654 FOR l_index IN p_awarded_bid_headers.first..p_awarded_bid_headers.last
2655 LOOP
2656 l_bid_headers_count := l_bid_headers_count + 1;
2657 l_bid_number_tbl(l_bid_headers_count) := p_awarded_bid_headers(l_index).bid_number;
2658 l_award_status_tbl(l_bid_headers_count):= p_awarded_bid_headers(l_index).award_status;
2659 l_award_date_tbl(l_bid_headers_count) := p_awarded_bid_headers(l_index).award_date;
2660 END LOOP;
2661 END IF;
2662 FORALL k IN 1..l_bid_headers_count
2663 UPDATE PON_BID_HEADERS
2664 SET AWARD_STATUS = l_award_status_tbl(k),
2665 AWARD_DATE = l_award_date_tbl(k), /* new column created as part of CPA project.
2666 It will be updated only when negotiation does
2667 not have lines. */
2668 last_update_date = SYSDATE,
2669 last_updated_by = p_auctioneer_id
2670 WHERE bid_number = l_bid_number_tbl(k);
2671 END IF;
2672
2673 END update_bid_headers;
2674 --
2675 --
2676 PROCEDURE update_single_bid_header
2677 (
2678 p_bid_number IN NUMBER,
2679 p_auctioneer_id IN NUMBER
2680 )
2681 IS
2682 --
2683 --Unsolicited Lines Projcet : Modify cursor query to fetch unsolicited lines also.
2684 CURSOR c_bid_lines (c_bid_number NUMBER) is
2685
2686 ((SELECT bi.Line_number,
2687 bi.award_status,
2688 nvl(bi.award_price , bi.price) * bi.award_quantity award_price
2689 FROM pon_bid_item_prices bi, pon_auction_item_prices_all ai
2690 WHERE bi.bid_number = c_bid_number
2691 and bi.auction_header_id = ai.auction_header_id
2692 and bi.line_number = ai.line_number
2693 and ai.group_type in ('LOT', 'LINE', 'GROUP_LINE'))
2694 UNION
2695 (SELECT pbip.line_number,
2696 pbip.award_status,
2697 nvl(pbip.award_price , pbip.price) * pbip.award_quantity award_price
2698 FROM pon_bid_item_prices pbip
2699 WHERE pbip.bid_number = c_bid_number
2700 AND pbip.auction_line_number = -1));
2701
2702 l_bid_lines_rec c_bid_lines%ROWTYPE;
2703 --
2704 l_award_status VARCHAR2(30);
2705 l_awarded_lines NUMBER;
2706 l_rejected_lines NUMBER;
2707 l_total_lines NUMBER ;
2708 l_award_amount NUMBER;
2709 l_contract_type VARCHAR2(20);
2710 --
2711 --
2712 BEGIN
2713 l_award_amount := null;
2714 l_awarded_lines := 0;
2715 l_rejected_lines := 0;
2716 l_total_lines := 0;
2717 l_award_status := null;
2718 --
2719 SELECT ah.contract_type INTO l_contract_type
2720 FROM pon_auction_headers_all ah, pon_bid_headers bh
2721 WHERE bh.bid_number = p_bid_number
2722 AND bh.auction_header_id = ah.auction_header_id;
2723 --
2724 OPEN c_bid_lines (p_bid_number);
2725 LOOP
2726 FETCH c_bid_lines into l_bid_lines_rec;
2727 EXIT WHEN c_bid_lines%NOTFOUND;
2728 l_total_lines := l_total_lines + 1;
2729 IF l_bid_lines_rec.AWARD_STATUS = 'AWARDED' THEN
2730 l_awarded_lines := l_awarded_lines + 1;
2731 END IF;
2732 IF l_bid_lines_rec.AWARD_STATUS = 'REJECTED' THEN
2733 l_rejected_lines := l_rejected_lines + 1;
2734 END IF;
2735 IF l_contract_type = 'STANDARD' THEN
2736 l_award_amount := nvl(l_award_amount,0) + nvl(l_bid_lines_rec.award_price,0);
2737 END IF;
2738 END LOOP;
2739
2740 CLOSE c_bid_lines;
2741 IF (l_awarded_lines <> 0) AND (l_awarded_lines = l_total_lines) THEN
2742 l_award_status := 'AWARDED';
2743 ELSIF (l_rejected_lines <> 0) AND (l_rejected_lines = l_total_lines) THEN
2744 l_award_status := 'REJECTED';
2745 ELSIF l_awarded_lines > 0 THEN
2746 l_award_status := 'PARTIAL';
2747 END IF;
2748 --
2749 UPDATE PON_BID_HEADERS
2750 SET AWARD_STATUS = l_award_status,
2751 total_award_amount = l_award_amount,
2752 last_update_date = SYSDATE,
2753 last_updated_by = p_auctioneer_id
2754 WHERE bid_number = p_bid_number;
2755 --
2756 END update_single_bid_header;
2757 --
2758 --
2759 PROCEDURE update_auction_item_prices
2760 (
2761 p_auction_id IN NUMBER,
2762 p_line_number IN NUMBER,
2763 p_award_date IN DATE,
2764 p_auctioneer_id IN NUMBER,
2765 p_mode IN VARCHAR2
2766 )
2767 IS
2768 CURSOR c_auction_items (c_auction_id NUMBER) IS
2769 SELECT line_number, group_type
2770 FROM pon_auction_item_prices_all
2771 WHERE auction_header_id = c_auction_id
2772 AND Nvl(award_status, 'NO') <> 'COMPLETED'; --Staggered Awards project
2773 l_auction_items_rec c_auction_items%ROWTYPE;
2774 --
2775 CURSOR c_item_sublines (c_auction_id NUMBER, c_parent_line_number NUMBER) IS
2776 SELECT line_number, group_type
2777 FROM pon_auction_item_prices_all
2778 WHERE auction_header_id = c_auction_id
2779 AND parent_line_number = c_parent_line_number
2780 AND Nvl(award_status, 'NO') <> 'COMPLETED'; --Staggered Awards project
2781
2782 l_item_sublines_rec c_item_sublines%ROWTYPE;
2783 --
2784 l_group_type pon_auction_item_prices_all.group_type%TYPE;
2785 --
2786 BEGIN
2787
2788 OPEN c_auction_items(p_auction_id);
2789
2790 IF (p_mode = g_AWARD_QUOTE OR p_mode = g_AWARD_MULTIPLE_LINES
2791 OR p_mode=g_AWARD_AUTO_RECOMMEND OR p_mode = g_AWARD_OPTIMIZATION) THEN
2792 LOOP
2793 FETCH c_auction_items INTO l_auction_items_rec;
2794 EXIT WHEN c_auction_items%NOTFOUND;
2795 update_single_auction_item(p_auction_id,
2796 l_auction_items_rec.line_number,
2797 p_auctioneer_id, p_mode);
2798 END LOOP;
2799 CLOSE c_auction_items;
2800 ELSE
2801 update_single_auction_item (p_auction_id,
2802 p_line_number,
2803 p_auctioneer_id,
2804 p_mode);
2805
2806 SELECT group_type INTO l_group_type FROM pon_auction_item_prices_all
2807 WHERE auction_header_id = p_auction_id
2808 AND line_number = p_line_number;
2809 IF ((p_mode = g_AWARD_LINE AND l_group_type = 'LOT')
2810 OR (p_mode = g_AWARD_LINE_H AND l_group_type = 'LOT')
2811 OR (p_mode = g_AWARD_GROUP_H AND l_group_type = 'GROUP')
2812 OR (p_mode = g_AWARD_GROUP AND l_group_type = 'GROUP') ) THEN
2813 --
2814 OPEN c_item_sublines (p_auction_id, p_line_number);
2815 --
2816 LOOP
2817 fetch c_item_sublines into l_item_sublines_rec;
2818 EXIT WHEN c_item_sublines%NOTFOUND;
2819 -- update the child lines
2820
2821 update_single_auction_item(p_auction_id,
2822 l_item_sublines_rec.line_number,
2823 p_auctioneer_id,
2824 p_mode);
2825 END LOOP;
2826 --
2827 ELSIF ((p_mode = g_AWARD_LINE OR p_mode = g_AWARD_LINE_H)
2828 AND l_group_type = 'GROUP_LINE') THEN
2829 update_ai_group_award(p_auction_id,
2830 p_line_number,
2831 p_award_date,
2832 p_auctioneer_id);
2833
2834 END IF;
2835 --
2836 END IF;
2837 --
2838 --
2839 END update_auction_item_prices;
2840 --
2841 --
2842 PROCEDURE update_single_auction_item
2843 (
2844 p_auction_id IN NUMBER,
2845 p_line_number IN NUMBER,
2846 p_auctioneer_id IN NUMBER,
2847 p_mode IN pon_auction_item_prices_all.award_mode%type
2848 )
2849 IS
2850 CURSOR c_bid_items (c_auction_id NUMBER, c_line_number NUMBER) IS
2851 SELECT bi.Line_number,
2852 ai.order_type_lookup_code,
2853 bi.award_status,
2854 bi.award_quantity,
2855 ai.group_type
2856 FROM pon_bid_item_prices bi,
2857 pon_bid_headers bh,
2858 pon_auction_item_prices_all ai
2859 WHERE bi.auction_header_id = c_auction_id
2860 AND bi.line_number = c_line_number
2861 AND bh.bid_status = 'ACTIVE'
2862 AND bh.auction_header_id = bi.auction_header_id
2863 AND bh.bid_number = bi.bid_number
2864 AND ai.auction_header_id = bi.auction_header_id
2865 AND ai.line_number = bi.line_number
2866 AND Nvl(ai.award_status, 'NO') <> 'COMPLETED';--Staggered Awards project
2867 l_bid_items_rec c_bid_items%ROWTYPE;
2868 l_award_status VARCHAR2(20);
2869 l_award_made BOOLEAN;
2870 l_award_quantity NUMBER;
2871 l_line_type VARCHAR2(20);
2872 l_contract_type VARCHAR2(20);
2873 l_group_type VARCHAR2(20);
2874 l_item_award_mode pon_auction_item_prices_all.award_mode%type;
2875 --
2876 BEGIN
2877 l_award_status := null;
2878 l_award_quantity := null;
2879 l_line_type := NULL;
2880 l_award_made := FALSE;
2881 l_item_award_mode := null;
2882 --
2883 SELECT ah.contract_type INTO l_contract_type
2884 FROM pon_auction_headers_all ah
2885 WHERE ah.auction_header_id = p_auction_id;
2886 --
2887 OPEN c_bid_items(p_auction_id, p_line_number) ;
2888 LOOP
2889 FETCH c_bid_items INTO l_bid_items_rec;
2890 EXIT WHEN c_bid_items%NOTFOUND;
2891 l_line_type := l_bid_items_rec.order_type_lookup_code;
2892 l_group_type:= l_bid_items_rec.group_type;
2893 IF l_bid_items_rec.award_status = 'AWARDED' THEN
2894 l_award_quantity := nvl(l_award_quantity,0) + l_bid_items_rec.award_quantity;
2895 IF (NOT l_award_made) THEN
2896 l_award_made := TRUE;
2897 END IF;
2898 END IF;
2899 IF ((l_award_status is null)
2900 AND ((l_bid_items_rec.award_status = 'AWARDED'))
2901 --Bug 12573845
2902 --PON_AUCTION_ITEM_PRICES_ALL table was being updated with AWARDED status regardless of the bid status
2903 --Modified such that only if Bid line is awarded, Negotiation line is set to AWARDED
2904
2905 --OR (l_bid_items_rec.award_status = 'REJECTED') --bug No: 9741473
2906 --OR (l_bid_items_rec.award_status = 'PARTIAL'))
2907 ) THEN
2908 l_award_status := 'AWARDED';
2909 END IF;
2910 END LOOP;
2911 CLOSE c_bid_items;
2912 --
2913 IF (l_award_made) AND (NOT (l_contract_type = 'STANDARD' AND l_line_type = 'QUANTITY'))
2914 AND (l_group_type <> 'LOT_LINE' AND l_group_type <> 'GROUP') THEN
2915 l_award_quantity := 1;
2916 END IF ;
2917 --
2918 -- set award mode = GROUP for group level award.
2919 IF(p_mode = g_AWARD_GROUP OR p_mode = g_AWARD_GROUP_H) AND l_group_type = 'GROUP' THEN
2920 l_item_award_mode := 'GROUP';
2921 END IF;
2922 UPDATE pon_auction_item_prices_all
2923 SET award_status = l_award_status,
2924 awarded_quantity = l_award_quantity,
2925 award_mode = l_item_award_mode,
2926 last_update_date = SYSDATE,
2927 last_updated_by = p_auctioneer_id
2928 WHERE auction_header_id = p_auction_id
2929 AND line_number = p_line_number
2930 AND Nvl(award_status, 'NO') <> 'COMPLETED';
2931 --
2932 END update_single_auction_item;
2933 --
2934 --
2935 PROCEDURE update_auction_headers
2936 (
2937 p_auction_id IN NUMBER,
2938 p_mode IN VARCHAR2,
2939 p_award_date IN DATE,
2940 p_auctioneer_id IN NUMBER,
2941 p_neg_has_lines IN VARCHAR2 -- FPK: CPA
2942 )
2943 IS
2944 --
2945 /*
2946 CURSOR c_auction_lines (c_auction_id NUMBER) is
2947 SELECT Line_number, award_status
2948 FROM pon_auction_item_prices_all
2949 WHERE auction_header_id = c_auction_id
2950 AND number_of_bids > 0
2951 AND group_type in ('LOT', 'LINE', 'GROUP_LINE');
2952
2953 l_auction_lines_rec c_auction_lines%ROWTYPE;
2954 */
2955 --
2956 l_award_status VARCHAR2(20);
2957 l_award_mode VARCHAR2(20);
2958 l_awarded_lines NUMBER;
2959 l_total_lines NUMBER;
2960
2961 l_awarded_bids NUMBER; -- FPK: CPA
2962
2963 l_has_unsol_lines VARCHAR2(1); --Unsolicited Lines Project
2964 l_awarded_unsol_line_count NUMBER; --Unsolicited Lines Project
2965 --
2966 BEGIN
2967 l_awarded_lines := 0;
2968 l_total_lines := 0;
2969 l_award_status := 'NO';
2970 l_award_mode := null;
2971
2972 -- Unsolicited Lines Project
2973 l_has_unsol_lines := PON_UNSOL_UTIL_PKG.HAS_UNSOL_LINES(p_auction_id);
2974 l_awarded_unsol_line_count := 0;
2975
2976 /* CASE p_mode
2977 WHEN g_AWARD_QUOTE THEN l_Award_mode := 'HEADER';
2978 WHEN g_AWARD_MULTIPLE_LINES THEN l_award_mode := 'MULTIPLE_LINES';
2979 WHEN g_AWARD_LINE THEN l_award_mode := 'LINE';
2980 WHEN g_AWARD_LINE_H THEN l_award_mode := 'LINE';
2981 WHEN g_AWARD_AUTO_RECOMMEND THEN l_award_mode := 'LINE';
2982 ELSE l_Award_Status := null;
2983 END CASE;
2984 */
2985 IF p_mode = g_AWARD_QUOTE THEN
2986 l_Award_mode := 'HEADER';
2987 ELSIF p_mode = g_AWARD_MULTIPLE_LINES THEN
2988 l_award_mode := 'MULTIPLE_LINES';
2989 ELSIF p_mode = g_AWARD_LINE THEN
2990 l_award_mode := 'LINE';
2991 ELSIF p_mode = g_AWARD_LINE_H THEN
2992 l_award_mode := 'LINE';
2993 ELSIF p_mode = g_AWARD_GROUP THEN
2994 l_award_mode := 'LINE';
2995 ELSIF p_mode = g_AWARD_GROUP_H THEN
2996 l_award_mode := 'LINE';
2997 ELSIF p_mode = g_AWARD_AUTO_RECOMMEND THEN
2998 l_award_mode := 'LINE';
2999 ELSIF p_mode = g_AWARD_OPTIMIZATION THEN
3000 l_award_mode := 'LINE';
3001 ELSE l_award_mode := null;
3002 END IF;
3003 --
3004 --Unsolicited Lines Project : If unsol lines exist on any of the bids.
3005 IF p_neg_has_lines = 'Y' OR l_has_unsol_lines = 'Y' THEN -- FPK: CPA
3006
3007 /*
3008 large-auction-support changes
3009 rather than looping over all the lines, we will simply
3010 execute a single query
3011 */
3012
3013 SELECT count(Line_number), sum(decode(award_status, 'AWARDED', 1, 0))
3014 INTO l_total_lines, l_awarded_lines
3015 FROM pon_auction_item_prices_all
3016 WHERE auction_header_id = p_auction_id
3017 AND number_of_bids > 0
3018 AND group_type in ('LOT', 'LINE', 'GROUP_LINE');
3019
3020 IF ((l_awarded_lines <> 0) AND (l_awarded_lines = l_total_lines) ) THEN
3021 l_award_status := 'AWARDED';
3022 ELSIF (l_awarded_lines > 0) THEN
3023 l_award_status := 'PARTIAL';
3024 ELSIF l_has_unsol_lines = 'Y' THEN
3025 /* Unsolicited Lines Project : If no lines in the auction are awarded,
3026 * check if any of the unsolicited lines are awarded or not.
3027 * If any of the unsolcited line on any offer is awarded, then mark auction
3028 * award_status as 'PARTIAL'
3029 */
3030 SELECT sum(Decode(award_status, 'AWARDED', 1, 0))
3031 INTO l_awarded_unsol_line_count
3032 FROM pon_bid_item_prices
3033 WHERE auction_header_id = p_auction_id
3034 AND auction_line_number = -1;
3035
3036 IF l_awarded_unsol_line_count > 0 THEN
3037 l_award_status := 'PARTIAL';
3038 END IF;
3039
3040 END IF;
3041 ELSE -- negotiation does not have lines
3042 BEGIN
3043 select 'AWARDED' -- it means an award decision was made
3044 into l_award_status
3045 from dual
3046 where exists (select 1
3047 from pon_bid_headers
3048 where auction_header_id = p_auction_id
3049 and bid_status = 'ACTIVE'
3050 and award_status IN ('AWARDED', 'REJECTED'));
3051 EXCEPTION
3052 WHEN NO_DATA_FOUND THEN
3053 NULL; -- award_status is set to 'NO' in the beggining of the procedure.
3054 END;
3055
3056 END IF; -- IF p_neg_has_lines = 'Y'
3057
3058 UPDATE PON_Auction_HEADERS_all
3059 SET AWARD_STATUS = l_award_status,
3060 award_mode = l_award_mode,
3061 award_date = p_award_date,
3062 last_updated_by = p_auctioneer_id
3063 -- modified after last update date check
3064 --award_approval_status = 'REQUIRED'
3065 --last_update_date = SYSDATE
3066 WHERE auction_header_id = p_auction_id ;
3067
3068 UPDATE PON_AUCTION_HEADERS_ALL
3069 SET award_approval_status = 'REQUIRED'
3070 WHERE auction_header_id = p_auction_id
3071 AND nvl(award_approval_flag, 'N') = 'Y';
3072 --
3073 END update_auction_headers;
3074 --
3075 --
3076 -- Updates the award_approval_status and sets to REQUIRED
3077 -- since the award is modified, sets the upadated by column as well.
3078 PROCEDURE update_award_agreement_amount
3079 (
3080 p_auction_id IN NUMBER,
3081 p_auctioneer_id IN NUMBER
3082 )
3083 IS
3084 BEGIN
3085 -- Updates approval_status if approval flag is set
3086 UPDATE PON_AUCTION_HEADERS_ALL
3087 SET award_approval_status = 'REQUIRED'
3088 WHERE auction_header_id = p_auction_id
3089 AND nvl(award_approval_flag, 'N') = 'Y';
3090 --
3091 -- Updates last update date etc since award is modified.
3092 UPDATE PON_Auction_HEADERS_all
3093 SET award_date = SYSDATE,
3094 last_updated_by = p_auctioneer_id,
3095 last_update_date = SYSDATE
3096 WHERE auction_header_id = p_auction_id ;
3097 --
3098 END update_award_agreement_amount;
3099 --
3100 --
3101 PROCEDURE bulk_update_pon_acceptances
3102 ( p_auction_header_id IN NUMBER,
3103 p_line_number IN NUMBER,
3104 p_note_to_accepted IN VARCHAR2,
3105 p_note_to_rejected IN VARCHAR2,
3106 p_award_date IN DATE,
3107 p_auctioneer_id IN NUMBER,
3108 p_mode IN VARCHAR2
3109 )
3110 IS
3111 BEGIN
3112 IF(p_line_number > 0 ) THEN
3113 IF (p_mode = g_AWARD_GROUP OR p_mode = g_AWARD_GROUP_H) THEN
3114 -- Group Level Awards
3115 -- Insert empty notes for group lines
3116 -- Delete notes for a line
3117 DELETE FROM pon_acceptances
3118 WHERE auction_header_id = p_auction_header_id
3119 AND line_number IN (SELECT line_number FROM pon_auction_item_prices_all
3120 WHERE parent_line_number = p_line_number
3121 AND auction_header_id = p_auction_header_id);
3122 INSERT INTO pon_acceptances (
3123 acceptance_id,
3124 auction_header_id,
3125 auction_line_number,
3126 bid_number,
3127 line_number,
3128 acceptance_type,
3129 acceptance_date,
3130 reason,
3131 creation_date,
3132 created_by)
3133 SELECT pon_acceptances_s.nextval,
3134 bi.auction_header_id,
3135 bi.auction_line_number,
3136 bi.bid_number,
3137 bi.line_number,
3138 bi.award_status,
3139 p_award_date,
3140 null,
3141 p_award_date,
3142 p_auctioneer_id
3143 FROM pon_bid_item_prices bi, pon_bid_headers bh, pon_auction_item_prices_all ai
3144 WHERE bi.auction_header_id = ai.auction_header_id
3145 AND ai.line_number = bi.line_number
3146 AND (bi.award_status = 'AWARDED'
3147 OR bi.award_status = 'REJECTED')
3148 AND bi.bid_number = bh.bid_number
3149 AND bh.bid_status = 'ACTIVE'
3150 AND ai.auction_header_id = p_auction_header_id
3151 AND ai.parent_line_number = p_line_number;
3152 --
3153 ELSE
3154 -- Award Line Mode
3155 -- Delete notes for a line
3156 DELETE FROM pon_acceptances
3157 WHERE auction_header_id = p_auction_header_id
3158 AND line_number = p_line_number;
3159 INSERT INTO pon_acceptances (
3160 acceptance_id,
3161 auction_header_id,
3162 auction_line_number,
3163 bid_number,
3164 line_number,
3165 acceptance_type,
3166 acceptance_date,
3167 reason,
3168 creation_date,
3169 created_by)
3170 SELECT pon_acceptances_s.nextval,
3171 bi.auction_header_id,
3172 bi.auction_line_number,
3173 bi.bid_number,
3174 bi.line_number,
3175 bi.award_status,
3176 p_award_date,
3177 decode (bi.award_status,
3178 'AWARDED', p_note_to_accepted,
3179 'REJECTED', p_note_to_rejected,
3180 null),
3181 SYSDATE,
3182 p_auctioneer_id
3183 FROM pon_bid_item_prices bi, pon_bid_headers bh
3184 WHERE bi.auction_header_id = p_auction_header_id
3185 AND bi.line_number = p_line_number
3186 AND (bi.award_status = 'AWARDED'
3187 OR bi.award_status = 'REJECTED')
3188 AND bi.bid_number = bh.bid_number
3189 AND bh.bid_status = 'ACTIVE';
3190 END IF;
3191 ELSE
3192 -- Header Level Award
3193 -- Delete notes for an auction
3194 DELETE FROM pon_acceptances
3195 WHERE auction_header_id = p_auction_header_id;
3196 --
3197 INSERT INTO pon_acceptances (
3198 acceptance_id,
3199 auction_header_id,
3200 auction_line_number,
3201 bid_number,
3202 line_number,
3203 acceptance_type,
3204 acceptance_date,
3205 reason,
3206 creation_date,
3207 created_by)
3208 SELECT pon_acceptances_s.nextval,
3209 bi.auction_header_id,
3210 bi.auction_line_number,
3211 bi.bid_number,
3212 bi.line_number,
3213 bi.award_status,
3214 p_award_date,
3215 decode (bi.award_status,
3216 'AWARDED', p_note_to_accepted,
3217 'REJECTED', p_note_to_rejected,
3218 null),
3219 p_award_date,
3220 p_auctioneer_id
3221 FROM pon_bid_item_prices bi, pon_bid_headers bh, pon_auction_item_prices_all ai
3222 WHERE bi.auction_header_id = p_auction_header_id
3223 AND (bi.award_status = 'AWARDED'
3224 OR bi.award_status = 'REJECTED')
3225 AND bi.bid_number = bh.bid_number
3226 AND bh.bid_status = 'ACTIVE'
3227 AND bi.auction_header_id = ai.auction_header_id
3228 AND bi.line_number = ai.line_number
3229 AND ai.group_type IN ('LOT', 'LINE', 'GROUP_LINE');
3230 END IF;
3231 END bulk_update_pon_acceptances;
3232 --
3233 --
3234 FUNCTION get_award_status (award_outcome IN VARCHAR2)
3235 RETURN VARCHAR2
3236 IS
3237 --
3238 l_award_status VARCHAR2(20);
3239 BEGIN
3240 /*
3241 CASE award_outcome
3242 WHEN g_AWARD_OUTCOME_WIN THEN l_Award_Status := 'AWARDED';
3243 WHEN g_AWARD_OUTCOME_LOSE THEN l_Award_Status := 'REJECTED';
3244 WHEN g_AWARD_OUTCOME_NOAWARD THEN l_Award_Status := 'REJECTED';
3245 ELSE l_Award_Status := null;
3246 END CASE;
3247 */
3248 IF award_outcome = g_AWARD_OUTCOME_WIN THEN
3249 l_Award_Status := 'AWARDED';
3250 ELSIF award_outcome = g_AWARD_OUTCOME_LOSE THEN
3251 l_Award_Status := 'REJECTED';
3252 ELSIF award_outcome = g_AWARD_OUTCOME_NOAWARD THEN
3253 l_Award_Status := 'REJECTED';
3254 ELSE l_Award_Status := null;
3255 END IF;
3256
3257 RETURN l_award_status;
3258 --
3259 END get_award_status;
3260 --
3261 --
3262 PROCEDURE update_unawarded_acceptances
3263 ( p_auction_header_id IN NUMBER,
3264 p_line_number IN NUMBER,
3265 p_note_to_rejected IN VARCHAR2,
3266 p_award_date IN DATE,
3267 p_auctioneer_id IN NUMBER
3268 )
3269 IS
3270 BEGIN
3271 -- Award Line Mode
3272 -- Delete rejected notes for a line
3273 DELETE FROM pon_acceptances
3274 WHERE auction_header_id = p_auction_header_id
3275 AND line_number = p_line_number
3276 AND acceptance_type = 'REJECTED';
3277 -- insert rejection note for all rejected suppliers
3278 INSERT INTO pon_acceptances (
3279 acceptance_id,
3280 auction_header_id,
3281 auction_line_number,
3282 bid_number,
3283 line_number,
3284 acceptance_type,
3285 acceptance_date,
3286 reason,
3287 creation_date,
3288 created_by)
3289 SELECT pon_acceptances_s.nextval,
3290 bi.auction_header_id,
3291 bi.auction_line_number,
3292 bi.bid_number,
3293 bi.line_number,
3294 'REJECTED',
3295 p_award_date,
3296 p_note_to_rejected,
3297 p_award_date,
3298 p_auctioneer_id
3299 FROM pon_bid_item_prices bi, pon_bid_headers bh
3300 WHERE bi.auction_header_id = p_auction_header_id
3301 AND bi.line_number = p_line_number
3302 AND nvl(bi.award_status, 'NO') <> 'AWARDED' -- can be REJECTED/ NO
3303 AND bi.bid_number = bh.bid_number
3304 AND bh.bid_status = 'ACTIVE';
3305 END update_unawarded_acceptances;
3306 --
3307 --
3308 PROCEDURE update_notes_for_bid
3309 (
3310 p_bid_number IN NUMBER,
3311 p_note_to_supplier IN VARCHAR2,
3312 p_internal_note IN VARCHAR2,
3313 p_auctioneer_id IN NUMBER
3314 )
3315 IS
3316 BEGIN
3317 UPDATE pon_bid_headers
3318 SET Internal_note = p_internal_note,
3319 note_to_supplier = p_note_to_supplier
3320 WHERE bid_number = p_bid_number;
3321 END update_notes_for_bid;
3322 --
3323 --
3324 PROCEDURE clear_draft_awards
3325 (
3326 p_auction_header_id IN NUMBER,
3327 p_line_number IN NUMBER,
3328 p_award_date IN DATE,
3329 p_auctioneer_id IN NUMBER,
3330 p_neg_has_lines IN VARCHAR2 -- FPK: CPA
3331 )
3332 IS
3333 BEGIN
3334
3335 IF p_neg_has_lines = 'Y' THEN -- FPK: CPA
3336
3337
3338 IF (p_line_number IS NULL OR p_line_number <= 0 )THEN
3339 -- Header level awards
3340 --Update award status to REJECTED for all the bids
3341 UPDATE pon_bid_item_prices
3342 SET award_status = 'REJECTED',
3343 award_quantity = NULL,
3344 award_date = p_award_date,
3345 last_update_date = p_award_date,
3346 last_updated_by = p_auctioneer_id,
3347 award_shipment_number = NULL,
3348 award_price = NULL
3349 WHERE bid_number IN (
3350 SELECT bid_number
3351 FROM pon_bid_headers
3352 WHERE auction_header_id = p_auction_header_id
3353 AND bid_status = 'ACTIVE'
3354 )
3355 AND auction_line_number <> -1; -- Unsolicited Lines Project : Donot clear unsolicited lines awarded.
3356
3357 -- Delete All Awards since it is a header-level awarding
3358 DELETE FROM pon_acceptances
3359 WHERE auction_header_id = p_auction_header_id
3360 AND auction_line_number <> -1; -- Unsolicited Lines Project : Donot delete unsolicited lines records.
3361
3362
3363 -- reset the award mode at auction item level
3364 UPDATE pon_auction_item_prices_all
3365 SET award_mode = null
3366 WHERE auction_header_id = p_auction_header_id;
3367 ELSE
3368 -- Group Level awards need to be rejected first
3369 --Update award status to REJECTED for all the bids
3370 UPDATE pon_bid_item_prices
3371 SET award_status = 'REJECTED',
3372 award_quantity = NULL,
3373 award_date = p_award_date,
3374 last_update_date = p_award_date,
3375 last_updated_by = p_auctioneer_id,
3376 award_shipment_number = NULL,
3377 award_price = NULL
3378 WHERE bid_number IN (
3379 SELECT bid_number
3380 FROM pon_bid_headers
3381 WHERE auction_header_id = p_auction_header_id
3382 AND bid_status = 'ACTIVE'
3383 )
3384 AND line_number IN (SELECT line_number
3385 FROM pon_auction_item_prices_all
3386 WHERE auction_header_id = p_auction_header_id
3387 AND (line_number = p_line_number
3388 OR parent_line_number = p_line_number));
3389
3390 -- Delete All group line awards since it is a group-level awarding
3391 DELETE FROM pon_acceptances
3392 WHERE auction_header_id = p_auction_header_id
3393 AND line_number IN (SELECT line_number
3394 FROM pon_auction_item_prices_all
3395 WHERE auction_header_id = p_auction_header_id
3396 AND parent_line_number = p_line_number);
3397 END IF;
3398 END IF;
3399
3400 /* FPK: CPA
3401 Reset notes for all the bids and update all active bids award status to REJECTED no matter
3402 if negotiation has lines or not. Previoulsy award_status was not being updated to REJECTED when
3403 negotiation had lines, but there is no harm in doing so at this point, as award_status will be
3404 updated later in update_single_bid_header procedure. */
3405
3406 UPDATE pon_bid_headers
3407 SET award_status = 'REJECTED',
3408 note_to_supplier = NULL,
3409 internal_note = NULL,
3410 po_agreed_amount = NULL,
3411 last_update_date = SYSDATE,
3412 last_updated_by = p_auctioneer_id
3413 WHERE auction_header_id = p_auction_header_id
3414 AND bid_status = 'ACTIVE';
3415 END clear_draft_awards;
3416 --
3417 --
3418 --
3419 --
3420 PROCEDURE clear_awards_recommendation
3421 (
3422 p_auction_header_id NUMBER,
3423 p_award_date DATE,
3424 p_auctioneer_id IN NUMBER
3425 )
3426 IS
3427 BEGIN
3428 --Update award status to REJECTED for all the bids
3429 UPDATE pon_bid_item_prices
3430 SET award_status = 'REJECTED',
3431 award_quantity = NULL,
3432 award_date = p_award_date,
3433 last_update_date = SYSDATE,
3434 last_updated_by = p_auctioneer_id,
3435 award_price = NULL
3436 WHERE bid_number IN (
3437 SELECT bid_number
3438 FROM pon_bid_headers
3439 WHERE auction_header_id = p_auction_header_id
3440 AND bid_status = 'ACTIVE'
3441 );
3442 --reset notes for all the bids
3443 UPDATE pon_bid_headers
3444 SET po_agreed_amount = NULL,
3445 last_update_date = SYSDATE,
3446 last_updated_by = p_auctioneer_id
3447 WHERE bid_number IN (
3448 SELECT bid_number
3449 FROM pon_bid_headers
3450 WHERE auction_header_id = p_auction_header_id
3451 AND bid_status = 'ACTIVE'
3452 );
3453 END clear_awards_recommendation;
3454
3455 --
3456 --
3457 ----------------------------------------------------------------
3458 -- handles accepting an AutoAward Scenario
3459 ----------------------------------------------------------------
3460 --
3461 PROCEDURE accept_award_scenario
3462 (
3463 p_scenario_id IN NUMBER,
3464 p_auctioneer_id IN NUMBER,
3465 p_last_update_date IN DATE,
3466 x_status OUT NOCOPY VARCHAR2
3467 )
3468 IS
3469
3470 l_auction_header_id NUMBER;
3471 l_mode VARCHAR2(50);
3472 l_batch_id NUMBER;
3473 l_num_of_non_shortlisted_supp NUMBER;
3474 BEGIN
3475
3476 -- retrieve auction header id and batch id
3477 BEGIN
3478 SELECT COUNT(DISTINCT pbh.bid_number)
3479 INTO l_num_of_non_shortlisted_supp
3480 FROM pon_optimize_results por, pon_bid_headers pbh
3481 WHERE por.bid_number = pbh.bid_number
3482 AND pbh.shortlist_flag = 'N'
3483 AND por.scenario_id = p_scenario_id;
3484
3485 IF (l_num_of_non_shortlisted_supp > 0) THEN
3486 x_status := 'NOT_SHORTLISTED';
3487 RETURN;
3488 END IF;
3489
3490 SELECT auction_header_id, pon_auction_summary_s.NEXTVAL
3491 INTO l_auction_header_id, l_batch_id
3492 FROM pon_optimize_scenarios
3493 WHERE scenario_id = p_scenario_id;
3494 EXCEPTION WHEN NO_DATA_FOUND THEN
3495 x_status := 'FAILURE';
3496 RETURN;
3497 END;
3498
3499 l_mode := g_AWARD_OPTIMIZATION;
3500
3501 -- insert award results into interface table
3502 INSERT into pon_auction_summary
3503 (batch_id,
3504 auction_id,
3505 bid_number,
3506 line_number,
3507 award_quantity,
3508 award_shipment_number)
3509 SELECT
3510 l_batch_id,
3511 l_auction_header_id,
3512 por.bid_number,
3513 por.line_number,
3514 por.award_quantity,
3515 por.award_shipment_number
3516 FROM pon_optimize_results por, pon_auction_item_prices_all paip,
3517 pon_auction_headers_all pah,
3518 pon_bid_item_prices pbip
3519 WHERE pah.auction_header_id = l_auction_header_id
3520 AND pah.auction_header_id = paip.auction_header_id
3521 AND por.bid_number = pbip.bid_number
3522 AND por.line_number = pbip.line_number
3523 AND por.scenario_id = p_scenario_id
3524 AND paip.line_number = por.line_number;
3525
3526
3527 -- save the award result
3528 save_award_recommendation(l_batch_id, p_auctioneer_id, p_last_update_date, l_mode, x_status);
3529
3530 IF (x_status = 'FAILURE') THEN
3531 RETURN;
3532 END IF;
3533
3534 -- unset the accepted date of the previously accepted scenario
3535 UPDATE pon_optimize_scenarios
3536 SET accepted_date = NULL
3537 WHERE accepted_date IS NOT NULL
3538 AND auction_header_id= l_auction_header_id;
3539
3540 -- set accepted date of the accepted scenario
3541 UPDATE pon_optimize_scenarios
3542 SET accepted_date = SYSDATE,
3543 last_update_date = SYSDATE,
3544 last_updated_by = p_auctioneer_id
3545 WHERE scenario_id = p_scenario_id;
3546
3547 -- clean up inteface table
3548 DELETE FROM pon_auction_summary
3549 WHERE batch_id = l_batch_id;
3550
3551 END accept_award_scenario;
3552
3553 --
3554 --
3555 ----------------------------------------------------------------
3556 -- procedure added by snatu on 08/15/03
3557 -- handles awarding in FPJ for system recommended awards
3558 ----------------------------------------------------------------
3559 --
3560 PROCEDURE save_award_recommendation
3561 (
3562 p_batch_id IN NUMBER,
3563 p_auctioneer_id IN NUMBER,
3564 p_last_update_date IN DATE,
3565 p_mode IN VARCHAR2,
3566 x_status OUT NOCOPY VARCHAR2
3567 )
3568 IS
3569 CURSOR c_reco_awards (c_batch_id NUMBER) IS
3570 SELECT
3571 pas.auction_id,
3572 pas.line_number,
3573 pas.bid_number,
3574 decode(p_mode,
3575 g_AWARD_OPTIMIZATION, decode(ai.order_type_lookup_code, 'RATE', decode(ai.quantity, NULL, NULL, pas.award_quantity), 'QUANTITY', decode(ai.quantity, NULL, NULL, pas.award_quantity), pas.award_quantity),
3576 decode(ai.order_type_lookup_code, 'RATE', decode(ai.quantity, NULL, NULL, pas.award_quantity), 'QUANTITY', decode(ai.quantity, NULL, NULL, pas.award_quantity), pas.award_quantity))award_quantity,
3577 pas.bid_price,
3578 pas.trading_partner_id,
3579 pas.trading_partner_contact_id,
3580 pas.batch_id,
3581 ai.group_type,
3582 pas.award_shipment_number
3583 FROM pon_auction_summary pas
3584 , pon_auction_item_prices_all ai
3585 , pon_auction_headers_all ah
3586 WHERE
3587 pas.award_quantity >0
3588 AND pas.batch_id = c_batch_id
3589 AND ah.auction_header_id = pas.auction_id
3590 AND ai.auction_header_id = pas.auction_id
3591 AND ai.line_number = pas.line_number
3592 ORDER BY
3593 pas.line_number;
3594 l_reco_awards_rec c_reco_awards%ROWTYPE;
3595 --
3596 l_award_lines t_award_lines;
3597 l_matrix_index NUMBER;
3598 l_auction_header_id NUMBER;
3599 l_current_bid_number NUMBER;
3600 l_current_update_date DATE;
3601 l_award_date DATE;
3602
3603 BEGIN
3604
3605 l_current_bid_number := null;
3606 l_matrix_index := 0;
3607 l_award_date := SYSDATE;
3608 --
3609 -- Need to set award quantity and award_status and award_date
3610 OPEN c_reco_awards (p_batch_id);
3611 LOOP
3612 fetch c_reco_awards into l_reco_awards_rec;
3613 EXIT WHEN c_reco_awards%NOTFOUND;
3614 -- Get Auction Header Id only once
3615 IF (l_matrix_index = 0) THEN
3616 l_auction_header_id := l_reco_awards_rec.auction_id;
3617 END IF;
3618
3619 --DBMS_OUTPUT.PUT_LINE('l_auction_header_id' || l_auction_header_id);
3620 -- Construct Matrix for the awarded bids
3621 l_matrix_index := l_matrix_index + 1;
3622 l_award_lines(l_matrix_index).bid_number := l_reco_awards_rec.bid_number;
3623 l_award_lines(l_matrix_index).line_number := l_reco_awards_rec.line_number;
3624 l_award_lines(l_matrix_index).award_status := 'AWARDED';
3625 l_award_lines(l_matrix_index).award_quantity := l_reco_awards_rec.award_quantity;
3626 l_award_lines(l_matrix_index).award_date := l_award_date;
3627 l_award_lines(l_matrix_index).group_type := l_reco_awards_rec.group_type;
3628 l_award_lines(l_matrix_index).award_shipment_number := l_reco_awards_rec.award_shipment_number;
3629 END LOOP;
3630
3631 clear_awards_recommendation (l_auction_header_id, l_award_date, p_auctioneer_id);
3632 update_bid_item_prices(l_auction_header_id,l_award_lines,p_auctioneer_id, p_mode);
3633 /* FPK: CPA p_neg_has_lines parameter hardcoded to 'Y' as save_award_recommendation
3634 procedure will only be called if negotiation has lines */
3635 update_bid_headers(l_auction_header_id, p_auctioneer_id, t_emptytbl, 'Y');
3636 update_auction_item_prices(l_auction_header_id,null, l_award_date, p_auctioneer_id, p_mode);
3637 /* FPK: CPA p_neg_has_lines parameter hardcoded to 'Y' as save_award_recommendation
3638 procedure will only be called if negotiation has lines */
3639 update_auction_headers(l_auction_header_id, p_mode, l_award_date, p_auctioneer_id, 'Y');
3640
3641 bulk_update_pon_acceptances(
3642 l_auction_header_id,
3643 null, null, null,
3644 l_award_date, p_auctioneer_id, p_mode);
3645 --
3646 /* check if the auction has been modified by some other user
3647 If it has been modified, status returns failure
3648 else this is the only user modifying hte auction
3649 changes are committed to the database in the middle tier
3650 */
3651 IF (is_auction_not_updated (l_auction_header_id, p_last_update_date)) THEN
3652 x_status := 'SUCCESS';
3653 -- update the last update date
3654 UPDATE PON_Auction_HEADERS_all
3655 SET last_update_date = SYSDATE
3656 WHERE auction_header_id = l_auction_header_id;
3657 --
3658 ELSE
3659 x_status := 'FAILURE';
3660 END IF;
3661 --
3662 END save_award_recommendation;
3663
3664
3665 --
3666 --
3667 ----------------------------------------------------------------
3668 -- handles copying of a scenario
3669 ----------------------------------------------------------------
3670
3671 PROCEDURE copy_award_scenario
3672 (
3673 p_scenario_id IN NUMBER,
3674 p_user_id IN NUMBER,
3675 p_cost_scenario_flag IN VARCHAR2,
3676 x_cost_scenario_id OUT NOCOPY NUMBER,
3677 x_status OUT NOCOPY VARCHAR2
3678 )
3679 IS
3680
3681 l_fnd_user_id NUMBER;
3682 l_next_scenario_number NUMBER;
3683 l_num_constraints NUMBER;
3684 l_num_bid_classes NUMBER;
3685 l_auction_header_id NUMBER;
3686 l_dummy_scenario_number NUMBER;
3687 l_new_scenario_id NUMBER;
3688
3689 BEGIN
3690
3691 -- Derive fnd_user_id from tp_id
3692 -- This will not fail if more than one user setup w/ same buyer.
3693 -- But, this will reurn any of the matched user id in such cases
3694 BEGIN
3695 SELECT USER_ID
3696 INTO l_fnd_user_id
3697 FROM FND_USER
3698 WHERE PERSON_PARTY_ID = p_user_id
3699 AND NVL(END_DATE,SYSDATE+1) > SYSDATE;
3700 EXCEPTION
3701 WHEN TOO_MANY_ROWS THEN
3702 IF (NVL(FND_PROFILE.VALUE('AFLOG_ENABLED'),'N') = 'Y') THEN
3703 IF (FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level) THEN
3704 FND_LOG.string(log_level => FND_LOG.level_unexpected,
3705 module => 'pon.plsql.pon_award_pkg.copy_award_scenario',
3706 message => 'Multiple Users found for person_party_id:'||p_user_id);
3707 END IF;
3708 END IF;
3709
3710 SELECT USER_ID
3711 INTO l_fnd_user_id
3712 FROM FND_USER
3713 WHERE PERSON_PARTY_ID = p_user_id
3714 AND NVL(END_DATE,SYSDATE+1) > SYSDATE
3715 AND ROWNUM = 1;
3716 END;
3717
3718 -- derive auction_header_id
3719 select auction_header_id into l_auction_header_id
3720 from pon_optimize_scenarios
3721 where scenario_id = p_scenario_id;
3722
3723 -- store the next scenario id in a local variable
3724 select pon_optimize_scenarios_s.nextval
3725 into l_new_scenario_id from dual;
3726
3727 IF(p_cost_scenario_flag = 'Y') THEN
3728
3729 -- we donot display this number any place
3730 -- all we want is to have a unique combination
3731 l_next_scenario_number := l_new_scenario_id;
3732
3733 ELSE
3734 select max(scenario_number) + 1
3735 into l_next_scenario_number
3736 from pon_optimize_scenarios
3737 where auction_header_id = l_auction_header_id
3738 and (cost_scenario_flag is null or cost_scenario_flag <> 'Y');
3739
3740 END IF;
3741
3742 --first copy the scenario
3743 INSERT INTO PON_OPTIMIZE_SCENARIOS(
3744 auction_header_id,
3745 scenario_id,
3746 scenario_name,
3747 scenario_number,
3748 objective_code,
3749 status,
3750 price_type,
3751 internal_note,
3752 updated_tp_contact_id,
3753 last_tp_update_date,
3754 creation_date,
3755 created_by,
3756 last_update_date,
3757 last_updated_by,
3758 last_update_login,
3759 cost_scenario_flag,
3760 parent_scenario_id,
3761 constraint_priority_type)
3762 SELECT auction_header_id,
3763 l_new_scenario_id,
3764 scenario_name,
3765 l_next_scenario_number,
3766 objective_code,
3767 'NOT_RUN',
3768 price_type,
3769 internal_note,
3770 p_user_id,
3771 sysdate,
3772 sysdate,
3773 l_fnd_user_id,
3774 sysdate,
3775 l_fnd_user_id,
3776 l_fnd_user_id,
3777 p_cost_scenario_flag,
3778 decode(p_cost_scenario_flag, 'Y', p_scenario_id, to_number(null)),
3779 nvl(constraint_priority_type, 'MANDATORY')
3780 FROM pon_optimize_scenarios
3781 WHERE scenario_id = p_scenario_id;
3782
3783 -- copy the constraints
3784
3785 -- make sure there is at least 1 row to prevent no data found exception
3786 select count(*) into l_num_constraints
3787 from pon_optimize_constraints
3788 where scenario_id = p_scenario_id;
3789
3790 IF (l_num_constraints > 0) THEN
3791
3792 INSERT INTO PON_OPTIMIZE_CONSTRAINTS(
3793 scenario_id,
3794 sequence_number,
3795 auction_header_id,
3796 constraint_type,
3797 line_number,
3798 min_amount,
3799 max_amount,
3800 amount_type,
3801 min_quantity,
3802 max_quantity,
3803 quantity_cutoff,
3804 price_cutoff,
3805 split_award_flag,
3806 integral_qty_award_flag,
3807 excluded_flag,
3808 from_date,
3809 to_date,
3810 min_score,
3811 supp_classification,
3812 attr_sequence_number,
3813 attr_group_name,
3814 trading_partner_id,
3815 trading_partner_contact_id,
3816 vendor_site_id,
3817 creation_date,
3818 created_by,
3819 last_update_date,
3820 last_updated_by,
3821 last_update_login,
3822 MIN_MAX_AMOUNT_PRIORITY
3823 ,MIN_MAX_AMOUNT_COST
3824 ,MIN_MAX_AMOUNT_INFEAS_FLAG
3825 ,MIN_MAX_QUANTITY_PRIORITY
3826 ,MIN_MAX_QUANTITY_COST
3827 ,MIN_MAX_QUANTITY_INFEAS_FLAG
3828 ,QUANTITY_CUTOFF_PRIORITY
3829 ,QUANTITY_CUTOFF_COST
3830 ,QUANTITY_CUTOFF_INFEAS_FLAG
3831 ,PRICE_CUTOFF_PRIORITY
3832 ,PRICE_CUTOFF_COST
3833 ,PRICE_CUTOFF_INFEAS_FLAG
3834 ,SPLIT_AWARD_PRIORITY
3835 ,SPLIT_AWARD_INFEAS_FLAG
3836 ,SPLIT_AWARD_COST
3837 ,INTEGRAL_QTY_AWARD_PRIORITY
3838 ,INTEGRAL_QTY_AWARD_INFEAS_FLAG
3839 ,INTEGRAL_QTY_AWARD_COST
3840 ,EXCLUDED_SUPPLIER_PRIORITY
3841 ,EXCLUDED_SUPPLIER_INFEAS_FLAG
3842 ,EXCLUDED_SUPPLIER_COST
3843 ,PROMISED_DATE_PRIORITY
3844 ,PROMISED_DATE_COST
3845 ,PROMISED_DATE_INFEAS_FLAG
3846 ,MIN_SCORE_PRIORITY
3847 ,MIN_SCORE_COST
3848 ,MIN_SCORE_INFEAS_FLAG)
3849 SELECT l_new_scenario_id,
3850 sequence_number,
3851 auction_header_id,
3852 constraint_type,
3853 line_number,
3854 min_amount,
3855 max_amount,
3856 amount_type,
3857 min_quantity,
3858 max_quantity,
3859 quantity_cutoff,
3860 price_cutoff,
3861 split_award_flag,
3862 integral_qty_award_flag,
3863 excluded_flag,
3864 from_date,
3865 to_date,
3866 min_score,
3867 supp_classification,
3868 attr_sequence_number,
3869 attr_group_name,
3870 trading_partner_id,
3871 trading_partner_contact_id,
3872 vendor_site_id,
3873 sysdate,
3874 l_fnd_user_id,
3875 sysdate,
3876 l_fnd_user_id,
3877 l_fnd_user_id,
3878 MIN_MAX_AMOUNT_PRIORITY
3879 ,TO_NUMBER(NULL)
3880 ,TO_CHAR(NULL)
3881 ,MIN_MAX_QUANTITY_PRIORITY
3882 ,TO_NUMBER(NULL)
3883 ,TO_CHAR(NULL)
3884 ,QUANTITY_CUTOFF_PRIORITY
3885 ,TO_NUMBER(NULL)
3886 ,TO_CHAR(NULL)
3887 ,PRICE_CUTOFF_PRIORITY
3888 ,TO_NUMBER(NULL)
3889 ,TO_CHAR(NULL)
3890 ,SPLIT_AWARD_PRIORITY
3891 ,TO_NUMBER(NULL)
3892 ,TO_CHAR(NULL)
3893 ,INTEGRAL_QTY_AWARD_PRIORITY
3894 ,TO_NUMBER(NULL)
3895 ,TO_CHAR(NULL)
3896 ,EXCLUDED_SUPPLIER_PRIORITY
3897 ,TO_NUMBER(NULL)
3898 ,TO_CHAR(NULL)
3899 ,PROMISED_DATE_PRIORITY
3900 ,TO_NUMBER(NULL)
3901 ,TO_CHAR(NULL)
3902 ,MIN_SCORE_PRIORITY
3903 ,TO_NUMBER(NULL)
3904 ,TO_CHAR(NULL)
3905 FROM pon_optimize_constraints
3906 WHERE scenario_id = p_scenario_id;
3907
3908 END IF;
3909
3910 -- copy the bid class information
3911 -- make sure a row exists first to prevent no data found exception
3912 select count(*) into l_num_bid_classes
3913 from pon_optimize_bid_class
3914 where scenario_id = p_scenario_id;
3915
3916 IF (l_num_bid_classes > 0) THEN
3917 INSERT INTO PON_OPTIMIZE_BID_CLASS(
3918 scenario_id,
3919 sequence_number,
3920 bid_number,
3921 creation_date,
3922 created_by,
3923 last_update_date,
3924 last_updated_by,
3925 last_update_login
3926 )
3927 SELECT l_new_scenario_id,
3928 sequence_number,
3929 bid_number,
3930 sysdate,
3931 l_fnd_user_id,
3932 sysdate,
3933 l_fnd_user_id,
3934 l_fnd_user_id
3935 FROM pon_optimize_bid_class
3936 WHERE scenario_id = p_scenario_id;
3937 END IF;
3938
3939 x_status := 'SUCCESS';
3940
3941 IF (p_cost_scenario_flag = 'Y') THEN
3942
3943 -- populate this value only when we are
3944 -- copying a scenario to do cost of constriant
3945 -- calculation
3946
3947 x_cost_scenario_id := l_new_scenario_id;
3948 ELSE
3949
3950 -- else, set it to some dummy value
3951
3952 x_cost_scenario_id := -9999;
3953
3954 END IF;
3955
3956
3957 EXCEPTION
3958 when others then
3959 x_status := 'FAILURE';
3960 raise;
3961 END copy_award_scenario;
3962
3963
3964
3965 PROCEDURE batch_award_spreadsheet
3966 (
3967 p_auction_header_id IN NUMBER,
3968 p_mode IN VARCHAR2,
3969 p_auctioneer_id IN NUMBER,
3970 p_last_update_date IN DATE,
3971 x_status OUT NOCOPY VARCHAR2
3972 )
3973 IS
3974
3975 l_award_date DATE;
3976
3977 BEGIN
3978 l_award_date := SYSDATE;
3979
3980 update_auction_headers(p_auction_header_id, p_mode, l_award_date, p_auctioneer_id, 'Y');
3981 --
3982 /* check if the auction has been modified by some other user
3983 If it has been modified, status returns failure
3984 else this is the only user modifying the auction
3985 */
3986
3987 IF (is_auction_not_updated (p_auction_header_id, p_last_update_date)) THEN
3988 x_status := 'SUCCESS';
3989 -- update the last update date
3990 UPDATE pon_Auction_headers_all
3991 SET last_update_date = SYSDATE
3992 WHERE auction_header_id = p_auction_header_id;
3993 --
3994 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3995 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.BATCH_AWARD_SPREADSHEET.AUCTION_ID:'
3996 || p_auction_header_id,'SUCCEEDED.');
3997 END IF;
3998 --
3999 ELSE
4000 x_status := 'FAILURE';
4001 --
4002 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4003 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.BATCH_AWARD_SPREADSHEET.AUCTION_ID:'
4004 || p_auction_header_id,'FAILED.');
4005 END IF;
4006 --
4007 END IF;
4008
4009
4010 END BATCH_AWARD_SPREADSHEET;
4011 --
4012 --
4013 ----------------------------------------------------------------
4014 -- procedure added by snatu on 08/15/03
4015 -- handles awarding in FPJ for awarding through spreadsheet
4016 ----------------------------------------------------------------
4017 --
4018 --
4019 PROCEDURE save_award_spreadsheet
4020 (
4021 p_batch_id IN NUMBER,
4022 p_auction_header_id IN NUMBER,
4023 p_mode IN VARCHAR2,
4024 p_auctioneer_id IN NUMBER,
4025 p_last_update_date IN DATE,
4026 p_batch_enabled IN VARCHAR2,
4027 p_is_xml_upload IN VARCHAR2,
4028 x_status OUT NOCOPY VARCHAR2
4029 )
4030 IS
4031 CURSOR c_spsheet_awards (c_batch_id NUMBER, c_auction_header_id NUMBER, c_is_xml_upload VARCHAR2) IS
4032 --Query retrives rows ordered in way exported in spreadhsheet
4033 SELECT
4034 aii.auction_header_id,
4035 aii.auction_line_number,
4036 aii.bid_number,
4037 DECODE (nvl(aii.award_status,'N'),'N',null,
4038 DECODE (ai.ORDER_TYPE_LOOKUP_CODE,
4039 'QUANTITY', aii.award_quantity,
4040 'RATE' , decode (ai.purchase_basis , 'TEMP LABOR' , aii.award_quantity ,1) ,
4041 1) )award_quantity,
4042 decode (nvl(aii.award_status,'N'),'Y', g_AWARD_OUTCOME_WIN,
4043 g_AWARD_OUTCOME_LOSE) award_outcome,
4044 aii.awardreject_reason,
4045 ai.group_type,
4046 aii.award_shipment_number
4047 FROM pon_award_items_interface aii,
4048 pon_auction_item_prices_all ai,
4049 pon_bid_item_prices bi,
4050 pon_auction_headers_all pah
4051 WHERE
4052 aii.batch_id = c_batch_id
4053 AND aii.auction_header_id = c_auction_header_id
4054 AND aii.auction_header_id = ai.auction_header_id
4055 AND aii.AUCTION_LINE_NUMBER = ai.LINE_NUMBER
4056 AND bi.bid_number = aii.bid_number
4057 AND bi.line_number = aii.AUCTION_LINE_NUMBER
4058 AND pah.auction_header_id = aii.auction_header_id
4059 ORDER BY
4060 ai.disp_line_number asc,
4061 decode(c_is_xml_upload, 'Y', decode(pah.bid_ranking, 'MULTI_ATTRIBUTE_SCORING', decode(nvl(bi.PRICE,0), 0, 0, nvl(bi.TOTAL_WEIGHTED_SCORE,0)/bi.PRICE), decode(bi.PRICE,0,0, 1/bi.PRICE)), decode(bi.PRICE, 0, 0, 1/bi.PRICE)) desc, bi.PUBLISH_DATE asc;
4062 l_spsheet_awards_rec c_spsheet_awards%ROWTYPE;
4063 --
4064 l_award_lines t_award_lines;
4065 l_matrix_index NUMBER;
4066 l_size NUMBER;
4067 l_current_bid_number NUMBER;
4068 l_current_update_date DATE;
4069 l_award_date DATE;
4070 l_curr_line_num NUMBER;
4071 --
4072 TYPE BID_LIST_TYPE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
4073 l_bid_list BID_LIST_TYPE;
4074 TYPE ITEM_LIST_TYPE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
4075 l_item_list ITEM_LIST_TYPE;
4076 TYPE ACCEPT_LIST_TYPE IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
4077 l_accept_list ACCEPT_LIST_TYPE;
4078 TYPE REJECT_LIST_TYPE IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
4079 l_reject_list REJECT_LIST_TYPE;
4080 --
4081 BEGIN
4082
4083 l_matrix_index := 0;
4084 l_award_date := SYSDATE;
4085 l_curr_line_num := NULL;
4086 --
4087
4088 -- Get distinct lines awarded/rejected
4089 SELECT DISTINCT auction_line_number BULK COLLECT INTO l_item_list
4090 FROM pon_award_items_interface
4091 WHERE batch_id = p_batch_id
4092 AND auction_header_id = p_auction_header_id;
4093
4094 -- Get distinct bids awarded/rejected
4095 SELECT DISTINCT bid_number BULK COLLECT INTO l_bid_list
4096 FROM pon_award_items_interface
4097 WHERE batch_id = p_batch_id
4098 AND auction_header_id = p_auction_header_id;
4099 --
4100 -- Need to set award quantity and award_status and award_date
4101
4102 OPEN c_spsheet_awards (p_batch_id, p_auction_header_id, p_is_xml_upload);
4103
4104 LOOP --{
4105 fetch c_spsheet_awards into l_spsheet_awards_rec;
4106 EXIT WHEN c_spsheet_awards%NOTFOUND;
4107 -- Construct Matrix in any case (WIN/LOSR)
4108 l_matrix_index := l_matrix_index +1;
4109 l_award_lines(l_matrix_index).bid_number := l_spsheet_awards_rec.bid_number;
4110 l_award_lines(l_matrix_index).line_number := l_spsheet_awards_rec.auction_line_number;
4111 l_award_lines(l_matrix_index).award_status := get_award_status(l_spsheet_awards_rec.award_outcome);
4112 l_award_lines(l_matrix_index).award_date := l_award_date;
4113 l_award_lines(l_matrix_index).award_quantity := l_spsheet_awards_rec.award_quantity;
4114 l_award_lines(l_matrix_index).group_type := l_spsheet_awards_rec.group_type;
4115 l_award_lines(l_matrix_index).award_shipment_number := l_spsheet_awards_rec.award_shipment_number;
4116
4117 -- Update notes per line for awarded / rejected suppleirs
4118 IF (l_curr_line_num IS NULL ) THEN
4119 l_curr_line_num := l_spsheet_awards_rec.auction_line_number;
4120 l_accept_list(l_curr_line_num) := NULL;
4121 l_reject_list(l_curr_line_num) := NULL;
4122 END IF;
4123 IF (l_curr_line_num <> l_spsheet_awards_rec.auction_line_number ) THEN
4124 -- new line ; update curr line
4125 l_curr_line_num := l_spsheet_awards_rec.auction_line_number;
4126 l_accept_list(l_curr_line_num) := NULL;
4127 l_reject_list(l_curr_line_num) := NULL;
4128 END IF ;
4129 --
4130 IF (l_accept_list(l_curr_line_num) IS NULL
4131 AND l_award_lines(l_matrix_index).award_status = 'AWARDED') THEN
4132 l_accept_list(l_curr_line_num) := l_spsheet_awards_rec.awardreject_reason;
4133 END IF ;
4134 --
4135 IF (l_reject_list(l_curr_line_num) IS NULL
4136 AND l_award_lines(l_matrix_index).award_status = 'REJECTED') THEN
4137 l_reject_list(l_curr_line_num) := l_spsheet_awards_rec.awardreject_reason;
4138 END IF ;
4139 --
4140 END LOOP;
4141
4142 --}
4143
4144 --
4145 -- this procedure updates all the bid lines one-by-one
4146
4147 update_bid_item_prices(p_auction_header_id,l_award_lines,p_auctioneer_id, p_mode);
4148
4149 l_size := l_bid_list.count;
4150
4151 FOR l_index IN 1..l_size LOOP
4152
4153 -- this procedure updates the award_status
4154 -- for all the bids at the bid-header level
4155 -- we don't need to invoke this over here -> this should be invoked after all
4156 -- batches are exhausted
4157
4158 update_single_bid_header(l_bid_list(l_index),p_auctioneer_id);
4159
4160 END LOOP;
4161
4162 l_size := l_item_list.count;
4163
4164 FOR l_index IN 1..l_size LOOP
4165
4166 update_auction_item_prices(p_auction_header_id, l_item_list(l_index), l_award_date, p_auctioneer_id, p_mode);
4167
4168 -- update acceptances per auction line
4169 bulk_update_pon_acceptances (
4170 p_auction_header_id, l_item_list(l_index),
4171 l_accept_list(l_item_list(l_index)), l_reject_list(l_item_list(l_index)),
4172 l_award_date, p_auctioneer_id, p_mode);
4173
4174 END LOOP;
4175
4176 /* FPK: CPA p_neg_has_lines parameter hardcoded to 'Y' as save_award_spreadsheet
4177 procedure will only be called if negotiation has lines */
4178
4179 -- this procedure loops over all the lines to determine the auction-header-level
4180 -- award-status etc.
4181
4182 if(p_batch_enabled = 'N') then --{
4183
4184 update_auction_headers(p_auction_header_id, p_mode, l_award_date, p_auctioneer_id, 'Y');
4185 --
4186 /* check if the auction has been modified by some other user
4187 If it has been modified, status returns failure
4188 else this is the only user modifying the auction
4189 */
4190
4191 IF (is_auction_not_updated (p_auction_header_id, p_last_update_date)) THEN
4192 x_status := 'SUCCESS';
4193 -- update the last update date
4194 UPDATE pon_Auction_headers_all
4195 SET last_update_date = SYSDATE
4196 WHERE auction_header_id = p_auction_header_id;
4197 --
4198 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4199 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.SAVE_AWARD_SPREADSHEET.AUCTION_ID:'
4200 || p_auction_header_id,'SUCCEEDED.');
4201 END IF;
4202 --
4203 ELSE
4204 x_status := 'FAILURE';
4205 --
4206 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4207 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.SAVE_AWARD_SPREADSHEET.AUCTION_ID:'
4208 || p_auction_header_id,'FAILED.');
4209 END IF;
4210 --
4211 END IF;
4212
4213 else
4214
4215 -- delete interface data
4216 delete from pon_award_items_interface
4217 where batch_id = p_batch_id;
4218
4219 x_status := 'SUCCESS';
4220
4221 end if; --}
4222
4223 --
4224 END save_award_spreadsheet;
4225 --
4226 --
4227 FUNCTION is_auction_not_updated (
4228 p_auction_header_id NUMBER,
4229 p_last_update_date DATE
4230 ) RETURN BOOLEAN
4231 IS
4232 l_current_update_date DATE;
4233 BEGIN
4234 SELECT last_update_date INTO l_current_update_date
4235 FROM pon_auction_headers_all
4236 WHERE auction_header_id = p_auction_header_id;
4237 IF (l_current_update_date = p_last_update_date) THEN
4238 RETURN TRUE;
4239 ELSE
4240 RETURN FALSE;
4241 END IF;
4242 END is_auction_not_updated;
4243 --
4244 PROCEDURE toggle_shortlisting
4245 ( p_user_id IN NUMBER
4246 , p_bid_number IN NUMBER
4247 , p_event IN VARCHAR2
4248 )
4249 IS
4250
4251 l_person_id NUMBER;
4252
4253 BEGIN
4254 -- This will never fail even if more than one user setup w/ same buyer
4255 -- as always there will be one record for an user_id in fnd_user
4256 SELECT PERSON_PARTY_ID INTO l_person_id
4257 FROM FND_USER
4258 WHERE user_id = p_user_id;
4259
4260 IF (p_event = 'NOT_SHORTLIST') THEN
4261 UPDATE PON_BID_HEADERS
4262 SET SHORTLIST_FLAG = 'N'
4263 , LAST_UPDATE_DATE = SYSDATE
4264 , LAST_UPDATED_BY = p_user_id
4265 , SHORTLIST_TPC_ID = l_person_id
4266 WHERE BID_NUMBER = p_bid_number;
4267 ELSIF (p_event = 'SHORTLIST') THEN
4268 UPDATE PON_BID_HEADERS
4269 SET SHORTLIST_FLAG = 'Y'
4270 , LAST_UPDATE_DATE = SYSDATE
4271 , LAST_UPDATED_BY = p_user_id
4272 , SHORTLIST_TPC_ID = l_person_id
4273 WHERE BID_NUMBER = p_bid_number;
4274 END IF;
4275
4276 EXCEPTION
4277 when others then
4278 raise;
4279
4280 END toggle_shortlisting;
4281
4282
4283 -- Returns the award amount for a negotiation.
4284 FUNCTION get_award_amount(p_auction_header_id IN NUMBER) RETURN NUMBER IS
4285 l_award_amount NUMBER;
4286 BEGIN
4287
4288 BEGIN
4289 SELECT SUM(DECODE(ah.contract_type, 'STANDARD', bh.total_award_amount, bh.po_agreed_amount * (1/nvl(bh.rate, 1))))
4290 INTO l_award_amount
4291 FROM
4292 pon_auction_headers_all ah,
4293 pon_bid_headers bh
4294 WHERE
4295 ah.auction_header_id = p_auction_header_id
4296 AND ah.auction_header_id = bh.auction_header_id
4297 AND bh.award_status in ('AWARDED', 'PARTIAL');
4298 EXCEPTION
4299 WHEN no_data_found THEN
4300 NULL;
4301 END;
4302
4303 RETURN l_award_amount;
4304
4305 END get_award_amount;
4306 --
4307 --
4308 PROCEDURE award_bi_subline (
4309 p_auction_header_id IN pon_bid_headers.auction_header_id%TYPE,
4310 p_bid_number IN pon_bid_headers.bid_number%TYPE,
4311 p_parent_line_number IN pon_bid_item_prices.line_number%TYPE,
4312 p_award_status IN pon_bid_item_prices.award_status%TYPE,
4313 p_award_date IN pon_bid_item_prices.award_date%TYPE,
4314 p_auctioneer_id pon_bid_item_prices.LAST_UPDATED_BY%TYPE)
4315 IS
4316 CURSOR c_sublines (c_auction_header_id pon_bid_headers.auction_header_id%TYPE,
4317 c_bid_number pon_bid_headers.bid_number%TYPE,
4318 c_parent_line_number pon_bid_item_prices.line_number%TYPE) IS
4319 --Query retrives sublines for the given parent line
4320 SELECT
4321 bi.line_number,
4322 DECODE (p_award_status, 'AWARDED',decode (aii.group_type,
4323 'LOT_LINE', null, decode (aii.order_type_lookup_code,
4324 'FIXED PRICE', 1,
4325 'AMOUNT', 1,
4326 'RATE', decode (aii.purchase_basis, 'TEMP LABOR', bi.quantity, 1), bi.quantity )), null) award_quantity
4327 FROM pon_bid_item_prices bi, pon_auction_item_prices_all aii
4328 WHERE
4329 bi.bid_number = c_bid_number
4330 AND bi.line_number IN (SELECT ai.line_number
4331 FROM pon_auction_item_prices_all ai
4332 WHERE ai.parent_line_number = c_parent_line_number
4333 AND ai.auction_header_id = bi.auction_header_id )
4334 AND aii.auction_header_id = bi.auction_header_id
4335 AND aii.line_number = bi.line_number
4336 AND Nvl(aii.award_status, 'NO') <> 'COMPLETED';
4337
4338 l_sublines_rec c_sublines%ROWTYPE;
4339
4340 BEGIN
4341 OPEN c_sublines (p_auction_header_id, p_bid_number, p_parent_line_number);
4342 LOOP
4343 FETCH c_sublines INTO l_sublines_rec;
4344 EXIT WHEN c_sublines%NOTFOUND;
4345 -- update the child lines
4346 update_single_bid_item_prices
4347 (
4348 p_bid_number,
4349 l_sublines_rec.line_number,
4350 p_award_status,
4351 l_sublines_rec.award_quantity,
4352 p_award_date,
4353 p_auctioneer_id
4354 );
4355 END LOOP;
4356 END award_bi_subline;
4357 --
4358 --
4359 ----------------------------------------------------------------
4360 -- gets the parent line
4361 --and sets the award status of parent line by querying up the child lines
4362 ----------------------------------------------------------------
4363 PROCEDURE update_bi_group_award (
4364 p_auction_header_id IN pon_bid_headers.auction_header_id%TYPE,
4365 p_bid_number IN pon_bid_headers.bid_number%TYPE,
4366 p_parent_line_number IN pon_auction_item_prices_all.parent_line_number%TYPE,
4367 p_award_date IN pon_bid_item_prices.award_date%TYPE,
4368 p_auctioneer_id IN pon_bid_item_prices.last_updated_by%TYPE )
4369 IS
4370 l_total_lines NUMBER;
4371 l_awarded_lines NUMBER;
4372 l_rejected_lines NUMBER;
4373 l_award_status pon_bid_item_prices.award_status%TYPE;
4374 BEGIN
4375 --get total, awarded/ rejected lines
4376 --
4377 SELECT count (*) ,
4378 sum(decode(bi.award_status,'AWARDED',1,0)) ,
4379 sum(decode(bi.award_status,'REJECTED',1,0))
4380 INTO l_total_lines,
4381 l_awarded_lines,
4382 l_rejected_lines
4383 FROM pon_auction_item_prices_all ai, pon_bid_item_prices bi
4384 WHERE ai.parent_line_number = p_parent_line_number
4385 AND ai.auction_header_id = p_auction_header_id
4386 and ai.auction_header_id = bi.auction_header_id(+)
4387 and bi.bid_number = p_bid_number
4388 and bi.line_number = ai.line_number;
4389
4390 IF (l_total_lines = l_awarded_lines) THEN
4391 l_award_status := 'AWARDED' ;
4392 ELSIF (l_awarded_lines > 0) THEN
4393 l_award_status := 'PARTIAL';
4394 ELSIF (l_total_lines = l_rejected_lines) THEN
4395 l_award_status := 'REJECTED';
4396 ELSE
4397 l_award_status := null;
4398 END IF;
4399 --
4400 update_single_bid_item_prices
4401 (
4402 p_bid_number,
4403 p_parent_line_number,
4404 l_award_status,
4405 null,
4406 p_award_date,
4407 p_auctioneer_id
4408 );
4409
4410 END update_bi_group_award;
4411 --
4412 --
4413 PROCEDURE update_ai_group_award (
4414 p_auction_header_id IN pon_bid_headers.auction_header_id%TYPE,
4415 p_line_number IN pon_bid_item_prices.line_number%TYPE,
4416 p_award_date IN pon_bid_item_prices.award_date%TYPE,
4417 p_auctioneer_id IN pon_bid_item_prices.last_updated_by%TYPE)
4418 IS
4419 l_total_lines NUMBER;
4420 l_awarded_lines NUMBER;
4421 l_parent_line_number NUMBER;
4422 l_award_status pon_auction_item_prices_all.award_status%TYPE;
4423 BEGIN
4424 --get total and awarded lines
4425 SELECT parent_line_number INTO l_parent_line_number FROM pon_auction_item_prices_all
4426 WHERE auction_header_id = p_auction_header_id AND line_number = p_line_number;
4427 --
4428 -- all the group lines have bids if a single group line has a bid
4429 -- hence all group lines are awardable and hence considered for the count
4430 SELECT COUNT(*) INTO l_total_lines
4431 FROM pon_auction_item_prices_all ai
4432 WHERE parent_line_number = l_parent_line_number
4433 and auction_header_id = p_auction_header_id
4434 AND Nvl(award_status, 'NO') <> 'COMPLETED'; --Staggered Awards project
4435 --
4436 select COUNT(*) INTO l_awarded_lines
4437 FROM pon_auction_item_prices_all
4438 WHERE parent_line_number = l_parent_line_number
4439 AND award_status IN ('AWARDED', 'COMPLETED') --Staggered Awards project
4440 and auction_header_id = p_auction_header_id;
4441
4442 IF (l_total_lines = l_awarded_lines) THEN
4443 l_award_status := 'AWARDED' ;
4444 ELSIF (l_awarded_lines > 0) THEN
4445 l_award_status := 'PARTIAL';
4446 ELSE
4447 l_award_status := null;
4448 END IF;
4449 --
4450 UPDATE pon_auction_item_prices_all
4451 SET award_status = l_award_status,
4452 awarded_quantity = null,
4453 award_mode = null,
4454 last_update_date = p_award_date,
4455 last_updated_by = p_auctioneer_id
4456 WHERE auction_header_id = p_auction_header_id
4457 AND line_number = l_parent_line_number;
4458
4459 END update_ai_group_award;
4460 --
4461 --
4462
4463
4464 PROCEDURE get_award_totals(
4465 p_auction_header_id in number,
4466 p_award_total out nocopy number,
4467 p_current_total out nocopy number,
4468 p_savings_total out nocopy number,
4469 p_savings_percent out nocopy number)
4470 IS
4471 l_current_total_temp NUMBER;
4472 l_unsol_lines_award_total NUMBER;
4473 l_sol_lines_award_total NUMBER;
4474 BEGIN
4475
4476 p_award_total := 0;
4477 p_current_total := 0;
4478 p_savings_total := 0;
4479 p_savings_percent := 0;
4480 l_current_total_temp := 0;
4481 l_unsol_lines_award_total := 0;
4482 l_sol_lines_award_total := 0;
4483
4484 SELECT sum(nvl2(PAIP.current_price,
4485 PAIP.current_price * nvl(PAIP.awarded_quantity, 0),
4486 sum(decode(PBIP.award_status, 'AWARDED', nvl(PBIP.award_quantity, 0), 0) * nvl(PBIP.award_price, 0))))
4487 INTO p_current_total
4488 FROM pon_bid_item_prices PBIP,
4489 pon_bid_headers PBH,
4490 pon_auction_item_prices_all PAIP
4491 WHERE PAIP.auction_header_id = p_auction_header_id
4492 AND PAIP.auction_header_id = PBIP.auction_header_id (+)
4493 AND PAIP.line_number = PBIP.line_number (+)
4494 AND PBIP.bid_number = PBH.bid_number (+)
4495 AND PBH.bid_status (+) = 'ACTIVE'
4496 AND NVL(PBH.award_status, 'NONE') IN ('PARTIAL', 'AWARDED')
4497 GROUP BY
4498 PAIP.line_number, PAIP.current_price, PAIP.awarded_quantity;
4499
4500 SELECT sum(decode(PBIP.award_status, 'AWARDED', nvl(PBIP.award_quantity, 0), 0) * nvl(PBIP.award_price, 0))
4501 INTO l_sol_lines_award_total
4502 FROM pon_bid_item_prices PBIP,
4503 pon_bid_headers PBH
4504 WHERE PBH.auction_header_id = p_auction_header_id
4505 AND PBIP.bid_number = PBH.bid_number (+)
4506 AND PBH.bid_status (+) = 'ACTIVE'
4507 AND NVL(PBH.award_status, 'NONE') IN ('PARTIAL', 'AWARDED')
4508 AND PBIP.AUCTION_LINE_NUMBER <> -1;
4509
4510 --Bug 16372466 fix
4511 --Donot include unsolicited lines amount when calculating the Savings Amount and Savings Percent
4512
4513 SELECT nvl(sum(bl.award_quantity * bl.price), 0)
4514 INTO l_unsol_lines_award_total
4515 FROM pon_bid_item_prices bl
4516 WHERE bl.auction_header_id = p_auction_header_id
4517 AND bl.auction_line_number = -1
4518 AND bl.award_status = 'AWARDED';
4519
4520 p_award_total := l_sol_lines_award_total + l_unsol_lines_award_total;
4521
4522 p_savings_total := p_current_total - l_sol_lines_award_total;
4523
4524 -- safety check to avoid divide-by-zero exception
4525 IF p_current_total IS NULL OR p_current_total = 0 THEN
4526 p_savings_percent := 0;
4527 ELSE
4528 p_savings_percent := (p_savings_total / p_current_total) * 100;
4529 END IF;
4530
4531 EXCEPTION
4532
4533 WHEN OTHERS THEN
4534
4535 IF ( fnd_log.level_unexpected >= fnd_log.g_current_runtime_level) THEN
4536 fnd_log.string(log_level => fnd_log.level_unexpected
4537 ,module => 'pon_award_pkg.get_award_totals'
4538 ,message => 'exception occurred while calculating totals ' || SUBSTR(SQLERRM, 1, 200));
4539 END IF;
4540
4541
4542 NULL;
4543
4544
4545 END;
4546
4547
4548 FUNCTION does_bid_exist
4549 (
4550 p_scenario_id IN PON_OPTIMIZE_CONSTRAINTS.SCENARIO_ID%TYPE,
4551 p_sequence_number IN PON_OPTIMIZE_CONSTRAINTS.SEQUENCE_NUMBER%TYPE,
4552 p_bid_number IN PON_BID_HEADERS.BID_NUMBER%TYPE
4553 ) RETURN VARCHAR2
4554 IS
4555 l_bid_exists VARCHAR2(1);
4556 BEGIN
4557
4558 BEGIN
4559 SELECT 'Y'
4560 INTO l_bid_exists
4561 FROM dual
4562 WHERE EXISTS (SELECT 1
4563 FROM pon_optimize_bid_class pobc
4564 WHERE pobc.scenario_id = p_scenario_id
4565 AND pobc.sequence_number = p_sequence_number
4566 AND pobc.bid_number = p_bid_number);
4567
4568 EXCEPTION
4569 WHEN NO_DATA_FOUND THEN
4570 l_bid_exists := 'N';
4571 END;
4572 return l_bid_exists;
4573 END;
4574
4575 FUNCTION has_scored_attribute
4576 (
4577 p_auction_header_id IN PON_AUCTION_ATTRIBUTES.AUCTION_HEADER_ID%TYPE,
4578 p_line_number IN PON_AUCTION_ATTRIBUTES.LINE_NUMBER%TYPE
4579 ) RETURN VARCHAR2
4580 IS
4581 l_scored_attribute_exists VARCHAR2(1);
4582 BEGIN
4583
4584 BEGIN
4585 SELECT 'Y'
4586 INTO l_scored_attribute_exists
4587 FROM dual
4588 WHERE EXISTS (SELECT 1
4589 FROM pon_attribute_scores pas
4590 WHERE pas.auction_header_id = p_auction_header_id
4591 AND pas.line_number = p_line_number);
4592
4593 EXCEPTION
4594 WHEN NO_DATA_FOUND THEN
4595 l_scored_attribute_exists := 'N';
4596 END;
4597 return l_scored_attribute_exists;
4598 END;
4599
4600 PROCEDURE preprocess_cost_of_constraint
4601 (
4602 p_scenario_id IN NUMBER,
4603 p_user_id IN NUMBER,
4604 p_cost_constraint_flag IN VARCHAR2,
4605 p_constraint_type IN VARCHAR2,
4606 p_internal_type IN VARCHAR2,
4607 p_line_number IN NUMBER,
4608 p_sequence_number IN NUMBER,
4609 x_cost_scenario_id OUT NOCOPY NUMBER,
4610 x_status OUT NOCOPY VARCHAR2
4611 )
4612 IS
4613
4614 l_new_scenario_id NUMBER;
4615 l_status VARCHAR2(10);
4616 l_order_type_lookup_code PON_AUCTION_ITEM_PRICES_ALL.order_type_lookup_code%TYPE;
4617 l_auction_qty NUMBER;
4618 l_contract_type PON_AUCTION_HEADERS_ALL.contract_type%TYPE;
4619 l_module VARCHAR2(200);
4620 l_priority VARCHAR2(30);
4621 BEGIN
4622
4623 l_module := 'pon.plsql.PON_AWARD_PKG.preprocess_cost_of_constraint';
4624 l_priority := '1_CRITICAL';
4625 -- basic initialization
4626
4627 l_new_scenario_id := -9999;
4628
4629 IF (g_debug_mode = 'Y') THEN
4630 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4631 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Entering procedure with p_scenario_id: ' || p_scenario_id );
4632 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module,' p_cost_constraint_flag : '|| p_cost_constraint_flag || ' ,p_constraint_type : '|| p_constraint_type || ' ,p_internal_type : '|| p_internal_type);
4633 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module,' p_line_number : '|| p_line_number || ' ,p_sequence_number : ' || p_sequence_number );
4634 END IF;
4635 END IF;
4636
4637 copy_award_scenario(p_scenario_id => p_scenario_id,
4638 p_user_id => p_user_id,
4639 p_cost_scenario_flag => p_cost_constraint_flag,
4640 x_cost_scenario_id => l_new_scenario_id,
4641 x_status => l_status);
4642
4643
4644 IF (g_debug_mode = 'Y') THEN
4645 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4646 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'After copy_award_scenario is called. New scenario id is' || l_new_scenario_id ||' ; Status ' ||l_status);
4647 END IF;
4648 END IF;
4649
4650 IF (l_status <> 'FAILURE') THEN
4651
4652 -- these initial conditions are applicable to those
4653 -- scenarios where multiple constraints are saved on the
4654 -- same row of pon_optimize_constraints table
4655
4656 IF (p_constraint_type = 'LINE_CONST') THEN --{
4657
4658 IF (p_internal_type = 'LINE_SPLIT_AWARD') THEN
4659
4660 IF (g_debug_mode = 'Y') THEN
4661 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4662 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_SPLIT_AWARD internal type constraint');
4663 END IF;
4664 END IF;
4665
4666 UPDATE PON_OPTIMIZE_CONSTRAINTS
4667 SET SPLIT_AWARD_FLAG = decode(SPLIT_AWARD_FLAG, 'Y', 'N', 'Y'),
4668 SPLIT_AWARD_PRIORITY = NVL2(SPLIT_AWARD_PRIORITY,l_priority,null),
4669 SPLIT_AWARD_INFEAS_FLAG = TO_CHAR(NULL),
4670 SPLIT_AWARD_COST = TO_NUMBER(NULL)
4671 WHERE SCENARIO_ID = l_new_scenario_id
4672 AND SEQUENCE_NUMBER = p_sequence_number
4673 AND CONSTRAINT_TYPE = p_constraint_type;
4674
4675 ELSIF (p_internal_type = 'LINE_INTEGER_QUANTITY') THEN
4676
4677 IF (g_debug_mode = 'Y') THEN
4678 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4679 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_INTEGER_QUANTITY internal type constraint');
4680 END IF;
4681 END IF;
4682
4683 UPDATE PON_OPTIMIZE_CONSTRAINTS
4684 SET INTEGRAL_QTY_AWARD_FLAG = decode(INTEGRAL_QTY_AWARD_FLAG, 'Y', 'N', 'Y'),
4685 INTEGRAL_QTY_AWARD_PRIORITY = NVL2(INTEGRAL_QTY_AWARD_PRIORITY,l_priority,null),
4686 INTEGRAL_QTY_AWARD_INFEAS_FLAG = TO_CHAR(NULL),
4687 INTEGRAL_QTY_AWARD_COST = TO_NUMBER(NULL)
4688 WHERE SCENARIO_ID = l_new_scenario_id
4689 AND SEQUENCE_NUMBER = p_sequence_number
4690 AND CONSTRAINT_TYPE = p_constraint_type;
4691
4692
4693 ELSIF (p_internal_type = 'LINE_AWARD_QTY') THEN
4694
4695 BEGIN
4696 SELECT pah.contract_type,
4697 pai.order_type_lookup_code,
4698 nvl(pai.quantity, 1)
4699 INTO l_contract_type,
4700 l_order_type_lookup_code,
4701 l_auction_qty
4702 FROM pon_auction_headers_all pah,
4703 pon_auction_item_prices_all pai,
4704 pon_optimize_scenarios pos
4705 WHERE pah.auction_header_id = pai.auction_header_id
4706 AND pah.auction_header_id = pos.auction_header_id
4707 AND pai.line_number = p_line_number
4708 AND pos.scenario_id = l_new_scenario_id;
4709 EXCEPTION
4710 WHEN OTHERS THEN
4711 IF (g_debug_mode = 'Y') THEN
4712 IF FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4713 FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED, l_module, 'Selecting auction info in LINE_AWARD_QTY internal type constraint if condition caused error');
4714 END IF;
4715 END IF;
4716
4717 END;
4718
4719 -- We need to set Max Qty to 1 for FIXED PRICE and AMOUNT based lines for SPO, BPA and CPA
4720 -- For SPO, We need to set Max Qty to auction qty for QUANTITY based lines
4721 -- For BPA and CPA, If auction qty is null we need to set Max Qty to 1, otherwise we should set it to auction qty
4722
4723 -- In the above sql for selecting the auction qty as we use nvl to set auction qty to 1,
4724 -- all the above conditions should be satisfied
4725
4726 IF (g_debug_mode = 'Y') THEN
4727 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4728 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_AWARD_QTY internal type constraint');
4729 END IF;
4730 END IF;
4731
4732 UPDATE PON_OPTIMIZE_CONSTRAINTS
4733 SET MIN_QUANTITY = 0,
4734 MAX_QUANTITY = DECODE(l_order_type_lookup_code, 'FIXED PRICE', 1, 'AMOUNT', 1, l_auction_qty),
4735 MIN_MAX_QUANTITY_PRIORITY = NVL2(MIN_MAX_QUANTITY_PRIORITY,l_priority,null),
4736 MIN_MAX_QUANTITY_COST = TO_NUMBER(NULL),
4737 MIN_MAX_QUANTITY_INFEAS_FLAG = TO_CHAR(NULL)
4738 WHERE SCENARIO_ID = l_new_scenario_id
4739 AND SEQUENCE_NUMBER = p_sequence_number
4740 AND CONSTRAINT_TYPE = p_constraint_type;
4741
4742 ELSIF (p_internal_type = 'LINE_AWARD_AMOUNT') THEN
4743
4744 IF (g_debug_mode = 'Y') THEN
4745 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4746 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_AWARD_AMOUNT internal type constraint');
4747 END IF;
4748 END IF;
4749
4750 UPDATE PON_OPTIMIZE_CONSTRAINTS
4751 SET MIN_AMOUNT = TO_NUMBER(NULL),
4752 MAX_AMOUNT = TO_NUMBER(NULL),
4753 MIN_MAX_AMOUNT_PRIORITY = TO_CHAR(NULL),
4754 MIN_MAX_AMOUNT_COST = TO_NUMBER(NULL),
4755 MIN_MAX_AMOUNT_INFEAS_FLAG = TO_CHAR(NULL)
4756 WHERE SCENARIO_ID = l_new_scenario_id
4757 AND SEQUENCE_NUMBER = p_sequence_number
4758 AND CONSTRAINT_TYPE = p_constraint_type;
4759
4760
4761 ELSIF (p_internal_type = 'LINE_MIN_QTY') THEN
4762
4763 IF (g_debug_mode = 'Y') THEN
4764 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4765 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_MIN_QTY internal type constraint');
4766 END IF;
4767 END IF;
4768
4769 UPDATE PON_OPTIMIZE_CONSTRAINTS
4770 SET QUANTITY_CUTOFF = TO_NUMBER(NULL),
4771 QUANTITY_CUTOFF_PRIORITY = TO_CHAR(NULL),
4772 QUANTITY_CUTOFF_INFEAS_FLAG = TO_CHAR(NULL),
4773 QUANTITY_CUTOFF_COST = TO_NUMBER(NULL)
4774 WHERE SCENARIO_ID = l_new_scenario_id
4775 AND SEQUENCE_NUMBER = p_sequence_number
4776 AND CONSTRAINT_TYPE = p_constraint_type;
4777
4778
4779
4780 ELSIF (p_internal_type = 'LINE_MAX_PRICE') THEN
4781
4782 IF (g_debug_mode = 'Y') THEN
4783 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4784 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_MAX_PRICE internal type constraint');
4785 END IF;
4786 END IF;
4787
4788 UPDATE PON_OPTIMIZE_CONSTRAINTS
4789 SET PRICE_CUTOFF = TO_NUMBER(NULL),
4790 PRICE_CUTOFF_PRIORITY = TO_CHAR(NULL),
4791 PRICE_CUTOFF_INFEAS_FLAG = TO_CHAR(NULL),
4792 PRICE_CUTOFF_COST = TO_NUMBER(NULL)
4793 WHERE SCENARIO_ID = l_new_scenario_id
4794 AND SEQUENCE_NUMBER = p_sequence_number
4795 AND CONSTRAINT_TYPE = p_constraint_type;
4796
4797
4798
4799 ELSIF (p_internal_type = 'LINE_MIN_SCORE') THEN
4800
4801 IF (g_debug_mode = 'Y') THEN
4802 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4803 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_MIN_SCORE internal type constraint');
4804 END IF;
4805 END IF;
4806 -- XYZ - SIMILAR CONDITION NEEDED FOR
4807 -- AwardOptConstraint.SINGLE_HEADER_ATTR_CUTOFF
4808 -- AwardOptConstraint.GROUP_HEADER_ATTR_CUTOFF
4809
4810 UPDATE PON_OPTIMIZE_CONSTRAINTS
4811 SET MIN_SCORE = TO_NUMBER(NULL),
4812 MIN_SCORE_PRIORITY = TO_CHAR(NULL),
4813 MIN_SCORE_INFEAS_FLAG = TO_CHAR(NULL),
4814 MIN_SCORE_COST = TO_NUMBER(NULL)
4815 WHERE SCENARIO_ID = l_new_scenario_id
4816 AND SEQUENCE_NUMBER = p_sequence_number
4817 AND CONSTRAINT_TYPE = p_constraint_type;
4818
4819 ELSIF (p_internal_type = 'LINE_PROMISED_DATE') THEN
4820
4821 IF (g_debug_mode = 'Y') THEN
4822 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4823 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_PROMISED_DATE internal type constraint');
4824 END IF;
4825 END IF;
4826
4827 UPDATE PON_OPTIMIZE_CONSTRAINTS
4828 SET FROM_DATE = TO_DATE(NULL),
4829 TO_DATE = TO_DATE(NULL),
4830 PROMISED_DATE_PRIORITY = TO_CHAR(NULL),
4831 PROMISED_DATE_INFEAS_FLAG = TO_CHAR(NULL),
4832 PROMISED_DATE_COST = TO_NUMBER(NULL)
4833 WHERE SCENARIO_ID = l_new_scenario_id
4834 AND SEQUENCE_NUMBER = p_sequence_number
4835 AND CONSTRAINT_TYPE = p_constraint_type;
4836
4837 END IF;
4838
4839 --}
4840
4841 ELSIF (p_constraint_type = 'SUPP_LINE_CONST') THEN --{
4842
4843 -- two constraints
4844 -- Line Number of Suppliers : same seqnum
4845 -- Line Any One Supplier : same seqnum
4846
4847 IF (p_internal_type = 'LINE_NUM_SUPP') THEN
4848
4849 IF (g_debug_mode = 'Y') THEN
4850 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4851 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_NUM_SUPP internal type constraint');
4852 END IF;
4853 END IF;
4854
4855 UPDATE PON_OPTIMIZE_CONSTRAINTS
4856 SET MIN_QUANTITY = TO_NUMBER(NULL),
4857 MAX_QUANTITY = TO_NUMBER(NULL),
4858 MIN_MAX_QUANTITY_PRIORITY = TO_CHAR(NULL),
4859 MIN_MAX_QUANTITY_COST = TO_NUMBER(NULL),
4860 MIN_MAX_QUANTITY_INFEAS_FLAG = TO_CHAR(NULL)
4861 WHERE SCENARIO_ID = l_new_scenario_id
4862 AND SEQUENCE_NUMBER = p_sequence_number
4863 AND CONSTRAINT_TYPE = p_constraint_type;
4864
4865
4866 ELSIF (p_internal_type = 'LINE_ANY_ONE_SUPP') THEN
4867
4868 IF (g_debug_mode = 'Y') THEN
4869 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4870 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_ANY_ONE_SUPP internal type constraint');
4871 END IF;
4872 END IF;
4873
4874 UPDATE PON_OPTIMIZE_CONSTRAINTS
4875 SET MIN_AMOUNT = TO_NUMBER(NULL),
4876 MAX_AMOUNT = TO_NUMBER(NULL),
4877 MIN_MAX_AMOUNT_PRIORITY = TO_CHAR(NULL),
4878 MIN_MAX_AMOUNT_COST = TO_NUMBER(NULL),
4879 MIN_MAX_AMOUNT_INFEAS_FLAG = TO_CHAR(NULL)
4880 WHERE SCENARIO_ID = l_new_scenario_id
4881 AND SEQUENCE_NUMBER = p_sequence_number
4882 AND CONSTRAINT_TYPE = p_constraint_type;
4883
4884
4885 --ELSE
4886
4887 --DELETE FROM PON_OPTIMIZE_CONSTRAINTS
4888 --WHERE SCENARIO_ID = p_scenario_id
4889 --AND CONSTRAINT_TYPE = p_constraint_type
4890 --AND SEQUENCE_NUMBER = p_sequence_number;
4891
4892 END IF;
4893
4894 --}
4895
4896 ELSIF (p_constraint_type = 'SUPP_BIZ_CONST') THEN --{
4897
4898 IF (g_debug_mode = 'Y') THEN
4899 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4900 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating SUPP_BIZ_CONST constraint type');
4901 END IF;
4902 END IF;
4903
4904 UPDATE PON_OPTIMIZE_CONSTRAINTS
4905 SET MIN_AMOUNT = TO_NUMBER(NULL),
4906 MAX_AMOUNT = TO_NUMBER(NULL),
4907 MIN_MAX_AMOUNT_PRIORITY = TO_CHAR(NULL),
4908 MIN_MAX_AMOUNT_COST = TO_NUMBER(NULL),
4909 MIN_MAX_AMOUNT_INFEAS_FLAG = TO_CHAR(NULL)
4910 WHERE SCENARIO_ID = l_new_scenario_id
4911 AND SEQUENCE_NUMBER = p_sequence_number
4912 AND CONSTRAINT_TYPE = p_constraint_type;
4913
4914 --}
4915
4916 ELSIF (p_constraint_type = 'BID_LINE_CONST') THEN --{
4917 IF (p_internal_type = 'LINE_SUPP_SITE_AMT') THEN
4918
4919 IF (g_debug_mode = 'Y') THEN
4920 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4921 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_SUPP_SITE_AMT internal type constraint');
4922 END IF;
4923 END IF;
4924
4925 UPDATE PON_OPTIMIZE_CONSTRAINTS
4926 SET MIN_AMOUNT = TO_NUMBER(NULL),
4927 MAX_AMOUNT = TO_NUMBER(NULL),
4928 MIN_MAX_AMOUNT_PRIORITY = TO_CHAR(NULL),
4929 MIN_MAX_AMOUNT_COST = TO_NUMBER(NULL),
4930 MIN_MAX_AMOUNT_INFEAS_FLAG = TO_CHAR(NULL)
4931 WHERE SCENARIO_ID = l_new_scenario_id
4932 AND SEQUENCE_NUMBER = p_sequence_number
4933 AND CONSTRAINT_TYPE = p_constraint_type;
4934
4935 ELSIF (p_internal_type = 'LINE_SUPP_SITE_QTT') THEN
4936
4937 IF (g_debug_mode = 'Y') THEN
4938 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4939 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_SUPP_SITE_QTT internal type constraint');
4940 END IF;
4941 END IF;
4942
4943 UPDATE PON_OPTIMIZE_CONSTRAINTS
4944 SET MIN_QUANTITY = TO_NUMBER(NULL),
4945 MAX_QUANTITY = TO_NUMBER(NULL),
4946 MIN_MAX_QUANTITY_PRIORITY = TO_CHAR(NULL),
4947 MIN_MAX_QUANTITY_COST = TO_NUMBER(NULL),
4948 MIN_MAX_QUANTITY_INFEAS_FLAG = TO_CHAR(NULL)
4949 WHERE SCENARIO_ID = l_new_scenario_id
4950 AND SEQUENCE_NUMBER = p_sequence_number
4951 AND CONSTRAINT_TYPE = p_constraint_type;
4952
4953 END IF;
4954 ELSE
4955
4956 IF (g_debug_mode = 'Y') THEN
4957 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4958 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before deleting constraint from pon_optimize_constraints');
4959 END IF;
4960 END IF;
4961 -- INCLUDES LINE-LEVEL INDIVIDUAL SUPPLIER CONSTRAINTS AS WELL
4962
4963 -- if the constraint type is either of the remaining types,
4964 -- we can delete the row from pon_optimize_constraints
4965 -- using the sequence_number
4966
4967 DELETE FROM PON_OPTIMIZE_CONSTRAINTS
4968 WHERE SCENARIO_ID = l_new_scenario_id
4969 AND CONSTRAINT_TYPE = p_constraint_type
4970 AND SEQUENCE_NUMBER = p_sequence_number;
4971
4972 END IF;
4973
4974 x_cost_scenario_id := l_new_scenario_id;
4975 x_status := 'SUCCESS';
4976
4977 ELSE
4978 x_cost_scenario_id := -9999;
4979 x_status := 'FAILURE';
4980
4981
4982 END IF;
4983
4984
4985
4986 EXCEPTION
4987 WHEN OTHERS THEN
4988 x_cost_scenario_id := -9999;
4989 x_status := 'FAILURE';
4990 RAISE;
4991
4992 END;
4993
4994
4995 PROCEDURE postprocess_cost_of_constraint
4996 (
4997 p_scenario_id IN NUMBER,
4998 p_constraint_type IN VARCHAR2,
4999 p_internal_type IN VARCHAR2,
5000 p_line_number IN NUMBER,
5001 p_sequence_number IN NUMBER,
5002 x_status OUT NOCOPY VARCHAR2
5003 )
5004
5005 IS
5006 l_num_constraints NUMBER;
5007 l_num_bid_classes NUMBER;
5008 l_num_results NUMBER;
5009 l_cost_of_constraint NUMBER;
5010 l_parent_scenario_id NUMBER;
5011 l_module VARCHAR2(250);
5012 BEGIN
5013
5014 l_module := 'pon.plsql.PON_AWARD_PKG.postprocess_cost_of_constraint';
5015 IF (g_debug_mode = 'Y') THEN
5016 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5017 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Entering procedure with p_scenario_id: ' || p_scenario_id );
5018 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module,' p_constraint_type : '|| p_constraint_type || ' ,p_internal_type : '|| p_internal_type);
5019 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module,' p_line_number : '|| p_line_number || ' ,p_sequence_number : ' || p_sequence_number );
5020 END IF;
5021 END IF;
5022
5023 -- USE PARENT_SCENARIO_ID TO JOIN TO MAIN SCENARIO
5024 -- DETERMINE THE COST AS FOLLOWS -
5025
5026 SELECT (PARENT_SCENARIO.TOTAL_AWARD_AMOUNT - COST_SCENARIO.TOTAL_AWARD_AMOUNT),
5027 PARENT_SCENARIO.SCENARIO_ID
5028 INTO L_COST_OF_CONSTRAINT,
5029 L_PARENT_SCENARIO_ID
5030 FROM PON_OPTIMIZE_SCENARIOS COST_SCENARIO,
5031 PON_OPTIMIZE_SCENARIOS PARENT_SCENARIO
5032 WHERE COST_SCENARIO.SCENARIO_ID = p_scenario_id
5033 AND PARENT_SCENARIO.SCENARIO_ID = COST_SCENARIO.PARENT_SCENARIO_ID;
5034
5035 IF (g_debug_mode = 'Y') THEN
5036 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5037 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'After selecting cost: L_COST_OF_CONSTRAINT: ' || L_COST_OF_CONSTRAINT || ' , L_PARENT_SCENARIO_ID: '||L_PARENT_SCENARIO_ID );
5038 END IF;
5039 END IF;
5040
5041 -- UPDATE THE CORRESPONDING ROW IN CONSTRAINTS TABLE
5042 -- OF PARENT SCENARIO WITH THIS COST OF CONSTRAINT
5043
5044 IF (p_constraint_type = 'LINE_CONST') THEN
5045
5046 IF (p_internal_type = 'LINE_SPLIT_AWARD') THEN
5047
5048 IF (g_debug_mode = 'Y') THEN
5049 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5050 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_SPLIT_AWARD internal type constraint');
5051 END IF;
5052 END IF;
5053
5054 UPDATE PON_OPTIMIZE_CONSTRAINTS
5055 SET SPLIT_AWARD_COST = l_cost_of_constraint
5056 WHERE SCENARIO_ID = l_parent_scenario_id
5057 AND SEQUENCE_NUMBER = p_sequence_number
5058 AND CONSTRAINT_TYPE = p_constraint_type;
5059
5060 ELSIF (p_internal_type = 'LINE_INTEGER_QUANTITY') THEN
5061
5062 IF (g_debug_mode = 'Y') THEN
5063 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5064 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_INTEGER_QUANTITY internal type constraint');
5065 END IF;
5066 END IF;
5067
5068 UPDATE PON_OPTIMIZE_CONSTRAINTS
5069 SET INTEGRAL_QTY_AWARD_COST = l_cost_of_constraint
5070 WHERE SCENARIO_ID = l_parent_scenario_id
5071 AND SEQUENCE_NUMBER = p_sequence_number
5072 AND CONSTRAINT_TYPE = p_constraint_type;
5073
5074
5075 ELSIF (p_internal_type = 'LINE_AWARD_QTY') THEN
5076
5077 IF (g_debug_mode = 'Y') THEN
5078 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5079 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_AWARD_QTY internal type constraint');
5080 END IF;
5081 END IF;
5082
5083 UPDATE PON_OPTIMIZE_CONSTRAINTS
5084 SET MIN_MAX_QUANTITY_COST = l_cost_of_constraint
5085 WHERE SCENARIO_ID = l_parent_scenario_id
5086 AND SEQUENCE_NUMBER = p_sequence_number
5087 AND CONSTRAINT_TYPE = p_constraint_type;
5088
5089
5090 ELSIF (p_internal_type = 'LINE_AWARD_AMOUNT') THEN
5091
5092 IF (g_debug_mode = 'Y') THEN
5093 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5094 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_AWARD_AMOUNT internal type constraint');
5095 END IF;
5096 END IF;
5097
5098 UPDATE PON_OPTIMIZE_CONSTRAINTS
5099 SET MIN_MAX_AMOUNT_COST = l_cost_of_constraint
5100 WHERE SCENARIO_ID = l_parent_scenario_id
5101 AND SEQUENCE_NUMBER = p_sequence_number
5102 AND CONSTRAINT_TYPE = p_constraint_type;
5103
5104
5105 ELSIF (p_internal_type = 'LINE_MIN_QTY') THEN
5106
5107 IF (g_debug_mode = 'Y') THEN
5108 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5109 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_MIN_QTY internal type constraint');
5110 END IF;
5111 END IF;
5112
5113 UPDATE PON_OPTIMIZE_CONSTRAINTS
5114 SET QUANTITY_CUTOFF_COST = l_cost_of_constraint
5115 WHERE SCENARIO_ID = l_parent_scenario_id
5116 AND SEQUENCE_NUMBER = p_sequence_number
5117 AND CONSTRAINT_TYPE = p_constraint_type;
5118
5119
5120
5121 ELSIF (p_internal_type = 'LINE_MAX_PRICE') THEN
5122
5123 IF (g_debug_mode = 'Y') THEN
5124 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5125 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_MAX_PRICE internal type constraint');
5126 END IF;
5127 END IF;
5128
5129 UPDATE PON_OPTIMIZE_CONSTRAINTS
5130 SET PRICE_CUTOFF_COST = l_cost_of_constraint
5131 WHERE SCENARIO_ID = l_parent_scenario_id
5132 AND SEQUENCE_NUMBER = p_sequence_number
5133 AND CONSTRAINT_TYPE = p_constraint_type;
5134
5135
5136
5137 ELSIF (p_internal_type = 'LINE_MIN_SCORE') THEN
5138
5139 IF (g_debug_mode = 'Y') THEN
5140 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5141 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_MIN_SCORE internal type constraint');
5142 END IF;
5143 END IF;
5144
5145 UPDATE PON_OPTIMIZE_CONSTRAINTS
5146 SET MIN_SCORE_COST = l_cost_of_constraint
5147 WHERE SCENARIO_ID = l_parent_scenario_id
5148 AND SEQUENCE_NUMBER = p_sequence_number
5149 AND CONSTRAINT_TYPE = p_constraint_type;
5150
5151 ELSIF (p_internal_type = 'LINE_PROMISED_DATE') THEN
5152
5153 IF (g_debug_mode = 'Y') THEN
5154 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5155 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_PROMISED_DATE internal type constraint');
5156 END IF;
5157 END IF;
5158
5159 UPDATE PON_OPTIMIZE_CONSTRAINTS
5160 SET PROMISED_DATE_COST = l_cost_of_constraint
5161 WHERE SCENARIO_ID = l_parent_scenario_id
5162 AND SEQUENCE_NUMBER = p_sequence_number
5163 AND CONSTRAINT_TYPE = p_constraint_type;
5164
5165 END IF;
5166
5167 ELSIF (p_constraint_type = 'SUPP_LINE_CONST') THEN
5168
5169 -- three constraints
5170
5171 -- Line Number of Suppliers : same seqnum
5172 -- Line Any One Supplier : same seqnum
5173 -- Line-level award amount and
5174 -- award quantity for each supplier : different seqnum
5175
5176
5177 IF (p_internal_type = 'LINE_NUM_SUPP') THEN
5178
5179 IF (g_debug_mode = 'Y') THEN
5180 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5181 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_NUM_SUPP internal type constraint');
5182 END IF;
5183 END IF;
5184
5185 UPDATE PON_OPTIMIZE_CONSTRAINTS
5186 SET MIN_MAX_QUANTITY_COST = l_cost_of_constraint
5187 WHERE SCENARIO_ID = l_parent_scenario_id
5188 AND SEQUENCE_NUMBER = p_sequence_number
5189 AND CONSTRAINT_TYPE = p_constraint_type;
5190
5191
5192 ELSIF (p_internal_type = 'LINE_ANY_ONE_SUPP') THEN
5193
5194 IF (g_debug_mode = 'Y') THEN
5195 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5196 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_ANY_ONE_SUPP internal type constraint');
5197 END IF;
5198 END IF;
5199
5200 UPDATE PON_OPTIMIZE_CONSTRAINTS
5201 SET MIN_MAX_AMOUNT_COST = l_cost_of_constraint
5202 WHERE SCENARIO_ID = l_parent_scenario_id
5203 AND SEQUENCE_NUMBER = p_sequence_number
5204 AND CONSTRAINT_TYPE = p_constraint_type;
5205
5206 END IF;
5207
5208 ELSIF (p_constraint_type = 'BID_LINE_CONST') THEN
5209
5210 IF (p_internal_type = 'LINE_SUPP_SITE_AMT') THEN
5211
5212 IF (g_debug_mode = 'Y') THEN
5213 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5214 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_SUPP_SITE_AMT internal type constraint');
5215 END IF;
5216 END IF;
5217
5218 UPDATE PON_OPTIMIZE_CONSTRAINTS
5219 SET MIN_MAX_AMOUNT_COST = l_cost_of_constraint
5220 WHERE SCENARIO_ID = l_parent_scenario_id
5221 AND SEQUENCE_NUMBER = p_sequence_number
5222 AND CONSTRAINT_TYPE = p_constraint_type;
5223
5224 ELSIF (p_internal_type = 'LINE_SUPP_SITE_QTT') THEN
5225
5226 IF (g_debug_mode = 'Y') THEN
5227 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5228 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_SUPP_SITE_QTT internal type constraint');
5229 END IF;
5230 END IF;
5231
5232 UPDATE PON_OPTIMIZE_CONSTRAINTS
5233 SET MIN_MAX_QUANTITY_COST = l_cost_of_constraint
5234 WHERE SCENARIO_ID = l_parent_scenario_id
5235 AND SEQUENCE_NUMBER = p_sequence_number
5236 AND CONSTRAINT_TYPE = p_constraint_type;
5237
5238 END IF;
5239 ELSIF (p_constraint_type = 'SUPP_BIZ_CONST') THEN
5240
5241 IF (g_debug_mode = 'Y') THEN
5242 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5243 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating SUPP_BIZ_CONST constraint type');
5244 END IF;
5245 END IF;
5246
5247 UPDATE PON_OPTIMIZE_CONSTRAINTS
5248 SET MIN_MAX_AMOUNT_COST = l_cost_of_constraint
5249 WHERE SCENARIO_ID = l_parent_scenario_id
5250 AND SEQUENCE_NUMBER = p_sequence_number
5251 AND CONSTRAINT_TYPE = p_constraint_type;
5252
5253 ELSIF ( p_constraint_type = 'BUDGET_AMT_CONST' OR
5254 p_constraint_type = 'INCUMBENT_SUPP_CONST' OR
5255 p_constraint_type = 'ANY_SUPP_CONST' OR
5256 p_constraint_type = 'SUPP_ASL_CONST' OR
5257 p_constraint_type = 'SUPPLIER_CONST' ) THEN
5258
5259
5260 IF (g_debug_mode = 'Y') THEN
5261 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5262 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating BUDGET_AMT_CONST, INCUMBENT_SUPP_CONST, ANY_SUPP_CONST, ');
5263 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'SUPP_ASL_CONST, SUPPLIER_CONST constraint types');
5264 END IF;
5265 END IF;
5266
5267 UPDATE PON_OPTIMIZE_CONSTRAINTS
5268 SET MIN_MAX_AMOUNT_COST = l_cost_of_constraint
5269 WHERE SCENARIO_ID = l_parent_scenario_id
5270 AND SEQUENCE_NUMBER = p_sequence_number
5271 AND CONSTRAINT_TYPE = p_constraint_type;
5272
5273 ELSIF (p_constraint_type = 'NUM_OF_SUPP_CONST') THEN
5274
5275 IF (g_debug_mode = 'Y') THEN
5276 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5277 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating NUM_OF_SUPP_CONST constraint type');
5278 END IF;
5279 END IF;
5280
5281 UPDATE PON_OPTIMIZE_CONSTRAINTS
5282 SET MIN_MAX_QUANTITY_COST = l_cost_of_constraint
5283 WHERE SCENARIO_ID = l_parent_scenario_id
5284 AND SEQUENCE_NUMBER = p_sequence_number
5285 AND CONSTRAINT_TYPE = p_constraint_type;
5286
5287 ELSIF ( p_constraint_type = 'TOTAL_HDR_ATTR_CONST' OR
5288 p_constraint_type = 'HDR_ATTR_CONST' ) THEN
5289
5290 IF (g_debug_mode = 'Y') THEN
5291 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5292 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating TOTAL_HDR_ATTR_CONST, HDR_ATTR_CONST constraint types');
5293 END IF;
5294 END IF;
5295
5296 UPDATE PON_OPTIMIZE_CONSTRAINTS
5297 SET MIN_SCORE_COST = l_cost_of_constraint
5298 WHERE SCENARIO_ID = l_parent_scenario_id
5299 AND SEQUENCE_NUMBER = p_sequence_number
5300 AND CONSTRAINT_TYPE = p_constraint_type;
5301
5302 ELSIF (p_constraint_type = 'INCL_HOLD_SUPP_CONST') THEN
5303
5304 IF (g_debug_mode = 'Y') THEN
5305 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5306 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating INCL_HOLD_SUPP_CONST constraint type');
5307 END IF;
5308 END IF;
5309
5310 UPDATE PON_OPTIMIZE_CONSTRAINTS
5311 SET EXCLUDED_SUPPLIER_COST = l_cost_of_constraint
5312 WHERE SCENARIO_ID = l_parent_scenario_id
5313 AND SEQUENCE_NUMBER = p_sequence_number
5314 AND CONSTRAINT_TYPE = p_constraint_type;
5315
5316 ELSIF (p_constraint_type = 'NO_SPLIT_GROUP_CONST') THEN
5317
5318 IF (g_debug_mode = 'Y') THEN
5319 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5320 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating NO_SPLIT_GROUP_CONST constraint type');
5321 END IF;
5322 END IF;
5323
5324 UPDATE PON_OPTIMIZE_CONSTRAINTS
5325 SET SPLIT_AWARD_COST = l_cost_of_constraint
5326 WHERE SCENARIO_ID = l_parent_scenario_id
5327 AND SEQUENCE_NUMBER = p_sequence_number
5328 AND CONSTRAINT_TYPE = p_constraint_type;
5329 END IF;
5330
5331 IF (g_debug_mode = 'Y') THEN
5332 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5333 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before deleting the dummy scneario with p_scenario_id: ' || p_scenario_id );
5334 END IF;
5335 END IF;
5336
5337 DELETE FROM PON_OPTIMIZE_SCENARIOS WHERE SCENARIO_ID = P_SCENARIO_ID;
5338
5339 -- do some basic initialization
5340
5341 l_num_constraints := 0;
5342 l_num_bid_classes := 0;
5343 l_num_results := 0;
5344
5345
5346 -- make sure there is at least 1 row to prevent no data found exception
5347 select count(*) into l_num_constraints
5348 from pon_optimize_constraints
5349 where scenario_id = p_scenario_id;
5350
5351 IF (l_num_constraints > 0) THEN
5352 IF (g_debug_mode = 'Y') THEN
5353 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5354 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before deleting the dummy scenario constraints from PON_OPTIMIZE_CONSTRAINTS for p_scenario_id: ' || p_scenario_id );
5355 END IF;
5356 END IF;
5357
5358 DELETE FROM PON_OPTIMIZE_CONSTRAINTS WHERE SCENARIO_ID = P_SCENARIO_ID;
5359
5360 END IF;
5361
5362 select count(*) into l_num_bid_classes
5363 from pon_optimize_bid_class
5364 where scenario_id = p_scenario_id;
5365
5366 IF (l_num_bid_classes > 0) THEN
5367 IF (g_debug_mode = 'Y') THEN
5368 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5369 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before deleting the dummy scenario details from PON_OPTIMIZE_BID_CLASS for p_scenario_id: ' || p_scenario_id );
5370 END IF;
5371 END IF;
5372
5373 DELETE FROM PON_OPTIMIZE_BID_CLASS WHERE SCENARIO_ID = P_SCENARIO_ID;
5374 END IF;
5375
5376 select count(*) into l_num_results
5377 from pon_optimize_results
5378 where scenario_id = p_scenario_id;
5379
5380 IF(l_num_results > 0) THEN
5381 IF (g_debug_mode = 'Y') THEN
5382 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5383 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before deleting the dummy scenario results from PON_OPTIMIZE_RESULTS for p_scenario_id: ' || p_scenario_id );
5384 END IF;
5385 END IF;
5386
5387 DELETE FROM PON_OPTIMIZE_RESULTS WHERE SCENARIO_ID = P_SCENARIO_ID;
5388
5389 END IF;
5390
5391 X_STATUS := 'SUCCESS';
5392
5393 EXCEPTION
5394 WHEN OTHERS THEN
5395 X_STATUS := 'FAILURE';
5396 IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5397 FND_LOG.STRING(log_level => fnd_log.LEVEL_UNEXPECTED
5398 ,module => l_module
5399 ,message => 'When others exception raised in postprocess_cost_of_constraint');
5400 END IF;
5401
5402 RAISE;
5403 END;
5404
5405
5406 PROCEDURE reset_cost_of_constraint
5407 (
5408 p_scenario_id IN NUMBER,
5409 x_status OUT NOCOPY VARCHAR2
5410 )
5411
5412 IS
5413
5414 l_num_constraints NUMBER;
5415
5416 BEGIN
5417
5418 -- initialize number of constraints
5419 l_num_constraints := -1;
5420
5421 -- make sure there is at least 1 row to prevent no data found exception
5422 select count(*) into l_num_constraints
5423 from pon_optimize_constraints
5424 where scenario_id = p_scenario_id;
5425
5426 IF (l_num_constraints > 0) THEN
5427
5428 UPDATE PON_OPTIMIZE_CONSTRAINTS
5429 SET
5430 MIN_MAX_AMOUNT_COST = TO_NUMBER(NULL),
5431 MIN_MAX_QUANTITY_COST = TO_NUMBER(NULL),
5432 PRICE_CUTOFF_COST = TO_NUMBER(NULL),
5433 SPLIT_AWARD_COST = TO_NUMBER(NULL),
5434 QUANTITY_CUTOFF_COST = TO_NUMBER(NULL),
5435 INTEGRAL_QTY_AWARD_COST = TO_NUMBER(NULL),
5436 EXCLUDED_SUPPLIER_COST = TO_NUMBER(NULL),
5437 PROMISED_DATE_COST = TO_NUMBER(NULL),
5438 MIN_SCORE_COST = TO_NUMBER(NULL)
5439 WHERE
5440 SCENARIO_ID = P_SCENARIO_ID;
5441
5442 END IF;
5443
5444 X_STATUS := 'SUCCESS';
5445
5446 EXCEPTION
5447 WHEN OTHERS THEN
5448 X_STATUS := 'FAILURE';
5449 RAISE;
5450 END;
5451
5452 /*======================================================================
5453 FUNCTION : GET_SAVING_PERCENT_INCENTIVE PUBLIC
5454 PARAMETERS:
5455 p_scenario_id IN scenario id
5456
5457 COMMENT : Returns the saving percent of the given scenario.
5458 ======================================================================*/
5459 FUNCTION GET_SAVING_PERCENT_INCENTIVE (p_scenario_id IN NUMBER)
5460 RETURN NUMBER
5461 IS
5462 L_SAVING_PERCENT NUMBER := 0;
5463
5464 l_total_award NUMBER := 0;
5465 l_new_rebate NUMBER := 0;
5466 l_incentive NUMBER := 0;
5467 l_total_incentive NUMBER := 0;
5468 l_total_current_amount NUMBER := 0;
5469
5470 l_bid_number_col PON_NEG_COPY_DATATYPES_GRP.NUMBER_TYPE;
5471 l_award_total_sum_col PON_NEG_COPY_DATATYPES_GRP.NUMBER_TYPE;
5472 l_savings_amount_col PON_NEG_COPY_DATATYPES_GRP.NUMBER_TYPE;
5473 l_current_amount_col PON_NEG_COPY_DATATYPES_GRP.NUMBER_TYPE;
5474 l_current_total_spend_col PON_NEG_COPY_DATATYPES_GRP.NUMBER_TYPE;
5475 l_fixed_incentive_col PON_NEG_COPY_DATATYPES_GRP.NUMBER_TYPE;
5476 l_current_rebate_col PON_NEG_COPY_DATATYPES_GRP.NUMBER_TYPE;
5477
5478 BEGIN
5479
5480 SELECT
5481 bi.bid_number as selected_bid_number,
5482 SUM(por.award_quantity * decode(nvl(por.award_shipment_number,-1),-1,bi.per_unit_price_component,pbs.per_unit_price_component) + bi.fixed_amount_component) AS award_total_sum,
5483 SUM(por.award_quantity * nvl2(ai.current_price, (ai.current_price -por.award_price), 0)) AS savings_amount,
5484 SUM(por.award_quantity * nvl(ai.current_price,por.award_price)) AS current_amount,
5485 nvl(pbh.CURRENT_TOTAL_SPEND, 0) CURRENT_TOTAL_SPEND,
5486 nvl(pbh.FIXED_INCENTIVE, 0) FIXED_INCENTIVE,
5487 nvl(pbh.CURRENT_REBATE,0) CURRENT_REBATE
5488 BULK COLLECT INTO
5489 l_bid_number_col ,
5490 l_award_total_sum_col ,
5491 l_savings_amount_col,
5492 l_current_amount_col,
5493 l_current_total_spend_col,
5494 l_fixed_incentive_col,
5495 l_current_rebate_col
5496 FROM
5497 pon_bid_item_prices bi,
5498 pon_auction_item_prices_all ai,
5499 pon_optimize_scenarios pos,
5500 pon_optimize_results por,
5501 pon_bid_shipments pbs,
5502 pon_bid_headers pbh
5503 WHERE
5504 por.scenario_id = pos.scenario_id
5505 AND
5506 por.bid_number = bi.bid_number
5507 AND
5508 pos.auction_header_id = bi.auction_header_id
5509 AND
5510 ai.auction_header_id = bi.auction_header_id
5511 AND
5512 bi.line_number = por.line_number
5513 AND
5514 ai.line_number = bi.line_number
5515 AND
5516 ai.group_type in ('LINE', 'LOT', 'GROUP_LINE')
5517 AND
5518 nvl(por.award_quantity, -1) > 0
5519 AND
5520 por.bid_number = pbh.bid_number
5521 and
5522 pos.scenario_id = p_scenario_id
5523 AND por.bid_number = pbs.bid_number(+)
5524 AND por.line_number = pbs.line_number(+)
5525 AND nvl(por.award_shipment_number, -1) = pbs.shipment_number(+)
5526 GROUP BY bi.bid_number, pbh.CURRENT_TOTAL_SPEND, pbh.FIXED_INCENTIVE, pbh.CURRENT_REBATE;
5527
5528 FOR i IN 1..l_bid_number_col.COUNT LOOP
5529
5530 l_total_Award := l_award_total_sum_col(i) + l_current_total_spend_col(i);
5531
5532 BEGIN
5533 select rebate
5534 into l_new_rebate
5535 from pon_bid_rebates
5536 where bid_number = l_bid_number_col(i)
5537 and l_total_award between lower_spend and upper_spend;
5538
5539 EXCEPTION WHEN NO_DATA_FOUND THEN
5540 l_new_rebate := 0;
5541 END;
5542
5543 if l_new_rebate = 0 then
5544 l_new_rebate := l_current_rebate_col(i);
5545 end if;
5546
5547 l_incentive := l_fixed_incentive_col(i) + (l_award_total_sum_col(i) * l_new_rebate / 100 )
5548 + l_current_total_spend_col(i) * ( l_new_rebate - l_current_rebate_col(i) )/100;
5549
5550 l_total_incentive := l_total_incentive + l_incentive + l_savings_amount_col(i);
5551 l_total_current_amount := l_total_current_amount + l_current_amount_col(i);
5552 END LOOP;
5553
5554 if l_total_current_amount <> 0 then
5555 l_saving_percent := l_total_incentive/l_total_current_amount*100;
5556 end if;
5557
5558 RETURN l_saving_percent;
5559 EXCEPTION
5560 WHEN OTHERS THEN
5561 RETURN 0;
5562 END GET_SAVING_PERCENT_INCENTIVE;
5563
5564 /*Line Type and Structure Changes Project:
5565 Procedure to copy all backing requisition Associated to SOl lines from pon_backing_requisitions to pon_bid_backing_requisitions.*/
5566
5567 PROCEDURE create_pon_bid_back_req(p_auction_header_id IN NUMBER)
5568 IS
5569
5570 l_user_id NUMBER;
5571 l_login_id NUMBER;
5572 l_module VARCHAR2(30) := 'create_pon_bid_back_req';
5573
5574 l_encumberence_flag VARCHAR2(1);
5575 l_outcome_document_type VARCHAR2(100);
5576
5577 BEGIN
5578
5579 IF (g_debug_mode = 'Y') THEN
5580 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5581 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Begin: ');
5582 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Param: p_auction_header_id '|| p_auction_header_id);
5583 END IF;
5584 END IF;
5585
5586 l_user_id := fnd_global.user_id;
5587 l_login_id := fnd_global.login_id;
5588
5589 INSERT INTO pon_bid_backing_requisitions(auction_header_id,
5590 auction_line_number,
5591 bid_number,
5592 bid_line_number,
5593 requisition_header_id ,
5594 requisition_line_id ,
5595 requisition_quantity ,
5596 requisition_number,
5597 created_by,
5598 last_update_date,
5599 last_updated_by,
5600 last_update_login,
5601 creation_date )
5602 (
5603 SELECT pbr.auction_header_id,
5604 pbr.line_number,
5605 -1,
5606 -1,
5607 pbr.requisition_header_id,
5608 pbr.requisition_line_id,
5609 pbr.requisition_quantity,
5610 pbr.requisition_number,
5611 l_user_id,
5612 sysdate,
5613 l_user_id,
5614 l_login_id,
5615 SYSDATE
5616 FROM pon_auction_item_prices_all paip, pon_backing_requisitions pbr
5617 WHERE pbr.auction_header_id = p_auction_header_id
5618 AND paip.auction_header_id = pbr.auction_header_id
5619 AND paip.line_number = pbr.line_number);
5620
5621 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5622 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'END: ');
5623 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Insert into pon_bid_backing_requisitions Succesful');
5624 END IF;
5625
5626 EXCEPTION
5627 WHEN OTHERS THEN
5628 IF (g_debug_mode = 'Y') THEN
5629 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5630 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'An exception occurred during the INSERT INTO pon_bid_backing_requisitions.
5631 Raising the exception.....');
5632 END IF;
5633 END IF;
5634 RAISE;
5635
5636 END create_pon_bid_back_req;
5637
5638 PROCEDURE update_total_agreement_amount(
5639 p_auction_header_id IN NUMBER,
5640 p_bid_number IN NUMBER,
5641 p_override_amount IN VARCHAR2,
5642 p_total_agreement_amount OUT NOCOPY NUMBER)
5643 IS
5644 CURSOR c_bid_lines
5645 IS
5646 SELECT bi.Line_number,
5647 bi.award_status,
5648 NVL(bi.award_price , bi.price) * Nvl(BI.AWARD_QUANTITY, DECODE(AI.ORDER_TYPE_LOOKUP_CODE, 'FIXED PRICE',1 , ai.quantity)) award_amount,
5649 pbh.po_agreed_amount
5650 FROM pon_bid_item_prices bi,
5651 pon_auction_item_prices_all ai,
5652 pon_bid_headers pbh
5653 WHERE bi.bid_number = p_bid_number
5654 AND bi.auction_header_id = ai.auction_header_id
5655 AND ai. auction_header_id = pbh.auction_header_id
5656 AND pbh.bid_number = bi.bid_number
5657 AND bi.line_number = ai.line_number
5658 AND ai.group_type IN ('LOT', 'LINE', 'GROUP_LINE')
5659 AND bi.award_status = 'AWARDED';
5660 l_bid_lines_rec c_bid_lines%ROWTYPE;
5661 x_total_agreement_amount NUMBER := 0;
5662 l_update_amount VARCHAR2(5);
5663 BEGIN
5664
5665 OPEN c_bid_lines;
5666 LOOP
5667 FETCH c_bid_lines INTO l_bid_lines_rec;
5668 EXIT
5669 WHEN c_bid_lines%NOTFOUND;
5670 IF(p_override_amount = 'TRUE' OR l_bid_lines_rec.po_agreed_amount IS NULL OR l_bid_lines_rec.po_agreed_amount = 0) THEN
5671 l_update_amount := 'TRUE';
5672 END IF;
5673 x_total_agreement_amount := NVL(x_total_agreement_amount,0) + NVL(l_bid_lines_rec.award_amount,0);
5674 END LOOP;
5675 p_total_agreement_amount := x_total_agreement_amount;
5676 END update_total_agreement_amount;
5677
5678 PROCEDURE complete_partial_auction (p_auction_header_id IN NUMBER ) IS
5679
5680 x_event_id pon_auction_headers_all.event_id%type;
5681 x_count NUMBER;
5682
5683 BEGIN
5684 -- complete auction header disposition
5685 -- clear out the request_id for super-large auctions
5686 update pon_auction_headers_all
5687 set AUCTION_STATUS = 'AUCTION_CLOSED',
5688 REQUEST_ID = NULL,
5689 LAST_UPDATE_DATE = sysdate
5690 where auction_header_id = p_auction_header_id;
5691
5692 -- complete work flow
5693 pon_auction_pkg.COMPLETE_AUCTION(p_auction_header_id);
5694
5695 END complete_partial_auction;
5696
5697 PROCEDURE clear_unawarded_draft_awards
5698 (
5699 p_auction_header_id IN NUMBER,
5700 p_line_number IN NUMBER,
5701 p_award_date IN DATE,
5702 p_auctioneer_id IN NUMBER,
5703 p_neg_has_lines IN VARCHAR2 -- FPK: CPA
5704 )
5705 IS
5706 BEGIN
5707
5708 IF p_neg_has_lines = 'Y' THEN -- FPK: CPA
5709
5710
5711 IF (p_line_number IS NULL OR p_line_number <= 0 )THEN
5712 -- Header level awards
5713 --Update award status to REJECTED for all the bids
5714 UPDATE pon_bid_item_prices
5715 SET award_status = 'REJECTED',
5716 award_quantity = NULL,
5717 award_date = p_award_date,
5718 last_update_date = p_award_date,
5719 last_updated_by = p_auctioneer_id,
5720 award_shipment_number = NULL,
5721 award_price = NULL
5722 WHERE bid_number IN (
5723 SELECT bid_number
5724 FROM pon_bid_headers
5725 WHERE auction_header_id = p_auction_header_id
5726 AND bid_status = 'ACTIVE'
5727 )
5728 AND auction_line_number <> -1 -- Unsolicited Lines Project : Donot clear unsolicited lines awarded.
5729 AND auction_line_number NOT IN (SELECT line_number
5730 FROM pon_auction_item_prices_all
5731 WHERE auction_header_id = p_auction_header_id
5732 AND Nvl(award_status, 'NO') = 'COMPLETED');
5733
5734 -- Delete All Awards since it is a header-level awarding
5735 DELETE FROM pon_acceptances
5736 WHERE auction_header_id = p_auction_header_id
5737 AND auction_line_number <> -1 -- Unsolicited Lines Project : Donot delete unsolicited lines records.
5738 AND auction_line_number NOT IN (SELECT line_number
5739 FROM pon_auction_item_prices_all
5740 WHERE auction_header_id = p_auction_header_id
5741 AND Nvl(award_status, 'NO') = 'COMPLETED');
5742
5743
5744 -- reset the award mode at auction item level
5745 UPDATE pon_auction_item_prices_all
5746 SET award_mode = null
5747 WHERE auction_header_id = p_auction_header_id
5748 AND Nvl(award_status, 'NO') = 'COMPLETED';
5749 ELSE
5750 -- Group Level awards need to be rejected first
5751 --Update award status to REJECTED for all the bids
5752 UPDATE pon_bid_item_prices
5753 SET award_status = 'REJECTED',
5754 award_quantity = NULL,
5755 award_date = p_award_date,
5756 last_update_date = p_award_date,
5757 last_updated_by = p_auctioneer_id,
5758 award_shipment_number = NULL,
5759 award_price = NULL
5760 WHERE bid_number IN (
5761 SELECT bid_number
5762 FROM pon_bid_headers
5763 WHERE auction_header_id = p_auction_header_id
5764 AND bid_status = 'ACTIVE'
5765 )
5766 AND line_number IN (SELECT line_number
5767 FROM pon_auction_item_prices_all
5768 WHERE auction_header_id = p_auction_header_id
5769 AND (line_number = p_line_number
5770 OR parent_line_number = p_line_number));
5771
5772 -- Delete All group line awards since it is a group-level awarding
5773 DELETE FROM pon_acceptances
5774 WHERE auction_header_id = p_auction_header_id
5775 AND line_number IN (SELECT line_number
5776 FROM pon_auction_item_prices_all
5777 WHERE auction_header_id = p_auction_header_id
5778 AND parent_line_number = p_line_number);
5779 END IF;
5780 END IF;
5781 END clear_unawarded_draft_awards;
5782
5783 END PON_AWARD_PKG;