DBA Data[Home] [Help]

PACKAGE BODY: APPS.WSH_SC_PLD_PKG

Source


1 PACKAGE BODY WSH_SC_PLD_PKG as
2 /* $Header: WSHSCPDB.pls 115.5 99/07/16 08:20:47 porting shi $ */
3 
4 --
5 -- Package
6 --      WSH_SC_PLD_PKG
7 --
8 -- Purpose
9 --     	This package is used by the confirm delivery form to update
10 --	serial number information (details) entered on a delivery line
11 --	and do the explosion of the serial numbers if necessary.
12 -- History
13 --	Version	1.0	03/01/97	RMANJUNA
14 --
15   --
16   -- Name
17   -- 	Close_Details
18   -- Purpose
19   --    To update picking line details with information entered in the
20   --    serial number window.
21   --
22   --
23   -- Arguments
24   --
25   --
26   --
27   -- Notes
28 
29 PROCEDURE Close_Details(X_Delivery_Id	IN NUMBER)
30 IS
31   x_picking_line_id 		NUMBER;
32   x_picking_line_detail_id	NUMBER;
33   x_split_detail_id		NUMBER;
34   x_trx_qty			NUMBER;
35   x_req_qty			NUMBER;
36   x_new_req_qty			NUMBER;
37   x_new_trx_qty			NUMBER;
38   x_explode_flag		NUMBER;
39   x_serial_number		varchar2(30);
40   --get the picking line details for this Delivery
41   CURSOR picking_line_details_cursor IS
42   	SELECT picking_line_detail_id, requested_quantity, shipped_quantity,
43 	       serial_number
44   	FROM   so_picking_line_details
45 	WHERE  delivery_id  = X_Delivery_Id
46 	AND    transaction_temp_id IS NOT NULL;
47 
48   -- to check if the item is under serial number control
49   CURSOR check_serial(X_Pk_Line_Detail_Id NUMBER) is
50 	SELECT	msi.serial_number_control_code
51 	FROM	mtl_system_items msi,
52 		so_picking_lines_all pl,
53 		so_picking_line_details pld
54 	WHERE	pl.inventory_item_id = msi.inventory_item_id
55 	AND	pl.warehouse_id = msi.organization_id
56 	AND	msi.serial_number_control_code in (2,5,6)
57 	AND     pl.picking_line_id = pld.picking_line_id
58 	AND   	pld.picking_line_detail_id = X_Pk_Line_Detail_Id;
59 BEGIN
60 
61 --  X_Error := 0;
62 
63   OPEN picking_line_details_cursor;
64   LOOP
65     FETCH picking_line_details_cursor
66     INTO x_picking_line_detail_id, x_req_qty,
67 	 x_trx_qty, x_serial_number ;
68     EXIT WHEN picking_line_details_cursor%NOTFOUND;
69     IF (x_serial_number is NULL) then
70      IF x_trx_qty < x_req_qty THEN
71       -- Create remainder detail
72       Create_Remainders(x_picking_line_detail_id, (x_req_qty - x_trx_qty));
73      END IF;
74 
75      x_explode_flag := -1; -- initialize
76 
77      OPEN check_serial(x_picking_line_detail_id);
78 
79      FETCH check_serial INTO x_explode_flag;
80 
81      IF x_explode_flag > 0 THEN -- basically if x_explode flag is 2, 5 or 6
82       -- Serial Number Explosion
83       Explode_Lines(x_picking_line_detail_id);
84      END IF;
85 
86      CLOSE check_serial;
87     end if;
88 
89   END LOOP;
90 
91   CLOSE picking_line_details_cursor;
92 
93   -- Now go ahead and Delete the records from MSNT
94   Delete_From_Msnt(X_Delivery_Id);
95 
96 /*  donno if we need to do this
97   IF (X_Error = 0) THEN
98     SHP_SC_SERIAL_VALIDATION_PKG.Check_Duplicate_Serial(X_Entity_Id, X_Error, X_Error_Lines);
99   END IF;
100 */
101 
102 EXCEPTION
103     WHEN OTHERS THEN
104 	FND_MESSAGE.Set_Name('OE','OE_QUERY_ERROR');
105 	FND_MESSAGE.Set_Token('PACKAGE','SHP_SC_PLD_PKG.Close_Details');
106 	FND_MESSAGE.Set_Token('ORA_ERROR',to_char(sqlcode));
107 	FND_MESSAGE.Set_Token('ORA_TEXT',SQLERRM);
108 	APP_EXCEPTION.Raise_Exception;
109 
110 END Close_Details;
111 
112   --
113   -- Name
114   -- 	Update_Details
115   -- Purpose
116   --    To update picking line details with information entered into the
117   --    transaction block.
118   -- Arguments
119   -- 		X_Trx_Src_Line_Id	IN	NUMBER
120   -- 		X_Requested_Qty		IN	NUMBER
121   -- 		X_Shipped_Qty		IN	NUMBER
122   --		X_Serial		IN	VARCHAR2
123   --
124   --
125   -- Notes
126   --
127 
128 
129 PROCEDURE Update_Details(  X_Trx_Src_Line_Id	IN	NUMBER,
130 			   X_Requested_Qty	IN	NUMBER,
131 			   X_Shipped_Qty	IN	NUMBER,
132 			   X_Serial		IN	VARCHAR2) IS
133 BEGIN
134 
135 	UPDATE SO_PICKING_LINE_DETAILS PLD
136 	SET
137  	(LAST_UPDATE_DATE,
138  	LAST_UPDATED_BY,
139  	LAST_UPDATE_LOGIN,
140 	REQUESTED_QUANTITY,
141  	SHIPPED_QUANTITY,
142  	SERIAL_NUMBER	 ) =
143 	(SELECT
144 	  SYSDATE,
145 	  FND_GLOBAL.USER_ID,
146 	  FND_GLOBAL.USER_ID,
147 	  X_Requested_Qty,
148 	  X_Shipped_Qty,
149 	  X_Serial
150 	 FROM DUAL)
151 	WHERE PICKING_LINE_DETAIL_ID = X_Trx_Src_Line_Id;
152 
153   EXCEPTION
154     WHEN NO_DATA_FOUND THEN
155 	-- Replace this with real error? How to reflect in form?
156 	FND_MESSAGE.Set_Name('OE','OE_QUERY_ERROR');
157 	FND_MESSAGE.Set_Token('PACKAGE','WSH_SC_PLD_PKG.Update_Details');
158 	FND_MESSAGE.Set_Token('ORA_ERROR',to_char(sqlcode));
159 	FND_MESSAGE.Set_Token('ORA_TEXT',SQLERRM);
160 	APP_EXCEPTION.Raise_Exception;
161     WHEN OTHERS THEN
162 	FND_MESSAGE.Set_Name('OE','OE_QUERY_ERROR');
163 	FND_MESSAGE.Set_Token('PACKAGE','WSH_SC_PLD_PKG.Update_Details');
164 	FND_MESSAGE.Set_Token('ORA_ERROR',to_char(sqlcode));
165 	FND_MESSAGE.Set_Token('ORA_TEXT',SQLERRM);
166 	APP_EXCEPTION.Raise_Exception;
167 
168 END Update_Details;
169 
170 --
171 -- Purpose
172 --  This the used for split delivery line function to create a new
173 --  picking line details
174 --
175 FUNCTION Insert_Splitted_Details( X_Parent_Detail_Id	IN	NUMBER,
176 			   	  X_Req_Qty		IN	NUMBER,
177 				  X_detail_type_code    IN 	VARCHAR2)
178 RETURN NUMBER IS
179   X_new_detail_id	NUMBER;
180 BEGIN
181   SELECT SO_PICKING_LINE_DETAILS_S.NEXTVAL
182   INTO X_new_detail_id
183   FROM DUAL;
184 
185   Insert_Details( x_new_detail_id,
186 		  X_Parent_Detail_Id,
187 		  NULL,
188 	  	  X_Req_Qty,
189 		  NULL,
190                   'SPLIT',
191 		  X_detail_type_code);
192 
193   return X_new_detail_id;
194 END Insert_Splitted_Details;
195 
196   --
197   -- Name
198   -- 	Insert_Details
199   -- Purpose
200   --    To insert new picking line details for details split on transaction
201   --    block or entered in the serial number window.
202   -- Arguments
203   -- 		X_New_Detail_Id		IN	NUMBER
204   --		X_Parent_Detail_Id	IN	NUMBER
205   --	        X_Trx_Qty		IN	NUMBER
206   --	        X_Req_Qty		IN	NUMBER
207   --		X_Serial		IN	VARCHAR2
208   --		X_Mode			IN	VARCHAR2
209   --
210   --
211   --
212   -- Notes
213   --
214 
215 PROCEDURE Insert_Details(  X_New_Detail_Id	IN	NUMBER,
216 			   X_Parent_Detail_Id	IN	NUMBER,
217 			   X_Trx_Qty		IN	NUMBER,
218 			   X_Req_Qty		IN	NUMBER,
219 			   X_Serial		IN	VARCHAR2,
220 			   X_Mode  		IN	VARCHAR2,
221 			   X_detail_type_code  	IN	VARCHAR2 DEFAULT 'NA')
222 IS
223 	X_Created_Detail_Id	NUMBER;
224 BEGIN
225 
226 
227 	IF (X_New_Detail_Id is NULL) THEN
228 		SELECT SO_PICKING_LINE_DETAILS_S.NEXTVAL
229 		INTO X_Created_Detail_Id
230 		FROM DUAL;
231 	END IF;
232 
233 	INSERT INTO SO_PICKING_LINE_DETAILS (
234 	 PICKING_LINE_DETAIL_ID
235 	,LAST_UPDATE_DATE
236 	,LAST_UPDATED_BY
237 	,CREATED_BY
238 	,CREATION_DATE
239 	,LAST_UPDATE_LOGIN
240 	,PROGRAM_APPLICATION_ID
241 	,PROGRAM_ID
242 	,PROGRAM_UPDATE_DATE
243 	,REQUEST_ID
244 	,PICKING_LINE_ID
245 	,WAREHOUSE_ID
246 	,REQUESTED_QUANTITY
247 	,SHIPPED_QUANTITY
248 	,SERIAL_NUMBER
249 	,LOT_NUMBER
250 	,CUSTOMER_REQUESTED_LOT_FLAG
251 	,REVISION
252 	,SUBINVENTORY
253 	,INVENTORY_LOCATION_ID
254 	,SEGMENT1
255 	,SEGMENT2
256 	,SEGMENT3
257 	,SEGMENT4
258 	,SEGMENT5
259 	,SEGMENT6
260 	,SEGMENT7
261 	,SEGMENT8
262 	,SEGMENT9
263 	,SEGMENT10
264 	,SEGMENT11
265 	,SEGMENT12
266 	,SEGMENT13
267 	,SEGMENT14
268 	,SEGMENT15
269 	,SEGMENT16
270 	,SEGMENT17
271 	,SEGMENT18
272 	,SEGMENT19
273 	,SEGMENT20
274 	,INVENTORY_LOCATION_SEGMENTS
275 	,DETAIL_TYPE_CODE
276 	,CONTEXT
277 	,ATTRIBUTE1
278 	,ATTRIBUTE2
279 	,ATTRIBUTE3
280 	,ATTRIBUTE4
281 	,ATTRIBUTE5
282 	,ATTRIBUTE6
283 	,ATTRIBUTE7
284 	,ATTRIBUTE8
285 	,ATTRIBUTE9
286 	,ATTRIBUTE10
287 	,ATTRIBUTE11
288 	,ATTRIBUTE12
289 	,ATTRIBUTE13
290 	,ATTRIBUTE14
291 	,ATTRIBUTE15
292 	,RELEASED_FLAG
293 	,SCHEDULE_DATE
294 	,SCHEDULE_LEVEL
295 	,SCHEDULE_STATUS_CODE
296 	,DEMAND_ID
297 	,AUTOSCHEDULED_FLAG
298 	,DELIVERY
299 	,WIP_RESERVED_QUANTITY
300 	,WIP_COMPLETED_QUANTITY
301 	,SUPPLY_SOURCE_TYPE
302 	,SUPPLY_SOURCE_HEADER_ID
303 	,UPDATE_FLAG
304 	,DEMAND_CLASS_CODE
305 	,RESERVABLE_FLAG
306 	,TRANSACTABLE_FLAG
307 	,LATEST_ACCEPTABLE_DATE
308 	,DPW_ASSIGNED_FLAG
309 	,DELIVERY_ID
310 	,DEPARTURE_ID
311 	,LOAD_SEQ_NUMBER
312 	,MASTER_CONTAINER_ITEM_ID
313 	,DETAIL_CONTAINER_ITEM_ID
314 	,TRANSACTION_TEMP_ID
315 	,PICK_SLIP_NUMBER
316 	,CONTAINER_ID
317 	,MVT_STAT_STATUS)
318 
319 	SELECT
320 	Nvl(X_New_Detail_id, X_Created_Detail_id)
321 	,SYSDATE
322 	,FND_GLOBAL.USER_ID
323 	,FND_GLOBAL.USER_ID
324 	,SYSDATE
325 	,FND_GLOBAL.LOGIN_ID
326 	,PROGRAM_APPLICATION_ID
327 	,PROGRAM_ID
328 	,PROGRAM_UPDATE_DATE
329 	,REQUEST_ID
330 	,PICKING_LINE_ID
331 	,WAREHOUSE_ID
332 	,X_Req_Qty
333 	,X_Trx_Qty
334 	,X_Serial
335 	,LOT_NUMBER
336 	,CUSTOMER_REQUESTED_LOT_FLAG
337 	,REVISION
338 	,SUBINVENTORY
339 	,INVENTORY_LOCATION_ID
340 	,SEGMENT1
341 	,SEGMENT2
342 	,SEGMENT3
343 	,SEGMENT4
344 	,SEGMENT5
345 	,SEGMENT6
346 	,SEGMENT7
347 	,SEGMENT8
348 	,SEGMENT9
349 	,SEGMENT10
350 	,SEGMENT11
351 	,SEGMENT12
352 	,SEGMENT13
353 	,SEGMENT14
354 	,SEGMENT15
355 	,SEGMENT16
356 	,SEGMENT17
357 	,SEGMENT18
358 	,SEGMENT19
359 	,SEGMENT20
360 	,INVENTORY_LOCATION_SEGMENTS
361 	,Decode( X_detail_type_code, 'NA', DETAIL_TYPE_CODE,
362 					   X_detail_type_code)
363 	,CONTEXT
364 	,ATTRIBUTE1
365 	,ATTRIBUTE2
366 	,ATTRIBUTE3
367 	,ATTRIBUTE4
368 	,ATTRIBUTE5
369 	,ATTRIBUTE6
370 	,ATTRIBUTE7
371 	,ATTRIBUTE8
372 	,ATTRIBUTE9
373 	,ATTRIBUTE10
374 	,ATTRIBUTE11
375 	,ATTRIBUTE12
376 	,ATTRIBUTE13
377 	,ATTRIBUTE14
378 	,ATTRIBUTE15
379 	,RELEASED_FLAG
380 	,SCHEDULE_DATE
381 	,SCHEDULE_LEVEL
382 	,SCHEDULE_STATUS_CODE
383 	,DEMAND_ID
384 	,AUTOSCHEDULED_FLAG
385 	,DELIVERY
386 	,WIP_RESERVED_QUANTITY
387 	,WIP_COMPLETED_QUANTITY
388 	,SUPPLY_SOURCE_TYPE
389 	,SUPPLY_SOURCE_HEADER_ID
390 	,UPDATE_FLAG
391 	,DEMAND_CLASS_CODE
392 	,RESERVABLE_FLAG
393 	,TRANSACTABLE_FLAG
394 	,LATEST_ACCEPTABLE_DATE
395 	,DPW_ASSIGNED_FLAG
396 	,DELIVERY_ID
397 	,DEPARTURE_ID
398 	,LOAD_SEQ_NUMBER
399 	,MASTER_CONTAINER_ITEM_ID
400 	,DETAIL_CONTAINER_ITEM_ID
401 	,decode(X_Mode,'REMAINDER', NULL,TRANSACTION_TEMP_ID)
402 	,PICK_SLIP_NUMBER
403 	,decode(X_Mode,'REMAINDER', NULL,CONTAINER_ID)
404 	,MVT_STAT_STATUS
405 	FROM SO_PICKING_LINE_DETAILS WHERE
406 	PICKING_LINE_DETAIL_ID = X_Parent_Detail_Id ;
407 
408   EXCEPTION
409     WHEN NO_DATA_FOUND THEN
410 	-- Replace this with real error? How to reflect in form?
411 	FND_MESSAGE.Set_Name('OE','OE_QUERY_ERROR');
412 	FND_MESSAGE.Set_Token('PACKAGE','WSH_SC_PLD_PKG.Insert_Details');
413 	FND_MESSAGE.Set_Token('ORA_ERROR',to_char(sqlcode));
414 	FND_MESSAGE.Set_Token('ORA_TEXT',SQLERRM);
415 	APP_EXCEPTION.Raise_Exception;
416     WHEN OTHERS THEN
417 	FND_MESSAGE.Set_Name('OE','OE_QUERY_ERROR');
418 	FND_MESSAGE.Set_Token('PACKAGE','WSH_SC_PLD_PKG.Insert_Details');
419 	FND_MESSAGE.Set_Token('ORA_ERROR',to_char(sqlcode));
420 	FND_MESSAGE.Set_Token('ORA_TEXT',SQLERRM);
421 	APP_EXCEPTION.Raise_Exception;
422 
423 END;
424 
425 
426   --
427   -- Name
428   -- 	Create_Remainders
429   -- Purpose
430   --   To create a new detail for the remaining quantity when a partial quantity
431   --   has been shipped for a reserved picking line.
432   --
433   -- Arguments
434   -- 		X_Pick_Line_Detail_Id		IN	NUMBER
435   --	        X_New_Requested		     	IN	NUMBER
436   --
437   -- Notes
438   --
439 
440 PROCEDURE Create_Remainders(X_Picking_Line_Detail_Id	NUMBER,
441 			    X_New_Requested		NUMBER ) IS
442 BEGIN
443 
444   -- insert the remainder detail in so_picking_line_details
445   -- shipped quantity will be 0 since this remainder detail
446   -- is for the unshipped quantity
447   Insert_Details( NULL,
448 		  X_Picking_Line_Detail_Id,
449 		  0,
450   	          X_New_Requested,
451 		  NULL ,
452  		  'REMAINDER') ;
453 
454   --now update the requested quantity on the original picking_line_detail
455   UPDATE so_picking_line_details pld
456   SET    pld.requested_quantity = pld.shipped_quantity
457   WHERE  pld.picking_line_detail_id = X_Picking_Line_Detail_Id;
458 
459   EXCEPTION
460     WHEN NO_DATA_FOUND THEN
461 	RETURN;
462     WHEN OTHERS THEN
463 	FND_MESSAGE.Set_Name('OE','OE_QUERY_ERROR');
464 	FND_MESSAGE.Set_Token('PACKAGE','WSH_SC_PLD_PKG.Create_Remainders');
465 	FND_MESSAGE.Set_Token('ORA_ERROR',to_char(sqlcode));
466 	FND_MESSAGE.Set_Token('ORA_TEXT',SQLERRM);
467 	APP_EXCEPTION.Raise_Exception;
468 END;
469 
470 
471   --
472   -- Name
473   --   Explode_Lines
474   -- Purpose
475   --   Takes individual lines from MTL_SERIAL_NUMBERS_TEMP that
476   --   are under serial number control and explodes them into multiple
477   --   lines based on the serial numbers entered.
478   -- Arguments
479   --   X_Picking_Line_Detail_Id for which is under Serial number
480   --   control and hence must do the explosion
481   --
482   -- Notes
483   --   Assumptions: The package assumes that it will be called when
484   --                there is one line in SO_PICKING_LINE_DETAILS
485   --		    for every line in MTL_SERIAL_NUMBERS_TEMP.
486   --
487 
488 
489   PROCEDURE Explode_Lines( X_Picking_Line_Detail_Id	IN	NUMBER)
490   IS
491 	-- Cursor to get the serial line detail information that can be
492 	-- extracted from MSNT to be stored in SOPLD
493 
494 	CURSOR	get_picking_line_detail(pk_line_detail_id NUMBER) IS
495 	SELECT	msnt.transaction_temp_id,
496 	  	pld.picking_line_detail_id,
497 		msnt.vendor_serial_number,
498 		msnt.fm_serial_number,
499 		msnt.to_serial_number,
500 		msnt.serial_prefix
501 	FROM	mtl_serial_numbers_temp msnt,
502 		so_picking_line_details pld
503 	WHERE	pld.picking_line_detail_id = pk_line_detail_id
504 	AND	pld.transaction_temp_id = msnt.transaction_temp_id(+)
505         ORDER BY msnt.transaction_temp_id;
506 
507 	I				NUMBER;
508 	X_Serial_Control_Code		NUMBER;
509         X_transaction_temp_id		NUMBER;
510         X_transaction_temp_id_old	NUMBER;
511 	X_trx_source_line_id		NUMBER;
512 	X_serial_number			VARCHAR2(30);
513 	X_fm_serial_number		VARCHAR2(30);
514 	X_to_serial_number		VARCHAR2(30);
515 	X_serial_qty			VARCHAR2(30);
516 	X_Serial_Current		VARCHAR2(30);
517 	X_Serial_Prefix			VARCHAR2(30);
518 	X_Serial_Numeric_Temp		VARCHAR2(30);
519 	X_Serial_Numeric		NUMBER;
520 	X_Serial_Numeric_Len		NUMBER;
521         X_can_update			NUMBER;
522         X_loop_end			NUMBER;
523 
524   BEGIN
525    X_Transaction_temp_id_old := -1;
526    -- Retrieve line detail info from MSNT using picking line_detail
527    OPEN get_picking_line_detail(X_Picking_Line_Detail_Id);
528    LOOP
529      FETCH	get_picking_line_detail INTO
530 		X_transaction_temp_id,
531 		X_trx_source_line_id,
532 		X_serial_number,
533 		X_fm_serial_number,
534 		X_to_serial_number,
535 		X_serial_qty;
536      EXIT WHEN get_picking_line_detail%NOTFOUND;
537      IF  (X_serial_number IS NULL) THEN
538              IF (X_transaction_temp_id <> X_transaction_temp_id_old) THEN
539                   X_can_update := 1;
540                   X_transaction_temp_id_old := X_transaction_temp_id;
541              END IF;
542 
543              -- Determine the serial number prefix
544              X_Serial_Prefix := rtrim(X_fm_serial_number, '0123456789');
545              -- Determine the base numeric portion
549              -- Determine length of numeric portion
546              X_Serial_Numeric := to_number(substr(X_fm_serial_number,
547 				nvl(length(X_Serial_Prefix),0) + 1));
548 
550              X_Serial_Numeric_Len := length(substr(X_fm_serial_number,
551 				nvl(length(X_Serial_Prefix),0) + 1));
552 
553              -- Generate serial numbers to be inserted
554              -- Get the first serial number
555              X_Serial_Current := X_fm_serial_number;
556              X_Serial_Numeric := X_Serial_Numeric - 1;
557 	     -- Update first picking line detail
558              X_loop_end := to_number(X_serial_qty);
559              IF (X_can_update = 1) THEN
560 	        Update_Details(X_trx_source_line_id,
561 			 1,
562 			 1,
563 			 X_Serial_Current);
564                 X_loop_end := to_number(X_serial_qty) - 1;
565                 X_can_update := 0;
566                 X_Serial_Numeric := X_Serial_Numeric + 1;
567              END IF;
568  	     -- Insert the rest of the line details
569 	     FOR I IN 1..X_loop_end LOOP
570 	          -- Determine next serial number
571                   X_Serial_Current := Next_Serial(X_Serial_Prefix,
572 				 	  X_Serial_Numeric_Len,
573 					  X_Serial_Numeric);
574                   X_Serial_Numeric := X_Serial_Numeric + 1;
575 
576                   Insert_Details(NULL,
577 		         X_trx_source_line_id,
578 			 1,
579 			 1,
580 			 X_Serial_Current,
581 			 'NEW');
582 
583 	     END LOOP;
584           END IF;
585         END LOOP;
586         CLOSE get_picking_line_detail;
587 
588   EXCEPTION
589     WHEN OTHERS THEN
590 	FND_MESSAGE.Set_Name('OE','OE_QUERY_ERROR');
591 	FND_MESSAGE.Set_Token('PACKAGE','WSH_SC_PDB_PKG.Explode_lines');
592 	FND_MESSAGE.Set_Token('ORA_ERROR',to_char(sqlcode));
593 	APP_EXCEPTION.Raise_Exception;
594 
595   END Explode_Lines;
596 
597   --
598   -- Name
599   --   Next_Serial
600   -- Purpose
601   --   Takes a serial prefix, the length of the numeric portion of a serial
602   --   number and the current value of the numeric portion and returns the
603   --   next serial number.
604   -- Arguments
605   --   s_prefix is the serial number prefix
606   --   s_num_length is the size of the numeric portion of the serial number
607   --   s_num_current is the current vlaue of the numeric portion
608   --
609   -- Notes
610   --    Uses the following algorithm:
611   -- 	X_Serial_Current := X_Serial_Prefix || lpad('000000000000000000000000000000',
612   --						    X_Serial_Numeric_Len -
613   --						    length(to_char(X_Serial_Numeric + I))) ||
614   --					       to_char(X_Serial_Numeric + I)
615   --
616   --
617 
618 
619   FUNCTION Next_Serial (s_prefix      IN  VARCHAR2,
620 			s_num_length  IN  NUMBER,
621 			s_num_current IN  NUMBER
622                        )
623   RETURN VARCHAR2 IS
624        X_new_serial	VARCHAR2(30);
625   BEGIN
626      select s_prefix || lpad('000000000000000000000000000000',
627 			     s_num_length - length(to_char(s_num_current + 1)))
628                      || to_char(s_num_current + 1)
629      into X_new_serial
630      from dual;
631 
632      return(X_new_serial);
633 
634   END Next_Serial;
635 
636   --
637   -- Name
638   -- 	Delete_From_Msnt
639   -- Purpose
640   --   To Delete the temporary records created in MSNT by the Serial Number Entry Form
641   --
642   -- Arguments
643   -- 		X_Delivery_Id		IN	NUMBER
644   --
645   -- Notes
646   --
647 
648 PROCEDURE Delete_From_Msnt(X_Delivery_Id	NUMBER ) IS
649 
650 BEGIN
651 
652   DELETE FROM mtl_serial_numbers_temp
653   WHERE transaction_temp_id in
654   (SELECT transaction_temp_id
655    FROM   so_picking_line_details
656    WHERE  delivery_id = X_Delivery_Id );
657 
658   EXCEPTION
659     WHEN NO_DATA_FOUND THEN
660 	RETURN;
661     WHEN OTHERS THEN
662 	FND_MESSAGE.Set_Name('OE','OE_QUERY_ERROR');
663 	FND_MESSAGE.Set_Token('PACKAGE','WSH_SC_PLD_PKG.Delete_From_Msnt');
664 	FND_MESSAGE.Set_Token('ORA_ERROR',to_char(sqlcode));
665 	FND_MESSAGE.Set_Token('ORA_TEXT',SQLERRM);
666 	APP_EXCEPTION.Raise_Exception;
667 END;
668 END WSH_SC_PLD_PKG;