DBA Data[Home] [Help]

PACKAGE BODY: APPS.WMS_SHIPPING_INTERFACE_GRP

Source


1 PACKAGE BODY WMS_SHIPPING_INTERFACE_GRP AS
2 /* $Header: WMSGINTB.pls 120.9.12020000.2 2012/09/20 15:55:59 abasheer ship $ */
3 
4 g_pkg_name                  CONSTANT VARCHAR2(30)  := 'WMS_SHIPPING_INTERFACE_GRP';
5 g_pkg_version               CONSTANT VARCHAR2(100) := '$Header: WMSGINTB.pls 120.9.12020000.2 2012/09/20 15:55:59 abasheer ship $';
6 g_debug_on                  CONSTANT NUMBER        := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
7 g_ret_status_success        CONSTANT VARCHAR2(1)   := fnd_api.g_ret_sts_success;
8 g_ret_status_error          CONSTANT VARCHAR2(1)   := fnd_api.g_ret_sts_error;
9 g_ret_status_unexp_error    CONSTANT VARCHAR2(1)   := fnd_api.g_ret_sts_unexp_error;
10 
11 G_WMS_RELEASE_LEVEL         CONSTANT NUMBER := WMS_CONTROL.GET_CURRENT_RELEASE_LEVEL;
12 G_J_RELEASE_LEVEL           CONSTANT NUMBER := INV_RELEASE.G_J_RELEASE_LEVEL;
13 
14 g_exc_unexpected_error      EXCEPTION ;
15 
16 
17 
18 PROCEDURE print_debug(p_message in VARCHAR2) IS
19 BEGIN
20 --   dbms_output.put_line(p_message);
21    IF g_debug_on = 1 then
22       inv_log_util.trace(p_message, g_pkg_name,9);
23    END IF;
24 EXCEPTION
25    WHEN OTHERS  THEN
26       print_debug('Proc: print_debug .. UNEXPECTED Exception : '|| sqlerrm );
27 END;
28 
29 
30 FUNCTION get_lpn_context
31           (p_lpn_id                 IN            NUMBER,
32            x_outermost_lpn_id       OUT   NOCOPY  NUMBER,
33            x_license_plate_number   OUT   NOCOPY  VARCHAR2,
34            x_return_status          OUT   NOCOPY  VARCHAR2)
35 RETURN  NUMBER
36 IS
37 l_procname             CONSTANT VARCHAR2(100) := 'get_lpn_context- ';
38 l_lpn_context          NUMBER := NULL;
39 l_outermost_lpn_id     NUMBER := NULL;
40 l_license_plate_number VARCHAR2(30);
41 BEGIN
42 
43    IF g_debug_on = 1 THEN
44       print_debug (l_procname || 'p_lpn_id: ' || p_lpn_id  );
45    END IF;
46 
47    SELECT  lpn_context ,
48            outermost_lpn_id,
49            license_plate_number
50    INTO    l_lpn_context ,
51            x_outermost_lpn_id,
52            x_license_plate_number
53    FROM    wms_license_plate_numbers
54    WHERE   lpn_id = p_lpn_id;
55 
56    x_return_status := g_ret_status_success;
57 
58    IF g_debug_on = 1 THEN
59       print_debug (l_procname || 'x_lpn_context:' || l_lpn_context ||': OuterMostLPN:' || x_outermost_lpn_id || ':  LPN:' || x_license_plate_number);
60    END IF;
61    RETURN l_lpn_context;
62 
63 EXCEPTION
64    WHEN OTHERS  THEN
65       x_return_status := g_ret_status_unexp_error ;
66       IF g_debug_on = 1 THEN
67          print_debug(l_procname || 'Exception OTHERS : '  ||sqlerrm );
68       END IF;
69       RETURN NULL;
70 
71 END get_lpn_context;
72 
73 
74 PROCEDURE proc_action_unassign_delivery
75            (p_delivery_detail_tbl  IN OUT  NOCOPY  wms_shipping_interface_grp.g_delivery_detail_tbl,
76             x_return_status        OUT     NOCOPY  VARCHAR2)
77 IS
78 l_procname             CONSTANT VARCHAR2(100) := 'proc_action_unassign_delivery- ';
79 l_lpn_context          NUMBER := NULL;
80 l_outermost_lpn_id     NUMBER := NULL;
81 l_license_plate_number VARCHAR2(30);
82 BEGIN
83    FOR i IN 1..p_delivery_detail_tbl.COUNT
84    LOOP
85       l_lpn_context := NULL;
86       l_lpn_context := get_lpn_context (p_lpn_id               =>  p_delivery_detail_tbl(i).lpn_id ,
87                                         x_outermost_lpn_id     =>  l_outermost_lpn_id,
88                                         x_license_plate_number => l_license_plate_number,
89                                         x_return_status        =>  x_return_status);
90       IF x_return_status <> g_ret_status_success THEN
91          p_delivery_detail_tbl(i).return_status := 'E';
92          p_delivery_detail_tbl(i).r_message_appl := 'WMS';
93          p_delivery_detail_tbl(i).r_message_code := 'WMS_ERROR_LPN_CONTEXT' ;
94          p_delivery_detail_tbl(i).r_message_token := l_license_plate_number ;
95          p_delivery_detail_tbl(i).r_message_type := 'E';
96          p_delivery_detail_tbl(i).r_message_text := '';
97          -- Error selecting LPN Context
98       ELSE
99          IF l_lpn_context =  9  THEN
100             p_delivery_detail_tbl(i).return_status   := 'E';
101             p_delivery_detail_tbl(i).r_message_appl  := 'WMS';
102             p_delivery_detail_tbl(i).r_message_code  := 'WMS_LPN_LOADED_TO_DOCK' ;
103             p_delivery_detail_tbl(i).r_message_token := l_license_plate_number ;
104             p_delivery_detail_tbl(i).r_message_type  := 'E';
105             p_delivery_detail_tbl(i).r_message_text  := '';
106             -- Already loaded to Dock.. Cannot unassign delivery;
107          ELSIF (l_lpn_context = 11) AND (l_outermost_lpn_id <> p_delivery_detail_tbl(i).lpn_id ) THEN
108                   p_delivery_detail_tbl(i).return_status   := 'E';
109 		  p_delivery_detail_tbl(i).r_message_appl  := 'WMS';
110 		  p_delivery_detail_tbl(i).r_message_code  := 'WMS_STAGED_LPN_IS_NESTED' ;
111 		  p_delivery_detail_tbl(i).r_message_token := l_license_plate_number ;
112 		  p_delivery_detail_tbl(i).r_message_type  := 'E';
113                   p_delivery_detail_tbl(i).r_message_text  := '';
114          ELSE
115             p_delivery_detail_tbl(i).return_status := 'S';
116          END IF;
117       END IF;
118       IF g_debug_on = 1 THEN
119          print_debug (l_procname || 'Table Index: ' || i );
120          print_debug (l_procname || 'p_lpn_id: ' || p_delivery_detail_tbl(i).lpn_id  );
121          print_debug (l_procname || 'return_status:' || p_delivery_detail_tbl(i).return_status);
122          print_debug (l_procname || 'return_message_text:' || p_delivery_detail_tbl(i).r_message_text);
123       END IF;
124    END LOOP;
125 EXCEPTION
126    WHEN OTHERS  THEN
127       x_return_status := g_ret_status_unexp_error ;
128       IF g_debug_on = 1 THEN
129          print_debug(l_procname || 'Exception OTHERS : '  ||sqlerrm );
130       END IF;
131 
132 END proc_action_unassign_delivery;
133 
134 PROCEDURE Proc_unassign_released_lines
135            (p_delivery_detail_tbl  IN OUT  NOCOPY  wms_shipping_interface_grp.g_delivery_detail_tbl,
136             x_return_status        OUT     NOCOPY  VARCHAR2)
137 IS
138 l_procname             CONSTANT VARCHAR2(100) := 'Proc_unassign_for_released_lines- ';
139 
140 l_exists NUMBER:=0;
141 l_cd_exists NUMBER:=0;
142 
143 BEGIN
144    x_return_status := g_ret_status_success;
145 
146    IF g_debug_on = 1 THEN print_debug('starting to copy the PL/SQL records to the temp table'); end if;
147    delete wms_wsh_wdd_gtemp;
148 
149    FOR i IN 1..p_delivery_detail_tbl.COUNT
150    LOOP
151       if p_delivery_detail_tbl(i).move_order_line_id is null then
152          IF g_debug_on = 1 THEN
153          	print_debug (l_procname || 'move order line id is not passed from shipping for delivery detail id '
154          	||p_delivery_detail_tbl(i).delivery_detail_id);
155          END IF;
156          RAISE g_exc_unexpected_error;
157       END IF;
158       insert into wms_wsh_wdd_gtemp
159       (delivery_detail_id,move_order_line_id)
163    END LOOP;
160        values
161        ( p_delivery_detail_tbl(i).delivery_detail_id,p_delivery_detail_tbl(i).move_order_line_id);
162 
164 
165    -- Adding the following check for Planned Crossdocking project in R12. Maneesh
166    IF (g_debug_on =1 ) THEN
167       print_debug('Checking to see if there is a crossdock task');
168    END IF;
169 
170    BEGIN
171       SELECT 1
172 	INTO l_cd_exists
173 	FROM dual
174 	WHERE exists (
175 		      SELECT mtrl.line_id
176 		      FROM mtl_txn_request_lines mtrl
177 		      , mtl_material_transactions_temp mmtt
178 		      , wms_wsh_wdd_gtemp wwwg
179 		      , mtl_txn_request_headers mtrh
180 		      WHERE mmtt.move_order_line_id =
181 		      wwwg.move_order_line_id
182 		      AND mtrl.line_id = mmtt.move_order_line_id
183 		      AND mtrl.header_id = mtrh.header_id
184 		      AND mtrh.move_order_type = 6
185 		      AND mtrl.backorder_delivery_detail_id IS NOT NULL
186 		      AND mtrl.line_status = 7);
187 
188 	x_return_status := 'E';
189    EXCEPTION
190       WHEN OTHERS THEN
191 	 print_debug('No Crossdock Tasks!');
192    END;
193 
194    IF g_debug_on = 1 THEN
195       print_debug('Return Status after Crossdock Check:'||x_return_status);
196    END IF;
197 
198    IF x_return_status = g_ret_status_success THEN
199 
200       IF g_debug_on = 1 THEN
201 	 print_debug('starting query');
202 	 print_debug('checking the transfer lpn first');
203       END IF;
204 
205       BEGIN
206 	 select 1
207 	   into l_exists
208 	   from dual
209 	   where exists(
210 			select move_order_line_id
211 			from mtl_material_transactions_temp mmtt
212 			where   -- first case, line is loaded into same lpn or has the same carton
213 			mmtt.transfer_lpn_id is not null and     -- the line is loaded
214 			mmtt.transfer_lpn_id in -- loaded into a LPN which is included in the inputted lines
215 			(Select nvl(transfer_lpn_id,cartonization_id)
216 			 From mtl_material_transactions_temp mmtt1,WMS_WSH_WDD_GTEMP wwwg
217 			 Where mmtt1.move_order_line_id = wwwg.move_order_line_id
218 			 and nvl(mmtt1.transfer_lpn_id,mmtt1.cartonization_id) is not null)
219 			and not exists( select 1
220 					from WMS_WSH_WDD_GTEMP www
221 					where www.move_order_line_id = mmtt.move_order_line_id)
222 			and mmtt.parent_line_id is null  -- excluding the bulk tasks
223 			and mmtt.move_order_line_id is not null
224 			);
225 
226 			IF g_debug_on = 1 THEN
227 			   print_debug('complete querying on transfer lpn');
228 			   print_debug (l_procname || 'Packing violations exist on transfer lpn!');
229 			END IF;
230 
231 			x_return_status := 'E';
232       EXCEPTION
233 	 WHEN NO_DATA_FOUND THEN
234 	    IF g_debug_on = 1 THEN
235 	       print_debug(l_procname || 'No packing violation for transfer lpns');
236 	       print_debug(l_procname || 'Checking the cartonization id...');
237 	    END IF;
238             BEGIN
239 	       select 1
240 		 into l_exists
241 		 from dual
242 		 where exists(
243 			      select move_order_line_id
244 			      from mtl_material_transactions_temp mmtt
245 			      where  mmtt.transfer_lpn_id is null
246 			      and mmtt.cartonization_id in
247 			      (Select nvl(transfer_lpn_id,cartonization_id)
248 	                       From mtl_material_transactions_temp mmtt1,WMS_WSH_WDD_GTEMP wwwg
249 			       Where mmtt1.move_order_line_id = wwwg.move_order_line_id
250 			       and nvl(mmtt1.transfer_lpn_id,mmtt1.cartonization_id) is not null)
251 			      and not exists( select 1
252 					      from WMS_WSH_WDD_GTEMP www
253 					      where www.move_order_line_id = mmtt.move_order_line_id)
254 			      and mmtt.parent_line_id is null  -- excluding the bulk tasks
255 			      and mmtt.move_order_line_id is not null
256 			      );
257 
258 			      IF g_debug_on = 1 THEN
259 				 print_debug('complete querying on cartonization_id');
260 				 print_debug (l_procname || 'Packing violations exist on cartonization id!');
261 			      END IF;
262 
263 			      x_return_status := 'E';
264 	    EXCEPTION
265 	       WHEN NO_DATA_FOUND THEN
266 		  IF g_debug_on = 1 THEN
267 		     print_debug(l_procname || 'No packing violation');
268 		  END IF;
269 	       WHEN OTHERS  THEN
270 		  x_return_status := g_ret_status_unexp_error ;
271 		  IF g_debug_on = 1 THEN
272 		     print_debug(l_procname || 'Exception OTHERS : '  ||sqlerrm );
273 		  END IF;
274 	    END;
275 	 WHEN OTHERS  THEN
276 	    x_return_status := g_ret_status_unexp_error ;
277 	    IF g_debug_on = 1 THEN
278 	       print_debug(l_procname || 'Exception OTHERS : '  ||sqlerrm );
279 	    END IF;
280       END;
281    END IF; --IF x_return_status = g_ret_status_success THEN
282 END Proc_unassign_released_lines;
283 
284 PROCEDURE process_delivery_details (
285        p_api_version                IN                 NUMBER,
286        p_init_msg_list              IN                 VARCHAR2 := wms_shipping_interface_grp.g_false,
287        p_commit                     IN                 VARCHAR2 := wms_shipping_interface_grp.g_false,
288        p_validation_level           IN                 NUMBER   := wms_shipping_interface_grp.g_full_validation,
289        p_action                     IN                 VARCHAR2,
290        p_delivery_detail_tbl        IN OUT NOCOPY      wms_shipping_interface_grp.g_delivery_detail_tbl,
291        x_return_status              OUT    NOCOPY      VARCHAR2,
292        x_msg_count                  OUT    NOCOPY      NUMBER,
293        x_msg_data                   OUT    NOCOPY      VARCHAR2)
294 IS
295 l_procname             CONSTANT VARCHAR2(100) := 'process_delivery_details- ';
296 l_api_version          CONSTANT NUMBER := 1.0;
297 l_progress             VARCHAR2(10) := '0';
298 
299 l_shipping_attr      WSH_INTERFACE_EXT_GRP.delivery_details_Attr_tbl_Type;
300 l_shipping_in_rec    WSH_INTERFACE_EXT_GRP.detailInRecType;
301 l_shipping_out_rec   WSH_INTERFACE_EXT_GRP.detailOutRecType;
302 l_attr_counter       NUMBER := 1;
303 
304 x_msg_details		     VARCHAR2(3000);
305 l_pricing_ind        VARCHAR2(30);
306 l_tolerance          NUMBER;
307 l_source_type_id     NUMBER;
308 BEGIN
309    IF NOT FND_API.compatible_api_call(l_api_version,
310                                       p_api_version,
311                                       l_procname,
312                                       G_PKG_NAME) THEN
313       RAISE g_exc_unexpected_error;
314    END IF;
315 
316 
317    IF fnd_api.to_boolean(p_init_msg_list) THEN
318          fnd_msg_pub.initialize;
319    END IF;
320 
321    x_return_status  := fnd_api.g_ret_sts_success;
322 
323    print_debug(l_procname || ' Entered ' || g_pkg_version);
324    print_debug('action='||p_action||' deltblcnt='||p_delivery_detail_tbl.COUNT|| ' relvl='||G_WMS_RELEASE_LEVEL);
325 
326    IF  p_action = wms_shipping_interface_grp.g_action_unassign_delivery
327    THEN
328        IF p_delivery_detail_tbl(1).released_Status = 'X' and p_delivery_detail_tbl(1).container_flag = 'Y'  THEN -- for staged LPNs
329           IF g_debug_on = 1 THEN
330          	print_debug (l_procname || 'calling API to handle the staged LPN.');
331           END IF;
332           Proc_action_unassign_delivery
333            (p_delivery_detail_tbl  =>  p_delivery_detail_tbl,
334             x_return_status        =>  x_return_status);
335            IF x_return_status <> g_ret_status_success THEN
336                RAISE g_exc_unexpected_error;
337            END IF;
338        ELSIF p_delivery_detail_tbl(1).released_status = 'S' THEN
339            IF g_debug_on = 1 THEN
340 	            	print_debug (l_procname || 'calling API to handle the released lines.');
341            END IF;
342            Proc_unassign_released_lines
343 	              (p_delivery_detail_tbl  =>  p_delivery_detail_tbl,
344 	               x_return_status        =>  x_return_status);
345 	   IF g_debug_on = 1 THEN
346 	   	print_debug (l_procname || 'proc_unassign_released_lines returns:'||x_return_status);
347            END IF;
348 	   IF x_return_status <> g_ret_status_success THEN
349 	       p_delivery_detail_tbl(1).return_status   := 'E';
350 	       p_delivery_detail_tbl(1).r_message_appl  := 'WMS';
351 	       p_delivery_detail_tbl(1).r_message_code  := 'WMS_PACKING_VIOLATION';
352 	       p_delivery_detail_tbl(1).r_message_type  := 'E';
353 	       p_delivery_detail_tbl(1).r_message_text  := '';
354 
355 	       fnd_message.set_name('WMS', 'WMS_PACKING_VIOLATION');
356 	       fnd_msg_pub.add;
357            END IF;
358        ELSE
359            IF g_debug_on = 1 THEN
360          	print_debug (l_procname || 'released_status is not correct:'||p_delivery_detail_tbl(1).released_status);
361            END IF;
362            RAISE g_exc_unexpected_error;
363        END IF;
364    ELSIF ( p_action = WMS_SHIPPING_INTERFACE_GRP.G_ACTION_VALIDATE_SEC_QTY AND
365            G_WMS_RELEASE_LEVEL >= G_J_RELEASE_LEVEL ) THEN
366      l_progress := '000';
367      FOR i IN 1..p_delivery_detail_tbl.COUNT LOOP
368        -- Only check for catch weights if Delivery Detail is for a Sales Order
369        IF ( p_delivery_detail_tbl(i).line_direction = 'O' ) THEN
370          IF ( p_delivery_detail_tbl(i).picked_quantity2 IS NOT NULL AND
371               p_delivery_detail_tbl(i).requested_quantity_uom2 IS NOT NULL ) THEN
372 
373            l_tolerance := WMS_CATCH_WEIGHT_PVT.Check_Secondary_Qty_Tolerance (
374                             p_api_version        => 1.0
375                           , x_return_status      => x_return_status
376                           , x_msg_count          => x_msg_count
377                           , x_msg_data           => x_msg_data
378                           , p_organization_id    => p_delivery_detail_tbl(i).organization_id
379                           , p_inventory_item_id  => p_delivery_detail_tbl(i).inventory_item_id
380                           , p_quantity           => p_delivery_detail_tbl(i).picked_quantity
381                           , p_uom_code           => p_delivery_detail_tbl(i).requested_quantity_uom
382                           , p_secondary_quantity => p_delivery_detail_tbl(i).picked_quantity2 );
383 
384            IF ( x_return_status <> fnd_api.g_ret_sts_success ) THEN
385 	      print_debug('Check_Secondary_Qty_Tolerance failed');
386 
387 	      fnd_message.set_name('WMS','WMS_CATCH_WT_API_ERR' );
388 	      fnd_msg_pub.add;
389 	      raise fnd_api.g_exc_unexpected_error;
390            END IF;
391 
392            IF ( l_tolerance <> 0 ) THEN
393              p_delivery_detail_tbl(i).return_status   := 'E';
394              p_delivery_detail_tbl(i).r_message_appl  := 'WMS';
395              p_delivery_detail_tbl(i).r_message_code  := 'WMS_CTWT_TOLERANCE_ERROR';
396              p_delivery_detail_tbl(i).r_message_type  := 'E';
397              p_delivery_detail_tbl(i).r_message_text  := '';
398            END IF;
399          ELSE -- need to try and defualt secondary quantities.
400            l_pricing_ind := NULL;
401 
402            WMS_CATCH_WEIGHT_PVT.Get_Default_Secondary_Quantity (
403              p_api_version            => 1.0
404            , x_return_status          => x_return_status
405            , x_msg_count              => x_msg_count
406            , x_msg_data               => x_msg_data
407            , p_organization_id        => p_delivery_detail_tbl(i).organization_id
408            , p_inventory_item_id      => p_delivery_detail_tbl(i).inventory_item_id
409            , p_quantity               => p_delivery_detail_tbl(i).picked_quantity
410            , p_uom_code               => p_delivery_detail_tbl(i).requested_quantity_uom
411            , x_ont_pricing_qty_source => l_pricing_ind
412            , x_secondary_uom_code     => p_delivery_detail_tbl(i).requested_quantity_uom2
413            , x_secondary_quantity     => p_delivery_detail_tbl(i).picked_quantity2 );
414 
415            IF ( x_return_status <> fnd_api.g_ret_sts_success ) THEN
416 	      print_debug('Get_Default_Secondary_Quantity failed priceind='||l_pricing_ind||' msg='|| x_msg_data||' cnt='||x_msg_count);
417 
418              IF ( l_pricing_ind = WMS_CATCH_WEIGHT_PVT.G_PRICE_SECONDARY ) THEN
419                p_delivery_detail_tbl(i).return_status  := 'E';
420                p_delivery_detail_tbl(i).r_message_appl := 'WMS';
421                p_delivery_detail_tbl(i).r_message_type := 'E';
422                p_delivery_detail_tbl(i).r_message_text := '';
423 
424                IF ( x_msg_count <= 1 ) THEN
425                  p_delivery_detail_tbl(i).r_message_code := x_msg_data;
426                ELSE
427                  p_delivery_detail_tbl(i).r_message_code := fnd_msg_pub.get(1,'F');
428                END IF;
429                -- do not need to fail batch reset to success
430                x_return_status := fnd_api.g_ret_sts_success;
431              ELSE -- General failure fail batch
432                fnd_message.set_name('WMS','WMS_CATCH_WT_API_ERR');
433                fnd_msg_pub.add;
434                raise fnd_api.g_exc_unexpected_error;
435              END IF;
436            ELSIF ( l_pricing_ind = WMS_CATCH_WEIGHT_PVT.G_PRICE_SECONDARY ) THEN
437              IF ( p_delivery_detail_tbl(i).picked_quantity2 IS NULL OR
438                   p_delivery_detail_tbl(i).requested_quantity_uom2 IS NULL ) THEN
439                -- Item is catch weight enabled, but could not default
440                p_delivery_detail_tbl(i).return_status  := 'E';
441                p_delivery_detail_tbl(i).r_message_appl := 'WMS';
442                p_delivery_detail_tbl(i).r_message_code := 'WMS_CTWT_DEFAULT_ERROR';
443                p_delivery_detail_tbl(i).r_message_type := 'E';
444                p_delivery_detail_tbl(i).r_message_text := '';
445              ELSE
446                -- Got defaults, call shipping api to update picked_quantity2 with weights
447                -- If everything checks out, update wdd.picked_quantity2 with catch weight.
448                l_shipping_attr(l_attr_counter).delivery_detail_id := p_delivery_detail_tbl(i).delivery_detail_id;
449                l_shipping_attr(l_attr_counter).picked_quantity2   := p_delivery_detail_tbl(i).picked_quantity2;
450                l_shipping_attr(l_attr_counter).requested_quantity_uom2 := p_delivery_detail_tbl(i).requested_quantity_uom2;
451                l_attr_counter := l_attr_counter + 1;
452              END IF;
453            END IF;
454          END IF;
455        END IF;
456      END LOOP;
457 
458      l_progress := '700';
459      IF ( l_shipping_attr.COUNT > 0 ) THEN
460        l_shipping_in_rec.caller := 'WMS';
461        l_shipping_in_rec.action_code := 'UPDATE';
462 
463        print_debug('Calling Create_Update_Delivery_Detail deldet count='||l_shipping_attr.COUNT );
464 
465        WSH_INTERFACE_EXT_GRP.Create_Update_Delivery_Detail (
466          p_api_version_number => 1.0
467        , p_init_msg_list      => fnd_api.g_false
468        , p_commit             => fnd_api.g_false
469        , x_return_status      => x_return_status
470        , x_msg_count          => x_msg_count
471        , x_msg_data           => x_msg_data
472        , p_detail_info_tab    => l_shipping_attr
473        , p_IN_rec             => l_shipping_in_rec
474        , x_OUT_rec            => l_shipping_out_rec );
475 
476        IF ( x_return_status <> fnd_api.g_ret_sts_success ) THEN
477          wsh_util_core.get_messages('Y', x_msg_data, x_msg_details, x_msg_count);
478 
479          if x_msg_count > 1 then
480            x_msg_data := x_msg_data || x_msg_details;
481          else
482            x_msg_data := x_msg_data;
483          end if;
484 
485 	 print_debug('Error calling Create_Update_Delivery_Detail');
486 	 print_debug('Error Msg: ' || x_msg_data);
487          FND_MESSAGE.SET_NAME('WMS','WMS_UPD_DELIVERY_ERROR' );
488          FND_MESSAGE.SET_TOKEN('MSG1', x_msg_data);
489          FND_MSG_PUB.ADD;
490          raise fnd_api.g_exc_unexpected_error;
491        END IF;
492      END IF;
493    END IF;
494 
495    fnd_msg_pub.count_and_get
496         ( p_encoded     => wms_shipping_interface_grp.g_false,
497           p_count       => x_msg_count,
498           p_data        => x_msg_data
499           );
500 
501    IF (g_debug_on = 1) THEN
502       print_debug ('get message stack, count='||x_msg_count);
503    END IF;
504    IF x_msg_count = 0 THEN
505       x_msg_data := '';
506     ELSIF x_msg_count =1 THEN
507       null;
508     ELSE
509       x_msg_data := fnd_msg_pub.get(x_msg_count,wms_shipping_interface_grp.g_false);
510    END IF;
511 
512 
513 EXCEPTION
514    WHEN OTHERS THEN
515         x_return_status := g_ret_status_unexp_error;
516         fnd_message.set_name('WMS', 'ERR_PROC_UNASSIGN_DEL');
517         fnd_msg_pub.add;
518 
519       fnd_msg_pub.count_and_get
520         ( p_encoded     => wms_shipping_interface_grp.g_false,
521           p_count       => x_msg_count,
522           p_data        => x_msg_data
523           );
524 
525       IF g_debug_on = 1 THEN
526          print_debug(l_procname||' progress= '||l_progress||' Exception OTHERS : '||sqlerrm );
527       END IF;
528 
529 END process_delivery_details;
530 
531 
532 --This procedure is called by Shipping whenever there is
533 --trip-delivery assignment or unassignment. Places where this procedure can be invoked:
534 --1. Shipping's ship confirm API
535 --2. Direct Ship (Right before calling Shipping's ship confirm API)
536 --3. Desktop
537 --This procedure should only return error in case 3.
538 PROCEDURE process_delivery_trip
539   (p_api_version       IN            NUMBER
540    ,p_init_msg_list    IN            VARCHAR2 := wms_shipping_interface_grp.g_false
541    ,p_commit           IN            VARCHAR2 := wms_shipping_interface_grp.g_false
542    ,p_validation_level IN            NUMBER   := wms_shipping_interface_grp.g_full_validation
543    ,p_action           IN            VARCHAR2
544    ,p_dlvy_trip_tbl    IN OUT nocopy wms_shipping_interface_grp.g_dlvy_trip_tbl
545    ,x_return_status    OUT    nocopy VARCHAR2
546    ,x_msg_count        OUT    nocopy NUMBER
547    ,x_msg_data         OUT    nocopy VARCHAR2) IS
548 
549       l_api_version CONSTANT NUMBER := 1.0;
550       l_procname    CONSTANT VARCHAR2(100) := 'process_delivery_trip - ';
551       l_trip_id     NUMBER;
552 BEGIN
553    x_return_status := g_ret_status_success;
554    x_msg_count := 0;
555    x_msg_data := '';
556 
557    --Trip-delivery association happening in case 2 mentioned above
558    --Thus, do nothing
559    IF wms_globals.g_ship_confirm_method = 'DIRECT' THEN
560       RETURN;
561    END IF;
562 
563    IF NOT fnd_api.compatible_api_call(l_api_version
564 				      ,p_api_version
565 				      ,l_procname
566 				      ,g_pkg_name) THEN
567       IF g_debug_on = 1 THEN
568          print_debug (l_procname || 'Incompatible API call' );
569       END IF;
570       RAISE g_exc_unexpected_error;
571    END IF;
572 
573    IF p_action NOT IN (wms_shipping_interface_grp.g_action_assign_dlvy_trip,
574                        wms_shipping_interface_grp.g_action_unassign_dlvy_trip) THEN
575       IF g_debug_on = 1 THEN
576 	 print_debug(l_procname || 'Invalid action passed in');
577       END IF;
578       RAISE g_exc_unexpected_error;
579    END IF;
580 
581    IF fnd_api.to_boolean(p_init_msg_list) THEN
582       fnd_msg_pub.initialize;
583    END IF;
584 
585    IF g_debug_on = 1 THEN
586       print_debug(l_procname || 'start to process_delivery_trip');
587       print_debug(l_procname || 'Num records passed in: ' || p_dlvy_trip_tbl.COUNT);
588    END IF;
589 
590    --no org_id because delivery_id is the primary key
591    FOR i IN 1..p_dlvy_trip_tbl.COUNT LOOP
592       IF g_debug_on = 1 THEN
593 	 print_debug(l_procname || 'At record: ' || i);
594 	 print_debug(l_procname || 'delivery id: '|| p_dlvy_trip_tbl(i).delivery_id);
595 	 print_debug(l_procname || 'trip id: ' || p_dlvy_trip_tbl(i).trip_id);
596       END IF;
597 
598       IF p_dlvy_trip_tbl(i).delivery_id IS NOT NULL
599 	AND p_dlvy_trip_tbl(i).trip_id IS NOT NULL THEN
600 
601       BEGIN
602 
603 	 --Shipping ship confirm API calls our
604 	 --WMS_SHIPPING_PUB.DEL_WSTT_RECS_BY_DELIVERY_ID before reaching this API.
605 	 --Therefore, entries will have been deleted from the temp table, and this
606 	 --procedure will not fail.
607          -- MRANA : 4576909: The above is not true anymore.. we are now going to
608          -- update WSTT with the new Trip id or null depending on the action code.
609 	 SELECT DISTINCT trip_id
610 	   INTO l_trip_id
611 	   FROM wms_shipping_transaction_temp
612 	   WHERE delivery_id = p_dlvy_trip_tbl(i).delivery_id;
613 
614          IF g_debug_on = 1 THEN
615 	    print_debug(l_procname || ': wstt.l_trip_id:  '|| l_trip_id);
616          END IF;
617 	 --get to here means the delivery is loaded to dock
618 	 IF p_action = wms_shipping_interface_grp.g_action_assign_dlvy_trip THEN
619 	    IF l_trip_id = p_dlvy_trip_tbl(i).trip_id THEN
620                 IF g_debug_on = 1 THEN
621 	           print_debug(l_procname || ': wstt.l_trip_id:  is same as the trip passed in ');
622                 END IF;
623 	       --assigning to same trip again
624 	       p_dlvy_trip_tbl(i).return_status := 'S';
625 	     ELSE
626 	      /* NCR Bug : 4576909 :  Instead of returning error, update WSTT
627  *             p_dlvy_trip_tbl(i).return_status := 'E';
628 	       p_dlvy_trip_tbl(i).r_message_appl := 'WMS';
629 	       p_dlvy_trip_tbl(i).r_message_code := 'WMS_DLVY_LOADED_TO_DOCK';
630 	       p_dlvy_trip_tbl(i).r_message_token := p_dlvy_trip_tbl(i).delivery_id;
631 	       p_dlvy_trip_tbl(i).r_message_token_name := 'DELIVERY_ID';
632 	       p_dlvy_trip_tbl(i).r_message_type := 'E';
633 
634 	       FND_MESSAGE.SET_NAME('WMS','WMS_DLVY_LOADED_TO_DOCK' );
635 	       FND_MESSAGE.SET_TOKEN('DELIVERY_ID', p_dlvy_trip_tbl(i).delivery_id);
636 
637 	       p_dlvy_trip_tbl(i).r_message_text := fnd_message.get; */
638 
639                BEGIN
640                   UPDATE wms_shipping_transaction_temp
641                   SET    trip_id =  p_dlvy_trip_tbl(i).trip_id
642                   WHERE  delivery_id = p_dlvy_trip_tbl(i).delivery_id;
643                   IF g_debug_on = 1 THEN
644 	             print_debug(l_procname || ': wstt.l_trip_id:  updated ' );
645                   END IF;
646 	       p_dlvy_trip_tbl(i).return_status := 'S';
647                EXCEPTION
648                   WHEN OTHERS THEN
649                      x_return_status := g_ret_status_unexp_error;
650                      IF g_debug_on = 1 THEN
651 	                print_debug(l_procname || ': wstt could not be updated: '  || SQLCODE ||':' || SQLERRM);
652                      END IF;
653                END ;
654 	    END IF;
655 	  ELSIF p_action = wms_shipping_interface_grp.g_action_unassign_dlvy_trip THEN
656 	    --need a different error message?
657 	    /* NCR Bug : 4576909 :  Instead of returning error, update WSTT
658 	    p_dlvy_trip_tbl(i).return_status := 'E';
659 	    p_dlvy_trip_tbl(i).r_message_appl := 'WMS';
660 	    p_dlvy_trip_tbl(i).r_message_code := 'WMS_DLVY_LOADED_TO_DOCK';
661 	    p_dlvy_trip_tbl(i).r_message_token := p_dlvy_trip_tbl(i).delivery_id;
662 	    p_dlvy_trip_tbl(i).r_message_token_name := 'DELIVERY_ID';
663 	    p_dlvy_trip_tbl(i).r_message_type := 'E';
664 
665 	    FND_MESSAGE.SET_NAME('WMS','WMS_DLVY_LOADED_TO_DOCK' );
666 	    FND_MESSAGE.SET_TOKEN('DELIVERY_ID', p_dlvy_trip_tbl(i).delivery_id);
667 
668 	    p_dlvy_trip_tbl(i).r_message_text := fnd_message.get; */
669 
670             BEGIN
671                   UPDATE wms_shipping_transaction_temp
672                   SET    trip_id =  NULL
673                   WHERE  delivery_id = p_dlvy_trip_tbl(i).delivery_id;
674                   IF g_debug_on = 1 THEN
675 	             print_debug(l_procname || ': wstt.l_trip_id:  updated ' );
676                   END IF;
677 	     p_dlvy_trip_tbl(i).return_status := 'S';
678              EXCEPTION
679                   WHEN OTHERS THEN
680                   x_return_status := g_ret_status_unexp_error;
681                      IF g_debug_on = 1 THEN
682 	                print_debug(l_procname || ': wstt could not be updated: '  || SQLCODE ||':' || SQLERRM);
683                      END IF;
684             END ;
685 
686 	 END IF;
687       EXCEPTION
688 	 WHEN no_data_found THEN
689 	    p_dlvy_trip_tbl(i).return_status := 'S';
690 	 WHEN OTHERS THEN
691 	    p_dlvy_trip_tbl(i).return_status := 'U';
692 	    IF g_debug_on = 1 THEN
693 	       print_debug(l_procname || SQLERRM);
694 	    END IF;
695       END;
696        ELSE
697 	    p_dlvy_trip_tbl(i).return_status := 'U';
698 	    IF g_debug_on = 1 THEN
699 	       print_debug(l_procname || 'Either delivery id or trip id is not passed in');
700 	    END IF;
701       END IF;
702    END LOOP;
703 
704 
705 EXCEPTION
706    WHEN OTHERS THEN
707       x_return_status := g_ret_status_unexp_error;
708 END process_delivery_trip;
709 
710 PROCEDURE process_serial_number
711   (p_api_version         IN NUMBER
712    ,p_init_msg_list      IN VARCHAR2 := wms_shipping_interface_grp.g_false
713    ,p_commit             IN VARCHAR2 := wms_shipping_interface_grp.g_false
714    ,p_validation_level   IN NUMBER := wms_shipping_interface_grp.g_full_validation
715    ,p_action             IN VARCHAR2
716    ,p_serial_number_tbl  IN OUT nocopy wms_shipping_interface_grp.g_serial_number_tbl
717    ,x_return_status      OUT nocopy VARCHAR2
718    ,x_msg_count          OUT nocopy NUMBER
719    ,x_msg_data           OUT nocopy VARCHAR2) IS
720 
721       TYPE inventory_item_id_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
722       TYPE organization_id_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
723       TYPE serial_number_tbl IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
724       TYPE lpn_id_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
725 
726       l_inventory_item_id_tbl inventory_item_id_tbl;
727       l_serial_number_tbl     serial_number_tbl;
728       l_lpn_id_tbl            lpn_id_tbl;
729       l_current_org_id_tbl    organization_id_tbl;
730       l_user_id               NUMBER := fnd_global.user_id;
731 BEGIN
732    print_debug('PROCESS_SERIAL_NUMBER: Entered');
733    x_return_status := g_ret_status_success;
734    x_msg_count := 0;
735    x_msg_data := '';
736 
737    IF p_action = wms_shipping_interface_grp.g_action_update THEN
738       IF NOT fnd_api.compatible_api_call(1.0
739 					 ,p_api_version
740 					 ,'PROCESS_SERIAL_NUMBER'
741 					 ,g_pkg_name) THEN
742 	 print_debug('PROCESS_SERIAL_NUMBER: Incompatible API call');
743 	 RAISE g_exc_unexpected_error;
744       END IF;
745 
746       IF p_init_msg_list = 'T' THEN
747 	 fnd_msg_pub.initialize;
748       END IF;
749 
750       print_debug('PROCESS_SERIAL_NUMBER: Start processing serial numbers');
751 
752       print_debug('PROCESS_SERIAL_NUMBER: Start populating local tables');
753       FOR i IN p_serial_number_tbl.first..p_serial_number_tbl.last LOOP
754 	 l_inventory_item_id_tbl(i) := p_serial_number_tbl(i).inventory_item_id;
755 	 l_serial_number_tbl(i) := p_serial_number_tbl(i).serial_number;
759 	 print_debug('PROCESS_SERIAL_NUMBER: index: ' || i);
756 	 l_lpn_id_tbl(i) := p_serial_number_tbl(i).lpn_id;
757 	 l_current_org_id_tbl(i) := p_serial_number_tbl(i).current_organization_id;
758 
760 	 print_debug('PROCESS_SERIAL_NUMBER: inventory_item_id: ' || l_inventory_item_id_tbl(i));
761 	 print_debug('PROCESS_SERIAL_NUMBER: serial_number: ' || l_serial_number_tbl(i));
762 	 print_debug('PROCESS_SERIAL_NUMBER: lpn_id: ' || l_lpn_id_tbl(i));
763 	 print_debug('PROCESS_SERIAL_NUMBER: current_org_id: ' || l_current_org_id_tbl(i));
764       END LOOP;
765       print_debug('PROCESS_SERIAL_NUMBER: Finished populating local tables.  Count: ' || l_lpn_id_tbl.COUNT);
766 
767       print_debug('PROCESS_SERIAL_NUMBER: Update MSN table');
768       forall i IN l_lpn_id_tbl.first..l_lpn_id_tbl.last
769 	UPDATE mtl_serial_numbers
770 	SET lpn_id = l_lpn_id_tbl(i)
771 	,last_update_date = Sysdate
772 	,last_updated_by = l_user_id
773 	WHERE inventory_item_id = l_inventory_item_id_tbl(i)
774 	AND serial_number = l_serial_number_tbl(i)
775 	AND current_organization_id = l_current_org_id_tbl(i);
776 
777       print_debug('PROCESS_SERIAL_NUMBER: Finished updating');
778       print_debug('PROCES_SERIAL_NUMBER: Total rows updated: ' || SQL%ROWCOUNT);
779       IF g_debug_on = 1 THEN
780 	 FOR i IN l_lpn_id_tbl.first..l_lpn_id_tbl.last LOOP
781 	    print_debug('PROCESS_SERIAL_NUMBER: Row ' || i || ' updated ' || SQL%bulk_rowcount(i) || ' rows.');
782 	 END LOOP;
783       END IF;
784     ELSE
785       print_debug('PROCESS_SERIAL_NUMBER: Invalid action passed in');
786       RAISE g_exc_unexpected_error;
787    END IF;
788 
789    IF p_commit = 'T' THEN
790       COMMIT;
791       print_debug('PROCESS_SERIAL_NUMBER: Committed change');
792    END IF;
793    print_debug('PROCESS_SERIAL_NUMBER: Ended');
794 EXCEPTION
795    WHEN OTHERS THEN
796       x_return_status := g_ret_status_unexp_error;
797       print_debug('PROCESS_SERIAL_NUMBER: Exception raised!');
798 END process_serial_number;
799 
800 
801 /* Added the following API, which will be called by WSH
802 with p_action as 'INCLUDE_DELIVERY_FOR_PLANNING', when
803 the delivery is not assigned to any trip, to validate whether
804 any LPN associated with this delivery is already loaded to dock door
805 */
806 PROCEDURE process_deliveries
807 	 (p_api_version       IN            NUMBER
808 	  ,p_init_msg_list    IN            VARCHAR2 := Wms_Shipping_Interface_Grp.g_false
809 	  ,p_commit           IN            VARCHAR2 := Wms_Shipping_Interface_Grp.g_false
810 	  ,p_validation_level IN            NUMBER   := Wms_Shipping_Interface_Grp.g_full_validation
811 	  ,p_action           IN            VARCHAR2
812 	  ,x_dlvy_trip_tbl    IN OUT nocopy Wms_Shipping_Interface_Grp.g_dlvy_trip_tbl
813 	  ,x_return_status    OUT    nocopy VARCHAR2
814 	  ,x_msg_count        OUT    nocopy NUMBER
815 	  ,x_msg_data         OUT    nocopy VARCHAR2) IS
816 
817 	  l_delivery_status	NUMBER(1);
818 
819 BEGIN
820         x_return_status := 'S';
821         print_debug('In ....PROCESS_DELIVERIES ' );
822         print_debug('p_api_version: ' || p_api_version );
823         print_debug('p_init_msg_list: ' || p_init_msg_list );
824         print_debug('p_commit: ' || p_commit );
825         print_debug('p_validation_level: ' || p_validation_level );
826         print_debug('p_action: ' || p_action );
827         print_debug('x_dlvy_trip_tbl: ' || x_dlvy_trip_tbl.COUNT );
828 
829 	x_msg_count := 0;
830 	x_msg_data := '';
831 	IF p_action = Wms_Shipping_Interface_Grp.g_action_plan_delivery THEN
832 		FOR i IN x_dlvy_trip_tbl.first..x_dlvy_trip_tbl.last LOOP
833 			l_delivery_status := 0;
834                         print_debug('x_dlvy_trip_tbl(i).delivery_id :  ' || x_dlvy_trip_tbl(i).delivery_id);
835 
836 			BEGIN
837 				SELECT 1
838 				INTO l_delivery_status
839 				FROM dual
840 				WHERE EXISTS (  SELECT lpn_context
841 					FROM wms_license_plate_numbers wlpn
842 					, wms_shipping_transaction_temp wstt
843 					WHERE wlpn.lpn_id = wstt.outermost_lpn_id
844 					AND wstt.delivery_id = x_dlvy_trip_tbl(i).delivery_id
845 					AND wlpn.lpn_context = 9 );
846 
847 				IF l_delivery_status = 1 THEN
848 					x_dlvy_trip_tbl(i).return_status := 'E';
849 					x_dlvy_trip_tbl(i).r_message_appl := 'WMS';
850 					x_dlvy_trip_tbl(i).r_message_code := 'WMS_DELIVERY_LOADED_TO_DOCK';
851 					x_dlvy_trip_tbl(i).r_message_token := x_dlvy_trip_tbl(i).delivery_id;
852 					x_dlvy_trip_tbl(i).r_message_token_name := 'DELIVERY_ID';
853 					x_dlvy_trip_tbl(i).r_message_type := 'E';
854                                         print_debug('r_message_code : WMS_DELIVERY_LOADED_TO_DOCK');
855 				END IF;
856                                 print_debug('l_delivery_status :' || l_delivery_status);
857 
858 			EXCEPTION
859 				WHEN NO_DATA_FOUND THEN
860 					x_dlvy_trip_tbl(i).return_status := 'S';
861 					x_dlvy_trip_tbl(i).r_message_appl := 'WMS';
862 					x_dlvy_trip_tbl(i).r_message_code := '';
863 					x_dlvy_trip_tbl(i).r_message_token := x_dlvy_trip_tbl(i).delivery_id;
864 					x_dlvy_trip_tbl(i).r_message_token_name := 'DELIVERY_ID';
865 					x_dlvy_trip_tbl(i).r_message_type := 'S';
866                                 print_debug('NO_DATA_FOUND :' || x_dlvy_trip_tbl(i).delivery_id);
867 			END;
868 
869 			IF g_debug_on = 1 THEN
870 				print_debug('WMS_SHIPPING_INTERFACE_GRP.PROCESS_DELIVERIES : ' || ' Record No : ' || i );
871 				print_debug('WMS_SHIPPING_INTERFACE_GRP.PROCESS_DELIVERIES : ' || ' Delivery ID : ' || x_dlvy_trip_tbl(i).delivery_id );
872 				print_debug('WMS_SHIPPING_INTERFACE_GRP.PROCESS_DELIVERIES : ' || ' r_message_code : ' || x_dlvy_trip_tbl(i).r_message_code );
873 			END IF;
874 
875 		END LOOP;
876 	END IF;
877 EXCEPTION
878 	WHEN OTHERS THEN
879 		x_return_status := 'E';
880 		x_msg_count := 1;
881 		x_msg_data := 'Unexpected exception in PROCESS_DELIVERIES';
882 
883 END process_deliveries;
884 
885 function wave_line_exists(p_delivery_detail_id in number) return varchar2
886 is
887 l_return varchar2(1):='N';
888 begin
889 	begin
890 	select 'Y' into l_return from dual where exists
891 		(select 1 from wms_wp_wave_lines
892 		 where delivery_detail_id = p_delivery_detail_id
893 		 and nvl(remove_from_wave_flag, 'N') <> 'Y');
894 	exception
895 		when no_data_found then
896 		  l_return := 'N';
897 	end;
898 return l_return;
899 
900 end wave_line_exists;
901 
902 
903 procedure split_wave_line(p_orig_delivery_detail_id in number,
904                            p_new_delivery_detail_id in number default null,
905 						   x_return_status out nocopy varchar2,
906 						   x_msg_count out nocopy number,
907 						   x_msg_data out nocopy varchar2)
908 is
909   l_new_wave_line_id number;
910   l_new_crossdock_quantity number;
911 
912   cursor c_orig_wave_lines is
913   select wwl.wave_header_id
914    ,wwl.wave_line_id
915    ,wwl.wave_line_source
916    ,wwl.wave_line_status
917    ,wwl.organization_id
918    ,wwl.demand_source_header_id
919    ,wwl.remove_from_wave_flag
920    ,wwl.planned_fill_rate
921    ,wwl.crossdock_quantity
922    ,wwl.crossdock_uom
923    ,wdd.requested_quantity --needed to calculate new crossdock quantity...
924   from wms_wp_wave_lines wwl, wsh_delivery_details wdd
925   where wdd.delivery_detail_id = p_orig_delivery_detail_id
926     and wdd.delivery_detail_id = wwl.delivery_detail_id
927 	and wwl.organization_id = wdd.organization_id
928   and nvl(remove_from_wave_flag, 'N') <> 'Y';
929 
930 begin
931 	x_return_status:=fnd_api.g_ret_sts_success;
932 
933 	for l_split_from_wave_line in c_orig_wave_lines loop
934 
935 	--keep as much xdock qty on original wave line; only put some on new line if old line requestd quantity is less than old line xdock quantity
936 	  l_new_crossdock_quantity:=0;
937 	  if nvl(l_split_from_wave_line.crossdock_quantity,0)>l_split_from_wave_line.crossdock_quantity then
938 	    l_new_crossdock_quantity := l_split_from_wave_line.crossdock_quantity - l_split_from_wave_line.requested_quantity;
939 		update wms_wp_wave_lines
940 		set crossdock_quantity = requested_quantity
941 		where wave_line_id = l_split_from_wave_line.wave_line_id;
942 	  end if;
943 
944 	  --copy relevant information into new wave line
945 	  insert into wms_wp_wave_lines
946 		(WAVE_HEADER_ID,
947 		 WAVE_LINE_ID,
948 		 WAVE_LINE_SOURCE,
949 		 WAVE_LINE_STATUS,
950 		 CREATED_BY,
951 		 CREATION_DATE,
952 		 LAST_UPDATED_BY,
953 		 LAST_UPDATE_DATE,
954 		 LAST_UPDATE_LOGIN,
955 		 DELIVERY_DETAIL_ID,
956 		 ORGANIZATION_ID,
957 		 demand_source_header_id,
958 		 REMOVE_FROM_WAVE_FLAG,
959 		 planned_fill_rate,
960 		 crossdock_quantity,
961 		 crossdock_uom)
962 	  values
963 		(l_split_from_wave_line.wave_header_id,
964 		 WMS_WP_WAVE_LINES_S.NEXTVAL,
965 		 l_split_from_wave_line.WAVE_LINE_SOURCE,
966 		 l_split_from_wave_line.WAVE_LINE_STATUS,
967 		 fnd_global.user_id,
968 		 sysdate,
969 		 fnd_global.user_id,
970 		 sysdate,
971 		 fnd_global.login_id,
972 		 p_new_delivery_detail_id,
973 		 l_split_from_wave_line.organization_id,
974 		 l_split_from_wave_line.demand_source_header_id, --???????? Demand Source Header Id
975 		 l_split_from_wave_line.remove_from_wave_flag,
976 		 l_split_from_wave_line.planned_fill_rate,
977 		 l_new_crossdock_quantity,
978 		 l_split_from_wave_line.crossdock_uom)
979 	  returning WAVE_LINE_ID into l_new_wave_line_id;
980 
981 	  --call APIs to re-calculate actual_fill_rate and pick_fill_rate
982 	  	wms_wave_planning_pvt.update_line_pick_fill_rate(l_new_wave_line_id);
983 	    wms_wave_planning_pvt.update_line_pick_fill_rate(l_split_from_wave_line.wave_line_id);
984 		wms_wave_planning_pvt.update_line_actual_fill_rate(l_new_wave_line_id);
985 	    wms_wave_planning_pvt.update_line_actual_fill_rate(l_split_from_wave_line.wave_line_id);
986 
987 	end loop;
988 exception
989   when others then
990   --need to use print method
991   print_debug('Unexpected error in split_wave_line: '||SQLCODE || ' : '||SQLERRM);
992     x_return_status := 'U';
993 end split_wave_line;
994 END wms_shipping_interface_grp;