DBA Data[Home] [Help]

PACKAGE BODY: APPS.PON_AWARD_PKG

Source


1 PACKAGE BODY PON_AWARD_PKG as
2 -- $Header: PONAWRDB.pls 120.42 2008/02/22 16:08:24 sssahai 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 update_all_bid_item_prices
10 (
11  p_bid_number     IN NUMBER,
12  p_award_status   IN VARCHAR2,
13  p_award_date     IN DATE,
14  p_auctioneer_id  IN NUMBER
15 ) IS
16 
17 l_max_line_number      	NUMBER;
18 l_batch_size		NUMBER;
19 l_batch_start		NUMBER;
20 l_batch_end		NUMBER;
21 l_commit_flag		BOOLEAN;
22 
23 BEGIN
24 
25 	-- by default, we do not want to commit intermittently
26 	l_commit_flag := FALSE;
27 
28 	-- just set award_qty same as bid_qty
29         select 	nvl(max(line_number),0)
30 	into 	l_max_line_number
31 	from 	pon_bid_item_prices
32         where 	bid_number = p_bid_number;
33 
34 	l_batch_size := PON_LARGE_AUCTION_UTIL_PKG.BATCH_SIZE;
35 
36 	l_batch_start := 1;
37 
38         IF (l_max_line_number <l_batch_size) THEN
39             l_batch_end := l_max_line_number;
40         ELSE
41 	    l_commit_flag := TRUE; -- commit if we are going to loop over multiple times
42             l_batch_end   := l_batch_size;
43         END IF;
44 
45 
46 	WHILE (l_batch_start <= l_max_line_number) LOOP --{ main-batching-loop
47 
48 		UPDATE PON_BID_ITEM_PRICES pbip
49 		SET
50 		(pbip.award_status,
51 		 pbip.award_quantity,
52 		 pbip.award_date,
53 		 pbip.last_update_date,
54 		 pbip.last_updated_by,
55                  pbip.award_price,
56                  pbip.award_shipment_number) =
57 		(
58 		select
59 			p_award_status,
60 		        decode (paip.group_type, 'LOT_LINE', null,
61 						 'GROUP',    null,
62 			    decode (paha.contract_type, 'BLANKET', null,
63 	        	      decode (paip.order_type_lookup_code, 'FIXED PRICE', 1,
64                         	                         	   'AMOUNT',      1,
65                                 	                 	   'RATE',        1, pbip.quantity ))),
66 		        p_award_date,
67 			p_award_date,
68         		p_auctioneer_id,
69         		pbip.price,
70                         null
71 		from
72 			pon_auction_item_prices_all paip,
73 			pon_auction_headers_all paha
74 		where  	pbip.bid_number 	= p_bid_number
75 		and    	pbip.auction_header_id  = paip.auction_header_id
76 		and     pbip.line_number 	= paip.line_number
77 		and     paha.auction_header_id  = pbip.auction_header_id
78 		)
79 		where
80 			pbip.bid_number		=  p_bid_number		  and
81 			pbip.line_number	>= l_batch_start 	  and
82 			pbip.line_number	<= l_batch_end;
83 
84            	l_batch_start := l_batch_end + 1;
85 
86            	IF (l_batch_end + l_batch_size > l_max_line_number) THEN
87                		l_batch_end := l_max_line_number;
88            	ELSE
89                		l_batch_end := l_batch_end + l_batch_size;
90            	END IF;
91 
92 
93 		IF(l_commit_flag = TRUE) THEN
94 			COMMIT;
95 		END IF;
96 
97 	END LOOP; --} --end-loop
98 
99 END update_all_bid_item_prices;
100 
101 
102 PROCEDURE update_all_auction_item_prices
103 (
104   p_auction_id    IN NUMBER,
105   p_bid_number    IN NUMBER,
106   p_award_date	  IN DATE,
107   p_auctioneer_id IN NUMBER
108 ) IS
109 
110 l_batch_size		NUMBER;
111 l_batch_start		NUMBER;
112 l_batch_end		NUMBER;
113 l_max_line_number      	NUMBER;
114 l_commit_flag		BOOLEAN;
115 
116 BEGIN
117 
118 	-- by default, we do not want to commit intermittently
119 	l_commit_flag := FALSE;
120 
121         select 	nvl(max(line_number),0)
122 	into 	l_max_line_number
123 	from 	pon_auction_item_prices_all
124         where 	auction_header_id = p_auction_id;
125 
126 	l_batch_size := PON_LARGE_AUCTION_UTIL_PKG.BATCH_SIZE;
127 
128 	l_batch_start := 1;
129 
130         IF (l_max_line_number <l_batch_size) THEN
131             l_batch_end := l_max_line_number;
132         ELSE
133 	    l_commit_flag := TRUE; -- commit if we are going to loop over multiple times
134             l_batch_end   := l_batch_size;
135         END IF;
136 
137 	WHILE (l_batch_start <= l_max_line_number) LOOP --{ main-batching-loop
138 
139 		UPDATE pon_auction_item_prices_all paip
140 		SET
141 		(paip.award_status,
142 		paip.awarded_quantity,
143 		paip.award_mode,
144 		paip.last_update_date,
145 		paip.last_updated_by) =
146 		(
147 		select
148 			decode (pbip.award_status, 'AWARDED', 'AWARDED', 'REJECTED', 'AWARDED', 'PARTIAL', 'AWARDED', to_char(null)),
149 		        decode (paip.group_type, 'LOT_LINE', null,
150 						 'GROUP',    null,
151 	        	      decode (paip.order_type_lookup_code, 'FIXED PRICE', 1,
152                         	                         	   'AMOUNT',      1,
153                                 	                 	   'RATE',        1,
154 				decode (paha.contract_type, 'BLANKET', 1, 'CONTRACT', 1, pbip.quantity) ) ),
155 	        	g_AWARD_QUOTE,
156 		        p_award_date,
157         		p_auctioneer_id
158 		from
159 			pon_bid_item_prices pbip,
160 			pon_auction_headers_all paha
161 		where  	pbip.bid_number 	= p_bid_number
162 		and    	pbip.auction_header_id  = paip.auction_header_id
163 		and     pbip.line_number 	= paip.line_number
164 		and     paha.auction_header_id  = pbip.auction_header_id
165 		)
166 		where
167 			paip.auction_header_id 	=  p_auction_id		  and
168 			paip.line_number	>= l_batch_start 	  and
169 			paip.line_number	<= l_batch_end;
170 
171            	l_batch_start := l_batch_end + 1;
172 
173            	IF (l_batch_end + l_batch_size > l_max_line_number) THEN
174                		l_batch_end := l_max_line_number;
175            	ELSE
176                		l_batch_end := l_batch_end + l_batch_size;
177            	END IF;
178 
179 		IF(l_commit_flag = TRUE) THEN
180 			COMMIT;
181 		END IF;
182 
183 	END LOOP; --} --end-loop- batching
184 
185 --
186 END update_all_auction_item_prices;
187 
188 
189 
190   -- This method is kind of redundant because we now use the
191   -- award status flag to determine which item is awarded and
192   -- which is not.
193   -- So removed all the old code to delete unawarded items and only
194   -- doing an update of the award quantity
195 
196 PROCEDURE clean_unawarded_items (p_batch_id            IN NUMBER) IS
197 
198 BEGIN
199 
200    -- update the award quantity to 0 for those fields that have award quantity
201    -- less than 0
202   UPDATE pon_award_items_interface
203  SET award_quantity = 0
204   WHERE batch_id = p_batch_id
205   AND award_quantity < 0;
206 
207   COMMIT;
208 
209 END clean_unawarded_items;
210 
211 
212 /*
213  Reject the active bids on negotiation items that were not awarded
214  and cancel backing requisitions for the items, if any
215 */
216 PROCEDURE reject_unawarded_active_bids(p_auction_header_id     IN NUMBER,
217                                        p_user_id               IN NUMBER,
218                                        p_note_to_rejected      IN VARCHAR2,
219 									   p_neg_has_lines         IN VARCHAR2) IS
220 
221   -- select all active bid items for for which award decision is not made.
222   -- this includes auction lines with no award decision made
223   -- and auction lines with award decision made but have bid items unawarded
224   CURSOR active_bid_lines(p_auction_header_id NUMBER) IS
225           select al.line_number,
226                  al.line_origination_code,
227 				 nvl(al.award_status,'NO'),
228                  bl.bid_number,
229                  bl.order_number,
230                  bl.award_quantity
231             from pon_auction_item_prices_all al,
232                  pon_bid_item_prices bl,
233                  pon_bid_headers bh
234            where al.auction_header_id = p_auction_header_id
235              and bl.auction_header_id = al.auction_header_id
236              and bl.line_number = al.line_number
237              and bh.bid_number = bl.bid_number
238              and nvl(bh.bid_status,'NONE') = 'ACTIVE'
239 			 -- we get lines with award decision made but have some bids unawarded
240 			 --and nvl(al.award_status,'NO') = 'NO'
241              and nvl(bl.award_status,'NO') = 'NO';
242 
243 
244     -- FPK: CPA select all active bids for which award decision is not made.
245 	CURSOR active_bid_headers(p_auction_header_id NUMBER) IS
246 	       select nvl(ah.award_status,'NO'),
247 	                 bh.bid_number
248 	       from pon_auction_headers_all ah,
249 	                 pon_bid_headers bh
250 	       where bh.auction_header_id = p_auction_header_id
251 	       and bh.auction_header_id = ah.auction_header_id
252 	       and nvl(bh.bid_status,'NONE') = 'ACTIVE'
253 		   and nvl(bh.award_status,'NO') = 'NO';
254 
255 
256   x_line_number pon_auction_item_prices_all.line_number%type;
257   x_old_line_number pon_auction_item_prices_all.line_number%type;
258   x_line_origination_code pon_auction_item_prices_all.line_origination_code%type;
259   x_bid_number pon_bid_headers.bid_number%type;
260   x_order_number pon_bid_headers.order_number%type;
261   x_award_quantity pon_bid_item_prices.award_quantity%type;
262   x_line_award_status pon_auction_item_prices_all.award_status%type;
263   x_stored_note_to_rejected pon_acceptances.reason%type;
264   x_error_code VARCHAR2(20);
265 
266   x_bid_number_list integerList;
267   x_bid_number_found BOOLEAN;
268   x_count NUMBER;
269 
270   -- FPK: CPA
271   x_header_award_status  PON_BID_HEADERS.AWARD_STATUS%TYPE;
272 
273 BEGIN
274  IF p_neg_has_lines = 'Y' THEN -- FPK: CPA
275       open active_bid_lines(p_auction_header_id);
276       loop
277             fetch active_bid_lines
278              into x_line_number,
279                   x_line_origination_code,
280 				  x_line_award_status,
281                   x_bid_number,
282                   x_order_number,
283                   x_award_quantity;
284             exit when active_bid_lines%notfound;
285 			-- "AND x_line_award_status = 'NO'" condition added
286 			-- to ensure ONLY lines with NO award decision made are put back into the pool.
287             if (x_line_origination_code = 'REQUISITION' AND x_line_award_status = 'NO') then
288                PON_AUCTION_PKG.CANCEL_NEGOTIATION_REF_BY_LINE(p_auction_header_id, x_line_number, x_error_code);
289             end if;
290 /*
291             -- reject the bid line (note that reject shares the same
292             -- procedure as award)
293             award_bid (x_order_number,          -- p_order_number
294                      p_user_id,                 -- p_auctioneer_id
295                      p_auction_header_id,       -- p_auction_header_id
296                      x_bid_number,              -- p_bid_number
297                      x_line_number,             -- p_auction_line_number
298                      x_award_quantity,          -- p_award_quantity
299                      'REJECTED',                -- p_award_status
300                      p_note_to_rejected,        -- p_reason
301 		             sysdate,                   -- p_award_date,
302                      null,                      -- p_originPartyId: obsolete
303                      null,                      -- p_originUserId: obsolete
304                      null,                      -- p_currency: obsolete
305                      null                       -- p_billType: obsolete
306                     );
307 */
308          -- added for the new award flow in FPJ
309 		 -- Need to take care of notes in pon_acceptances.
310 	 	  update_single_bid_item_prices
311 	       (
312 	        x_bid_number,
313 			x_line_number,
314 			'REJECTED',
315 			x_award_quantity,
316 			sysdate,
317 			p_user_id
318 		   );
319 
320             -- determine if the bid number of the bid line has been added to the list
321             x_bid_number_found := FALSE;
322 
323             FOR i IN 1 .. x_bid_number_list.COUNT LOOP
324               IF x_bid_number = x_bid_number_list(i) THEN
325                 x_bid_number_found := TRUE;
326                 EXIT;
327               END IF;
328             END LOOP;
329 
330             -- if not, add it to the list
331             IF NOT(x_bid_number_found) THEN
332               x_bid_number_list(x_bid_number_list.COUNT + 1) := x_bid_number;
333             END IF;
334 
335             -- complete or award item disposition as necessary
336             -- there could be multiple bids for the same line
337             -- only need to call it once for each line
338             IF (x_old_line_number is null OR
339                 x_old_line_number <> x_line_number) THEN
340                x_old_line_number := x_line_number;
341 
342 	       IF (x_line_award_status = 'NO') THEN
343 	         -- Update acceptances for the lines with no award decision made
344                 update_unawarded_acceptances(
345 		   p_auction_header_id, -- auction header id
346 		   x_line_number,      -- line number
347 		   p_note_to_rejected, --note to rejected suppliers
348 		   SYSDATE,            -- award_date
349 		   p_user_id);
350 	       ELSE
351   	        -- Update acceptances for the lines with award decision already made
352 		   x_stored_note_to_rejected := null;
353 		   x_count := 0;
354 		   SELECT count(*) INTO x_count FROM pon_acceptances
355 		   WHERE auction_header_id = p_auction_header_id
356 		   AND line_number = x_line_number
357 		   AND ACCEPTANCE_TYPE = 'REJECTED';
358 --
359 		   IF x_count > 0 THEN
360 		     -- rejection note exists and carried over for rejected suppliers
361 		     SELECT distinct REASON INTO x_stored_note_to_rejected
362 		     FROM pon_acceptances
363 		     WHERE auction_header_id = p_auction_header_id
364 		     AND line_number = x_line_number
365 		     AND ACCEPTANCE_TYPE = 'REJECTED';
366 	           END IF;
367 --
368 	   	   update_unawarded_acceptances(
369 		           p_auction_header_id, -- auction header id
370 			   x_line_number,      -- line number
371 			   x_stored_note_to_rejected, --note to rejected suppliers
372 			   SYSDATE,            -- award_date
373 			   p_user_id);
374 	       END IF;
375                award_item_disposition (p_auction_header_id, x_line_number, 0);
376             END IF;
377 
378       END LOOP;
379       CLOSE active_bid_lines;
380 
381       -- update the award status for the bids whose lines were rejected
382       FOR i IN 1 .. x_bid_number_list.COUNT LOOP
383         update_single_bid_header(x_bid_number_list(i), p_user_id);
384       END LOOP;
385 
386       -- update the award status for the auction that was bidded on
387       -- if any bid line was rejected
388       IF x_bid_number_list.COUNT > 0 THEN
389         update_auction_headers(p_auction_header_id, g_AWARD_LINE, SYSDATE, p_user_id, 'Y');
390       END IF;
391  ELSE -- negotiation does not have lines
392     OPEN active_bid_headers(p_auction_header_id);
393 	LOOP
394 	   FETCH active_bid_headers
395 	   INTO x_header_award_status, x_bid_number;
396        EXIT WHEN active_bid_headers%NOTFOUND;
397 
398 	   -- determine if the bid number has been added to the list
399 	   x_bid_number_found := FALSE;
400 
401 	   FOR i IN 1 .. x_bid_number_list.COUNT LOOP
402 	      IF x_bid_number = x_bid_number_list(i) THEN
403 	         x_bid_number_found := TRUE;
404 	         EXIT;
405 	      END IF;
406 	   END LOOP;
407 
408 	   -- if not, add it to the list
409 	   IF NOT(x_bid_number_found) THEN
410 	          x_bid_number_list(x_bid_number_list.COUNT + 1) := x_bid_number;
411 	   END IF;
412 	END LOOP;
413     CLOSE active_bid_headers;
414 
415 	-- update the award status for the active bids in this auction where no
416 	-- award decision made (all bids will be rejected)
417     FORALL k IN 1..x_bid_number_list.COUNT
418 
419         UPDATE PON_BID_HEADERS
420 		SET AWARD_STATUS = 'REJECTED',
421 		    AWARD_DATE   = SYSDATE, /* new column created as part of CPA project.
422 	                                   It will be updated only when negotiation does
423                                        not have lines. */
424     	    last_update_date = SYSDATE,
425 		    last_updated_by = p_user_id
426 		WHERE bid_number = x_bid_number_list(k);
427 
428 	 -- update the award status for the auction that was bidded on
429 	 -- and no award decision made
430 	 IF x_bid_number_list.COUNT > 0 THEN
431 	    update_auction_headers(p_auction_header_id, g_AWARD_QUOTE, SYSDATE,
432 	                           p_user_id, 'N');
433 	 END IF;
434  END IF; -- IF neg. has lines
435 END reject_unawarded_active_bids;
436 
437 ----------------------------------------------------------------
438 -- Complete award process for a negotiation
439 -- mirrors NegotiationDoc.completeAward which is gone after
440 -- migration to OA
441 -- also contains some logic from reviewComplete.jsp
442 ----------------------------------------------------------------
443 
444 PROCEDURE complete_award (p_auction_header_id_encrypted IN VARCHAR2,
445                           p_auction_header_id           IN NUMBER,
446                           p_note_to_rejected            IN VARCHAR2,
447                           p_shared_award_decision       IN VARCHAR2,
448                           p_user_id                     IN NUMBER,
449                           p_create_po_flag              IN VARCHAR2,
450                           p_source_reqs_flag            IN VARCHAR2,
451                           p_no_bids_flag                IN VARCHAR2,
452                           p_has_backing_reqs_flag       IN VARCHAR2,
453                           p_outcome_status              IN VARCHAR2,
454 						  p_has_scoring_teams_flag      IN VARCHAR2,
455 						  p_scoring_lock_tpc_id         IN NUMBER) IS
456 
457 x_line_number pon_auction_item_prices_all.line_number%type;
458 x_line_origination_code pon_auction_item_prices_all.line_origination_code%type;
459 x_error_code VARCHAR2(20);
460 x_awarded_quantity NUMBER;
461 l_neg_has_lines PON_AUCTION_HEADERS_ALL.HAS_ITEMS_FLAG%TYPE; -- FPK: CPA
462 
463 --Business Events Changes
464 x_return_status  VARCHAR2(20);
465 x_msg_count      NUMBER;
466 x_msg_data       VARCHAR2(2000);
467 
468 -- select items without any bids that had backing requisitions
469 CURSOR items_with_reqs_no_bids(p_auction_header_id NUMBER) IS
470         SELECT 	line_number, line_origination_code
471         FROM 	PON_AUCTION_ITEM_PRICES_ALL
472         WHERE 	auction_header_id = p_auction_header_id
473         AND   	nvl(number_of_bids,0) = 0
474 	AND	line_origination_code = 'REQUISITION';
475 
476 
477 CURSOR auction_items_all (p_auction_header_id NUMBER) IS
478         SELECT line_number, nvl(awarded_quantity, 0)
479           FROM PON_AUCTION_ITEM_PRICES_ALL
480          WHERE auction_header_id = p_auction_header_id;
481 
482 BEGIN
483 
484 l_neg_has_lines := PON_AUCTION_PKG.neg_has_lines(p_auction_header_id); -- FPK: CPA
485 ----
486       if (p_create_po_flag <> 'Y' and p_has_backing_reqs_flag = 'Y') then
487             -- put requisitions back in pool if auction
488             -- has backing req and no outcome creation
489             PON_AUCTION_PKG.CANCEL_NEGOTIATION_REF(p_auction_header_id, x_error_code);
490       end if;
491 
492 	/* FPK: CPA
493 	   If negotiation has lines: for all items that have active bids but are not awarded,
494 	   reject the active bids and cancel backing requisitions, if any
495 	   If negotiation does not have lines: reject all active bids that were not awarded n
496 	   nor rejected (no award decision was made)
497     */
498       reject_unawarded_active_bids(p_auction_header_id, p_user_id, p_note_to_rejected, l_neg_has_lines);
499 
500       -- Requisitions should be put back into the pool if
501       -- an item has received no bids and the buyer
502       -- is completing the auction
503 
504   IF l_neg_has_lines = 'Y' THEN -- FPK: CPA
505       open items_with_reqs_no_bids(p_auction_header_id);
506       loop
507 
508 	/*
509 		rrkulkar-large-auction-support changes
510 		modified the cursor to simply loop over the exact set of lines
511 		rather than looping over all the lines, and filtering the lines
512 		in the cursor-loop by adding an if condition
513 
514 	*/
515             fetch items_with_reqs_no_bids
516              into x_line_number,
517                   x_line_origination_code;
518             exit when items_with_reqs_no_bids%notfound;
519 
520 	    PON_AUCTION_PKG.CANCEL_NEGOTIATION_REF_BY_LINE(p_auction_header_id, x_line_number, x_error_code);
521 
522       end loop;
523       close items_with_reqs_no_bids;
524 --
525 
526 	/*
527 	rrkulkar-large-auction-support changes
528 	instead of looping over all the lines, we can update all
529 	lines in a single query
530 
531 	*/
532 
533 	/*
534 	rrkulkar-large-auction-support : commented out the call to complete_item_disposition
535 	need to add batching here
536 	*/
537 
538 	    update pon_auction_item_prices_all
539             set    AWARD_STATUS     = 'COMPLETED',
540                    LAST_UPDATE_DATE = sysdate,
541                    AWARDED_QUANTITY = nvl(awarded_quantity,0)
542 	    where auction_header_id = p_auction_header_id;
543 
544   END IF; -- IF l_neg_has_lines = 'Y'
545 --
546   -- if team scoring is enabled, call routine to lock team scoring
547   IF (p_has_scoring_teams_flag = 'Y') THEN
548     -- check to see if the auction was already locked for scoring
549     -- if this were true, the p_scoring_lock_tpc_id will be -1
550     -- as determined in the CompleteAwardAM from where this API is called.
551     IF (p_scoring_lock_tpc_id = -1) THEN
552       NULL;
553     ELSE
554       -- call pvt API to lock scoring
555       IF ( fnd_log.level_unexpected >= fnd_log.g_current_runtime_level) THEN
556         fnd_log.string(log_level => fnd_log.level_unexpected
557                       ,module    => 'pon_award_pkg.complete_award'
558                       ,message   => 'before calling private API to lock team scoring');
559       END IF;
560 
561       PON_TEAM_SCORING_UTIL_PVT.lock_scoring(p_api_version => 1
562 	                                      ,p_auction_header_id => p_auction_header_id
563 	  									  ,p_tpc_id => p_scoring_lock_tpc_id
564 	   									  ,x_return_status => x_return_status
565 										  ,x_msg_data => x_msg_data
566 										  ,x_msg_count => x_msg_count);
567 
568       IF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
569         IF ( fnd_log.level_unexpected >= fnd_log.g_current_runtime_level) THEN
570           fnd_log.string(log_level => fnd_log.level_unexpected
571        	   	        ,module    => 'pon_award_pkg.complete_award'
572                     ,message   => 'Error while locking team scoring');
573         END IF;
574       END IF;
575     END IF;
576   END IF;
577 
578 
579       complete_auction (p_auction_header_id);
580 
581       award_notification (p_auction_header_id_encrypted,
582                           p_auction_header_id,
583                           p_shared_award_decision);
584 
585       -- post processing: originally in reviewComplete.jsp
586       -- For no bids we would come directly to this page.
587       -- Thus setShareAwardDecision will be N. We do not want that.
588       -- As otherwise the button will appear in bidViewAuction
589       -- update database w/ outcome status, source req result,
590       -- and award completion date
591       update pon_auction_headers_all
592          set outcome_status = p_outcome_status,
593              award_complete_date = sysdate,
594              source_reqs_flag = p_source_reqs_flag,
595              share_award_decision = decode(p_no_bids_flag, 'Y', 'I', share_award_decision),
596              last_update_date = sysdate
597        where auction_header_id = p_auction_header_id;
598 
599   -- Raise Business Event
600   PON_BIZ_EVENTS_PVT.RAISE_NEG_AWRD_COMPLETE_EVENT(
601      p_api_version       => 1.0 ,
602      p_init_msg_list     => FND_API.G_FALSE,
603      p_commit            => FND_API.G_FALSE,
604      p_auction_header_id => p_auction_header_id,
605      p_create_po_flag    => p_create_po_flag,
606      x_return_status     => x_return_status,
607      x_msg_count         => x_msg_count,
608      x_msg_data          => x_msg_data);
609 
610 END complete_award;
611 
612 ----------------------------------------------------------------
613 -- complete auction
614 -- mirrors NegotiationDoc.completeAuction which is gone after
615 -- migration to OA
616 ----------------------------------------------------------------
617 
618 PROCEDURE complete_auction (p_auction_header_id     IN NUMBER ) IS
619 
620 x_event_id pon_auction_headers_all.event_id%type;
621 x_count NUMBER;
622 
623 BEGIN
624         -- complete auction header disposition
625 	-- clear out the request_id for super-large auctions
626 	update pon_auction_headers_all
627            set AWARD_STATUS = 'COMPLETED',
628                AUCTION_STATUS = 'AUCTION_CLOSED',
629 	       REQUEST_ID  = NULL,
630                LAST_UPDATE_DATE = sysdate
631 	 where auction_header_id = p_auction_header_id;
632 
633         -- complete work flow
634         pon_auction_pkg.COMPLETE_AUCTION(p_auction_header_id);
635 
636 END complete_auction;
637 
638 ----------------------------------------------------------------
639 -- send award notifications
640 -- mirrors NegotiationDoc.awardNotification which is gone after
641 -- migration to OA
642 ----------------------------------------------------------------
643 
644 PROCEDURE award_notification (p_auction_header_id_encrypted IN VARCHAR2,
645                               p_auction_header_id           IN NUMBER,
646                               p_shared_award_decision       IN VARCHAR2) IS
647 
648 x_bid_number pon_bid_headers.bid_number%type;
649 x_bid_tp_contact_name pon_bid_headers.trading_partner_contact_name%type;
650 x_auction_tp_name pon_auction_headers_all.trading_partner_name%type;
651 x_auction_title pon_auction_headers_all.auction_title%type;
652 
653 CURSOR all_bidders(p_auction_header_id NUMBER) IS
654     select b.bid_number,
655            b.trading_partner_contact_name contact,
656            a.trading_partner_name auctioneer,
657            a.auction_title
658       from pon_bid_headers b,
659            pon_auction_headers_all a
660      where b.auction_header_id = p_auction_header_id
661        and not nvl(b.bid_status,'NONE') in ('ARCHIVED','DISQUALIFIED')
662        and a.auction_header_id = b.auction_header_id;
663 
664 BEGIN
665 
666     if (p_shared_award_decision = 'Y') then
667 
668        -- send a notification to each supplier
669        open all_bidders(p_auction_header_id);
670        loop
671             fetch all_bidders
672              into x_bid_number,
673                   x_bid_tp_contact_name,
674                   x_auction_tp_name,
675                   x_auction_title;
676             exit when all_bidders%notfound;
677 
678             pon_auction_pkg.AWARD_BID(x_bid_number,
679                                       p_auction_header_id,
680                                       x_bid_tp_contact_name,
681                                       x_auction_tp_name,
682                                       x_auction_title,
683                                       p_auction_header_id_encrypted);
684        end loop;
685        close all_bidders;
686 
687        -- update pon_auction_headers_all
688        update pon_auction_headers_all
689           set SHARE_AWARD_DECISION = p_shared_award_decision
690         where auction_header_id = p_auction_header_id;
691 
692     end if;
693 
694 END award_notification;
695 
696 ----------------------------------------------------------------
697 -- complete item disposition
698 -- mirrors NegotiationItem.completeDisposition which is gone after
699 -- migration to OA
700 ----------------------------------------------------------------
701 
702 PROCEDURE  complete_item_disposition  (p_auction_header_id     IN NUMBER,
703                                        p_line_number           IN NUMBER,
704                                        p_award_quantity        IN NUMBER) IS
705 
706 BEGIN
707 	    update pon_auction_item_prices_all
708                set AWARD_STATUS = 'COMPLETED',
709                    LAST_UPDATE_DATE = sysdate,
710                    AWARDED_QUANTITY = p_award_quantity
711 	     where auction_header_id = p_auction_header_id
712 	       and line_number = p_line_number;
713 
714 END complete_item_disposition;
715 
716 
717 ----------------------------------------------------------------
718 -- award item disposition
719 -- mirrors complete_item_disposition
720 -- except that pon_auction_item_prices_all.award_status column is set to AWARDED (instead of COMPLETED)
721 ----------------------------------------------------------------
722 
723 PROCEDURE  award_item_disposition  (p_auction_header_id     IN NUMBER,
724                                        p_line_number           IN NUMBER,
725                                        p_award_quantity        IN NUMBER) IS
726 
727 BEGIN
728 	    update pon_auction_item_prices_all
729                set AWARD_STATUS = 'AWARDED',
730                    LAST_UPDATE_DATE = sysdate,
731                    AWARDED_QUANTITY = p_award_quantity
732 	     where auction_header_id = p_auction_header_id
733 	       and line_number = p_line_number;
734 
735 END award_item_disposition;
736 
737 --
738 ----------------------------------------------------------------
739 -- handles awarding for award by quote, award by line, award line
740 -- procedure added by snatu on 08/15/03
741 -- Coded for FPJ
742 ----------------------------------------------------------------
743 PROCEDURE award_auction
744 ( p_auctioneer_id     IN  NUMBER
745 , p_auction_header_id IN  NUMBER
746 , p_last_update_date  IN  DATE
747 , p_mode              IN  VARCHAR2
748 , p_line_num          IN  NUMBER
749 , p_award_table       IN  PON_AWARD_TABLE
750 , p_note_to_accepted  IN  VARCHAR2
751 , p_note_to_rejected  IN  VARCHAR2
752 , p_batch_id          IN  NUMBER
753 , x_status            OUT NOCOPY VARCHAR2
754 )
755 IS
756 --
757 l_counter BINARY_INTEGER;
758 l_size    NUMBER;
759 l_index   BINARY_INTEGER;
760 l_rec     PON_AWARD_REC;
761 --
762 l_award_lines  t_award_lines;
763 -- FPK: CPA
764 l_awarded_bid_headers t_awarded_bid_headers;
765 l_neg_has_lines PON_AUCTION_HEADERS_ALL.HAS_ITEMS_FLAG%TYPE;
766 
767 l_matrix_index NUMBER;
768 --
769 l_current_bid_number           NUMBER;
770 l_bid_list_index               NUMBER;
771 l_tmp_award_quantity           NUMBER;
772 l_group_type                   pon_auction_item_prices_all.group_type%TYPE;
773 l_award_date                   DATE;
774 TYPE BID_LIST_TYPE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
775 l_bid_list                     BID_LIST_TYPE;
776 l_winning_bid		       NUMBER;
777 l_neg_contract_type 		pon_auction_headers_all.contract_type%TYPE;
778 
779 --
780 l_has_quantity_tiers        pon_auction_item_prices_all.has_quantity_tiers%TYPE;
781 l_award_shipment_number     NUMBER;
782 l_suffix                    VARCHAR2(2);
783 
784 --
785 BEGIN
786 --
787 --
788 IF (g_debug_mode = 'Y') THEN
789     IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
790        FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.AWARD_AUCTION', 'Entering procedure with p_auctioneer_id: ' || p_auctioneer_id );
791        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);
792        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 );
793      END IF;
794 END IF;
795 
796 l_neg_has_lines := PON_AUCTION_PKG.neg_has_lines(p_auction_header_id);
797 
798 select contract_type
799 into l_neg_contract_type
800 from pon_auction_headers_all
801 where auction_header_id = p_auction_header_id
802 and rownum =1;
803 
804 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
805    FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.AWARD_AUCTION.AUCTION_ID:' || p_auction_header_id,'START');
806 END IF;
807 --
808   l_matrix_index := 0;
809   l_award_date := SYSDATE;
810 --
811   IF (p_mode = g_AWARD_QUOTE) THEN
812 
813   	 clear_draft_awards (p_auction_header_id, p_line_num, l_award_date, p_auctioneer_id, l_neg_has_lines);
814 
815 	 /* update auction-header by nulling out the request-id */
816 
817 	 update pon_auction_headers_all
818 	 set    request_id = to_number(null)
819 	 where  auction_header_id = p_auction_header_id;
820 
821   	 -- Need to expand all the AWARDED bids to build the lines
822 	 l_size := p_award_table.COUNT;
823 	 FOR l_index IN 1..l_size LOOP -- Loop through all the bids
824      	 l_rec := p_award_table(l_index);
825 	 -- Construct Matrix only in case of awarded bids
826 	 IF l_rec.award_outcome = g_AWARD_OUTCOME_WIN THEN
827 
828 	    IF l_neg_has_lines = 'Y' THEN -- FPK: CPA
829 
830 		l_winning_bid := l_rec.bid_number;
831 
832 		update_all_bid_item_prices(l_winning_bid, get_award_status(l_rec.award_outcome), l_award_date, p_auctioneer_id);
833 
834 		if(l_neg_contract_type in ('BLANKET', 'CONTRACT')) then
835 			update_all_auction_item_prices(p_auction_header_id, l_winning_bid, l_award_date, p_auctioneer_id);
836 		end if;
837 
838 		ELSE -- negotiation does not have lines
839 			 -- Build table of active bids.
840 	         -- All the bids will have one of the award outcome status: win, lose or no award.
841 	               l_matrix_index := l_matrix_index + 1;
842 		       l_awarded_bid_headers(l_matrix_index).bid_number := l_rec.bid_number;
843 		       l_awarded_bid_headers(l_matrix_index).award_status := get_award_status(l_rec.award_outcome);
844 		       l_awarded_bid_headers(l_matrix_index).award_date := l_award_date;
845 	    END IF;
846 
847 		 --update total agreed amount (if any)
848 		 IF l_rec.total_agreement_amount is not null THEN
849 		 	UPDATE pon_bid_headers
850 			SET po_agreed_amount = l_rec.total_agreement_amount
851 			WHERE bid_number = l_rec.bid_number;
852 		 END IF;
853 	END IF; -- IF l_rec.award_outcome = g_AWARD_OUTCOME_WIN
854 		 -- update notes
855 		 update_notes_for_bid(l_rec.bid_number, l_rec.note_to_supplier, l_rec.internal_note, p_auctioneer_id);
856      END LOOP;
857 
858         -- outside the loop, update all auction_lines
859         -- in case of BPA outcome, we can award multiple bids -> but we will update
860         -- all auction lines just once
861 
862 	IF (l_neg_has_lines = 'Y') THEN
863 	   IF (l_neg_contract_type <> 'BLANKET' and l_neg_contract_type <> 'CONTRACT') THEN
864 	      update_all_auction_item_prices(p_auction_header_id, l_winning_bid, l_award_date, p_auctioneer_id);
865 	   END IF;
866 	END IF;
867 
868 
869   END IF ;
870 --
871   IF (p_mode = g_AWARD_MULTIPLE_LINES) THEN --{
872   	 clear_draft_awards (p_auction_header_id, p_line_num, l_award_date, p_auctioneer_id, l_neg_has_lines);
873   	 -- Need to set award quantity and award_status
874 	 l_size := p_award_table.COUNT;
875 	 l_current_bid_number := -1;
876 --
877 	 FOR l_index IN 1..l_size LOOP -- Loop through all the bids
878      	 l_rec := p_award_table(l_index);
879 		 -- Construct Matrix only in case of awarded bids
880 		 IF l_rec.award_outcome = g_AWARD_OUTCOME_WIN THEN
881 		      --Get Award Qty FROM Response Qty
882 		     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
883                      FROM pon_bid_item_prices bi, pon_auction_item_prices_all ai
884                      WHERE bi.bid_number = l_rec.bid_number
885                      AND bi.line_number = l_rec.line_number
886                      AND ai.auction_header_id = bi.auction_header_id
887                      AND ai.line_number = bi.line_number;
888 --
889 		     SELECT ai.group_type INTO l_group_type
890 			 FROM pon_bid_item_prices bi, pon_auction_item_prices_all ai
891    			 WHERE bi.bid_number = l_rec.bid_number
892                          AND bi.line_number = l_rec.line_number
893                          AND ai.auction_header_id = bi.auction_header_id
894 			 AND ai.line_number = bi.line_number;
895 --
896 		 	 l_matrix_index := l_matrix_index + 1;
897 			 l_award_lines(l_matrix_index).bid_number := l_rec.bid_number;
898 			 l_award_lines(l_matrix_index).line_number := l_rec.line_number;
899 			 l_award_lines(l_matrix_index).award_status := get_award_status(l_rec.award_outcome);
900 		 	 l_award_lines(l_matrix_index).award_quantity := l_tmp_award_quantity;
901  		 	 l_award_lines(l_matrix_index).award_date := l_award_date;
902                          l_award_lines(l_matrix_index).group_type := l_group_type;
903 		 END IF;
904 	   	 -- Update Internal Notes and Notes to Suppliers for each bid
905 		 IF (l_current_bid_number <> l_rec.bid_number) THEN
906  	 	 	update_notes_for_bid(l_rec.bid_number, l_rec.note_to_supplier, l_rec.internal_note, p_auctioneer_id);
907 		    --update total agreed amount (if any)
908 			IF l_rec.total_agreement_amount is not null THEN
909 			   UPDATE pon_bid_headers
910 			   SET po_agreed_amount = l_rec.total_agreement_amount
911 			   WHERE bid_number = l_rec.bid_number;
912 			END IF;
913 
914 			l_current_bid_number := l_rec.bid_number;
915 		 END IF;
916 	 END LOOP;
917   END IF; --}
918 --
919   IF ((p_mode = g_AWARD_LINE) OR (p_mode = g_AWARD_LINE_H)
920     OR(p_mode = g_AWARD_GROUP) OR (p_mode =  g_AWARD_GROUP_H)) THEN --{
921 --
922          -- First, REJECT the group line level awards - No cumulative awards
923          IF (p_mode = g_AWARD_GROUP) THEN
924             clear_draft_awards (p_auction_header_id, p_line_num, l_award_date,
925                                 p_auctioneer_id, l_neg_has_lines);
926          END IF;
927 --
928 	 l_bid_list_index := 0;
929          SELECT ai.group_type INTO l_group_type
930 	 FROM pon_auction_item_prices_all ai
931    	 WHERE ai.auction_header_id = p_auction_header_id
932 	 AND ai.line_number = p_line_num;
933 --
934      -- Getting the suffix to display the error message correctly.
935      l_suffix := PON_LARGE_AUCTION_UTIL_PKG.GET_DOCTYPE_SUFFIX (p_auction_header_id);
936 
937      -- Need to set award quantity and award_status
938 	 l_size := p_award_table.COUNT;
939 	 FOR l_index IN 1..l_size LOOP -- Loop through all the bids
940      	l_rec := p_award_table(l_index);
941 
942         --R12.1 price tiers changes
943         select nvl(has_quantity_tiers,'N') into l_has_quantity_tiers
944         from pon_bid_item_prices
945         where bid_number = l_rec.bid_number
946         and line_number = p_line_num;
947 
948         IF (g_debug_mode = 'Y') THEN
949             IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
950                   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);
951             END IF;
952         END IF;
953 
954 	    -- Construct Matrix in any case (WIN/LOSR)
955 	 	l_matrix_index := l_matrix_index +1;
956 		l_award_lines(l_matrix_index).bid_number := l_rec.bid_number;
957 		l_award_lines(l_matrix_index).line_number := p_line_num; --l_rec.line_number;
958 		l_award_lines(l_matrix_index).award_status := get_award_status(l_rec.award_outcome);
959  	    l_award_lines(l_matrix_index).award_date := l_award_date;
960  	    l_award_lines(l_matrix_index).group_type := l_group_type;
961 --
962 		IF l_rec.award_outcome = g_AWARD_OUTCOME_WIN THEN --{
963 
964 		    /*
965 		     R12.1 Quantity based price tiers changes
966 		     If quantity tiers are present for a line and award quantity is not null
967 		     validating if award qty falls within the quantity tiers specified by the supplier
968 		     Update the award shipment number acoordingly.
969 		    */
970 
971 		   IF ( 'Y' = l_has_quantity_tiers AND l_rec.award_quantity IS NOT NULL)
972 		   THEN  --{
973 		        l_award_shipment_number := -1;
974 
975 		        select nvl((select pbs.shipment_number
976 		        from pon_bid_shipments pbs, pon_auction_item_prices_all paip
977 		        where pbs.bid_number = l_rec.bid_number
978 		        and pbs.line_number = p_line_num
979 		        AND l_rec.award_quantity >= pbs.quantity
980 		        AND l_rec.award_quantity <= pbs.max_quantity
981 		        AND paip.auction_header_id = pbs.auction_header_id
982 		        AND paip.line_number = pbs.line_number ),-1)
983 		        into l_award_shipment_number from dual;
984 
985 	                IF (g_debug_mode = 'Y') THEN
986         	            IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
987                 	           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.AWARD_AUCTION', 'award_shipment_number ' || l_award_shipment_number);
988 	                    END IF;
989         	        END IF;
990 
991 			IF ( l_award_shipment_number = -1) THEN --{
992 		        	-- Insert errors in interface table.
993 		                INSERT INTO PON_INTERFACE_ERRORS(
994 		                                              batch_id
995 		                                            , column_name
996 		                                            , error_message_name
997         		                                    , table_name
998                 		                            , INTERFACE_LINE_ID
999                         		                    , expiration_date
1000 		                                            , created_by
1001         		                                    , creation_date
1002                 		                            , last_updated_by
1003 		                                            , last_update_date
1004 		                                            , last_update_login
1005         		                                    , TOKEN1_NAME
1006                 		                            , TOKEN1_VALUE
1007                         		                    )
1008 				                    Values(
1009                 		                                p_batch_id
1010                         		                        , fnd_message.get_string('PON','PON_AUCTION_AWARD_QTY')
1011 		                                                , 'PON_QUANTITY_TIER_VIOLATION' || l_suffix
1012 		                                                , 'PON_BID_ITEM_PRICES'
1013 		                                                , p_line_num
1014 		                                                , SYSDATE+7
1015         		                                        , fnd_global.user_id
1016 		                                                , sysdate
1017 		                                                , fnd_global.user_id
1018         		                                        , sysdate
1019                 		                                , fnd_global.login_id
1020 		                                                , 'BID_NUM'
1021 		                                                , l_rec.bid_number
1022         		                                        );
1023 
1024 
1025 		                x_status := 'FAILURE';
1026 
1027                         	IF (g_debug_mode = 'Y') THEN
1028 	                            IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1029         	                            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');
1030                 	                    FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT,' award_quantity: '||l_rec.award_quantity,'Quantity Tier Violation');
1031                         	    END IF;
1032 	                        END IF;
1033 		       --} End of l_shipment_number = -1
1034 		        ELSE --{ START of l_award_shipment_number != -1,
1035 
1036 		            --
1037 		            -- Award qty falls withtin the quantity specified by the supplier.
1038 		            -- saving the corresponding shipment number
1039 		            --
1040 		            l_award_lines(l_matrix_index).award_shipment_number := l_award_shipment_number;
1041 
1042 		        END IF; --} END of l_award_shipment_number != -1,
1043 		   --} End of has_quantity_tiers='Y' and award_quantity not null
1044 		   ELSE --{ Start of has_quantity_tiers <> 'Y' or award_quantity <> null
1045 
1046 		    --
1047 		    -- Line does not have quantity tiers so setting the default value as -1.
1048 		    --
1049 		    l_award_lines(l_matrix_index).award_shipment_number := -1;
1050 
1051 		   END IF; --} End of has_quantity_tiers <> 'Y' or award_quantity <> null ; END of Quantity tiers loop
1052 
1053 		   l_award_lines(l_matrix_index).award_quantity := l_rec.award_quantity;
1054                    l_award_lines(l_matrix_index).note_to_supplier := p_note_to_accepted;
1055 
1056 		--} End of award_outcome_win
1057 		ELSE --{ Start of award_outcome_lose
1058 
1059 		    IF ((x_status is NULL) OR (x_status = 'SUCCESS')) THEN --{
1060 		        l_award_lines(l_matrix_index).award_quantity := null;
1061 		        l_award_lines(l_matrix_index).note_to_supplier := p_note_to_rejected;
1062 		    END IF; --}
1063 
1064 		END IF; --} End of award_outcome_lose
1065 
1066 		--Update Notes only in case of Award Line V Page and NOT for Award Line H Page
1067 		IF ((p_mode = g_AWARD_LINE OR p_mode = g_AWARD_GROUP) AND ((x_status is NULL) OR (x_status = 'SUCCESS'))) THEN
1068  	 	   update_notes_for_bid(l_rec.bid_number, l_rec.note_to_supplier, l_rec.internal_note, p_auctioneer_id);
1069 		END IF;
1070 	   	 -- Add new bid to the array
1071 		l_bid_list_index := l_bid_list_index + 1;
1072 		l_bid_list(l_bid_list_index) := l_rec.bid_number;
1073 --
1074 	 END LOOP;
1075   END IF; --}
1076 --
1077 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1078    FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.AWARD_AUCTION.AUCTION_ID:' || p_auction_header_id,'MATRIX BUILT');
1079 END IF;
1080 --
1081 -- Clears the award history in case any for this auction
1082   IF (p_mode = g_AWARD_QUOTE) or (p_mode = g_AWARD_MULTIPLE_LINES) THEN --{
1083 
1084         IF l_neg_has_lines = 'Y' THEN -- FPK: CPA
1085 	  IF(p_mode = g_AWARD_MULTIPLE_LINES) THEN
1086 	     update_bid_item_prices(p_auction_header_id,l_award_lines,p_auctioneer_id, p_mode);
1087           END IF;
1088 	END IF;
1089 
1090 	  update_bid_headers(p_auction_header_id, p_auctioneer_id, l_awarded_bid_headers, l_neg_has_lines);
1091 
1092 	IF l_neg_has_lines = 'Y' THEN -- FPK: CPA
1093           IF(p_mode = g_AWARD_MULTIPLE_LINES) THEN
1094 	    update_auction_item_prices(p_auction_header_id, null, l_award_date, p_auctioneer_id, p_mode);
1095 	  END IF;
1096 	END IF;
1097 
1098 	update_auction_headers(p_auction_header_id, p_mode, l_award_date, p_auctioneer_id, l_neg_has_lines);
1099 
1100         IF l_neg_has_lines = 'Y' THEN  -- FPK: CPA
1101 
1102 	    bulk_update_pon_acceptances(
1103 	  			p_auction_header_id,
1104 	  			null, null, null,
1105 				l_award_date, p_auctioneer_id, p_mode);
1106 	END IF;
1107    --}
1108    ELSE --{
1109 	  update_bid_item_prices(p_auction_header_id,l_award_lines,p_auctioneer_id, p_mode);
1110 	  l_size := l_bid_list.count;
1111 	  FOR l_index IN 1..l_size LOOP
1112 	  	  update_single_bid_header(l_bid_list(l_index),p_auctioneer_id);
1113 	  END LOOP;
1114 	  update_auction_item_prices(p_auction_header_id,p_line_num, l_award_date, p_auctioneer_id, p_mode);
1115 	  update_auction_headers(p_auction_header_id, p_mode, l_award_date, p_auctioneer_id, l_neg_has_lines);
1116 	  bulk_update_pon_acceptances(
1117 	           p_auction_header_id, p_line_num,
1118 			   p_note_to_accepted, p_note_to_rejected,
1119 			   l_award_date, p_auctioneer_id, p_mode);
1120   End IF; --}
1121 --
1122 --
1123 --
1124 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1125    FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.AWARD_AUCTION.AUCTION_ID:' || p_auction_header_id,'READY_TO_COMMIT');
1126 END IF;
1127 --
1128 
1129 /*  check if the auction has been modified by some other user
1130     If it has been modified, status returns failure
1131     else this is the only user modifying hte auction
1132     changes are committed to the database in the middle tier
1133 */
1134    IF (((x_status is NULL) OR (x_status = 'SUCCESS')) AND (is_auction_not_updated (p_auction_header_id, p_last_update_date))) THEN
1135       x_status := 'SUCCESS';
1136 	  -- update the last update date
1137 	  UPDATE pon_Auction_headers_all
1138 	  SET last_update_date = SYSDATE
1139 	  WHERE auction_header_id = p_auction_header_id;
1140 	  --
1141 		IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1142 		   FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.AWARD_AUCTION.AUCTION_ID:' || p_auction_header_id,'SUCCEEDED');
1143 		END IF;
1144       --
1145    ELSE
1146       x_status := 'FAILURE';
1147 		--
1148 		IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1149 		   FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.AWARD_AUCTION.AUCTION_ID:' || p_auction_header_id,'FAILED');
1150 		END IF;
1151 		--
1152    END IF;
1153 --
1154 END award_auction;
1155 --
1156 --
1157 PROCEDURE update_bid_item_prices
1158 (
1159 	p_auction_id    IN NUMBER,
1160 	p_award_lines   IN t_award_lines,
1161 	p_auctioneer_id IN NUMBER,
1162 	p_mode          IN VARCHAR2
1163 )
1164 IS
1165 l_size NUMBER;
1166 l_index NUMBER;
1167 l_group_type pon_auction_item_prices_all.group_type%type;
1168 l_award_quantity pon_bid_item_prices.award_quantity%type;
1169 l_award_shipment_number NUMBER;
1170 --
1171 /* for updating group for each bid's group line,
1172    we maintain an associative array (hashmap equivalant)
1173    in the form of (bid:group_number  ==> 1234:56
1174    and once all bid lines are updated, we traverse through this map
1175    and update the required bid groups
1176 */
1177 type bid_line_asso is table of varchar2(30) index by varchar2(30);
1178 l_bid_group_map bid_line_asso;
1179 l_bid_line_key VARCHAR2(30);
1180 l_parent_line_number pon_auction_item_prices_all.parent_line_number%type;
1181 l_bid_number pon_bid_item_prices.bid_number%type;
1182 --
1183 BEGIN
1184 
1185   IF (g_debug_mode = 'Y') THEN
1186      IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1187           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);
1188       END IF;
1189   END IF;
1190 
1191   l_size := p_award_lines.COUNT;
1192   -- Loop through the matrix to update bid items and acceptances
1193   FOR l_index IN 1..l_size LOOP
1194          l_group_type := p_award_lines(l_index).group_type;
1195          IF (l_group_type = 'GROUP') THEN
1196            l_award_quantity := null;
1197          ELSE
1198            l_award_quantity := p_award_lines(l_index).award_quantity;
1199            l_award_shipment_number := p_award_lines(l_index).award_shipment_number;
1200          END IF;
1201 
1202          IF (g_debug_mode = 'Y') THEN
1203             IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1204                  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);
1205              END IF;
1206          END IF;
1207 
1208          --
1209          -- Price Tiers Changes. If quantity based price tiers are present call the upd_single_bid_item_prices_qt
1210          -- Api which takes the unit price from pon_bid_shipments according to awarded shipment number.
1211          --
1212 
1213          IF ( l_award_shipment_number IS NULL OR
1214               l_award_shipment_number = -1 ) THEN --{
1215             update_single_bid_item_prices
1216             (
1217                 p_award_lines(l_index).bid_number,
1218                 p_award_lines(l_index).line_number,
1219                 p_award_lines(l_index).award_status,
1220                 l_award_quantity,
1221                 p_award_lines(l_index).award_date,
1222                 p_auctioneer_id
1223             );
1224          ELSE
1225 
1226          -- Quantity Tiers Case.
1227            upd_single_bid_item_prices_qt
1228            (
1229                 p_award_lines(l_index).bid_number,
1230                 p_award_lines(l_index).line_number,
1231                 p_award_lines(l_index).award_status,
1232                 l_award_quantity,
1233                 p_award_lines(l_index).award_date,
1234                 p_auctioneer_id,
1235                 l_award_shipment_number
1236            );
1237          END IF; --}
1238 
1239 --
1240 	   IF (      (p_mode = g_AWARD_MULTIPLE_LINES AND l_group_type = 'LOT')
1241 	          OR (p_mode = g_AWARD_LINE AND l_group_type = 'LOT')
1242 		  OR (p_mode = g_AWARD_LINE_H AND l_group_type = 'LOT')
1243                   OR (p_mode = g_AWARD_AUTO_RECOMMEND AND l_group_type = 'LOT')
1244                   OR (p_mode = g_AWARD_GROUP_H AND l_group_type = 'GROUP')
1245 		  OR (p_mode = g_AWARD_GROUP AND l_group_type = 'GROUP') ) THEN
1246 		  award_bi_subline (
1247                         p_auction_id,
1248 		        p_award_lines(l_index).bid_number,
1249 			p_award_lines(l_index).line_number,
1250 			p_award_lines(l_index).award_status,
1251 			p_award_lines(l_index).award_date,
1252 			p_auctioneer_id );
1253           ELSIF ( (p_mode = g_AWARD_MULTIPLE_LINES OR p_mode = g_AWARD_LINE
1254                 OR p_mode = g_AWARD_LINE_H OR p_mode= g_AWARD_AUTO_RECOMMEND)
1255 	        AND (l_group_type = 'GROUP_LINE') ) THEN
1256 
1257                    -- get parent line number
1258                    SELECT parent_line_number INTO l_parent_line_number
1259                    FROM pon_auction_item_prices_all
1260                    WHERE auction_header_id = p_auction_id
1261                    AND line_number = p_award_lines(l_index).line_number;
1262 
1263                   /* Key will be bid:group 1234:56 */
1264                   l_bid_line_key := to_char(p_award_lines(l_index).bid_number) || ':' || to_char(l_parent_line_number);
1265                   IF NOT (l_bid_group_map.exists(l_bid_line_key)) THEN
1266                     l_bid_group_map(l_bid_line_key) := l_bid_line_key;
1267                   END IF;
1268 	   END IF;
1269   END LOOP;
1270   l_bid_line_key := l_bid_group_map.FIRST;
1271   WHILE l_bid_line_key IS NOT NULL LOOP
1272     -- update bid group
1273     l_bid_number := to_number(SUBSTR(l_bid_line_key ,1, instr(l_bid_line_key, ':') -1 ));
1274     l_parent_line_number := to_number(SUBSTR(l_bid_line_key, instr(l_bid_line_key, ':') +1));
1275                  -- update parent group
1276                   update_bi_group_award(
1277                         p_auction_id,
1278                         l_bid_number,
1279                         l_parent_line_number,
1280                         sysdate,
1281                         p_auctioneer_id
1282                         );
1283 
1284     l_bid_line_key := l_bid_group_map.NEXT(l_bid_line_key);
1285   END LOOP;
1286 
1287   IF (g_debug_mode = 'Y') THEN
1288      IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1289           FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPDATE_BID_ITEM_PRICES', 'Returning to the caller.....');
1290       END IF;
1291   END IF;
1292 
1293 EXCEPTION
1294   WHEN OTHERS THEN
1295       IF (g_debug_mode = 'Y') THEN
1296          IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1297               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.....');
1298           END IF;
1299       END IF;
1300   RAISE;
1301 --
1302 END update_bid_item_prices;
1303 --
1304 --
1305 PROCEDURE update_single_bid_item_prices
1306 (
1307  p_bid_number     IN NUMBER,
1308  p_line_number    IN NUMBER,
1309  p_award_status   IN VARCHAR2,
1310  p_award_quantity IN NUMBER,
1311  p_award_date     IN DATE,
1312  p_auctioneer_id  IN NUMBER
1313 )
1314 IS
1315 l_award_price   NUMBER;
1316 BEGIN
1317 
1318         IF (g_debug_mode = 'Y') THEN
1319             IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1320 
1321                 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);
1322 
1323                 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);
1324 
1325                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPDATE_SINGLE_BID_ITEM_PRICES',' ;p_award_status : ' || p_award_status);
1326 
1327             END IF;
1328         END IF;
1329 
1330         --
1331         -- Cost Factors Enhancements
1332         -- If award_quantity is not zero or null then use the per unit and fixed amount component and award
1333         -- quantity to calculate the award price
1334         --
1335         SELECT decode(p_award_status, 'REJECTED', null,
1336                       decode(nvl(p_award_quantity,0), 0,pbip.price,
1337                             pbip.per_unit_price_component + pbip.fixed_amount_component /p_award_quantity))
1338         INTO l_award_price
1339         FROM pon_bid_item_prices pbip,
1340             pon_auction_item_prices_all paip
1341         WHERE pbip.bid_number = p_bid_number
1342         AND pbip.line_number = p_line_number
1343         AND paip.auction_header_id = pbip.auction_header_id
1344         AND paip.line_number = pbip.line_number;
1345 
1346         IF (g_debug_mode = 'Y') THEN
1347             IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1348                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPDATE_SINGLE_BID_ITEM_PRICES', 'award_price: ' || l_award_price);
1349             END IF;
1350         END IF;
1351 
1352   	  --
1353       -- as this procedure will be called only if price tiers are not applicable so reseting the award_Shipment_number
1354       --
1355   	  UPDATE PON_BID_ITEM_PRICES
1356 	  SET award_quantity = p_award_quantity,
1357 		  award_price = l_award_price,
1358 	      award_status = p_award_status,
1359 		  award_date = p_award_date,
1360 		  last_update_date = p_award_date,
1361 		  last_updated_by = p_auctioneer_id,
1362 		  award_shipment_number = NULL
1363 	  WHERE Bid_number =  p_bid_number AND
1364 	        Line_Number = p_line_number;
1365 
1366         IF (g_debug_mode = 'Y') THEN
1367             IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1368                 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....');
1369             END IF;
1370         END IF;
1371 
1372 END update_single_bid_item_prices;
1373 
1374 /*==========================================================================================================================
1375  * PROCEDURE : upd_single_bid_item_prices_qt
1376  * PARAMETERS:  1. p_bid_number - bid number for which the award_price and shipment no to be updated.
1377  *              2. p_line_number - corresponding line number
1378  *              3. p_award_status - award status 'AWARDED' or 'REJECTED'
1379  *              4. p_award_quantity - The quantity awarded
1380  *              5. p_award_date -- Award Datw
1381  *              6. p_auctioneer_id - Id of person who is saving award
1382  *              7. p_award_shipment_number - Quantity awarded falls in the tiers range corresponding to the shipment number
1383  * COMMENT   : This procedure calculates the award price based on the per unit and fixed amount component and
1384  *               corresponding to the award shipment number. PON_BID_ITEM_PRICES is updated accordingly
1385  *==========================================================================================================================*/
1386 PROCEDURE upd_single_bid_item_prices_qt
1387 (
1388  p_bid_number     IN NUMBER,
1389  p_line_number    IN NUMBER,
1390  p_award_status   IN VARCHAR2,
1391  p_award_quantity IN NUMBER,
1392  p_award_date     IN DATE,
1393  p_auctioneer_id  IN NUMBER,
1394  p_award_shipment_number IN NUMBER
1395 )
1396 IS
1397  l_award_price   NUMBER;
1398 BEGIN
1399 
1400     IF (g_debug_mode = 'Y') THEN
1401         IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1402             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);
1403             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);
1404             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);
1405         END IF;
1406     END IF;
1407 
1408     --
1409     -- Cost Factors Enhancements
1410     -- If award_quantity is not zero or null then use the per unit and fixed amount component and award
1411     -- quantity to calculate the award price
1412     --
1413 
1414     SELECT DECODE(p_award_status, 'REJECTED', NULL,
1415                    DECODE (NVL(p_award_quantity,0), 0, pbs.price,
1416                         pbs.per_unit_price_component+pbip.fixed_amount_component/p_award_quantity))
1417     INTO l_award_price
1418     FROM pon_bid_item_prices pbip,
1419         pon_auction_item_prices_all paip,
1420         pon_bid_shipments pbs
1421     WHERE pbip.bid_number = p_bid_number
1422     AND pbip.line_number = p_line_number
1423     AND paip.auction_header_id = pbip.auction_header_id
1424     AND paip.line_number = pbip.line_number
1425     AND pbs.bid_number = pbip.bid_number
1426     AND pbs.line_number = pbip.line_number
1427     AND pbs.shipment_number = p_award_shipment_number;
1428 
1429     IF (g_debug_mode = 'Y') THEN --{
1430         IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN --}
1431             FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'pon.plsql.PON_AWARD_PKG.UPD_SINGLE_BID_ITEM_PRICES_QT', 'award_price: ' || l_award_price);
1432         END IF; --}
1433     END IF; --}
1434 
1435     UPDATE PON_BID_ITEM_PRICES
1436     SET award_quantity = p_award_quantity,
1437         award_status = p_award_status,
1438         award_date = p_award_date,
1439         last_update_date = p_award_date,
1440         last_updated_by = p_auctioneer_id,
1441         award_price = l_award_price,
1442         award_shipment_number = p_award_shipment_number
1443     WHERE Bid_number =  p_bid_number AND
1444         Line_Number = p_line_number;
1445 
1446     IF (g_debug_mode = 'Y') THEN
1447         IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1448             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....');
1449         END IF;
1450     END IF;
1451 
1452 END upd_single_bid_item_prices_qt;
1453 
1454 --
1455 --
1456 PROCEDURE update_bid_headers
1457 (
1458 p_auction_id           IN NUMBER,
1459 p_auctioneer_id        IN NUMBER,
1460 p_awarded_bid_headers  IN t_awarded_bid_headers DEFAULT t_emptytbl, -- FPK: CPA
1461 p_neg_has_lines        IN VARCHAR2                                  -- FPK: CPA
1462 )
1463 IS
1464 --
1465 CURSOR c_active_bids (c_auction_id NUMBER) is
1466     SELECT bh.bid_number
1467 	FROM pon_bid_headers bh
1468    	WHERE bh.auction_header_id = c_auction_id
1469 	AND bid_status = 'ACTIVE';
1470 
1471 l_active_bids_rec c_active_bids%ROWTYPE;
1472 
1473 -- FPK: CPA
1474 l_index             PLS_INTEGER;
1475 l_bid_headers_count PLS_INTEGER :=0;  -- generic pon_bid_headers index
1476 
1477 -- Declaration of individual elements to avoid ORA-3113 error because
1478 -- FORALL does not allow update of elements using rec(i).field
1479 l_bid_number_tbl    Number_tbl_type;
1480 l_award_status_tbl  Char25_tbl_type;
1481 l_award_date_tbl    Date_tbl_type;
1482 --
1483 BEGIN
1484 IF p_neg_has_lines = 'Y' THEN -- FPK: CPA
1485 	OPEN c_active_bids (p_auction_id);
1486 	LOOP
1487 		FETCH c_active_bids into l_active_bids_rec;
1488 		EXIT WHEN c_active_bids%NOTFOUND;
1489     	update_single_bid_header (l_active_bids_rec.bid_number,
1490 		                  p_auctioneer_id );
1491 	END LOOP;
1492 	CLOSE c_active_bids;
1493 ELSE -- negotiation does not have lines
1494 	 -- Loop through the matrix to update bid headers
1495    -- Map all values into single table arrays to avoid Oracle errors
1496    -- caused by using rec(i).field
1497    IF p_awarded_bid_headers.count > 0 THEN
1498     FOR l_index IN p_awarded_bid_headers.first..p_awarded_bid_headers.last
1499     LOOP
1500      l_bid_headers_count := l_bid_headers_count + 1;
1501      l_bid_number_tbl(l_bid_headers_count)  := p_awarded_bid_headers(l_index).bid_number;
1502      l_award_status_tbl(l_bid_headers_count):= p_awarded_bid_headers(l_index).award_status;
1503      l_award_date_tbl(l_bid_headers_count)  := p_awarded_bid_headers(l_index).award_date;
1504 
1505     END LOOP;
1506   END IF;
1507 
1508    FORALL k IN 1..l_bid_headers_count
1509       	UPDATE PON_BID_HEADERS
1510 		SET AWARD_STATUS = l_award_status_tbl(k),
1511 		    AWARD_DATE   = l_award_date_tbl(k), /* new column created as part of CPA project.
1512 	                                               It will be updated only when negotiation does
1513                                                    not have lines. */
1514     	    last_update_date = SYSDATE,
1515 		    last_updated_by = p_auctioneer_id
1516 		WHERE bid_number = l_bid_number_tbl(k);
1517 END IF;
1518 
1519 END update_bid_headers;
1520 --
1521 --
1522 PROCEDURE update_single_bid_header
1523 (
1524   p_bid_number    IN NUMBER,
1525   p_auctioneer_id IN NUMBER
1526 )
1527 IS
1528 --
1529 CURSOR c_bid_lines (c_bid_number NUMBER) is
1530 
1531 	    	SELECT 	bi.Line_number,
1532 		   	bi.award_status,
1533 		   	nvl(bi.award_price , bi.price) * bi.award_quantity   award_price
1534 		FROM  pon_bid_item_prices bi, pon_auction_item_prices_all ai
1535 	   	WHERE bi.bid_number = c_bid_number
1536 		and bi.auction_header_id = ai.auction_header_id
1537 		and bi.line_number = ai.line_number
1538 		and ai.group_type in ('LOT', 'LINE', 'GROUP_LINE');
1539 
1540 l_bid_lines_rec c_bid_lines%ROWTYPE;
1541 --
1542 l_award_status   VARCHAR2(30);
1543 l_awarded_lines  NUMBER;
1544 l_rejected_lines NUMBER;
1545 l_total_lines    NUMBER ;
1546 l_award_amount   NUMBER;
1547 l_contract_type  VARCHAR2(20);
1548 --
1549 --
1550 BEGIN
1551 	l_award_amount := null;
1552 	l_awarded_lines := 0;
1553 	l_rejected_lines := 0;
1554 	l_total_lines := 0;
1555 	l_award_status := null;
1556 --
1557     	SELECT ah.contract_type INTO l_contract_type
1558 	FROM pon_auction_headers_all ah, pon_bid_headers bh
1559 	WHERE bh.bid_number = p_bid_number
1560 	AND bh.auction_header_id = ah.auction_header_id;
1561 --
1562    	OPEN c_bid_lines (p_bid_number);
1563 	LOOP
1564 	 	 FETCH c_bid_lines into l_bid_lines_rec;
1565 		 EXIT WHEN c_bid_lines%NOTFOUND;
1566 		 l_total_lines := l_total_lines + 1;
1567 	 	 IF l_bid_lines_rec.AWARD_STATUS = 'AWARDED' THEN
1568 	 	 	l_awarded_lines := l_awarded_lines + 1;
1569 		 END IF;
1570 	 	 IF l_bid_lines_rec.AWARD_STATUS = 'REJECTED' THEN
1571 	 	 	l_rejected_lines := l_rejected_lines + 1;
1572 		 END IF;
1573 		 IF l_contract_type = 'STANDARD' THEN
1574 		    l_award_amount := nvl(l_award_amount,0) + nvl(l_bid_lines_rec.award_price,0);
1575 		 END IF;
1576 	END LOOP;
1577 
1578 	CLOSE c_bid_lines;
1579 	IF (l_awarded_lines <> 0) AND (l_awarded_lines = l_total_lines) THEN
1580 	   l_award_status := 'AWARDED';
1581 	ELSIF (l_rejected_lines <> 0) AND (l_rejected_lines = l_total_lines) THEN
1582 	    l_award_status := 'REJECTED';
1583 	ELSIF l_awarded_lines > 0 THEN
1584 	    l_award_status := 'PARTIAL';
1585 	END IF;
1586 --
1587 	UPDATE PON_BID_HEADERS
1588 	SET AWARD_STATUS = l_award_status,
1589          total_award_amount = l_award_amount,
1590     	 last_update_date = SYSDATE,
1591 	 last_updated_by = p_auctioneer_id
1592 	WHERE bid_number = p_bid_number;
1593 --
1594 END update_single_bid_header;
1595 --
1596 --
1597 PROCEDURE update_auction_item_prices
1598 (
1599   p_auction_id    IN NUMBER,
1600   p_line_number   IN NUMBER,
1601   p_award_date    IN DATE,
1602   p_auctioneer_id IN NUMBER,
1603   p_mode          IN VARCHAR2
1604 )
1605 IS
1606 CURSOR c_auction_items (c_auction_id NUMBER) IS
1607 	   SELECT line_number, group_type
1608 	   FROM pon_auction_item_prices_all
1609 	   WHERE auction_header_id = c_auction_id;
1610 l_auction_items_rec c_auction_items%ROWTYPE;
1611 --
1612 CURSOR c_item_sublines (c_auction_id NUMBER, c_parent_line_number NUMBER) IS
1613            SELECT line_number, group_type
1614            FROM pon_auction_item_prices_all
1615            WHERE auction_header_id = c_auction_id
1616            AND parent_line_number = c_parent_line_number;
1617 
1618 l_item_sublines_rec c_item_sublines%ROWTYPE;
1619 --
1620 l_group_type  pon_auction_item_prices_all.group_type%TYPE;
1621 --
1622 BEGIN
1623 
1624      OPEN c_auction_items(p_auction_id);
1625 
1626      IF (p_mode = g_AWARD_QUOTE OR p_mode = g_AWARD_MULTIPLE_LINES
1627         OR p_mode=g_AWARD_AUTO_RECOMMEND OR p_mode = g_AWARD_OPTIMIZATION) THEN
1628 	  LOOP
1629 		  FETCH c_auction_items INTO  l_auction_items_rec;
1630 		  EXIT WHEN c_auction_items%NOTFOUND;
1631 		  update_single_auction_item(p_auction_id,
1632 		               l_auction_items_rec.line_number,
1633 			       p_auctioneer_id, p_mode);
1634 	  END LOOP;
1635 	  CLOSE c_auction_items;
1636     ELSE
1637 	  update_single_auction_item (p_auction_id,
1638 		               p_line_number,
1639 			       p_auctioneer_id,
1640                                p_mode);
1641 
1642           SELECT group_type INTO l_group_type FROM pon_auction_item_prices_all
1643           WHERE auction_header_id = p_auction_id
1644                 AND line_number = p_line_number;
1645           IF ((p_mode = g_AWARD_LINE AND l_group_type = 'LOT')
1646 	    OR (p_mode = g_AWARD_LINE_H AND l_group_type = 'LOT')
1647             OR (p_mode = g_AWARD_GROUP_H AND l_group_type = 'GROUP')
1648 	    OR (p_mode = g_AWARD_GROUP AND l_group_type = 'GROUP') ) THEN
1649 --
1650 	      OPEN c_item_sublines (p_auction_id, p_line_number);
1651 --
1652               LOOP
1653 	       fetch c_item_sublines into l_item_sublines_rec;
1654 	       EXIT WHEN c_item_sublines%NOTFOUND;
1655 	       -- update the child lines
1656 
1657                update_single_auction_item(p_auction_id,
1658 		               l_item_sublines_rec.line_number,
1659 	                       p_auctioneer_id,
1660                                p_mode);
1661               END LOOP;
1662 --
1663            ELSIF ((p_mode = g_AWARD_LINE OR p_mode = g_AWARD_LINE_H)
1664                AND l_group_type = 'GROUP_LINE') THEN
1665 	       update_ai_group_award(p_auction_id,
1666                                p_line_number,
1667 			       p_award_date,
1668 			       p_auctioneer_id);
1669 
1670 	   END IF;
1671 --
1672       END IF;
1673 --
1674 --
1675 END update_auction_item_prices;
1676 --
1677 --
1678 PROCEDURE update_single_auction_item
1679 (
1680   p_auction_id    IN NUMBER,
1681   p_line_number   IN NUMBER,
1682   p_auctioneer_id IN NUMBER,
1683   p_mode          IN pon_auction_item_prices_all.award_mode%type
1684 )
1685 IS
1686 CURSOR c_bid_items (c_auction_id NUMBER, c_line_number NUMBER) IS
1687 	 SELECT bi.Line_number,
1688 	 	ai.order_type_lookup_code,
1689 		bi.award_status,
1690 		bi.award_quantity,
1691 		ai.group_type
1692 	 FROM pon_bid_item_prices bi,
1693 	 	  pon_bid_headers bh,
1694 		  pon_auction_item_prices_all ai
1695 	 WHERE bi.auction_header_id = c_auction_id
1696 	  	   AND bi.line_number = c_line_number
1697 		   AND bh.bid_status = 'ACTIVE'
1698 		   AND bh.auction_header_id = bi.auction_header_id
1699 		   AND bh.bid_number = bi.bid_number
1700 	  	   AND ai.auction_header_id = bi.auction_header_id
1701 	  	   AND ai.line_number = bi.line_number;
1702 l_bid_items_rec c_bid_items%ROWTYPE;
1703 l_award_status VARCHAR2(20);
1704 l_award_made BOOLEAN;
1705 l_award_quantity NUMBER;
1706 l_line_type VARCHAR2(20);
1707 l_contract_type VARCHAR2(20);
1708 l_group_type VARCHAR2(20);
1709 l_item_award_mode pon_auction_item_prices_all.award_mode%type;
1710 --
1711 BEGIN
1712    l_award_status := null;
1713    l_award_quantity := null;
1714    l_line_type := NULL;
1715    l_award_made := FALSE;
1716    l_item_award_mode := null;
1717 --
1718    SELECT ah.contract_type INTO l_contract_type
1719    FROM pon_auction_headers_all ah
1720    WHERE ah.auction_header_id = p_auction_id;
1721 --
1722    OPEN c_bid_items(p_auction_id, p_line_number) ;
1723    LOOP
1724    	  FETCH c_bid_items INTO l_bid_items_rec;
1725 	  EXIT WHEN c_bid_items%NOTFOUND;
1726 	  l_line_type := l_bid_items_rec.order_type_lookup_code;
1727           l_group_type:= l_bid_items_rec.group_type;
1728 	  IF l_bid_items_rec.award_status = 'AWARDED' THEN
1729 	  	  l_award_quantity := nvl(l_award_quantity,0) + l_bid_items_rec.award_quantity;
1730 		  IF (NOT l_award_made)  THEN
1731 		  	  l_award_made := TRUE;
1732 		  END IF;
1733 	  END IF;
1734 	  IF ((l_award_status is null)
1735 	      AND ((l_bid_items_rec.award_status = 'AWARDED')
1736                   OR (l_bid_items_rec.award_status = 'REJECTED')
1737                   OR (l_bid_items_rec.award_status = 'PARTIAL'))
1738 		 ) THEN
1739 	  	  l_award_status := 'AWARDED';
1740 	  END IF;
1741    END LOOP;
1742    CLOSE c_bid_items;
1743 --
1744    IF (l_award_made) AND (NOT (l_contract_type = 'STANDARD' AND l_line_type = 'QUANTITY'))
1745        AND (l_group_type <> 'LOT_LINE' AND  l_group_type <> 'GROUP') THEN
1746    	  l_award_quantity := 1;
1747    END IF ;
1748 --
1749    -- set award mode = GROUP for group level award.
1750    IF(p_mode = g_AWARD_GROUP OR p_mode = g_AWARD_GROUP_H) AND l_group_type = 'GROUP' THEN
1751      l_item_award_mode := 'GROUP';
1752    END IF;
1753    UPDATE pon_auction_item_prices_all
1754    SET award_status = l_award_status,
1755    	   awarded_quantity = l_award_quantity,
1756            award_mode = l_item_award_mode,
1757    	   last_update_date = SYSDATE,
1758 	   last_updated_by = p_auctioneer_id
1759    WHERE auction_header_id = p_auction_id
1760 	   AND line_number = p_line_number;
1761 --
1762 END update_single_auction_item;
1763 --
1764 --
1765 PROCEDURE update_auction_headers
1766 (
1767   p_auction_id    IN NUMBER,
1768   p_mode          IN VARCHAR2,
1769   p_award_date	  IN DATE,
1770   p_auctioneer_id IN NUMBER,
1771   p_neg_has_lines IN VARCHAR2 -- FPK: CPA
1772 )
1773 IS
1774 --
1775 /*
1776 CURSOR c_auction_lines (c_auction_id NUMBER) is
1777 	    SELECT Line_number, award_status
1778 		FROM pon_auction_item_prices_all
1779 	   	WHERE auction_header_id = c_auction_id
1780 			  AND number_of_bids > 0
1781 			  AND group_type in ('LOT', 'LINE', 'GROUP_LINE');
1782 
1783 l_auction_lines_rec c_auction_lines%ROWTYPE;
1784 */
1785 --
1786 l_award_status VARCHAR2(20);
1787 l_award_mode VARCHAR2(20);
1788 l_awarded_lines NUMBER;
1789 l_total_lines NUMBER;
1790 
1791 l_awarded_bids NUMBER; -- FPK: CPA
1792 --
1793 BEGIN
1794 	l_awarded_lines := 0;
1795 	l_total_lines := 0;
1796 	l_award_status := 'NO';
1797 	l_award_mode := null;
1798 
1799 /*	CASE p_mode
1800 	   WHEN g_AWARD_QUOTE THEN l_Award_mode := 'HEADER';
1801 	   WHEN g_AWARD_MULTIPLE_LINES THEN l_award_mode := 'MULTIPLE_LINES';
1802 	   WHEN g_AWARD_LINE THEN l_award_mode := 'LINE';
1803 	   WHEN g_AWARD_LINE_H THEN l_award_mode := 'LINE';
1804 	   WHEN g_AWARD_AUTO_RECOMMEND THEN l_award_mode := 'LINE';
1805 	   ELSE l_Award_Status := null;
1806 	END CASE;
1807  */
1808     IF p_mode = g_AWARD_QUOTE THEN
1809 	   l_Award_mode := 'HEADER';
1810 	ELSIF p_mode = g_AWARD_MULTIPLE_LINES THEN
1811 	   l_award_mode := 'MULTIPLE_LINES';
1812 	ELSIF p_mode = g_AWARD_LINE THEN
1813 	   l_award_mode := 'LINE';
1814 	ELSIF p_mode = g_AWARD_LINE_H THEN
1815 	   l_award_mode := 'LINE';
1816 	ELSIF p_mode = g_AWARD_GROUP THEN
1817 	   l_award_mode := 'LINE';
1818         ELSIF p_mode = g_AWARD_GROUP_H THEN
1819            l_award_mode := 'LINE';
1820 	ELSIF p_mode = g_AWARD_AUTO_RECOMMEND THEN
1821            l_award_mode := 'LINE';
1822     ELSIF p_mode = g_AWARD_OPTIMIZATION THEN
1823 	   l_award_mode := 'LINE';
1824 	ELSE l_award_mode := null;
1825      END IF;
1826 --
1827 IF p_neg_has_lines = 'Y' THEN -- FPK: CPA
1828 
1829 /*
1830 	large-auction-support changes
1831 	rather than looping over all the lines, we will simply
1832 	execute a single query
1833 */
1834 
1835 	SELECT 	count(Line_number), sum(decode(award_status, 'AWARDED', 1, 0))
1836 	INTO	l_total_lines, l_awarded_lines
1837 	FROM 	pon_auction_item_prices_all
1838 	WHERE 	auction_header_id = p_auction_id
1839 	AND 	number_of_bids > 0
1840 	AND 	group_type in ('LOT', 'LINE', 'GROUP_LINE');
1841 
1842 	IF ((l_awarded_lines <> 0) AND (l_awarded_lines = l_total_lines) ) THEN
1843 	   l_award_status := 'AWARDED';
1844 	ELSIF (l_awarded_lines > 0) THEN
1845 	   l_award_status := 'PARTIAL';
1846 	END IF;
1847 ELSE -- negotiation does not have lines
1848 	BEGIN
1849       select 'AWARDED' -- it means an award decision was made
1850 	  into l_award_status
1851 	  from dual
1852 	  where exists (select 1
1853 	                from pon_bid_headers
1854 	                where auction_header_id = p_auction_id
1855                     and bid_status = 'ACTIVE'
1856 	                and award_status IN ('AWARDED', 'REJECTED'));
1857 	  EXCEPTION
1858 	  WHEN NO_DATA_FOUND THEN
1859 	     NULL; -- award_status is set to 'NO' in the beggining of the procedure.
1860 	  END;
1861 
1862 END IF; -- IF p_neg_has_lines = 'Y'
1863 
1864 	UPDATE PON_Auction_HEADERS_all
1865 	SET AWARD_STATUS = l_award_status,
1866 	    award_mode = l_award_mode,
1867             award_date = p_award_date,
1868             last_updated_by = p_auctioneer_id
1869             -- modified after last update date check
1870             --award_approval_status = 'REQUIRED'
1871             --last_update_date = SYSDATE
1872 	WHERE auction_header_id = p_auction_id ;
1873 
1874         UPDATE PON_AUCTION_HEADERS_ALL
1875         SET award_approval_status = 'REQUIRED'
1876         WHERE auction_header_id = p_auction_id
1877         AND nvl(award_approval_flag, 'N') = 'Y';
1878 --
1879 END update_auction_headers;
1880 --
1881 --
1882 -- Updates the award_approval_status and sets to REQUIRED
1883 -- since the award is modified, sets the upadated by column as well.
1884 PROCEDURE update_award_agreement_amount
1885 (
1886  p_auction_id    IN NUMBER,
1887  p_auctioneer_id IN NUMBER
1888 )
1889 IS
1890 BEGIN
1891     -- Updates approval_status if approval flag is set
1892     UPDATE PON_AUCTION_HEADERS_ALL
1893     SET award_approval_status = 'REQUIRED'
1894     WHERE auction_header_id = p_auction_id
1895     AND nvl(award_approval_flag, 'N') = 'Y';
1896 --
1897     -- Updates last update date etc since award is modified.
1898     UPDATE PON_Auction_HEADERS_all
1899     SET award_date =  SYSDATE,
1900     last_updated_by = p_auctioneer_id,
1901     last_update_date = SYSDATE
1902     WHERE auction_header_id = p_auction_id ;
1903 --
1904 END update_award_agreement_amount;
1905 --
1906 --
1907 PROCEDURE bulk_update_pon_acceptances
1908 ( p_auction_header_id IN NUMBER,
1909   p_line_number 	  IN NUMBER,
1910   p_note_to_accepted  IN VARCHAR2,
1911   p_note_to_rejected  IN VARCHAR2,
1912   p_award_date    	  IN DATE,
1913   p_auctioneer_id	  IN NUMBER,
1914   p_mode              IN VARCHAR2
1915 )
1916 IS
1917 BEGIN
1918    IF(p_line_number > 0 ) THEN
1919      IF (p_mode = g_AWARD_GROUP OR p_mode = g_AWARD_GROUP_H) THEN
1920 	   -- Group Level Awards
1921 	   -- Insert empty notes for group lines
1922 	   -- Delete notes for a line
1923 		 DELETE FROM pon_acceptances
1924 		 WHERE auction_header_id = p_auction_header_id
1925 		       AND line_number IN (SELECT line_number FROM pon_auction_item_prices_all
1926 			                   WHERE parent_line_number = p_line_number
1927 					   AND auction_header_id = p_auction_header_id);
1928 		 INSERT INTO pon_acceptances (
1929 		 	acceptance_id,
1930 			auction_header_id,
1931 		   	auction_line_number,
1932 		        bid_number,
1933 			line_number,
1934 			acceptance_type,
1935 			acceptance_date,
1936 			reason,
1937 			creation_date,
1938 			created_by)
1939 		 SELECT pon_acceptances_s.nextval,
1940 		        bi.auction_header_id,
1941 			bi.auction_line_number,
1942 			bi.bid_number,
1943 			bi.line_number,
1944 			bi.award_status,
1945 			p_award_date,
1946 			null,
1947 			p_award_date,
1948 			p_auctioneer_id
1949 		 FROM pon_bid_item_prices bi, pon_bid_headers bh, pon_auction_item_prices_all ai
1950 		  WHERE bi.auction_header_id = ai.auction_header_id
1951 		        AND ai.line_number = bi.line_number
1952 		        AND (bi.award_status = 'AWARDED'
1953 			     OR bi.award_status = 'REJECTED')
1954 			AND bi.bid_number = bh.bid_number
1955 			AND bh.bid_status = 'ACTIVE'
1956 			AND ai.auction_header_id = p_auction_header_id
1957 			AND ai.parent_line_number = p_line_number;
1958 --
1959   	  ELSE
1960 	   -- Award Line Mode
1961 	   -- Delete notes for a line
1962 		 DELETE FROM pon_acceptances
1963 		 WHERE auction_header_id = p_auction_header_id
1964 		       AND line_number = p_line_number;
1965 		 INSERT INTO pon_acceptances (
1966 		 	acceptance_id,
1967 			auction_header_id,
1968 		   	auction_line_number,
1969 		    bid_number,
1970 			line_number,
1971 			acceptance_type,
1972 			acceptance_date,
1973 			reason,
1974 			creation_date,
1975 			created_by)
1976 		 SELECT pon_acceptances_s.nextval,
1977 		    bi.auction_header_id,
1978 			bi.auction_line_number,
1979 			bi.bid_number,
1980 			bi.line_number,
1981 			bi.award_status,
1982 			p_award_date,
1983 			decode (bi.award_status,
1984 			       'AWARDED', p_note_to_accepted,
1985 			       'REJECTED', p_note_to_rejected,
1986 					null),
1987 			SYSDATE,
1988 			p_auctioneer_id
1989 		 FROM pon_bid_item_prices bi, pon_bid_headers bh
1990 		  WHERE bi.auction_header_id = p_auction_header_id
1991 		        AND bi.line_number = p_line_number
1992 		        AND (bi.award_status = 'AWARDED'
1993 					OR bi.award_status = 'REJECTED')
1994 				AND bi.bid_number = bh.bid_number
1995 				AND bh.bid_status = 'ACTIVE';
1996 	  END IF;
1997    ELSE
1998    -- Header Level Award
1999    -- Delete notes for an auction
2000 	 DELETE FROM pon_acceptances
2001 	 WHERE auction_header_id = p_auction_header_id;
2002 --
2003 	 INSERT INTO pon_acceptances (
2004 	 	acceptance_id,
2005 		auction_header_id,
2006 	   	auction_line_number,
2007 	    bid_number,
2008 		line_number,
2009 		acceptance_type,
2010 		acceptance_date,
2011 		reason,
2012 		creation_date,
2013 		created_by)
2014 	 SELECT pon_acceptances_s.nextval,
2015 	    bi.auction_header_id,
2016 		bi.auction_line_number,
2017 		bi.bid_number,
2018 		bi.line_number,
2019 		bi.award_status,
2020 		p_award_date,
2021 		decode (bi.award_status,
2022 		       'AWARDED', p_note_to_accepted,
2023 		       'REJECTED', p_note_to_rejected,
2024 				null),
2025 		p_award_date,
2026 		p_auctioneer_id
2027 	 FROM pon_bid_item_prices bi, pon_bid_headers bh, pon_auction_item_prices_all ai
2028 	  WHERE bi.auction_header_id = p_auction_header_id
2029 	        AND (bi.award_status = 'AWARDED'
2030 				OR bi.award_status = 'REJECTED')
2031 			AND bi.bid_number = bh.bid_number
2032 			AND bh.bid_status = 'ACTIVE'
2033 			AND bi.auction_header_id = ai.auction_header_id
2034 			AND bi.line_number = ai.line_number
2035 			AND ai.group_type IN ('LOT', 'LINE', 'GROUP_LINE');
2036    END IF;
2037 END bulk_update_pon_acceptances;
2038 --
2039 --
2040 FUNCTION get_award_status (award_outcome IN VARCHAR2)
2041 RETURN VARCHAR2
2042 IS
2043 --
2044 l_award_status VARCHAR2(20);
2045 BEGIN
2046 /*
2047 	CASE award_outcome
2048 	   WHEN g_AWARD_OUTCOME_WIN THEN l_Award_Status := 'AWARDED';
2049 	   WHEN g_AWARD_OUTCOME_LOSE THEN l_Award_Status := 'REJECTED';
2050 	   WHEN g_AWARD_OUTCOME_NOAWARD THEN l_Award_Status := 'REJECTED';
2051 	   ELSE l_Award_Status := null;
2052 	END CASE;
2053 */
2054 	IF award_outcome = g_AWARD_OUTCOME_WIN THEN
2055 	   l_Award_Status := 'AWARDED';
2056 	ELSIF award_outcome = g_AWARD_OUTCOME_LOSE THEN
2057 	   l_Award_Status := 'REJECTED';
2058 	ELSIF award_outcome = g_AWARD_OUTCOME_NOAWARD THEN
2059 	   l_Award_Status := 'REJECTED';
2060 	ELSE l_Award_Status := null;
2061 	END IF;
2062 
2063 	RETURN l_award_status;
2064 --
2065 END get_award_status;
2066 --
2067 --
2068 PROCEDURE update_unawarded_acceptances
2069 ( p_auction_header_id IN NUMBER,
2070   p_line_number 	  IN NUMBER,
2071   p_note_to_rejected  IN VARCHAR2,
2072   p_award_date    	  IN DATE,
2073   p_auctioneer_id	  IN NUMBER
2074 )
2075 IS
2076 BEGIN
2077    -- Award Line Mode
2078    -- Delete rejected notes for a line
2079 	 DELETE FROM pon_acceptances
2080 	 WHERE auction_header_id = p_auction_header_id
2081 	       AND line_number = p_line_number
2082 		   AND acceptance_type = 'REJECTED';
2083    -- insert rejection note for all rejected suppliers
2084 	 INSERT INTO pon_acceptances (
2085 	 	acceptance_id,
2086 		auction_header_id,
2087 	   	auction_line_number,
2088 	    bid_number,
2089 		line_number,
2090 		acceptance_type,
2091 		acceptance_date,
2092 		reason,
2093 		creation_date,
2094 		created_by)
2095 	 SELECT pon_acceptances_s.nextval,
2096 	    bi.auction_header_id,
2097 		bi.auction_line_number,
2098 		bi.bid_number,
2099 		bi.line_number,
2100 		'REJECTED',
2101 		p_award_date,
2102         p_note_to_rejected,
2103 		p_award_date,
2104 		p_auctioneer_id
2105 	 FROM pon_bid_item_prices bi, pon_bid_headers bh
2106 	  WHERE bi.auction_header_id = p_auction_header_id
2107 	        AND bi.line_number = p_line_number
2108 	        AND nvl(bi.award_status, 'NO') <> 'AWARDED' -- can be REJECTED/ NO
2109 			AND bi.bid_number = bh.bid_number
2110 			AND bh.bid_status = 'ACTIVE';
2111 END update_unawarded_acceptances;
2112 --
2113 --
2114 PROCEDURE update_notes_for_bid
2115 (
2116   p_bid_number  IN NUMBER,
2117   p_note_to_supplier  IN VARCHAR2,
2118   p_internal_note IN VARCHAR2,
2119   p_auctioneer_id IN NUMBER
2120 )
2121 IS
2122 BEGIN
2123 	UPDATE pon_bid_headers
2124 	SET Internal_note = p_internal_note,
2125 		note_to_supplier = p_note_to_supplier
2126 	WHERE bid_number = p_bid_number;
2127 END update_notes_for_bid;
2128 --
2129 --
2130 PROCEDURE clear_draft_awards
2131 (
2132   p_auction_header_id IN NUMBER,
2133   p_line_number  IN NUMBER,
2134   p_award_date IN DATE,
2135   p_auctioneer_id IN NUMBER,
2136   p_neg_has_lines IN VARCHAR2 -- FPK: CPA
2137 )
2138 IS
2139 BEGIN
2140 
2141  IF p_neg_has_lines = 'Y' THEN -- FPK: CPA
2142 
2143 
2144    IF (p_line_number IS NULL OR p_line_number <= 0 )THEN
2145          -- Header level awards
2146          --Update award status to REJECTED for all the bids
2147 	 UPDATE pon_bid_item_prices
2148 	 SET award_status = 'REJECTED',
2149 	     award_quantity = NULL,
2150 	     award_date = p_award_date,
2151 	     last_update_date = p_award_date,
2152 	     last_updated_by = p_auctioneer_id,
2153 	     award_shipment_number = NULL,
2154 	     award_price = NULL
2155 	 WHERE bid_number IN (
2156 	 	   	      SELECT bid_number
2157 			      FROM pon_bid_headers
2158 			      WHERE auction_header_id = p_auction_header_id
2159 			      AND bid_status = 'ACTIVE'
2160 			     );
2161 
2162 	 -- Delete All Awards since it is a header-level awarding
2163 	 DELETE FROM pon_acceptances
2164 	 WHERE auction_header_id = p_auction_header_id;
2165 
2166          -- reset the award mode at auction item level
2167          UPDATE pon_auction_item_prices_all
2168          SET award_mode = null
2169          WHERE auction_header_id = p_auction_header_id;
2170    ELSE
2171         -- Group Level awards need to be rejected first
2172          --Update award status to REJECTED for all the bids
2173          UPDATE pon_bid_item_prices
2174          SET award_status = 'REJECTED',
2175              award_quantity = NULL,
2176              award_date = p_award_date,
2177              last_update_date = p_award_date,
2178              last_updated_by = p_auctioneer_id,
2179              award_shipment_number = NULL,
2180              award_price = NULL
2181          WHERE bid_number IN (
2182                               SELECT bid_number
2183                               FROM pon_bid_headers
2184                               WHERE auction_header_id = p_auction_header_id
2185                               AND bid_status = 'ACTIVE'
2186                              )
2187              AND line_number IN (SELECT line_number
2188                                  FROM pon_auction_item_prices_all
2189                                  WHERE auction_header_id = p_auction_header_id
2190                                  AND (line_number = p_line_number
2191                                       OR parent_line_number = p_line_number));
2192 
2193          -- Delete All group line awards since it is a group-level awarding
2194          DELETE FROM pon_acceptances
2195          WHERE auction_header_id = p_auction_header_id
2196          AND line_number IN (SELECT line_number
2197                                  FROM pon_auction_item_prices_all
2198                                  WHERE auction_header_id = p_auction_header_id
2199                                  AND parent_line_number = p_line_number);
2200    END IF;
2201  END IF;
2202 
2203    /* FPK: CPA
2204    Reset notes for all the bids and update all active bids award status to REJECTED no matter
2205    if negotiation has lines or not. Previoulsy award_status was not being updated to REJECTED when
2206    negotiation had lines, but there is no harm in doing so at this point, as award_status will be
2207    updated later in update_single_bid_header procedure. */
2208 
2209 		 UPDATE pon_bid_headers
2210 		 SET  award_status = 'REJECTED',
2211 	          note_to_supplier = NULL,
2212 		      internal_note = NULL,
2213 		      po_agreed_amount = NULL,
2214 		      last_update_date = SYSDATE,
2215 		      last_updated_by = p_auctioneer_id
2216 		 WHERE auction_header_id = p_auction_header_id
2217 		 AND bid_status = 'ACTIVE';
2218 END clear_draft_awards;
2219 --
2220 --
2221 --
2222 --
2223 PROCEDURE clear_awards_recommendation
2224 (
2225   p_auction_header_id NUMBER,
2226   p_award_date DATE,
2227   p_auctioneer_id IN NUMBER
2228 )
2229 IS
2230 BEGIN
2231 --Update award status to REJECTED for all the bids
2232 	 UPDATE pon_bid_item_prices
2233 	 SET award_status = 'REJECTED',
2234 	     award_quantity = NULL,
2235 		 award_date = p_award_date,
2236 		 last_update_date = SYSDATE,
2237 		 last_updated_by = p_auctioneer_id,
2238                  award_price = NULL
2239 	 WHERE bid_number IN (
2240 	 	SELECT bid_number
2241 	        FROM pon_bid_headers
2242 		WHERE auction_header_id = p_auction_header_id
2243 		AND bid_status = 'ACTIVE'
2244 		);
2245 --reset notes for all the bids
2246 	 UPDATE pon_bid_headers
2247 	 SET po_agreed_amount = NULL,
2248 	     last_update_date = SYSDATE,
2249 	     last_updated_by = p_auctioneer_id
2250 	 WHERE bid_number IN (
2251 	 	 SELECT bid_number
2252 		 FROM pon_bid_headers
2253 		 WHERE auction_header_id = p_auction_header_id
2254 		 AND bid_status = 'ACTIVE'
2255 		 );
2256 END clear_awards_recommendation;
2257 
2258 --
2259 --
2260 ----------------------------------------------------------------
2261 -- handles accepting an AutoAward Scenario
2262 ----------------------------------------------------------------
2263 --
2264 PROCEDURE accept_award_scenario
2265 (
2266    p_scenario_id         IN  NUMBER,
2267    p_auctioneer_id    IN  NUMBER,
2268    p_last_update_date IN  DATE,
2269    x_status           OUT NOCOPY VARCHAR2
2270  )
2271   IS
2272 
2273      l_auction_header_id NUMBER;
2274      l_mode VARCHAR2(50);
2275      l_batch_id NUMBER;
2276      l_num_of_non_shortlisted_supp NUMBER;
2277 BEGIN
2278 
2279    -- retrieve auction header id and batch id
2280    BEGIN
2281       SELECT COUNT(DISTINCT pbh.bid_number)
2282 	INTO l_num_of_non_shortlisted_supp
2283 	FROM pon_optimize_results por, pon_bid_headers pbh
2284 	WHERE por.bid_number = pbh.bid_number
2285 	AND pbh.shortlist_flag = 'N'
2286         AND por.scenario_id = p_scenario_id;
2287 
2288       IF (l_num_of_non_shortlisted_supp > 0) THEN
2289 	 x_status := 'NOT_SHORTLISTED';
2290 	 RETURN;
2291       END IF;
2292 
2293       SELECT auction_header_id, pon_auction_summary_s.NEXTVAL
2294 	INTO l_auction_header_id, l_batch_id
2295 	FROM pon_optimize_scenarios
2296 	WHERE scenario_id = p_scenario_id;
2297    EXCEPTION WHEN NO_DATA_FOUND THEN
2298       x_status := 'FAILURE';
2299       RETURN;
2300    END;
2301 
2302    l_mode := g_AWARD_OPTIMIZATION;
2303 
2304    -- insert award results into interface table
2305    INSERT into pon_auction_summary
2306      (batch_id,
2307       auction_id,
2308       bid_number,
2309       line_number,
2310       award_quantity,
2311       award_shipment_number)
2312      SELECT
2313      l_batch_id,
2314      l_auction_header_id,
2315      por.bid_number,
2316      por.line_number,
2317      por.award_quantity,
2318      por.award_shipment_number
2319      FROM pon_optimize_results por, pon_auction_item_prices_all paip,
2320           pon_auction_headers_all pah,
2321           pon_bid_item_prices pbip
2322      WHERE pah.auction_header_id = l_auction_header_id
2323      AND   pah.auction_header_id = paip.auction_header_id
2324      AND   por.bid_number = pbip.bid_number
2325      AND   por.line_number = pbip.line_number
2326      AND   por.scenario_id = p_scenario_id
2327      AND   paip.line_number = por.line_number;
2328 
2329 
2330    -- save the award result
2331    save_award_recommendation(l_batch_id, p_auctioneer_id, p_last_update_date, l_mode, x_status);
2332 
2333    IF (x_status = 'FAILURE') THEN
2334      RETURN;
2335    END IF;
2336 
2337    -- unset the accepted date of the previously accepted scenario
2338    UPDATE pon_optimize_scenarios
2339      SET accepted_date = NULL
2340      WHERE accepted_date IS NOT NULL
2341        AND auction_header_id= l_auction_header_id;
2342 
2343    -- set accepted date of the accepted scenario
2344    UPDATE pon_optimize_scenarios
2345      SET accepted_date = SYSDATE,
2346      last_update_date = SYSDATE,
2347      last_updated_by = p_auctioneer_id
2348      WHERE scenario_id = p_scenario_id;
2349 
2350    -- clean up inteface table
2351    DELETE FROM pon_auction_summary
2352      WHERE batch_id = l_batch_id;
2353 
2354 END accept_award_scenario;
2355 
2356 --
2357 --
2358 ----------------------------------------------------------------
2359 -- procedure added by snatu on 08/15/03
2360 -- handles awarding in FPJ for system recommended awards
2361 ----------------------------------------------------------------
2362 --
2363 PROCEDURE save_award_recommendation
2364 (
2365    p_batch_id         IN  NUMBER,
2366    p_auctioneer_id    IN  NUMBER,
2367    p_last_update_date IN  DATE,
2368    p_mode             IN  VARCHAR2,
2369    x_status           OUT NOCOPY VARCHAR2
2370 )
2371 IS
2372 CURSOR c_reco_awards (c_batch_id NUMBER) IS
2373   SELECT
2374         pas.auction_id,
2375 	pas.line_number,
2376         pas.bid_number,
2377         decode(p_mode,
2378 	   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),
2379 	   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,
2380 	pas.bid_price,
2381 	pas.trading_partner_id,
2382 	pas.trading_partner_contact_id,
2383 	pas.batch_id,
2384         ai.group_type,
2385         pas.award_shipment_number
2386   FROM pon_auction_summary pas
2387        , pon_auction_item_prices_all ai
2388        , pon_auction_headers_all ah
2389   WHERE
2390     pas.award_quantity >0
2391     AND pas.batch_id = c_batch_id
2392     AND ah.auction_header_id = pas.auction_id
2393     AND ai.auction_header_id = pas.auction_id
2394     AND ai.line_number = pas.line_number
2395   ORDER BY
2396 	pas.line_number;
2397   l_reco_awards_rec c_reco_awards%ROWTYPE;
2398 --
2399   l_award_lines t_award_lines;
2400   l_matrix_index        NUMBER;
2401   l_auction_header_id   NUMBER;
2402   l_current_bid_number  NUMBER;
2403   l_current_update_date DATE;
2404   l_award_date          DATE;
2405 
2406 BEGIN
2407 
2408  l_current_bid_number := null;
2409  l_matrix_index := 0;
2410  l_award_date := SYSDATE;
2411 --
2412  -- Need to set award quantity and award_status and award_date
2413   OPEN c_reco_awards (p_batch_id);
2414   LOOP
2415 	  fetch c_reco_awards into l_reco_awards_rec;
2416 	  EXIT WHEN c_reco_awards%NOTFOUND;
2417 	  -- Get Auction Header Id only once
2418 	  IF (l_matrix_index = 0) THEN
2419 	  	 l_auction_header_id := l_reco_awards_rec.auction_id;
2420 	  END IF;
2421 
2422 --DBMS_OUTPUT.PUT_LINE('l_auction_header_id' || l_auction_header_id);
2423 	 -- Construct Matrix for the awarded bids
2424   	  l_matrix_index := l_matrix_index + 1;
2425 	  l_award_lines(l_matrix_index).bid_number := l_reco_awards_rec.bid_number;
2426 	  l_award_lines(l_matrix_index).line_number := l_reco_awards_rec.line_number;
2427 	  l_award_lines(l_matrix_index).award_status := 'AWARDED';
2428 	  l_award_lines(l_matrix_index).award_quantity := l_reco_awards_rec.award_quantity;
2429 	  l_award_lines(l_matrix_index).award_date := l_award_date;
2430           l_award_lines(l_matrix_index).group_type := l_reco_awards_rec.group_type;
2431           l_award_lines(l_matrix_index).award_shipment_number := l_reco_awards_rec.award_shipment_number;
2432   END LOOP;
2433 
2434 	  clear_awards_recommendation (l_auction_header_id, l_award_date, p_auctioneer_id);
2435 	  update_bid_item_prices(l_auction_header_id,l_award_lines,p_auctioneer_id, p_mode);
2436 	  /* FPK: CPA p_neg_has_lines parameter hardcoded to 'Y' as save_award_recommendation
2437           procedure will only be called if negotiation has lines */
2438           update_bid_headers(l_auction_header_id, p_auctioneer_id, t_emptytbl, 'Y');
2439 	  update_auction_item_prices(l_auction_header_id,null, l_award_date, p_auctioneer_id, p_mode);
2440 	  /* FPK: CPA p_neg_has_lines parameter hardcoded to 'Y' as save_award_recommendation
2441           procedure will only be called if negotiation has lines */
2442 	  update_auction_headers(l_auction_header_id, p_mode, l_award_date, p_auctioneer_id, 'Y');
2443 
2444 	  bulk_update_pon_acceptances(
2445 	  			l_auction_header_id,
2446 	  			null, null, null,
2447 				l_award_date, p_auctioneer_id, p_mode);
2448 --
2449 /*  check if the auction has been modified by some other user
2450     If it has been modified, status returns failure
2451     else this is the only user modifying hte auction
2452     changes are committed to the database in the middle tier
2453 */
2454    IF (is_auction_not_updated (l_auction_header_id, p_last_update_date)) THEN
2455       x_status := 'SUCCESS';
2456 	  -- update the last update date
2457 	  UPDATE PON_Auction_HEADERS_all
2458 	  SET last_update_date = SYSDATE
2459 	  WHERE auction_header_id = l_auction_header_id;
2460 	  --
2461    ELSE
2462       x_status := 'FAILURE';
2463    END IF;
2464 --
2465 END save_award_recommendation;
2466 
2467 
2468 --
2469 --
2470 ----------------------------------------------------------------
2471 -- handles copying of a scenario
2472 ----------------------------------------------------------------
2473 
2474 PROCEDURE copy_award_scenario
2475 (
2476   p_scenario_id         IN NUMBER,
2477   p_user_id	        IN NUMBER,
2478   p_cost_scenario_flag  IN VARCHAR2,
2479   x_cost_scenario_id	OUT NOCOPY NUMBER,
2480   x_status              OUT NOCOPY VARCHAR2
2481 )
2482 IS
2483 
2484 l_fnd_user_id NUMBER;
2485 l_next_scenario_number NUMBER;
2486 l_num_constraints NUMBER;
2487 l_num_bid_classes NUMBER;
2488 l_auction_header_id NUMBER;
2489 l_dummy_scenario_number NUMBER;
2490 l_new_scenario_id NUMBER;
2491 
2492 BEGIN
2493 
2494   -- Derive fnd_user_id from tp_id
2495   -- This will not fail if more than one user setup w/ same buyer.
2496   -- But, this will reurn any of the matched user id in such cases
2497   BEGIN
2498           SELECT USER_ID
2499           INTO l_fnd_user_id
2500           FROM FND_USER
2501           WHERE PERSON_PARTY_ID = p_user_id
2502           AND NVL(END_DATE,SYSDATE+1) > SYSDATE;
2503   EXCEPTION
2504      WHEN TOO_MANY_ROWS THEN
2505          IF (NVL(FND_PROFILE.VALUE('AFLOG_ENABLED'),'N') = 'Y') THEN
2506                IF (FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level) THEN
2507                          FND_LOG.string(log_level => FND_LOG.level_unexpected,
2508                                         module    => 'pon.plsql.pon_award_pkg.copy_award_scenario',
2509                                         message   => 'Multiple Users found for person_party_id:'||p_user_id);
2510                END IF;
2511          END IF;
2512 
2513          SELECT USER_ID
2514          INTO l_fnd_user_id
2515          FROM FND_USER
2516          WHERE PERSON_PARTY_ID = p_user_id
2517          AND NVL(END_DATE,SYSDATE+1) > SYSDATE
2518          AND ROWNUM = 1;
2519   END;
2520 
2521   -- derive auction_header_id
2522   select auction_header_id into l_auction_header_id
2523   from pon_optimize_scenarios
2524   where scenario_id = p_scenario_id;
2525 
2526   -- store the next scenario id in a local variable
2527   select pon_optimize_scenarios_s.nextval
2528   into l_new_scenario_id from dual;
2529 
2530   IF(p_cost_scenario_flag =  'Y') THEN
2531 
2532  	-- we donot display this number any place
2533 	-- all we want is to have a unique combination
2534 	l_next_scenario_number := l_new_scenario_id;
2535 
2536   ELSE
2537   	select max(scenario_number) + 1
2538         into l_next_scenario_number
2539 	from pon_optimize_scenarios
2540 	where auction_header_id = l_auction_header_id
2541 	and   (cost_scenario_flag is null or cost_scenario_flag <> 'Y');
2542 
2543   END IF;
2544 
2545   --first copy the scenario
2546   INSERT INTO PON_OPTIMIZE_SCENARIOS(
2547 	  	auction_header_id,
2548 	  	scenario_id,
2549 	  	scenario_name,
2550                 scenario_number,
2551 	  	objective_code,
2552 	  	status,
2553 	  	price_type,
2554 	  	internal_note,
2555 	  	updated_tp_contact_id,
2556 	  	last_tp_update_date,
2557 	  	creation_date,
2558 	  	created_by,
2559 	  	last_update_date,
2560 	  	last_updated_by,
2561 	  	last_update_login,
2562 		cost_scenario_flag,
2563 		parent_scenario_id,
2564 		constraint_priority_type)
2565    SELECT       auction_header_id,
2566 	        l_new_scenario_id,
2567 	  	scenario_name,
2568 		l_next_scenario_number,
2569 	  	objective_code,
2570 	  	'NOT_RUN',
2571 	  	price_type,
2572 	  	internal_note,
2573 	  	p_user_id,
2574 	  	sysdate,
2575 	  	sysdate,
2576 	  	l_fnd_user_id,
2577 	  	sysdate,
2578 	  	l_fnd_user_id,
2579 	  	l_fnd_user_id,
2580 		p_cost_scenario_flag,
2581 		decode(p_cost_scenario_flag, 'Y', p_scenario_id, to_number(null)),
2582 		nvl(constraint_priority_type, 'MANDATORY')
2583    FROM         pon_optimize_scenarios
2584    WHERE        scenario_id = p_scenario_id;
2585 
2586    -- copy the constraints
2587 
2588    -- make sure there is at least 1 row to prevent no data found exception
2589    select count(*) into l_num_constraints
2590    from pon_optimize_constraints
2591    where scenario_id = p_scenario_id;
2592 
2593    IF (l_num_constraints > 0) THEN
2594 
2595      INSERT INTO PON_OPTIMIZE_CONSTRAINTS(
2596 	          scenario_id,
2597 	          sequence_number,
2598 	          auction_header_id,
2599 	          constraint_type,
2600 	          line_number,
2601 	          min_amount,
2602 	  	  max_amount,
2603 	          amount_type,
2604 		  min_quantity,
2605 	          max_quantity,
2606 	          quantity_cutoff,
2607 	          price_cutoff,
2608 		  split_award_flag,
2609 	          integral_qty_award_flag,
2610 	          excluded_flag,
2611 	          from_date,
2612 	          to_date,
2613 	          min_score,
2614 	          supp_classification,
2615 	          attr_sequence_number,
2616 	          attr_group_name,
2617 	          trading_partner_id,
2618 	          trading_partner_contact_id,
2619 	          vendor_site_id,
2620 	          creation_date,
2621 	  	  created_by,
2622 	  	  last_update_date,
2623 	  	  last_updated_by,
2624 	  	  last_update_login,
2625  		 MIN_MAX_AMOUNT_PRIORITY
2626 		,MIN_MAX_AMOUNT_COST
2627 		,MIN_MAX_AMOUNT_INFEAS_FLAG
2628 		,MIN_MAX_QUANTITY_PRIORITY
2629 		,MIN_MAX_QUANTITY_COST
2630 		,MIN_MAX_QUANTITY_INFEAS_FLAG
2631 		,QUANTITY_CUTOFF_PRIORITY
2632 		,QUANTITY_CUTOFF_COST
2633 		,QUANTITY_CUTOFF_INFEAS_FLAG
2634 		,PRICE_CUTOFF_PRIORITY
2635 		,PRICE_CUTOFF_COST
2636 		,PRICE_CUTOFF_INFEAS_FLAG
2637 		,SPLIT_AWARD_PRIORITY
2638 		,SPLIT_AWARD_INFEAS_FLAG
2639 		,SPLIT_AWARD_COST
2640 		,INTEGRAL_QTY_AWARD_PRIORITY
2641 		,INTEGRAL_QTY_AWARD_INFEAS_FLAG
2642 		,INTEGRAL_QTY_AWARD_COST
2643 		,EXCLUDED_SUPPLIER_PRIORITY
2644 		,EXCLUDED_SUPPLIER_INFEAS_FLAG
2645 		,EXCLUDED_SUPPLIER_COST
2646 		,PROMISED_DATE_PRIORITY
2647 		,PROMISED_DATE_COST
2648 		,PROMISED_DATE_INFEAS_FLAG
2649 		,MIN_SCORE_PRIORITY
2650 		,MIN_SCORE_COST
2651 		,MIN_SCORE_INFEAS_FLAG)
2652      SELECT       l_new_scenario_id,
2653 	          sequence_number,
2654 	          auction_header_id,
2655 	          constraint_type,
2656 	          line_number,
2657 	          min_amount,
2658 	  	  max_amount,
2659 	          amount_type,
2660 		  min_quantity,
2661 	          max_quantity,
2662 	          quantity_cutoff,
2663 	          price_cutoff,
2664 		  split_award_flag,
2665 	          integral_qty_award_flag,
2666 	          excluded_flag,
2667 	          from_date,
2668 	          to_date,
2669 	          min_score,
2670 	          supp_classification,
2671 	          attr_sequence_number,
2672 	          attr_group_name,
2673 	          trading_partner_id,
2674 	          trading_partner_contact_id,
2675 	          vendor_site_id,
2676 	          sysdate,
2677 	  	  l_fnd_user_id,
2678 	  	  sysdate,
2679 	  	  l_fnd_user_id,
2680 	  	  l_fnd_user_id,
2681 		 MIN_MAX_AMOUNT_PRIORITY
2682 		,TO_NUMBER(NULL)
2683 		,TO_CHAR(NULL)
2684 		,MIN_MAX_QUANTITY_PRIORITY
2685 		,TO_NUMBER(NULL)
2686 		,TO_CHAR(NULL)
2687 		,QUANTITY_CUTOFF_PRIORITY
2688 		,TO_NUMBER(NULL)
2689 		,TO_CHAR(NULL)
2690 		,PRICE_CUTOFF_PRIORITY
2691 		,TO_NUMBER(NULL)
2692 		,TO_CHAR(NULL)
2693 		,SPLIT_AWARD_PRIORITY
2694 		,TO_NUMBER(NULL)
2695 		,TO_CHAR(NULL)
2696 		,INTEGRAL_QTY_AWARD_PRIORITY
2697 		,TO_NUMBER(NULL)
2698 		,TO_CHAR(NULL)
2699 		,EXCLUDED_SUPPLIER_PRIORITY
2700 		,TO_NUMBER(NULL)
2701 		,TO_CHAR(NULL)
2702 		,PROMISED_DATE_PRIORITY
2703 		,TO_NUMBER(NULL)
2704 		,TO_CHAR(NULL)
2705 		,MIN_SCORE_PRIORITY
2706 		,TO_NUMBER(NULL)
2707 		,TO_CHAR(NULL)
2708      FROM         pon_optimize_constraints
2709      WHERE        scenario_id = p_scenario_id;
2710 
2711    END IF;
2712 
2713    -- copy the bid class information
2714    -- make sure a row exists first to prevent no data found exception
2715    select count(*) into l_num_bid_classes
2716    from pon_optimize_bid_class
2717    where scenario_id = p_scenario_id;
2718 
2719    IF (l_num_bid_classes > 0) THEN
2720      INSERT INTO PON_OPTIMIZE_BID_CLASS(
2721   	          scenario_id,
2722   	          sequence_number,
2723 	          bid_number,
2724 	          creation_date,
2725 	  	  created_by,
2726 	  	  last_update_date,
2727 	  	  last_updated_by,
2728 	  	  last_update_login
2729      )
2730      SELECT       l_new_scenario_id,
2731 	          sequence_number,
2732 	          bid_number,
2733 	          sysdate,
2734 	  	  l_fnd_user_id,
2735 	  	  sysdate,
2736 	  	  l_fnd_user_id,
2737 	  	  l_fnd_user_id
2738      FROM         pon_optimize_bid_class
2739      WHERE        scenario_id = p_scenario_id;
2740   END IF;
2741 
2742   x_status := 'SUCCESS';
2743 
2744   IF (p_cost_scenario_flag = 'Y') THEN
2745 
2746   	-- populate this value only when we are
2747 	-- copying a scenario to do cost of constriant
2748 	-- calculation
2749 
2750   	x_cost_scenario_id := l_new_scenario_id;
2751   ELSE
2752 
2753 	-- else, set it to some dummy value
2754 
2755 	x_cost_scenario_id := -9999;
2756 
2757   END IF;
2758 
2759 
2760 EXCEPTION
2761    when others then
2762    x_status := 'FAILURE';
2763    raise;
2764 END copy_award_scenario;
2765 
2766 
2767 
2768 PROCEDURE batch_award_spreadsheet
2769 (
2770    p_auction_header_id IN  NUMBER,
2771    p_mode              IN  VARCHAR2,
2772    p_auctioneer_id     IN  NUMBER,
2773    p_last_update_date  IN  DATE,
2774    x_status            OUT NOCOPY VARCHAR2
2775 )
2776 IS
2777 
2778  l_award_date DATE;
2779 
2780 BEGIN
2781 	 l_award_date := SYSDATE;
2782 
2783 	 update_auction_headers(p_auction_header_id, p_mode, l_award_date, p_auctioneer_id, 'Y');
2784 --
2785 	/*  check if the auction has been modified by some other user
2786 	    If it has been modified, status returns failure
2787 	    else this is the only user modifying the auction
2788 	*/
2789 
2790 	   IF (is_auction_not_updated (p_auction_header_id, p_last_update_date)) THEN
2791 	      x_status := 'SUCCESS';
2792 		  -- update the last update date
2793 		  UPDATE pon_Auction_headers_all
2794 		  SET last_update_date = SYSDATE
2795 		  WHERE auction_header_id = p_auction_header_id;
2796 	  --
2797 		 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2798 		   FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.BATCH_AWARD_SPREADSHEET.AUCTION_ID:'
2799 				  || p_auction_header_id,'SUCCEEDED.');
2800 		END IF;
2801       --
2802    	ELSE
2803       	    x_status := 'FAILURE';
2804 		--
2805 		IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2806 		   FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.BATCH_AWARD_SPREADSHEET.AUCTION_ID:'
2807 				 || p_auction_header_id,'FAILED.');
2808 		END IF;
2809 		--
2810 	   END IF;
2811 
2812 
2813 END BATCH_AWARD_SPREADSHEET;
2814 --
2815 --
2816 ----------------------------------------------------------------
2817 -- procedure added by snatu on 08/15/03
2818 -- handles awarding in FPJ for awarding through spreadsheet
2819 ----------------------------------------------------------------
2820 --
2821 --
2822 PROCEDURE save_award_spreadsheet
2823 (
2824    p_batch_id          IN  NUMBER,
2825    p_auction_header_id IN  NUMBER,
2826    p_mode              IN  VARCHAR2,
2827    p_auctioneer_id     IN  NUMBER,
2828    p_last_update_date  IN  DATE,
2829    p_batch_enabled     IN  VARCHAR2,
2830    p_is_xml_upload     IN  VARCHAR2,
2831    x_status            OUT NOCOPY VARCHAR2
2832 )
2833 IS
2834 CURSOR c_spsheet_awards (c_batch_id NUMBER, c_auction_header_id NUMBER, c_is_xml_upload VARCHAR2) IS
2835 --Query retrives rows ordered in way exported in spreadhsheet
2836   SELECT
2837 	aii.auction_header_id,
2838 	aii.auction_line_number,
2839 	aii.bid_number,
2840 	DECODE (nvl(aii.award_status,'N'),'N',null,
2841 		    DECODE (ai.ORDER_TYPE_LOOKUP_CODE,
2842 			       'QUANTITY', aii.award_quantity,
2843                                'RATE' , decode (ai.purchase_basis , 'TEMP LABOR' , aii.award_quantity ,1) ,
2844 		   		   1) )award_quantity,
2845 	decode (nvl(aii.award_status,'N'),'Y', g_AWARD_OUTCOME_WIN,
2846 		   	g_AWARD_OUTCOME_LOSE) award_outcome,
2847 	aii.awardreject_reason,
2848         ai.group_type,
2849         aii.award_shipment_number
2850   FROM pon_award_items_interface aii,
2851   	   pon_auction_item_prices_all ai,
2852   	   pon_bid_item_prices bi,
2853            pon_auction_headers_all pah
2854   WHERE
2855 	aii.batch_id = c_batch_id
2856 	AND aii.auction_header_id = c_auction_header_id
2857 	AND aii.auction_header_id = ai.auction_header_id
2858 	AND aii.AUCTION_LINE_NUMBER = ai.LINE_NUMBER
2859 	AND bi.bid_number = aii.bid_number
2860 	AND bi.line_number = aii.AUCTION_LINE_NUMBER
2861         AND pah.auction_header_id = aii.auction_header_id
2862   ORDER BY
2863 	ai.disp_line_number asc,
2864 	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;
2865   l_spsheet_awards_rec c_spsheet_awards%ROWTYPE;
2866 --
2867   l_award_lines         t_award_lines;
2868   l_matrix_index        NUMBER;
2869   l_size    	        NUMBER;
2870   l_current_bid_number  NUMBER;
2871   l_current_update_date DATE;
2872   l_award_date          DATE;
2873   l_curr_line_num       NUMBER;
2874 --
2875   TYPE BID_LIST_TYPE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
2876   l_bid_list                     BID_LIST_TYPE;
2877   TYPE ITEM_LIST_TYPE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
2878   l_item_list                    ITEM_LIST_TYPE;
2879   TYPE ACCEPT_LIST_TYPE IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
2880   l_accept_list                  ACCEPT_LIST_TYPE;
2881   TYPE REJECT_LIST_TYPE IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
2882   l_reject_list                  REJECT_LIST_TYPE;
2883 --
2884 BEGIN
2885 
2886  l_matrix_index := 0;
2887  l_award_date := SYSDATE;
2888  l_curr_line_num := NULL;
2889 --
2890 
2891 --  Get distinct lines awarded/rejected
2892   SELECT DISTINCT auction_line_number BULK COLLECT INTO l_item_list
2893   FROM   pon_award_items_interface
2894   WHERE	 batch_id = p_batch_id
2895   AND    auction_header_id = p_auction_header_id;
2896 
2897 -- Get distinct bids awarded/rejected
2898   SELECT DISTINCT bid_number BULK COLLECT INTO l_bid_list
2899   FROM   pon_award_items_interface
2900   WHERE	 batch_id = p_batch_id
2901   AND   auction_header_id = p_auction_header_id;
2902 --
2903  -- Need to set award quantity and award_status and award_date
2904 
2905   OPEN c_spsheet_awards (p_batch_id, p_auction_header_id, p_is_xml_upload);
2906 
2907       LOOP --{
2908 	  fetch c_spsheet_awards into l_spsheet_awards_rec;
2909 	  EXIT WHEN c_spsheet_awards%NOTFOUND;
2910 	  -- Construct Matrix in any case (WIN/LOSR)
2911 	  l_matrix_index := l_matrix_index +1;
2912 	  l_award_lines(l_matrix_index).bid_number := l_spsheet_awards_rec.bid_number;
2913 	  l_award_lines(l_matrix_index).line_number := l_spsheet_awards_rec.auction_line_number;
2914 	  l_award_lines(l_matrix_index).award_status := get_award_status(l_spsheet_awards_rec.award_outcome);
2915 	  l_award_lines(l_matrix_index).award_date := l_award_date;
2916 	  l_award_lines(l_matrix_index).award_quantity := l_spsheet_awards_rec.award_quantity;
2917           l_award_lines(l_matrix_index).group_type :=  l_spsheet_awards_rec.group_type;
2918           l_award_lines(l_matrix_index).award_shipment_number := l_spsheet_awards_rec.award_shipment_number;
2919 
2920 -- Update notes per line for awarded / rejected suppleirs
2921 	  IF (l_curr_line_num IS NULL ) THEN
2922 	    l_curr_line_num := l_spsheet_awards_rec.auction_line_number;
2923 	    l_accept_list(l_curr_line_num) := NULL;
2924 	    l_reject_list(l_curr_line_num) := NULL;
2925 	  END IF;
2926 	  IF (l_curr_line_num <> l_spsheet_awards_rec.auction_line_number ) THEN
2927 	  -- new line ; update curr line
2928 	    l_curr_line_num := l_spsheet_awards_rec.auction_line_number;
2929 	    l_accept_list(l_curr_line_num) := NULL;
2930 	    l_reject_list(l_curr_line_num) := NULL;
2931 	  END IF ;
2932 --
2933 	  IF (l_accept_list(l_curr_line_num) IS NULL
2934 	      AND l_award_lines(l_matrix_index).award_status = 'AWARDED') THEN
2935 	       l_accept_list(l_curr_line_num) := l_spsheet_awards_rec.awardreject_reason;
2936 	  END IF ;
2937 --
2938 	  IF (l_reject_list(l_curr_line_num) IS NULL
2939 	      AND l_award_lines(l_matrix_index).award_status = 'REJECTED') THEN
2940 		  l_reject_list(l_curr_line_num) := l_spsheet_awards_rec.awardreject_reason;
2941 	  END IF ;
2942 --
2943 	END LOOP;
2944 
2945 	--}
2946 
2947 --
2948 	-- this procedure updates all the bid lines one-by-one
2949 
2950 	  update_bid_item_prices(p_auction_header_id,l_award_lines,p_auctioneer_id, p_mode);
2951 
2952 	  l_size := l_bid_list.count;
2953 
2954 	  FOR l_index IN 1..l_size LOOP
2955 
2956 		-- this procedure updates the award_status
2957 		-- for all the bids at the bid-header level
2958 		-- we don't need to invoke this over here -> this should be invoked after all
2959 		-- batches are exhausted
2960 
2961 	  	update_single_bid_header(l_bid_list(l_index),p_auctioneer_id);
2962 
2963 	  END LOOP;
2964 
2965 	  l_size := l_item_list.count;
2966 
2967 	  FOR l_index IN 1..l_size LOOP
2968 
2969              update_auction_item_prices(p_auction_header_id, l_item_list(l_index), l_award_date, p_auctioneer_id, p_mode);
2970 
2971              -- update acceptances per auction line
2972 	     bulk_update_pon_acceptances (
2973 	          p_auction_header_id, l_item_list(l_index),
2974 		  l_accept_list(l_item_list(l_index)), l_reject_list(l_item_list(l_index)),
2975 		  l_award_date, p_auctioneer_id, p_mode);
2976 
2977 	  END LOOP;
2978 
2979 	 /* FPK: CPA p_neg_has_lines parameter hardcoded to 'Y' as save_award_spreadsheet
2980         procedure will only be called if negotiation has lines */
2981 
2982 	-- this procedure loops over all the lines to determine the auction-header-level
2983 	-- award-status etc.
2984 
2985 	if(p_batch_enabled = 'N') then --{
2986 
2987 		update_auction_headers(p_auction_header_id, p_mode, l_award_date, p_auctioneer_id, 'Y');
2988 --
2989 	/*  check if the auction has been modified by some other user
2990 	    If it has been modified, status returns failure
2991 	    else this is the only user modifying the auction
2992 	*/
2993 
2994 	   IF (is_auction_not_updated (p_auction_header_id, p_last_update_date)) THEN
2995 	      x_status := 'SUCCESS';
2996 		  -- update the last update date
2997 		  UPDATE pon_Auction_headers_all
2998 		  SET last_update_date = SYSDATE
2999 		  WHERE auction_header_id = p_auction_header_id;
3000 	  --
3001 		 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3002 		   FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.SAVE_AWARD_SPREADSHEET.AUCTION_ID:'
3003 				  || p_auction_header_id,'SUCCEEDED.');
3004 		END IF;
3005       --
3006    	ELSE
3007       	    x_status := 'FAILURE';
3008 		--
3009 		IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3010 		   FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, 'PON_AWARD_PKG.SAVE_AWARD_SPREADSHEET.AUCTION_ID:'
3011 				 || p_auction_header_id,'FAILED.');
3012 		END IF;
3013 		--
3014 	   END IF;
3015 
3016 	else
3017 
3018                 -- delete interface data
3019                 delete from pon_award_items_interface
3020                 where batch_id = p_batch_id;
3021 
3022 		x_status := 'SUCCESS';
3023 
3024 	end if; --}
3025 
3026 --
3027 END save_award_spreadsheet;
3028 --
3029 --
3030 FUNCTION is_auction_not_updated (
3031   p_auction_header_id NUMBER,
3032   p_last_update_date DATE
3033 ) RETURN BOOLEAN
3034 IS
3035 l_current_update_date DATE;
3036 BEGIN
3037     SELECT last_update_date INTO l_current_update_date
3038     FROM pon_auction_headers_all
3039 	WHERE auction_header_id = p_auction_header_id;
3040 	IF (l_current_update_date = p_last_update_date) THEN
3041 	   RETURN TRUE;
3042 	ELSE
3043 	   RETURN FALSE;
3044 	END IF;
3045 END  is_auction_not_updated;
3046 --
3047 PROCEDURE toggle_shortlisting
3048 ( p_user_id    IN NUMBER
3049 , p_bid_number IN NUMBER
3050 , p_event      IN VARCHAR2
3051 )
3052 IS
3053 
3054 l_person_id NUMBER;
3055 
3056 BEGIN
3057   -- This will never fail even if more than one user setup w/ same buyer
3058   -- as always there will be one record for an user_id in fnd_user
3059   SELECT PERSON_PARTY_ID INTO l_person_id
3060   FROM FND_USER
3061   WHERE user_id = p_user_id;
3062 
3063   IF (p_event = 'NOT_SHORTLIST') THEN
3064     UPDATE PON_BID_HEADERS
3065     SET SHORTLIST_FLAG = 'N'
3066       , LAST_UPDATE_DATE = SYSDATE
3067       , LAST_UPDATED_BY = p_user_id
3068       , SHORTLIST_TPC_ID = l_person_id
3069     WHERE BID_NUMBER = p_bid_number;
3070   ELSIF (p_event = 'SHORTLIST') THEN
3071     UPDATE PON_BID_HEADERS
3072     SET SHORTLIST_FLAG = 'Y'
3073       , LAST_UPDATE_DATE = SYSDATE
3074       , LAST_UPDATED_BY = p_user_id
3075       , SHORTLIST_TPC_ID = l_person_id
3076     WHERE BID_NUMBER = p_bid_number;
3077   END IF;
3078 
3079 EXCEPTION
3080    when others then
3081    raise;
3082 
3083 END toggle_shortlisting;
3084 
3085 
3086 -- Returns the award amount for a negotiation.
3087 FUNCTION get_award_amount(p_auction_header_id IN NUMBER) RETURN NUMBER IS
3088   l_award_amount NUMBER;
3089 BEGIN
3090 
3091   BEGIN
3092     SELECT SUM(DECODE(ah.contract_type, 'STANDARD', bh.total_award_amount, bh.po_agreed_amount * (1/nvl(bh.rate, 1))))
3093     INTO l_award_amount
3094     FROM
3095       pon_auction_headers_all ah,
3096       pon_bid_headers bh
3097     WHERE
3098           ah.auction_header_id = p_auction_header_id
3099       AND ah.auction_header_id = bh.auction_header_id
3100       AND bh.award_status in ('AWARDED', 'PARTIAL');
3101   EXCEPTION
3102     WHEN no_data_found THEN
3103       NULL;
3104   END;
3105 
3106   RETURN l_award_amount;
3107 
3108 END get_award_amount;
3109 --
3110 --
3111 PROCEDURE award_bi_subline (
3112    p_auction_header_id IN pon_bid_headers.auction_header_id%TYPE,
3113    p_bid_number IN pon_bid_headers.bid_number%TYPE,
3114    p_parent_line_number IN pon_bid_item_prices.line_number%TYPE,
3115    p_award_status IN pon_bid_item_prices.award_status%TYPE,
3116    p_award_date IN pon_bid_item_prices.award_date%TYPE,
3117    p_auctioneer_id pon_bid_item_prices.LAST_UPDATED_BY%TYPE)
3118 IS
3119 CURSOR c_sublines (c_auction_header_id pon_bid_headers.auction_header_id%TYPE,
3120                    c_bid_number pon_bid_headers.bid_number%TYPE,
3121 				   c_parent_line_number pon_bid_item_prices.line_number%TYPE) IS
3122 --Query retrives sublines for the given parent line
3123    SELECT
3124     bi.line_number,
3125     DECODE (p_award_status, 'AWARDED',decode (aii.group_type,
3126                                         'LOT_LINE', null, decode (aii.order_type_lookup_code,
3127                                                             'FIXED PRICE', 1,
3128                                                             'AMOUNT', 1,
3129                                                             'RATE', decode (aii.purchase_basis, 'TEMP LABOR', bi.quantity, 1), bi.quantity )), null) award_quantity
3130   FROM pon_bid_item_prices bi, pon_auction_item_prices_all aii
3131   WHERE
3132 	bi.bid_number = c_bid_number
3133 	   AND bi.line_number IN (SELECT ai.line_number
3134                            FROM pon_auction_item_prices_all ai
3135                    WHERE ai.parent_line_number = c_parent_line_number
3136                    AND ai.auction_header_id = bi.auction_header_id )
3137          AND aii.auction_header_id =  bi.auction_header_id
3138          AND aii.line_number = bi.line_number;
3139 
3140   l_sublines_rec c_sublines%ROWTYPE;
3141 
3142 BEGIN
3143   OPEN c_sublines (p_auction_header_id, p_bid_number, p_parent_line_number);
3144   LOOP
3145 	  FETCH c_sublines INTO l_sublines_rec;
3146 	  EXIT WHEN c_sublines%NOTFOUND;
3147 	  -- update the child lines
3148       update_single_bid_item_prices
3149 	       (
3150 	        p_bid_number,
3151 			l_sublines_rec.line_number,
3152 			p_award_status,
3153 			l_sublines_rec.award_quantity,
3154 			p_award_date,
3155 			p_auctioneer_id
3156 		   );
3157    END LOOP;
3158 END award_bi_subline;
3159 --
3160 --
3161 ----------------------------------------------------------------
3162 -- gets the parent line
3163 --and sets the award status of parent line by querying up the child lines
3164 ----------------------------------------------------------------
3165 PROCEDURE update_bi_group_award (
3166    p_auction_header_id IN pon_bid_headers.auction_header_id%TYPE,
3167    p_bid_number IN pon_bid_headers.bid_number%TYPE,
3168    p_parent_line_number IN pon_auction_item_prices_all.parent_line_number%TYPE,
3169    p_award_date IN pon_bid_item_prices.award_date%TYPE,
3170    p_auctioneer_id IN pon_bid_item_prices.last_updated_by%TYPE )
3171 IS
3172 l_total_lines NUMBER;
3173 l_awarded_lines NUMBER;
3174 l_rejected_lines NUMBER;
3175 l_award_status pon_bid_item_prices.award_status%TYPE;
3176 BEGIN
3177   --get total, awarded/ rejected lines
3178   --
3179   SELECT count (*) ,
3180          sum(decode(bi.award_status,'AWARDED',1,0)) ,
3181          sum(decode(bi.award_status,'REJECTED',1,0))
3182   INTO l_total_lines,
3183        l_awarded_lines,
3184        l_rejected_lines
3185   FROM pon_auction_item_prices_all ai, pon_bid_item_prices bi
3186   WHERE ai.parent_line_number = p_parent_line_number
3187   AND ai.auction_header_id = p_auction_header_id
3188   and ai.auction_header_id = bi.auction_header_id(+)
3189   and bi.bid_number = p_bid_number
3190   and bi.line_number = ai.line_number;
3191 
3192   IF (l_total_lines = l_awarded_lines) THEN
3193     l_award_status := 'AWARDED' ;
3194   ELSIF  (l_awarded_lines > 0) THEN
3195     l_award_status := 'PARTIAL';
3196   ELSIF (l_total_lines = l_rejected_lines) THEN
3197     l_award_status := 'REJECTED';
3198   ELSE
3199     l_award_status := null;
3200   END IF;
3201 --
3202 	 update_single_bid_item_prices
3203 	       (
3204 	        p_bid_number,
3205 		p_parent_line_number,
3206 		l_award_status,
3207 		null,
3208 		p_award_date,
3209 		p_auctioneer_id
3210 		);
3211 
3212 END update_bi_group_award;
3213 --
3214 --
3215 PROCEDURE update_ai_group_award (
3216    p_auction_header_id IN pon_bid_headers.auction_header_id%TYPE,
3217    p_line_number IN pon_bid_item_prices.line_number%TYPE,
3218    p_award_date IN pon_bid_item_prices.award_date%TYPE,
3219    p_auctioneer_id IN pon_bid_item_prices.last_updated_by%TYPE)
3220 IS
3221 l_total_lines NUMBER;
3222 l_awarded_lines NUMBER;
3223 l_parent_line_number NUMBER;
3224 l_award_status pon_auction_item_prices_all.award_status%TYPE;
3225 BEGIN
3226   --get total and awarded lines
3227  SELECT parent_line_number INTO l_parent_line_number FROM pon_auction_item_prices_all
3228  WHERE auction_header_id = p_auction_header_id AND line_number = p_line_number;
3229 --
3230 -- all the group lines have bids if a single group line has a bid
3231 -- hence all group lines are awardable and hence considered for the count
3232   SELECT COUNT(*) INTO l_total_lines
3233   FROM pon_auction_item_prices_all ai
3234   WHERE parent_line_number = l_parent_line_number
3235   and auction_header_id = p_auction_header_id;
3236 --
3237   select COUNT(*) INTO l_awarded_lines
3238   FROM pon_auction_item_prices_all
3239   WHERE parent_line_number = l_parent_line_number
3240   AND award_status = 'AWARDED'
3241   and auction_header_id = p_auction_header_id;
3242 
3243   IF (l_total_lines = l_awarded_lines) THEN
3244     l_award_status := 'AWARDED' ;
3245   ELSIF  (l_awarded_lines > 0) THEN
3246     l_award_status := 'PARTIAL';
3247   ELSE
3248     l_award_status := null;
3249   END IF;
3250 --
3251    UPDATE pon_auction_item_prices_all
3252    SET award_status = l_award_status,
3253    	   awarded_quantity = null,
3254            award_mode = null,
3255    	   last_update_date = p_award_date,
3256 	   last_updated_by = p_auctioneer_id
3257    WHERE auction_header_id = p_auction_header_id
3258 	   AND line_number = l_parent_line_number;
3259 
3260 END update_ai_group_award;
3261 --
3262 --
3263 
3264 
3265 PROCEDURE get_award_totals(
3266 	p_auction_header_id	in 	number,
3267 	p_award_total		out	nocopy	number,
3268 	p_current_total		out	nocopy	number,
3269 	p_savings_total		out	nocopy	number,
3270 	p_savings_percent	out	nocopy	number)
3271 IS
3272 	l_current_total_temp 	NUMBER;
3273 BEGIN
3274 
3275 	p_award_total		:= 0;
3276 	p_current_total		:= 0;
3277 	p_savings_total		:= 0;
3278 	p_savings_percent	:= 0;
3279 	l_current_total_temp	:= 0;
3280 
3281         SELECT  sum(nvl2(PAIP.current_price,
3282                          PAIP.current_price * nvl(PAIP.awarded_quantity, 0),
3283                          sum(decode(PBIP.award_status, 'AWARDED', nvl(PBIP.award_quantity, 0), 0) * nvl(PBIP.award_price, 0))))
3284         INTO    p_current_total
3285         FROM    pon_bid_item_prices             PBIP,
3286                 pon_bid_headers                 PBH,
3287                 pon_auction_item_prices_all     PAIP
3288         WHERE   PAIP.auction_header_id  = p_auction_header_id
3289         AND     PAIP.auction_header_id  = PBIP.auction_header_id (+)
3290         AND     PAIP.line_number        = PBIP.line_number (+)
3291         AND     PBIP.bid_number         = PBH.bid_number (+)
3292         AND     PBH.bid_status (+)      = 'ACTIVE'
3293         AND     NVL(PBH.award_status, 'NONE') IN ('PARTIAL', 'AWARDED')
3294         GROUP BY
3295                 PAIP.line_number, PAIP.current_price, PAIP.awarded_quantity;
3296 
3297         SELECT  sum(decode(PBIP.award_status, 'AWARDED', nvl(PBIP.award_quantity, 0), 0) * nvl(PBIP.award_price, 0))
3298         INTO    p_award_total
3299         FROM    pon_bid_item_prices             PBIP,
3300                 pon_bid_headers                 PBH
3301         WHERE   PBH.auction_header_id   = p_auction_header_id
3302         AND     PBIP.bid_number         = PBH.bid_number (+)
3303         AND     PBH.bid_status (+)      = 'ACTIVE'
3304         AND     NVL(PBH.award_status, 'NONE') IN ('PARTIAL', 'AWARDED');
3305 
3306 	p_savings_total := p_current_total - p_award_total;
3307 
3308         -- safety check to avoid divide-by-zero exception
3309         IF p_current_total IS NULL OR p_current_total = 0 THEN
3310           p_savings_percent := 0;
3311 	ELSE
3312           p_savings_percent := (p_savings_total / p_current_total) * 100;
3313         END IF;
3314 
3315 EXCEPTION
3316 
3317 	WHEN OTHERS THEN
3318 
3319       	IF ( fnd_log.level_unexpected >= fnd_log.g_current_runtime_level) THEN
3320         	fnd_log.string(log_level => fnd_log.level_unexpected
3321                       ,module    => 'pon_award_pkg.get_award_totals'
3322                       ,message   => 'exception occurred while calculating totals ' || SUBSTR(SQLERRM, 1, 200));
3323       	END IF;
3324 
3325 
3326 		NULL;
3327 
3328 
3329 END;
3330 
3331 
3332 FUNCTION does_bid_exist
3333 (
3334    p_scenario_id IN  PON_OPTIMIZE_CONSTRAINTS.SCENARIO_ID%TYPE,
3335    p_sequence_number IN  PON_OPTIMIZE_CONSTRAINTS.SEQUENCE_NUMBER%TYPE,
3336    p_bid_number IN  PON_BID_HEADERS.BID_NUMBER%TYPE
3337 )  RETURN              VARCHAR2
3338 IS
3339 l_bid_exists VARCHAR2(1);
3340 BEGIN
3341 
3342   BEGIN
3343     SELECT 'Y'
3344     INTO l_bid_exists
3345     FROM dual
3346     WHERE EXISTS (SELECT 1
3347     FROM pon_optimize_bid_class pobc
3348     WHERE pobc.scenario_id = p_scenario_id
3349     AND pobc.sequence_number = p_sequence_number
3350     AND pobc.bid_number = p_bid_number);
3351 
3352    EXCEPTION
3353      WHEN NO_DATA_FOUND THEN
3354      l_bid_exists := 'N';
3355    END;
3356 return l_bid_exists;
3357 END;
3358 
3359 FUNCTION has_scored_attribute
3360 (
3361    p_auction_header_id IN  PON_AUCTION_ATTRIBUTES.AUCTION_HEADER_ID%TYPE,
3362    p_line_number IN  PON_AUCTION_ATTRIBUTES.LINE_NUMBER%TYPE
3363 )  RETURN              VARCHAR2
3364 IS
3365 l_scored_attribute_exists VARCHAR2(1);
3366 BEGIN
3367 
3368   BEGIN
3369     SELECT 'Y'
3370     INTO l_scored_attribute_exists
3371     FROM dual
3372     WHERE EXISTS (SELECT 1
3373     FROM pon_attribute_scores pas
3374     WHERE pas.auction_header_id = p_auction_header_id
3375     AND pas.line_number = p_line_number);
3376 
3377    EXCEPTION
3378      WHEN NO_DATA_FOUND THEN
3379      l_scored_attribute_exists := 'N';
3380    END;
3381 return l_scored_attribute_exists;
3382 END;
3383 
3384 PROCEDURE preprocess_cost_of_constraint
3385 (
3386   p_scenario_id         	IN NUMBER,
3387   p_user_id         		IN NUMBER,
3388   p_cost_constraint_flag	IN VARCHAR2,
3389   p_constraint_type		IN VARCHAR2,
3390   p_internal_type		IN VARCHAR2,
3391   p_line_number			IN NUMBER,
3392   p_sequence_number		IN NUMBER,
3393   x_cost_scenario_id		OUT NOCOPY NUMBER,
3394   x_status              	OUT NOCOPY VARCHAR2
3395 )
3396 IS
3397 
3398 l_new_scenario_id	 NUMBER;
3399 l_status		 VARCHAR2(10);
3400 l_order_type_lookup_code PON_AUCTION_ITEM_PRICES_ALL.order_type_lookup_code%TYPE;
3401 l_auction_qty              NUMBER;
3402 l_contract_type          PON_AUCTION_HEADERS_ALL.contract_type%TYPE;
3403 l_module                 VARCHAR2(200);
3404 l_priority               VARCHAR2(30);
3405 BEGIN
3406 
3407 l_module := 'pon.plsql.PON_AWARD_PKG.preprocess_cost_of_constraint';
3408 l_priority := '1_CRITICAL';
3409 	-- basic initialization
3410 
3411 	l_new_scenario_id := -9999;
3412 
3413         IF (g_debug_mode = 'Y') THEN
3414             IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3415                FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Entering procedure with p_scenario_id: ' || p_scenario_id );
3416                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);
3417                FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module,' p_line_number : '|| p_line_number || ' ,p_sequence_number : ' || p_sequence_number );
3418             END IF;
3419         END IF;
3420 
3421 	copy_award_scenario(p_scenario_id		=> p_scenario_id,
3422   			    p_user_id			=> p_user_id,
3423 			    p_cost_scenario_flag 	=> p_cost_constraint_flag,
3424 			    x_cost_scenario_id		=> l_new_scenario_id,
3425   			    x_status			=> l_status);
3426 
3427 
3428         IF (g_debug_mode = 'Y') THEN
3429             IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3430                   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);
3431             END IF;
3432         END IF;
3433 
3434 	IF (l_status <> 'FAILURE') THEN
3435 
3436 		-- these initial conditions are applicable to those
3437 		-- scenarios where multiple constraints are saved on the
3438 		-- same row of pon_optimize_constraints table
3439 
3440 		IF (p_constraint_type = 'LINE_CONST') THEN --{
3441 
3442 			IF (p_internal_type = 'LINE_SPLIT_AWARD') THEN
3443 
3444                                 IF (g_debug_mode = 'Y') THEN
3445                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3446                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_SPLIT_AWARD internal type constraint');
3447                                   END IF;
3448                                 END IF;
3449 
3450 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3451 				SET 	SPLIT_AWARD_FLAG 	= decode(SPLIT_AWARD_FLAG, 'Y', 'N', 'Y'),
3452 				     	SPLIT_AWARD_PRIORITY 	= NVL2(SPLIT_AWARD_PRIORITY,l_priority,null),
3453 					SPLIT_AWARD_INFEAS_FLAG = TO_CHAR(NULL),
3454 					SPLIT_AWARD_COST 	= TO_NUMBER(NULL)
3455 				WHERE   SCENARIO_ID 		= l_new_scenario_id
3456 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3457 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3458 
3459 			ELSIF (p_internal_type = 'LINE_INTEGER_QUANTITY') THEN
3460 
3461                                 IF (g_debug_mode = 'Y') THEN
3462                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3463                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_INTEGER_QUANTITY internal type constraint');
3464                                   END IF;
3465                                 END IF;
3466 
3467 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3468 				SET 	INTEGRAL_QTY_AWARD_FLAG 	= decode(INTEGRAL_QTY_AWARD_FLAG, 'Y', 'N', 'Y'),
3469 				     	INTEGRAL_QTY_AWARD_PRIORITY 	= NVL2(INTEGRAL_QTY_AWARD_PRIORITY,l_priority,null),
3470 					INTEGRAL_QTY_AWARD_INFEAS_FLAG = TO_CHAR(NULL),
3471 					INTEGRAL_QTY_AWARD_COST 	= TO_NUMBER(NULL)
3472 				WHERE   SCENARIO_ID 		= l_new_scenario_id
3473 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3474 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3475 
3476 
3477 			ELSIF (p_internal_type = 'LINE_AWARD_QTY') THEN
3478 
3479                                 BEGIN
3480                                   SELECT pah.contract_type,
3481                                          pai.order_type_lookup_code,
3482                                          nvl(pai.quantity, 1)
3483                                   INTO l_contract_type,
3484                                        l_order_type_lookup_code,
3485                                        l_auction_qty
3486                                   FROM pon_auction_headers_all pah,
3487                                        pon_auction_item_prices_all pai,
3488                                        pon_optimize_scenarios pos
3489                                  WHERE pah.auction_header_id = pai.auction_header_id
3490                                    AND pah.auction_header_id = pos.auction_header_id
3491                                    AND pai.line_number = p_line_number
3492                                    AND pos.scenario_id = l_new_scenario_id;
3493                                 EXCEPTION
3494                                   WHEN OTHERS THEN
3495                                       IF (g_debug_mode = 'Y') THEN
3496                                         IF FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3497                                           FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED, l_module, 'Selecting auction info in LINE_AWARD_QTY internal type constraint if condition caused error');
3498                                         END IF;
3499                                       END IF;
3500 
3501                                 END;
3502 
3503                                 -- We need to set Max Qty to 1 for FIXED PRICE and AMOUNT based lines for SPO, BPA and CPA
3504                                 -- For SPO, We need to set Max Qty to auction qty for QUANTITY based lines
3505                                 -- 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
3506 
3507                                 -- In the above sql for selecting the auction qty as we use nvl to set auction qty to 1,
3508                                 -- all the above conditions should be satisfied
3509 
3510                                 IF (g_debug_mode = 'Y') THEN
3511                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3512                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_AWARD_QTY internal type constraint');
3513                                   END IF;
3514                                 END IF;
3515 
3516                                 UPDATE  PON_OPTIMIZE_CONSTRAINTS
3517                                 SET     MIN_QUANTITY 	= 0,
3518 			        	MAX_QUANTITY 	= DECODE(l_order_type_lookup_code, 'FIXED PRICE', 1, 'AMOUNT', 1, l_auction_qty),
3519 					MIN_MAX_QUANTITY_PRIORITY = NVL2(MIN_MAX_QUANTITY_PRIORITY,l_priority,null),
3520 					MIN_MAX_QUANTITY_COST = TO_NUMBER(NULL),
3521 					MIN_MAX_QUANTITY_INFEAS_FLAG = TO_CHAR(NULL)
3522                                 WHERE   SCENARIO_ID 		= l_new_scenario_id
3523 				AND     SEQUENCE_NUMBER 	= p_sequence_number
3524                                 AND     CONSTRAINT_TYPE 	= p_constraint_type;
3525 
3526 			ELSIF (p_internal_type = 'LINE_AWARD_AMOUNT') THEN
3527 
3528                                 IF (g_debug_mode = 'Y') THEN
3529                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3530                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_AWARD_AMOUNT internal type constraint');
3531                                   END IF;
3532                                 END IF;
3533 
3534 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3535 				SET 	MIN_AMOUNT 		= TO_NUMBER(NULL),
3536 				     	MAX_AMOUNT 		= TO_NUMBER(NULL),
3537 					MIN_MAX_AMOUNT_PRIORITY = TO_CHAR(NULL),
3538 					MIN_MAX_AMOUNT_COST 	= TO_NUMBER(NULL),
3539 					MIN_MAX_AMOUNT_INFEAS_FLAG = TO_CHAR(NULL)
3540 				WHERE   SCENARIO_ID 		= l_new_scenario_id
3541 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3542 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3543 
3544 
3545 			ELSIF (p_internal_type = 'LINE_MIN_QTY') THEN
3546 
3547                                 IF (g_debug_mode = 'Y') THEN
3548                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3549                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_MIN_QTY internal type constraint');
3550                                   END IF;
3551                                 END IF;
3552 
3553 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3554 				SET 	QUANTITY_CUTOFF 	    = TO_NUMBER(NULL),
3555 				     	QUANTITY_CUTOFF_PRIORITY    = TO_CHAR(NULL),
3556 					QUANTITY_CUTOFF_INFEAS_FLAG = TO_CHAR(NULL),
3557 					QUANTITY_CUTOFF_COST 	= TO_NUMBER(NULL)
3558 				WHERE   SCENARIO_ID 		= l_new_scenario_id
3559 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3560 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3561 
3562 
3563 
3564 			ELSIF (p_internal_type = 'LINE_MAX_PRICE')  THEN
3565 
3566                                 IF (g_debug_mode = 'Y') THEN
3567                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3568                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_MAX_PRICE internal type constraint');
3569                                   END IF;
3570                                 END IF;
3571 
3572 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3573 				SET 	PRICE_CUTOFF 	    = TO_NUMBER(NULL),
3574 				     	PRICE_CUTOFF_PRIORITY    = TO_CHAR(NULL),
3575 					PRICE_CUTOFF_INFEAS_FLAG = TO_CHAR(NULL),
3576 					PRICE_CUTOFF_COST 	= TO_NUMBER(NULL)
3577 				WHERE   SCENARIO_ID 		= l_new_scenario_id
3578 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3579 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3580 
3581 
3582 
3583 			ELSIF (p_internal_type = 'LINE_MIN_SCORE') THEN
3584 
3585                                 IF (g_debug_mode = 'Y') THEN
3586                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3587                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_MIN_SCORE internal type constraint');
3588                                   END IF;
3589                                 END IF;
3590 				-- XYZ - SIMILAR CONDITION NEEDED FOR
3591 				-- AwardOptConstraint.SINGLE_HEADER_ATTR_CUTOFF
3592 				-- AwardOptConstraint.GROUP_HEADER_ATTR_CUTOFF
3593 
3594 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3595 				SET 	MIN_SCORE 	    = TO_NUMBER(NULL),
3596 				     	MIN_SCORE_PRIORITY    = TO_CHAR(NULL),
3597 					MIN_SCORE_INFEAS_FLAG = TO_CHAR(NULL),
3598 					MIN_SCORE_COST 	= TO_NUMBER(NULL)
3599 				WHERE   SCENARIO_ID 		= l_new_scenario_id
3600 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3601 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3602 
3603 			ELSIF (p_internal_type = 'LINE_PROMISED_DATE') THEN
3604 
3605                                 IF (g_debug_mode = 'Y') THEN
3606                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3607                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_PROMISED_DATE internal type constraint');
3608                                   END IF;
3609                                 END IF;
3610 
3611 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3612 				SET 	FROM_DATE 	      = TO_DATE(NULL),
3613 					TO_DATE			= TO_DATE(NULL),
3614 				     	PROMISED_DATE_PRIORITY    = TO_CHAR(NULL),
3615 					PROMISED_DATE_INFEAS_FLAG = TO_CHAR(NULL),
3616 					PROMISED_DATE_COST 	= TO_NUMBER(NULL)
3617 				WHERE   SCENARIO_ID 		= l_new_scenario_id
3618 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3619 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3620 
3621 			END IF;
3622 
3623 		--}
3624 
3625 		ELSIF (p_constraint_type = 'SUPP_LINE_CONST') THEN --{
3626 
3627 			-- two constraints
3628 			-- Line Number of Suppliers : same seqnum
3629 			-- Line Any One Supplier    : same seqnum
3630 
3631 			IF    (p_internal_type = 'LINE_NUM_SUPP') THEN
3632 
3633                                 IF (g_debug_mode = 'Y') THEN
3634                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3635                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_NUM_SUPP internal type constraint');
3636                                   END IF;
3637                                 END IF;
3638 
3639 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3640 				SET 	MIN_QUANTITY 	= TO_NUMBER(NULL),
3641 				     	MAX_QUANTITY 	= TO_NUMBER(NULL),
3642 					MIN_MAX_QUANTITY_PRIORITY = TO_CHAR(NULL),
3643 					MIN_MAX_QUANTITY_COST 	  = TO_NUMBER(NULL),
3644 					MIN_MAX_QUANTITY_INFEAS_FLAG = TO_CHAR(NULL)
3645 				WHERE   SCENARIO_ID 		= l_new_scenario_id
3646 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3647 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3648 
3649 
3650 			ELSIF (p_internal_type = 'LINE_ANY_ONE_SUPP') THEN
3651 
3652                                 IF (g_debug_mode = 'Y') THEN
3653                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3654                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_ANY_ONE_SUPP internal type constraint');
3655                                   END IF;
3656                                 END IF;
3657 
3658 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3659 				SET 	MIN_AMOUNT 		= TO_NUMBER(NULL),
3660 				     	MAX_AMOUNT 		= TO_NUMBER(NULL),
3661 					MIN_MAX_AMOUNT_PRIORITY = TO_CHAR(NULL),
3662 					MIN_MAX_AMOUNT_COST 	= TO_NUMBER(NULL),
3663 					MIN_MAX_AMOUNT_INFEAS_FLAG = TO_CHAR(NULL)
3664 				WHERE   SCENARIO_ID 		= l_new_scenario_id
3665 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3666 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3667 
3668 
3669 			--ELSE
3670 
3671 				--DELETE FROM PON_OPTIMIZE_CONSTRAINTS
3672 				--WHERE   SCENARIO_ID 	= p_scenario_id
3673 				--AND 	CONSTRAINT_TYPE = p_constraint_type
3674 				--AND 	SEQUENCE_NUMBER	= p_sequence_number;
3675 
3676 			END IF;
3677 
3678 		--}
3679 
3680 		ELSIF (p_constraint_type = 'SUPP_BIZ_CONST') THEN --{
3681 
3682                                 IF (g_debug_mode = 'Y') THEN
3683                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3684                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating SUPP_BIZ_CONST constraint type');
3685                                   END IF;
3686                                 END IF;
3687 
3688 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3689 				SET 	MIN_AMOUNT 		= TO_NUMBER(NULL),
3690 				     	MAX_AMOUNT 		= TO_NUMBER(NULL),
3691 					MIN_MAX_AMOUNT_PRIORITY = TO_CHAR(NULL),
3692 					MIN_MAX_AMOUNT_COST 	= TO_NUMBER(NULL),
3693 					MIN_MAX_AMOUNT_INFEAS_FLAG = TO_CHAR(NULL)
3694 				WHERE   SCENARIO_ID 		= l_new_scenario_id
3695 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3696 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3697 
3698 		--}
3699 
3700 		ELSIF (p_constraint_type = 'BID_LINE_CONST') THEN --{
3701 			IF    (p_internal_type = 'LINE_SUPP_SITE_AMT') THEN
3702 
3703                                 IF (g_debug_mode = 'Y') THEN
3704                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3705                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_SUPP_SITE_AMT internal type constraint');
3706                                   END IF;
3707                                 END IF;
3708 
3709 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3710 				SET 	MIN_AMOUNT 		= TO_NUMBER(NULL),
3711 				     	MAX_AMOUNT 		= TO_NUMBER(NULL),
3712 					MIN_MAX_AMOUNT_PRIORITY = TO_CHAR(NULL),
3713 					MIN_MAX_AMOUNT_COST 	= TO_NUMBER(NULL),
3714 					MIN_MAX_AMOUNT_INFEAS_FLAG = TO_CHAR(NULL)
3715 				WHERE   SCENARIO_ID 		= l_new_scenario_id
3716 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3717 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3718 
3719 			ELSIF    (p_internal_type = 'LINE_SUPP_SITE_QTT') THEN
3720 
3721                                 IF (g_debug_mode = 'Y') THEN
3722                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3723                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_SUPP_SITE_QTT internal type constraint');
3724                                   END IF;
3725                                 END IF;
3726 
3727 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3728 				SET 	MIN_QUANTITY 		= TO_NUMBER(NULL),
3729 				     	MAX_QUANTITY            = TO_NUMBER(NULL),
3730 					MIN_MAX_QUANTITY_PRIORITY = TO_CHAR(NULL),
3731 					MIN_MAX_QUANTITY_COST 	= TO_NUMBER(NULL),
3732 					MIN_MAX_QUANTITY_INFEAS_FLAG = TO_CHAR(NULL)
3733 				WHERE   SCENARIO_ID 		= l_new_scenario_id
3734 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3735 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3736 
3737                         END IF;
3738 		ELSE
3739 
3740                         IF (g_debug_mode = 'Y') THEN
3741                             IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3742                                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before deleting constraint from pon_optimize_constraints');
3743                             END IF;
3744                         END IF;
3745 			-- INCLUDES LINE-LEVEL INDIVIDUAL SUPPLIER CONSTRAINTS AS WELL
3746 
3747 			-- if the constraint type is either of the remaining types,
3748 			-- we can delete the row from pon_optimize_constraints
3749 			-- using the sequence_number
3750 
3751 			DELETE FROM PON_OPTIMIZE_CONSTRAINTS
3752 			WHERE   SCENARIO_ID 	= l_new_scenario_id
3753 			AND 	CONSTRAINT_TYPE = p_constraint_type
3754 			AND 	SEQUENCE_NUMBER	= p_sequence_number;
3755 
3756 		END IF;
3757 
3758 		x_cost_scenario_id := l_new_scenario_id;
3759 		x_status 	   := 'SUCCESS';
3760 
3761 	ELSE
3762 		x_cost_scenario_id := -9999;
3763 		x_status 	   := 'FAILURE';
3764 
3765 
3766 	END IF;
3767 
3768 
3769 
3770 EXCEPTION
3771 	WHEN OTHERS THEN
3772 		x_cost_scenario_id := -9999;
3773 		x_status 	   := 'FAILURE';
3774 		RAISE;
3775 
3776 END;
3777 
3778 
3779 PROCEDURE postprocess_cost_of_constraint
3780 (
3781   p_scenario_id         IN NUMBER,
3782   p_constraint_type	IN VARCHAR2,
3783   p_internal_type	IN VARCHAR2,
3784   p_line_number		IN NUMBER,
3785   p_sequence_number	IN NUMBER,
3786   x_status              OUT NOCOPY VARCHAR2
3787 )
3788 
3789 IS
3790 l_num_constraints 		NUMBER;
3791 l_num_bid_classes 		NUMBER;
3792 l_num_results			NUMBER;
3793 l_cost_of_constraint 		NUMBER;
3794 l_parent_scenario_id		NUMBER;
3795 l_module                        VARCHAR2(250);
3796 BEGIN
3797 
3798         l_module := 'pon.plsql.PON_AWARD_PKG.postprocess_cost_of_constraint';
3799         IF (g_debug_mode = 'Y') THEN
3800             IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3801                FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Entering procedure with p_scenario_id: ' || p_scenario_id );
3802                FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module,' p_constraint_type : '|| p_constraint_type || ' ,p_internal_type : '|| p_internal_type);
3803                FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module,' p_line_number : '|| p_line_number || ' ,p_sequence_number : ' || p_sequence_number );
3804             END IF;
3805         END IF;
3806 
3807 	-- USE PARENT_SCENARIO_ID TO JOIN TO MAIN SCENARIO
3808 	-- DETERMINE THE COST AS FOLLOWS -
3809 
3810 	SELECT (PARENT_SCENARIO.TOTAL_AWARD_AMOUNT - COST_SCENARIO.TOTAL_AWARD_AMOUNT),
3811 		PARENT_SCENARIO.SCENARIO_ID
3812 	INTO   	L_COST_OF_CONSTRAINT,
3813 		L_PARENT_SCENARIO_ID
3814 	FROM   PON_OPTIMIZE_SCENARIOS COST_SCENARIO,
3815 	       PON_OPTIMIZE_SCENARIOS PARENT_SCENARIO
3816 	WHERE  COST_SCENARIO.SCENARIO_ID   = p_scenario_id
3817 	AND    PARENT_SCENARIO.SCENARIO_ID = COST_SCENARIO.PARENT_SCENARIO_ID;
3818 
3819         IF (g_debug_mode = 'Y') THEN
3820             IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3821                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 );
3822             END IF;
3823         END IF;
3824 
3825 	-- UPDATE THE CORRESPONDING ROW IN CONSTRAINTS TABLE
3826 	-- OF PARENT SCENARIO WITH THIS COST OF CONSTRAINT
3827 
3828 		IF (p_constraint_type = 'LINE_CONST') THEN
3829 
3830 			IF    (p_internal_type = 'LINE_SPLIT_AWARD') THEN
3831 
3832                                 IF (g_debug_mode = 'Y') THEN
3833                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3834                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_SPLIT_AWARD internal type constraint');
3835                                   END IF;
3836                                 END IF;
3837 
3838 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3839 				SET 	SPLIT_AWARD_COST 	= l_cost_of_constraint
3840 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
3841 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3842 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3843 
3844 			ELSIF (p_internal_type = 'LINE_INTEGER_QUANTITY') THEN
3845 
3846                                 IF (g_debug_mode = 'Y') THEN
3847                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3848                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_INTEGER_QUANTITY internal type constraint');
3849                                   END IF;
3850                                 END IF;
3851 
3852 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3853 				SET 	INTEGRAL_QTY_AWARD_COST = l_cost_of_constraint
3854 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
3855 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3856 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3857 
3858 
3859 			ELSIF (p_internal_type = 'LINE_AWARD_QTY') THEN
3860 
3861                                 IF (g_debug_mode = 'Y') THEN
3862                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3863                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_AWARD_QTY internal type constraint');
3864                                   END IF;
3865                                 END IF;
3866 
3867 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3868 				SET 	MIN_MAX_QUANTITY_COST 	= l_cost_of_constraint
3869 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
3870 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3871 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3872 
3873 
3874 			ELSIF (p_internal_type = 'LINE_AWARD_AMOUNT') THEN
3875 
3876                                 IF (g_debug_mode = 'Y') THEN
3877                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3878                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_AWARD_AMOUNT internal type constraint');
3879                                   END IF;
3880                                 END IF;
3881 
3882 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3883 				SET 	MIN_MAX_AMOUNT_COST 	= l_cost_of_constraint
3884 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
3885 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3886 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3887 
3888 
3889 			ELSIF (p_internal_type = 'LINE_MIN_QTY') THEN
3890 
3891                                 IF (g_debug_mode = 'Y') THEN
3892                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3893                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_MIN_QTY internal type constraint');
3894                                   END IF;
3895                                 END IF;
3896 
3897 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3898 				SET 	QUANTITY_CUTOFF_COST 	= l_cost_of_constraint
3899 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
3900 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3901 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3902 
3903 
3904 
3905 			ELSIF (p_internal_type = 'LINE_MAX_PRICE')  THEN
3906 
3907                                 IF (g_debug_mode = 'Y') THEN
3908                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3909                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_MAX_PRICE internal type constraint');
3910                                   END IF;
3911                                 END IF;
3912 
3913 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3914 				SET 	PRICE_CUTOFF_COST 	= l_cost_of_constraint
3915 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
3916 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3917 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3918 
3919 
3920 
3921 			ELSIF (p_internal_type = 'LINE_MIN_SCORE') THEN
3922 
3923                                 IF (g_debug_mode = 'Y') THEN
3924                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3925                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_MIN_SCORE internal type constraint');
3926                                   END IF;
3927                                 END IF;
3928 
3929 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3930 				SET 	MIN_SCORE_COST 	= l_cost_of_constraint
3931 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
3932 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3933 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3934 
3935 			ELSIF (p_internal_type = 'LINE_PROMISED_DATE') THEN
3936 
3937                                 IF (g_debug_mode = 'Y') THEN
3938                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3939                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_PROMISED_DATE internal type constraint');
3940                                   END IF;
3941                                 END IF;
3942 
3943 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3944 				SET 	PROMISED_DATE_COST 	= l_cost_of_constraint
3945 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
3946 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3947 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3948 
3949 			END IF;
3950 
3951 		ELSIF (p_constraint_type = 'SUPP_LINE_CONST') THEN
3952 
3953 			-- three constraints
3954 
3955 			-- Line Number of Suppliers : same seqnum
3956 			-- Line Any One Supplier    : same seqnum
3957 			-- Line-level award amount and
3958 			-- award quantity for each supplier : different seqnum
3959 
3960 
3961 			IF    (p_internal_type = 'LINE_NUM_SUPP') THEN
3962 
3963                                 IF (g_debug_mode = 'Y') THEN
3964                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3965                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_NUM_SUPP internal type constraint');
3966                                   END IF;
3967                                 END IF;
3968 
3969 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3970 				SET 	MIN_MAX_QUANTITY_COST 	  = l_cost_of_constraint
3971 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
3972 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3973 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3974 
3975 
3976 			ELSIF (p_internal_type = 'LINE_ANY_ONE_SUPP') THEN
3977 
3978                                 IF (g_debug_mode = 'Y') THEN
3979                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3980                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_ANY_ONE_SUPP internal type constraint');
3981                                   END IF;
3982                                 END IF;
3983 
3984 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
3985 				SET 	MIN_MAX_AMOUNT_COST 	= l_cost_of_constraint
3986 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
3987 				AND	SEQUENCE_NUMBER 	= p_sequence_number
3988 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
3989 
3990 			END IF;
3991 
3992 		ELSIF (p_constraint_type = 'BID_LINE_CONST') THEN
3993 
3994 			IF    (p_internal_type = 'LINE_SUPP_SITE_AMT') THEN
3995 
3996                                 IF (g_debug_mode = 'Y') THEN
3997                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3998                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_SUPP_SITE_AMT internal type constraint');
3999                                   END IF;
4000                                 END IF;
4001 
4002 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
4003 				SET 	MIN_MAX_AMOUNT_COST = l_cost_of_constraint
4004 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
4005 				AND	SEQUENCE_NUMBER 	= p_sequence_number
4006 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
4007 
4008 			ELSIF    (p_internal_type = 'LINE_SUPP_SITE_QTT') THEN
4009 
4010                                 IF (g_debug_mode = 'Y') THEN
4011                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4012                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating LINE_SUPP_SITE_QTT internal type constraint');
4013                                   END IF;
4014                                 END IF;
4015 
4016 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
4017 				SET 	MIN_MAX_QUANTITY_COST 	  = l_cost_of_constraint
4018 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
4019 				AND	SEQUENCE_NUMBER 	= p_sequence_number
4020 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
4021 
4022                         END IF;
4023 		ELSIF (p_constraint_type = 'SUPP_BIZ_CONST') THEN
4024 
4025                                 IF (g_debug_mode = 'Y') THEN
4026                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4027                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating SUPP_BIZ_CONST constraint type');
4028                                   END IF;
4029                                 END IF;
4030 
4031 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
4032 				SET 	MIN_MAX_AMOUNT_COST 	= l_cost_of_constraint
4033 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
4034 				AND	SEQUENCE_NUMBER 	= p_sequence_number
4035 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
4036 
4037 		ELSIF (	p_constraint_type = 'BUDGET_AMT_CONST'  OR
4038 			p_constraint_type = 'INCUMBENT_SUPP_CONST' OR
4039 			p_constraint_type = 'ANY_SUPP_CONST' OR
4040 			p_constraint_type = 'SUPP_ASL_CONST' OR
4041 			p_constraint_type = 'SUPPLIER_CONST' )  THEN
4042 
4043 
4044                                 IF (g_debug_mode = 'Y') THEN
4045                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4046                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating BUDGET_AMT_CONST, INCUMBENT_SUPP_CONST, ANY_SUPP_CONST, ');
4047                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'SUPP_ASL_CONST, SUPPLIER_CONST  constraint types');
4048                                   END IF;
4049                                 END IF;
4050 
4051 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
4052 				SET 	MIN_MAX_AMOUNT_COST 	= l_cost_of_constraint
4053 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
4054 				AND	SEQUENCE_NUMBER 	= p_sequence_number
4055 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
4056 
4057 		ELSIF (p_constraint_type = 'NUM_OF_SUPP_CONST') THEN
4058 
4059                                 IF (g_debug_mode = 'Y') THEN
4060                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4061                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating NUM_OF_SUPP_CONST constraint type');
4062                                   END IF;
4063                                 END IF;
4064 
4065 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
4066 				SET 	MIN_MAX_QUANTITY_COST 	= l_cost_of_constraint
4067 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
4068 				AND	SEQUENCE_NUMBER 	= p_sequence_number
4069 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
4070 
4071 		ELSIF (	p_constraint_type = 'TOTAL_HDR_ATTR_CONST' OR
4072 			p_constraint_type = 'HDR_ATTR_CONST' ) THEN
4073 
4074                                 IF (g_debug_mode = 'Y') THEN
4075                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4076                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating TOTAL_HDR_ATTR_CONST, HDR_ATTR_CONST constraint types');
4077                                   END IF;
4078                                 END IF;
4079 
4080 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
4081 				SET 	MIN_SCORE_COST 		= l_cost_of_constraint
4082 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
4083 				AND	SEQUENCE_NUMBER 	= p_sequence_number
4084 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
4085 
4086 		ELSIF (p_constraint_type = 'INCL_HOLD_SUPP_CONST') THEN
4087 
4088                                 IF (g_debug_mode = 'Y') THEN
4089                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4090                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating INCL_HOLD_SUPP_CONST constraint type');
4091                                   END IF;
4092                                 END IF;
4093 
4094 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
4095 				SET 	EXCLUDED_SUPPLIER_COST 	= l_cost_of_constraint
4096 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
4097 				AND	SEQUENCE_NUMBER 	= p_sequence_number
4098 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
4099 
4100 		ELSIF (p_constraint_type = 'NO_SPLIT_GROUP_CONST') THEN
4101 
4102                                 IF (g_debug_mode = 'Y') THEN
4103                                   IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4104                                     FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before updating NO_SPLIT_GROUP_CONST constraint type');
4105                                   END IF;
4106                                 END IF;
4107 
4108 				UPDATE 	PON_OPTIMIZE_CONSTRAINTS
4109 				SET 	SPLIT_AWARD_COST 	= l_cost_of_constraint
4110 				WHERE   SCENARIO_ID 		= l_parent_scenario_id
4111 				AND	SEQUENCE_NUMBER 	= p_sequence_number
4112 				AND	CONSTRAINT_TYPE 	= p_constraint_type;
4113 		END IF;
4114 
4115         IF (g_debug_mode = 'Y') THEN
4116             IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4117                FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT, l_module, 'Before deleting the dummy scneario with p_scenario_id: ' || p_scenario_id );
4118             END IF;
4119         END IF;
4120 
4121 	DELETE FROM PON_OPTIMIZE_SCENARIOS  WHERE SCENARIO_ID = P_SCENARIO_ID;
4122 
4123 	-- do some basic initialization
4124 
4125 	l_num_constraints := 0;
4126 	l_num_bid_classes := 0;
4127 	l_num_results     := 0;
4128 
4129 
4130 	-- make sure there is at least 1 row to prevent no data found exception
4131 	select count(*) into l_num_constraints
4132 	from pon_optimize_constraints
4133 	where scenario_id = p_scenario_id;
4134 
4135 	IF (l_num_constraints > 0) THEN
4136           IF (g_debug_mode = 'Y') THEN
4137             IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4138                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 );
4139             END IF;
4140           END IF;
4141 
4142 	 DELETE FROM PON_OPTIMIZE_CONSTRAINTS WHERE SCENARIO_ID = P_SCENARIO_ID;
4143 
4144 	END IF;
4145 
4146 	select count(*) into l_num_bid_classes
4147    	from pon_optimize_bid_class
4148    	where scenario_id = p_scenario_id;
4149 
4150 	IF (l_num_bid_classes > 0) THEN
4151           IF (g_debug_mode = 'Y') THEN
4152             IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4153                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 );
4154             END IF;
4155           END IF;
4156 
4157 	 DELETE FROM PON_OPTIMIZE_BID_CLASS WHERE SCENARIO_ID = P_SCENARIO_ID;
4158 	END IF;
4159 
4160 	select count(*) into l_num_results
4161    	from pon_optimize_results
4162    	where scenario_id = p_scenario_id;
4163 
4164         IF(l_num_results > 0) THEN
4165           IF (g_debug_mode = 'Y') THEN
4166             IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4167                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 );
4168             END IF;
4169           END IF;
4170 
4171 		DELETE FROM PON_OPTIMIZE_RESULTS WHERE SCENARIO_ID = P_SCENARIO_ID;
4172 
4173  	END IF;
4174 
4175 	X_STATUS := 'SUCCESS';
4176 
4177 EXCEPTION
4178 	WHEN OTHERS THEN
4179 		X_STATUS := 'FAILURE';
4180                 IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4181                     FND_LOG.STRING(log_level => fnd_log.LEVEL_UNEXPECTED
4182                       ,module    => l_module
4183                       ,message   => 'When others exception raised in postprocess_cost_of_constraint');
4184                 END IF;
4185 
4186 		RAISE;
4187 END;
4188 
4189 
4190 PROCEDURE reset_cost_of_constraint
4191 (
4192   p_scenario_id         IN NUMBER,
4193   x_status              OUT NOCOPY VARCHAR2
4194 )
4195 
4196 IS
4197 
4198 l_num_constraints 	NUMBER;
4199 
4200 BEGIN
4201 
4202 	-- initialize number of constraints
4203 	l_num_constraints := -1;
4204 
4205 	-- make sure there is at least 1 row to prevent no data found exception
4206 	select count(*) into l_num_constraints
4207 	from pon_optimize_constraints
4208 	where scenario_id = p_scenario_id;
4209 
4210 	IF (l_num_constraints > 0) THEN
4211 
4212 	  UPDATE PON_OPTIMIZE_CONSTRAINTS
4213 	  SET
4214 		MIN_MAX_AMOUNT_COST 	= TO_NUMBER(NULL),
4215 		MIN_MAX_QUANTITY_COST 	= TO_NUMBER(NULL),
4216 		PRICE_CUTOFF_COST 	= TO_NUMBER(NULL),
4217 		SPLIT_AWARD_COST 	= TO_NUMBER(NULL),
4218 		QUANTITY_CUTOFF_COST 	= TO_NUMBER(NULL),
4219 		INTEGRAL_QTY_AWARD_COST = TO_NUMBER(NULL),
4220 		EXCLUDED_SUPPLIER_COST 	= TO_NUMBER(NULL),
4221 		PROMISED_DATE_COST 	= TO_NUMBER(NULL),
4222 		MIN_SCORE_COST 		= TO_NUMBER(NULL)
4223  	  WHERE
4224 		SCENARIO_ID = P_SCENARIO_ID;
4225 
4226 	END IF;
4227 
4228 	X_STATUS := 'SUCCESS';
4229 
4230 EXCEPTION
4231 	WHEN OTHERS THEN
4232 		X_STATUS := 'FAILURE';
4233 		RAISE;
4234 END;
4235 
4236 /*======================================================================
4237  FUNCTION :  GET_SAVING_PERCENT_INCENTIVE    PUBLIC
4238  PARAMETERS:
4239   p_scenario_id    IN    scenario id
4240 
4241  COMMENT   : Returns the saving percent of the given scenario.
4242 ======================================================================*/
4243 FUNCTION GET_SAVING_PERCENT_INCENTIVE (p_scenario_id   IN NUMBER)
4244        RETURN NUMBER
4245 IS
4246   L_SAVING_PERCENT NUMBER := 0;
4247 
4248   l_total_award NUMBER := 0;
4249   l_new_rebate NUMBER := 0;
4250   l_incentive NUMBER := 0;
4251   l_total_incentive NUMBER := 0;
4252   l_total_current_amount NUMBER := 0;
4253 
4254   l_bid_number_col 			 PON_NEG_COPY_DATATYPES_GRP.NUMBER_TYPE;
4255   l_award_total_sum_col		 PON_NEG_COPY_DATATYPES_GRP.NUMBER_TYPE;
4256   l_savings_amount_col		 PON_NEG_COPY_DATATYPES_GRP.NUMBER_TYPE;
4257   l_current_amount_col		 PON_NEG_COPY_DATATYPES_GRP.NUMBER_TYPE;
4258   l_current_total_spend_col  PON_NEG_COPY_DATATYPES_GRP.NUMBER_TYPE;
4259   l_fixed_incentive_col      PON_NEG_COPY_DATATYPES_GRP.NUMBER_TYPE;
4260   l_current_rebate_col       PON_NEG_COPY_DATATYPES_GRP.NUMBER_TYPE;
4261 
4262 BEGIN
4263 
4264 SELECT
4265 bi.bid_number as selected_bid_number,
4266 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,
4267 SUM(por.award_quantity * nvl2(ai.current_price,  (ai.current_price -por.award_price),   0)) AS savings_amount,
4268 SUM(por.award_quantity * nvl(ai.current_price,por.award_price)) AS current_amount,
4269 nvl(pbh.CURRENT_TOTAL_SPEND, 0) CURRENT_TOTAL_SPEND,
4270 nvl(pbh.FIXED_INCENTIVE, 0) FIXED_INCENTIVE,
4271 nvl(pbh.CURRENT_REBATE,0) CURRENT_REBATE
4272 BULK COLLECT INTO
4273   l_bid_number_col ,
4274   l_award_total_sum_col	,
4275   l_savings_amount_col,
4276   l_current_amount_col,
4277   l_current_total_spend_col,
4278   l_fixed_incentive_col,
4279   l_current_rebate_col
4280 FROM
4281 pon_bid_item_prices bi,
4282 pon_auction_item_prices_all ai,
4283 pon_optimize_scenarios pos,
4284 pon_optimize_results por,
4285 pon_bid_shipments pbs,
4286 pon_bid_headers pbh
4287 WHERE
4288 por.scenario_id = pos.scenario_id
4289 AND
4290 por.bid_number = bi.bid_number
4291 AND
4292 pos.auction_header_id = bi.auction_header_id
4293 AND
4294 ai.auction_header_id = bi.auction_header_id
4295 AND
4296 bi.line_number = por.line_number
4297 AND
4298 ai.line_number = bi.line_number
4299 AND
4300 ai.group_type in ('LINE', 'LOT', 'GROUP_LINE')
4301 AND
4302 nvl(por.award_quantity, -1) > 0
4303 AND
4304 por.bid_number = pbh.bid_number
4305 and
4306 pos.scenario_id = p_scenario_id
4307 AND por.bid_number = pbs.bid_number(+)
4308 AND por.line_number = pbs.line_number(+)
4309 AND nvl(por.award_shipment_number,   -1) = pbs.shipment_number(+)
4310 GROUP BY bi.bid_number, pbh.CURRENT_TOTAL_SPEND, pbh.FIXED_INCENTIVE, pbh.CURRENT_REBATE;
4311 
4312 FOR i IN 1..l_bid_number_col.COUNT LOOP
4313 
4314 	l_total_Award := l_award_total_sum_col(i) + l_current_total_spend_col(i);
4315 
4316 	BEGIN
4317 		 select rebate
4318 		 into l_new_rebate
4319 		 from pon_bid_rebates
4320 		 where bid_number = l_bid_number_col(i)
4321 	 	  	   and l_total_award between lower_spend and upper_spend;
4322 
4323 	EXCEPTION WHEN NO_DATA_FOUND THEN
4324 			  l_new_rebate := 0;
4325 	END;
4326 
4327 	if l_new_rebate = 0 then
4328 	   l_new_rebate := l_current_rebate_col(i);
4329 	end if;
4330 
4331 	l_incentive :=  l_fixed_incentive_col(i) + (l_award_total_sum_col(i) * l_new_rebate / 100 )
4332 					+ l_current_total_spend_col(i) * ( l_new_rebate - l_current_rebate_col(i) )/100;
4333 
4334 	l_total_incentive := l_total_incentive + l_incentive + l_savings_amount_col(i);
4335 	l_total_current_amount := l_total_current_amount + l_current_amount_col(i);
4336 END LOOP;
4337 
4338 	if l_total_current_amount <> 0 then
4339 	  l_saving_percent := l_total_incentive/l_total_current_amount*100;
4340 	end if;
4341 
4342     RETURN l_saving_percent;
4343 EXCEPTION
4344   WHEN OTHERS THEN
4345     RETURN 0;
4346 END GET_SAVING_PERCENT_INCENTIVE;
4347 
4348 
4349 END PON_AWARD_PKG;