DBA Data[Home] [Help]

PACKAGE BODY: APPS.OE_CANCEL

Source


1 PACKAGE BODY OE_CANCEL AS
2 /* $Header: OECANCLB.pls 115.7 99/08/24 11:52:30 porting shi $ */
3 
4 
5 
6 ------------------------------------------------------------------------
7 -- procedure CHECK_ORDER_CANCELLABLE
8 --
9 --	If the order being checked is an RMA check to see if there
10 --	are are line that have been Partially Accepted (S29=16) or
11 --	Completely Accepted (S29=17).  If this is the fact then the
12 --	order is not cancellable.  Since the order lines are not
13 --      updated until the RMA interface concurrent program is run,
14 --	there is a possiblity that order lines have been received by
15 --	Inventory and the Order Line status is Interfaced (S29=14).
16 --	In this case we need to make sure that no RMA line qtys have
17 --	been received by INV. If qtys have been received then the
18 --	Order is not cancellable.
19 --	If the order being checked for cancellation is not an RMA,
20 --	there is a need to check and see if this order contains
21 --	ATO lines whose details are still linked.  In this case
22 --	the order is not cancellable.
23 --
24 -- RETURNS:
25 --	1 -> if order is cancellable
26 --	0 -> if order is not cancellable
27 ------------------------------------------------------------------------
28 
29 procedure  CHECK_ORDER_CANCELLABLE(
30    V_HEADER_ID                       IN NUMBER
31 ,  V_ORDER_CATEGORY                  IN VARCHAR2
32 ,  V_PRINT_ERR_MSG                   IN NUMBER
33 ,  V_RESULT			     OUT NUMBER
34                           )
35 IS
36    DUMMY		NUMBER := 0;
37    RECEIVED_QUANTITY	NUMBER := 0;
38    x                    BOOLEAN;
39 BEGIN
40 
41 
42    IF (V_ORDER_CATEGORY = 'RMA') THEN
43 
44 	SELECT COUNT(*)
45 	INTO DUMMY
46 	FROM SO_LINES
47 	WHERE HEADER_ID = V_HEADER_ID
48 	AND S29 IN (16, 17);
49 
50 
51 
52 	IF (DUMMY >= 1) THEN
53 		V_RESULT := 0;
54 		x :=OE_MSG.SET_MESSAGE_NAME('OE_CAN_RMA_INTERFACED');
55 		-- "You cannot cancel this Return at this level."
56 	ELSE
57 		SELECT	NVL(SUM(NVL(MTLSRR.RECEIVED_QUANTITY,0)),0)
58 		INTO	RECEIVED_QUANTITY
59 		FROM	MTL_SO_RMA_RECEIPTS MTLSRR,
60 		MTL_SO_RMA_INTERFACE MTLSRI
61 		WHERE  MTLSRR.RMA_INTERFACE_ID = MTLSRI.RMA_INTERFACE_ID
62 		AND    MTLSRI.RMA_LINE_ID IN
63 			(SELECT LINE_ID
64 			FROM   SO_LINES
65 			WHERE  HEADER_ID = V_HEADER_ID
66 			AND    S29 = 14);
67 
68 		IF (RECEIVED_QUANTITY > 0) THEN
69 			V_RESULT := 0;
70 			x :=OE_MSG.SET_MESSAGE_NAME('OE_CAN_RMA_INTERFACED');
71 	                -- "You cannot cancel this Return at this level."
72  		ELSE
73 			V_RESULT := 1;
74 	        END IF;
75 	END IF;
76     ELSE
77 	SELECT	COUNT(*)
78 	INTO 	DUMMY
79 	FROM 	SO_LINE_DETAILS SLD,
80 		SO_LINES SOL
81 	WHERE	SOL.HEADER_ID = V_HEADER_ID
82 	AND	SLD.LINE_ID = SOL.LINE_ID
83 	AND	SLD.SCHEDULE_STATUS_CODE = 'SUPPLY_RESERVED'
84 	AND	SLD.WIP_COMPLETED_QUANTITY < SLD.QUANTITY;
85 
86 	IF (DUMMY >= 1) THEN
87 		V_RESULT := 0;
88 		x :=OE_MSG.SET_MESSAGE_NAME('OE_CAN_ATO_DETS_LINKED');
89 		-- This order contains ATO lines whose details are
90 		-- linked. See explanation
94      END IF;
91 	ELSE
92 		V_RESULT := 1;
93 	END IF;
95 
96 END CHECK_ORDER_CANCELLABLE; -- CHECK_ORDER_CANCELLABLE
97 
98 ------------------------------------------------------------------------
99 -- procedure UPDATE_HEADER_INFO
100 
101 --	Update the SO_HEADERS table to reflect that the Order has been
102 --	cancelled. This is done by setting the S4 (Cancel Order) column
103 --	to 11 (Complete). Then the lines in the SO_LINES table are also
104 --	updated to reflect the order cancellation. The open_flag is set
105 --	to null, the cancelled_quantity is set to ordered_quantity
106 --	and S9 (Cancel Line) is set to 11 (Complete).
107 --      If the order is also an RMA any records in the interface that
108 --	have not been received by INV need to be modified so they
109 --	don't get picked by the next run of the RMA inferface program.
110 --	For those record found in the interface set the quantity to 0
111 --	and set the closed_flag to 'Y'.
112 --	Need to insert a record into so_order_cancellations indicating
113 --	the order level cancellation. We also need to detele the
114 --	corresponding so_line_details for the order just cancelled,
115 --	excluding any line details that have been released. Also
116 --	need to cleanup the so_line_service_details if there were any
117 --	lines that were of a service nature.
118 --
119 -- RETURNS:
120 --      1 -> order has been cancelled
121 ------------------------------------------------------------------------
122 
123 procedure UPDATE_HEADER_INFO(
124 	V_HEADER_ID		IN NUMBER
125 ,	V_ORDER_CATEGORY	IN VARCHAR2
126 ,	V_CANCEL_COMMENT	IN LONG
127 ,	V_CANCEL_CODE		IN VARCHAR2
128 ,	V_LAST_UPDATED_BY	IN NUMBER
129 ,	V_LAST_UPDATE_LOGIN	IN NUMBER
130 ,	V_SOURCE_CODE		IN VARCHAR2
131 ,	V_PRINT_ERR_MSG		IN NUMBER
132 ,	V_RESULT		OUT NUMBER)
133 
134 is
135 
136 	x               BOOLEAN;
137         v_current_user  NUMBER;
138 
139 BEGIN
140 
141         v_current_user := to_number(FND_PROFILE.VALUE('USER_ID'));
142 
143  --
144  -- Set the S values for the headers, specifically set S4 (Cancel Order) to
145  -- 11 (Complete)
146  --
147  UPDATE	SO_HEADERS
148  SET 	S1 = DECODE(S1,18,'',S1),
149       	S1_DATE = DECODE(S1,18,'',S1_DATE),
150       	S2 = DECODE(S2,18,'',S2),
151       	S2_DATE = DECODE(S2,18,'',S2_DATE),
152       	S3 = DECODE(S3,18,'',S3),
153       	S3_DATE = DECODE(S3,18,'',S3_DATE),
154       	S4 = 11,
155       	S4_DATE = SYSDATE,
156       	S5 = DECODE(S5,18,'',S5),
157       	S5_DATE = DECODE(S5,18,'',S5_DATE),
158       	S6 = DECODE(S6,18,'',S6),
159       	S6_DATE = DECODE(S6,18,'',S6_DATE),
160       	S7 = DECODE(S7,18,'',S7),
161       	S7_DATE = DECODE(S7,18,'',S7_DATE),
162       	S8 = DECODE(S8,18,'',S8),
163       	S8_DATE = DECODE(S8,18,'',S8_DATE),
164       	S9 = DECODE(S9,18,'',S9),
165       	S9_DATE = DECODE(S9,18,'',S9_DATE),
166       	S10 = DECODE(S10,18,'',S10),
167       	S10_DATE = DECODE(S10,18,'',S10_DATE),
168       	S11 = DECODE(S11,18,'',S11),
169       	S11_DATE = DECODE(S11,18,'',S11_DATE),
170       	S12 = DECODE(S12,18,'',S12),
171       	S12_DATE = DECODE(S12,18,'',S12_DATE),
172       	S13 = DECODE(S13,18,'',S13),
173       	S13_DATE = DECODE(S13,18,'',S13_DATE),
174       	S14 = DECODE(S14,18,'',S14),
175       	S14_DATE = DECODE(S14,18,'',S14_DATE),
176       	S15 = DECODE(S15,18,'',S15),
177       	S15_DATE = DECODE(S15,18,'',S15_DATE),
178       	S16 = DECODE(S16,18,'',S16),
179       	S16_DATE = DECODE(S16,18,'',S16_DATE),
180       	S17 = DECODE(S17,18,'',S17),
181       	S17_DATE = DECODE(S17,18,'',S17_DATE),
182       	S18 = DECODE(S18,18,'',S18),
183       	S18_DATE = DECODE(S18,18,'',S18_DATE),
184       	S19 = DECODE(S19,18,'',S19),
185       	S19_DATE = DECODE(S19,18,'',S19_DATE),
186       	S20 = DECODE(S20,18,'',S20),
187       	S20_DATE = DECODE(S20,18,'',S20_DATE),
188       	S21 = DECODE(S21,18,'',S21),
189       	S21_DATE = DECODE(S21,18,'',S21_DATE),
190       	S22 = DECODE(S22,18,'',S22),
191       	S22_DATE = DECODE(S22,18,'',S22_DATE),
192       	S23 = DECODE(S23,18,'',S23),
193       	S23_DATE = DECODE(S23,18,'',S23_DATE),
194       	S24 = DECODE(S24,18,'',S24),
195       	S24_DATE = DECODE(S24,18,'',S24_DATE),
196       	S25 = DECODE(S25,18,'',S25),
197       	S25_DATE = DECODE(S25,18,'',S25_DATE),
198       	S26 = DECODE(S26,18,'',S26),
199       	S26_DATE = DECODE(S26,18,'',S26_DATE),
200       	S27 = DECODE(S27,18,'',S27),
201       	S27_DATE = DECODE(S27,18,'',S27_DATE),
202       	S28 = DECODE(S28,18,'',S28),
203       	S28_DATE = DECODE(S28,18,'',S28_DATE),
204       	S29 = DECODE(S29,18,'',S29),
205       	S29_DATE = DECODE(S29,18,'',S29_DATE),
206       	S30 = DECODE(S30,18,'',S30),
207       	S30_DATE = DECODE(S30,18,'',S30_DATE)
208  WHERE 	HEADER_ID = V_HEADER_ID;
209 
210  --
211  -- Set the S values for the lines, specifically set S9 (Cancel Line) to
212  -- 11 (Complete)
213  --
214 
215  UPDATE	SO_LINES
216  SET 	LAST_UPDATED_BY = V_LAST_UPDATED_BY,
217       	LAST_UPDATE_LOGIN = V_LAST_UPDATE_LOGIN,
218       	LAST_UPDATE_DATE = SYSDATE,
219 	OPEN_FLAG  = NULL,
220       	CANCELLED_QUANTITY = ORDERED_QUANTITY,
221       	S1 = DECODE(S1,18,8,S1),
222       	S1_DATE = DECODE(S1,18,sysdate,S1_DATE),
223       	S2 = DECODE(S2,18,8,S2),
224       	S2_DATE = DECODE(S2,18,sysdate,S2_DATE),
225       	S3 = DECODE(S3,18,8,S3),
226       	S3_DATE = DECODE(S3,18,sysdate,S3_DATE),
227       	S4 = DECODE(S4,18,8,S4),
228       	S4_DATE = DECODE(S4,18,sysdate,S4_DATE),
229       	S5 = DECODE(S5,18,8,S5),
230       	S5_DATE = DECODE(S5,18,sysdate,S5_DATE),
231       	S6 = DECODE(S6,18,8,S6),
232       	S6_DATE = DECODE(S6,18,sysdate,S6_DATE),
233       	S7 = DECODE(S7,18,8,S7),
234       	S7_DATE = DECODE(S7,18,sysdate,S7_DATE),
235       	S8 = DECODE(S8,18,8,S8),
236       	S8_DATE = DECODE(S8,18,sysdate,S8_DATE),
237       	S9 = 11,
238       	S9_DATE = SYSDATE,
239       	S10 = DECODE(S10,18,8,S10),
240       	S10_DATE = DECODE(S10,18,sysdate,S10_DATE),
241       	S11 = DECODE(S11,18,8,S11),
242       	S11_DATE = DECODE(S11,18,sysdate,S11_DATE),
243       	S12 = DECODE(S12,18,8,S12),
244       	S12_DATE = DECODE(S12,18,sysdate,S12_DATE),
245       	S13 = DECODE(S13,18,8,S13),
246       	S13_DATE = DECODE(S13,18,sysdate,S13_DATE),
247       	S14 = DECODE(S14,18,8,S14),
248       	S14_DATE = DECODE(S14,18,sysdate,S14_DATE),
249       	S15 = DECODE(S15,18,8,S15),
250       	S15_DATE = DECODE(S15,18,sysdate,S15_DATE),
251       	S16 = DECODE(S16,18,8,S16),
252       	S16_DATE = DECODE(S16,18,sysdate,S16_DATE),
253       	S17 = DECODE(S17,18,8,S17),
254       	S17_DATE = DECODE(S17,18,sysdate,S17_DATE),
255       	S18 = DECODE(S18,18,8,S18),
256       	S18_DATE = DECODE(S18,18,sysdate,S18_DATE),
257       	S19 = DECODE(S19,18,8,S19),
258       	S19_DATE = DECODE(S19,18,sysdate,S19_DATE),
259       	S20 = DECODE(S20,18,8,S20),
260       	S20_DATE = DECODE(S20,18,sysdate,S20_DATE),
261       	S21 = DECODE(S21,18,8,S21),
262       	S21_DATE = DECODE(S21,18,sysdate,S21_DATE),
263       	S22 = DECODE(S22,18,8,S22),
264       	S22_DATE = DECODE(S22,18,sysdate,S22_DATE),
265       	S23 = DECODE(S23,18,8,S23),
266       	S23_DATE = DECODE(S23,18,sysdate,S23_DATE),
267       	S24 = DECODE(S24,18,8,S24),
268       	S24_DATE = DECODE(S24,18,sysdate,S24_DATE),
269       	S25 = DECODE(S25,18,8,S25),
270       	S25_DATE = DECODE(S25,18,sysdate,S25_DATE),
271       	S26 = DECODE(S26,18,8,S26),
272       	S26_DATE = DECODE(S26,18,sysdate,S26_DATE),
273       	S27 = DECODE(S27,18,8,S27),
274       	S27_DATE = DECODE(S27,18,sysdate,S27_DATE),
275       	S28 = DECODE(S28,18,8,S28),
276       	S28_DATE = DECODE(S28,18,sysdate,S28_DATE),
277       	S29 = DECODE(S29,18,8,S29),
278       	S29_DATE = DECODE(S29,18,sysdate,S29_DATE),
279       	S30 = DECODE(S30,18,8,S30),
280       	S30_DATE = DECODE(S30,18,sysdate,S30_DATE)
281  WHERE 	HEADER_ID = V_HEADER_ID;
282 
283  IF V_ORDER_CATEGORY = 'RMA' THEN
284 	declare
285 		CURSOR rma1 IS
286 			SELECT  LINE_ID
287 			FROM    SO_LINES
288 			WHERE   HEADER_ID = V_HEADER_ID
289 			AND     S29 IN (14,16,17);
290 	begin
291 		FOR rma1rec IN rma1 LOOP
292 			UPDATE MTL_SO_RMA_INTERFACE MSRI
293 			SET    MSRI.QUANTITY = 0,
294 			       MSRI.CLOSED_FLAG = 'Y'
295 			WHERE  MSRI.RMA_LINE_ID = rma1rec.LINE_ID
296 			AND    MSRI.SOURCE_CODE = V_SOURCE_CODE
297 			AND    MSRI.IN_USE_FLAG IS NULL;
298 		END LOOP;
299 	end;
300  END IF;
301 
302  INSERT INTO SO_ORDER_CANCELLATIONS
303         (HEADER_ID, CANCEL_CODE,
304          CANCELLED_BY, CANCEL_DATE,
305          LAST_UPDATED_BY, LAST_UPDATE_DATE,
306          LAST_UPDATE_LOGIN, CREATION_DATE,
307          CREATED_BY, CANCEL_COMMENT )
308  VALUES(V_HEADER_ID, V_CANCEL_CODE,
309        v_current_user, SYSDATE,
310        V_LAST_UPDATED_BY, SYSDATE,
311        V_LAST_UPDATE_LOGIN, SYSDATE,
312        v_current_user, V_CANCEL_COMMENT );
313 
314  DELETE FROM SO_LINE_DETAILS
315  WHERE  LINE_ID IN (
316         SELECT LINE_ID
317         FROM   SO_LINES
318         WHERE  HEADER_ID = V_HEADER_ID)
319  AND    RELEASED_FLAG = 'N';
320 
321 
322  DELETE FROM SO_LINE_SERVICE_DETAILS
323  WHERE  LINE_ID IN (
324               SELECT LINE_ID
325               FROM   SO_LINES
326               WHERE  HEADER_ID = V_HEADER_ID);
327 
328 
329  IF V_PRINT_ERR_MSG = 1 THEN
330 	x :=OE_MSG.SET_MESSAGE_NAME('OE_CAN_ORD_CANCLD_REQUERY');
331 	V_RESULT := 1;
332  ELSE
333 	V_RESULT := 1;
334  END IF;
335 
336 END UPDATE_HEADER_INFO;
337 
338 
339 ------------------------------------------------------------------------
340 -- procedure CHECK_SERVICE
341 --
342 --	This is called from oeklcn() to determine if a line can be
343 --	cancelled. This procedure contains the required checks that
344 --	are not covered by security rules.
345 --	Specifically it handles service checks
346 --
347 --      CS_CUSTOMER_PRODUCTS 			(products)
348 --		/|\
349 --	CS_CP_SERVICES				(service)
350 --		/|\
351 --	CS_CP_SERVICE_TRANSACTIONS		(sort of history)
352 --
353 --	Two possible situations can occur and hence the need to have
354 --	two separate sql checks. The first sql statement takes care
355 --	of the situation in which a service is associated with a product
356 --	and checks to see if the service is still active. This is done
357 --	by a join on CS_CUSTOMER_PRODUCTS and CS_CP_SERVICES.
358 --	The second possiblity is that service was ordered by itself,
359 --	a standalone service if you will. This would not have any
360 --	record in CS_CUSTOMER_PRODUCTS and hence the need to join
361 --	CS_CP_SERVICES to CS_CP_SERVICE_TRANSACTIONS.
362 --
363 -- RETURNS:
364 --      1 -> if order is not cancellable
365 --      0 -> if order is cancellable
366 ------------------------------------------------------------------------
367 
368 procedure CHECK_SERVICE(
369    V_LINE_ID                      IN NUMBER
370 ,  V_REAL_PARENT_LINE_ID          IN NUMBER
371 ,  V_COMPONENT_CODE               IN VARCHAR2
372 ,  V_ITEM_TYPE_CODE               IN VARCHAR2
373 ,  V_SUBTREE_EXISTS               IN NUMBER
374 ,  V_PRINT_ERR_MSG                IN NUMBER
375 ,  V_RESULT                       OUT NUMBER
376                           )
377 IS
378    DUMMY                NUMBER := 0;
379    DUMMY2               NUMBER := 0;
380    DUMMY3               NUMBER := 0;
381    x                    BOOLEAN;
382 BEGIN
383 
384  V_RESULT := 0;
385 
386  SELECT	COUNT(*)
387  INTO   DUMMY
388  FROM	CS_CP_SERVICES SER,
389        	CS_CUSTOMER_PRODUCTS CPS
390  WHERE 	SER.CUSTOMER_PRODUCT_ID = CPS.CUSTOMER_PRODUCT_ID
391  AND 	CPS.ORIGINAL_ORDER_LINE_ID IN
392 		(SELECT LINE_ID FROM SO_LINES
393 		WHERE PARENT_LINE_ID = V_REAL_PARENT_LINE_ID
394 		AND NVL(COMPONENT_CODE,'0') LIKE V_COMPONENT_CODE ||'%'
395 		AND V_SUBTREE_EXISTS = 1
396 		UNION
397 		SELECT LINE_ID
398 		FROM SO_LINES
399 		WHERE LINE_ID = V_LINE_ID)
400  AND	SYSDATE BETWEEN SER.START_DATE_ACTIVE AND SER.END_DATE_ACTIVE;
401 
402  IF (DUMMY >= 1) THEN
403   IF V_PRINT_ERR_MSG = 1 THEN
404 	x :=OE_MSG.SET_MESSAGE_NAME('OE_CAN_SERVICE_ACTIVE');
405 	-- "You cannot cancel an order that has active service lines."
406   END IF;
407   V_RESULT := 1;
408  ELSE
409   IF V_ITEM_TYPE_CODE = 'SERVICE' THEN
410 
411     SELECT COUNT(*)
412     INTO   DUMMY2
413     FROM   CS_CP_SERVICES SER,
414            CS_CP_SERVICE_TRANSACTIONS TRX
415     WHERE  TRX.SERVICE_ORDER_LINE_ID = V_LINE_ID
416     AND    TRX.CP_SERVICE_ID = SER.CP_SERVICE_ID
417     AND    SYSDATE BETWEEN SER.START_DATE_ACTIVE AND SER.END_DATE_ACTIVE;
418 
419     IF (DUMMY2 >= 1) THEN
420      IF V_PRINT_ERR_MSG = 1 THEN
421 	x :=OE_MSG.SET_MESSAGE_NAME('OE_CAN_SERVICE_ACTIVE');
422      END IF;
423      V_RESULT := 1;
424     END IF;
425 
426   END IF;
427  END IF;
428 
429  SELECT  COUNT(*)
430  INTO    DUMMY3
431  FROM    SO_LINES
432  WHERE   LINE_ID = V_LINE_ID
433  AND     ATO_FLAG = 'Y'
434  AND     ATO_LINE_ID IS NOT NULL
435  AND     ITEM_TYPE_CODE <> 'SERVICE'
436  AND     LINE_TYPE_CODE <> 'RETURN'
437  AND     NVL(S2,18) <> 18;
438 
439  IF (DUMMY3 >= 1) THEN
440      IF V_PRINT_ERR_MSG = 1 THEN
441         x :=OE_MSG.SET_MESSAGE_NAME('OE_CAN_NO_ATO_AFTER_PICK');
442      END IF;
443      V_RESULT := 1;
444  END IF;
445 
446 
447 END CHECK_SERVICE;
448 
449 
450 ------------------------------------------------------------------------
451 -- procedure CHECK_IF_CONFIG
452 --
453 --	This procedure checks to see if the line being operated on
454 --	has a configuration item associated with it.
455 --
456 -- RETURNS:
457 --      1 -> if there is a configuration item associated with the line
458 --      0 -> if there is no configuration item associated with the line
459 ------------------------------------------------------------------------
460 
461 procedure CHECK_IF_CONFIG(
462    V_LOOP_LINE_ID               IN NUMBER
463 ,  V_RESULT			OUT NUMBER
464                           )
465 IS
466   DUMMY           NUMBER;
467 
468 BEGIN
469  SELECT COUNT(*)
470  INTO   DUMMY
471  FROM   SO_LINE_DETAILS
472  WHERE  LINE_ID = V_LOOP_LINE_ID
473  AND    CONFIGURATION_ITEM_FLAG = 'Y';
474 
475  IF (DUMMY >= 1) THEN
476   V_RESULT := 1;
477  ELSE
478   V_RESULT := 0;
479  END IF;
480 
481 END CHECK_IF_CONFIG;
482 
483 ------------------------------------------------------------------------
484 -- procedure CALCULATE_RMA_QTY
485 --
486 --	This procedure retrieves that allowable RMA cancel qty and the
487 --	received qty into INV.  If the line has RMA interface (S29) status
488 --	of Eligible (18) or Not Applicable (8) then the RMA cancel qty is
489 --	is simply the ordered_quantity less the cancelled_quantity. If
490 --	on the other hand the RMA interface (S29) status is Interfaced (14),
491 --	Partially Accepted (16) or Completely Accepted (17) then we get
492 --	the received qty into INV and then calculate the RMA cancel qty.
493 --	Hence the allowable RMA cancel qty would then be the ordered_quantity
494 --	less the cancelled_quantity less the received qty.  If we allowed
495 --	an over receipt then the allowable RMA cancel qty is 0.
496 --
497 -- RETURNS
498 --	1 -> successful
499 --	RMA_ALLOWABLE_CANCEL_QTY
500 --	RECEIVED_QTY
501 ------------------------------------------------------------------------
502 
503 procedure CALCULATE_RMA_QTY(
504    V_LINE_ID                    IN NUMBER
505 ,  V_S29                        IN NUMBER
506 ,  V_ORDER_QTY			IN NUMBER
507 ,  V_CANCELLED_QTY		IN NUMBER
508 ,  V_RECEIVED_QTY		OUT NUMBER
509 ,  V_ALLOWABLE_CANCEL_QTY       OUT NUMBER
510 ,  V_PRINT_ERR_MSG              IN NUMBER
511 ,  V_RESULT			OUT NUMBER
512                           )
513 IS
514 
515   RECEIVED_QTY         NUMBER :=0;
516   TEMP_QTY             NUMBER :=0;
517   ALLOWABLE_CANCEL_QTY_TEMP NUMBER :=0;
518   x                    BOOLEAN;
519 
520 BEGIN
521 
522  IF ((V_S29=8) OR (V_S29=18) OR (nvl(V_S29,0) = 0 )) THEN
523   RECEIVED_QTY := 0;
524   GOTO do_calculation;
525 
526  ELSIF ((V_S29=14) OR (V_S29=16) OR (V_S29=17)) THEN
527 
528    SELECT CEIL(NVL(MAX(SUM(NVL(MTLSRR.RECEIVED_QUANTITY,0)) *
529           ((V_ORDER_QTY - NVL(V_CANCELLED_QTY,0))
530           / MAX(MTLSRI.QUANTITY))),0))
531    INTO   RECEIVED_QTY
532    FROM   MTL_SO_RMA_RECEIPTS MTLSRR,
533           MTL_SO_RMA_INTERFACE MTLSRI
534    WHERE  MTLSRR.RMA_INTERFACE_ID = MTLSRI.RMA_INTERFACE_ID
535    AND    MTLSRI.RMA_LINE_ID = V_LINE_ID
536    GROUP BY MTLSRI.INVENTORY_ITEM_ID,
537             MTLSRI.COMPONENT_SEQUENCE_ID;
538 
539    GOTO do_calculation;
540 
541  ELSE
542 	IF V_PRINT_ERR_MSG = 1 THEN
543         	x :=OE_MSG.SET_MESSAGE_NAME('OE_CAN_INVALID_S29');
544         	V_RESULT := 0;
545  	ELSE
546         	V_RESULT := 0;
547  	END IF;
548 	RETURN;
549  END IF;
550 
551  <<do_calculation>>
552  SELECT  ORDERED_QUANTITY - NVL(CANCELLED_QUANTITY,0)
553  INTO    TEMP_QTY
554  FROM    SO_LINES
555  WHERE   LINE_ID = V_LINE_ID;
556 
557  V_ALLOWABLE_CANCEL_QTY := TEMP_QTY - RECEIVED_QTY;
558  ALLOWABLE_CANCEL_QTY_TEMP := TEMP_QTY - RECEIVED_QTY;
559 
560  IF (ALLOWABLE_CANCEL_QTY_TEMP < 0) THEN
561   V_ALLOWABLE_CANCEL_QTY := 0;
562  END IF;
563 
564  V_RECEIVED_QTY := RECEIVED_QTY;
565  V_RESULT := 1;
566 
567 END CALCULATE_RMA_QTY;
568 
569 
570 ------------------------------------------------------------------------
571 -- procedure SET_SERVICE_QTY
572 --
573 --	This procedure will called from oekclq to retrieve the
574 --	allowable cancel qty for a service item. It is simply
575 --	the ordered_quantity less the cancelled_quantity on the line.
576 --
577 -- RETURNS
578 --	1 -> successful
579 --	ALLOWABLE_CANCEL_QTY
580 ------------------------------------------------------------------------
581 
582 procedure SET_SERVICE_QTY(
583    V_LINE_ID                    IN NUMBER
584 ,  V_ALLOWABLE_CANCEL_QTY       OUT NUMBER
585 ,  V_RESULT			OUT NUMBER
586                           )
587 IS
588      TEMP_QTY       NUMBER :=0;
589 
590 BEGIN
591  SELECT (ORDERED_QUANTITY - NVL(CANCELLED_QUANTITY,0))
592  INTO    TEMP_QTY
593  FROM    SO_LINES
594  WHERE   LINE_ID = V_LINE_ID;
595 
596  V_ALLOWABLE_CANCEL_QTY := TEMP_QTY;
597  V_RESULT := 1;
598 
599 END SET_SERVICE_QTY;
600 
601 ------------------------------------------------------------------------
602 -- procedure NONCONFIG_QTY
603 --
604 --	Get the total quantity from the details for the selected line
605 --	that are not included items and not released. For the
606 --	picking line details we sum also over backordered picking lines.
607 --	picking_header_id = 0
608 --	This quantity is used in determining the allowable cancel qty
609 --	for the line selected.
610 --
611 -- RETURNS
612 --	1 -> successful
613 --	NONCONFIG_QTY
614 ------------------------------------------------------------------------
615 
616 procedure NONCONFIG_QTY(
617    V_LOOP_LINE_ID               IN NUMBER
618 ,  V_LOOP_RATIO_DEN		IN NUMBER
619 ,  V_LOOP_RATIO_NUM		IN NUMBER
620 ,  V_S2				IN NUMBER
621 ,  V_NONCONFIG_QTY		OUT NUMBER
622 ,  V_RESULT			OUT NUMBER
623                           )
624 IS
625   DUMMY             NUMBER;
626   LD_QTY            NUMBER := 0;
627   PD_QTY            NUMBER := 0;
628 
629 BEGIN
630 
631 -- statement tells us if we are dealing with an included item
632 
633 
634  SELECT COUNT(*)
635  INTO   DUMMY
636  FROM   SO_LINE_DETAILS
637  WHERE  LINE_ID = V_LOOP_LINE_ID
638  AND    SHIPPABLE_FLAG = 'Y'
639  AND    INCLUDED_ITEM_FLAG = 'N';
640 
641  IF (DUMMY >= 1) THEN
642 
643 	IF ( V_S2 <> 4) then
644 
645 	   select nvl(sum(quantity),0)
646 	   into   LD_QTY
647 	   from   so_line_details
648 	   where  nvl(released_flag,'N') = 'N'
649 	   and    line_id = V_LOOP_LINE_ID
650 	   and    included_item_flag = 'N'
651 	   and    nvl(schedule_status_code,'NULL') <> 'SUPPLY RESERVED';
652 
653 	ELSE
654 		LD_QTY := 0;
655 	END IF;
656 
657 	IF (V_S2 = 4 or V_S2 = 5) then
658 
659 	   select nvl(sum(pld.requested_quantity),0)
660 	   into   PD_QTY
661 	   from   so_picking_lines pl, so_picking_line_details pld
662 	   where  pl.picking_line_id = pld.picking_line_id
663 	   and    pl.picking_header_id = 0
664 	   and    pl.order_line_id = V_LOOP_LINE_ID
665 	   and    nvl(pld.released_flag,'N') = 'N'
666 	   and    pl.included_item_flag = 'N'
667 	   and    nvl(pld.schedule_status_code,'NULL') <> 'SUPPLY RESERVED';
668 
669 	ELSE
670 		PD_QTY := 0;
671 	END IF;
672 
673    V_NONCONFIG_QTY := FLOOR((LD_QTY + PD_QTY) *
674                               V_LOOP_RATIO_NUM / V_LOOP_RATIO_DEN);
675 
676  END IF;
677 
678  V_RESULT := 1;
679 
680 END NONCONFIG_QTY;
681 
682 ------------------------------------------------------------------------
683 -- procedure INCLUDE_QTY
684 --
685 --	A loop is setup to get the total quantity from the details.
686 --	The minimum qty is the quantity returned from the loop will be
687 --	returned. First get the total quantity from the details for the
688 --	selected line where there are included items that are required for
689 --	revenue and not released. For the picking line details we sum also
690 --	over backordered picking lines. We sum the quantity for both the
691 --	line details and picking line details. Finally the quantity is
692 --	adjusted for any ratio differences. This quantity is compared
693 --	to the quantity found in the details for the line and the
694 --	minimum qty is returned.
695 --      picking_header_id = 0
696 --      This quantity is used in determining the allowable cancel qty
697 --      for the line selected.
698 --
699 -- RETURNS
700 --	1 -> successful
701 --	INCLUDE_QTY
702 
703 ------------------------------------------------------------------------
704 
705 procedure INCLUDE_QTY(
706    V_LOOP_LINE_ID               IN NUMBER
707 ,  V_TOTAL_QTY_FINAL		IN NUMBER
708 ,  V_LOOP_RATIO_DEN		IN NUMBER
709 ,  V_LOOP_RATIO_NUM		IN NUMBER
710 ,  V_S2				IN NUMBER
714 IS
711 ,  V_INCLUDE_QTY		OUT NUMBER
712 ,  V_RESULT			OUT NUMBER
713                           )
715 
716   LD_QTY            NUMBER := 0;
717   PD_QTY            NUMBER := 0;
718   TEMP_ITEM_ID      NUMBER;
719   TOTAL_QTY	    NUMBER := 0;
720   TEMP_QTY_FINAL    NUMBER := V_TOTAL_QTY_FINAL;
721   RATIO	            NUMBER;
722 
723 
724   CURSOR c1 IS
725     select distinct inventory_item_id, component_ratio
726     from   so_line_details
727     where  line_id = V_LOOP_LINE_ID
728     and    included_item_flag = 'Y'
729     order by inventory_item_id;
730 
731 BEGIN
732 
733   FOR c1rec IN c1 LOOP
734    RATIO := c1rec.component_ratio;
735    TEMP_ITEM_ID := c1rec.inventory_item_id;
736 
737 	IF ( V_S2 <> 4) then
738 
739 	   select nvl(sum(sld.quantity),0)
740 	   into   LD_QTY
741 	   from   so_line_details sld
742 	   where  nvl(sld.released_flag,'N') = 'N'
743 	   and    sld.line_id = V_LOOP_LINE_ID
744 	   and    sld.inventory_item_id = TEMP_ITEM_ID
745 	   and    nvl(sld.schedule_status_code,'NULL') <> 'SUPPLY RESERVED';
746 
747 	ELSE
748 		LD_QTY := 0;
749 	END IF;
750 
751 	IF ( V_S2 = 4 or V_S2 = 5) then
752 
753 	   select nvl(sum(pld.requested_quantity),0)
754 	   into   PD_QTY
755 	   from   so_picking_lines pl,
756 	          so_picking_line_details pld
757 	   where  pl.picking_line_id = pld.picking_line_id
758 	   and    pl.picking_header_id = 0
759 	   and    pl.order_line_id = V_LOOP_LINE_ID
760 	   and    pl.inventory_item_id = TEMP_ITEM_ID
761 	   and    nvl(pld.released_flag,'N') = 'N'
762 	   and    nvl(pld.schedule_status_code,'NULL') <> 'SUPPLY RESERVED';
763 
764            /*
765            ** Fix for Bug # 800989
766            ** Following select added to calculate Qty for Non Shippable
767            ** Included Items as above query will give PD_QTY=0 for such
768            ** cases.
769            */
770            select nvl(sum(sld.quantity),0) + PD_QTY
771            into   PD_QTY
772            from   so_line_details sld
773            where  nvl(sld.released_flag,'N')  = 'Y'
774            and    nvl(sld.shippable_flag,'N') = 'N'
775            and    sld.line_id = V_LOOP_LINE_ID
776            and    sld.inventory_item_id = TEMP_ITEM_ID
777            and    nvl(sld.schedule_status_code,'NULL') <> 'SUPPLY RESERVED';
778 
779 	ELSE
780 		PD_QTY := 0;
781 	END IF;
782 
783    TOTAL_QTY := FLOOR((LD_QTY + PD_QTY) / RATIO *
784                               V_LOOP_RATIO_NUM / V_LOOP_RATIO_DEN);
785    TEMP_QTY_FINAL := LEAST(TEMP_QTY_FINAL, TOTAL_QTY);
786   END LOOP;
787 
788   V_INCLUDE_QTY :=  TEMP_QTY_FINAL;
789   V_RESULT := 1;
790 
791 END INCLUDE_QTY;
792 
793 ------------------------------------------------------------------------
794 -- procedure CONFIG_QTY
795 --
796 --	Get the sum of the line details and picking line detail where
797 --	there exists a configuration item that is not released, but
798 --	possibly backordered.  Then adjust it for any ratio differences
799 --	that might exist between the parent and its child.
800 --
801 -- RETURNS
802 --	1 -> successful
803 --	CONFIG_QTY
804 ------------------------------------------------------------------------
805 
806 procedure CONFIG_QTY(
807    V_ATO_LOOP_LINE_ID           IN NUMBER
808 ,  V_LOOP_LINE_ID               IN NUMBER
809 ,  V_LOOP_RATIO_DEN		IN NUMBER
810 ,  V_LOOP_RATIO_NUM		IN NUMBER
811 ,  V_S2				IN NUMBER
812 ,  V_CONFIG_QTY 		OUT NUMBER
813 ,  V_RESULT			OUT NUMBER
814                           )
815 IS
816         LD_QTY             NUMBER := 0;
817         PD_QTY             NUMBER := 0;
818         TOTAL_UNRELEASED   NUMBER := 0;
819 
820 BEGIN
821 
822 IF (V_S2 <> 4) then
823 
824  SELECT NVL(SUM(QUANTITY),0)
825  INTO   LD_QTY
826  FROM   SO_LINE_DETAILS
827  WHERE  LINE_ID = V_ATO_LOOP_LINE_ID
828  AND    CONFIGURATION_ITEM_FLAG = 'Y'
829  AND    RELEASED_FLAG = 'N'
830  AND    NVL(SCHEDULE_STATUS_CODE,'NULL') <> 'SUPPLY RESERVED';
831 
832 ELSE
833 	LD_QTY := 0;
834 END IF;
835 
836 IF (V_S2 = 4 or V_S2 = 5) then
837 
838  SELECT NVL(SUM(PLD.REQUESTED_QUANTITY),0)
839  INTO   PD_QTY
840  FROM   SO_PICKING_LINE_DETAILS PLD, SO_PICKING_LINES PL
841  WHERE  PL.ORDER_LINE_ID = V_ATO_LOOP_LINE_ID
842  AND    PL.PICKING_HEADER_ID = 0
843  AND    PL.PICKING_LINE_ID = PLD.PICKING_LINE_ID
844  AND    PLD.RELEASED_FLAG = 'N'
845  AND    NVL(PLD.SCHEDULE_STATUS_CODE,'NULL') <> 'SUPPLY RESERVED';
846 
847 ELSE
848 	PD_QTY := 0;
849 END IF;
850 
851  SELECT (L.ordered_quantity - nvl(L.cancelled_quantity,0)) /
852         (M.ordered_quantity - nvl(M.cancelled_quantity,0))
853  INTO   TOTAL_UNRELEASED
854  FROM   SO_LINES L, SO_LINES M
855  WHERE  L.LINE_ID = V_LOOP_LINE_ID
856  AND    M.LINE_ID = V_ATO_LOOP_LINE_ID;
857 
858  V_CONFIG_QTY := FLOOR((LD_QTY + PD_QTY) * TOTAL_UNRELEASED *
859                               V_LOOP_RATIO_NUM / V_LOOP_RATIO_DEN);
860  V_RESULT := 1;
861 
862 END CONFIG_QTY;
863 
864 
865 ------------------------------------------------------------------------
866 -- procedure UPDATE_LINE_INFO
867 --
868 --	If a full cancellation is begin performed then update so_lines
869 --	by setting the cancelled_quantity equal to the ordered_quantity
870 --	less the greatest quantity between what was shipped and what was
871 --	invoiced.
872 --	If the line begin update is a child of a shipment schedule,
873 --	update the quantity on the parent shipment line.
874 --	If we have a detail shipment line, and it's an option,
875 --	once we cancel, we need to disassociate it from it's
876 --	source since we've changed the configuration.
877 --	Update the cancelled_quantity in so_lines adjusted by any
878 --	ratio differences if were have a model.
879 --	Insert a record into so_order_cancellations
880 --	Update the open_flag in so_lines, if ordered_quantity less
881 --	the cancelled_quantity is 0 then set the open_flag =  ''
882 --	Set the S9 (Cancel Line) column based on the open flag.
883 --	If open_flag is null then set the S9 to 11 (Complete) otherwise
884 --	set S9 to 5 (Partial).
885 --	Also set S3 which is Backorder Release. Check to see if no
886 --	picking lines exist where the original requested quantity is
887 --	greater than the cancelled quantity. If this is TRUE and
888 --	S3 is 18 (Eligible) then set S3 to 8 (Not Applicable).
889 --
890 -- RETURNS
891 --	1 -> success
892 ------------------------------------------------------------------------
893 
894 procedure UPDATE_LINE_INFO(
895    V_LINE_ID                    IN NUMBER
896 ,  V_REQUESTED_CANCEL_QTY       IN NUMBER
897 ,  V_CANCEL_COMMENT             IN LONG
898 ,  V_CANCEL_CODE                IN VARCHAR2
899 ,  V_FULL                       IN NUMBER
900 ,  V_OPTION_FLAG                IN NUMBER
901 ,  V_PARENT_LINE_ID             IN NUMBER
902 ,  V_LINE_TYPE_CODE             IN VARCHAR2
903 ,  V_SHIPMENT_SCHEDULE_LINE_ID  IN NUMBER
904 ,  V_SUBTREE_EXISTS             IN NUMBER
905 ,  V_COMPONENT_CODE             IN VARCHAR2
906 ,  V_REAL_PARENT_LINE_ID        IN NUMBER
907 ,  V_LAST_UPDATED_BY            IN NUMBER
908 ,  V_LAST_UPDATE_LOGIN          IN NUMBER
909 ,  V_STATUS                     IN VARCHAR2
910 ,  V_RESULT			OUT NUMBER
911                           )
912 IS
913 
914 	CANCEL_QTY_TMP	 	NUMBER := 0;
915 	L_CURRENT_ORDERED_QTY	NUMBER := 0;
916 	L_CURRENT_CANCELLED_QTY	NUMBER := 0;
917         v_current_user          NUMBER ;
918         l_org_id                NUMBER := NULL;
919 
920 BEGIN
921 
922         v_current_user := to_number(FND_PROFILE.VALUE('USER_ID'));
923 
924         l_org_id := FND_PROFILE.VALUE ('SO_ORGANIZATION_ID');
925 
926  IF (V_OPTION_FLAG = 1) THEN
927   -- Need a sql statement here to mark records as changed after the
928   -- commit whose allowed quantity *may* have been affected by this
929   -- commit.  The sql must make a *logical* change to the database
930   -- in order to actually mark the record.
931   -- Here we have chosen to cycle among the users profile_value, 0, and 1
932 
933   UPDATE SO_LINES
934   SET    LAST_UPDATED_BY = DECODE(LAST_UPDATED_BY, 0, 1, 1,
935                            DECODE(V_LAST_UPDATED_BY,1,0,V_LAST_UPDATED_BY),
936                            V_LAST_UPDATED_BY, 0, V_LAST_UPDATED_BY)
937   WHERE  (LINE_ID = V_PARENT_LINE_ID
938           OR  PARENT_LINE_ID = V_PARENT_LINE_ID);
939  END IF;
940 
941  IF (V_FULL = 1) THEN
942 
943 		IF (V_LINE_TYPE_CODE = 'DETAIL') THEN
944 			IF (V_PARENT_LINE_ID IS NULL OR V_PARENT_LINE_ID = 0) THEN
945 
946 	                        SELECT  (ORDERED_QUANTITY - NVL(CANCELLED_QUANTITY,0)
947         	                           - GREATEST (NVL(SHIPPED_QUANTITY,0),
948 						NVL(INVOICED_QUANTITY,0)))
949 				INTO    CANCEL_QTY_TMP
950                 	        FROM    SO_LINES
951                 	        WHERE   LINE_ID = V_LINE_ID;
952 
953 
954 				UPDATE SO_LINES  L
955 			    	SET    CANCELLED_QUANTITY =
956         		        		(SELECT NVL(L.CANCELLED_QUANTITY,0) +
957                		   		      		(CANCEL_QTY_TMP *
958                		         			(L.ORDERED_QUANTITY-NVL(L.CANCELLED_QUANTITY,0))/
959                     		    			(L2.ORDERED_QUANTITY-NVL(L2.CANCELLED_QUANTITY,0)))
960          		         		FROM   SO_LINES L2
961     			         		WHERE  L2.LINE_ID = V_SHIPMENT_SCHEDULE_LINE_ID)
962 			    	WHERE  L.LINE_ID IN
963 		           		(select line_id
964 		            		 from   so_lines
965 		            		 where  parent_line_id = V_SHIPMENT_SCHEDULE_LINE_ID
966 		            		 and    nvl(component_code,'0') like V_COMPONENT_CODE || '%'
967 		            		 and    V_SUBTREE_EXISTS = 1
968 		            		union
969 		            		 select line_id
970 		            		 from   so_lines
971 		            		 where  line_id = V_SHIPMENT_SCHEDULE_LINE_ID);
972 		   	ELSE
973 				UPDATE SO_LINES
974 			    	SET    SOURCE_LINE_ID = NULL
975 			    	WHERE  LINE_ID = V_LINE_ID;
976 		   	END IF;
977 		END IF;
978 
979 
980         declare
981                 CURSOR full1 IS
982                         SELECT  LINE_ID, HEADER_ID, ORDERED_QUANTITY, CANCELLED_QUANTITY
983                                 ,SHIPPED_QUANTITY,INVOICED_QUANTITY
984                         FROM    SO_LINES
985                         WHERE	LINE_ID IN
986 		           (select line_id
987         		    from   so_lines
988     			    where  parent_line_id = V_REAL_PARENT_LINE_ID
989             		    and    (nvl(component_code,'0') like V_COMPONENT_CODE || '%'
990 				    OR COMPONENT_CODE IS NULL)
991            		    and    V_SUBTREE_EXISTS = 1
992            		    union
993             		    select line_id
994             		    from   so_lines
995             		    where  line_id = V_LINE_ID
996                             or     service_parent_line_id = V_LINE_ID);
997 
998 
999         begin
1000 
1001 
1002                 FOR full1rec IN full1 LOOP
1003                         UPDATE SO_LINES SOL
1004                         SET    CANCELLED_QUANTITY = ORDERED_QUANTITY
1005 			           - GREATEST (NVL(SHIPPED_QUANTITY,0),
1006 				NVL(INVOICED_QUANTITY,0))
1007                         WHERE  SOL.LINE_ID = full1rec.LINE_ID;
1008 
1009 			INSERT INTO SO_ORDER_CANCELLATIONS
1010       				 (LINE_ID, HEADER_ID, CANCEL_CODE, CANCELLED_BY,
1011          			 CANCEL_DATE, LAST_UPDATED_BY, LAST_UPDATE_DATE,
1012 				 CANCEL_COMMENT, CANCELLED_QUANTITY, STATUS,
1013          			 CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN )
1014 			VALUES
1015 			         (full1rec.LINE_ID, full1rec.HEADER_ID, V_CANCEL_CODE,
1016 				  v_current_user,
1017 			          SYSDATE, V_LAST_UPDATED_BY, SYSDATE, V_CANCEL_COMMENT,
1018 			          (full1rec.ORDERED_QUANTITY -
1019 					NVL(full1rec.CANCELLED_QUANTITY,0) - GREATEST
1020 					(NVL(full1rec.SHIPPED_QUANTITY,0),
1021 					 NVL(full1rec.INVOICED_QUANTITY,0))), V_STATUS,
1022 				  SYSDATE,
1023 				  v_current_user, V_LAST_UPDATE_LOGIN);
1024 
1025                 END LOOP;
1026 
1027         end;
1028 
1029 
1030  ELSE
1031   IF (V_LINE_TYPE_CODE = 'DETAIL') THEN
1032    IF (V_PARENT_LINE_ID IS NULL OR V_PARENT_LINE_ID = 0) THEN
1033 
1034     UPDATE SO_LINES  L
1035     SET    CANCELLED_QUANTITY =
1036                 (SELECT NVL(L.CANCELLED_QUANTITY,0) +
1037                         (V_REQUESTED_CANCEL_QTY *
1038                         (L.ORDERED_QUANTITY-NVL(L.CANCELLED_QUANTITY,0))/
1039                         (L2.ORDERED_QUANTITY-NVL(L2.CANCELLED_QUANTITY,0)))
1040                  FROM   SO_LINES L2
1041                  WHERE  L2.LINE_ID = V_SHIPMENT_SCHEDULE_LINE_ID)
1042     WHERE  L.LINE_ID IN
1043            (select line_id
1044             from   so_lines
1045             where  parent_line_id = V_SHIPMENT_SCHEDULE_LINE_ID
1046             and    nvl(component_code,'0') like V_COMPONENT_CODE || '%'
1047             and    V_SUBTREE_EXISTS = 1
1048             union
1049             select line_id
1050             from   so_lines
1051             where  line_id = V_SHIPMENT_SCHEDULE_LINE_ID);
1052    ELSE
1053     UPDATE SO_LINES
1054     SET    SOURCE_LINE_ID = NULL
1055     WHERE  LINE_ID = V_LINE_ID;
1056    END IF;
1057  END IF;
1058 
1059  SELECT ORDERED_QUANTITY, CANCELLED_QUANTITY
1060  INTO   L_CURRENT_ORDERED_QTY, L_CURRENT_CANCELLED_QTY
1061  FROM   SO_LINES
1062  WHERE  LINE_ID = V_LINE_ID;
1063 
1064  DECLARE
1065 	CURSOR not_full IS
1066 		SELECT LINE_ID, HEADER_ID, ORDERED_QUANTITY
1067 		       ,CANCELLED_QUANTITY
1068 		FROM   SO_LINES
1069 		WHERE  LINE_ID IN
1070                      (SELECT LINE_ID
1071                       FROM   SO_LINES
1072                       WHERE  PARENT_LINE_ID = V_REAL_PARENT_LINE_ID
1073                       AND   (NVL(COMPONENT_CODE,'0') LIKE V_COMPONENT_CODE || '%'
1074                              OR COMPONENT_CODE IS NULL)
1075                       AND    V_SUBTREE_EXISTS = 1
1076                       UNION
1077                       SELECT LINE_ID
1078                       FROM   SO_LINES
1079                       WHERE  LINE_ID = V_LINE_ID
1080                       OR     SERVICE_PARENT_LINE_ID = V_LINE_ID);
1081 
1082  BEGIN
1083 	FOR not_full_rec IN not_full LOOP
1084 		UPDATE SO_LINES L
1085 		SET    CANCELLED_QUANTITY =
1086 			NVL(not_full_rec.CANCELLED_QUANTITY,0)+(V_REQUESTED_CANCEL_QTY *
1087 			(not_full_rec.ORDERED_QUANTITY - NVL(not_full_rec.CANCELLED_QUANTITY,0))/
1088 			(L_CURRENT_ORDERED_QTY - NVL(L_CURRENT_CANCELLED_QTY,0)))
1089 		WHERE  L.LINE_ID = not_full_rec.LINE_ID;
1090 	END LOOP;
1091  END;
1092 
1093  INSERT INTO SO_ORDER_CANCELLATIONS
1094            ( LINE_ID, HEADER_ID,
1095              CANCEL_CODE, CANCELLED_BY,
1096              CANCEL_DATE, LAST_UPDATED_BY,
1097              LAST_UPDATE_DATE, CANCEL_COMMENT,
1098              CANCELLED_QUANTITY, STATUS,
1099              CREATION_DATE, CREATED_BY,
1100              LAST_UPDATE_LOGIN )
1101  SELECT L.LINE_ID, L.HEADER_ID,
1102 	V_CANCEL_CODE, v_current_user,
1103         SYSDATE, V_LAST_UPDATED_BY,
1104         SYSDATE, V_CANCEL_COMMENT,
1105         NVL(L.CANCELLED_QUANTITY,0) - NVL(SUM (SOC.CANCELLED_QUANTITY),0),
1106         V_STATUS, SYSDATE, v_current_user,
1107         V_LAST_UPDATE_LOGIN
1108  FROM   SO_LINES L, SO_ORDER_CANCELLATIONS SOC
1109  WHERE 	L.LINE_ID IN
1110        (SELECT LINE_ID
1111         FROM   SO_LINES
1112         WHERE  PARENT_LINE_ID = V_REAL_PARENT_LINE_ID
1113         AND   (NVL(COMPONENT_CODE,'0') LIKE V_COMPONENT_CODE || '%'
1114                OR COMPONENT_CODE IS NULL)
1115         AND    V_SUBTREE_EXISTS = 1
1116         UNION
1117         SELECT LINE_ID
1118         FROM   SO_LINES
1119         WHERE  LINE_ID = V_LINE_ID
1120         OR     SERVICE_PARENT_LINE_ID = V_LINE_ID)
1121  AND    L.LINE_ID = SOC.LINE_ID(+)
1122  HAVING NVL(L.CANCELLED_QUANTITY,0) <> NVL(SUM (SOC.CANCELLED_QUANTITY),0)
1123  GROUP BY L.LINE_ID, L.HEADER_ID, L.CANCELLED_QUANTITY;
1124 
1125 END IF;
1126 
1127 /*
1128 ** Fix for Bug # 532221
1129 ** Update quantity_to_invoice for non-shippable items on line Cancellation.
1130 */
1131 UPDATE SO_LINES
1132 SET    QUANTITY_TO_INVOICE =
1133        DECODE(NVL(QUANTITY_TO_INVOICE,0),
1134               0, QUANTITY_TO_INVOICE,
1135               DECODE(NVL(SHIPPED_QUANTITY,0),
1136                      0,(ORDERED_QUANTITY - NVL(CANCELLED_QUANTITY,0)),
1137                      SHIPPED_QUANTITY))
1138 WHERE (LINE_ID        = V_LINE_ID
1139  OR    PARENT_LINE_ID = V_LINE_ID)
1140 AND   (S4 + 0 IN (5, 7, 22, 8)
1141  OR    S29 + 0 IN (14, 16, 8))
1142 AND   EXISTS
1143      (SELECT 'NON SHIPPABLE ITEM'
1144       FROM   MTL_SYSTEM_ITEMS MSI
1145       WHERE  MSI.ORGANIZATION_ID     = l_org_id
1146       AND    MSI.INVENTORY_ITEM_ID   = SO_LINES.INVENTORY_ITEM_ID
1147       AND    MSI.SHIPPABLE_ITEM_FLAG = 'N');
1148 
1149 UPDATE SO_LINES SET OPEN_FLAG =
1150        DECODE(nvl(ORDERED_QUANTITY,0) - NVL(CANCELLED_QUANTITY,0)
1151                                         ,0,'',OPEN_FLAG)
1152 WHERE LINE_ID IN
1153       (select line_id
1154        from   so_lines
1155        where  parent_line_id = V_REAL_PARENT_LINE_ID
1156        and    (nvl(component_code,'0') like V_COMPONENT_CODE || '%'
1157 	       or component_code is null)
1158        and     V_SUBTREE_EXISTS = 1
1159        union
1160        select line_id
1161        from   so_lines
1162        where  line_id = V_LINE_ID
1163        or     service_parent_line_id = V_LINE_ID);
1164 
1165 UPDATE SO_LINES
1166 SET   LAST_UPDATED_BY = V_LAST_UPDATED_BY,
1167       LAST_UPDATE_LOGIN = V_LAST_UPDATE_LOGIN,
1168       LAST_UPDATE_DATE = SYSDATE,
1169       S1      = DECODE(OPEN_FLAG,'',DECODE(S1,18,8,S1),S1),
1170       S1_DATE = DECODE(OPEN_FLAG,'',DECODE(S1,18,sysdate,S1_DATE),S1_DATE),
1171       S2      = DECODE(OPEN_FLAG,'',DECODE(S2,18,8,S2),S2),
1172       S2_DATE = DECODE(OPEN_FLAG,'',DECODE(S2,18,sysdate,S2_DATE),S2_DATE),
1173       S3      = DECODE(OPEN_FLAG,'',DECODE(S3,18,8,S3),S3),
1174       S3_DATE = DECODE(OPEN_FLAG,'',DECODE(S3,18,sysdate,S3_DATE),S3_DATE),
1175       S4      = DECODE(OPEN_FLAG,'',DECODE(S4,18,8,S4),S4),
1176       S4_DATE = DECODE(OPEN_FLAG,'',DECODE(S4,18,sysdate,S4_DATE),S4_DATE),
1177       S5      = DECODE(OPEN_FLAG,'',DECODE(S5,18,8,S5),S5),
1178       S5_DATE = DECODE(OPEN_FLAG,'',DECODE(S5,18,sysdate,S5_DATE),S5_DATE),
1179       S6      = DECODE(OPEN_FLAG,'',DECODE(S6,18,8,S6),S6),
1180       S6_DATE = DECODE(OPEN_FLAG,'',DECODE(S6,18,sysdate,S6_DATE),S6_DATE),
1181       S7      = DECODE(OPEN_FLAG,'',DECODE(S7,18,8,S7),S7),
1182       S7_DATE = DECODE(OPEN_FLAG,'',DECODE(S7,18,sysdate,S7_DATE),S7_DATE),
1183       S8      = DECODE(OPEN_FLAG,'',DECODE(S8,18,8,S8),S8),
1184       S8_DATE = DECODE(OPEN_FLAG,'',DECODE(S8,18,sysdate,S8_DATE),S8_DATE),
1185       S9      = DECODE(OPEN_FLAG,'',11,5),
1186       S9_DATE = sysdate,
1187       S10     = DECODE(OPEN_FLAG,'',DECODE(S10,18,8,S10),S10),
1188       S10_DATE= DECODE(OPEN_FLAG,'',DECODE(S10,18,sysdate,S10_DATE),S10_DATE),
1189       S11     = DECODE(OPEN_FLAG,'',DECODE(S11,18,8,S11),S11),
1190       S11_DATE= DECODE(OPEN_FLAG,'',DECODE(S11,18,sysdate,S11_DATE),S11_DATE),
1191       S12     = DECODE(OPEN_FLAG,'',DECODE(S12,18,8,S12),S12),
1192       S12_DATE= DECODE(OPEN_FLAG,'',DECODE(S12,18,sysdate,S12_DATE),S12_DATE),
1193       S13     = DECODE(OPEN_FLAG,'',DECODE(S13,18,8,S13),S13),
1194       S13_DATE= DECODE(OPEN_FLAG,'',DECODE(S13,18,sysdate,S13_DATE),S13_DATE),
1195       S14     = DECODE(OPEN_FLAG,'',DECODE(S14,18,8,S14),S14),
1196       S14_DATE= DECODE(OPEN_FLAG,'',DECODE(S14,18,sysdate,S14_DATE),S14_DATE),
1197       S15     = DECODE(OPEN_FLAG,'',DECODE(S15,18,8,S15),S15),
1198       S15_DATE= DECODE(OPEN_FLAG,'',DECODE(S15,18,sysdate,S15_DATE),S15_DATE),
1199       S16     = DECODE(OPEN_FLAG,'',DECODE(S16,18,8,S16),S16),
1200       S16_DATE= DECODE(OPEN_FLAG,'',DECODE(S16,18,sysdate,S16_DATE),S16_DATE),
1201       S17     = DECODE(OPEN_FLAG,'',DECODE(S17,18,8,S17),S17),
1202       S17_DATE= DECODE(OPEN_FLAG,'',DECODE(S17,18,sysdate,S17_DATE),S17_DATE),
1203       S18     = DECODE(OPEN_FLAG,'',DECODE(S18,18,8,S18),S18),
1204       S18_DATE= DECODE(OPEN_FLAG,'',DECODE(S18,18,sysdate,S18_DATE),S18_DATE),
1205       S19     = DECODE(OPEN_FLAG,'',DECODE(S19,18,8,S19),S19),
1206       S19_DATE= DECODE(OPEN_FLAG,'',DECODE(S19,18,sysdate,S19_DATE),S19_DATE),
1207       S20     = DECODE(OPEN_FLAG,'',DECODE(S20,18,8,S20),S20),
1208       S20_DATE= DECODE(OPEN_FLAG,'',DECODE(S20,18,sysdate,S20_DATE),S20_DATE),
1209       S21     = DECODE(OPEN_FLAG,'',DECODE(S21,18,8,S21),S21),
1210       S21_DATE= DECODE(OPEN_FLAG,'',DECODE(S21,18,sysdate,S21_DATE),S21_DATE),
1211       S22     = DECODE(OPEN_FLAG,'',DECODE(S22,18,8,S22),S22),
1212       S22_DATE= DECODE(OPEN_FLAG,'',DECODE(S22,18,sysdate,S22_DATE),S22_DATE),
1213       S23     = DECODE(OPEN_FLAG,'',DECODE(S23,18,8,S23),S23),
1214       S23_DATE= DECODE(OPEN_FLAG,'',DECODE(S23,18,sysdate,S23_DATE),S23_DATE),
1215       S24     = DECODE(OPEN_FLAG,'',DECODE(S24,18,8,S24),S24),
1216       S24_DATE= DECODE(OPEN_FLAG,'',DECODE(S24,18,sysdate,S24_DATE),S24_DATE),
1217       S25     = DECODE(OPEN_FLAG,'',DECODE(S25,18,8,S25),S25),
1218       S25_DATE= DECODE(OPEN_FLAG,'',DECODE(S25,18,sysdate,S25_DATE),S25_DATE),
1219       S26     = DECODE(OPEN_FLAG,'',DECODE(S26,18,8,S26),S26),
1220       S26_DATE= DECODE(OPEN_FLAG,'',DECODE(S26,18,sysdate,S26_DATE),S26_DATE),
1221       S27     = DECODE(OPEN_FLAG,'',DECODE(S27,18,8,S27),S27),
1222       S27_DATE= DECODE(OPEN_FLAG,'',DECODE(S27,18,sysdate,S27_DATE),S27_DATE),
1223       S28     = DECODE(OPEN_FLAG,'',DECODE(S28,18,8,S28),S28),
1224       S28_DATE= DECODE(OPEN_FLAG,'',DECODE(S28,18,sysdate,S28_DATE),S28_DATE),
1225       S29     = DECODE(OPEN_FLAG,'',DECODE(S29,18,8,S29),S29),
1226       S29_DATE= DECODE(OPEN_FLAG,'',DECODE(S29,18,sysdate,S29_DATE),S29_DATE),
1227       S30     = DECODE(OPEN_FLAG,'',DECODE(S30,18,8,S30),S30),
1228       S30_DATE= DECODE(OPEN_FLAG,'',DECODE(S30,18,sysdate,S30_DATE),S30_DATE)
1229 WHERE LINE_ID IN
1230       (select line_id from so_lines
1231        where parent_line_id = V_REAL_PARENT_LINE_ID
1232        and (nvl(component_code,'0') like V_COMPONENT_CODE || '%'
1233 	    or component_code is null)
1234        and V_SUBTREE_EXISTS = 1
1235        union
1236        select line_id
1237        from   so_lines
1238        where  line_id = V_LINE_ID
1239        or     service_parent_line_id = V_LINE_ID);
1240 
1241 UPDATE SO_LINES
1242 SET    S3 = DECODE(S3,18,8,S3)
1243 WHERE  LINE_ID IN
1244        (select line_id from so_lines
1245         where parent_line_id = V_REAL_PARENT_LINE_ID
1246         and (nvl(component_code,'0') like V_COMPONENT_CODE || '%'
1247 	        or component_code is null)
1248         and V_SUBTREE_EXISTS = 1
1249         union
1250         select line_id
1251         from   so_lines
1252         where  line_id = V_LINE_ID
1253         or     service_parent_line_id = V_LINE_ID)
1254 AND    NOT EXISTS
1255         (SELECT 'BACKORDERED PICKING LINES'
1256          FROM SO_PICKING_LINES
1257          WHERE ORDER_LINE_ID = SO_LINES.LINE_ID
1258          AND PICKING_HEADER_ID = 0
1259          AND ORIGINAL_REQUESTED_QUANTITY > NVL(CANCELLED_QUANTITY,0));
1260 
1261 V_RESULT := 1;
1262 
1263 END UPDATE_LINE_INFO;
1264 
1265 ------------------------------------------------------------------------
1266 -- procedure UPDATE_MODEL_INFO
1267 --
1268 --	Update so_lines  by setting the cancelled_quantity = the
1269 --	requested quantity and previous cancelled_quantity. Also set the
1270 --	open_flag to '' if ordered_quantity equals cancelled_quantity.
1271 --	If no backordered picking lines exist where the original requested
1272 --	quantity is greater than the cancelled quantity then set S3
1273 --	(Backorder Release) to 8 (Not Applicable) if it was 18 (Eligible).
1274 --	Insert a record into so_order_cancellations.
1275 --
1276 -- RETURNS
1277 --	1 -> success
1278 ------------------------------------------------------------------------
1279 
1280 procedure UPDATE_MODEL_INFO(
1281    V_LINE_ID                    IN NUMBER
1282 ,  V_REQUESTED_CANCEL_QTY       IN NUMBER
1283 ,  V_CANCEL_COMMENT             IN LONG
1284 ,  V_CANCEL_CODE                IN VARCHAR2
1285 ,  V_STATUS			IN VARCHAR2
1286 ,  V_LAST_UPDATED_BY		IN NUMBER
1287 ,  V_LAST_UPDATE_LOGIN		IN NUMBER
1288 ,  V_HEADER_ID                  IN NUMBER
1289 ,  V_FULL                       IN NUMBER
1290 ,  V_RESULT			OUT NUMBER
1291                           )
1292 IS
1293 
1294 	DUMMY		NUMBER;
1295 	TEMP 		BOOLEAN;
1296         v_current_user  NUMBER;
1297 
1298 BEGIN
1299 
1300         v_current_user := to_number(FND_PROFILE.VALUE('USER_ID'));
1301 
1302 -- If there are open pick slips against this line (or its included items),
1303 -- we fail the whole 'Clean empty classes' process and issue an error message.
1304 
1305  SELECT COUNT(*)
1306  INTO   DUMMY
1307  FROM   SO_PICKING_LINES L,
1308 	SO_PICKING_HEADERS H
1309  WHERE  L.ORDER_LINE_ID = V_LINE_ID
1310  AND 	L.PICKING_HEADER_ID = H.PICKING_HEADER_ID
1311  AND	H.STATUS_CODE IN ('OPEN' ,'PENDING', 'IN PROGRESS');
1312 
1313  IF (DUMMY >= 1) THEN
1314     TEMP := OE_MSG.SET_MESSAGE_NAME ('OE_CANCEL_CLASS_OPENSLP');
1315     V_RESULT := 0;
1316     RETURN;
1317  END IF;
1318 
1319  UPDATE SO_LINES SET
1320       CANCELLED_QUANTITY =
1321          V_REQUESTED_CANCEL_QTY + NVL(CANCELLED_QUANTITY,0)
1322  WHERE LINE_ID = V_LINE_ID;
1323 
1324  UPDATE SO_LINES SET
1325       OPEN_FLAG =
1326          DECODE ((nvl(ORDERED_QUANTITY,0) - NVL(CANCELLED_QUANTITY,0)),
1327              0, '', OPEN_FLAG)
1328  WHERE LINE_ID = V_LINE_ID;
1329 
1330  UPDATE SO_LINES SET
1331       LAST_UPDATED_BY = V_LAST_UPDATED_BY,
1332       LAST_UPDATE_LOGIN = V_LAST_UPDATE_LOGIN,
1333       LAST_UPDATE_DATE = SYSDATE,
1334       S1 = DECODE(OPEN_FLAG,'',DECODE(S1,18,8,S1),S1),
1335       S2 = DECODE(OPEN_FLAG,'',DECODE(S2,18,8,S2),S2),
1336       S3 = DECODE(OPEN_FLAG,'',DECODE(S3,18,8,S3),S3),
1337       S4 = DECODE(OPEN_FLAG,'',DECODE(S4,18,8,S4),S4),
1338       S5 = DECODE(OPEN_FLAG,'',DECODE(S5,18,8,S5),S5),
1339       S6 = DECODE(OPEN_FLAG,'',DECODE(S6,18,8,S6),S6),
1340       S7 = DECODE(OPEN_FLAG,'',DECODE(S7,18,8,S7),S7),
1341       S8 = DECODE(OPEN_FLAG,'',DECODE(S8,18,8,S8),S8),
1342       S9 = DECODE(OPEN_FLAG,'',11,5),
1343       S10 = DECODE(OPEN_FLAG,'',DECODE(S10,18,8,S10),S10),
1344       S11 = DECODE(OPEN_FLAG,'',DECODE(S11,18,8,S11),S11),
1345       S12 = DECODE(OPEN_FLAG,'',DECODE(S12,18,8,S12),S12),
1346       S13 = DECODE(OPEN_FLAG,'',DECODE(S13,18,8,S13),S13),
1347       S14 = DECODE(OPEN_FLAG,'',DECODE(S14,18,8,S14),S14),
1348       S15 = DECODE(OPEN_FLAG,'',DECODE(S15,18,8,S15),S15),
1349       S16 = DECODE(OPEN_FLAG,'',DECODE(S16,18,8,S16),S16),
1350       S17 = DECODE(OPEN_FLAG,'',DECODE(S17,18,8,S17),S17),
1351       S18 = DECODE(OPEN_FLAG,'',DECODE(S18,18,8,S18),S18),
1352       S19 = DECODE(OPEN_FLAG,'',DECODE(S19,18,8,S19),S19),
1353       S20 = DECODE(OPEN_FLAG,'',DECODE(S20,18,8,S20),S20),
1354       S21 = DECODE(OPEN_FLAG,'',DECODE(S21,18,8,S21),S21),
1355       S22 = DECODE(OPEN_FLAG,'',DECODE(S22,18,8,S22),S22),
1356       S23 = DECODE(OPEN_FLAG,'',DECODE(S23,18,8,S23),S23),
1357       S24 = DECODE(OPEN_FLAG,'',DECODE(S24,18,8,S24),S24),
1358       S25 = DECODE(OPEN_FLAG,'',DECODE(S25,18,8,S25),S25),
1359       S26 = DECODE(OPEN_FLAG,'',DECODE(S26,18,8,S26),S26),
1360       S27 = DECODE(OPEN_FLAG,'',DECODE(S27,18,8,S27),S27),
1361       S28 = DECODE(OPEN_FLAG,'',DECODE(S28,18,8,S28),S28),
1362       S29 = DECODE(OPEN_FLAG,'',DECODE(S29,18,8,S29),S29),
1363       S30 = DECODE(OPEN_FLAG,'',DECODE(S30,18,8,S30),S30)
1364  WHERE LINE_ID = V_LINE_ID;
1365 
1366  -- BACKORDERED PICKING LINES EXIST
1367 
1368  SELECT COUNT(*)
1369  INTO   DUMMY
1370  FROM   SO_PICKING_LINES
1371  WHERE  PICKING_HEADER_ID = 0
1372  AND    ORIGINAL_REQUESTED_QUANTITY > NVL(CANCELLED_QUANTITY,0)
1373  AND    ORDER_LINE_ID = V_LINE_ID;
1374 
1375  IF (DUMMY >= 1) THEN
1376     NULL;
1377  ELSE
1378    UPDATE SO_LINES
1379    SET    S3 = DECODE(S3,18,8,S3)
1380    WHERE  LINE_ID = V_LINE_ID;
1381  END IF;
1382 
1383 UPDATE SO_LINES
1384 SET   S1_DATE = DECODE(OPEN_FLAG,'',
1385         DECODE(S1,8,SYSDATE,S1_DATE),S1_DATE),
1386       S2_DATE = DECODE(OPEN_FLAG,'',
1387         DECODE(S2,8,SYSDATE,S2_DATE),S2_DATE),
1388       S3_DATE = DECODE(S3,8,SYSDATE,S3_DATE),
1389       S4_DATE = DECODE(OPEN_FLAG,'',
1390         DECODE(S4,8,SYSDATE,S4_DATE),S4_DATE),
1391       S5_DATE = DECODE(OPEN_FLAG,'',
1392         DECODE(S5,8,SYSDATE,S5_DATE),S5_DATE),
1393       S6_DATE = DECODE(OPEN_FLAG,'',
1394         DECODE(S6,8,SYSDATE,S6_DATE),S6_DATE),
1395       S7_DATE = DECODE(OPEN_FLAG,'',
1396         DECODE(S7,8,SYSDATE,S7_DATE),S7_DATE),
1397       S8_DATE = DECODE(OPEN_FLAG,'',
1398         DECODE(S8,8,SYSDATE,S8_DATE),S8_DATE),
1399       S9_DATE = SYSDATE,
1400       S10_DATE=DECODE(OPEN_FLAG,'',
1401         DECODE(S10,8,SYSDATE,S10_DATE),S10_DATE),
1402       S11_DATE=DECODE(OPEN_FLAG,'',
1406       S13_DATE=DECODE(OPEN_FLAG,'',
1403         DECODE(S11,8,SYSDATE,S11_DATE),S11_DATE),
1404       S12_DATE=DECODE(OPEN_FLAG,'',
1405         DECODE(S12,8,SYSDATE,S12_DATE),S12_DATE),
1407         DECODE(S13,8,SYSDATE,S13_DATE),S13_DATE),
1408       S14_DATE=DECODE(OPEN_FLAG,'',
1409         DECODE(S14,8,SYSDATE,S14_DATE),S14_DATE),
1410       S15_DATE=DECODE(OPEN_FLAG,'',
1411         DECODE(S15,8,SYSDATE,S15_DATE),S15_DATE),
1412       S16_DATE=DECODE(OPEN_FLAG,'',
1413         DECODE(S16,8,SYSDATE,S16_DATE),S16_DATE),
1414       S17_DATE=DECODE(OPEN_FLAG,'',
1415         DECODE(S17,8,SYSDATE,S17_DATE),S17_DATE),
1416       S18_DATE=DECODE(OPEN_FLAG,'',
1417         DECODE(S18,8,SYSDATE,S18_DATE),S18_DATE),
1418       S19_DATE=DECODE(OPEN_FLAG,'',
1419         DECODE(S19,8,SYSDATE,S19_DATE),S19_DATE),
1420       S20_DATE=DECODE(OPEN_FLAG,'',
1421         DECODE(S20,8,SYSDATE,S20_DATE),S20_DATE),
1422       S21_DATE=DECODE(OPEN_FLAG,'',
1423         DECODE(S21,8,SYSDATE,S21_DATE),S21_DATE),
1424       S22_DATE=DECODE(OPEN_FLAG,'',
1425         DECODE(S22,8,SYSDATE,S22_DATE),S22_DATE),
1426       S23_DATE=DECODE(OPEN_FLAG,'',
1427         DECODE(S23,8,SYSDATE,S23_DATE),S23_DATE),
1428       S24_DATE=DECODE(OPEN_FLAG,'',
1429         DECODE(S24,8,SYSDATE,S24_DATE),S24_DATE),
1430       S25_DATE=DECODE(OPEN_FLAG,'',
1431         DECODE(S25,8,SYSDATE,S25_DATE),S25_DATE),
1432       S26_DATE=DECODE(OPEN_FLAG,'',
1433         DECODE(S26,8,SYSDATE,S26_DATE),S26_DATE),
1434       S27_DATE=DECODE(OPEN_FLAG,'',
1435         DECODE(S27,8,SYSDATE,S27_DATE),S27_DATE),
1436       S28_DATE=DECODE(OPEN_FLAG,'',
1437         DECODE(S28,8,SYSDATE,S28_DATE),S28_DATE),
1438       S29_DATE=DECODE(OPEN_FLAG,'',
1439         DECODE(S29,8,SYSDATE,S29_DATE),S29_DATE),
1440       S30_DATE=DECODE(OPEN_FLAG,'' ,
1441         DECODE(S30,8,SYSDATE,S30_DATE),S30_DATE)
1442 WHERE LINE_ID = V_LINE_ID;
1443 
1444 INSERT INTO SO_ORDER_CANCELLATIONS
1445        ( LINE_ID, HEADER_ID,
1446          CANCEL_CODE, CANCELLED_BY,
1447          CANCEL_DATE, LAST_UPDATED_BY,
1448          LAST_UPDATE_DATE, CANCEL_COMMENT,
1449          CANCELLED_QUANTITY, STATUS,
1450          CREATION_DATE, CREATED_BY,
1451          LAST_UPDATE_LOGIN )
1452 VALUES( V_LINE_ID, V_HEADER_ID,
1453         V_CANCEL_CODE, v_current_user,
1454         SYSDATE, V_LAST_UPDATED_BY,
1455         SYSDATE, V_CANCEL_COMMENT,
1456         V_REQUESTED_CANCEL_QTY,
1457         V_STATUS, SYSDATE, v_current_user,
1458         V_LAST_UPDATE_LOGIN );
1459 
1460 V_RESULT := 1;
1461 
1462 END UPDATE_MODEL_INFO;
1463 
1464 ------------------------------------------------------------------------
1465 -- procedure LOAD_BOM
1466 --
1467 --	call the bom exploder
1468 --
1469 -- RETURNS
1470 --	1 -> successful
1471 --	0 -> unsuccessful
1472 ------------------------------------------------------------------------
1473 
1474 procedure LOAD_BOM(
1475    V_SO_ORGANIZATION_ID         IN NUMBER
1476 ,  V_TOP_INVENTORY_ITEM_ID	IN NUMBER
1477 ,  V_TOP_COMPONENT_CODE		IN VARCHAR2
1478 ,  V_CREATION_DATE_TIME		IN VARCHAR2
1479 ,  V_LAST_UPDATED_BY		IN NUMBER
1480 ,  V_RESULT			OUT NUMBER
1481                           )
1482 IS
1483 	X_BOM_MESSAGE		VARCHAR2(500) := '';
1484 	X_BOM_RESULT		NUMBER;
1485 	V_BOM_EXPLOSION_GROUP_ID NUMBER;
1486         x                    BOOLEAN;
1487 
1488 BEGIN
1489 
1490  V_RESULT := 0;
1491 
1492    BOMPNORD.BMXPORDER_EXPLODE_FOR_ORDER
1493    ( ORG_ID => V_SO_ORGANIZATION_ID
1494    , COPY_FLAG => 2
1495    , EXPL_TYPE => 'OPTIONAL'
1496    , ORDER_BY => 2
1497    , GRP_ID => V_BOM_EXPLOSION_GROUP_ID
1498    , SESSION_ID => 0
1499    , LEVELS_TO_EXPLODE => 60
1500    , ITEM_ID => V_TOP_INVENTORY_ITEM_ID
1501    , COMP_CODE => V_TOP_COMPONENT_CODE
1502 /* The foll. line has been commented and changed to the line below it.
1503 *  This has been done to fix bug# 912073.
1504 */
1505 --   , REV_DATE => substr(V_CREATION_DATE_TIME, 1, 15)
1506    , REV_DATE => substr(V_CREATION_DATE_TIME, 1, 16)
1507    , USER_ID => V_LAST_UPDATED_BY
1508    , ERR_MSG => X_BOM_MESSAGE
1509    , ERROR_CODE => X_BOM_RESULT);
1510 
1511    IF (X_BOM_RESULT = 0) THEN
1512       V_RESULT := 1;
1513    ELSE
1514     x :=OE_MSG.SET_BUFFER_MESSAGE('OE_BOM_EXPLOSION_FAILED', 'REASON', X_BOM_RESULT);
1515       -- issue message 'OE_BOM_EXPLOSION_FAILED'
1516       -- REASON=:WORLD.BOM_MESSAGE
1517       V_RESULT := 0;
1518    END IF;
1519 
1520 END LOAD_BOM;
1521 
1522 ------------------------------------------------------------------------
1523 -- procedure CHECK_MODEL_RATIOS
1524 --
1525 --	If this is a FULL cancellation, don't check the ratios.
1526 --	If this is a return line, don't check the ratios.
1527 --	If this is an option line, make sure the user only cancels in
1528 -- 	multiples of the model if it's not a full cancellation.
1529 --	Check to make sure that the quantity selected is a multiple of
1530 --	parent quantity.
1531 --	If it is a multiple of parent quantity check to see if we are
1532 --	dealing with a ATO model and if so call the bom exploder.
1533 --	Make sure that we are not cancelling the last option a mandatory class.
1534 --	Make sure that we are not cancelling a mandatory class.
1535 --	Also make sure that we have not gone below the minimum required
1536 --	quantity for the option selected.
1537 --
1538 -- RETURNS
1539 --	1 -> successful
1540 ------------------------------------------------------------------------
1541 
1542 procedure CHECK_MODEL_RATIOS(
1543    V_LINE_ID			IN NUMBER
1544 ,  V_REQUESTED_CANCEL_QTY       IN NUMBER
1545 ,  V_LINE_TYPE_CODE		IN VARCHAR2
1546 ,  V_OPTION_FLAG		IN NUMBER
1547 ,  V_LINK_TO_LINE_ID		IN NUMBER
1548 ,  V_ORDER_QTY			IN NUMBER
1549 ,  V_CANCELLED_QTY		IN NUMBER
1550 ,  V_FULL			IN NUMBER
1551 ,  V_ATO_FLAG			IN NUMBER
1552 ,  V_SO_ORGANIZATION_ID         IN NUMBER
1553 ,  V_TOP_BILL_SEQUENCE_ID 	IN NUMBER
1554 ,  V_PARENT_COMPONENT_SEQUENCE_ID IN NUMBER
1555 ,  V_COMPONENT_SEQUENCE_ID      IN NUMBER
1556 ,  V_TOP_INVENTORY_ITEM_ID	IN NUMBER
1557 ,  V_TOP_COMPONENT_CODE		IN VARCHAR2
1558 ,  V_CREATION_DATE_TIME		IN VARCHAR2
1559 ,  V_LAST_UPDATED_BY            IN NUMBER
1560 ,  V_RESULT			OUT NUMBER
1561                           )
1562 IS
1563 	DUMMY		NUMBER;
1564         DUMMY2		NUMBER;
1565         DUMMY3		NUMBER;
1566         DUMMY4		NUMBER;
1567 	LOAD_BOM_RESULT NUMBER := 0;
1568 	TEMP_QTY        NUMBER := 0;
1569 	x               BOOLEAN;
1570 
1571 BEGIN
1572 
1573  V_RESULT := 0;
1574 
1575  IF (V_FULL = 1) THEN
1576   V_RESULT := 1;
1577   RETURN;
1578  END IF;
1579 
1580  IF (V_LINE_TYPE_CODE = 'RETURN') THEN
1581   V_RESULT := 1;
1582   RETURN;
1583  END IF;
1584 
1585  IF (V_OPTION_FLAG = 0) THEN
1586   V_RESULT := 1;
1587   RETURN;
1588  END IF;
1589 
1590  SELECT  COUNT(*)
1591  INTO    DUMMY
1592  FROM    SO_LINES M
1593  WHERE   M.LINE_ID = V_LINK_TO_LINE_ID
1594  AND     MOD((V_ORDER_QTY
1595             - NVL(V_CANCELLED_QTY,0) - V_REQUESTED_CANCEL_QTY),
1596             (M.ORDERED_QUANTITY - nvl(M.CANCELLED_QUANTITY,0))) = 0;
1597 
1598  IF (DUMMY >= 1) THEN
1599   IF (V_ATO_FLAG = 1) THEN
1600    IF (V_TOP_COMPONENT_CODE is NULL) THEN
1601     V_RESULT := 1;
1602     RETURN;
1603    ELSE
1604     OE_CANCEL.LOAD_BOM(
1605 	V_SO_ORGANIZATION_ID,
1606 	V_TOP_INVENTORY_ITEM_ID,
1607 	V_TOP_COMPONENT_CODE,
1608 	V_CREATION_DATE_TIME,
1609 	V_LAST_UPDATED_BY,
1610 	LOAD_BOM_RESULT);
1611     END IF;
1612   ELSE
1613    V_RESULT := 1;
1614     RETURN;
1615   END IF;
1616  ELSE
1617   -- You must select a quantity that is a multiple of the parent quantity.
1618   x :=OE_MSG.SET_MESSAGE_NAME('OE_CAN_OPN_NOT_RATIO');
1619   V_RESULT := 0;
1620   RETURN;
1621  END IF;
1622 
1623  IF (LOAD_BOM_RESULT = 1) THEN
1624 
1625   	SELECT 	COUNT(*)
1626   	INTO   	DUMMY2
1627 	FROM 	BOM_EXPLOSIONS
1628 	WHERE  	TOP_BILL_SEQUENCE_ID = V_TOP_BILL_SEQUENCE_ID
1629 	AND    	EXPLOSION_TYPE = 'OPTIONAL'
1630 	AND    	PLAN_LEVEL >= 0
1631 	AND    	EFFECTIVITY_DATE <= TO_DATE(
1632 				    NVL(substr(V_CREATION_DATE_TIME, 1, 16),
1633 				        TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI')),
1634 				        'YYYY/MM/DD HH24:MI')
1635 	AND    	DISABLE_DATE > TO_DATE(NVL(substr(V_CREATION_DATE_TIME, 1, 16),
1636 				       TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI')),
1637 				       'YYYY/MM/DD HH24:MI')
1638 	AND 	COMPONENT_SEQUENCE_ID  = V_PARENT_COMPONENT_SEQUENCE_ID
1639 	AND 	OPTIONAL = 2
1640 	AND 	(V_ORDER_QTY - NVL(V_CANCELLED_QTY,0) - V_REQUESTED_CANCEL_QTY) = 0
1641 	AND NOT EXISTS
1642 		(SELECT	'X'
1643 		FROM	SO_LINES
1644 		WHERE 	LINK_TO_LINE_ID = V_LINK_TO_LINE_ID
1645 		AND 	LINE_ID <> V_LINE_ID
1646 		AND 	ORDERED_QUANTITY - NVL(CANCELLED_QUANTITY,0) > 0);
1647 
1648   IF (DUMMY2 >= 1) THEN
1649     -- You may not cancel the last option in this mandatory class.
1650    x :=OE_MSG.SET_MESSAGE_NAME('OE_CAN_LAST_OPT');
1651    V_RESULT := 0;
1652    RETURN;
1653   END IF;
1654 
1655   SELECT COUNT(*)
1656   INTO   DUMMY3
1657   FROM   BOM_EXPLOSIONS
1658   WHERE  TOP_BILL_SEQUENCE_ID = V_TOP_BILL_SEQUENCE_ID
1659   AND    EXPLOSION_TYPE = 'OPTIONAL'
1660   AND    PLAN_LEVEL >= 0
1661   AND    EFFECTIVITY_DATE <= TO_DATE(NVL(substr(V_CREATION_DATE_TIME, 1, 16),
1662 				     TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI')),
1663 				     'YYYY/MM/DD HH24:MI')
1664   AND    DISABLE_DATE > TO_DATE(NVL(substr(V_CREATION_DATE_TIME, 1, 16),
1665 				    TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI')),
1666 				    'YYYY/MM/DD HH24:MI')
1667   AND    COMPONENT_SEQUENCE_ID  = V_COMPONENT_SEQUENCE_ID
1668   AND    OPTIONAL = 2
1669   AND    (V_ORDER_QTY - NVL(V_CANCELLED_QTY,0) - V_REQUESTED_CANCEL_QTY) = 0;
1670 
1671 
1672   IF ( DUMMY3 >= 1) THEN
1673    -- You may not cancel a mandatory class.
1674    x :=OE_MSG.SET_MESSAGE_NAME('OE_CAN_MAND_CLASS');
1675    V_RESULT := 0;
1676    RETURN;
1677   END IF;
1678 
1679   TEMP_QTY := V_ORDER_QTY - nvl(V_CANCELLED_QTY,0) - V_REQUESTED_CANCEL_QTY;
1680 
1681   IF(TEMP_QTY = 0) THEN
1682     V_RESULT := 1;
1683     RETURN;
1684   END IF;
1685 
1686   -- 'ORDERED QUANTITY OUT OF BOM RANGE'
1687 
1688   SELECT COUNT(*)
1689   INTO   DUMMY4
1690   FROM   BOM_EXPLOSIONS
1691   WHERE  TOP_BILL_SEQUENCE_ID = V_TOP_BILL_SEQUENCE_ID
1692   AND    EXPLOSION_TYPE = 'OPTIONAL'
1693   AND    PLAN_LEVEL >= 0
1694   AND    EFFECTIVITY_DATE <= TO_DATE(NVL(substr(V_CREATION_DATE_TIME, 1, 16),
1695 				     TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI')),
1696 				     'YYYY/MM/DD HH24:MI')
1697   AND    DISABLE_DATE > TO_DATE(NVL(substr(V_CREATION_DATE_TIME, 1, 16),
1698 				    TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI')),
1699 				    'YYYY/MM/DD HH24:MI')
1700   AND    COMPONENT_SEQUENCE_ID = V_COMPONENT_SEQUENCE_ID
1701   AND    NVL(LOW_QUANTITY,0) <=
1702 	(SELECT (V_ORDER_QTY - NVL(V_CANCELLED_QTY,0) - V_REQUESTED_CANCEL_QTY) /
1703         	(P.ORDERED_QUANTITY - NVL(P.CANCELLED_QUANTITY,0))
1704 	FROM 	SO_LINES P
1705 	WHERE 	P.LINE_ID = V_LINK_TO_LINE_ID);
1706 
1707 
1708   IF (DUMMY4 = 0) THEN
1709    -- You have gone below the minimum required quantity for this option.
1710    x :=OE_MSG.SET_MESSAGE_NAME('OE_CAN_ATO_LOW');
1711    V_RESULT := 0;
1712    RETURN;
1713   ELSE
1714    V_RESULT := 1;
1715    RETURN;
1716   END IF;
1717  ELSE
1718   V_RESULT := 0;
1719   RETURN;
1720  END IF;
1721 END CHECK_MODEL_RATIOS;
1722 
1723 
1724 END OE_CANCEL;