DBA Data[Home] [Help]

PACKAGE BODY: APPS.WSH_DELIVERY_DETAILS_ACTIONS

Source


1 PACKAGE BODY WSH_DELIVERY_DETAILS_ACTIONS as
2 /* $Header: WSHDDACB.pls 120.50.12020000.14 2013/05/30 13:27:00 skanduku ship $ */
3 
4 -- odaboval : Begin of OPM Changes (Pick_Confirm)
5 G_PACKAGE_NAME       CONSTANT   VARCHAR2(50) := 'WSH_DELIVERY_DETAILS_ACTIONS';
6 
7 G_MAX_DECIMAL_DIGITS     CONSTANT   NUMBER := 9 ;
8 G_MAX_REAL_DIGITS     CONSTANT    NUMBER := 10 ;
9 G_RET_WARNING       CONSTANT    VARCHAR2(1):= 'W';
10 
11 -- 2587777
12 G_ATO_RSV_PROFILE   VARCHAR2(240);
13 G_CODE_RELEASE_LEVEL            VARCHAR2(6);
14 g_header_id                     number;
15 -- 2587777
16 
17 -- J: W/V Changes
18 cursor g_get_detail_info(detail_id in number) is
19 select released_status,
20        gross_weight,
21        net_weight,
22        volume,
23        container_flag,
24        delivery_id
25 from   wsh_Delivery_details wdd,
26        wsh_delivery_assignments_v wda
27 where  wdd.delivery_detail_id = detail_id
28 and    wdd.delivery_detail_id = wda.delivery_detail_id;
29 
30 -- odaboval : End of OPM Changes (Pick_Confirm)
31 /*2442099*/
32 -- Forward declaration for the procedure Log_Exceptions
33 
34 PROCEDURE Log_Exceptions(p_old_delivery_detail_id IN NUMBER,
35                          p_new_delivery_detail_id IN NUMBER,
36                          p_delivery_id            IN NUMBER,
37                          p_action                 IN VARCHAR2 DEFAULT NULL);
38 
39 -- Forward declaration
40 --  Procedure:    Split_Serial_Numbers_INT
41 --
42 --          x_old_detail_rec       original delivery detail information for splitting
43 --          x_new_delivery_detail_rec  new delivery detail to copy
44 --          p_old_shipped_quantity   shipped quantity to be updated on original detail
45 --          p_new_shipped_quantity   shipped quantity to be updated on new detail
46 --
47 --  Description:  Splits the serial number records for
48 --          the original delivery line
49 --          and its newly split delivery line.
50 --          x_old_detail_recand x_new_delivery_detail_rec will be updated with
51 --          new serial number information as needed (for serial_number, to_serial_number,
52 --          and transaction_temp_id).
53 PROCEDURE Split_Serial_Numbers_INT(
54   x_old_detail_rec      IN OUT NOCOPY   SplitDetailRecType,
55     x_new_delivery_detail_rec IN OUT NOCOPY   WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type,
56     p_old_shipped_quantity  IN    NUMBER,
57     p_new_shipped_quantity  IN    NUMBER,
58     x_return_status      OUT NOCOPY      VARCHAR2);
59 
60 
61 /*---------------------------------------------------------------------------------------------------
62 Procedure Name : Unreserve_delivery_detail
63 Description : This API calls Inventory's APIs to Unreserve. It first
64          queries the reservation records, and then calls
65          delete_reservations until the p_quantity_to_unreserve
66          is satisfied.
67 Parameters      : p_delivery_detail_id         -> WSH_DELIVERY_DETAILS.delivery_detail_id corresponding to
68                                                   which the reservations are to be Unreserved
69                   p_quantity_to_unreserve      -> Quantity to Unreserve / Cycle Count
70                   p_unreserve_mode             -> p_unreserve_mode             -> Either  'UNRESERVE'  or 'CYCLE_COUNT' or 'RETAIN_RSV'
71                                                   Added 'RETAIN_RSV' for bug 4721577. WMS wants
72                                                   reservations to be retained while Backordering
73                                                   delivery detail lines.'
74                   p_override_retain_ato_rsv    -> A 'Y' for this parameter will indicate to override the
75                                                   Retain ATO REservations profile (yes). In short, this
76                                                   will indicate that the Unreservation has to take place.
77                                                   This is Passed as 'Y' from WSH_INTERFACE.delete_details,
78                                                   an instance where the Reservations have to be reduced.
79 Brief Logic of Underlying IFs :
80 Loop Until All Resevation Records are Read; Classify the Rsvn. into Staged and UnStaged Rsvtns.
81  IF ( LineType = 'Unstaged' and p_unreserve_mode = 'UNRESERVE' and Reservation is not staged) THEN
82      IF ( Ato Line with Retain Rsvtn.) Don't Update or Delete the REservations
83       Otherwise -- Reduce Detailed Qty and Prim.Rsvtn Qty and Call [Update Rsvn] OR [Delete Rsvtn]
84  ELSIF ( LineType = 'staged' and unreserve_mode = 'UNRESERVE' and Reservation is staged)
85                 OR ( unreserve_mode <> 'UNRESERVE' , e.g. Cycle Count ) THEN
86      Handle: ( rsv.Qty <= Qty. to UnReserve)
87            IF ( ATO line ) then Update Staged Flag to UnStaged Otherwise (Delete REservation )
88            OR Cycle_Count depending on the unreserve_mode
89      Handle: ( rsv.Qty > Qty. to UnReserve)
90          IF ( ATO Line ) THEN (Transfer Reservation and Update Rsvntn. Staged Flag to UnStaged for the
91                  Split or Transferred Rsvtn.) Otherwise (Update Rsvtn.)
92          OR (Cycle Count Process) depending on the unreserve_mode
93 End Loop;
94 ------------------------------------------------------------------------------------------------------- */
95 -- HW 3121616 Added p_quantity2_to_unreserve
96 Procedure Unreserve_delivery_detail
97 ( p_delivery_detail_id      IN NUMBER
98 , p_quantity_to_unreserve    IN  NUMBER
99 , p_quantity2_to_unreserve    IN  NUMBER default NULL
100 , p_unreserve_mode        IN  VARCHAR2
101 , p_override_retain_ato_rsv     IN  VARCHAR2    -- 2747520
102 , x_return_status        OUT NOCOPY  VARCHAR2
103 )
104 
105 
106 IS
107 l_rsv_rec        inv_reservation_global.mtl_reservation_rec_type;
108 l_rsv_new_rec      inv_reservation_global.mtl_reservation_rec_type;
109 l_msg_count      NUMBER;
110 l_msg_data        VARCHAR2(3000);
111 l_rsv_id        NUMBER;
112 l_return_status    VARCHAR2(1);
113 l_reserve_msg_count      NUMBER := 0;
114 l_reserve_msg_data       VARCHAR2(4000) := NULL;
115 l_reserve_message      VARCHAR2(4000) := NULL;
116 l_reserve_status     VARCHAR2(1);
117 l_rsv_tbl        inv_reservation_global.mtl_reservation_tbl_type;
118 l_count        NUMBER;
119 l_dummy_sn        inv_reservation_global.serial_number_tbl_type;
120 l_qty_to_unreserve    NUMBER;
121 l_sales_order_id    NUMBER := NULL;
122 l_x_error_code      NUMBER;
123 l_lock_records      VARCHAR2(1);
124 l_sort_by_req_date    NUMBER ;
125 -- HW BUG#:2005977 for OPM
126 -- HW OPMCONV - Removed OPM variables
127 
128 l_buffer        VARCHAR2(2000);
129 
130 x_msg_count       NUMBER;
131 x_msg_data   VARCHAR2(3000);
132 l_trans_qty     NUMBER;
133 l_trans_qty2       NUMBER;
134 l_lock_status     BOOLEAN;
135 -- 2587777
136 l_staged_flag                   VARCHAR2(1);
137 l_new_rsv_id      NUMBER;
138 -- 2587777
139 l_unreserve_mode VARCHAR2(20);
140 l_lpn_id NUMBER;
141 
142 
143 
144 Cursor c_line_details is
145   select o.source_document_type_id ,
146          o.line_id ,
147          o.header_id ,
148          o.preferred_grade ,
149          o.ordered_quantity_uom2 ,
150          o.ordered_quantity2 ,
151          o.ato_line_id,    -- 2587777
152          wdd.organization_id,
153 -- HW 4178299 - Get Item_id and uom
154          wdd.inventory_item_id,
155          wdd.requested_quantity_uom,
156          wdd.subinventory,
157          wdd.revision,
158          wdd.locator_id,
159 	 -- X-dock changes, add 2 fields
160          wdd.requested_quantity,
161          wdd.requested_quantity2,
162 -- HW OPMCONV - Changed length from 30 to 80
163          substr(wdd.lot_number,1,80) lot_number ,
164          wdd.move_order_line_id,
165          wdd.released_status, -- 2747520
166          wdd.date_scheduled,  -- 2847687
167 	 wda.parent_delivery_detail_id --4721577
168     from wsh_delivery_details wdd ,
169          oe_order_lines_all o,
170 	 wsh_delivery_assignments_v wda
171    where wdd.delivery_detail_id = p_delivery_Detail_id
172      and wdd.delivery_detail_id = wda.delivery_detail_id
173      and wdd.source_code = 'OE'
174      and wdd.source_line_id = o.line_id ;
175 
176 l_line_rec c_line_details%ROWTYPE ;
177 -- Bug 4721577
178 CURSOR c_lpn_id (c_delivery_detail_id NUMBER) IS
179    SELECT wdd.lpn_id
180    FROM   wsh_delivery_details wdd
181    WHERE  wdd.delivery_detail_id = c_delivery_detail_id;
182 
183 -- HW BUG#:2005977 for OPM
184 
185 --
186 l_debug_on BOOLEAN;
187 --
188 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNRESERVE_DELIVERY_DETAIL';
189 --
190 l_cancel_rsv_type  VARCHAR2(1);   -- 2747520: 'S'taged or 'U'nstaged
191 -- HW OPMCONV - Added Qty2
192 CURSOR c_nonstaged_qty is
193 SELECT nvl(sum(requested_quantity),0),nvl(sum(requested_quantity2),0)
194 FROM   wsh_delivery_details
195 WHERE
196        source_line_id      = l_line_rec.line_id
197 and    source_header_id    = l_line_rec.header_id
198 and    organization_id     = l_line_rec.organization_id
199 and    released_status in ('R','B','N','S');
200 
201 l_nonstaged_qty              NUMBER;
202 l_nonstaged_rsv_qty          NUMBER;
203 l_remaining_nonstaged_qty    NUMBER;
204 l_cancelled_reservation_qty  NUMBER;
205 -- HW OPMCONV - Added Qty2 variables
206 l_nonstaged_qty2              NUMBER;
207 l_nonstaged_rsv_qty2          NUMBER;
208 l_remaining_nonstaged_qty2    NUMBER;
209 l_dtld_qty2_to_unreserve      NUMBER;
210 l_qty2_to_unreserve    NUMBER;
211 -- 2747520
212 --
213 l_trolin_rec                 INV_MOVE_ORDER_PUB.Trolin_Rec_Type;
214 l_dtld_qty_to_unreserve      NUMBER;
215 l_chk_direct_ship BOOLEAN;
216 --muom
217 l_fulfillment_base VARCHAR2(1);
218 
219 BEGIN
220 
221 
222   -- If the quantity to reserve is passed and null or missing, we do not
223   -- need to go through this procedure.
224   --
225   --
226   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
227   --
228   IF l_debug_on IS NULL
229   THEN
230       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
231   END IF;
232   --
233   IF l_debug_on THEN
234       WSH_DEBUG_SV.push(l_module_name);
235       --
236       -- 2587777
237 
238       WSH_DEBUG_SV.log(l_module_name,'P_QUANTITY2_TO_UNRESERVE',P_QUANTITY2_TO_UNRESERVE);
239       WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_DETAIL_ID:P_QUANTITY_TO_UNRESERVE:P_QUANTITY2_TO_UNRESERVE: P_UNRESERVE_MODE:
240                                       P_OVERRIDE_RETAIN_ATO_RSV ;',
241                                      P_DELIVERY_DETAIL_ID
242                               ||':'||P_QUANTITY_TO_UNRESERVE
243                               ||':'||P_QUANTITY2_TO_UNRESERVE
244                               ||':'||P_UNRESERVE_MODE
245                               ||':'||P_OVERRIDE_RETAIN_ATO_RSV);
246   END IF;
247   --
248   IF p_quantity_to_unreserve is null OR
249    p_quantity_to_unreserve = FND_API.G_MISS_NUM THEN
250    goto end_of_loop;
251   END IF;
252 
253   --
254   IF l_debug_on THEN
255       WSH_DEBUG_SV.logmsg(l_module_name, 'P_DELIVERY_DETAIL_ID : G_CODE_RELEASE_LEVEL ;'
256                                           || P_DELIVERY_DETAIL_ID ||': '|| G_CODE_RELEASE_LEVEL  );
257   END IF;
258   --
259 
260   IF ( G_CODE_RELEASE_LEVEL is NULL ) THEN
261     G_CODE_RELEASE_LEVEL := WSH_CODE_CONTROL.Get_Code_Release_Level;
262   END IF;
263 
264   --
265   IF l_debug_on THEN
266       WSH_DEBUG_SV.logmsg(l_module_name, 'G_CODE_RELEASE_LEVEL ' || G_CODE_RELEASE_LEVEL  );
267   END IF;
268   --
269 
270   OPEN  c_line_details;
271   FETCH c_line_details INTO  l_line_rec ;
272 
273   IF c_line_details%NOTFOUND THEN
274   CLOSE c_line_details;
275   goto end_of_loop;
276   END IF;
277   CLOSE c_line_details;
278 
279   -- muom
280   l_fulfillment_base := WSH_UTIL_CORE.Get_Line_Fulfillment_Base('OE', l_line_rec.line_id);
281 
282   -- HW BUG#:2005977
283   --
284   IF l_debug_on THEN
285 -- 2747520
286       WSH_DEBUG_SV.log(l_module_name,'Ln_id:Hdr_id:Org_id:Src-doc-id:SubInv:Rev:Lot#:Locat-id ; ',
287                        l_line_rec.line_id
288                ||':'|| l_line_rec.header_id
289                ||':'|| l_line_rec.organization_id
290                ||':'|| l_line_rec.source_document_type_id
291                ||':'|| l_line_rec.subinventory
292                ||':'|| l_line_rec.revision
293                ||':'|| l_line_rec.lot_number
294 -- HW 4178299  - Added inventory_item_id, uom and uom2
295                ||':'|| l_line_rec.inventory_item_id
296                ||':'|| l_line_rec.requested_quantity_uom
297                ||':'|| l_line_rec.ordered_quantity_uom2
298                ||':'|| l_line_rec.locator_id);
299       WSH_DEBUG_SV.log(l_module_name,'ATO-Ln-id : Rel-Stat : Dt-Sched HH24:MI:SS ; ',
300                        l_line_rec.ato_line_id
301                ||':'|| l_line_rec.released_status
302                ||':'|| to_char(l_line_rec.date_scheduled,'MM/DD/YYYY HH24:MI:SS'));
303       -- muom
304       WSH_DEBUG_SV.log(l_module_name,'l_fulfillment_base ',l_fulfillment_base);
305 
306 -- 2587777
307 
308   END IF;
309   --
310 --HW OPMCONV - Removed checking for process org
311 
312   -- end of BUG#:2005977
313   IF l_line_rec.source_document_type_id = 10 THEN
314    -- This is an internal order line. We need to give
315    -- a different demand source type for these lines.
316       l_rsv_rec.demand_source_type_id   :=
317       INV_RESERVATION_GLOBAL.G_SOURCE_TYPE_INTERNAL_ORD;
318           -- intenal order
319   ELSE
320     l_rsv_rec.demand_source_type_id  :=
321       INV_RESERVATION_GLOBAL.G_SOURCE_TYPE_OE; -- order entry
322   END IF;
323 
324   -- Get demand_source_header_id from mtl_sales_orders
325 
326   --
327   IF l_debug_on THEN
328       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_SALESORDER.GET_SALESORDER_FOR_OEHEADER',WSH_DEBUG_SV.C_PROC_LEVEL);
329   END IF;
330   --
331   -- caching the sales_order_id : 2807093-2747520
332   IF ( l_sales_order_id is NULL OR l_line_rec.header_id <> nvl(g_header_id, 0) ) THEN
333     l_sales_order_id := inv_salesorder.get_salesorder_for_oeheader(
334                           l_line_rec.header_id);
335     g_header_id      := l_line_rec.header_id;
336   END IF;
337   --
338   IF l_debug_on THEN
339       WSH_DEBUG_SV.logmsg(l_module_name, 'L_SALES_ORDER_ID' || L_SALES_ORDER_ID  );
340   END IF;
341   --
342 
343   l_rsv_rec.demand_source_header_id     := l_sales_order_id;
344   l_rsv_rec.demand_source_line_id := l_line_rec.line_id;
345 
346   -- Bug 1842613 : Initializing inventory controls present in wsh_delivery_details
347   IF ( l_line_rec.organization_id IS NOT NULL )  THEN
348    l_rsv_rec.organization_id := l_line_rec.organization_id;
349   END IF;
350   IF ( l_line_rec.subinventory IS NOT NULL) THEN
351    l_rsv_rec.subinventory_code := l_line_rec.subinventory;
352   END IF;
353   IF ( l_line_rec.revision IS NOT NULL ) THEN
354    l_rsv_rec.revision := l_line_rec.revision;
355   END IF;
356   IF ( l_line_rec.lot_number IS NOT NULL ) THEN
357    l_rsv_rec.lot_number := l_line_rec.lot_number;
358   END IF;
359   IF ( l_line_rec.locator_id IS NOT NULL ) THEN
360    l_rsv_rec.locator_id := l_line_rec.locator_id;
361   END IF;
362 --Added condition p_unreserve_mode = 'RETAIN_RSV' for bug 4721577
363 --Added condition p_unreserve_mode = 'UNRESERVE' for bug 11828449
364 IF (NVL(p_unreserve_mode, 'UNRESERVE') in ('UNRESERVE', 'RETAIN_RSV')) AND
365      l_line_rec.parent_delivery_detail_id IS NOT NULL AND
366      (wsh_util_validate.Check_Wms_Org(l_line_rec.organization_id)='Y') THEN
367     OPEN  c_lpn_id(l_line_rec.parent_delivery_detail_id);
368     FETCH c_lpn_id INTO l_lpn_id;
369     --
370      IF (c_lpn_id%FOUND) THEN
371 
372 	IF l_lpn_id is not null THEN
373              --
374             IF  WMS_DIRECT_SHIP_PVT.check_direct_ship_for_lpn(l_lpn_id) THEN
375 	      l_chk_direct_ship:=TRUE;
376 	      --
377 	      IF l_debug_on THEN
378                 WSH_DEBUG_SV.log(l_module_name,' Direct Ship l_lpn_id', l_lpn_id);
379               END IF;
380 	     --
381                 ELSE
382                  l_chk_direct_ship:=FALSE;
383 	     END IF;
384 	     --
385            IF (NVL(p_unreserve_mode,'UNRESERVE') in ('RETAIN_RSV')) OR (l_chk_direct_ship) THEN
386 
387               l_rsv_rec.lpn_id := l_lpn_id;
388             --
389             IF l_debug_on THEN
390               WSH_DEBUG_SV.log(l_module_name,' l_rsv_rec.lpn_id', l_lpn_id);
391             END IF;
392          --
393           END IF;
394 	  --
395        END IF;
396        --
397     END IF;
398     --
399     CLOSE c_lpn_id;
400 
401   END IF;
402   --
403   --bug 4950329: query only staged reservations for cycle-count
404   IF (p_unreserve_mode = 'CYCLE_COUNT')  THEN
405     l_rsv_rec.staged_flag := 'Y';
406   END IF;
407 
408 
409 -- HW BUG#:2005977 for OPM. Need to branch
410 -- HW OPMCONV - No need to branch code
411    --
412    IF l_debug_on THEN
413        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_RESERVATION_PUB.QUERY_RESERVATION',WSH_DEBUG_SV.C_PROC_LEVEL);
414    END IF;
415    --
416 -- Bug 3431358(Moved this code from top to here)
417 -- 2747520 : Set reservation_type to 'U'nstaged or 'S'taged
418   IF (l_line_rec.released_status in ('R','B','N') ) THEN
419       l_cancel_rsv_type := 'U';
420       OPEN  c_nonstaged_qty;
421       FETCH c_nonstaged_qty
422       INTO  l_nonstaged_qty, l_nonstaged_qty2;
423       CLOSE c_nonstaged_qty;
424   ELSIF (l_line_rec.released_status in ('C','Y')) THEN
425       l_cancel_rsv_type := 'S';
426   ELSIF (l_line_rec.released_status = 'S') THEN
427       l_cancel_rsv_type := 'U';
428       --X-dock
429       IF l_line_rec.move_order_line_id IS NOT NULL THEN
430         l_trolin_rec := INV_TROLIN_UTIL.Query_Row(p_line_id => l_line_rec.move_order_line_id);
431       ELSE -- MOL is null for X-dock case
432         l_trolin_rec.quantity_detailed := l_line_rec.requested_quantity;
433         l_trolin_rec.secondary_quantity_detailed := l_line_rec.requested_quantity2;
434       END IF;
435       -- end of X-dock changes
436 
437       IF (l_trolin_rec.quantity_detailed > 0) THEN
438         l_dtld_qty_to_unreserve := l_trolin_rec.quantity_detailed;
439 -- HW OPMCONV - Added Qty2
440         l_dtld_qty2_to_unreserve := l_trolin_rec.secondary_quantity_detailed;
441       ELSE
442 -- HW OPMCONV - Added Qty2
443         l_dtld_qty_to_unreserve := 0;
444         l_dtld_qty2_to_unreserve := 0;
445       END IF;
446   ELSE
447       l_cancel_rsv_type := 'X';   -- ignoring if not in above released status
448   END IF;
449 -- 2747520
450 -- End Bug3431358
451 
452 --2587777
453          IF ( G_ATO_RSV_PROFILE  IS NULL ) THEN
454             fnd_profile.get('WSH_RETAIN_ATO_RESERVATIONS', G_ATO_RSV_PROFILE);
455             if ( G_ATO_RSV_PROFILE is NULL ) THEN     -- By Default this Profile is 'N'
456                 G_ATO_RSV_PROFILE := 'N';
457             end if;
458          END IF;
459          IF l_debug_on THEN
460             WSH_DEBUG_SV.log(l_module_name,'g_ato_rsv_profile',G_ATO_RSV_PROFILE);
461          END IF;
462 --2587777
463 
464   --X-dock
465   IF l_line_rec.released_status = WSH_DELIVERY_DETAILS_PKG.C_RELEASED_TO_WAREHOUSE THEN
466     WSH_USA_INV_PVT.get_putaway_detail_id
467       (p_detail_id          => p_delivery_detail_id,
468        p_released_status    => l_line_rec.released_status,
469        p_move_order_line_id => l_line_rec.move_order_line_id,
470        x_detail_id          => l_rsv_rec.demand_source_line_detail,
471        x_return_status      => l_return_status);
472 
473     IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
474       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
475     ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
476       RAISE FND_API.G_EXC_ERROR;
477     END IF;
478   END IF;
479   --end of X-dock
480 
481    inv_reservation_pub.query_reservation
482      (p_api_version_number        => 1.0,
483       p_init_msg_lst              => fnd_api.g_true,
484       x_return_status             => l_return_status,
485       x_msg_count                 => l_msg_count,
486       x_msg_data                  => l_msg_data,
487       p_query_input               => l_rsv_rec,
488       p_cancel_order_mode         => INV_RESERVATION_GLOBAL.G_CANCEL_ORDER_YES,
489       x_mtl_reservation_tbl       => l_rsv_tbl,
490       x_mtl_reservation_tbl_count => l_count,
491       x_error_code                => l_x_error_code,
492       p_lock_records              => l_lock_records,
493       p_sort_by_req_date          => l_sort_by_req_date
494      );
495 
496 
497   -- 2747520: for Non-Staged
498    IF ( l_cancel_rsv_type = 'U') THEN
499      l_nonstaged_rsv_qty  := 0;
500 
501      FOR l_counter in  1..l_count
502      LOOP
503          IF l_debug_on THEN
504            WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_STAGED_RESERVATION_UTIL.QUERY_STAGED_FLAG',WSH_DEBUG_SV.C_PROC_LEVEL);
505          END IF;
506 
507          INV_STAGED_RESERVATION_UTIL.query_staged_flag(
508            x_return_status   =>  x_return_status,
509            x_msg_count       =>  l_msg_count,
510            x_msg_data        =>  l_msg_data,
511            x_staged_flag     =>  l_staged_flag,
512            p_reservation_id  =>  l_rsv_tbl(l_counter).reservation_id);
513 
514      IF l_staged_flag <> 'Y' THEN
515 -- HW OPMCONV - Added Qty2
516       l_nonstaged_rsv_qty := l_nonstaged_rsv_qty + (l_rsv_tbl(l_counter).primary_reservation_quantity - nvl(l_rsv_tbl(l_counter).detailed_quantity,0));
517       /* muom: Incorrect subtraction of primary quantity from secondary quantity
518       l_nonstaged_rsv_qty2 := l_nonstaged_rsv_qty2 + (l_rsv_tbl(l_counter).secondary_reservation_quantity - nvl(l_rsv_tbl(l_counter).detailed_quantity,0));
519       */
520       l_nonstaged_rsv_qty2 := l_nonstaged_rsv_qty2 + (l_rsv_tbl(l_counter).secondary_reservation_quantity - nvl(l_rsv_tbl(l_counter).secondary_detailed_quantity,0));
521      END IF;
522 
523     END LOOP;
524   END IF;
525 -- 2747520
526 
527    l_qty_to_unreserve   := p_quantity_to_unreserve;
528 -- HW OPMCONV - Added Qty2
529    l_qty2_to_unreserve   := p_quantity2_to_unreserve;
530 
531 
532 -- HW 4178299 - Need to convert Qty2 to get correct value
533    IF l_fulfillment_base = 'P' THEN
534       IF l_debug_on THEN
535              WSH_DEBUG_SV.log(l_module_name,'Value of Qty2_to_Unreserve before conversion is ',
536                                              l_qty2_to_unreserve);
537 
538       END IF;
539 
540       IF ( l_qty2_to_unreserve is NOT NULL OR
541            l_qty2_to_unreserve <> FND_API.G_MISS_NUM ) THEN
542 
543            l_qty2_to_unreserve := WSH_WV_UTILS.convert_uom
544                     (
545                      item_id      => l_line_rec.inventory_item_id
546                     ,org_id       => l_line_rec.organization_id
547                     ,from_uom     => l_line_rec.requested_quantity_uom
548                     ,to_uom       => l_line_rec.ordered_quantity_uom2
549                     ,quantity     => l_qty_to_unreserve
550                     ,lot_number   => l_line_rec.lot_number);
551 
552            IF l_debug_on THEN
553              WSH_DEBUG_SV.log(l_module_name,'Value of Qty2_to_Unreserve AFTER conversion is ',
554                               l_qty2_to_unreserve);
555 
556            END IF;
557 
558       END IF;
559 /*
560    ELSE
561       IF l_debug_on THEN
562              WSH_DEBUG_SV.log(l_module_name,'Value of Qty_to_Unreserve before conversion is ',
563                                              l_qty_to_unreserve);
564       END IF;
565 
566       IF ( l_qty_to_unreserve is NOT NULL OR
567            l_qty_to_unreserve <> FND_API.G_MISS_NUM ) THEN
568 
569            l_qty_to_unreserve := WSH_WV_UTILS.convert_uom
570                     (
571                      item_id      => l_line_rec.inventory_item_id
572                     ,org_id       => l_line_rec.organization_id
573                     ,from_uom     => l_line_rec.ordered_quantity_uom2
574                     ,to_uom       => l_line_rec.requested_quantity_uom
575                     ,quantity     => l_qty2_to_unreserve
576                     ,lot_number   => l_line_rec.lot_number);
577 
578            IF l_debug_on THEN
579              WSH_DEBUG_SV.log(l_module_name,'Value of Qty_to_Unreserve AFTER conversion is ',
580                               l_qty_to_unreserve);
581 
582            END IF;
583 
584       END IF;
585 */
586    END IF;
587 
588 -- HW end of 4178299
589 
590 
591 
592 -- 2747520   -- if rsv_type = U
593    IF ( l_cancel_rsv_type = 'U') THEN
594     l_remaining_nonstaged_qty := l_nonstaged_qty - l_qty_to_unreserve;
595 -- HW OPMCONV - Added Qty2
596     l_remaining_nonstaged_qty2 := l_nonstaged_qty2 - l_qty2_to_unreserve;
597     IF l_debug_on THEN
598         WSH_DEBUG_SV.log(l_module_name,'l_nonstaged_rsv_qty:l_nonstaged_qty:l_dtld_qty_to_unreserve:l_remaining_nonstaged_qty ;',
599                        l_nonstaged_rsv_qty
600                 ||':'||l_nonstaged_qty
601                 ||':'||l_dtld_qty_to_unreserve
602                 ||':'||l_remaining_nonstaged_qty );
603 -- HW OPMCONV - Added Qty2
604         WSH_DEBUG_SV.log(l_module_name,'l_nonstaged_rsv_qty2:l_nonstaged_qty:l_dtld_qty2_to_unreserve:l_remaining_nonstaged_qty2 ;',
605                        l_nonstaged_rsv_qty2
606                 ||':'||l_nonstaged_qty2
607                 ||':'||l_dtld_qty2_to_unreserve
608                 ||':'||l_remaining_nonstaged_qty2 );
609 
610     END IF;
611     -- Only Unreserve the Excess Unstgd. Rsvtns.
612     -- muom
613     IF (l_fulfillment_base = 'P' and l_nonstaged_rsv_qty > l_remaining_nonstaged_qty) OR (l_fulfillment_base = 'S' and l_nonstaged_rsv_qty2 > l_remaining_nonstaged_qty2) THEN
614       l_qty_to_unreserve := l_nonstaged_rsv_qty - l_remaining_nonstaged_qty;
615 -- HW OPMCONV - Added Qty2
616       l_qty2_to_unreserve := l_nonstaged_rsv_qty2 - l_remaining_nonstaged_qty2;
617     ELSE
618       l_qty_to_unreserve   := 0;
619 -- HW OPMCONV - Added Qty2
620       l_qty2_to_unreserve   := 0;
621     END IF;
622    END IF;       -- if rsv_type = U
623 -- 2747520
624 
625          IF l_debug_on THEN
626            WSH_DEBUG_SV.log(l_module_name,'l_rsv_tbl.COUNT:l_x_error_code :: ',
627                                           l_rsv_tbl.COUNT||':'||l_x_error_code);
628          END IF;
629 
630    FOR I IN 1..l_rsv_tbl.COUNT LOOP
631 
632        l_rsv_rec := l_rsv_tbl(I);
633   --
634   IF l_debug_on THEN
635 -- 2587777
636           WSH_DEBUG_SV.log(l_module_name,'rsv.id:inv-item-id:Rsvtn-Qty:Org-id:SubInv-Code:Locator-id:Rev:Lot# ; ',
637                         l_rsv_rec.reservation_id
638                  ||':'||l_rsv_rec.inventory_item_id
639                  ||':'||l_rsv_rec.reservation_quantity
640                  ||':'||l_rsv_rec.secondary_reservation_quantity
641                  ||':'||L_RSV_REC.ORGANIZATION_ID
642                  ||':'||L_RSV_REC.SUBINVENTORY_CODE
643                  ||':'||L_RSV_REC.LOCATOR_ID
644                  ||':'||L_RSV_REC.REVISION
645                  ||':'||L_RSV_REC.LOT_NUMBER  );
646 -- 2587777
647   END IF;
648   --
649 -- 2747520 : Query Staged Reservation
650  IF l_debug_on THEN
651   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_STAGED_RESERVATION_UTIL.QUERY_STAGED_FLAG',WSH_DEBUG_SV.C_PROC_LEVEL);
652  END IF;
653 --
654   inv_staged_reservation_util.query_staged_flag(
655   x_return_status     => l_return_status
656   , x_msg_count         => l_msg_count
657   , x_msg_data          => l_msg_data
658   , x_staged_flag       => l_staged_flag
659   , p_reservation_id    => l_rsv_rec.reservation_id);
660   --
661   IF l_debug_on THEN
662 
663    WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS QUERY STAGED FLAG: ' || L_RETURN_STATUS  );
664   END IF;
665   --
666 
667   IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
668     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
669   ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
670    RAISE FND_API.G_EXC_ERROR;
671   END IF;
672 
673  IF l_debug_on THEN
674     WSH_DEBUG_SV.log(l_module_name, 'RES QTY : QTY TO UNRESVRVE : l_staged_flag ; ',
675                               L_RSV_REC.RESERVATION_QUANTITY
676                        ||':'||L_QTY_TO_UNRESERVE
677                        ||':'||l_staged_flag );
678 
679       WSH_DEBUG_SV.log(l_module_name, 'PRIM RES QTY : l_staged_flag ; ',
680                               L_RSV_REC.PRIMARY_RESERVATION_QUANTITY
681                        ||':'||l_staged_flag );
682 
683 -- HW OPMCONV - Added Qty2
684     WSH_DEBUG_SV.log(l_module_name, 'RES QTY2 : QTY2 TO UNRESVRVE : l_staged_flag ; ',
685                               L_RSV_REC.SECONDARY_RESERVATION_QUANTITY
686                        ||':'||L_QTY2_TO_UNRESERVE
687                        ||':'||l_staged_flag );
688 
689  END IF;
690 --Bug 13995543
691  -- muom
692  IF l_fulfillment_base = 'P' THEN
693     if l_rsv_rec.secondary_reservation_quantity = 0 or l_rsv_rec.secondary_reservation_quantity < L_QTY2_TO_UNRESERVE THEN
694         IF l_debug_on THEN
695            WSH_DEBUG_SV.logmsg(l_module_name, 'Making secondary quantitiy to be unreserved to be equal to secondary reservation vailable, when '   );
696            WSH_DEBUG_SV.logmsg(l_module_name, 'secondary reservation quantity is  less than quantity2 to be unreserved '    );
697         END IF;
698         L_QTY2_TO_UNRESERVE := l_rsv_rec.secondary_reservation_quantity ;
699      END IF; --
700  ELSE
701     if l_rsv_rec.primary_reservation_quantity = 0 or l_rsv_rec.primary_reservation_quantity < L_QTY_TO_UNRESERVE THEN
702         IF l_debug_on THEN
703            WSH_DEBUG_SV.logmsg(l_module_name, 'Making primary quantitiy to be unreserved to be equal to primary reservation vailable, when '   );
704            WSH_DEBUG_SV.logmsg(l_module_name, 'primary reservation quantity is  less than quantity to be unreserved '    );
705         END IF;
706         L_QTY_TO_UNRESERVE := l_rsv_rec.primary_reservation_quantity ;
707      END IF; --
708  END IF;
709  --
710  -- 2747520 : This will also ensure that Only Non-Staged Staged line UnReserves Non-Stged Rsvtns.
711  --          and Staged Rsvtns. UnReserves Staged Rsvtns.
712  --
713  -- cancel Non-Staged Reservations by non-stged lines
714  IF (l_cancel_rsv_type = 'U' and p_unreserve_mode = 'UNRESERVE' and l_staged_flag <> 'Y') THEN
715 
716        -- Check if Retain ATO Profile
717        IF ( l_line_rec.ato_line_id IS NOT NULL  AND
718                 nvl(p_override_retain_ato_rsv, 'N') = 'N' AND
719                 G_ATO_RSV_PROFILE    = 'Y'  AND
720                 G_CODE_RELEASE_LEVEL > '110508' ) THEN
721           NULL;  -- Don't Update or Delete the REservations if the above criteria (ATO -Unstgd. Rsvn)is met
722        ELSE
723 
724         IF l_debug_on THEN
725           WSH_DEBUG_SV.log(l_module_name,'BEFORE l_prim_rsv_qty: tbl_detailed_qty ; ',
726                                           l_rsv_tbl(I).primary_reservation_quantity ||':'||
727                                           l_rsv_tbl(I).detailed_quantity);
728 -- HW OPMCONV - Added Qty2
729           WSH_DEBUG_SV.log(l_module_name,'BEFORE l_secondary_rsv_qty: tbl_detailed_qty2 ; ',
730                                           l_rsv_tbl(I).secondary_reservation_quantity ||':'||
731                                           l_rsv_tbl(I).secondary_detailed_quantity);
732         END IF;
733 
734         -- Start with orginal primary_reservation_quantity and detailed_quantity
735         l_rsv_new_rec.primary_reservation_quantity := l_rsv_tbl(I).primary_reservation_quantity;
736         l_rsv_new_rec.detailed_quantity            := nvl(l_rsv_tbl(I).detailed_quantity,0);
737 
738 -- HW OPMCONV - Added Qty2
739         l_rsv_new_rec.secondary_reservation_quantity := l_rsv_tbl(I).secondary_reservation_quantity;
740         l_rsv_new_rec.secondary_detailed_quantity            := nvl(l_rsv_tbl(I).secondary_detailed_quantity,0);
741 
742         -- Tackle Detailed Quantity
743         IF nvl(l_rsv_tbl(I).detailed_quantity,0) <> 0  THEN
744 
745            IF (l_dtld_qty_to_unreserve > 0) THEN
746              IF (nvl(l_rsv_tbl(I).detailed_quantity,0) <= l_dtld_qty_to_unreserve) THEN
747                l_dtld_qty_to_unreserve := l_dtld_qty_to_unreserve - nvl(l_rsv_tbl(I).detailed_quantity,0);
748 -- HW OPMCONV - Added Qty2
749                l_dtld_qty2_to_unreserve := l_dtld_qty2_to_unreserve - nvl(l_rsv_tbl(I).secondary_detailed_quantity,0);
750 
751                l_rsv_new_rec.detailed_quantity := 0;
752                l_rsv_new_rec.primary_reservation_quantity := l_rsv_new_rec.primary_reservation_quantity - nvl(l_rsv_tbl(I).detailed_quantity,0);
753 -- HW OPMCONV - Added Qty2
754                l_rsv_new_rec.secondary_detailed_quantity := 0;
755                l_rsv_new_rec.secondary_reservation_quantity := l_rsv_new_rec.secondary_reservation_quantity - nvl(l_rsv_tbl(I).secondary_detailed_quantity,0);
756              ELSE
757                l_rsv_new_rec.detailed_quantity := l_rsv_new_rec.detailed_quantity - l_dtld_qty_to_unreserve;
758                l_rsv_new_rec.primary_reservation_quantity := l_rsv_new_rec.primary_reservation_quantity - l_dtld_qty_to_unreserve;
759                l_dtld_qty_to_unreserve := 0;
760 -- HW OPMCONV - Added Qty2
761                l_rsv_new_rec.secondary_detailed_quantity := l_rsv_new_rec.secondary_detailed_quantity - l_dtld_qty_to_unreserve;
762                l_rsv_new_rec.secondary_reservation_quantity := l_rsv_new_rec.secondary_reservation_quantity - l_dtld_qty2_to_unreserve;
763                l_dtld_qty2_to_unreserve := 0;
764              END IF;
765            END IF;
766 
767         END IF;
768 
769         -- Tackle Primary Reservation Quantity
770         IF (l_qty_to_unreserve > 0) THEN
771           IF ((l_rsv_new_rec.primary_reservation_quantity - l_rsv_new_rec.detailed_quantity) <= l_qty_to_unreserve) THEN
772           IF l_debug_on THEN
773           WSH_DEBUG_SV.logmsg(l_module_name, 'ONE Before calculation l_qty_to_unreserve: ' || l_qty_to_unreserve  );
774 
775        END IF;
776             l_qty_to_unreserve := l_qty_to_unreserve - (l_rsv_new_rec.primary_reservation_quantity - l_rsv_new_rec.detailed_quantity);
777 -- HW OPMCONV - Added Qty2
778             l_qty2_to_unreserve := l_qty2_to_unreserve - (l_rsv_new_rec.secondary_reservation_quantity - l_rsv_new_rec.secondary_detailed_quantity);
779              IF l_debug_on THEN
780           WSH_DEBUG_SV.logmsg(l_module_name, 'ONE After calculation l_qty_to_unreserve: ' || l_qty_to_unreserve  );
781 
782        END IF;
783 
784             l_rsv_new_rec.primary_reservation_quantity := l_rsv_new_rec.detailed_quantity;
785 -- HW OPMCONV - Added Qty2
786             l_rsv_new_rec.secondary_reservation_quantity := l_rsv_new_rec.secondary_detailed_quantity;
787           ELSE
788             l_rsv_new_rec.primary_reservation_quantity := l_rsv_new_rec.primary_reservation_quantity - l_qty_to_unreserve;
789             l_qty_to_unreserve := 0;
790 -- HW OPMCONV - Added Qty2
791             l_rsv_new_rec.secondary_reservation_quantity := l_rsv_new_rec.secondary_reservation_quantity - l_qty2_to_unreserve;
792             l_qty2_to_unreserve := 0;
793           END IF;
794         END IF;
795 
796         IF l_debug_on THEN
797           WSH_DEBUG_SV.log(l_module_name,'NEW l_prim_rsv_qty: new tbl_detailed_qty ; ',
798                                           l_rsv_new_rec.primary_reservation_quantity ||':'||
799                                           l_rsv_new_rec.detailed_quantity);
800 -- HW OPMCONV - Added Qty2
801           WSH_DEBUG_SV.log(l_module_name,'NEW l_seccondary_rsv_qty: new tbl_detailed_qty2 ; ',
802                                           l_rsv_new_rec.secondary_reservation_quantity ||':'||
803                                           l_rsv_new_rec.secondary_detailed_quantity);
804         END IF;
805 
806         IF l_debug_on THEN
807           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_RESERVATION_pub.update_resevation 1',WSH_DEBUG_SV.C_PROC_LEVEL);
808         END IF;
809 
810 -- HW OPMCONV - NULL Qty2 if they are not presents
811         IF ( (  l_rsv_new_rec.secondary_reservation_quantity = 0 OR
812               l_rsv_new_rec.secondary_reservation_quantity = FND_API.G_MISS_NUM )
813             OR ( l_rsv_new_rec.secondary_detailed_quantity = 0  OR
814                  l_rsv_new_rec.secondary_detailed_quantity = FND_API.G_MISS_NUM ) ) THEN
815                 l_rsv_new_rec.secondary_reservation_quantity := NULL;
816                 l_rsv_new_rec.secondary_detailed_quantity := NULL;
817         END IF;
818 
819 
820         IF (l_rsv_new_rec.primary_reservation_quantity > 0) THEN
821 
822 
823 
824           inv_reservation_pub.update_reservation
825              (p_api_version_number       => 1.0,
826               p_init_msg_lst            => fnd_api.g_true,
827               x_return_status           => l_return_status,
828               x_msg_count               => l_msg_count,
829               x_msg_data                => l_msg_data,
830               p_original_rsv_rec        => l_rsv_rec,
831               p_to_rsv_rec              => l_rsv_new_rec,
832               p_original_serial_number  => l_dummy_sn, -- no serial contorl
833               p_to_serial_number        => l_dummy_sn, -- no serial control
834               p_validation_flag         => fnd_api.g_true,
835 	      -- Bug 5099694
836               p_over_reservation_flag  =>3
837              );
838 
839            IF l_debug_on THEN
840              WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS UPDATE REservation 1: ' || L_RETURN_STATUS  );
841              WSH_DEBUG_SV.log(l_module_name,'l_new_prim_rsv_qty: tbl_detailed_qty ; ',
842                                              l_rsv_new_rec.primary_reservation_quantity ||':'||
843                                              l_rsv_tbl(I).detailed_quantity);
844 -- HW OPMCONV - Added Qty2
845              WSH_DEBUG_SV.log(l_module_name,'l_new_secondary_rsv_qty: tbl_detailed_qty2 ; ',
846                                              l_rsv_new_rec.secondary_reservation_quantity ||':'||
847                                              l_rsv_tbl(I).secondary_detailed_quantity);
848            END IF;
849 
850            IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
851              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
852            ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
853              RAISE FND_API.G_EXC_ERROR;
854            END IF;
855 
856          ELSE
857 
858            IF l_debug_on THEN
859              WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_RESERVATION_pub.delete_resevation 1',WSH_DEBUG_SV.C_PROC_LEVEL);
860            END IF;
861 
862            inv_reservation_pub.delete_reservation
863            ( p_api_version_number => 1.0
864            , p_init_msg_lst       => fnd_api.g_true
865            , x_return_status      => l_return_status
866            , x_msg_count          => l_msg_count
867            , x_msg_data           => l_msg_data
868            , p_rsv_rec            => l_rsv_rec
869            , p_serial_number      => l_dummy_sn
870            );
871 
872            IF l_debug_on THEN
873              WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS DELETE REservation 1: ' || L_RETURN_STATUS  );
874            END IF;
875 
876            IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
877              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
878            ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
879              RAISE FND_API.G_EXC_ERROR;
880            END IF;
881 
882          END IF;
883 
884          IF l_debug_on THEN
885            WSH_DEBUG_SV.log(l_module_name,'l_qty_to_unreserve:l_dtld_qty_to_unreserve ; ',
886                                            l_qty_to_unreserve ||':'||
887                                            l_dtld_qty_to_unreserve);
888 -- HW OPMCONV - Added Qty2
889            WSH_DEBUG_SV.log(l_module_name,'l_qty2_to_unreserve:l_dtld_qty2_to_unreserve ; ',
890                                            l_qty2_to_unreserve ||':'||
891                                            l_dtld_qty2_to_unreserve);
892          END IF;
893 
894 
895          -- muom
896          IF (l_fulfillment_base = 'P' and (l_qty_to_unreserve <= 0) AND (l_dtld_qty_to_unreserve <= 0)) OR
897             (l_fulfillment_base = 'S' and (l_qty2_to_unreserve <= 0) AND (l_dtld_qty2_to_unreserve <= 0)) THEN
898            goto end_of_loop;
899          END IF;
900 
901        END IF;  -- check ATO Profile
902 
903 -- Added 'RETAIN_RSV' for bug 4721577
904 ELSIF ( (l_cancel_rsv_type = 'S' and l_staged_flag = 'Y' and p_unreserve_mode in ( 'UNRESERVE', 'RETAIN_RSV' ) ) OR
905           (p_unreserve_mode not in ( 'UNRESERVE', 'RETAIN_RSV' ) ) ) THEN
906 
907      -- muom: We should no longer be using reservation_quantity as it will not be in primary uom always
908      IF (l_rsv_rec.primary_reservation_quantity <= l_qty_to_unreserve) THEN     -- rsv. Qty <=
909 -- Added 'RETAIN_RSV' for bug 4721577
910       IF ( NVL(p_unreserve_mode, 'UNRESERVE') in ( 'UNRESERVE', 'RETAIN_RSV' ) ) THEN
911 -- 2587777 :                 -- Ato Item and for Patchset level higher than 'H' , i.e. from 'I' onwards
912  IF ( ( ( l_line_rec.ato_line_id IS NOT NULL AND G_ATO_RSV_PROFILE = 'Y'AND nvl(p_override_retain_ato_rsv, 'N') = 'N' ) OR
913                   ( p_unreserve_mode = 'RETAIN_RSV' ) ) AND
914                 G_CODE_RELEASE_LEVEL > '110508' )
915 
916 	   THEN
917            --
918            -- Bug # 9583775 :  begin
919            -- Calling the API INV_RESERVATION_PUB.transfer_reservation instead of
920            -- just updating staged flag value. This is req. incase if there are
921            -- other reservation record which is eligible for consolidation with
922            -- the current res. record. If there is no other res. record then INV
923            -- updates the current res. record (old behavior).
924            IF l_debug_on THEN
925               WSH_DEBUG_SV.log(l_module_name,'l_staged_flag: ',l_staged_flag);
926            END IF;
927            --
928            IF ( nvl(l_staged_flag, 'N')  = 'Y') THEN
929            --{ transfer/update reservation.
930                l_rsv_new_rec                  := l_rsv_rec;
931                l_rsv_new_rec.attribute1       := l_line_rec.preferred_grade;
932                l_rsv_new_rec.attribute2       := l_line_rec.ordered_quantity2;
933                l_rsv_new_rec.attribute3       := l_line_rec.ordered_quantity_uom2;
934                l_rsv_new_rec.requirement_date := l_line_rec.date_scheduled;
935                l_rsv_new_rec.ship_ready_flag  := 2;
936                l_rsv_new_rec.staged_flag      := 'N';
937                IF ( (  l_rsv_new_rec.secondary_reservation_quantity = 0 OR
938                       l_rsv_new_rec.secondary_reservation_quantity = FND_API.G_MISS_NUM )
939                  OR ( l_rsv_new_rec.secondary_detailed_quantity = 0 OR
940                       l_rsv_new_rec.secondary_detailed_quantity = FND_API.G_MISS_NUM ) ) THEN
941                      l_rsv_new_rec.secondary_reservation_quantity := NULL;
942                      l_rsv_new_rec.secondary_detailed_quantity    := NULL;
943                END IF;
944                --
945                IF l_debug_on THEN
946                   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_RESERVATION_PUB.TRANSFER_RESERVATION',WSH_DEBUG_SV.C_PROC_LEVEL);
947                END IF;
948                --
949                INV_RESERVATION_PUB.transfer_reservation
950                 (
951                  p_api_version_number       => 1.0
952                  , p_init_msg_lst           => fnd_api.g_true
953                  , x_return_status          => l_return_status
954                  , x_msg_count              => l_msg_count
955                  , x_msg_data               => l_msg_data
956                  , p_original_rsv_rec       => l_rsv_rec
957                  , p_to_rsv_rec             => l_rsv_new_rec
958                  , p_original_serial_number => l_dummy_sn -- no serial contorl
959                  , p_to_serial_number       => l_dummy_sn -- no serial control
960                  , p_validation_flag        => fnd_api.g_true
961                  , x_to_reservation_id      => l_new_rsv_id
962                   );
963                   --
964                IF l_debug_on THEN
965                    WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS TRANSFER RESERVATION: ' || L_RETURN_STATUS  );
966                    WSH_DEBUG_SV.log(l_module_name,'New Rec: reservation id: ', l_new_rsv_id);
967                END IF;
968                --
969                IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
970                    RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
971                ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
972                    RAISE FND_API.G_EXC_ERROR;
973                END IF;
974             --} transfer/update reservation.
975             END IF;
976             --- Bug # 9583775 :  End
977           ELSE  -- Non- ATO Item
978 -- 2587777
979            --
980            IF l_debug_on THEN
981                WSH_DEBUG_SV.logmsg(l_module_name, 'CALLING INVS DELETE_RESERVATION'  );
982            END IF;
983            --
984            IF l_debug_on THEN
985                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_RESERVATION_PUB.DELETE_RESERVATION',WSH_DEBUG_SV.C_PROC_LEVEL);
986            END IF;
987            --
988 
989            inv_reservation_pub.delete_reservation
990              (p_api_version_number   => 1.0,
991               p_init_msg_lst     => fnd_api.g_true,
992               x_return_status       => l_return_status,
993               x_msg_count         => l_msg_count,
994               x_msg_data       => l_msg_data,
995               p_rsv_rec         => l_rsv_rec,
996               p_serial_number       => l_dummy_sn
997              );
998           --
999           IF l_debug_on THEN
1000             WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS DELETE_RESERVATION: ' || L_RETURN_STATUS  );
1001           END IF;
1002           --
1003 
1004           IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1005             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1006           ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
1007             RAISE FND_API.G_EXC_ERROR;
1008           END IF;
1009        END IF; -- ATO line
1010     else      -- p_unreserve_mode = 'CYCLE_COUNT'
1011       --
1012       IF l_debug_on THEN
1013         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit ONE INV_PICK_RELEASE_PUB.RESERVE_UNCONFIRMED_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
1014         WSH_DEBUG_SV.log(l_module_name, 'l_rsv_rec.reservation_quantity: '  || l_rsv_rec.reservation_quantity  );
1015         -- muom
1016         WSH_DEBUG_SV.log(l_module_name, 'l_rsv_rec.primary_reservation_quantity: '  || l_rsv_rec.primary_reservation_quantity  );
1017         WSH_DEBUG_SV.log(l_module_name, ' l_rsv_rec.reservation_quantity2: ' || l_rsv_rec.secondary_reservation_quantity  );
1018       END IF;
1019       --
1020        IF ( l_rsv_rec.secondary_reservation_quantity = 0 OR
1021             l_rsv_rec.secondary_reservation_quantity =   FND_API.G_MISS_NUM ) THEN
1022             l_rsv_rec.secondary_reservation_quantity := NULL;
1023        END IF;
1024 -- HW INVCONV - Added Qty2
1025       Inv_Pick_Release_Pub.Reserve_Unconfirmed_Quantity(
1026        p_api_version => 1.0,
1027        p_init_msg_list => FND_API.G_FALSE,
1028        p_commit => FND_API.G_FALSE,
1029        x_return_status => l_reserve_status,
1030        x_msg_count => l_reserve_msg_count,
1031        x_msg_data => l_reserve_msg_data,
1032        -- muom: We should no longer be using reservation_quantity as it will not be in primary uom always
1033        p_missing_quantity => l_rsv_rec.primary_reservation_quantity ,
1034        p_missing_quantity2 => l_rsv_rec.secondary_reservation_quantity ,
1035        p_reservation_id => l_rsv_rec.reservation_id,
1036        p_demand_source_header_id => l_sales_order_id,
1037        p_demand_source_line_id => l_line_rec.line_id,
1038        p_organization_id => l_rsv_rec.organization_id,
1039        p_inventory_item_id => l_rsv_rec.inventory_item_id,
1040        p_subinventory_code => l_rsv_rec.subinventory_code ,
1041        p_locator_id => l_rsv_rec.locator_id,
1042        p_revision => l_rsv_rec.revision,
1043        p_lot_number => l_rsv_rec.lot_number);
1044 
1045        IF ((l_reserve_status = WSH_UTIL_CORE.G_RET_STS_ERROR) or
1046         (l_reserve_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN     -- rsv.status
1047         --
1048         IF l_debug_on THEN
1049             WSH_DEBUG_SV.logmsg(l_module_name, 'RESERVE UNCONFIRMED QUANTITY FAILED'  );
1050             WSH_DEBUG_SV.logmsg(l_module_name, 'MESSAGE COUNT: '|| TO_CHAR ( L_RESERVE_MSG_COUNT )  );
1051         END IF;
1052         --
1053          IF (l_reserve_msg_count = 0)  or (l_reserve_msg_count is NULL) THEN  -- rsv.msg.count
1054           null;
1055           ELSE
1056           FOR i in 1 ..l_reserve_msg_count
1057           LOOP
1058              l_reserve_message := fnd_msg_pub.get(i,'T');
1059              l_reserve_message := replace(l_reserve_message,chr(0), ' ');
1060              --
1061              IF l_debug_on THEN
1062                  WSH_DEBUG_SV.logmsg(l_module_name,  L_RESERVE_MESSAGE  );
1063              END IF;
1064              --
1065           END LOOP;
1066          END if;   -- rsv.msg.count
1067          x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1068          --
1069          IF l_debug_on THEN
1070              WSH_DEBUG_SV.logmsg(l_module_name,  'RESERVE_UNCONFIRMED_QUANTITY FAILED.. GOING ON... '  );
1071          END IF;
1072          --
1073          END IF;
1074         end if;     -- rsv.status
1075 
1076         IF l_debug_on THEN
1077           WSH_DEBUG_SV.log(l_module_name,'l_qty_to_unreserve',
1078                             l_qty_to_unreserve);
1079           -- muom
1080           WSH_DEBUG_SV.log(l_module_name,'reservation_quantity',
1081                                          l_rsv_rec.primary_reservation_quantity);
1082         END IF;
1083         IF l_debug_on THEN
1084           WSH_DEBUG_SV.logmsg(l_module_name, 'Before calculation l_qty_to_unreserve: ' || l_qty_to_unreserve  );
1085 
1086      END IF;
1087 
1088         -- muom: We should no longer be using reservation_quantity as it will not be in primary uom always
1089         l_qty_to_unreserve := l_qty_to_unreserve -
1090                                        l_rsv_rec.primary_reservation_quantity;
1091 
1092 -- HW OPMCONV- Added Qty2
1093        l_qty2_to_unreserve := l_qty2_to_unreserve -
1094                                        l_rsv_rec.secondary_reservation_quantity;
1095        IF l_debug_on THEN
1096 
1097           WSH_DEBUG_SV.logmsg(l_module_name, 'After calculation l_qty_to_unreserve: ' || l_qty_to_unreserve  );
1098           WSH_DEBUG_SV.logmsg(l_module_name, 'After calculation l_qty2_to_unreserve: ' || l_qty2_to_unreserve  );
1099 
1100        END IF;
1101 
1102         -- muom
1103         IF (l_fulfillment_base = 'P' and l_qty_to_unreserve <= 0) OR (l_fulfillment_base = 'S' and l_qty2_to_unreserve <= 0) THEN
1104              goto end_of_loop;
1105         END IF;
1106 
1107      ELSE         --  rsv. qty >
1108 
1109        l_rsv_new_rec     := l_rsv_rec;
1110 
1111      --
1112      IF l_debug_on THEN
1113        WSH_DEBUG_SV.logmsg(l_module_name, 'OLD QTY : NEW QTY :: ' || L_RSV_REC.RESERVATION_QUANTITY
1114                                            ||': '|| L_RSV_NEW_REC.RESERVATION_QUANTITY  );
1115 
1116        WSH_DEBUG_SV.logmsg(l_module_name, 'OLD PRIM QTY : NEW PRIM QTY :: ' || L_RSV_REC.PRIMARY_RESERVATION_QUANTITY
1117                                            ||': '|| L_RSV_NEW_REC.PRIMARY_RESERVATION_QUANTITY );
1118 
1119 -- HW OPMCONV - Added Qty2
1120        WSH_DEBUG_SV.logmsg(l_module_name, 'OLD QTY2 : NEW QTY2 :: ' || L_RSV_REC.SECONDARY_RESERVATION_QUANTITY
1121                                            ||': '|| L_RSV_NEW_REC.SECONDARY_RESERVATION_QUANTITY  );
1122      END IF;
1123      --
1124      l_rsv_new_rec.attribute1  := l_line_rec.preferred_grade;
1125      l_rsv_new_rec.attribute2  := l_line_rec.ordered_quantity2;
1126      l_rsv_new_rec.attribute3  := l_line_rec.ordered_quantity_uom2;
1127 
1128 -- Added 'RETAIN_RSV' for bug 4721577
1129                 if ( NVL(p_unreserve_mode,'UNRESERVE') in ( 'RETAIN_RSV', 'UNRESERVE' ) ) then
1130  -- 2587777               -- Ato Item  and Patchset level higher than 'H', i.e. from 'I' onwards
1131          IF ( ( ( l_line_rec.ato_line_id IS NOT NULL      AND
1132                          G_ATO_RSV_PROFILE  = 'Y'     AND
1133                  nvl(p_override_retain_ato_rsv, 'N') = 'N' ) OR
1134                  ( p_unreserve_mode = 'RETAIN_RSV' ) ) AND
1135                            G_CODE_RELEASE_LEVEL > '110508' ) THEN
1136 
1137            --   transfer reservation for ATOs
1138            --   2747520: At this point, it is assumed that the Rsv. records are Staged Only (filtered above) and
1139            --    the detailed_qty. for such staged recs. will be always 0
1140 
1141            -- muom: We should no longer be using reservation_quantity as it will not be in primary uom always
1142            --l_rsv_new_rec.reservation_quantity         := l_qty_to_unreserve ;
1143            l_rsv_new_rec.primary_reservation_quantity := l_qty_to_unreserve ;
1144 -- HW OPMCONV- Added Qty2
1145            l_rsv_new_rec.secondary_reservation_quantity := l_qty2_to_unreserve ;
1146            l_rsv_new_rec.detailed_quantity            := least(nvl(l_rsv_rec.detailed_quantity, 0), l_qty_to_unreserve);
1147 -- HW OPMCONV- Added Qty2
1148            l_rsv_new_rec.secondary_detailed_quantity  := least(nvl(l_rsv_rec.secondary_detailed_quantity, 0), l_qty2_to_unreserve);
1149 -- 2847687 : after discussion with INV the Req.date will now be passed on as date_sched instead of sysdate
1150            l_rsv_new_rec.requirement_date             := l_line_rec.date_scheduled;
1151            l_rsv_new_rec.ship_ready_flag              := 2;
1152            -- BUG # 9583775: Pass staged flag as 'N' to match and consolidate
1153            --                with the other reservation records.
1154            --                Removed the code which queries and updates staged flag to 'N'
1155            l_rsv_new_rec.staged_flag                  := 'N';
1156 -- R12, X-dock
1157            l_rsv_new_rec.demand_source_line_detail   := null;
1158 
1159             --
1160             IF l_debug_on THEN
1161               WSH_DEBUG_SV.logmsg(l_module_name, 'NEW Split Record QTY : Dtld QTY :: ' ||
1162                                                    L_RSV_NEW_REC.PRIMARY_RESERVATION_QUANTITY ||': '||
1163                                                    L_RSV_NEW_REC.DETAILED_QUANTITY  );
1164 -- HW OPMCONV - Added Qty2
1165               WSH_DEBUG_SV.logmsg(l_module_name, 'NEW Split Record QTY2 : Dtld QTY2 :: ' ||
1166                                                    L_RSV_NEW_REC.SECONDARY_RESERVATION_QUANTITY ||': '||
1167                                                    L_RSV_NEW_REC.SECONDARY_DETAILED_QUANTITY  );
1168             END IF;
1169             --
1170             IF l_debug_on THEN
1171               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_RESERVATION_PUB.TRANSFER_RESERVATION',WSH_DEBUG_SV.C_PROC_LEVEL);
1172             END IF;
1173             --
1174             --
1175 
1176 -- HW OPMCONV - NULL Qty2 if they are not presents
1177         IF ( (  l_rsv_new_rec.secondary_reservation_quantity = 0 OR
1178               l_rsv_new_rec.secondary_reservation_quantity = FND_API.G_MISS_NUM )
1179             OR ( l_rsv_new_rec.secondary_detailed_quantity = 0 OR
1180                  l_rsv_new_rec.secondary_detailed_quantity = FND_API.G_MISS_NUM ) ) THEN
1181                 l_rsv_new_rec.secondary_reservation_quantity := NULL;
1182                 l_rsv_new_rec.secondary_detailed_quantity := NULL;
1183         END IF;
1184 
1185 
1186           INV_RESERVATION_PUB.transfer_reservation
1187               (p_api_version_number     => 1.0,
1188                p_init_msg_lst           => fnd_api.g_true,
1189                x_return_status          => l_return_status,
1190                x_msg_count              => l_msg_count,
1191                x_msg_data               => l_msg_data,
1192                p_original_rsv_rec       => l_rsv_rec,
1193                p_to_rsv_rec             => l_rsv_new_rec,
1194                p_original_serial_number => l_dummy_sn, -- no serial contorl
1195                p_to_serial_number       => l_dummy_sn, -- no serial control
1196                p_validation_flag        => fnd_api.g_true,
1197 	       -- Bug 5099694
1198                p_over_reservation_flag  =>3,
1199                x_to_reservation_id      => l_new_rsv_id
1200               );
1201               --
1202               IF l_debug_on THEN
1203                WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS TRANSFER RESERVATION: ' || L_RETURN_STATUS  );
1204                WSH_DEBUG_SV.log(l_module_name,'New Rec: reservation id: ', l_new_rsv_id);
1205               END IF;
1206               --
1207 
1208               IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1209                  RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1210               ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
1211                  RAISE FND_API.G_EXC_ERROR;
1212               END IF;
1213 
1214            ELSE  -- (i.e. Not an ATO )
1215 -- 2587777
1216    IF l_debug_on THEN
1217           WSH_DEBUG_SV.logmsg(l_module_name, 'TWO Before calculation l_qty_to_unreserve: ' || l_qty_to_unreserve  );
1218           WSH_DEBUG_SV.logmsg(l_module_name, 'TWO Before calculation _rsv_new_rec.primary_reservation_quantity: ' || l_rsv_new_rec.primary_reservation_quantity  );
1219 
1220        END IF;
1221 
1222             --l_rsv_new_rec.reservation_quantity :=  l_rsv_rec.reservation_quantity - l_qty_to_unreserve ;   --commented bug 14149784
1223 -- HW OPMCONV - Added Qty2
1224             l_rsv_new_rec.primary_reservation_quantity := l_rsv_rec.primary_reservation_quantity - l_qty_to_unreserve ; --added bug 14149784
1225             l_rsv_new_rec.secondary_reservation_quantity :=  l_rsv_rec.secondary_reservation_quantity - l_qty2_to_unreserve ;
1226             IF l_debug_on THEN
1227                 WSH_DEBUG_SV.logmsg(l_module_name, 'ONE After calculation l_rsv_new_rec.reservation_quantity: ' || l_rsv_new_rec.reservation_quantity  );
1228                 WSH_DEBUG_SV.logmsg(l_module_name, 'ONE After calculation l_rsv_new_rec.secondary_reservation_quantity: ' || l_rsv_new_rec.secondary_reservation_quantity  );
1229                 WSH_DEBUG_SV.logmsg(l_module_name, 'TWO Before calculation ll_rsv_new_rec.primary_reservation_quantity: ' || l_rsv_new_rec.primary_reservation_quantity );
1230                 WSH_DEBUG_SV.logmsg(l_module_name, 'TWO Before calculation l_rsv_rec.reservation_quantity: ' || l_rsv_rec.reservation_quantity );
1231 -- HW OPMCONV - Added Qty2
1232                 WSH_DEBUG_SV.logmsg(l_module_name, 'TWO Before calculation ll_rsv_new_rec.secondary_reservation_quantity: ' || l_rsv_new_rec.secondary_reservation_quantity );
1233                 WSH_DEBUG_SV.logmsg(l_module_name, 'TWO Before calculation l_rsv_rec.secondary_reservation_quantity: ' || l_rsv_rec.secondary_reservation_quantity );
1234 
1235             END IF;
1236 
1237             --l_rsv_new_rec.primary_reservation_quantity := l_rsv_rec.reservation_quantity - l_qty_to_unreserve ;  --commented  bug 14149784
1238 -- HW OPMCONV - Added Qty2
1239             --l_rsv_new_rec.secondary_reservation_quantity := l_rsv_rec.secondary_reservation_quantity - l_qty2_to_unreserve ;--commented  bug 14149784 redundant code
1240 
1241             IF l_debug_on THEN
1242               WSH_DEBUG_SV.logmsg(l_module_name, 'TWO After calculation ll_rsv_new_rec.primary_reservation_quantity: ' || l_rsv_new_rec.primary_reservation_quantity );
1243               WSH_DEBUG_SV.logmsg(l_module_name, 'TWO After calculation ll_rsv_new_rec.secondary_reservation_quantity: ' || l_rsv_new_rec.secondary_reservation_quantity );
1244             END IF;
1245 
1246            --
1247            IF l_debug_on THEN
1248                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_RESERVATION_PUB.UPDATE_RESERVATION',WSH_DEBUG_SV.C_PROC_LEVEL);
1249            END IF;
1250            --
1251            -- HW OPMCONV - NULL Qty2 if they are not presents
1252         IF (  l_rsv_new_rec.secondary_reservation_quantity = 0  OR
1253               l_rsv_new_rec.secondary_reservation_quantity = FND_API.G_MISS_NUM ) THEN
1254 
1255             l_rsv_new_rec.secondary_reservation_quantity := NULL;
1256 
1257         END IF;
1258 
1259            inv_reservation_pub.update_reservation
1260              (p_api_version_number     => 1.0,
1261               p_init_msg_lst           => fnd_api.g_true,
1262               x_return_status          => l_return_status,
1263               x_msg_count              => l_msg_count,
1264               x_msg_data               => l_msg_data,
1265               p_original_rsv_rec       => l_rsv_rec,
1266               p_to_rsv_rec             => l_rsv_new_rec,
1267               p_original_serial_number => l_dummy_sn, -- no serial contorl
1268               p_to_serial_number       => l_dummy_sn, -- no serial control
1269               p_validation_flag        => fnd_api.g_true,
1270 	     -- Bug 5099694
1271               p_over_reservation_flag  =>3
1272              );
1273            --
1274            IF l_debug_on THEN
1275                WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS UPDATE_RESERVATION: ' || L_RETURN_STATUS  );
1276            END IF;
1277            --
1278            IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN   -- UnExp Erro
1279             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1280            ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN    -- STS Error
1281             IF l_msg_data is not null THEN     -- msg.data not null
1282               fnd_message.set_encoded(l_msg_data);
1283               l_buffer := fnd_message.get;
1284              --
1285              IF l_debug_on THEN
1286                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit OE_MSG_PUB.ADD_TEXT',WSH_DEBUG_SV.C_PROC_LEVEL);
1287              END IF;
1288              --
1289              oe_msg_pub.add_text(p_message_text => l_buffer);
1290              --
1291              IF l_debug_on THEN
1292                  WSH_DEBUG_SV.logmsg(l_module_name, 'ERROR : '|| L_BUFFER  );
1293              END IF;
1294              --
1295             END IF;    -- msg.data not null
1296             RAISE FND_API.G_EXC_ERROR;
1297            END IF;      --  UnExp Error
1298         END IF;     -- (if ATO ..)
1299     else  -- p_unreserve_mode = 'CYCLE_COUNT'
1300       --
1301       IF l_debug_on THEN
1302           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit TWO INV_PICK_RELEASE_PUB.RESERVE_UNCONFIRMED_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
1303           WSH_DEBUG_SV.log(l_module_name, 'p_missing_quantity: ' || l_qty_to_unreserve  );
1304           WSH_DEBUG_SV.log(l_module_name, 'p_missing_quantity2: '|| l_qty2_to_unreserve  );
1305 
1306       END IF;
1307       --
1308 
1309       IF ( l_qty2_to_unreserve = 0 or l_qty2_to_unreserve = FND_API.G_MISS_NUM) THEN
1310           l_qty2_to_unreserve := NULL;
1311       END IF;
1312 
1313       Inv_Pick_Release_Pub.Reserve_Unconfirmed_Quantity(
1314        p_api_version => 1.0,
1315        p_init_msg_list => FND_API.G_FALSE,
1316        p_commit => FND_API.G_FALSE,
1317        x_return_status => l_reserve_status,
1318        x_msg_count => l_reserve_msg_count,
1319        x_msg_data => l_reserve_msg_data,
1320        p_missing_quantity => l_qty_to_unreserve ,
1321        p_missing_quantity2 => l_qty2_to_unreserve ,
1322        p_reservation_id => l_rsv_rec.reservation_id ,
1323        p_demand_source_header_id => l_sales_order_id,
1324        p_demand_source_line_id => l_line_rec.line_id,
1325        p_organization_id => l_rsv_rec.organization_id,
1326        p_inventory_item_id => l_rsv_rec.inventory_item_id,
1327        p_subinventory_code => l_rsv_rec.subinventory_code ,
1328        p_locator_id => l_rsv_rec.locator_id,
1329        p_revision => l_rsv_rec.revision,
1330        p_lot_number => l_rsv_rec.lot_number);
1331      IF ((l_reserve_status = WSH_UTIL_CORE.G_RET_STS_ERROR) or
1332       (l_reserve_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN   -- Sts or UnExp. Error
1333       --
1334       IF l_debug_on THEN
1335           WSH_DEBUG_SV.logmsg(l_module_name,  'RESERVE UNCONFIRMED QUANTITY FAILED'  );
1336       END IF;
1337       --
1338       --
1339       IF l_debug_on THEN
1340           WSH_DEBUG_SV.logmsg(l_module_name,  'MESSAGE COUNT: '|| TO_CHAR ( L_RESERVE_MSG_COUNT )  );
1341       END IF;
1342       --
1343        IF (l_reserve_msg_count = 0)  or (l_reserve_msg_count is NULL) THEN   -- Msg. Count
1344         null;
1345        ELSE
1346         FOR i in 1 ..l_reserve_msg_count
1347         LOOP
1348          l_reserve_message := fnd_msg_pub.get(i,'T');
1349          l_reserve_message := replace(l_reserve_message,chr(0), ' ');
1350          --
1351          IF l_debug_on THEN
1352              WSH_DEBUG_SV.logmsg(l_module_name,  L_RESERVE_MESSAGE  );
1353          END IF;
1354          --
1355         END LOOP;
1356        END if;     -- If Msg. Count
1357       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1358       --
1359       IF l_debug_on THEN
1360           WSH_DEBUG_SV.logmsg(l_module_name,  'RESERVE_UNCONFIRMED_QUANTITY FAILED.. GOING ON... '  );
1361       END IF;
1362       --
1363      END IF;   -- Sts or UnExp. Error
1364     END IF;    -- UnReserve Mode
1365     goto end_of_loop; -- Bug 2100800: Get out of the loop as there should be nothing more to unreserve.
1366    END IF;          -- Staged and  Cycle-Count
1367   END IF;  --  2747520: Cancel Unstaged
1368  END LOOP;
1369  null;
1370 
1371 -- HW OPMCONV - Removed brnaching the code
1372 
1373  <<end_of_loop>>
1374 
1375   --
1376   IF l_debug_on THEN
1377       WSH_DEBUG_SV.logmsg(l_module_name, 'EXITING UNRESERVE_DELIVERY_DETAIL '  );
1378   END IF;
1379   --
1380 
1381 --
1382 IF l_debug_on THEN
1383     WSH_DEBUG_SV.pop(l_module_name);
1384 END IF;
1385 --
1386 EXCEPTION
1387   -- bug 2442178: added expected exceptions to appropriately set return status
1388   WHEN FND_API.G_EXC_ERROR THEN
1389     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1390     --
1391     IF l_debug_on THEN
1392       WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1393       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
1394     END IF;
1395     --
1396     return;
1397   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1398     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1399     --
1400     IF l_debug_on THEN
1401       WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_UNEXPECTED_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1402       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
1403     END IF;
1404     --
1405     return;
1406 
1407   WHEN OTHERS THEN
1408     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1409     wsh_util_core.default_handler('WSH_NEW_DELIVERY_ACTIONS.UNRESERVE_DELIVERY_DETAIL',l_module_name);
1410     --
1411     IF l_debug_on THEN
1412       WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
1413       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
1414     END IF;
1415     --
1416 END Unreserve_delivery_detail ;
1417 
1418 
1419 --
1420 --Procedure:      Assign_Detail_to_Delivery
1421 --Parameters:      p_detail_id,
1422 --           p_delivery_id,
1423 --           x_return_status
1424 --           x_dlvy_has_lines : 'Y' :delivery has non-container lines.
1425 --                              'N' : delivery does not have non-container lines
1426 --           x_dlvy_freight_Terms_code : Delivery's freight term code
1427 --Description:      This procedure will assign the specified
1428 --           delivery_detail to the specIFied delivery
1429 --           and return the status
1430 
1431 PROCEDURE Assign_Detail_to_Delivery(
1432    P_DETAIL_ID     IN number,
1433    P_DELIVERY_ID     IN number,
1434    X_RETURN_STATUS    OUT NOCOPY  varchar2,
1435     x_dlvy_has_lines          IN OUT NOCOPY VARCHAR2,    -- J-IB-NPARIKH
1436     x_dlvy_freight_terms_code IN OUT NOCOPY VARCHAR2, -- J-IB-NPARIKH
1437     p_caller        IN VARCHAR2 --bug 5100229
1438    ) IS
1439 
1440 CURSOR c_topmost_container IS
1441 SELECT  delivery_detail_id
1442 FROM  wsh_delivery_assignments_v
1443 WHERE parent_delivery_detail_id is null
1444 START WITH delivery_detail_id =p_detail_id
1445 CONNECT BY prior parent_delivery_detail_id = delivery_detail_id
1446 and rownum < 10;
1447 --restricting to 10 levels (performance)
1448 
1449 -- /== Workflow Changes
1450 --WF: CMR
1451 CURSOR c_get_del_lines_count(p_delv_id NUMBER) IS
1452 SELECT 1
1453   FROM dual
1454  WHERE EXISTS
1455      ( SELECT 'x'
1456          FROM wsh_delivery_assignments  wda
1457             , wsh_delivery_details      wdd
1458         WHERE wda.delivery_id = p_delv_id
1459           AND (wda.type IN ('S', 'O') OR
1460                wda.type IS NULL)
1461           AND wda.delivery_detail_id = wdd.delivery_detail_id
1462           AND wdd.container_flag = 'N'
1463      );
1464 
1465 CURSOR c_get_picked_lines_count(p_delv_id NUMBER) IS
1466 SELECT 1
1467   FROM dual
1468  WHERE EXISTS
1469      ( SELECT 'x'
1470          FROM wsh_delivery_assignments  wda
1471             , wsh_delivery_details      wdd
1472         WHERE wda.delivery_id = p_delv_id
1473           AND (wda.type IN ('S', 'O') OR
1474                wda.type IS NULL)
1475           AND wda.delivery_detail_id = wdd.delivery_detail_id
1476           AND wdd.container_flag = 'N'
1477           AND wdd.pickable_flag = 'Y'
1478           AND wdd.released_status NOT IN ('R','X','N')
1479      );
1480 
1481 CURSOR c_get_org_id ( p_delv_id NUMBER) IS
1482  SELECT organization_id
1483  FROM wsh_new_deliveries
1484  WHERE delivery_id=p_delv_id;
1485 
1486 l_org_id NUMBER;
1487 l_del_lines_count NUMBER;
1488 l_process_started VARCHAR2(1);
1489 l_return_status VARCHAR2(1);
1490 l_wf_rs VARCHAR2(1);
1491 l_start_wf BOOLEAN;
1492 l_raise_pickinitiated_event BOOLEAN;
1493 l_count_picked_lines Number;
1494 l_del_entity_ids WSH_UTIL_CORE.column_tab_type;
1495 l_purged_count    NUMBER;
1496 --WF: CMR
1497 l_raise_carrierselect_event BOOLEAN;
1498 l_del_ids WSH_UTIL_CORE.ID_tab_type;
1499 l_del_old_carrier_ids WSH_UTIL_CORE.ID_tab_type;
1500 -- Workflow Changes ==/
1501 
1502 
1503 l_topmost_delivery_detail_id NUMBER;
1504 
1505 assign_fail exception;
1506 
1507 --
1508 l_debug_on BOOLEAN;
1509 --
1510 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'ASSIGN_DETAIL_TO_DELIVERY';
1511 --
1512 BEGIN
1513   --
1514   --
1515   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
1516   --
1517   IF l_debug_on IS NULL
1518   THEN
1519       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
1520   END IF;
1521   --
1522   IF l_debug_on THEN
1523       WSH_DEBUG_SV.push(l_module_name);
1524       --
1525       WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
1526       WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
1527         WSH_DEBUG_SV.log(l_module_name,'x_dlvy_has_lines',x_dlvy_has_lines);
1528         WSH_DEBUG_SV.log(l_module_name,'x_dlvy_freight_terms_code',x_dlvy_freight_terms_code);
1529   END IF;
1530   --
1531   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1532 
1533   /* if detail is not assigned to a container, update WDA. else find topmost container
1534   in the hierarchy (this can be a detail in case of loose details), iterate thru each
1535     level and assign each level to delivery any error in any level => rollback changes*/
1536 
1537   SAVEPOINT before_assign_topmost_cont;
1538   OPEN  c_topmost_container;
1539   FETCH   c_topmost_container INTO l_topmost_delivery_detail_id;
1540   IF    (c_topmost_container%FOUND)  THEN
1541 
1542      --/== Workflow Changes
1543      l_start_wf :=FALSE;
1544      l_raise_pickinitiated_event :=FALSE;
1545 
1546      OPEN c_get_del_lines_count(p_delivery_id);
1547      FETCH c_get_del_lines_count INTO l_del_lines_count;
1548      CLOSE c_get_del_lines_count;
1549      l_del_lines_count := NVL(l_del_lines_count,0);
1550 
1551      OPEN c_get_picked_lines_count(p_delivery_id);
1552      FETCH c_get_picked_lines_count INTO l_count_picked_lines;
1553      CLOSE c_get_picked_lines_count;
1554      l_count_picked_lines := NVL(l_count_picked_lines,0);
1555 
1556      IF (l_del_lines_count = 0) THEN
1557 	 l_start_wf := TRUE;
1558 	 l_raise_pickinitiated_event :=TRUE;
1559 	 --WF: CMR CURRENTLY NOT IN USE
1560 	 --l_raise_carrierselect_event :=TRUE;
1561      ELSIF (l_count_picked_lines =0) THEN
1562 	l_raise_pickinitiated_event :=TRUE;
1563      END IF;
1564      -- Workflow Changes ==/
1565      --
1566      IF l_debug_on THEN
1567          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_TOP_DETAIL_TO_DELIVERY',WSH_DEBUG_SV.C_PROC_LEVEL);
1568      END IF;
1569      --
1570 
1571      wsh_delivery_details_actions.assign_top_detail_to_delivery(
1572         P_DETAIL_ID => l_topmost_delivery_detail_id,
1573         P_DELIVERY_ID => p_delivery_id,
1574         X_RETURN_STATUS => x_return_status,
1575         x_dlvy_has_lines          => x_dlvy_has_lines,   -- J-IB-NPARIKH
1576         x_dlvy_freight_terms_code => x_dlvy_freight_terms_code,     -- J-IB-NPARIKHS
1577         p_caller         => p_caller --bug 5100229
1578             );
1579 
1580     IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS ) THEN
1581       RAISE assign_fail;
1582     END IF;
1583 
1584      --/==  Workflow Changes
1585      IF (l_start_wf OR l_raise_pickinitiated_event ) THEN
1586              OPEN c_get_del_lines_count(p_delivery_id);
1587              FETCH c_get_del_lines_count INTO l_del_lines_count;
1588              CLOSE c_get_del_lines_count;
1589              l_del_lines_count := NVL(l_del_lines_count,0);
1590 
1591              OPEN c_get_picked_lines_count(p_delivery_id);
1592              FETCH c_get_picked_lines_count INTO l_count_picked_lines;
1593              CLOSE c_get_picked_lines_count;
1594              l_count_picked_lines := NVL(l_count_picked_lines,0);
1595 
1596 	     OPEN c_get_org_id ( p_delivery_id );
1597 	     FETCH c_get_org_id INTO l_org_id;
1598 	     CLOSE c_get_org_id;
1599      END IF;
1600 
1601      IF ( l_start_wf AND l_del_lines_count > 0 )THEN
1602 	-- Check for existing WF process and if it exists Call Purge Workflow
1603 	-- After Purge, start a new workflow Process.
1604 	-- Purging is required since a New Delivery Workflow will be selected according
1605 	-- to the Delivery Detail Assigned to it
1606 	IF l_debug_on THEN
1607 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WF_STD.CHECK_WF_EXISTS',WSH_DEBUG_SV.C_PROC_LEVEL);
1608 	END IF;
1609 	WSH_WF_STD. Check_Wf_Exists(
1610 						p_entity_type => 'DELIVERY',
1611 						p_entity_id => p_delivery_id,
1612 						x_wf_process_exists => l_process_started,
1613 						x_return_status => l_return_status);
1614 	IF l_debug_on THEN
1615 			WSH_DEBUG_SV.log(l_module_name,'L_PROCESS_STARTED',l_process_started);
1616 			WSH_DEBUG_SV.log(l_module_name,'L_RETURN_STATUS',l_return_status);
1617 	END IF;
1618 
1619 	IF(l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS AND l_process_started='Y' ) THEN
1620 		IF l_debug_on THEN
1621 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WF_STD.PURGE_ENTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
1622 		END IF;
1623 		l_del_entity_ids(1) := p_delivery_id;
1624 		WSH_WF_STD.Purge_Entity(
1625 			p_entity_type => 'DELIVERY',
1626 			p_entity_ids  => l_del_entity_ids,
1627 			x_success_count  => l_purged_count,
1628 			x_return_status => l_return_status);
1629 		IF l_debug_on THEN
1630 			WSH_DEBUG_SV.log(l_module_name,'L_PURGED_COUNT',l_purged_count);
1631 			WSH_DEBUG_SV.log(l_module_name,'L_RETURN_STATUS',l_return_status);
1632 		END IF;
1633 	 END IF;	-- If WorkFlow Exists
1634 
1635 	 IF(l_return_status=WSH_UTIL_CORE.G_RET_STS_SUCCESS ) THEN
1636 		IF l_debug_on THEN
1637 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WF_STD.START_WF_PROCESS',WSH_DEBUG_SV.C_PROC_LEVEL);
1638 		END IF;
1639 
1640 		 WSH_WF_STD.start_wf_process(
1641 								p_entity_type		=> 'DELIVERY',
1642 								p_entity_id		=> p_delivery_id,
1643 								p_organization_id	=>l_org_id,
1644 								x_process_started	=>l_process_started,
1645 								x_return_status	=>l_return_status
1646 								 );
1647 		 IF l_debug_on THEN
1648 			WSH_DEBUG_SV.log(l_module_name,'L_PROCESS_STARTED',l_process_started);
1649 			WSH_DEBUG_SV.log(l_module_name,'L_RETURN_STATUS',l_return_status);
1650 		 END IF;
1651 	 END IF;
1652 
1653      END IF;-- If Start Workflow
1654 
1655      --Raise Event: Pick To Pod Workflow
1656      IF ( l_raise_pickinitiated_event AND  l_count_picked_lines > 0 ) THEN
1657 		IF l_debug_on THEN
1658 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WF_STD.RAISE_EVENT',WSH_DEBUG_SV.C_PROC_LEVEL);
1659 		END IF;
1660 		WSH_WF_STD.Raise_Event(
1661 					p_entity_type => 'DELIVERY',
1662 					p_entity_id =>  p_delivery_id,
1663 					p_event => 'oracle.apps.wsh.delivery.pik.pickinitiated' ,
1664 					p_organization_id =>  l_org_id,
1665 					x_return_status => l_wf_rs ) ;
1666 		 IF l_debug_on THEN
1667 		     WSH_DEBUG_SV.log(l_module_name,'Delivery ID is  ',  p_delivery_id );
1668 		     WSH_DEBUG_SV.log(l_module_name,'Return Status After Calling WSH_WF_STD.Raise_Event',l_wf_rs);
1669 		 END IF;
1670      END IF;
1671      -- Done Raise Event: Pick To Pod Workflow
1672      /* CURRENTLY NOT IN USE
1673      --WF: CMR
1674      IF (l_raise_carrierselect_event) THEN
1675        l_del_ids(1) := p_delivery_id;
1676        WSH_WF_STD.Get_Carrier(p_del_ids => l_del_ids,
1677                               x_del_old_carrier_ids => l_del_old_carrier_ids,
1678                               x_return_status => l_wf_rs);
1679 
1680        IF (l_del_old_carrier_ids(1) IS NOT NULL) THEN
1681 
1682          WSH_WF_STD.Assign_Unassign_Carrier(p_delivery_id => l_del_ids(1),
1683                                             p_old_carrier_id => NULL,
1684                                             p_new_carrier_id => l_del_old_carrier_ids(1),
1685                                             x_return_status => l_wf_rs);
1686        END IF;
1687 
1688      END IF;
1689      */
1690      -- Workflow Changes ==/
1691 
1692   END IF;--for topmost container
1693   CLOSE  c_topmost_container;
1694   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1695   --
1696   IF l_debug_on THEN
1697       WSH_DEBUG_SV.pop(l_module_name);
1698   END IF;
1699   --
1700   return;
1701   --
1702   exception
1703     WHEN assign_fail THEN
1704       ROLLBACK TO before_assign_topmost_cont;
1705       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1706       wsh_util_core.add_message(x_return_status,l_module_name);
1707       --
1708       IF l_debug_on THEN
1709           WSH_DEBUG_SV.logmsg(l_module_name,'ASSIGN_FAIL exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1710           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:ASSIGN_FAIL');
1711       END IF;
1712       --
1713     WHEN others THEN
1714       ROLLBACK TO before_assign_topmost_cont;
1715       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1716       wsh_util_core.add_message(x_return_status,l_module_name);
1717       wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_DELIVERY_DETAIL',l_module_name);
1718 
1719 --
1720 IF l_debug_on THEN
1721     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
1722     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
1723 END IF;
1724 --
1725 END Assign_Detail_to_Delivery;
1726 
1727 -------------------------------------------------------------------
1728 -- This procedure is only for backward compatibility. No one should call
1729 -- this procedure.
1730 -------------------------------------------------------------------
1731 
1732 PROCEDURE Assign_Detail_to_Delivery(
1733     P_DETAIL_ID     IN NUMBER,
1734     P_DELIVERY_ID   IN NUMBER,
1735     X_RETURN_STATUS OUT NOCOPY  VARCHAR2,
1736     p_caller        IN VARCHAR2 --bug 5100229
1737     ) IS
1738 
1739 --
1740 l_debug_on BOOLEAN;
1741 --
1742 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'Assign_Detail_to_Delivery';
1743 --
1744 l_has_lines               VARCHAR2(1);
1745 l_dlvy_freight_terms_code VARCHAR2(30);
1746 --
1747 BEGIN
1748     --
1749     --
1750     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
1751     --
1752     IF l_debug_on IS NULL
1753     THEN
1754         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
1755     END IF;
1756     --
1757     IF l_debug_on THEN
1758         WSH_DEBUG_SV.push(l_module_name);
1759         --
1760         WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
1761         WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
1762     END IF;
1763     --
1764     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1765     --
1766     l_has_lines := WSH_DELIVERY_VALIDATIONS.has_lines
1767                         (
1768                             p_delivery_id => p_delivery_id
1769                         );
1770     --
1771     Assign_Detail_to_Delivery
1772         (
1773             p_detail_id               => p_detail_id,
1774             p_delivery_id             => p_delivery_id,
1775             X_RETURN_STATUS           => X_RETURN_STATUS,
1776             x_dlvy_has_lines          => l_has_lines,
1777             x_dlvy_freight_Terms_code => l_dlvy_freight_Terms_code,
1778             p_caller                  => p_caller --bug 5100229
1779         );
1780     --
1781     IF l_debug_on THEN
1782         WSH_DEBUG_SV.pop(l_module_name);
1783     END IF;
1784     --
1785 EXCEPTION
1786     WHEN others THEN
1787         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1788         wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.Assign_Detail_to_Delivery',l_module_name);
1789         --
1790         IF l_debug_on THEN
1791             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
1792         END IF;
1793 END Assign_Detail_to_Delivery;
1794 
1795 -- OTM R12 : assign delivery detail
1796 
1797 --========================================================================
1798 -- PROCEDURE : Pre_Otm_Assign_Del_Detail
1799 --
1800 --             API added for R12 Glog Integration
1801 --
1802 -- PURPOSE :   To check whether the delivery was empty(no actual details)
1803 --             before any delivery_detail is assigned.  Also checks if
1804 --             if detail and containers are already on the same delivery
1805 --
1806 -- PARAMETERS:
1807 --     p_delivery_id         delivery id
1808 --     p_detail_id           delivery detail id
1809 --     p_container1_id       container 1's id
1810 --     p_container2_id       container 2's id
1811 --     p_assignment_type     assignment types can be DD2D, DD2C, C2C.
1812 --                           this covers detail to delivery, detail to container,
1813 --                           container to container, and container to delivery will
1814 --                           be same as DD2D.
1815 --     x_delivery_was_empty  TRUE if it was empty, FALSE if it was not empty
1816 --     x_tms_update          TRUE if tms update needed, FALSE if detail and
1817 --                           containers already on the same delivery
1818 --     x_gross_weight1       the gross weight of the detail or container getting assigned
1819 --     x_gross_weight2       the gross weight of the container being assigned to.
1820 --     x_return status       SUCCESS or ERROR
1821 --========================================================================
1822 
1823 
1824 PROCEDURE Pre_Otm_Assign_Del_Detail
1825                     (p_delivery_id        IN         NUMBER,
1826                      p_detail_id          IN         NUMBER,
1827                      p_container1_id      IN         NUMBER,
1828                      p_container2_id      IN         NUMBER,
1829                      p_assignment_type    IN         VARCHAR2,
1830                      x_delivery_was_empty OUT NOCOPY BOOLEAN,
1831                      x_assign_update      OUT NOCOPY BOOLEAN,
1832                      x_gross_weight1      OUT NOCOPY NUMBER,
1833                      x_gross_weight2      OUT NOCOPY NUMBER,
1834                      x_return_status      OUT NOCOPY VARCHAR2) IS
1835 
1836   CURSOR c_get_delivery_id(p_id IN NUMBER) IS
1837     SELECT delivery_id
1838     FROM   wsh_delivery_assignments
1839     WHERE  delivery_detail_id = p_id;
1840 
1841   CURSOR c_get_gross_weight (p_id NUMBER) IS
1842     SELECT nvl(gross_weight, 0)
1843     FROM   wsh_delivery_details
1844     WHERE  delivery_detail_id = p_id;
1845 
1846   l_is_delivery_empty    VARCHAR2(1);
1847   l_delivery1            NUMBER;
1848   l_delivery2            NUMBER;
1849   l_debug_on             BOOLEAN;
1850   l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.'||G_PACKAGE_NAME||'.'||'Pre_Otm_Assign_Del_Detail';
1851 
1852 
1853 BEGIN
1854 
1855   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
1856   --
1857   IF l_debug_on IS NULL
1858   THEN
1859       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
1860   END IF;
1861   --
1862   IF l_debug_on THEN
1863       WSH_DEBUG_SV.push(l_module_name);
1864       WSH_DEBUG_SV.log(l_module_name, 'P_DELIVERY_ID', p_delivery_id);
1865       WSH_DEBUG_SV.log(l_module_name, 'P_DETAIL_ID', p_detail_id);
1866       WSH_DEBUG_SV.log(l_module_name, 'P_CONTAINER1_ID', p_container1_id);
1867       WSH_DEBUG_SV.log(l_module_name, 'P_CONTAINER2_ID', p_container2_id);
1868       WSH_DEBUG_SV.log(l_module_name, 'P_ASSIGNMENT_TYPE', p_assignment_type);
1869   END IF;
1870 
1871   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1872   x_delivery_was_empty := FALSE;
1873   x_assign_update := TRUE;  -- default to true unless everything on the same delivery.
1874 
1875   IF (p_assignment_type = 'DD2D') THEN --detail to delivery, delivery id provided
1876 
1877     OPEN c_get_delivery_id(p_detail_id);
1878     FETCH c_get_delivery_id INTO l_delivery1;
1879     CLOSE c_get_delivery_id;
1880 
1881     OPEN c_get_gross_weight(p_detail_id);
1882     FETCH c_get_gross_weight INTO x_gross_weight1;
1883     CLOSE c_get_gross_weight;
1884 
1885     IF (l_delivery1 = p_delivery_id) THEN --already assigned to the delivery
1886       x_assign_update := FALSE; --same delivery, no need to update
1887     ELSE
1888 
1889       l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(p_delivery_id);
1890       IF (l_is_delivery_empty = 'Y') THEN
1891         x_delivery_was_empty := TRUE;
1892       ELSIF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
1893         IF l_debug_on THEN
1894           WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
1895         END IF;
1896         raise FND_API.G_EXC_ERROR;
1897       END IF;
1898     END IF;
1899 
1900   ELSIF (p_assignment_type IN ('DD2C', 'C2C')) THEN
1901 
1902     IF (p_assignment_type = 'DD2C') THEN
1903       --detail to container, check delivery id of p_detail_id and p_container1_id
1904       OPEN c_get_delivery_id(p_detail_id);
1905       FETCH c_get_delivery_id INTO l_delivery1;
1906       CLOSE c_get_delivery_id;
1907 
1908       OPEN c_get_delivery_id(p_container1_id);
1909       FETCH c_get_delivery_id INTO l_delivery2;
1910       CLOSE c_get_delivery_id;
1911 
1912       OPEN c_get_gross_weight(p_detail_id);
1913       FETCH c_get_gross_weight INTO x_gross_weight1;
1914       CLOSE c_get_gross_weight;
1915 
1916       OPEN c_get_gross_weight(p_container1_id);
1917       FETCH c_get_gross_weight INTO x_gross_weight2;
1918       CLOSE c_get_gross_weight;
1919 
1920     ELSE
1921       --container to container, check delivery id of p_container1_id and p_container2_id
1922       OPEN c_get_delivery_id(p_container1_id);
1923       FETCH c_get_delivery_id INTO l_delivery1;
1924       CLOSE c_get_delivery_id;
1925 
1926       OPEN c_get_delivery_id(p_container2_id);
1927       FETCH c_get_delivery_id INTO l_delivery2;
1928       CLOSE c_get_delivery_id;
1929 
1930       OPEN c_get_gross_weight(p_container1_id);
1931       FETCH c_get_gross_weight INTO x_gross_weight1;
1932       CLOSE c_get_gross_weight;
1933 
1934       OPEN c_get_gross_weight(p_container2_id);
1935       FETCH c_get_gross_weight INTO x_gross_weight2;
1936       CLOSE c_get_gross_weight;
1937 
1938     END IF;
1939 
1940     IF (l_delivery1 = l_delivery2) THEN --both belong to same delivery and not NULL
1941       x_assign_update := FALSE; --same delivery, no need to update
1942     ELSIF (l_delivery1 IS NOT NULL) THEN --cannot have both NOT NULL
1943 
1944       l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(l_delivery1);
1945       IF (l_is_delivery_empty = 'Y') THEN
1946         x_delivery_was_empty := TRUE;
1947       ELSIF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
1948         IF l_debug_on THEN
1949           WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
1950         END IF;
1951         raise FND_API.G_EXC_ERROR;
1952       END IF;
1953     ELSIF (l_delivery2 IS NOT NULL) THEN
1954 
1955       l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(l_delivery2);
1956       IF (l_is_delivery_empty = 'Y') THEN
1957         x_delivery_was_empty := TRUE;
1958       ELSIF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
1959         IF l_debug_on THEN
1960           WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
1961         END IF;
1962         raise FND_API.G_EXC_ERROR;
1963       END IF;
1964     END IF;
1965 
1966   ELSE
1967     IF l_debug_on THEN
1968       WSH_DEBUG_SV.log(l_module_name,'Error in wrong assignment_type', p_assignment_type);
1969     END IF;
1970     raise FND_API.G_EXC_ERROR;
1971   END IF;
1972 
1973   IF l_debug_on THEN
1974       WSH_DEBUG_SV.log(l_module_name, 'x_delivery_was_empty', x_delivery_was_empty);
1975       WSH_DEBUG_SV.log(l_module_name, 'x_assign_update', x_assign_update);
1976       WSH_DEBUG_SV.log(l_module_name, 'x_gross_weight1', x_gross_weight1);
1977       WSH_DEBUG_SV.log(l_module_name, 'x_gross_weight2', x_gross_weight2);
1978   END IF;
1979 
1980   IF l_debug_on THEN
1981       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
1982       WSH_DEBUG_SV.pop(l_module_name);
1983   END IF;
1984 
1985 EXCEPTION
1986   WHEN FND_API.G_EXC_ERROR THEN
1987     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1988 
1989     IF c_get_gross_weight%ISOPEN THEN
1990       CLOSE c_get_gross_weight;
1991     END IF;
1992 
1993     IF c_get_delivery_id%ISOPEN THEN
1994       CLOSE c_get_delivery_id;
1995     END IF;
1996 
1997     --
1998     IF l_debug_on THEN
1999       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
2000       WSH_DEBUG_SV.pop(l_module_name);
2001     END IF;
2002     --
2003     RETURN;
2004   WHEN OTHERS THEN
2005     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2006 
2007     IF c_get_gross_weight%ISOPEN THEN
2008       CLOSE c_get_gross_weight;
2009     END IF;
2010 
2011     IF c_get_delivery_id%ISOPEN THEN
2012       CLOSE c_get_delivery_id;
2013     END IF;
2014 
2015     --
2016     IF l_debug_on THEN
2017       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
2018       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION OTHERS');
2019     END IF;
2020     --
2021     RETURN;
2022 
2023 END Pre_Otm_Assign_Del_Detail;
2024 
2025 --========================================================================
2026 -- PROCEDURE : Post_Otm_Assign_Del_Detail
2027 --
2028 --             API added for R12 Glog Integration
2029 --
2030 -- PURPOSE :   updates delivery's tms_interface_flag via API
2031 --             based on the changes of detail assignments to the delivery
2032 --
2033 -- PARAMETERS:
2034 --     p_delivery_id         delivery_id
2035 --     p_delivery_was_empty  whether the delivery was empty before the new
2036 --                           assignment
2037 --     p_tms_interface_flag  delivery's latest tms_interface_flag if available
2038 --     p_gross_weight        delivery detail's gross weight if avilable
2039 --     p_delivery_detail_ids table of delivery detail ids to get gross weight
2040 --     x_return status       SUCCESS or ERROR
2041 --========================================================================
2042 
2043 PROCEDURE Post_Otm_Assign_Del_Detail
2044              (p_delivery_id         IN  NUMBER,
2045               p_delivery_was_empty  IN  BOOLEAN,
2046               p_tms_interface_flag  IN  VARCHAR2,
2047               p_gross_weight        IN  NUMBER,
2048               x_return_status       OUT NOCOPY VARCHAR2) IS
2049 
2050 
2051   l_call_update          VARCHAR2(1);
2052   l_return_status        VARCHAR2(1);
2053   l_tms_interface_flag   WSH_NEW_DELIVERIES.TMS_INTERFACE_FLAG%TYPE;
2054   l_is_delivery_empty    VARCHAR2(1);
2055   l_interface_flag_tab   WSH_UTIL_CORE.COLUMN_TAB_TYPE;
2056   l_delivery_info        WSH_NEW_DELIVERIES_PVT.Delivery_Rec_Type;
2057   l_delivery_id_tab      WSH_UTIL_CORE.ID_TAB_TYPE;
2058   l_num_warnings         NUMBER;
2059   l_debug_on             BOOLEAN;
2060   l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.'||G_PACKAGE_NAME||'.'||'Post_Otm_Assign_Del_Detail';
2061 
2062 BEGIN
2063 
2064   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
2065   --
2066   IF l_debug_on IS NULL
2067   THEN
2068       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
2069   END IF;
2070   --
2071   IF l_debug_on THEN
2072       WSH_DEBUG_SV.push(l_module_name);
2073       WSH_DEBUG_SV.log(l_module_name, 'P_DELIVERY_ID', p_delivery_id);
2074       WSH_DEBUG_SV.log(l_module_name, 'P_DELIVERY_WAS_EMPTY', p_delivery_was_empty);
2075       WSH_DEBUG_SV.log(l_module_name, 'P_TMS_INTERFACE_FLAG', p_tms_interface_flag);
2076       WSH_DEBUG_SV.log(l_module_name, 'P_GROSS_WEIGHT', p_gross_weight);
2077   END IF;
2078 
2079   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
2080 
2081   l_call_update := 'Y';
2082   l_delivery_id_tab(1) := p_delivery_id;
2083 
2084   IF (p_delivery_was_empty) THEN
2085     l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(p_delivery_id);
2086 
2087     IF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
2088       IF l_debug_on THEN
2089         WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
2090       END IF;
2091       raise FND_API.G_EXC_ERROR;
2092     ELSIF (l_is_delivery_empty = 'Y') THEN
2093       l_call_update := 'N';
2094     ELSIF (l_is_delivery_empty = 'N') THEN
2095       IF (p_tms_interface_flag IS NOT NULL) THEN
2096         l_tms_interface_flag := p_tms_interface_flag;
2097       ELSE
2098         WSH_DELIVERY_VALIDATIONS.get_delivery_information(
2099                      p_delivery_id   => p_delivery_id,
2100                      x_delivery_rec  => l_delivery_info,
2101                      x_return_status => l_return_status);
2102 
2103         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
2104           IF l_debug_on THEN
2105             WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_DELIVERY_VALIDATIONS.get_delivery_information');
2106           END IF;
2107           raise FND_API.G_EXC_ERROR;
2108         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
2109           l_num_warnings := l_num_warnings + 1;
2110         END IF;
2111         l_tms_interface_flag := nvl(l_delivery_info.tms_interface_flag, WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT);
2112 
2113       END IF;
2114 
2115       IF l_debug_on THEN
2116         WSH_DEBUG_SV.log(l_module_name, 'P_DELIVERY_WAS_EMPTY - L_TMS_INTERFACE_FLAG', l_tms_interface_flag);
2117       END IF;
2118 
2119       IF (l_tms_interface_flag = WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT) THEN
2120         l_interface_flag_tab(1) := WSH_NEW_DELIVERIES_PVT.C_TMS_CREATE_REQUIRED;
2121       ELSIF (l_tms_interface_flag in
2122              (WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_REQUIRED,
2123               WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_IN_PROCESS)) THEN
2124         l_interface_flag_tab(1) := WSH_NEW_DELIVERIES_PVT.C_TMS_UPDATE_REQUIRED;
2125       ELSE
2126         l_call_update := 'N';
2127       END IF;
2128     END IF;
2129   ELSE -- (NOT p_delivery_was_empty)
2130    l_interface_flag_tab(1) := NULL;
2131   --Bug7608629
2132   --removed code which checked for gross weight
2133   --now irrespective of gross weight  UPDATE_TMS_INTERFACE_FLAG will be called
2134   END IF;
2135 
2136   IF (l_call_update = 'Y') THEN
2137     WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG(
2138                p_delivery_id_tab        => l_delivery_id_tab,
2139                p_tms_interface_flag_tab => l_interface_flag_tab,
2140                x_return_status          => l_return_status);
2141 
2142     IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
2143       IF l_debug_on THEN
2144         WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG '||l_return_status);
2145       END IF;
2146       raise FND_API.G_EXC_ERROR;
2147     ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
2148       l_num_warnings := l_num_warnings + 1;
2149     END IF;
2150   END IF;
2151 
2152 
2153   IF (l_num_warnings > 0) THEN
2154     x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2155   END IF;
2156 
2157   IF l_debug_on THEN
2158       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
2159       WSH_DEBUG_SV.pop(l_module_name);
2160   END IF;
2161 
2162 EXCEPTION
2163   WHEN FND_API.G_EXC_ERROR THEN
2164     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2165     --
2166     IF l_debug_on THEN
2167       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
2168       WSH_DEBUG_SV.pop(l_module_name);
2169     END IF;
2170     --
2171     RETURN;
2172   WHEN OTHERS THEN
2173     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2174     --
2175     IF l_debug_on THEN
2176       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
2177       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION OTHERS');
2178     END IF;
2179     --
2180     RETURN;
2181 END Post_Otm_Assign_Del_Detail;
2182 
2183 -- End of OTM R12 : assign delivery detail
2184 
2185 
2186 --
2187 --Procedure:    Assign_Detail_to_Cont
2188 --Parameters:      p_detail_id,
2189 --           p_parent_detail_id,
2190 --           x_return_status
2191 --Description:      This procedure will assign the specified
2192 --           delivery_detail to the specIFied container
2193 --           and return the status
2194 
2195 --        if container is already assigned to a delivery,
2196 --        its parent containers and child containers must
2197 --        be also assigned to the same delivery already.
2198 --        So all it needs to do IS just get the delivery_id
2199 --        from the current container and assign it to the detail also.
2200 
2201 --        if the detail is already assigned to a delivery,
2202 --        then drill up and down to update the delivery id for all the
2203 --        parent and chile containers
2204 
2205 
2206 
2207 PROCEDURE Assign_Detail_To_Cont(
2208   p_detail_id     IN NUMBER,
2209   p_parent_detail_id   IN NUMBER,
2210   x_return_status    OUT NOCOPY  VARCHAR2)
2211 IS
2212 
2213 l_del_id_for_container c_del_id_for_cont_or_detail%ROWTYPE;
2214 l_del_id_for_detail c_del_id_for_cont_or_detail%ROWTYPE;
2215 
2216 l_group_by_flags WSH_DELIVERY_AUTOCREATE.group_by_flags_rec_type;
2217 
2218 invalid_detail exception;
2219 l_plan_flag varchar2(1);
2220 l_content_count NUMBER;
2221 
2222 /* H projects: pricing integration csun */
2223 m     NUMBER := 0;
2224 l_del_tab   WSH_UTIL_CORE.Id_Tab_Type;
2225 l_return_status         VARCHAR2(1);
2226 mark_reprice_error  EXCEPTION;
2227 l_ship_to               NUMBER;
2228 l_container_has_content BOOLEAN;
2229 l_mdc_detail_tab WSH_UTIL_CORE.Id_Tab_Type;
2230 l_ignore_det_tab WSH_UTIL_CORE.Id_Tab_Type;
2231 
2232 --
2233 l_debug_on BOOLEAN;
2234 --
2235 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'ASSIGN_DETAIL_TO_CONT';
2236 --
2237   l_display_error   BOOLEAN;
2238 
2239   CURSOR c_get_shipto (v_container_id NUMBER) IS
2240   SELECT ship_to_location_id
2241   FROM wsh_delivery_details
2242   WHERE delivery_detail_id = v_container_id;
2243 
2244   -- Bug 3715176
2245   CURSOR c_get_plan_flag (v_delivery_id NUMBER) IS
2246   SELECT nvl(planned_flag,'N')
2247   FROM   wsh_new_deliveries
2248   WHERE  delivery_id = v_delivery_id;
2249 
2250   CURSOR c_get_content_count(v_delivery_detail_id NUMBER) IS
2251   SELECT count(*)
2252   FROM   wsh_delivery_assignments_v wda
2253   WHERE	 wda.parent_delivery_detail_id = v_delivery_detail_id And rownum = 1;
2254   -- Bug 3715176
2255 
2256   -- Bug 4452930
2257   CURSOR c_topmost_container(p_detail_id NUMBER) IS
2258   SELECT  delivery_detail_id
2259   FROM  wsh_delivery_assignments_v
2260   WHERE parent_delivery_detail_id is null
2261   START WITH delivery_detail_id =p_detail_id
2262   CONNECT BY prior parent_delivery_detail_id = delivery_detail_id
2263   and rownum < 10;
2264   --restricting to 10 levels (performance)
2265   l_topmost_cont NUMBER;
2266 
2267   -- Bug 4452930
2268 
2269 l_attr_tab  wsh_delivery_autocreate.grp_attr_tab_type;
2270 l_group_tab  wsh_delivery_autocreate.grp_attr_tab_type;
2271 l_action_rec wsh_delivery_autocreate.action_rec_type;
2272 l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
2273 l_matched_entities wsh_util_core.id_tab_type;
2274 l_out_rec wsh_delivery_autocreate.out_rec_type;
2275 l_group_index NUMBER;
2276 
2277 l_num_warnings          number := 0;
2278 
2279 -- K LPN CONV. rv
2280 l_wms_org    VARCHAR2(10) := 'N';
2281 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
2282 l_sync_tmp_recTbl wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
2283 l_operation_type VARCHAR2(100);
2284 -- K LPN CONV. rv
2285 
2286 -- OTM R12 : update delivery
2287 l_delivery_info_tab       WSH_NEW_DELIVERIES_PVT.Delivery_Attr_Tbl_Type;
2288 l_delivery_info           WSH_NEW_DELIVERIES_PVT.Delivery_Rec_Type;
2289 l_new_interface_flag_tab  WSH_UTIL_CORE.COLUMN_TAB_TYPE;
2290 l_tms_update              VARCHAR2(1);
2291 l_trip_not_found          VARCHAR2(1);
2292 l_trip_info_rec           WSH_DELIVERY_VALIDATIONS.trip_info_rec_type;
2293 l_tms_version_number      WSH_NEW_DELIVERIES.TMS_VERSION_NUMBER%TYPE;
2294 l_gc3_is_installed        VARCHAR2(1);
2295 
2296 -- End of OTM R12 : update delivery
2297 
2298 -- OTM R12 : assign delivery detail
2299 l_delivery_was_empty      BOOLEAN;
2300 l_tms_interface_flag      WSH_NEW_DELIVERIES.TMS_INTERFACE_FLAG%TYPE;
2301 l_gross_weight1           WSH_NEW_DELIVERIES.GROSS_WEIGHT%TYPE;
2302 l_gross_weight2           WSH_NEW_DELIVERIES.GROSS_WEIGHT%TYPE;
2303 l_delivery_detail_ids     WSH_GLBL_VAR_STRCT_GRP.NUM_TBL_TYPE;
2304 l_assign_update           BOOLEAN;
2305 
2306 -- End of OTM R12 : assign delivery detail
2307 
2308 BEGIN
2309   --
2310   --
2311   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
2312   --
2313   IF l_debug_on IS NULL
2314   THEN
2315       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
2316   END IF;
2317   --
2318   IF l_debug_on THEN
2319       WSH_DEBUG_SV.push(l_module_name);
2320       --
2321       WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
2322       WSH_DEBUG_SV.log(l_module_name,'P_PARENT_DETAIL_ID',P_PARENT_DETAIL_ID);
2323   END IF;
2324   --
2325   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
2326 
2327   -- OTM R12
2328   l_gc3_is_installed := WSH_UTIL_CORE.G_GC3_IS_INSTALLED;
2329 
2330   IF (l_gc3_is_installed IS NULL) THEN
2331     l_gc3_is_installed := WSH_UTIL_CORE.GC3_IS_INSTALLED;
2332   END IF;
2333   l_assign_update := FALSE; --default assignment tms update to false
2334   -- End of OTM R12
2335 
2336 
2337   OPEN c_del_id_for_cont_or_detail(p_parent_detail_id);
2338   FETCH c_del_id_for_cont_or_detail into l_del_id_FOR_container;
2339   CLOSE c_del_id_for_cont_or_detail;
2340 
2341   OPEN c_del_id_for_cont_or_detail(p_detail_id);
2342   FETCH c_del_id_for_cont_or_detail into l_del_id_for_detail;
2343   CLOSE c_del_id_for_cont_or_detail;
2344 
2345   -- K LPN CONV. rv
2346   l_wms_org := wsh_util_validate.check_wms_org(l_del_id_FOR_container.organization_id);
2347   -- K LPN CONV. rv
2348 
2349   -- J: W/V Changes
2350   -- Return if the dd is already assigned to the specified container
2351   IF l_del_id_for_detail.parent_delivery_detail_id = p_parent_detail_id THEN
2352           IF l_debug_on THEN
2353             WSH_DEBUG_SV.logmsg(l_module_name,'DD '||p_detail_id||' is already assigned to '||p_parent_detail_id||'. Returning');
2354             WSH_DEBUG_SV.pop(l_module_name);
2355           END IF;
2356           return;
2357   END IF;
2358 
2359 
2360   OPEN c_get_shipto(p_parent_detail_id);
2361   FETCH c_get_shipto into l_ship_to;
2362   IF c_get_shipto%NOTFOUND THEN
2363               l_ship_to := NULL;
2364   END IF;
2365   CLOSE c_get_shipto;
2366 
2367   l_container_has_content := l_ship_to IS NOT NULL;
2368 
2369   IF l_debug_on THEN
2370           WSH_DEBUG_SV.log(l_module_name,'l_del_id_FOR_container',
2371                            l_del_id_FOR_container.delivery_id);
2372           WSH_DEBUG_SV.log(l_module_name,'l_del_id_FOR_detail',
2373                            l_del_id_for_detail.delivery_id);
2374           WSH_DEBUG_SV.log(l_module_name,'l_ship_to', l_ship_to);
2375   END IF;
2376   /* Added code to check for grouping attributes */
2377   IF (l_del_id_for_detail.organization_id <>
2378                                 l_del_id_for_container.organization_id) THEN
2379            FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_ORG_DIFF');
2380            FND_MESSAGE.SET_TOKEN('ENTITY1',p_detail_id);
2381            --
2382            IF l_debug_on THEN
2383               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2384            END IF;
2385            --
2386            FND_MESSAGE.SET_TOKEN('ENTITY2',
2387               nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2388                                                            p_parent_detail_id));
2389            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2390            WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2391            --
2392            IF l_debug_on THEN
2393               WSH_DEBUG_SV.pop(l_module_name);
2394            END IF;
2395            --
2396            RETURN;
2397   END IF;
2398   IF (l_del_id_for_detail.ship_from_location_id <>
2399                            l_del_id_for_container.ship_from_location_id) THEN
2400            FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
2401            FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2402            --
2403            IF l_debug_on THEN
2404                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2405            END IF;
2406            --
2407            FND_MESSAGE.SET_TOKEN('CONT_NAME',
2408                 nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2409                                                         p_parent_detail_id));
2410            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2411            WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2412            --
2413            IF l_debug_on THEN
2414               WSH_DEBUG_SV.pop(l_module_name);
2415            END IF;
2416            --
2417            RETURN;
2418   END IF;
2419 
2420   --J TP Release
2421   IF (l_del_id_for_detail.ignore_for_planning <>
2422                            l_del_id_for_container.ignore_for_planning) THEN
2423 
2424            -- R12: MDC
2425            -- If called by WMS, and line is part of a consol delivery,
2426            -- then the ignore for planning flag is always 'Y'. For WMS,
2427            -- we need to set the parent consol's ignore for planning status
2428            -- to be 'Y' before we attempt to pack.
2429 
2430            IF (l_wms_org = 'Y') AND
2431               ((l_del_id_for_detail.wda_type = 'O') OR (l_del_id_for_container.wda_type = 'O'))
2432            THEN --{
2433               IF l_del_id_for_detail.wda_type = 'O' THEN
2434                  l_ignore_det_tab(1) := p_parent_detail_id;
2435               ELSE
2436                  l_ignore_det_tab(1) := p_detail_id;
2437               END IF;
2438 
2439               WSH_TP_RELEASE.change_ignoreplan_status
2440                    (p_entity        => 'DLVB',
2441                     p_in_ids        => l_ignore_det_tab,
2442                     p_action_code   => 'IGNORE_PLAN',
2443                     x_return_status => x_return_status);
2444 
2445               IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
2446 
2447                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_DIFF_IGNOREPLAN');
2448                  FND_MESSAGE.SET_TOKEN('ENTITY1',p_detail_id);
2449                  --
2450                  IF l_debug_on THEN
2451                      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2452                  END IF;
2453                  --
2454                  FND_MESSAGE.SET_TOKEN('ENTITY2',
2455                  nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2456                                                         p_parent_detail_id));
2457                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2458                  --
2459                  IF l_debug_on THEN
2460                     WSH_DEBUG_SV.pop(l_module_name);
2461                  END IF;
2462                  --
2463                  RETURN;
2464 
2465 
2466               END IF;
2467 
2468            ELSE --}
2469               l_display_error := TRUE;
2470               IF (l_wms_org = 'Y')  AND (NOT l_container_has_content) THEN--{
2471                  --
2472                     l_ignore_det_tab(1) := p_parent_detail_id;
2473                     WSH_TP_RELEASE.change_ignoreplan_status
2474                       (p_entity        => 'DLVB',
2475                        p_in_ids        => l_ignore_det_tab,
2476                        p_action_code   => 'IGNORE_PLAN',
2477                        x_return_status => l_return_status);
2478 
2479                     IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN --{
2480                        l_display_error := TRUE;
2481                     ELSE
2482                        l_display_error := FALSE;
2483                     END IF;--}
2484               END IF ; --}
2485 
2486               IF l_display_error THEN --{
2487                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_DIFF_IGNOREPLAN');
2488                  FND_MESSAGE.SET_TOKEN('ENTITY1',p_detail_id);
2489                  --
2490                  IF l_debug_on THEN
2491                      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2492                  END IF;
2493                  --
2494                  FND_MESSAGE.SET_TOKEN('ENTITY2',
2495                  nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2496                                                         p_parent_detail_id));
2497                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2498                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2499                  --
2500                  IF l_debug_on THEN
2501                     WSH_DEBUG_SV.pop(l_module_name);
2502                  END IF;
2503                  --
2504                  RETURN;
2505               END IF; --}
2506            END IF;
2507   END IF;
2508 
2509   --
2510   -- J-IB-NPARIKH-{
2511   --
2512   IF (l_del_id_for_detail.line_direction <> l_del_id_for_container.line_direction)
2513   THEN
2514   --{
2515             --
2516             -- O line can be assigned to empty IO container
2517             -- IO line can be assigned to empty O container
2518             -- Otherwise, line and container's line direction must match
2519             --
2520             IF  l_del_id_for_detail.line_direction    IN ('O','IO')
2521             AND l_del_id_for_container.line_direction IN ('O','IO')
2522             THEN
2523             --{
2524                 NULL;
2525             --}
2526             ELSE
2527             --{
2528                 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
2529                 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2530                 --
2531                 IF l_debug_on THEN
2532                    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2533                 END IF;
2534                 --
2535                 FND_MESSAGE.SET_TOKEN('CONT_NAME',
2536                     nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2537                                                             p_parent_detail_id));
2538                 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2539                 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2540                 --
2541                 IF l_debug_on THEN
2542                   WSH_DEBUG_SV.pop(l_module_name);
2543                 END IF;
2544                 --
2545                 RETURN;
2546             --}
2547             END IF;
2548   --}
2549   END IF;
2550   --
2551   -- J-IB-NPARIKH-}
2552   --
2553   --
2554   IF l_debug_on THEN
2555            WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.GET_GROUP_BY_ATTR',WSH_DEBUG_SV.C_PROC_LEVEL);
2556   END IF;
2557   --
2558   WSH_DELIVERY_AUTOCREATE.get_group_by_attr(
2559            p_organization_id => l_del_id_for_detail.organization_id,
2560            p_client_id       => l_del_id_for_detail.client_id, -- LSP PROJECT :
2561            x_group_by_flags  => l_group_by_flags,
2562            x_return_status   => x_return_status);
2563 
2564   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2565            x_return_status := x_return_status;
2566            WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2567            --
2568            IF l_debug_on THEN
2569               WSH_DEBUG_SV.pop(l_module_name);
2570            END IF;
2571            --
2572            RETURN;
2573   END IF;
2574 
2575   /*---------
2576         When the container has no content then do not do these checks
2577         since all these attributes on the container will be null.
2578   ----------*/
2579 
2580   IF l_container_has_content THEN
2581            IF l_debug_on THEN
2582               WSH_DEBUG_SV.log(l_module_name,'l_group_by_flags.customer',
2583                                                 l_group_by_flags.customer);
2584               WSH_DEBUG_SV.log(l_module_name,'del_id_for_detail.customer',
2585                                         l_del_id_for_detail.customer_id);
2586               WSH_DEBUG_SV.log(l_module_name,'id_for_container.customer',
2587                                         l_del_id_for_container.customer_id);
2588            END IF;
2589 
2590     --- Bug 3715176
2591     -- If delivery is same for container and line then it should not check firm status.
2592     IF l_del_id_for_detail.delivery_id = l_del_id_for_container.delivery_id then
2593       NULL;
2594 
2595     Elsif l_del_id_for_detail.delivery_id is NOT NULL OR
2596           l_del_id_for_container.delivery_id is NOT NULL then
2597           Open  c_get_content_count(p_parent_detail_id);
2598 	  Fetch c_get_content_count into l_content_count;
2599 	  Close c_get_content_count;
2600 
2601       IF l_content_count > 0 THEN
2602 	IF l_del_id_for_detail.delivery_id IS NOT NULL then
2603 	     OPEN c_get_plan_flag(l_del_id_for_detail.delivery_id);
2604 	     FETCH c_get_plan_flag into l_plan_flag;
2605 	     CLOSE c_get_plan_flag;
2606 
2607   	  if l_plan_flag <> 'N' then
2608 	         FND_MESSAGE.SET_NAME('WSH','WSH_DEL_STATUS_NOT_PROPER');
2609 
2610 		 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2611 
2612                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2613                  --
2614                  IF l_debug_on THEN
2615                     WSH_DEBUG_SV.pop(l_module_name);
2616                  END IF;
2617                  --
2618                  return;
2619           end if;
2620 	END IF;
2621 
2622 	IF l_del_id_for_container.delivery_id IS NOT NULL then
2623 	     OPEN c_get_plan_flag(l_del_id_for_container.delivery_id);
2624 	     FETCH c_get_plan_flag into l_plan_flag;
2625 	     CLOSE c_get_plan_flag;
2626 
2627   	  if l_plan_flag <> 'N' then
2628 	         FND_MESSAGE.SET_NAME('WSH','WSH_DEL_STATUS_NOT_PROPER');
2629 
2630 		 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2631 
2632                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2633                  --
2634                  IF l_debug_on THEN
2635                     WSH_DEBUG_SV.pop(l_module_name);
2636                  END IF;
2637                  --
2638                  return;
2639           end if;
2640 	END IF;
2641       END IF;
2642     END IF;
2643     -- Bug 3715176
2644 
2645     /*  bug 2677298 frontport from bug 2655474: issue #1:
2646     **    set x_return_status to error if grouping attributes do not match
2647     */
2648 
2649 
2650     IF l_group_by_flags.customer = 'Y' THEN
2651               IF  ((NVL(l_del_id_for_detail.customer_id,-1) <>
2652                              NVL(l_del_id_for_container.customer_id,-1))
2653                    OR (NVL(l_del_id_for_detail.consignee_flag,'C') <>   --RTV changes
2654                              NVL(l_del_id_for_container.consignee_flag,'C'))
2655                    ) THEN
2656 
2657                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
2658                  FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2659                  --
2660                  IF l_debug_on THEN
2661                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2662                  END IF;
2663                  --
2664                  FND_MESSAGE.SET_TOKEN('CONT_NAME',
2665                  nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2666                                                        p_parent_detail_id));
2667                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2668                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2669                  --
2670                  IF l_debug_on THEN
2671                     WSH_DEBUG_SV.pop(l_module_name);
2672                  END IF;
2673                  --
2674                  return;
2675               END IF;
2676    END IF;
2677    IF l_group_by_flags.intmed = 'Y' THEN
2678               IF (NVL(l_del_id_for_detail.intmed_ship_to_location_id,-1)<>
2679                  NVL(l_del_id_for_container.intmed_ship_to_location_id,-1))
2680               THEN
2681 
2682                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
2683                  FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2684                  --
2685                  IF l_debug_on THEN
2686                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2687                  END IF;
2688                  --
2689                  FND_MESSAGE.SET_TOKEN('CONT_NAME',
2690                   nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2691                   p_parent_detail_id));
2692                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2693                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2694                  --
2695                  IF l_debug_on THEN
2696                     WSH_DEBUG_SV.pop(l_module_name);
2697                  END IF;
2698                  --
2699                  return;
2700               END IF;
2701    END IF;
2702 
2703    IF l_debug_on THEN
2704               WSH_DEBUG_SV.log(l_module_name,'fob_code',
2705                                                  l_del_id_for_detail.fob_code);
2706                WSH_DEBUG_SV.log(l_module_name,'container fob_code',
2707                                               l_del_id_for_container.fob_code);
2708                WSH_DEBUG_SV.log(l_module_name,'fob',
2709                                                        l_group_by_flags.fob);
2710    END IF;
2711 
2712    IF l_group_by_flags.fob = 'Y' THEN
2713               IF  (NVL(l_del_id_for_detail.fob_code,'#')<>
2714                              NVL(l_del_id_for_container.fob_code,'#')) THEN
2715 
2716                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
2717                  FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2718                  --
2719                  IF l_debug_on THEN
2720                      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2721                  END IF;
2722                   --
2723                  FND_MESSAGE.SET_TOKEN('CONT_NAME',
2724                  nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2725                        p_parent_detail_id));
2726                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2727                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2728                  --
2729                  IF l_debug_on THEN
2730                     WSH_DEBUG_SV.pop(l_module_name);
2731                  END IF;
2732                  --
2733                  return;
2734               END IF;
2735    END IF;
2736    IF l_debug_on THEN
2737               WSH_DEBUG_SV.log(l_module_name,'freight_terms_code',
2738                                      l_del_id_for_detail.freight_terms_code);
2739                WSH_DEBUG_SV.log(l_module_name,
2740                                               'container freight_terms_code',
2741                                     l_del_id_for_container.freight_terms_code);
2742                 WSH_DEBUG_SV.log(l_module_name,'freight_terms',
2743                                                l_group_by_flags.freight_terms);
2744    END IF;
2745 
2746    IF l_group_by_flags.freight_terms = 'Y' THEN
2747               IF  (NVL(l_del_id_for_detail.freight_terms_code,'#')<>
2748                     NVL(l_del_id_for_container.freight_terms_code,'#')) THEN
2749 
2750                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
2751                  FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2752                  --
2753                  IF l_debug_on THEN
2754                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2755                  END IF;
2756                  --
2757                  FND_MESSAGE.SET_TOKEN('CONT_NAME',
2758                  nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2759                   p_parent_detail_id));
2760                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2761                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2762                  --
2763                  IF l_debug_on THEN
2764                      WSH_DEBUG_SV.pop(l_module_name);
2765                  END IF;
2766                  --
2767                  return;
2768               END IF;
2769    END IF;
2770 
2771    IF l_debug_on THEN
2772               WSH_DEBUG_SV.log(l_module_name,'ship_method_code',
2773                                         l_del_id_for_detail.ship_method_code);
2774               WSH_DEBUG_SV.log(l_module_name, 'container ship_method_code',
2775                                    l_del_id_for_container.ship_method_code);
2776               WSH_DEBUG_SV.log(l_module_name,'ship_method',
2777                                                l_group_by_flags.ship_method);
2778    END IF;
2779 
2780    IF l_group_by_flags.ship_method = 'Y' THEN
2781               IF  (NVL(NVL(l_del_id_for_detail.mode_of_transport,l_del_id_for_container.mode_of_transport),'#')<>
2782                    NVL(NVL(l_del_id_for_container.mode_of_transport,l_del_id_for_detail.mode_of_transport),'#'))
2783               OR  (NVL(NVL(l_del_id_for_detail.service_level,l_del_id_for_container.service_level),'#')<>
2784                    NVL(NVL(l_del_id_for_container.service_level,l_del_id_for_detail.service_level),'#'))
2785               OR  (NVL(NVL(l_del_id_for_detail.carrier_id,l_del_id_for_container.carrier_id),-1)<>
2786                    NVL(NVL(l_del_id_for_container.carrier_id,l_del_id_for_detail.carrier_id),-1)) THEN
2787 
2788                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
2789                  FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2790                  --
2791                  IF l_debug_on THEN
2792                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2793                  END IF;
2794                  --
2795                  FND_MESSAGE.SET_TOKEN('CONT_NAME',
2796                  nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2797                                                            p_parent_detail_id));
2798                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2799                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2800                  --
2801                  IF l_debug_on THEN
2802                     WSH_DEBUG_SV.pop(l_module_name);
2803                  END IF;
2804                  --
2805                  return;
2806               END IF;
2807     END IF;
2808    --
2809    -- LSP PROJECT : Verify client id value on DD as well as Cont.
2810    --          DD with x Client can be packed into a container with same client or NULL client
2811    IF WMS_DEPLOY.wms_deployment_mode = 'L' THEN
2812    --{
2813        IF l_debug_on THEN
2814            WSH_DEBUG_SV.log(l_module_name,'Client_id', l_del_id_for_detail.client_id);
2815            WSH_DEBUG_SV.log(l_module_name, 'container Client_id',l_del_id_for_container.client_id);
2816            WSH_DEBUG_SV.log(l_module_name,'WMS_DEPLOY.wms_deployment_mode', WMS_DEPLOY.wms_deployment_mode);
2817        END IF;
2818        IF   ( NVL(l_del_id_for_detail.client_id,-1) <>  NVL(l_del_id_for_container.client_id,NVL(l_del_id_for_detail.client_id,-1))) THEN
2819        --{
2820            FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
2821            FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2822            --
2823            IF l_debug_on THEN
2824                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2825            END IF;
2826            --
2827            FND_MESSAGE.SET_TOKEN('CONT_NAME',
2828                 nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2829                                                        p_parent_detail_id));
2830            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2831            WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2832            --
2833            IF l_debug_on THEN
2834                WSH_DEBUG_SV.pop(l_module_name);
2835            END IF;
2836            --
2837            return;
2838        --}
2839        END IF;
2840    --}
2841    END IF;
2842    -- LSP PROJECT : End
2843   END IF;
2844   /* End of Check for grouping attributes */
2845 
2846   IF l_debug_on THEN
2847                    WSH_DEBUG_SV.log(l_module_name,'parent_delivery_detail_id',
2848                                 l_del_id_for_detail.parent_delivery_detail_id);
2849                    WSH_DEBUG_SV.log(l_module_name,
2850                                      'container parent_delivery_detail_id',
2851                               l_del_id_for_container.parent_delivery_detail_id);
2852   END IF;
2853 
2854   /* Check to see if the line is already packed */
2855   IF (l_del_id_for_detail.parent_delivery_detail_id IS NOT NULL
2856       AND l_del_id_for_detail.parent_delivery_detail_id <>
2857         p_parent_detail_id
2858       ) THEN
2859       FND_MESSAGE.SET_NAME('WSH','WSH_DET_PACK_ERROR');
2860       FND_MESSAGE.SET_TOKEN('DET_LINE',p_detail_id);
2861       --
2862       IF l_debug_on THEN
2863           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2864       END IF;
2865       --
2866       FND_MESSAGE.SET_TOKEN('CONT_NAME',
2867          nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2868                p_parent_detail_id));
2869       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2870       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2871       --
2872       IF l_debug_on THEN
2873           WSH_DEBUG_SV.pop(l_module_name);
2874       END IF;
2875       --
2876       return;
2877   END IF;
2878   /* End of Check to see if the line is already packed */
2879 
2880 
2881   -- J: W/V Changes
2882   IF l_debug_on THEN
2883                    WSH_DEBUG_SV.log(l_module_name,'l_del_id_for_detail.released_status',
2884                                                       l_del_id_for_detail.released_status);
2885   END IF;
2886 
2887   IF l_del_id_for_detail.released_status = 'C' THEN
2888       Raise invalid_detail;
2889   END IF;
2890 
2891 
2892   /*  bug 2677298 frontport from bug 2655474: issue #2:
2893   **    set x_return_status to error if line and container are in different deliveries.
2894   */
2895   IF (l_del_id_for_detail.delivery_id <> l_del_id_for_container.delivery_id)  THEN
2896     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_DIFF_DELIVERIES');
2897     FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2898     --
2899     IF l_debug_on THEN
2900         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2901     END IF;
2902     --
2903     FND_MESSAGE.SET_TOKEN('CONT_NAME',
2904        nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2905              p_parent_detail_id));
2906     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2907     WSH_UTIL_CORE.Add_Message(x_return_status);
2908     --
2909     IF l_debug_on THEN
2910         WSH_DEBUG_SV.pop(l_module_name);
2911     END IF;
2912     --
2913     return;
2914   END IF;
2915 
2916   -- J: W/V Changes
2917   -- The first DD_WV_Post_Process call will decrement the DD W/V from delivery
2918   -- The second DD_WV_Post_Process call will increment the delivery W/V with container W/V (since container has to be
2919   -- assigned to the delivery if the detail being assigned to container is already assigned to delivery)
2920   -- The third DD_WV_Post_Process will will increment the container W/V with DD W/V which in turn will adjust the
2921   -- delivery W/V, if the container is in a delivery.
2922   IF (l_del_id_for_detail.delivery_id is not null) THEN
2923           IF l_debug_on THEN
2924             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
2925           END IF;
2926 
2927           WSH_WV_UTILS.DD_WV_Post_Process(
2928             p_delivery_detail_id => p_detail_id,
2929             p_diff_gross_wt      => -1 * l_del_id_for_detail.gross_weight,
2930             p_diff_net_wt        => -1 * l_del_id_for_detail.net_weight,
2931             p_diff_volume        => -1 * l_del_id_for_detail.volume,
2932             p_diff_fill_volume   => -1 * l_del_id_for_detail.volume,
2933             x_return_status      => l_return_status);
2934 
2935           IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
2936                --
2937                x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2938                WSH_UTIL_CORE.Add_Message(x_return_status);
2939                IF l_debug_on THEN
2940                    WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
2941                    WSH_DEBUG_SV.pop(l_module_name);
2942                END IF;
2943                return;
2944           END IF;
2945 
2946   END IF;
2947 
2948   /* container is already assigned to a delivery */
2949 
2950   /* bug 2691385 and 2655474: avoid unnecessary update if line is already in delivery. */
2951   /****
2952           !!!!! We should NOT assume that the delivery grouping attributes of the delivery match
2953           !!!!! with that of the delivery details.
2954           !!!!! Bugs 2794866, 2397552.
2955   ****/
2956 
2957 
2958   IF (l_del_id_for_container.delivery_id IS not null) and (l_del_id_for_detail.delivery_id is null) THEN
2959 
2960 
2961     -- OTM R12 : assign delivery detail, this is the case where detail is assigned to the delivery
2962 
2963     IF (l_gc3_is_installed = 'Y' AND
2964         nvl(l_del_id_for_container.ignore_for_planning, 'N') = 'N') THEN
2965 
2966       Pre_Otm_Assign_Del_Detail
2967               (p_delivery_id        => NULL,
2968                p_detail_id          => p_detail_id,
2969                p_container1_id      => p_parent_detail_id,
2970                p_container2_id      => NULL,
2971                p_assignment_type    => 'DD2C',
2972                x_delivery_was_empty => l_delivery_was_empty,
2973                x_assign_update      => l_assign_update,
2974                x_gross_weight1      => l_gross_weight1,
2975                x_gross_weight2      => l_gross_weight2,
2976                x_return_status      => l_return_status);
2977 
2978       IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
2979         IF l_debug_on THEN
2980           WSH_DEBUG_SV.log(l_module_name,'error from Pre_Otm_Assign_Del_Detail');
2981         END IF;
2982         raise FND_API.G_EXC_ERROR;
2983       END IF;
2984     END IF;
2985     -- End of OTM R12 : assign delivery detail
2986 
2987 
2988                IF l_debug_on THEN
2989                   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.CHECK_ASSIGN_DELIVERY',WSH_DEBUG_SV.C_PROC_LEVEL);
2990                END IF;
2991 
2992                l_attr_tab(1).entity_id := l_del_id_for_container.delivery_id;
2993                l_attr_tab(1).entity_type := 'DELIVERY';
2994                l_attr_tab(2).entity_id := p_detail_id;
2995                l_attr_tab(2).entity_type := 'DELIVERY_DETAIL';
2996 
2997                l_action_rec.action := 'MATCH_GROUPS';
2998                l_action_rec.check_single_grp := 'Y';
2999 
3000                WSH_DELIVERY_AUTOCREATE.Find_Matching_Groups(p_attr_tab => l_attr_tab,
3001                         p_action_rec => l_action_rec,
3002                         p_target_rec => l_target_rec,
3003                         p_group_tab => l_group_tab,
3004                         x_matched_entities => l_matched_entities,
3005                         x_out_rec => l_out_rec,
3006                         x_return_status => x_return_status);
3007 
3008                IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
3009                      --
3010                      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3011                      WSH_UTIL_CORE.Add_Message(x_return_status);
3012                      IF l_debug_on THEN
3013                          WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3014                          WSH_DEBUG_SV.pop(l_module_name);
3015                      END IF;
3016                      return;
3017                END IF;
3018 
3019 
3020 
3021                IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
3022                      --
3023                      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3024                      WSH_UTIL_CORE.Add_Message(x_return_status);
3025                      IF l_debug_on THEN
3026                          WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3027                          WSH_DEBUG_SV.pop(l_module_name);
3028                      END IF;
3029                      return;
3030                END IF;
3031 
3032     -- Update the delivery with the line's line direction
3033 
3034     -- Lock the delivery before update.
3035 
3036     BEGIN
3037 
3038        wsh_new_deliveries_pvt.lock_dlvy_no_compare(p_delivery_id => l_del_id_for_container.delivery_id);
3039 
3040     EXCEPTION
3041 
3042        WHEN OTHERS THEN
3043           x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3044           FND_MESSAGE.Set_Name('WSH', 'WSH_NO_LOCK');
3045           WSH_UTIL_CORE.add_message (WSH_UTIL_CORE.G_RET_STS_ERROR);
3046           IF l_debug_on THEN
3047              WSH_DEBUG_SV.log(l_module_name,'Could not lock delivery: ',l_del_id_for_container.delivery_id);
3048              WSH_DEBUG_SV.pop(l_module_name);
3049           END IF;
3050           RETURN;
3051     END;
3052 
3053     l_group_index := l_group_tab.FIRST;
3054 
3055     -- OTM R12 : update delivery
3056     l_tms_update := 'N';
3057     l_new_interface_flag_tab(1) := NULL;
3058 
3059     IF (l_gc3_is_installed = 'Y' AND
3060         nvl(l_del_id_for_container.ignore_for_planning, 'N') = 'N') THEN
3061       l_trip_not_found := 'N';
3062 
3063       --get trip information for delivery, no update when trip not OPEN
3064       WSH_DELIVERY_VALIDATIONS.get_trip_information
3065                    (p_delivery_id     => l_del_id_for_container.delivery_id,
3066                     x_trip_info_rec   => l_trip_info_rec,
3067                     x_return_status   => l_return_status);
3068 
3069       IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
3070         x_return_status := l_return_status;
3071         IF l_debug_on THEN
3072           WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_DELIVERY_VALIDATIONS.get_trip_information');
3073           WSH_DEBUG_SV.pop(l_module_name);
3074         END IF;
3075         RETURN;
3076       END IF;
3077 
3078       IF (l_trip_info_rec.trip_id IS NULL) THEN
3079         l_trip_not_found := 'Y';
3080       END IF;
3081 
3082       -- only do changes when there's no trip or trip status is OPEN
3083       IF (l_trip_info_rec.status_code = 'OP' OR
3084           l_trip_not_found = 'Y') THEN
3085 
3086         WSH_DELIVERY_VALIDATIONS.get_delivery_information(
3087                               p_delivery_id   => l_del_id_for_container.delivery_id,
3088                               x_delivery_rec  => l_delivery_info,
3089                               x_return_status => l_return_status);
3090 
3091         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
3092           x_return_status := l_return_status;
3093           IF l_debug_on THEN
3094             WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_DELIVERY_VALIDATIONS.get_delivery_information');
3095             WSH_DEBUG_SV.pop(l_module_name);
3096           END IF;
3097           RETURN;
3098         END IF;
3099 
3100         -- if service level, mode of transport, or carrier id is changed
3101         -- with the nvl updates, then update is needed
3102 
3103         IF (nvl(l_delivery_info.service_level,
3104                 nvl(l_group_tab(l_group_index).service_level, '@@')) <>
3105             nvl(l_delivery_info.service_level, '@@') OR
3106             nvl(l_delivery_info.mode_of_transport,
3107                 nvl(l_group_tab(l_group_index).mode_of_transport, '@@')) <>
3108             nvl(l_delivery_info.mode_of_transport, '@@') OR
3109             nvl(l_delivery_info.carrier_id,
3110                 nvl(l_group_tab(l_group_index).carrier_id, -1)) <>
3111             nvl(l_delivery_info.carrier_id, -1)) THEN
3112 
3113           IF (l_delivery_info.tms_interface_flag NOT IN
3114               (WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT,
3115                WSH_NEW_DELIVERIES_PVT.C_TMS_CREATE_REQUIRED,
3116                WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_REQUIRED,
3117                WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_IN_PROCESS,
3118                WSH_NEW_DELIVERIES_PVT.C_TMS_UPDATE_REQUIRED)) THEN
3119             l_tms_update := 'Y';
3120             l_delivery_info_tab(1) := l_delivery_info;
3121             l_new_interface_flag_tab(1) := WSH_NEW_DELIVERIES_PVT.C_TMS_UPDATE_REQUIRED;
3122             l_tms_version_number := nvl(l_delivery_info.tms_version_number, 1) + 1;
3123           END IF;
3124         END IF; -- checking the value differences
3125       END IF; -- IF ((l_trip_not_found = 'N' AND
3126     END IF; -- IF (l_gc3_is_installed = 'Y'
3127 
3128     IF l_debug_on THEN
3129       WSH_DEBUG_SV.log(l_module_name, 'l_gc3_is_installed', l_gc3_is_installed);
3130       WSH_DEBUG_SV.log(l_module_name, 'l_tms_update', l_tms_update);
3131       IF (l_tms_update = 'Y') THEN
3132         WSH_DEBUG_SV.log(l_module_name, 'l_new_interface_flag_tab', l_new_interface_flag_tab(1));
3133         WSH_DEBUG_SV.log(l_module_name, 'l_tms_version_number', l_tms_version_number);
3134       END IF;
3135     END IF;
3136 
3137     -- End of OTM R12 : update delivery
3138 
3139     UPDATE wsh_new_deliveries
3140     SET shipment_direction = l_del_id_for_detail.line_direction,
3141         service_level = NVL(service_level,l_group_tab(l_group_index).service_level),
3142         mode_of_transport = NVL(mode_of_transport, l_group_tab(l_group_index).mode_of_transport),
3143         carrier_id = NVL(carrier_id, l_group_tab(l_group_index).carrier_id),
3144         -- OTM R12
3145         TMS_INTERFACE_FLAG = decode(l_tms_update, 'Y', l_new_interface_flag_tab(1), nvl(TMS_INTERFACE_FLAG, WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT)),
3146         TMS_VERSION_NUMBER = decode(l_tms_update, 'Y', l_tms_version_number, nvl(tms_version_number, 1)),
3147         -- End of OTM R12
3148         last_update_date = SYSDATE,
3149         last_updated_by =  FND_GLOBAL.USER_ID,
3150         last_update_login =  FND_GLOBAL.LOGIN_ID
3151     where delivery_id = l_del_id_for_container.delivery_id;
3152 
3153     -- OTM R12 : update delivery
3154     IF (l_gc3_is_installed = 'Y' AND l_tms_update = 'Y') THEN
3155       WSH_XC_UTIL.LOG_OTM_EXCEPTION(
3156                           p_delivery_info_tab      => l_delivery_info_tab,
3157                           p_new_interface_flag_tab => l_new_interface_flag_tab,
3158                           x_return_status          => l_return_status);
3159 
3160       IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
3161         x_return_status := l_return_status;
3162         IF l_debug_on THEN
3163           WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_XC_UTIL.log_otm_exception');
3164           WSH_DEBUG_SV.pop(l_module_name);
3165         END IF;
3166         RETURN;
3167       END IF;
3168     END IF;
3169     -- End of OTM R12 : update delivery
3170 
3171     -- K LPN CONV. rv
3172     IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
3173     AND nvl(l_del_id_FOR_container.line_direction,'O') IN ('O', 'IO')
3174     AND
3175     (
3176       ((WSH_WMS_LPN_GRP.GK_WMS_PACK or WSH_WMS_LPN_GRP.GK_WMS_ASSIGN_DLVY) and l_wms_org = 'Y')
3177       OR
3178       ((WSH_WMS_LPN_GRP.GK_INV_PACK or WSH_WMS_LPN_GRP.GK_INV_ASSIGN_DLVY) and l_wms_org = 'N')
3179     )
3180     THEN
3181     --{
3182         l_sync_tmp_rec.delivery_detail_id := p_detail_id;
3183         l_sync_tmp_rec.parent_delivery_detail_id := l_del_id_for_detail.parent_delivery_detail_id;
3184         l_sync_tmp_rec.delivery_id := l_del_id_for_detail.delivery_id;
3185         l_sync_tmp_rec.operation_type := 'PRIOR';
3186         --
3187         IF l_debug_on THEN
3188             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
3189         END IF;
3190         --
3191         WSH_WMS_SYNC_TMP_PKG.MERGE
3192         (
3193           p_sync_tmp_rec      => l_sync_tmp_rec,
3194           x_return_status     => l_return_status
3195         );
3196         --
3197         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
3198         --
3199           x_return_status := l_return_status;
3200         --
3201           IF l_debug_on THEN
3202             WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
3203             WSH_DEBUG_SV.pop(l_module_name);
3204           END IF;
3205         --
3206           return;
3207         --
3208         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
3209         --
3210           l_num_warnings := l_num_warnings + 1;
3211         --
3212         END IF;
3213         --
3214     --}
3215     END IF;
3216     -- K LPN CONV. rv
3217     --
3218 
3219     UPDATE wsh_delivery_assignments_v
3220     SET parent_delivery_detail_id = p_parent_detail_id,
3221        delivery_id = l_del_id_for_container.delivery_id,
3222          last_update_date = SYSDATE,
3223          last_updated_by =  FND_GLOBAL.USER_ID,
3224          last_update_login =  FND_GLOBAL.LOGIN_ID
3225     WHERE delivery_detail_id = p_detail_id;
3226 
3227     -- OTM R12 : assign delivery detail
3228     IF (l_assign_update AND
3229         l_gc3_is_installed = 'Y' AND
3230         nvl(l_del_id_for_container.ignore_for_planning, 'N') = 'N') THEN
3231 
3232       IF (l_tms_update = 'Y') THEN
3233         l_tms_interface_flag := l_new_interface_flag_tab(1);
3234       ELSIF (l_trip_info_rec.status_code = 'OP' OR
3235              l_trip_not_found = 'Y') THEN
3236         l_tms_interface_flag := nvl(l_delivery_info.tms_interface_flag, WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT);
3237       ELSE
3238         l_tms_interface_flag := NULL;
3239       END IF;
3240 
3241       Post_Otm_Assign_Del_Detail
3242               (p_delivery_id         => l_del_id_for_container.delivery_id,
3243                p_delivery_was_empty  => l_delivery_was_empty,
3244                p_tms_interface_flag  => l_tms_interface_flag,
3245                p_gross_weight        => l_gross_weight1,  --using the gross weight of the detail
3246                x_return_status       => l_return_status);
3247 
3248       IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
3249         IF l_debug_on THEN
3250           WSH_DEBUG_SV.log(l_module_name,'error from Post_Otm_Assign_Del_Detail');
3251         END IF;
3252         raise FND_API.G_EXC_ERROR;
3253       ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
3254         l_num_warnings := l_num_warnings + 1;
3255       END IF;
3256     END IF;
3257     -- End of OTM R12 : assign delivery detail
3258 
3259     -- K: MDC delete consolidation record of it exists
3260     l_mdc_detail_tab(1) := p_detail_id;
3261     WSH_DELIVERY_DETAILS_ACTIONS.Delete_Consol_Record(
3262                        p_detail_id_tab   => l_mdc_detail_tab,
3263                        x_return_status   => x_return_status);
3264 
3265     IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
3266       IF l_debug_on THEN
3267         WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3268         WSH_DEBUG_SV.pop(l_module_name);
3269       END IF;
3270       return;
3271     END IF;
3272 
3273 
3274     /* H integration: Pricing integration csun , marking the delivery */
3275     m := m + 1;
3276     l_del_tab(m) := l_del_id_for_detail.delivery_id;
3277   ELSIF (l_del_id_for_container.delivery_id is null)
3278           OR   (l_del_id_for_container.delivery_id =  l_del_id_for_detail.delivery_id )THEN
3279     --
3280     -- K LPN CONV. rv
3281     -- Only packing.
3282     IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
3283     AND nvl(l_del_id_FOR_container.line_direction,'O') IN ('O', 'IO')
3284     AND
3285     (
3286       (WSH_WMS_LPN_GRP.GK_WMS_PACK and l_wms_org = 'Y')
3287       OR
3288       (WSH_WMS_LPN_GRP.GK_INV_PACK and l_wms_org = 'N')
3289     )
3290     THEN
3291     --{
3292         --
3293         l_sync_tmp_rec.delivery_detail_id := p_detail_id;
3294         l_sync_tmp_rec.parent_delivery_detail_id := l_del_id_for_detail.parent_delivery_detail_id;
3295         l_sync_tmp_rec.delivery_id := l_del_id_for_detail.delivery_id;
3296         l_sync_tmp_rec.operation_type := 'PRIOR';
3297         --
3298         IF l_debug_on THEN
3299             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
3300         END IF;
3301         --
3302         WSH_WMS_SYNC_TMP_PKG.MERGE
3303         (
3304           p_sync_tmp_rec      => l_sync_tmp_rec,
3305           x_return_status     => l_return_status
3306         );
3307         --
3308         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
3309         --
3310           x_return_status := l_return_status;
3311         --
3312           IF l_debug_on THEN
3313             WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
3314             WSH_DEBUG_SV.pop(l_module_name);
3315           END IF;
3316         --
3317           return;
3318         --
3319         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
3320         --
3321           l_num_warnings := l_num_warnings + 1;
3322         --
3323         END IF;
3324         --
3325     --}
3326     END IF;
3327     -- K LPN CONV. rv
3328     --
3329 
3330     UPDATE wsh_delivery_assignments_v
3331     SET parent_delivery_detail_id = p_parent_detail_id,
3332     last_update_date = SYSDATE,
3333     last_updated_by =  FND_GLOBAL.USER_ID,
3334     last_update_login =  FND_GLOBAL.LOGIN_ID
3335     WHERE delivery_detail_id = p_detail_id;
3336 
3337     l_mdc_detail_tab(1) := p_detail_id;
3338     WSH_DELIVERY_DETAILS_ACTIONS.Delete_Consol_Record(
3339                        p_detail_id_tab   => l_mdc_detail_tab,
3340                        x_return_status   => x_return_status);
3341 
3342     IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
3343       IF l_debug_on THEN
3344         WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3345         WSH_DEBUG_SV.pop(l_module_name);
3346       END IF;
3347       return;
3348     END IF;
3349   END IF;
3350 
3351   /* detail is already assigned to a delivery */
3352   /* updating delivery_id for all containers and details inside
3353      of the container AND updating delivery_id FOR all containers outside of the
3354      container */
3355   /* Bug 1571143 */
3356   /* bug 2677298 frontport from bug 2655474: update container only if it is not in delivery */
3357   IF (    (l_del_id_for_detail.delivery_id is not null)
3358             AND (l_del_id_for_container.delivery_id is null)  ) THEN
3359 
3360     -- K LPN CONV. rv
3361     -- Based on assumption that we are using wsh_delivery_assignments_v,
3362     -- delivery and its contents will belong to same organization.
3363     -- Similarly, container and its contents will belong to same organization.
3364     -- Hence, we are checking for WMS org or non-WMS org. at the
3365     -- parent level (i.e. delivery/container)
3366     -- rather than at line-level for performance reasons.
3367 
3368     -- If this assumptions were to be violated in anyway
3369     --    i.e Query was changed to refer to base table wsh_delivery_assignments instead of
3370     --     wsh_delivery_assignments_v
3371     -- or
3372     -- if existing query were to somehow return/fetch records where
3373     --    delivery and its contents may belong to diff. org.
3374     --    container and its contents may belong to diff. org.
3375     --    then
3376     --       Calls to check_wms_org needs to be re-adjusted at
3377     --       appropriate level (line/delivery/container).
3378     -- K LPN CONV. rv
3379 
3380     -- Bug 4452930
3381     OPEN c_topmost_container(p_parent_detail_id);
3382     FETCH c_topmost_container INTO l_topmost_cont;
3383     CLOSE c_topmost_container;
3384 
3385     IF   l_topmost_cont IS NULL THEN
3386       l_topmost_cont := p_parent_detail_id;
3387     END IF;
3388 
3389 
3390     -- OTM R12 : assign delivery detail,
3391     -- this is the case where container is assigned to delivery, had to get topmost container
3392 
3393     IF (l_gc3_is_installed = 'Y' AND
3394         nvl(l_del_id_for_container.ignore_for_planning, 'N') = 'N') THEN
3395 
3396       Pre_Otm_Assign_Del_Detail
3397               (p_delivery_id        => NULL,
3398                p_detail_id          => p_detail_id,
3399                p_container1_id      => l_topmost_cont,
3400                p_container2_id      => NULL,
3401                p_assignment_type    => 'DD2C',
3402                x_delivery_was_empty => l_delivery_was_empty,
3403                x_assign_update      => l_assign_update,
3404                x_gross_weight1      => l_gross_weight1,
3405                x_gross_weight2      => l_gross_weight2,
3406                x_return_status      => l_return_status);
3407 
3408       IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
3409         IF l_debug_on THEN
3410           WSH_DEBUG_SV.log(l_module_name,'error from Pre_Otm_Assign_Del_Detail');
3411         END IF;
3412         raise FND_API.G_EXC_ERROR;
3413       END IF;
3414     END IF;
3415     -- End of OTM R12 : assign delivery detail
3416 
3417 
3418     OPEN c_inside_outside_of_container(l_topmost_cont);
3419     -- Bug 4452930
3420     FETCH c_inside_outside_of_container bulk collect into
3421           l_sync_tmp_recTbl.delivery_detail_id_tbl,
3422           l_sync_tmp_recTbl.parent_detail_id_tbl,
3423           l_sync_tmp_recTbl.delivery_id_tbl;
3424 
3425     CLOSE c_inside_outside_of_container;
3426     IF (l_sync_tmp_recTbl.delivery_detail_id_tbl.count > 0 ) THEN
3427     --{
3428 
3429         --
3430         l_sync_tmp_recTbl.operation_type_tbl(1) := 'PRIOR';
3431         l_operation_type := 'PRIOR';
3432         --
3433         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
3434         AND nvl(l_del_id_for_detail.line_direction,'O') IN ('O', 'IO')
3435         AND
3436         (
3437           (WSH_WMS_LPN_GRP.GK_WMS_ASSIGN_DLVY and l_wms_org = 'Y')
3438           OR
3439           (WSH_WMS_LPN_GRP.GK_INV_ASSIGN_DLVY and l_wms_org = 'N')
3440         )
3441         THEN
3442         --{
3443             --
3444             IF l_debug_on THEN
3445                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
3446             END IF;
3447             --
3448             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
3449             (
3450               p_sync_tmp_recTbl   => l_sync_tmp_recTbl,
3451               x_return_status     => l_return_status,
3452               p_operation_type    => l_operation_type
3453             );
3454             --
3455             IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
3456             --
3457               x_return_status := l_return_status;
3458             --
3459               IF l_debug_on THEN
3460                 WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
3461                 WSH_DEBUG_SV.pop(l_module_name);
3462               END IF;
3463             --
3464               return;
3465             --
3466             ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
3467             --
3468               l_num_warnings := l_num_warnings + 1;
3469             --
3470             END IF;
3471             --
3472 
3473         --}
3474         END IF;
3475         --
3476 
3477         FORALL i in l_sync_tmp_recTbl.delivery_detail_id_tbl.first..l_sync_tmp_recTbl.delivery_detail_id_tbl.last
3478         UPDATE wsh_delivery_assignments_v
3479         SET delivery_id = l_del_id_FOR_detail.delivery_id,
3480             last_update_date = SYSDATE,
3481             last_updated_by =  FND_GLOBAL.USER_ID,
3482             last_update_login =  FND_GLOBAL.LOGIN_ID
3483         WHERE delivery_detail_id = l_sync_tmp_recTbl.delivery_detail_id_tbl(i);
3484 
3485         -- OTM R12 : assign delivery detail
3486         -- executed only once since it's for the same delivery
3487         IF (l_assign_update AND
3488             l_gc3_is_installed = 'Y' AND
3489             nvl(l_del_id_for_detail.ignore_for_planning, 'N') = 'N') THEN
3490 
3491           -- when it comes here, OTM R12 update delivery is not called before
3492           -- inside the same procedure, so can't use those variables
3493 
3494           l_tms_interface_flag := NULL;
3495 
3496           Post_Otm_Assign_Del_Detail
3497             (p_delivery_id         => l_del_id_for_detail.delivery_id,
3498              p_delivery_was_empty  => l_delivery_was_empty,
3499              p_tms_interface_flag  => l_tms_interface_flag,
3500              p_gross_weight        => l_gross_weight2, --using the container gross weight
3501              x_return_status       => l_return_status);
3502 
3503           IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
3504             IF l_debug_on THEN
3505               WSH_DEBUG_SV.log(l_module_name,'error from Post_Otm_Assign_Del_Detail');
3506             END IF;
3507             raise FND_API.G_EXC_ERROR;
3508           ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
3509             l_num_warnings := l_num_warnings + 1;
3510           END IF;
3511         END IF;
3512         -- End of OTM R12 : assign delivery detail
3513 
3514         FOR i in l_sync_tmp_recTbl.delivery_detail_id_tbl.first..l_sync_tmp_recTbl.delivery_detail_id_tbl.last LOOP
3515             l_mdc_detail_tab(i) := l_sync_tmp_recTbl.delivery_detail_id_tbl(i);
3516         END LOOP;
3517         WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
3518                        p_detail_id_tab => l_mdc_detail_tab,
3519                        x_return_status => x_return_status);
3520 
3521         IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
3522           IF l_debug_on THEN
3523             WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3524             WSH_DEBUG_SV.pop(l_module_name);
3525           END IF;
3526           return;
3527         END IF;
3528         l_mdc_detail_tab.delete;
3529         l_sync_tmp_recTbl.delivery_detail_id_tbl.delete;
3530         l_sync_tmp_recTbl.parent_detail_id_tbl.delete;
3531         l_sync_tmp_recTbl.delivery_id_tbl.delete;
3532         l_sync_tmp_recTbl.operation_type_tbl.delete;
3533 
3534     --}
3535     END IF;
3536     -- K LPN CONV. rv
3537 
3538                -- J: W/V Changes
3539                -- Container is being assigned to delivery. Call DD_WV_Post_Process to adjust the W/V of the parent
3540                IF l_debug_on THEN
3541                  WSH_DEBUG_SV.logmsg(l_module_name,'Assigning Container to Delivery');
3542                  WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
3543                END IF;
3544 
3545                WSH_WV_UTILS.DD_WV_Post_Process(
3546                  p_delivery_detail_id => p_parent_detail_id,
3547                  p_diff_gross_wt      => l_del_id_for_container.gross_weight,
3548                  p_diff_net_wt        => l_del_id_for_container.net_weight,
3549                  p_diff_volume        => l_del_id_for_container.volume,
3550                  p_diff_fill_volume   => l_del_id_for_container.volume,
3551                  x_return_status      => l_return_status);
3552 
3553                IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
3554                     --
3555                     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3556                     WSH_UTIL_CORE.Add_Message(x_return_status);
3557                     IF l_debug_on THEN
3558                         WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3559                         WSH_DEBUG_SV.pop(l_module_name);
3560                     END IF;
3561                     return;
3562                END IF;
3563 
3564 
3565     /* H integration: Pricing integration csun , marking the delivery */
3566     m := m + 1;
3567     l_del_tab(m) := l_del_id_for_detail.delivery_id;
3568 
3569    END IF;
3570 
3571 
3572          -- K LPN CONV. rv
3573          IF NOT( l_wms_org = 'Y' AND nvl(wsh_wms_lpn_grp.g_caller,'WSH') like 'WMS%')
3574          THEN
3575          --{
3576     -- J: W/V Changes
3577              IF l_debug_on THEN
3578                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
3579              END IF;
3580 
3581              WSH_WV_UTILS.DD_WV_Post_Process(
3582                p_delivery_detail_id => p_detail_id,
3583                p_diff_gross_wt      => l_del_id_for_detail.gross_weight,
3584                p_diff_net_wt        => l_del_id_for_detail.net_weight,
3585                p_diff_volume        => l_del_id_for_detail.volume,
3586                p_diff_fill_volume   => l_del_id_for_detail.volume,
3587                x_return_status      => l_return_status);
3588 
3589              IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
3590                 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3591                    l_num_warnings := l_num_warnings + 1;
3592                 ELSE
3593                   --
3594                   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3595                   WSH_UTIL_CORE.Add_Message(x_return_status);
3596                   IF l_debug_on THEN
3597                       WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3598                       WSH_DEBUG_SV.pop(l_module_name);
3599                   END IF;
3600                   return;
3601                 END IF;
3602              END IF;
3603          --}
3604          END IF;
3605          -- K LPN CONV. rv
3606 
3607    /*  H integration: Pricing integration csun   */
3608     IF l_del_tab.count > 0 THEN
3609     --
3610     IF l_debug_on THEN
3611         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
3612     END IF;
3613     --
3614     WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
3615        p_entity_type => 'DELIVERY',
3616        p_entity_ids   => l_del_tab,
3617        x_return_status => l_return_status);
3618     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3619        raise mark_reprice_error;
3620     END IF;
3621     END IF;
3622 
3623   IF l_num_warnings > 0 THEN
3624      x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
3625   END IF;
3626 
3627 --
3628 IF l_debug_on THEN
3629     WSH_DEBUG_SV.pop(l_module_name);
3630 END IF;
3631 --
3632   exception
3633 
3634   -- OTM R12 : assign delivery detail
3635   WHEN FND_API.G_EXC_ERROR then
3636     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3637     --
3638     IF l_debug_on THEN
3639         WSH_DEBUG_SV.pop(l_module_name);
3640     END IF;
3641     --
3642     RETURN;
3643   -- End of OTM R12 : assign delivery detail
3644 
3645   WHEN mark_reprice_error then
3646     FND_MESSAGE.Set_Name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
3647     x_return_status := l_return_status;
3648     WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
3649     --
3650     IF l_debug_on THEN
3651         WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
3652         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
3653     END IF;
3654     --
3655   WHEN invalid_detail then
3656     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3657     fnd_message.SET_name('WSH', 'WSH_DET_CONFIRMED_DETAIL');
3658     FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
3659     wsh_util_core.add_message(x_return_status,l_module_name);
3660     --
3661     IF l_debug_on THEN
3662         WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DETAIL exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
3663         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_DETAIL');
3664     END IF;
3665     --
3666     RETURN;
3667   WHEN others THEN
3668     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3669     wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_DETAIL_TO_CONT',l_module_name);
3670     --
3671     IF l_debug_on THEN
3672         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
3673         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3674     END IF;
3675     --
3676 END Assign_Detail_To_Cont;
3677 -- -------------------------------------------------------------------------------
3678 --Procedure:  Unssign_Detail_from_Cont
3679 --Parameters: p_detail_id,
3680 --    p_parent_detail_id,
3681 --    x_return_status
3682 --Description:  if detail is already assigned to a delivery which means
3683 --    the container must be assigned to the same delivery too,
3684 --    in this case even though the detail is getting removed
3685 --    from the container, it will still stay assigned to the
3686 --    delivery
3687 --    if the container is already assigned to a delivery,
3688 --    the detail must also be assigned to the same delivery
3689 
3690 
3691 PROCEDURE Unassign_Detail_from_Cont(
3692   p_detail_id   IN NUMBER,
3693   x_return_status   OUT NOCOPY  VARCHAR2,
3694   p_validate_flag   IN VARCHAR2)
3695 IS
3696 
3697 invalid_detail exception;
3698 -- J: W/V Changes
3699 e_abort        exception;
3700 l_param_info   WSH_SHIPPING_PARAMS_PVT.Parameter_Rec_Typ;
3701 l_cont_fill_pc NUMBER;
3702 
3703 /* H projects: pricing integration csun */
3704 l_del_tab   WSH_UTIL_CORE.Id_Tab_Type;
3705 l_return_status         VARCHAR2(1);
3706 l_del_rec  C_DEL_ID_FOR_CONT_OR_DETAIL%ROWTYPE;
3707 mark_reprice_error  EXCEPTION;
3708 
3709 l_num_warnings          number := 0;
3710 -- K LPN CONV. rv
3711 l_wms_org    VARCHAR2(10) := 'N';
3712 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
3713 l_mdc_detail_tab wsh_util_core.id_tab_type;
3714 
3715 cursor l_parent_cnt_csr (p_cnt_inst_id IN NUMBER) is
3716 select organization_id,
3717        nvl(line_direction,'O')
3718 from wsh_delivery_details
3719 where delivery_detail_id = p_cnt_inst_id
3720 and container_flag = 'Y'
3721 and source_code = 'WSH';
3722 
3723 l_parent_cnt_orgn_id NUMBER;
3724 l_parent_cnt_line_dir VARCHAR2(10);
3725 -- K LPN CONV. rv
3726 
3727 --
3728 l_debug_on BOOLEAN;
3729 --
3730 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_DETAIL_FROM_CONT';
3731 --
3732 BEGIN
3733   --
3734   --
3735   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3736   --
3737   IF l_debug_on IS NULL
3738   THEN
3739       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3740   END IF;
3741   --
3742   IF l_debug_on THEN
3743       WSH_DEBUG_SV.push(l_module_name);
3744       --
3745       WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
3746       WSH_DEBUG_SV.log(l_module_name,'P_VALIDATE_FLAG',P_VALIDATE_FLAG);
3747   END IF;
3748   --
3749   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3750 
3751         -- J: W/V Changes
3752   OPEN C_DEL_ID_FOR_CONT_OR_DETAIL(p_detail_id);
3753   FETCH C_DEL_ID_FOR_CONT_OR_DETAIL INTO l_del_rec;
3754   CLOSE C_DEL_ID_FOR_CONT_OR_DETAIL;
3755 
3756 
3757         IF l_del_rec.parent_delivery_detail_id is NULL THEN
3758           IF l_debug_on THEN
3759             WSH_DEBUG_SV.logmsg(l_module_name,'DD '||p_detail_id||' is already unassigned. Returning');
3760             WSH_DEBUG_SV.pop(l_module_name);
3761           END IF;
3762           return;
3763 
3764         -- LPN CONV. rv
3765         ELSE
3766           --
3767           open l_parent_cnt_csr(l_del_rec.parent_delivery_detail_id);
3768           fetch l_parent_cnt_csr into l_parent_cnt_orgn_id, l_parent_cnt_line_dir;
3769           close l_parent_cnt_csr;
3770           --
3771           IF l_debug_on THEN
3772             WSH_DEBUG_SV.log(l_module_name,' parent cnt orgn id is', l_parent_cnt_orgn_id);
3773             WSH_DEBUG_SV.log(l_module_name,' parent cnt line dir is', l_parent_cnt_line_dir);
3774           END IF;
3775           --
3776           l_wms_org := wsh_util_validate.check_wms_org(l_parent_cnt_orgn_id);
3777           --
3778         -- LPN CONV. rv
3779           --
3780         END IF;
3781 
3782   --
3783   IF l_debug_on THEN
3784       WSH_DEBUG_SV.log(l_module_name,'l_del_rec.released_status',l_del_rec.released_status);
3785   END IF;
3786   --
3787 
3788   IF l_del_rec.released_status = 'C' THEN
3789     Raise invalid_detail;
3790   END IF;
3791 
3792   -- K LPN CONV. rv
3793 
3794         IF NOT( l_wms_org = 'Y' AND nvl(wsh_wms_lpn_grp.g_caller,'WSH') like 'WMS%')
3795         THEN
3796         --{
3797 
3798             -- J: W/V Changes
3799             -- Decrement the DD W/V from container
3800             IF l_debug_on THEN
3801               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
3802             END IF;
3803 
3804             WSH_WV_UTILS.DD_WV_Post_Process(
3805               p_delivery_detail_id => p_detail_id,
3806               p_diff_gross_wt      => -1 * l_del_rec.gross_weight,
3807               p_diff_net_wt        => -1 * l_del_rec.net_weight,
3808               p_diff_volume        => -1 * l_del_rec.volume,
3809               p_diff_fill_volume   => -1 * l_del_rec.volume,
3810               p_check_for_empty    => 'Y',
3811               x_return_status      => l_return_status);
3812 
3813             IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
3814                 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3815                    l_num_warnings := l_num_warnings + 1;
3816                 ELSE
3817                  --
3818                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3819                  WSH_UTIL_CORE.Add_Message(x_return_status);
3820                  IF l_debug_on THEN
3821                      WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3822                      WSH_DEBUG_SV.pop(l_module_name);
3823                  END IF;
3824                  return;
3825                END IF;
3826             END IF;
3827         --}
3828         END IF;
3829 
3830   -- K LPN CONV. rv
3831   --
3832   -- K LPN CONV. rv
3833   IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
3834   AND nvl(l_parent_cnt_line_dir,'O') IN ('O', 'IO')
3835   AND
3836   (
3837     (WSH_WMS_LPN_GRP.GK_WMS_UNPACK and l_wms_org = 'Y')
3838     OR
3839     (WSH_WMS_LPN_GRP.GK_INV_UNPACK and l_wms_org = 'N')
3840   )
3841   THEN
3842   --{
3843       l_sync_tmp_rec.delivery_detail_id := p_detail_id;
3844       l_sync_tmp_rec.parent_delivery_detail_id := l_del_rec.parent_delivery_detail_id;
3845       l_sync_tmp_rec.delivery_id := l_del_rec.delivery_id;
3846       l_sync_tmp_rec.operation_type := 'PRIOR';
3847       --
3848       IF l_debug_on THEN
3849           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
3850       END IF;
3851       --
3852       WSH_WMS_SYNC_TMP_PKG.MERGE
3853       (
3854         p_sync_tmp_rec      => l_sync_tmp_rec,
3855         x_return_status     => l_return_status
3856       );
3857 
3858       IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
3859       THEN
3860         IF l_debug_on THEN
3861           WSH_DEBUG_SV.log(l_module_name,'WSH_WMS_SYNC_TMP_PKG.MERGE returned ',l_return_status);
3862         END IF;
3863         RAISE e_abort;
3864       ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3865         l_num_warnings := l_num_warnings + 1;
3866       END IF;
3867   --}
3868   END IF;
3869   -- K LPN CONV. rv
3870   --
3871   UPDATE wsh_delivery_assignments_v
3872   SET parent_delivery_detail_id = NULL,
3873     last_update_date = SYSDATE,
3874     last_updated_by =  FND_GLOBAL.USER_ID,
3875     last_update_login =  FND_GLOBAL.LOGIN_ID
3876   WHERE delivery_detail_id = p_detail_id;
3877   l_mdc_detail_tab(1) := p_detail_id;
3878   WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
3879                        p_detail_id_tab   => l_mdc_detail_tab,
3880                        x_return_status => x_return_status);
3881 
3882   IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
3883     IF l_debug_on THEN
3884       WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
3885       WSH_DEBUG_SV.pop(l_module_name);
3886     END IF;
3887     return;
3888   END IF;
3889   -- J: W/V Changes
3890   -- Need to recalculate the fill% if 'Percent Fill Basis' is Quantity
3891   -- Reason: DD_WV_Post_Process would have calculated the fill% but the delivery detail is not unassigned at
3892   --         that point of time. So the fill% will be wrong if 'Percent Fill Basis' is Quantity since the fill%
3893   --         calculation considers the delivery detail which is not yet unassigned
3894   IF l_debug_on THEN
3895     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_SHIPPING_PARAMS_PVT.Get',WSH_DEBUG_SV.C_PROC_LEVEL);
3896   END IF;
3897 
3898   WSH_SHIPPING_PARAMS_PVT.Get(
3899     p_organization_id => l_del_rec.organization_id,
3900     x_param_info      => l_param_info,
3901     x_return_status   => l_return_status);
3902 
3903   IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
3904     IF l_debug_on THEN
3905       WSH_DEBUG_SV.logmsg(l_module_name,'WSH_SHIPPING_PARAMS_PVT.Get returned '||l_return_status);
3906     END IF;
3907     raise e_abort;
3908   END IF;
3909 
3910   IF (l_param_info.percent_fill_basis_flag = 'Q') THEN
3911 
3912     -- K LPN CONV. rv
3913     IF NOT( l_wms_org = 'Y' AND nvl(wsh_wms_lpn_grp.g_caller,'WSH') like 'WMS%')
3914     THEN
3915     --{
3916         IF l_debug_on THEN
3917           WSH_DEBUG_SV.logmsg(l_module_name,'Need to recalculate the fill% for container');
3918           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CALC_CONT_FILL_PC',WSH_DEBUG_SV.C_PROC_LEVEL);
3919         END IF;
3920 
3921              WSH_WV_UTILS.ADJUST_PARENT_WV(
3922               p_entity_type   => 'CONTAINER',
3923               p_entity_id     => l_del_rec.parent_delivery_detail_id,
3924               p_gross_weight  => 0,
3925               p_net_weight    => 0,
3926               p_volume        => 0,
3927               p_filled_volume => 0,
3928               p_wt_uom_code   => l_del_rec.weight_uom_code,
3929               p_vol_uom_code  => l_del_rec.volume_uom_code,
3930               p_inv_item_id   => l_del_rec.inventory_item_id,
3931               x_return_status => l_return_status);
3932 
3933             IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
3934  	       THEN
3935                IF l_debug_on THEN
3936                 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_WV_UTILS.ADJUST_PARENT_WV returned '||l_return_status);
3937                END IF;
3938                RAISE e_abort;
3939             ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3940                l_num_warnings := l_num_warnings + 1;
3941             END IF;
3942 
3943     --}
3944     END IF;
3945     -- K LPN CONV. rv
3946   END IF;
3947 
3948   --
3949   IF l_debug_on THEN
3950       WSH_DEBUG_SV.log(l_module_name,'Delivery Id for l_del_rec',l_del_rec.delivery_id);
3951   END IF;
3952   --
3953 
3954         -- J: W/V Changes
3955         -- Assign the DD W/V back to delivery
3956         IF l_del_rec.delivery_id IS NOT NULL THEN
3957           IF l_debug_on THEN
3958             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
3959           END IF;
3960 
3961           WSH_WV_UTILS.DD_WV_Post_Process(
3962             p_delivery_detail_id => p_detail_id,
3963             p_diff_gross_wt      => l_del_rec.gross_weight,
3964             p_diff_net_wt        => l_del_rec.net_weight,
3965             p_diff_volume        => l_del_rec.volume,
3966             p_diff_fill_volume   => l_del_rec.volume,
3967             x_return_status      => l_return_status);
3968           IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
3969             IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3970                l_num_warnings := l_num_warnings + 1;
3971             ELSE
3972                --
3973                x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3974                WSH_UTIL_CORE.Add_Message(x_return_status);
3975                IF l_debug_on THEN
3976                    WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3977                    WSH_DEBUG_SV.pop(l_module_name);
3978                END IF;
3979                return;
3980             END IF;
3981           END IF;
3982 
3983         END IF;
3984 
3985   /*  H integration: Pricing integration csun */
3986   IF l_del_rec.delivery_id IS not NULL THEN
3987      l_del_tab.delete;
3988      l_del_tab(1) := l_del_rec.delivery_id;
3989     --
3990     IF l_debug_on THEN
3991         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
3992     END IF;
3993     --
3994     WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
3995        p_entity_type => 'DELIVERY',
3996        p_entity_ids   => l_del_tab,
3997        x_return_status => l_return_status);
3998     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3999        raise mark_reprice_error;
4000     END IF;
4001   END IF;
4002 
4003   IF l_num_warnings > 0 THEN
4004      x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4005   END IF;
4006 
4007 --
4008 IF l_debug_on THEN
4009     WSH_DEBUG_SV.pop(l_module_name);
4010 END IF;
4011 --
4012 exception
4013   -- J: W/V Changes
4014   WHEN e_abort THEN
4015     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4016     IF l_debug_on THEN
4017       WSH_DEBUG_SV.pop(l_module_name);
4018     END IF;
4019 
4020   WHEN mark_reprice_error THEN
4021     FND_MESSAGE.Set_Name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
4022     x_return_status := l_return_status;
4023     WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
4024 
4025 --
4026 IF l_debug_on THEN
4027     WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
4028     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
4029 END IF;
4030 --
4031   WHEN invalid_detail then
4032     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4033     fnd_message.SET_name('WSH', 'WSH_DET_CONFIRMED_DETAIL');
4034     FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
4035     wsh_util_core.add_message(x_return_status,l_module_name);
4036     --
4037     IF l_debug_on THEN
4038         WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DETAIL exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
4039         WSH_DEBUG_SV.pop(l_module_name);
4040     END IF;
4041     --
4042     RETURN;
4043   WHEN others THEN
4044     wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_DETAIL_FROM_CONT',l_module_name);
4045     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4046 
4047 --
4048 IF l_debug_on THEN
4049     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4050     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4051 END IF;
4052 --
4053 END Unassign_Detail_FROM_Cont;
4054 
4055 
4056 -- THIS PROCEDURE IS OBSOLETE
4057 --
4058 --Procedure:       Assign_Cont_To_Delivery
4059 --Parameters:      p_detail_id,
4060 --         p_delivery_id,
4061 --         x_return_status
4062 --Description:     This procedure is called when assigning a container to
4063 --              a delivery.
4064 --              It assigns all delivery lines and child containers to
4065 --              the delivery as well.
4066 --changing to just call assign_detail_to_delivery
4067 
4068 PROCEDURE Assign_Cont_To_Delivery(
4069   P_DETAIL_ID IN NUMBER,
4070   P_DELIVERY_ID  IN NUMBER,
4071   X_RETURN_STATUS OUT NOCOPY  VARCHAR2) IS
4072 assign_cont_del exception;
4073 --
4074 l_debug_on BOOLEAN;
4075 --
4076 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'ASSIGN_CONT_TO_DELIVERY';
4077 --
4078 BEGIN
4079   --
4080   --
4081   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4082   --
4083   --
4084 END Assign_Cont_To_Delivery;
4085 
4086 
4087 -------------------------------------------------------------------
4088 --Assign_Top_Detail_To_Delivery should only be called for the topmost
4089 --container in a hierarchy/detail (if it is a loose detail) assigns
4090 --all the details below (including containers) to delivery
4091 -- x_dlvy_has_lines : 'Y' :delivery has non-container lines.
4092 --                    'N' : delivery does not have non-container lines
4093 -- x_dlvy_freight_Terms_code : Delivery's freight term code
4094 -------------------------------------------------------------------
4095 
4096 
4097 PROCEDURE Assign_Top_Detail_To_Delivery(
4098   P_DETAIL_ID     IN NUMBER,
4099   P_DELIVERY_ID   IN NUMBER,
4100   X_RETURN_STATUS OUT NOCOPY  VARCHAR2,
4101     x_dlvy_has_lines          IN OUT NOCOPY VARCHAR2,    --
4102     x_dlvy_freight_terms_code IN OUT NOCOPY VARCHAR2,    -- J-IB-NPARIKH
4103     p_caller        IN VARCHAR2 --bug 5100229
4104     ) IS
4105 
4106 TYPE del_det_id_tab_type IS TABLE OF wsh_delivery_details.delivery_detail_id%TYPE INDEX BY BINARY_INTEGER;
4107 
4108 l_rowid varchar2(150);
4109 l_delivery_assignment_id NUMBER;
4110 --  cont_id NUMBER;
4111 del_id NUMBER;
4112 l_summary varchar2(3000);
4113 l_details varchar2(3000);
4114 l_get_msg_count number;
4115 
4116 l_cr_assn_status varchar2(30);
4117 l_group_status varchar2(30);
4118 l_arrival_status varchar2(30);
4119 l_ship_method_match BOOLEAN;
4120 
4121 l_attr_flag VARCHAR2(1) := 'N';
4122 l_cont_name VARCHAR2(30);
4123 
4124 invalid_del exception;
4125 invalid_detail exception;
4126 del_not_updatable exception;
4127 grouping_attributes_not_match exception;
4128 arrival_SET_failed exception;
4129 ship_method_not_match exception;
4130 l_delivery_assignments_info WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_Type;
4131 l_mdc_detail_tab wsh_util_core.id_tab_type;
4132 DETAIL_DEL_FROM_to_not_SAME exception;
4133 det_confirmed exception;
4134 update_mol_carton_group_error exception;
4135 
4136 
4137 CURSOR c_delivery IS
4138 SELECT status_code,planned_flag, initial_pickup_location_id,ultimate_dropoff_location_id,
4139 customer_id, intmed_ship_to_location_id, fob_code, freight_terms_code, ship_method_code,
4140 carrier_id, mode_of_transport, service_level,
4141 -- deliveryMerge
4142 batch_id,
4143         NVL(shipment_direction,'O') shipment_direction,   -- J-IB-NPARIKH
4144         shipping_control,   -- J-IB-NPARIKH
4145         vendor_id,   -- J-IB-NPARIKH
4146         party_id,   -- J-IB-NPARIKH
4147         NVL(ignore_for_planning,'N') ignore_for_planning, --J TP Release ttrichy
4148         organization_id,    -- K LPN CONV. rv
4149         client_id  -- LSP PROJECT
4150 FROM wsh_new_deliveries
4151 WHERE delivery_id = p_delivery_id;
4152 l_del c_delivery%ROWTYPE;
4153 
4154 CURSOR c_detail(c_detail_id NUMBER) IS
4155 SELECT wdd.delivery_detail_id, wdd.released_status, wdd.container_flag, wdd.ship_from_location_id, wdd.ship_to_location_id, wda.delivery_id, wdd.move_order_line_id, wdd.organization_id,
4156        wdd.freight_terms_code,   -- J-IB-NPARIKH
4157        NVL(line_direction,'O') line_direction,   -- J-IB-NPARIKH
4158        shipping_control,   -- J-IB-NPARIKH
4159        vendor_id,   -- J-IB-NPARIKH
4160        party_id,   -- J-IB-NPARIKH
4161        NVL(ignore_for_planning,'N') ignore_for_planning,--J TP Release ttrichy
4162        mode_of_transport, carrier_id, service_level,
4163        wda.parent_delivery_detail_id, -- K LPN CONV. rv
4164        wdd.gross_weight,               -- OTM R12 : assign delivery detail
4165        wdd.client_id -- LSP PROJECT
4166 FROM wsh_delivery_details wdd, wsh_delivery_assignments_v wda
4167 WHERE wdd.delivery_detail_id = wda.delivery_detail_id and wdd.delivery_detail_id = c_detail_id;
4168 
4169 
4170 l_detail c_detail%ROWTYPE;
4171 
4172 l_del_assign NUMBER;
4173 
4174 CURSOR c_all_details_below IS
4175 SELECT  delivery_detail_id
4176 FROM  wsh_delivery_assignments_v
4177 START WITH  delivery_detail_id = p_detail_id
4178 CONNECT BY  prior delivery_detail_id = parent_delivery_detail_id;
4179 
4180 CURSOR c_getdet_ignore IS
4181 select NVL(ignore_for_planning, 'N') ignore_for_planning
4182 from wsh_delivery_details
4183 where delivery_detail_id=p_detail_id;
4184 
4185 -- J: W/V Changes
4186 l_detail_status         VARCHAR2(1);
4187 l_gross_wt              NUMBER;
4188 l_net_wt                NUMBER;
4189 l_vol                   NUMBER;
4190 l_container_flag        VARCHAR2(1);
4191 l_delivery_id           NUMBER;
4192 
4193 l_service_level         VARCHAR2(30);
4194 l_mode_of_transport     VARCHAR2(30);
4195 l_ship_method     VARCHAR2(30);
4196 l_carrier_id            NUMBER;
4197 
4198 l_dd_id      del_det_id_tab_type;
4199 i        BINARY_INTEGER := 0;
4200 j        BINARY_INTEGER :=0;
4201 
4202 l_dummy_del_det_id NUMBER;
4203 
4204 /* H projects: pricing integration csun */
4205 l_scc_unassign_from_del  NUMBER := 0;
4206 l_del_tab   WSH_UTIL_CORE.Id_Tab_Type;
4207 l_status                WSH_LOOKUPS.meaning%TYPE;
4208 l_return_status         VARCHAR2(1);
4209 
4210 CURSOR get_lookup (l_code VARCHAR2) IS
4211   SELECT meaning
4212   FROM wsh_lookups
4213   WHERE lookup_type = 'DELIVERY_STATUS'
4214   AND lookup_code = l_code;
4215 
4216 mark_reprice_error  EXCEPTION;
4217 l_dlvy_freight_terms_code VARCHAR2(30);
4218 l_update_dlvy             BOOLEAN;
4219 
4220 
4221 l_msg_count      NUMBER;
4222 l_msg_data       VARCHAR2(4000);
4223 
4224 -- bug 2691385
4225 l_detail_is_empty_cont VARCHAR2(1) := 'N';
4226 
4227 l_attr_tab  wsh_delivery_autocreate.grp_attr_tab_type;
4228 l_group_tab  wsh_delivery_autocreate.grp_attr_tab_type;
4229 l_action_rec wsh_delivery_autocreate.action_rec_type;
4230 l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
4231 l_matched_entities wsh_util_core.id_tab_type;
4232 l_out_rec wsh_delivery_autocreate.out_rec_type;
4233 
4234 -- K LPN CONV. rv
4235 l_detail_wms_org    VARCHAR2(10) := 'N';
4236 l_line_dir          VARCHAR2(10);
4237 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
4238 l_num_warnings NUMBER := 0;
4239 -- K LPN CONV. rv
4240 
4241 -- OTM R12 : update delivery
4242 l_delivery_info_tab       WSH_NEW_DELIVERIES_PVT.Delivery_Attr_Tbl_Type;
4243 l_delivery_info           WSH_NEW_DELIVERIES_PVT.Delivery_Rec_Type;
4244 l_new_interface_flag_tab  WSH_UTIL_CORE.COLUMN_TAB_TYPE;
4245 l_tms_update              VARCHAR2(1);
4246 l_trip_not_found          VARCHAR2(1);
4247 l_trip_info_rec           WSH_DELIVERY_VALIDATIONS.trip_info_rec_type;
4248 l_tms_version_number      WSH_NEW_DELIVERIES.TMS_VERSION_NUMBER%TYPE;
4249 l_gc3_is_installed        VARCHAR2(1);
4250 
4251 -- End of OTM R12 : update delivery
4252 
4253 -- OTM R12 : assign delivery detail
4254 l_delivery_was_empty      BOOLEAN;
4255 l_tms_interface_flag      WSH_NEW_DELIVERIES.TMS_INTERFACE_FLAG%TYPE;
4256 l_gross_weight1           WSH_DELIVERY_DETAILS.GROSS_WEIGHT%TYPE;
4257 l_gross_weight2           WSH_DELIVERY_DETAILS.GROSS_WEIGHT%TYPE;
4258 l_delivery_detail_ids     WSH_GLBL_VAR_STRCT_GRP.NUM_TBL_TYPE;
4259 l_assign_update           BOOLEAN;
4260 -- End of OTM R12 : assign delivery detail
4261 --
4262 l_client_id               NUMBER; -- LSP PROJECT
4263 --
4264 l_debug_on BOOLEAN;
4265 --
4266 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'ASSIGN_TOP_DETAIL_TO_DELIVERY';
4267 --
4268 BEGIN
4269   --
4270   --
4271   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4272   --
4273   IF l_debug_on IS NULL
4274   THEN
4275       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4276   END IF;
4277   --
4278   IF l_debug_on THEN
4279       WSH_DEBUG_SV.push(l_module_name);
4280       --
4281       WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
4282       WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
4283             WSH_DEBUG_SV.log(l_module_name,'x_dlvy_has_lines',x_dlvy_has_lines);
4284       WSH_DEBUG_SV.log(l_module_name,'P_CALLER',P_CALLER);
4285   END IF;
4286   --
4287   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4288 
4289   -- OTM R12
4290   l_gc3_is_installed := WSH_UTIL_CORE.G_GC3_IS_INSTALLED;
4291 
4292   IF (l_gc3_is_installed IS NULL) THEN
4293     l_gc3_is_installed := WSH_UTIL_CORE.GC3_IS_INSTALLED;
4294   END IF;
4295   l_assign_update := FALSE; --default assignment tms update to false
4296   -- End of OTM R12
4297 
4298         -- J: W/V Changes
4299         open g_get_detail_info(p_detail_id);
4300         fetch g_get_detail_info
4301         into l_detail_status,l_gross_wt, l_net_wt, l_vol, l_container_flag, l_delivery_id;
4302         close  g_get_detail_info;
4303 
4304         IF l_delivery_id is NOT NULL THEN
4305           IF l_delivery_id <> p_delivery_id THEN
4306             FND_MESSAGE.SET_NAME('WSH','WSH_DET_ASSIGNED_DEL');
4307             FND_MESSAGE.SET_TOKEN('DET_NAME',p_detail_id);
4308             FND_MESSAGE.SET_TOKEN('DEL_NAME',l_delivery_id);
4309             x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4310             wsh_util_core.add_message(x_return_status,l_module_name);
4311             --
4312             IF l_debug_on THEN
4313               WSH_DEBUG_SV.pop(l_module_name);
4314             END IF;
4315             --
4316             RETURN;
4317           ELSE
4318             IF l_debug_on THEN
4319               WSH_DEBUG_SV.logmsg(l_module_name,'DD '||p_detail_id||' is already assigned to '||l_delivery_id||'. Returning');
4320               WSH_DEBUG_SV.pop(l_module_name);
4321             END IF;
4322             return;
4323           END IF;
4324         END IF;
4325 
4326 
4327     --
4328     -- J-IB-NPARIKH-{
4329     IF x_dlvy_has_lines IS NULL
4330     THEN
4331     --{
4332         FND_MESSAGE.SET_NAME('WSH', 'WSH_REQUIRED_FIELD_NULL');
4333         FND_MESSAGE.SET_TOKEN('FIELD_NAME', 'x_dlvy_has_lines');
4334         RAISE FND_API.G_EXC_ERROR;
4335     --}
4336     END IF;
4337     -- J-IB-NPARIKH-}
4338     --
4339     --
4340   OPEN c_delivery;
4341   FETCH c_delivery into l_del;
4342   IF (c_delivery%NOTFOUND) THEN
4343     CLOSE c_delivery;
4344     RAISE INVALID_DEL;
4345   END IF;
4346 
4347   CLOSE c_delivery;
4348 
4349   --
4350   IF l_debug_on THEN
4351     WSH_DEBUG_SV.log(l_module_name,'status_code',l_del.status_code);
4352    WSH_DEBUG_SV.log(l_module_name,'Delivery Freight Terms',l_del.freight_Terms_code);
4353   END IF;
4354   --
4355   /* security rule, delivery status should be open or packed and not planned  */
4356   /* the value for the flag can be Y or N updated with Bug 1559785*/
4357   IF ((l_del.status_code = 'CO') OR
4358       (l_del.status_code = 'IT') OR
4359       (l_del.status_code = 'CL') OR
4360       (l_del.status_code = 'SR') OR -- sperera 940/945
4361       (l_del.status_code = 'SC') OR
4362       (l_del.planned_flag IN ('Y','F')))
4363      AND l_del.shipment_direction IN ('O','IO')   -- J-IB-NPARIKH
4364   THEN
4365      IF l_del.planned_flag IN ('Y','F') THEN
4366         fnd_message.SET_name('WSH', 'WSH_PLAN_DEL_NOT_UPDATABLE');
4367      ELSE
4368         OPEN get_lookup(l_del.status_code);
4369         FETCH get_lookup INTO l_status;
4370         CLOSE get_lookup;
4371         fnd_message.SET_name('WSH', 'WSH_DET_DEL_NOT_UPDATABLE');
4372         FND_MESSAGE.SET_TOKEN('STATUS',l_status);
4373      END IF;
4374      RAISE DEL_NOT_UPDATABLE;
4375   END IF;
4376 
4377 
4378   -- OTM R12 : assign delivery detail
4379   IF (l_gc3_is_installed = 'Y' AND
4380       nvl(l_del.ignore_for_planning, 'N') = 'N') THEN
4381 
4382     Pre_Otm_Assign_Del_Detail
4383               (p_delivery_id        => p_delivery_id,
4384                p_detail_id          => p_detail_id,
4385                p_container1_id      => NULL,
4386                p_container2_id      => NULL,
4387                p_assignment_type    => 'DD2D',
4388                x_delivery_was_empty => l_delivery_was_empty,
4389                x_assign_update      => l_assign_update,
4390                x_gross_weight1      => l_gross_weight1,
4391                x_gross_weight2      => l_gross_weight2,
4392                x_return_status      => l_return_status);
4393 
4394     IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
4395       IF l_debug_on THEN
4396         WSH_DEBUG_SV.log(l_module_name,'error from Pre_Otm_Assign_Del_Detail');
4397       END IF;
4398       raise FND_API.G_EXC_ERROR;
4399     END IF;
4400   END IF;
4401   -- End of OTM R12 : assign delivery detail
4402 
4403        --J TP Release ttrichy
4404        FOR cur in c_getdet_ignore LOOP
4405           IF l_del.ignore_for_planning <> cur.ignore_for_planning THEN
4406              fnd_message.set_name('WSH', 'WSH_DET_DEL_DIFF_IGNOREPLAN');
4407              IF l_debug_on THEN
4408                   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4409              END IF;
4410              fnd_message.set_token('ENTITY1',nvl(wsh_container_utilities.get_cont_name(p_detail_id), p_detail_id));
4411              IF l_debug_on THEN
4412                   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.GET_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4413              END IF;
4414              fnd_message.set_token('ENTITY2',wsh_new_deliveries_pvt.get_name(p_delivery_id));
4415           END IF;
4416        END LOOP;
4417 
4418   OPEN c_all_details_below;
4419   --for locking all details
4420   LOOP
4421     FETCH c_all_details_below into l_dd_id(i);
4422     EXIT WHEN c_all_details_below%notfound;
4423     SELECT l_dd_id(i) into l_dummy_del_det_id
4424     FROM wsh_delivery_details
4425     WHERE delivery_detail_id=l_dd_id(i)
4426     FOR UPDATE NOWAIT;
4427     i:=i+1;
4428   END LOOP;
4429   CLOSE c_all_details_below;
4430 
4431   FOR j IN 0..(l_dd_id.COUNT-1) LOOP
4432     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4433    /* For each detail */
4434     IF (l_dd_id(j) < 0) THEN
4435       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4436       fnd_message.SET_name('WSH', 'WSH_DET_DETAIL_NOT_ASSIGNED');
4437       wsh_util_core.add_message(x_return_status,l_module_name);
4438       --
4439       IF l_debug_on THEN
4440         WSH_DEBUG_SV.pop(l_module_name);
4441       END IF;
4442       --
4443       RETURN;
4444     END IF;
4445 
4446 
4447 
4448 
4449     OPEN c_detail(l_dd_id(j));
4450     FETCH c_detail into l_detail;
4451     CLOSE c_detail;
4452 
4453       --
4454       IF l_debug_on THEN
4455         WSH_DEBUG_SV.log(l_module_name,'Released Status',l_detail.released_status);
4456         WSH_DEBUG_SV.log(l_module_name,'Delivery Id',l_detail.delivery_id);
4457         WSH_DEBUG_SV.log(l_module_name,'p_Delivery Id',p_delivery_id);
4458        WSH_DEBUG_SV.log(l_module_name,'Line Freight Terms',l_detail.freight_Terms_code);
4459       END IF;
4460       --
4461     --
4462     -- Bypass this check for inbound lines as a they can be assigned to delivery
4463     -- during ASN/Receipt integration, (line status is C)
4464     --
4465     IF l_detail.released_status = 'C'
4466       AND l_detail.line_direction IN ('O','IO')   -- J-IB-NPARIKH
4467       THEN
4468       RAISE DET_CONFIRMED;
4469     END IF;
4470 
4471 
4472     IF  ((l_detail.delivery_id IS NOT NULL) AND (l_detail.delivery_id <> p_delivery_id)) THEN
4473        FND_MESSAGE.SET_NAME('WSH','WSH_DET_ASSIGNED_DEL');
4474        FND_MESSAGE.SET_TOKEN('DET_NAME',l_detail.delivery_detail_id);
4475             FND_MESSAGE.SET_TOKEN('DEL_NAME',l_detail.delivery_id);
4476        x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4477        wsh_util_core.add_message(x_return_status,l_module_name);
4478        --
4479        IF l_debug_on THEN
4480            WSH_DEBUG_SV.pop(l_module_name);
4481        END IF;
4482        --
4483        RETURN;
4484     END IF;
4485 
4486           IF l_detail.container_flag = 'Y' THEN --{ Bug 5100229
4487             -- bug 2691385 -  check to see if the container is empty
4488             WSH_CONTAINER_UTILITIES.Is_Empty (p_container_instance_id => l_dd_id(j),
4489                                             x_empty_flag => l_detail_is_empty_cont,
4490                                             x_return_status => x_return_status);
4491             IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
4492               return;
4493             END IF;
4494           ELSE --}{
4495              l_detail_is_empty_cont := 'E';
4496           END IF; --}
4497 
4498           -- If the container is empty, update the delivery grouping attributes for the container
4499           -- to be the delivery grouping attributes of the delivery.
4500           IF (l_detail_is_empty_cont = 'Y')
4501           THEN
4502           --{
4503                 IF  l_detail.line_direction  IN ('O','IO')
4504                 AND l_del.shipment_direction IN ('O','IO')
4505                 THEN
4506                     l_detail.line_direction := l_del.shipment_direction;
4507                 END IF;
4508                 --
4509                 /*
4510                 IF  l_detail.line_direction  NOT IN ('O','IO')
4511                 AND l_del.shipment_direction NOT IN ('O','IO')
4512                 THEN
4513                     l_detail.line_direction := l_del.shipment_direction;
4514                 END IF;
4515                 */
4516                 --
4517                 -- K LPN CONV. rv
4518                 --
4519                 l_detail_wms_org := wsh_util_validate.check_wms_org(l_detail.organization_id);
4520                 --
4521                 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
4522                 AND l_detail.line_direction IN ('O','IO')
4523                 AND
4524                 (
4525                   (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_detail_wms_org = 'Y')
4526                   OR
4527                   (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_detail_wms_org = 'N')
4528                 )
4529                 THEN
4530                 --{
4531                     l_sync_tmp_rec.delivery_detail_id := l_dd_id(j);
4532                     l_sync_tmp_rec.operation_type := 'UPDATE';
4533                     --
4534                     IF l_debug_on THEN
4535                         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
4536                     END IF;
4537                     --
4538                     WSH_WMS_SYNC_TMP_PKG.MERGE
4539                     (
4540                       p_sync_tmp_rec      => l_sync_tmp_rec,
4541                       x_return_status     => l_return_status
4542                     );
4543 
4544                     IF l_debug_on THEN
4545                       WSH_DEBUG_SV.log(l_module_name,'Return Status is ',l_return_status);
4546                     END IF;
4547                     --
4548                     IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
4549                     --
4550                       x_return_status := l_return_status;
4551                     --
4552                       IF l_debug_on THEN
4553                         WSH_DEBUG_SV.pop(l_module_name);
4554                       END IF;
4555                     --
4556                       return;
4557                     --
4558                     ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
4559                     --
4560                       l_num_warnings := l_num_warnings + 1;
4561                     --
4562                     END IF;
4563                     --
4564                 --}
4565                 END IF;
4566                 -- K LPN CONV. rv
4567 
4568                 UPDATE WSH_DELIVERY_DETAILS
4569                    SET ship_from_location_id = l_del.initial_pickup_location_id,
4570                        ship_to_location_id = l_del.ultimate_dropoff_location_id,
4571                        customer_id = l_del.customer_id,
4572                        intmed_ship_to_location_id = l_del.intmed_ship_to_location_id,
4573                        fob_code = l_del.fob_code,
4574                        freight_terms_code = l_del.freight_terms_code,
4575                        ship_method_code = l_del.ship_method_code,
4576                        service_level = l_del.service_level,
4577                        carrier_id = l_del.carrier_id,
4578                        mode_of_transport = l_del.mode_of_transport,
4579                        line_direction      = l_detail.line_direction ,   -- J-IB-NPARIKH
4580                        shipping_control    = l_del.shipping_control,   -- J-IB-NPARIKH
4581                        client_id           = l_del.client_id          -- LSP PROJECT
4582                  WHERE delivery_detail_id = l_dd_id(j);
4583 
4584                 IF (SQL%NOTFOUND) THEN
4585                   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4586                   RAISE NO_DATA_FOUND;
4587                 END IF;
4588 
4589                --Bug 3383843
4590                -- Need to open and fetch again because of previous updates
4591                OPEN c_detail(l_dd_id(j));
4592                FETCH c_detail into l_detail;
4593                CLOSE c_detail;
4594               -- Bug 3383843
4595 
4596           --}
4597           END IF;
4598           -- end 2691385
4599 
4600 
4601     IF l_detail.container_flag='Y' THEN
4602         --
4603         IF l_debug_on THEN
4604             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
4605         END IF;
4606         --
4607         WSH_CONTAINER_ACTIONS.Check_Cont_Attributes (
4608       l_detail.delivery_detail_id,
4609       l_attr_flag,
4610       x_return_status);
4611 
4612       IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4613       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4614       fnd_message.SET_name('WSH', 'WSH_CONT_ATTR_ERROR');
4615          FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_detail.delivery_detail_id);
4616       wsh_util_core.add_message(x_return_status,l_module_name);
4617       --
4618       IF l_debug_on THEN
4619           WSH_DEBUG_SV.pop(l_module_name);
4620       END IF;
4621       --
4622       return;
4623       END IF;
4624     END IF;
4625 
4626        /* security rule, group by attributes must be the same as the delivery's */
4627        /* Error */
4628        --
4629        IF l_debug_on THEN
4630            WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.CHECK_ASSIGN_DELIVERY',WSH_DEBUG_SV.C_PROC_LEVEL);
4631        END IF;
4632       --
4633 
4634        l_attr_tab(1).entity_id := p_delivery_id;
4635        l_attr_tab(1).entity_type := 'DELIVERY';
4636        l_attr_tab(2).entity_id := l_detail.delivery_detail_id;
4637        l_attr_tab(2).entity_type := 'DELIVERY_DETAIL';
4638 
4639        l_action_rec.action := 'MATCH_GROUPS';
4640        l_action_rec.check_single_grp := 'Y';
4641 
4642        -- IF this procedure is called from autocreate-delivery then
4643        -- the matching is already done.
4644 
4645        IF NVL(p_caller , 'WSH') <> 'AUTOCREATE' THEN --{ bug 5100229
4646           WSH_DELIVERY_AUTOCREATE.Find_Matching_Groups(p_attr_tab => l_attr_tab,
4647                         p_action_rec => l_action_rec,
4648                         p_target_rec => l_target_rec,
4649                         p_group_tab => l_group_tab,
4650                         x_matched_entities => l_matched_entities,
4651                         x_out_rec => l_out_rec,
4652                         x_return_status => l_group_status);
4653 
4654           IF (l_group_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
4655              x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4656              --
4657              IF l_debug_on THEN
4658                  WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
4659                  WSH_DEBUG_SV.pop(l_module_name);
4660              END IF;
4661              --
4662              RETURN;
4663           END IF;
4664        END IF; --}
4665 
4666        -- Pack J: Generic Carrier
4667        -- Update the ship method components in the delivery
4668        -- to match the assigned delivery_detail.
4669        -- Also update the line direction.
4670 
4671        IF NVL(p_caller, 'WSH')  <> 'AUTOCREATE' THEN --{ bug 5100229
4672 
4673           -- if this is called from autocreate delivery then the ship
4674           -- method componants are already set there for the delivery.
4675 
4676           l_service_level  := l_group_tab(l_group_tab.first).service_level;
4677           l_mode_of_transport  := l_group_tab(l_group_tab.first).mode_of_transport;
4678           l_carrier_id        :=  l_group_tab(l_group_tab.first).carrier_id;
4679           l_ship_method        :=  l_group_tab(l_group_tab.first).ship_method_code;
4680           l_client_id          :=  l_group_tab(l_group_tab.first).client_id; -- LSP PROJECT
4681        END IF; --}
4682 
4683        -- OTM R12 : update delivery
4684        l_tms_update := 'N';
4685        l_new_interface_flag_tab(1) := NULL;
4686 
4687        IF (l_gc3_is_installed = 'Y' AND
4688            nvl(l_del.ignore_for_planning, 'N') = 'N') THEN
4689          l_trip_not_found := 'N';
4690 
4691          --get trip information for delivery, no update when trip not OPEN
4692          WSH_DELIVERY_VALIDATIONS.get_trip_information
4693                       (p_delivery_id     => p_delivery_id,
4694                        x_trip_info_rec   => l_trip_info_rec,
4695                        x_return_status   => l_return_status);
4696 
4697          IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
4698            x_return_status := l_return_status;
4699            IF l_debug_on THEN
4700              WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_DELIVERY_VALIDATIONS.get_trip_information');
4701              WSH_DEBUG_SV.pop(l_module_name);
4702            END IF;
4703            RETURN;
4704          END IF;
4705 
4706          IF (l_trip_info_rec.trip_id IS NULL) THEN
4707            l_trip_not_found := 'Y';
4708          END IF;
4709 
4710          -- only do changes when there's no trip or trip status is OPEN
4711          IF (l_trip_info_rec.status_code = 'OP' OR
4712              l_trip_not_found = 'Y') THEN
4713 
4714            WSH_DELIVERY_VALIDATIONS.get_delivery_information(
4715                                  p_delivery_id   => p_delivery_id,
4716                                  x_delivery_rec  => l_delivery_info,
4717                                  x_return_status => l_return_status);
4718 
4719            IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
4720              x_return_status := l_return_status;
4721              IF l_debug_on THEN
4722                WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_DELIVERY_VALIDATIONS.get_delivery_information');
4723                WSH_DEBUG_SV.pop(l_module_name);
4724              END IF;
4725              RETURN;
4726            END IF;
4727 
4728            -- if delivery is include for planning and service level, mode of
4729            -- transport, carrier id, or ship mdethod is changed with the nvl
4730            -- updates, then update is needed
4731 
4732            IF (nvl(l_delivery_info.service_level,
4733                    nvl(l_service_level, '@@')) <>
4734                nvl(l_delivery_info.service_level, '@@') OR
4735                nvl(l_delivery_info.mode_of_transport,
4736                    nvl(l_mode_of_transport, '@@')) <>
4737                nvl(l_delivery_info.mode_of_transport, '@@') OR
4738                nvl(l_delivery_info.carrier_id, nvl(l_carrier_id, -1)) <>
4739                nvl(l_delivery_info.carrier_id, -1) OR
4740                nvl(l_delivery_info.ship_method_code,
4741                    nvl(l_ship_method, '@@')) <>
4742                nvl(l_delivery_info.ship_method_code, '@@')) THEN
4743 
4744              IF (l_delivery_info.tms_interface_flag NOT IN
4745                  (WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT,
4746                   WSH_NEW_DELIVERIES_PVT.C_TMS_CREATE_REQUIRED,
4747                   WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_REQUIRED,
4748                   WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_IN_PROCESS,
4749                   WSH_NEW_DELIVERIES_PVT.C_TMS_UPDATE_REQUIRED)) THEN
4750                l_tms_update := 'Y';
4751                l_delivery_info_tab(1) := l_delivery_info;
4752                l_new_interface_flag_tab(1) := WSH_NEW_DELIVERIES_PVT.C_TMS_UPDATE_REQUIRED;
4753                l_tms_version_number := nvl(l_delivery_info.tms_version_number, 1) + 1;
4754              END IF;
4755            END IF; -- checking the value differences
4756          END IF; -- IF ((l_trip_not_found = 'N' AND
4757        END IF; -- IF (l_gc3_is_installed = 'Y'
4758 
4759        IF l_debug_on THEN
4760          WSH_DEBUG_SV.log(l_module_name, 'l_gc3_is_installed', l_gc3_is_installed);
4761          WSH_DEBUG_SV.log(l_module_name, 'l_tms_update', l_tms_update);
4762          IF (l_tms_update = 'Y') THEN
4763            WSH_DEBUG_SV.log(l_module_name, 'l_new_interface_flag_tab', l_new_interface_flag_tab(1));
4764            WSH_DEBUG_SV.log(l_module_name, 'l_tms_version_number', l_tms_version_number);
4765          END IF;
4766        END IF;
4767 
4768        -- End of OTM R12 : update delivery
4769 
4770        UPDATE WSH_NEW_DELIVERIES
4771           SET MODE_OF_TRANSPORT = decode(mode_of_transport, NULL, l_mode_of_transport, mode_of_transport),
4772               SERVICE_LEVEL = decode(service_level, NULL, l_service_level, service_level),
4773               CARRIER_ID = decode(carrier_id, NULL, l_carrier_id, carrier_id),
4774               SHIP_METHOD_CODE = decode(ship_method_code, NULL, l_ship_method, ship_method_code),
4775               SHIPMENT_DIRECTION = l_detail.line_direction,
4776               -- OTM R12
4777               TMS_INTERFACE_FLAG = decode(l_tms_update, 'Y', l_new_interface_flag_tab(1), nvl(TMS_INTERFACE_FLAG, WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT)),
4778               TMS_VERSION_NUMBER = decode(l_tms_update, 'Y', l_tms_version_number, nvl(tms_version_number, 1)),
4779               -- End of OTM R12
4780               client_id          = decode(client_id,NULL,l_client_id,client_id) -- LSP PROJECT
4781         WHERE delivery_id = p_delivery_id;
4782 
4783        -- OTM R12 : update delivery
4784        IF (l_gc3_is_installed = 'Y' AND l_tms_update = 'Y') THEN
4785          WSH_XC_UTIL.LOG_OTM_EXCEPTION(
4786                 p_delivery_info_tab      => l_delivery_info_tab,
4787                 p_new_interface_flag_tab => l_new_interface_flag_tab,
4788                 x_return_status          => l_return_status);
4789 
4790          IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
4791            x_return_status := l_return_status;
4792            IF l_debug_on THEN
4793              WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_XC_UTIL.log_otm_exception');
4794              WSH_DEBUG_SV.pop(l_module_name);
4795            END IF;
4796            RETURN;
4797          END IF;
4798        END IF;
4799        -- End of OTM R12 : update delivery
4800 
4801   /* security rule, ship-to-location and ship-FROM-location must be the
4802   same as the delivery's */
4803   /* Error */
4804 
4805                   IF l_debug_on THEN
4806                      WSH_DEBUG_SV.log(l_module_name,'initial_pickup_location_id'
4807                                          ,l_del.initial_pickup_location_id);
4808                      WSH_DEBUG_SV.log(l_module_name,'ship_from_location_id',
4809                                           l_detail.ship_from_location_id);
4810                      WSH_DEBUG_SV.log(l_module_name,
4811                                           'ultimate_dropoff_location_id',
4812                                           l_del.ultimate_dropoff_location_id);
4813                      WSH_DEBUG_SV.log(l_module_name,'ship_to_location_id',
4814                                           l_detail.ship_to_location_id);
4815                    END IF;
4816        IF ((l_del.initial_pickup_location_id <> l_detail.ship_from_location_id)
4817         or (l_del.ultimate_dropoff_location_id <> l_detail.ship_to_location_id)
4818        or (l_detail.ship_to_location_id IS null)) THEN
4819       RAISE DETAIL_DEL_FROM_to_not_SAME ;
4820        END IF;
4821     --
4822     -- K LPN CONV. rv
4823     IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
4824     AND l_detail.line_direction IN ('O', 'IO')
4825     AND l_detail.container_flag='Y'
4826     AND
4827     (
4828       (WSH_WMS_LPN_GRP.GK_WMS_ASSIGN_DLVY and l_detail_wms_org = 'Y')
4829       OR
4830       (WSH_WMS_LPN_GRP.GK_INV_ASSIGN_DLVY and l_detail_wms_org = 'N')
4831     )
4832     THEN
4833     --{
4834         l_sync_tmp_rec.delivery_detail_id := l_detail.delivery_detail_id;
4835         l_sync_tmp_rec.parent_delivery_detail_id := l_detail.parent_delivery_detail_id;
4836         l_sync_tmp_rec.delivery_id := l_detail.delivery_id;
4837         l_sync_tmp_rec.operation_type := 'PRIOR';
4838         --
4839         IF l_debug_on THEN
4840             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
4841         END IF;
4842         --
4843         WSH_WMS_SYNC_TMP_PKG.MERGE
4844         (
4845           p_sync_tmp_rec      => l_sync_tmp_rec,
4846           x_return_status     => l_return_status
4847         );
4848 
4849         --
4850         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
4851         --
4852           x_return_status := l_return_status;
4853         --
4854           IF l_debug_on THEN
4855             WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
4856             WSH_DEBUG_SV.pop(l_module_name);
4857           END IF;
4858         --
4859           return;
4860         --
4861         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
4862         --
4863           l_num_warnings := l_num_warnings + 1;
4864         --
4865         END IF;
4866         --
4867     --}
4868     END IF;
4869     -- K LPN CONV. rv
4870     --
4871 
4872     UPDATE wsh_delivery_assignments
4873     SET delivery_id = p_delivery_id,
4874         last_update_date = SYSDATE,
4875         last_updated_by =  FND_GLOBAL.USER_ID,
4876         last_update_login =  FND_GLOBAL.LOGIN_ID
4877     WHERE delivery_detail_id = l_detail.delivery_detail_id
4878       AND (type IN ('S', 'O') OR type IS NULL);
4879 
4880     IF (SQL%NOTFOUND) THEN
4881            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4882            RAISE NO_DATA_FOUND;
4883     END IF;
4884 
4885     l_mdc_detail_tab(1) := l_detail.delivery_detail_id;
4886     WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
4887                        p_detail_id_tab     => l_mdc_detail_tab,
4888                        x_return_status => x_return_status);
4889 
4890     IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
4891       IF l_debug_on THEN
4892         WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
4893         WSH_DEBUG_SV.pop(l_module_name);
4894       END IF;
4895       return;
4896     END IF;
4897 
4898 
4899                 -- J-IB-NPARIKH-{
4900                 --
4901                 --
4902                 -- Set freight terms for inbound/drop-ship delivery
4903                 --   For non-empty delivery, set freight term to null,
4904                 --   if line's freight term is different
4905                 --   For an empty delivery, set freight term to line's value
4906                 --
4907                 x_dlvy_freight_terms_code := l_del.freight_terms_code;
4908                 --
4909                 IF  NVL(l_detail.container_flag,'N') = 'N'
4910                 AND l_detail.line_direction     NOT IN ('O','IO')
4911                 THEN
4912                 --{
4913                     IF  x_dlvy_has_lines                          = 'Y'
4914                     AND x_dlvy_freight_terms_code                 IS NOT NULL
4915                     AND NVL(l_detail.freight_terms_code,'!!!!!') <> x_dlvy_freight_terms_code
4916                     THEN
4917                         --
4918                         -- Non-empty delivery has different freight term than line's
4919                         -- So, we need to update delivery freight term to NULL
4920                         --
4921                         x_dlvy_freight_terms_code := NULL;
4922                     ELSIF x_dlvy_has_lines                          = 'N'
4923                     AND   NVL(l_detail.freight_terms_code,'!!!!!') <> NVL(x_dlvy_freight_terms_code,'!!!!!')
4924                     THEN
4925                         x_dlvy_freight_terms_code := l_detail.freight_terms_code;
4926                     END IF;
4927                     --
4928                     --
4929                     IF NVL(l_del.freight_terms_code,'!!!!!') <> NVL(x_dlvy_freight_terms_code,'!!!!!')
4930                     THEN
4931                     --{
4932                         --
4933                         IF l_debug_on THEN
4934                             WSH_DEBUG_SV.log(l_module_name,'Delivery updated Freight Terms',x_dlvy_freight_terms_code);
4935                         END IF;
4936                         --
4937 
4938                         -- OTM R12 : update delivery
4939                         -- no code changes are needed for the following update
4940                         -- since this routine is only for Inbound/drop-ship
4941                         -- deliveries, OTM flow will never reach here
4942 
4943                         UPDATE  wsh_new_deliveries
4944                         SET     freight_terms_code = x_dlvy_freight_terms_code,
4945                                 last_update_date   = SYSDATE,
4946                                 last_updated_by    = FND_GLOBAL.USER_ID,
4947                                 last_update_login  = FND_GLOBAL.LOGIN_ID
4948                         WHERE   delivery_id        = p_delivery_id;
4949                         --
4950                         IF (SQL%NOTFOUND)
4951                         THEN
4952                             x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4953                             RAISE INVALID_DEL;
4954                         END IF;
4955                     --}
4956                     END IF;
4957                 --}
4958                 END IF;
4959                 --
4960                 x_dlvy_has_lines := 'Y';
4961                 --
4962                 -- J-IB-NPARIKH-}
4963 
4964 
4965              IF (l_detail.released_status = WSH_DELIVERY_DETAILS_PKG.C_RELEASED_TO_WAREHOUSE) THEN
4966              --{
4967                IF (wsh_util_validate.Check_Wms_Org(l_detail.organization_id)='Y') AND
4968                   (l_detail.move_order_line_id IS NOT NULL AND
4969                    (WSH_USA_INV_PVT.is_mo_type_putaway
4970                          (p_move_order_line_id => l_detail.move_order_line_id) = 'N') -- X-dock
4971                   ) THEN -- check if  wms org
4972 
4973                -- Update Cartonization ID.
4974                IF l_debug_on THEN
4975                  WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_MO_CANCEL_PVT.update_mol_carton_group',WSH_DEBUG_SV.C_PROC_LEVEL);
4976                END IF;
4977 
4978                INV_MO_Cancel_PVT.update_mol_carton_group
4979                  (p_line_id            => l_detail.move_order_line_id,
4980                   p_carton_grouping_id => p_delivery_id,
4981                   x_return_status      => x_return_status,
4982                   x_msg_cnt            => l_msg_count,
4983                   x_msg_data           => l_msg_data);
4984 
4985                 IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
4986                                         WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
4987                   RAISE update_mol_carton_group_error;
4988                 END IF;
4989                END IF;
4990              --}
4991              END IF;
4992 
4993   --if container check attr flag, update container hierarchy
4994     IF l_detail.container_flag='Y' THEN
4995         IF l_attr_flag = 'N' THEN
4996         --
4997         IF l_debug_on THEN
4998             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
4999         END IF;
5000         --
5001         WSH_CONTAINER_ACTIONS.Update_Cont_Hierarchy (
5002             NULL,
5003             p_delivery_id,
5004             l_detail.delivery_detail_id,
5005             x_return_status);
5006         IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
5007           FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
5008           --
5009           IF l_debug_on THEN
5010               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5011           END IF;
5012           --
5013           l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_detail.delivery_detail_id);
5014           FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
5015           WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5016               --
5017               IF l_debug_on THEN
5018                   WSH_DEBUG_SV.pop(l_module_name);
5019               END IF;
5020               --
5021               return;
5022           END IF;
5023       END IF;
5024       x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
5025     END IF;--for container
5026     /* H projects: pricing integration csun , if any lines are
5027        successfully unassign from the delivery, the delivery needs to be marked
5028        for repricing */
5029     l_scc_unassign_from_del := l_scc_unassign_from_del + 1;
5030   END LOOP;
5031         /* For each detail*/
5032 
5033 
5034   -- OTM R12 : assign delivery detail
5035   IF (l_assign_update AND
5036       l_gc3_is_installed = 'Y' AND
5037       nvl(l_del.ignore_for_planning, 'N') = 'N') THEN
5038 
5039     IF (l_tms_update = 'Y') THEN
5040       l_tms_interface_flag := l_new_interface_flag_tab(1);
5041     ELSIF (l_trip_info_rec.status_code = 'OP' OR
5042            l_trip_not_found = 'Y') THEN
5043       l_tms_interface_flag := nvl(l_delivery_info.tms_interface_flag, WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT);
5044     ELSE
5045       l_tms_interface_flag := NULL;
5046     END IF;
5047 
5048     Post_Otm_Assign_Del_Detail
5049               (p_delivery_id         => p_delivery_id,
5050                p_delivery_was_empty  => l_delivery_was_empty,
5051                p_tms_interface_flag  => l_tms_interface_flag,
5052                p_gross_weight        => l_gross_weight1,
5053                x_return_status       => l_return_status);
5054 
5055     IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
5056       IF l_debug_on THEN
5057         WSH_DEBUG_SV.log(l_module_name,'error from Post_Otm_Assign_Del_Detail');
5058       END IF;
5059       raise FND_API.G_EXC_ERROR;
5060     ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
5061       l_num_warnings := l_num_warnings + 1;
5062     END IF;
5063   END IF;
5064   -- End of OTM R12 : assign delivery detail
5065 
5066         -- J: W/V Changes
5067         -- Increment the delivery W/V by DD W/V
5068         IF l_debug_on THEN
5069           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
5070         END IF;
5071         WSH_WV_UTILS.DD_WV_Post_Process(
5072           p_delivery_detail_id => p_detail_id,
5073           p_diff_gross_wt      => l_gross_wt,
5074           p_diff_net_wt        => l_net_wt,
5075           p_diff_volume        => l_vol,
5076           p_diff_fill_volume   => l_vol,
5077           x_return_status      => l_return_status);
5078 
5079         IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
5080              --
5081              x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5082              WSH_UTIL_CORE.Add_Message(x_return_status);
5083              IF l_debug_on THEN
5084                  WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
5085                  WSH_DEBUG_SV.pop(l_module_name);
5086              END IF;
5087              return;
5088         END IF;
5089 
5090   --
5091   IF l_debug_on THEN
5092            WSH_DEBUG_SV.log(l_module_name,'l_scc_unassign_from_del',
5093                             l_scc_unassign_from_del);
5094   END IF;
5095 
5096         /*  H integration: Pricing integration csun */
5097         IF l_scc_unassign_from_del > 0 THEN
5098                 l_del_tab.delete;
5099                 l_del_tab(1) := p_delivery_id;
5100 
5101     --
5102     IF l_debug_on THEN
5103         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
5104     END IF;
5105     --
5106     WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
5107        p_entity_type => 'DELIVERY',
5108        p_entity_ids   => l_del_tab,
5109        x_return_status => l_return_status);
5110     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
5111        raise mark_reprice_error;
5112           END IF;
5113   END IF;
5114 
5115   -- LPN CONV. rv
5116   IF (l_num_warnings > 0 AND x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
5117     --
5118     x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
5119     --
5120   ELSE
5121     --
5122     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
5123     --
5124   END IF;
5125   -- LPN CONV. rv
5126 
5127 
5128 --
5129 IF l_debug_on THEN
5130     WSH_DEBUG_SV.pop(l_module_name);
5131 END IF;
5132 --
5133   EXCEPTION
5134                 -- J-IB-NPARIKH-{
5135                 WHEN FND_API.G_EXC_ERROR THEN
5136                     x_return_status := WSH_UTIL_CORE.g_ret_sts_error;
5137                     WSH_UTIL_CORE.add_message (WSH_UTIL_CORE.g_ret_sts_error,l_module_name);
5138                     --
5139                     IF l_debug_on
5140                     THEN
5141                         WSH_DEBUG_SV.pop(l_module_name, 'EXCEPTION:FND_API.G_EXC_ERROR');
5142                     END IF;
5143                 -- J-IB-NPARIKH-}
5144 
5145     WHEN  mark_reprice_error THEN
5146       FND_MESSAGE.Set_Name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
5147       x_return_status := l_return_status;
5148       WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
5149 
5150 --
5151 IF l_debug_on THEN
5152     WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5153     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
5154 END IF;
5155 --
5156                 WHEN update_mol_carton_group_error THEN
5157       fnd_message.SET_name('WSH', 'WSH_MOL_CARTON_GROUP_ERROR');
5158                         x_return_status := l_return_status;
5159                         WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
5160 
5161                       --
5162                       IF l_debug_on THEN
5163                           WSH_DEBUG_SV.logmsg(l_module_name,'update_mol_carton_group_error exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5164                           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:update_mol_carton_group_error');
5165                       END IF;
5166 
5167 
5168     WHEN INVALID_DEL THEN
5169       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5170       fnd_message.SET_name('WSH', 'WSH_DET_INVALID_DEL');
5171       wsh_util_core.add_message(x_return_status,l_module_name);
5172           --
5173           IF l_debug_on THEN
5174               WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DEL exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5175               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_DEL');
5176           END IF;
5177           RETURN;
5178           --
5179     WHEN DEL_NOT_UPDATABLE THEN
5180       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5181       wsh_util_core.add_message(x_return_status,l_module_name);
5182           --
5183           IF l_debug_on THEN
5184               WSH_DEBUG_SV.logmsg(l_module_name,'DEL_NOT_UPDATABLE exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5185               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:DEL_NOT_UPDATABLE');
5186           END IF;
5187           --
5188           RETURN;
5189     WHEN INVALID_DETAIL THEN
5190       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5191       fnd_message.SET_name('WSH', 'WSH_DET_INVALID_DETAIL');
5192       FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
5193       wsh_util_core.add_message(x_return_status,l_module_name);
5194           --
5195           IF l_debug_on THEN
5196               WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DETAIL exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5197               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_DETAIL');
5198           END IF;
5199           --
5200           RETURN;
5201         WHEN DET_CONFIRMED THEN
5202             x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5203             fnd_message.SET_name('WSH', 'WSH_DET_CONFIRMED_DETAIL');
5204             FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
5205             wsh_util_core.add_message(x_return_status,l_module_name);
5206           --
5207           IF l_debug_on THEN
5208               WSH_DEBUG_SV.logmsg(l_module_name,'DET_CONFIRMED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5209               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:DET_CONFIRMED');
5210           END IF;
5211           --
5212           RETURN;
5213     WHEN detail_del_FROM_to_not_same THEN
5214       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5215       fnd_message.SET_name('WSH', 'WSH_DET_SHIP_F_T_N_MATCH');
5216       wsh_util_core.add_message(x_return_status,l_module_name);
5217 
5218 
5219 
5220 --
5221 IF l_debug_on THEN
5222     WSH_DEBUG_SV.logmsg(l_module_name,'DETAIL_DEL_FROM_TO_NOT_SAME exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5223     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:DETAIL_DEL_FROM_TO_NOT_SAME');
5224 END IF;
5225 --
5226           RETURN;
5227     WHEN ship_method_not_match THEN
5228       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5229       fnd_message.SET_name('WSH', 'WSH_DET_SHIP_METHOD_NOT_MATCH');
5230       wsh_util_core.add_message(x_return_status,l_module_name);
5231           --
5232           IF l_debug_on THEN
5233               WSH_DEBUG_SV.logmsg(l_module_name,'SHIP_METHOD_NOT_MATCH exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5234               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:SHIP_METHOD_NOT_MATCH');
5235           END IF;
5236           --
5237           RETURN;
5238     WHEN others THEN
5239        x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
5240       wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_TOP_DETAIL_TO_DELIVERY',l_module_name);
5241           --
5242           IF l_debug_on THEN
5243               WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
5244               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
5245           END IF;
5246           --
5247           RETURN;
5248 END Assign_Top_Detail_To_Delivery;
5249 -------------------------------------------------------------------
5250 -- This procedure is only for backward compatibility. No one should call
5251 -- this procedure.
5252 -------------------------------------------------------------------
5253 
5254 PROCEDURE Assign_Top_Detail_To_Delivery(
5255     P_DETAIL_ID     IN NUMBER,
5256     P_DELIVERY_ID   IN NUMBER,
5257     X_RETURN_STATUS OUT NOCOPY  VARCHAR2
5258     ) IS
5259 
5260 --
5261 l_debug_on BOOLEAN;
5262 --
5263 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'ASSIGN_TOP_DETAIL_TO_DELIVERY';
5264 --
5265 l_has_lines               VARCHAR2(1);
5266 l_dlvy_freight_terms_code VARCHAR2(30);
5267 --
5268 BEGIN
5269     --
5270     --
5271     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
5272     --
5273     IF l_debug_on IS NULL
5274     THEN
5275         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
5276     END IF;
5277     --
5278     IF l_debug_on THEN
5279         WSH_DEBUG_SV.push(l_module_name);
5280         --
5281         WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
5282         WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
5283     END IF;
5284     --
5285     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
5286     --
5287     l_has_lines := WSH_DELIVERY_VALIDATIONS.has_lines
5288                         (
5289                             p_delivery_id => p_delivery_id
5290                         );
5291     --
5292     ASSIGN_TOP_DETAIL_TO_DELIVERY
5293         (
5294             p_detail_id               => p_detail_id,
5295             p_delivery_id             => p_delivery_id,
5296             X_RETURN_STATUS           => X_RETURN_STATUS,
5297             x_dlvy_has_lines               => l_has_lines,
5298             x_dlvy_freight_Terms_code => l_dlvy_freight_Terms_code
5299         );
5300     --
5301     IF l_debug_on THEN
5302         WSH_DEBUG_SV.pop(l_module_name);
5303     END IF;
5304     --
5305 EXCEPTION
5306     WHEN others THEN
5307         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
5308         wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_TOP_DETAIL_TO_DELIVERY',l_module_name);
5309         --
5310         IF l_debug_on THEN
5311             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
5312         END IF;
5313 END Assign_Top_Detail_To_Delivery;
5314 
5315 -- THIS PROCEDURE IS OBSOLETE
5316 --
5317 --Procedure:      Unassign_Cont_from_Delivery
5318 --Parameters:      p_detail_id,
5319 --            x_return_status
5320 --Desription:     Unassign an container FROM a delivery
5321 -- Note:         need to drill up down to UPDATE delivery_id to NULL
5322 
5323 PROCEDURE Unassign_Cont_from_Delivery(
5324   p_detail_id   IN NUMBER,
5325   X_RETURN_STATUS  OUT NOCOPY  VARCHAR2,
5326   p_validate_flag  IN VARCHAR2) IS
5327 
5328 --
5329 l_debug_on BOOLEAN;
5330 --
5331 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_CONT_FROM_DELIVERY';
5332 --
5333 BEGIN
5334   --
5335   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5336   --
5337 END Unassign_Cont_FROM_Delivery;
5338 
5339 --
5340 --Procedure:      Assign_Cont_to_Cont
5341 --Parameters:      p_detail_id1
5342 --              p_detail_id2
5343 --            x_return_status
5344 --Desription:      Assigns a container to another container
5345 
5346 -- it is called when assigning container1 to container2
5347 -- if container1 is already assigned to a delivery,  then drill up and down
5348 -- of the container2 and assign delivery_id to all the parent and child
5349 -- containers of the container2.
5350 
5351 -- if container2 is already assigned to a delivery,   then drill up and down
5352 -- of container1 and assign delivery_id to all parent and child containers
5353 -- of the container1
5354 
5355 
5356 PROCEDURE Assign_Cont_To_Cont(
5357   p_detail_id1   IN NUMBER,
5358   p_detail_id2   IN NUMBER,
5359   x_return_status OUT NOCOPY  VARCHAR2)
5360 IS
5361 
5362 --Bug 3522687 : OMFST:J:R2:RG:APPLN HANGS WHILE PERFORMING MANUAL PACKING ACTION
5363 --Modified cursor check_loop
5364 /*
5365 CURSOR check_loop(x_delivery_detail_id NUMBER) IS
5366  SELECT delivery_detail_id
5367  FROM wsh_delivery_assignments_v
5368  START WITH delivery_detail_id = x_delivery_detail_id
5369  CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id;
5370 */
5371 
5372   CURSOR c_get_shipto (p_container_id NUMBER) IS
5373   SELECT ship_to_location_id
5374   FROM wsh_delivery_details
5375   WHERE delivery_detail_id = p_container_id;
5376 
5377   l_container_is_empty   BOOLEAN;
5378   l_ship_to_loc          NUMBER;
5379   l_display_error        BOOLEAN;
5380 
5381 
5382 CURSOR check_loop(p_inner_cont_id NUMBER,p_outer_cont_id NUMBER) IS
5383   SELECT delivery_detail_id
5384   FROM   wsh_delivery_assignments_v
5385   WHERE delivery_detail_id =  p_outer_cont_id
5386   START WITH delivery_detail_id = p_inner_cont_id
5387   CONNECT BY prior delivery_detail_id = parent_delivery_detail_id;
5388 
5389   -- Bug 3715176
5390   CURSOR c_get_plan_flag (v_delivery_id NUMBER) IS
5391   SELECT nvl(planned_flag,'N')
5392   FROM   wsh_new_deliveries
5393   WHERE  delivery_id = v_delivery_id;
5394 
5395   CURSOR c_get_content_count(v_delivery_detail_id NUMBER) IS
5396   SELECT count(*)
5397   FROM   wsh_delivery_assignments_v wda
5398   WHERE	 wda.parent_delivery_detail_id = v_delivery_detail_id and rownum = 1;
5399   -- Bug 3715176
5400 
5401 /*  Commenting this out - Bug 2457558
5402 -- Bug 2167042-added to check fill percentage for a container
5403 --             when packing a container
5404 
5405 CURSOR Get_Min_Fill(v_cont_id NUMBER) IS
5406 SELECT nvl(minimum_fill_percent,0)
5407   FROM WSH_DELIVERY_DETAILS
5408  WHERE delivery_detail_id = v_cont_id
5409    AND container_flag = 'Y';
5410 
5411 l_min_fill NUMBER;
5412 l_fill NUMBER;
5413 l_gross NUMBER;
5414 l_net NUMBER;
5415 l_volume NUMBER;
5416 l_cont_name VARCHAR2(30);
5417 x_pack_status VARCHAR2(30);
5418 
5419 End of adding cursor for fill percentage
5420 */
5421 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
5422 l_del_id_for_container1 C_DEL_ID_FOR_CONT_OR_DETAIL%ROWTYPE;
5423 l_del_id_for_container2 C_DEL_ID_FOR_CONT_OR_DETAIL%ROWTYPE;
5424 
5425 detail_cont_name WSH_DELIVERY_DETAILS.CONTAINER_NAME%TYPE;
5426 parent_cont_name WSH_DELIVERY_DETAILS.CONTAINER_NAME%TYPE;
5427 
5428 l_group_by_flags WSH_DELIVERY_AUTOCREATE.group_by_flags_rec_type;
5429 /* H projects: pricing integration csun */
5430 m	    NUMBER := 0;
5431 l_del_tab   WSH_UTIL_CORE.Id_Tab_Type;
5432 mark_reprice_error  EXCEPTION;
5433 l_plan_flag varchar2(1);
5434 l_content_count NUMBER;
5435 
5436 l_out_container  NUMBER := 0 ;
5437 --
5438 -- K LPN CONV. rv
5439 l_wms_org    VARCHAR2(10) := 'N';
5440 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
5441 l_sync_tmp_recTbl wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
5442 l_num_warnings NUMBER := 0;
5443 l_operation_type VARCHAR2(100);
5444 -- K LPN CONV. rv
5445 l_mdc_detail_tab   WSH_UTIL_CORE.Id_Tab_Type;
5446 l_ignore_det_tab   WSH_UTIL_CORE.Id_Tab_Type;
5447 
5448 -- OTM R12 : assign delivery detail
5449 l_delivery_was_empty      BOOLEAN;
5450 l_tms_interface_flag      WSH_NEW_DELIVERIES.TMS_INTERFACE_FLAG%TYPE;
5451 l_gross_weight1           WSH_DELIVERY_DETAILS.GROSS_WEIGHT%TYPE;
5452 l_gross_weight2           WSH_DELIVERY_DETAILS.GROSS_WEIGHT%TYPE;
5453 l_gc3_is_installed        VARCHAR2(1);
5454 l_assign_update           BOOLEAN;
5455 -- End of OTM R12 : assign delivery detail
5456 
5457 l_debug_on BOOLEAN;
5458 --
5459 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'ASSIGN_CONT_TO_CONT';
5460 --
5461 BEGIN
5462   -- assumption:  IF both container1 and container2 are already
5463   -- assigned to deliveries. Both deliveries must be the same
5464   --
5465   --
5466   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
5467   --
5468   IF l_debug_on IS NULL
5469   THEN
5470       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
5471   END IF;
5472   --
5473   IF l_debug_on THEN
5474       WSH_DEBUG_SV.push(l_module_name);
5475       --
5476       WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID1',P_DETAIL_ID1);
5477       WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID2',P_DETAIL_ID2);
5478   END IF;
5479   --
5480   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
5481 
5482   -- OTM R12
5483   l_gc3_is_installed := WSH_UTIL_CORE.G_GC3_IS_INSTALLED;
5484 
5485   IF (l_gc3_is_installed IS NULL) THEN
5486     l_gc3_is_installed := WSH_UTIL_CORE.GC3_IS_INSTALLED;
5487   END IF;
5488   l_assign_update := FALSE;  --default assignment tms update to false
5489   -- End of OTM R12
5490 
5491   OPEN c_del_id_FOR_cont_or_detail(p_detail_id1);
5492   FETCH c_del_id_for_cont_or_detail into l_del_id_for_container1;
5493   CLOSE c_del_id_for_cont_or_detail;
5494 
5495         -- J: W/V Changes
5496   IF l_del_id_for_container1.parent_delivery_detail_id = p_detail_id2 THEN
5497       IF l_debug_on THEN
5498             WSH_DEBUG_SV.logmsg(l_module_name,'Cont '||p_detail_id1||' is already assigned to '||p_detail_id2||'. Returning');
5499             WSH_DEBUG_SV.pop(l_module_name);
5500       END IF;
5501       return;
5502   END IF;
5503 
5504   OPEN c_del_id_for_cont_or_detail(p_detail_id2);
5505   FETCH c_del_id_for_cont_or_detail into l_del_id_for_container2;
5506   CLOSE c_del_id_for_cont_or_detail;
5507 
5508   -- K LPN CONV. rv
5509   --
5510   l_wms_org := wsh_util_validate.check_wms_org(l_del_id_for_container2.organization_id);
5511   --
5512   -- K LPN CONV. rv
5513         IF l_debug_on THEN
5514            WSH_DEBUG_SV.log(l_module_name,'delivery_id 1',
5515                                          l_del_id_for_container1.delivery_id);
5516            WSH_DEBUG_SV.log(l_module_name,'organization_id 1',
5517                                       l_del_id_for_container1.organization_id);
5518            WSH_DEBUG_SV.log(l_module_name,'ship_from_location_id 1',
5519                                  l_del_id_for_container1.ship_from_location_id);
5520            WSH_DEBUG_SV.log(l_module_name,'customer_id 1',
5521                                          l_del_id_for_container1.customer_id);
5522            WSH_DEBUG_SV.log(l_module_name,'intmed_ship_to_location_id 1',
5523                             l_del_id_for_container1.intmed_ship_to_location_id);
5524            WSH_DEBUG_SV.log(l_module_name,'fob_code 1',
5525                                          l_del_id_for_container1.fob_code);
5526            WSH_DEBUG_SV.log(l_module_name,'freight_terms_code 1',
5527                                    l_del_id_for_container1.freight_terms_code);
5528            WSH_DEBUG_SV.log(l_module_name,'ship_method_code 1',
5529                                       l_del_id_for_container1.ship_method_code);
5530            WSH_DEBUG_SV.log(l_module_name,'parent_delivery_detail_id 1',
5531                             l_del_id_for_container1.parent_delivery_detail_id);
5532 
5533            WSH_DEBUG_SV.log(l_module_name,'delivery_id 2',
5534                                          l_del_id_for_container2.delivery_id);
5535            WSH_DEBUG_SV.log(l_module_name,'organization_id 2',
5536                                       l_del_id_for_container2.organization_id);
5537            WSH_DEBUG_SV.log(l_module_name,'ship_from_location_id 2',
5538                                  l_del_id_for_container2.ship_from_location_id);
5539            WSH_DEBUG_SV.log(l_module_name,'customer_id 2',
5540                                          l_del_id_for_container2.customer_id);
5541            WSH_DEBUG_SV.log(l_module_name,'intmed_ship_to_location_id 2',                                                       l_del_id_for_container2.intmed_ship_to_location_id);
5542            WSH_DEBUG_SV.log(l_module_name,'fob_code 2',
5543                                          l_del_id_for_container2.fob_code);
5544            WSH_DEBUG_SV.log(l_module_name,'freight_terms_code 2',
5545                                    l_del_id_for_container2.freight_terms_code);
5546            WSH_DEBUG_SV.log(l_module_name,'ship_method_code 2',
5547                                       l_del_id_for_container2.ship_method_code);
5548            WSH_DEBUG_SV.log(l_module_name,'parent_delivery_detail_id 2',
5549                             l_del_id_for_container2.parent_delivery_detail_id);
5550            WSH_DEBUG_SV.log(l_module_name,'customer',
5551                                              l_group_by_flags.customer);
5552            WSH_DEBUG_SV.log(l_module_name,'intmed',
5553                                             l_group_by_flags.intmed);
5554            WSH_DEBUG_SV.log(l_module_name,'fob', l_group_by_flags.fob);
5555            WSH_DEBUG_SV.log(l_module_name,'freight_terms',
5556                                              l_group_by_flags.freight_terms);
5557            WSH_DEBUG_SV.log(l_module_name,'ship_method',
5558                                              l_group_by_flags.ship_method);
5559 
5560         END IF;
5561 
5562 
5563      /* Check to see if the line is already packed */
5564      IF (l_del_id_for_container1.parent_delivery_detail_id IS NOT NULL
5565       AND l_del_id_for_container1.parent_delivery_detail_id <>
5566         p_detail_id2
5567       ) THEN
5568       FND_MESSAGE.SET_NAME('WSH','WSH_DET_PACK_ERROR');
5569       --
5570       IF l_debug_on THEN
5571           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5572       END IF;
5573       --
5574       FND_MESSAGE.SET_TOKEN('DET_LINE',
5575           nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5576       --
5577       IF l_debug_on THEN
5578           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5579       END IF;
5580       --
5581       FND_MESSAGE.SET_TOKEN('CONT_NAME',
5582           nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5583       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5584       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5585       --
5586       IF l_debug_on THEN
5587           WSH_DEBUG_SV.pop(l_module_name);
5588       END IF;
5589       --
5590       return;
5591     END IF;
5592 
5593   -- OTM R12 : assign delivery detail
5594   IF (l_gc3_is_installed = 'Y' AND
5595       nvl(l_del_id_for_container1.ignore_for_planning, 'N') = 'N') THEN
5596 
5597     Pre_Otm_Assign_Del_Detail
5598               (p_delivery_id        => NULL,
5599                p_detail_id          => NULL,
5600                p_container1_id      => p_detail_id1,
5601                p_container2_id      => p_detail_id2,
5602                p_assignment_type    => 'C2C',
5603                x_delivery_was_empty => l_delivery_was_empty,
5604                x_assign_update      => l_assign_update,
5605                x_gross_weight1      => l_gross_weight1,
5606                x_gross_weight2      => l_gross_weight2,
5607                x_return_status      => l_return_status);
5608 
5609     IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
5610       --handle the error approriately to the procedure this code is in
5611       IF l_debug_on THEN
5612         WSH_DEBUG_SV.log(l_module_name,'error from Pre_Otm_Assign_Del_Detail');
5613       END IF;
5614       raise FND_API.G_EXC_ERROR;
5615     END IF;
5616   END IF;
5617   -- End of OTM R12 : assign delivery detail
5618 
5619     --Bug 3522687 : OMFST:J:R2:RG:APPLN HANGS WHILE PERFORMING MANUAL PACKING ACTION
5620     --Cursor check_loop returns delivery_detail_id of the
5621     --outer container if outer container is packed in the inner container.
5622 
5623 	OPEN check_loop(p_detail_id1,p_detail_id2);
5624 	FETCH check_loop into l_out_container;
5625 
5626 	-- If cursor returns then we have self nesting in containers
5627 
5628 	IF (check_loop%FOUND) THEN
5629 
5630 	     CLOSE check_loop;
5631  	     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_LOOP_NO_PACK');
5632 		--
5633 	     IF l_debug_on THEN
5634 		 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5635 	     END IF;
5636 		--
5637 	     FND_MESSAGE.SET_TOKEN('DETAIL_CONTAINER',
5638 		nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5639 		--
5640 	     IF l_debug_on THEN
5641 		WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5642 	     END IF;
5643 		--
5644 	     FND_MESSAGE.SET_TOKEN('PARENT_CONTAINER',
5645 		nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5646 		x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5647 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5648 		--
5649 	     IF l_debug_on THEN
5650 		  WSH_DEBUG_SV.pop(l_module_name);
5651              END IF;
5652 		--
5653 	    return;
5654 	END IF;
5655         CLOSE check_loop;
5656     -- End of fix for bug 3522687
5657 
5658     /* Added code to validate grouping attributes for Child Container and master
5659     Container */
5660     IF (l_del_id_for_container1.organization_id <>
5661        l_del_id_for_container2.organization_id) THEN
5662       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_ORG_DIFF');
5663       --
5664       IF l_debug_on THEN
5665           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5666       END IF;
5667       --
5668       FND_MESSAGE.SET_TOKEN('ENTITY1',
5669             nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5670       --
5671       IF l_debug_on THEN
5672           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5673       END IF;
5674       --
5675       FND_MESSAGE.SET_TOKEN('ENTITY2',
5676             nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5677       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5678       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5679       --
5680       IF l_debug_on THEN
5681           WSH_DEBUG_SV.pop(l_module_name);
5682       END IF;
5683       --
5684       RETURN;
5685     END IF;
5686 
5687     IF (l_del_id_for_container1.ship_from_location_id <>
5688        l_del_id_for_container2.ship_from_location_id) THEN
5689       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
5690       --
5691       IF l_debug_on THEN
5692           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5693       END IF;
5694       --
5695       FND_MESSAGE.SET_TOKEN('DETAIL_ID',
5696           nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5697       --
5698       IF l_debug_on THEN
5699           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5700       END IF;
5701       --
5702       FND_MESSAGE.SET_TOKEN('CONT_NAME',
5703         nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5704       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5705       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5706       --
5707       IF l_debug_on THEN
5708           WSH_DEBUG_SV.pop(l_module_name);
5709       END IF;
5710       --
5711       RETURN;
5712      END IF;
5713 
5714         --J TP Release
5715       IF (l_del_id_for_container1.ignore_for_planning <>
5716               l_del_id_for_container2.ignore_for_planning) THEN
5717 
5718 
5719            -- R12: MDC
5720            -- If called by WMS, and line is part of a consol delivery,
5721            -- then the ignore for planning flag is always 'Y'. For WMS,
5722            -- we need to set the child detail's ignore for planning status
5723            -- to be 'Y' before we attempt to pack.
5724 
5725            IF (l_wms_org = 'Y') AND
5726               ((l_del_id_for_container1.wda_type = 'O') OR (l_del_id_for_container2.wda_type = 'O')) --{
5727            THEN
5728               IF l_del_id_for_container1.wda_type = 'O' THEN
5729                  l_ignore_det_tab(1) := p_detail_id2;
5730               ELSE
5731                  l_ignore_det_tab(1) := p_detail_id1;
5732               END IF;
5733 
5734               WSH_TP_RELEASE.change_ignoreplan_status
5735                    (p_entity        => 'DLVB',
5736                     p_in_ids        => l_ignore_det_tab,
5737                     p_action_code   => 'IGNORE_PLAN',
5738                     x_return_status => x_return_status);
5739 
5740               IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
5741 
5742                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_DIFF_IGNOREPLAN');
5743                  FND_MESSAGE.SET_TOKEN('ENTITY1',nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5744                  --
5745                  IF l_debug_on THEN
5746                      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5747                  END IF;
5748                  --
5749                  FND_MESSAGE.SET_TOKEN('ENTITY2',nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5750                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5751                  --
5752                  IF l_debug_on THEN
5753                     WSH_DEBUG_SV.pop(l_module_name);
5754                  END IF;
5755                  --
5756                  RETURN;
5757 
5758               END IF;
5759 
5760 
5761            ELSE --}
5762               l_display_error := TRUE;
5763               IF (l_wms_org = 'Y')  THEN--{
5764                  OPEN c_get_shipto(p_detail_id2);
5765                  FETCH c_get_shipto INTO l_ship_to_loc;
5766                  CLOSE c_get_shipto;
5767                  --
5768                  l_container_is_empty := l_ship_to_loc IS NULL;
5769                  --
5770                  IF l_container_is_empty THEN --{
5771 
5772 
5773                     l_ignore_det_tab(1) := p_detail_id2;
5774                     WSH_TP_RELEASE.change_ignoreplan_status
5775                       (p_entity        => 'DLVB',
5776                        p_in_ids        => l_ignore_det_tab,
5777                        p_action_code   => 'IGNORE_PLAN',
5778                        x_return_status => l_return_status);
5779 
5780                     IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN --{
5781                        l_display_error := TRUE;
5782                     ELSE
5783                        l_display_error := FALSE;
5784                     END IF;--}
5785                  END IF; --}
5786               END IF ; --}
5787 
5788               IF l_display_error THEN --{
5789                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_DIFF_IGNOREPLAN');
5790                  --
5791                  IF l_debug_on THEN
5792                      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5793                  END IF;
5794                  FND_MESSAGE.SET_TOKEN('ENTITY1',nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5795                  --
5796                  IF l_debug_on THEN
5797                      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5798                  END IF;
5799                  --
5800                  FND_MESSAGE.SET_TOKEN('ENTITY2',nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5801                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5802                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5803                  --
5804                  IF l_debug_on THEN
5805                     WSH_DEBUG_SV.pop(l_module_name);
5806                  END IF;
5807                  --
5808                  RETURN;
5809               END IF; --}
5810            END IF;
5811         END IF;
5812 
5813             --
5814             -- J-IB-NPARIKH-{
5815             --
5816             --
5817             -- O container can be assigned to empty IO container
5818             -- IO container can be assigned to empty O container
5819             -- Otherwise, both containers' line direction must match
5820             --
5821             IF (l_del_id_for_container1.line_direction <> l_del_id_for_container2.line_direction)
5822             THEN
5823             --{
5824                 IF  l_del_id_for_container1.line_direction IN ('O','IO')
5825                 AND l_del_id_for_container2.line_direction IN ('O','IO')
5826                 THEN
5827                 --{
5828                     NULL;
5829                 --}
5830                 ELSE
5831                 --{
5832                       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
5833                       --
5834                       IF l_debug_on THEN
5835                           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5836                       END IF;
5837                       --
5838                       FND_MESSAGE.SET_TOKEN('DETAIL_ID',
5839                               nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5840                       --
5841                       IF l_debug_on THEN
5842                           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5843                       END IF;
5844                       --
5845                       FND_MESSAGE.SET_TOKEN('CONT_NAME',
5846                             nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5847                       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5848                       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5849                       --
5850                       IF l_debug_on THEN
5851                           WSH_DEBUG_SV.pop(l_module_name);
5852                       END IF;
5853                       --
5854                       RETURN;
5855                 --}
5856                 END IF;
5857             --}
5858             END IF;
5859             --
5860             -- J-IB-NPARIKH-}
5861             --
5862     --
5863     IF l_debug_on THEN
5864         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.GET_GROUP_BY_ATTR',WSH_DEBUG_SV.C_PROC_LEVEL);
5865     END IF;
5866     --
5867     WSH_DELIVERY_AUTOCREATE.get_group_by_attr(
5868        p_organization_id => l_del_id_for_container1.organization_id,
5869        p_client_id       => l_del_id_for_container1.client_id, -- LSP PROJECT
5870        x_group_by_flags  => l_group_by_flags,
5871        x_return_status   => x_return_status);
5872 
5873     IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
5874       x_return_status := x_return_status;
5875       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5876       --
5877       IF l_debug_on THEN
5878           WSH_DEBUG_SV.pop(l_module_name);
5879       END IF;
5880       --
5881       RETURN;
5882     END IF;
5883 
5884           --- Bug 3715176
5885           -- If delivery is same for container to pack and to be packed then it should not check firm status.
5886           IF l_del_id_for_container1.delivery_id = l_del_id_for_container2.delivery_id then
5887 	        NULL;
5888 
5889 	  Elsif l_del_id_for_container1.delivery_id is NOT NULL OR
5890 	        l_del_id_for_container2.delivery_id is NOT NULL then
5891 
5892           Open  c_get_content_count(p_detail_id2);
5893 	  Fetch c_get_content_count into l_content_count;
5894 	  Close c_get_content_count;
5895 
5896           IF l_content_count > 0 THEN
5897 	  IF l_del_id_for_container1.delivery_id IS NOT NULL then
5898 	     OPEN c_get_plan_flag(l_del_id_for_container1.delivery_id);
5899 	     FETCH c_get_plan_flag into l_plan_flag;
5900 	     CLOSE c_get_plan_flag;
5901 
5902   	   if l_plan_flag <> 'N' then
5903 	         FND_MESSAGE.SET_NAME('WSH','WSH_DEL_STATUS_NOT_PROPER');
5904 
5905 		 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5906 
5907                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5908                  --
5909                  IF l_debug_on THEN
5910                     WSH_DEBUG_SV.pop(l_module_name);
5911                  END IF;
5912                  --
5913                  return;
5914              end if;
5915 	   END IF;
5916 
5917 	   IF l_del_id_for_container2.delivery_id IS NOT NULL then
5918 	     OPEN c_get_plan_flag(l_del_id_for_container2.delivery_id);
5919 	     FETCH c_get_plan_flag into l_plan_flag;
5920 	     CLOSE c_get_plan_flag;
5921 
5922   	   if l_plan_flag <> 'N' then
5923 	         FND_MESSAGE.SET_NAME('WSH','WSH_DEL_STATUS_NOT_PROPER');
5924 
5925 		 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5926 
5927                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5928                  --
5929                  IF l_debug_on THEN
5930                     WSH_DEBUG_SV.pop(l_module_name);
5931                  END IF;
5932                  --
5933                  return;
5934              end if;
5935 	   END IF;
5936           END IF;
5937          END IF;
5938         -- Bug 3715176
5939 
5940 
5941     IF l_group_by_flags.customer = 'Y' THEN
5942       IF (l_del_id_for_container1.customer_id <>
5943        l_del_id_for_container2.customer_id) THEN
5944       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
5945       --
5946       IF l_debug_on THEN
5947           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5948       END IF;
5949       --
5950       FND_MESSAGE.SET_TOKEN('DETAIL_ID',
5951           nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5952       --
5953       IF l_debug_on THEN
5954           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5955       END IF;
5956       --
5957       FND_MESSAGE.SET_TOKEN('CONT_NAME',
5958           nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5959       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5960       --
5961       IF l_debug_on THEN
5962           WSH_DEBUG_SV.pop(l_module_name);
5963       END IF;
5964       --
5965       return;
5966       END IF;
5967     END IF;
5968     IF l_group_by_flags.intmed = 'Y' THEN
5969       IF (l_del_id_for_container1.intmed_ship_to_location_id <>
5970        l_del_id_for_container2.intmed_ship_to_location_id) THEN
5971       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
5972       --
5973       IF l_debug_on THEN
5974           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5975       END IF;
5976       --
5977       FND_MESSAGE.SET_TOKEN('DETAIL_ID',
5978           nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5979       --
5980       IF l_debug_on THEN
5981           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5982       END IF;
5983       --
5984       FND_MESSAGE.SET_TOKEN('CONT_NAME',
5985           nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5986       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5987       --
5988       IF l_debug_on THEN
5989           WSH_DEBUG_SV.pop(l_module_name);
5990       END IF;
5991       --
5992       return;
5993       END IF;
5994     END IF;
5995     IF l_group_by_flags.fob = 'Y' THEN
5996       IF (l_del_id_for_container1.fob_code <>
5997        l_del_id_for_container2.fob_code) THEN
5998       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
5999       --
6000       IF l_debug_on THEN
6001           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
6002       END IF;
6003       --
6004       FND_MESSAGE.SET_TOKEN('DETAIL_ID',
6005           nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
6006       --
6007       IF l_debug_on THEN
6008           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
6009       END IF;
6010       --
6011       FND_MESSAGE.SET_TOKEN('CONT_NAME',
6012           nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
6013       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6014       --
6015       IF l_debug_on THEN
6016           WSH_DEBUG_SV.pop(l_module_name);
6017       END IF;
6018       --
6019       return;
6020       END IF;
6021     END IF;
6022     IF l_group_by_flags.freight_terms = 'Y' THEN
6023       IF (l_del_id_for_container1.freight_terms_code <>
6024        l_del_id_for_container2.freight_terms_code) THEN
6025       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
6026       --
6027       IF l_debug_on THEN
6028           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
6029       END IF;
6030       --
6031       FND_MESSAGE.SET_TOKEN('DETAIL_ID',
6032           nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
6033       --
6034       IF l_debug_on THEN
6035           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
6036       END IF;
6037       --
6038       FND_MESSAGE.SET_TOKEN('CONT_NAME',
6039           nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
6040       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6041       --
6042       IF l_debug_on THEN
6043           WSH_DEBUG_SV.pop(l_module_name);
6044       END IF;
6045       --
6046       return;
6047       END IF;
6048     END IF;
6049     IF l_group_by_flags.ship_method = 'Y' THEN
6050       IF (NVL(l_del_id_for_container1.mode_of_transport, l_del_id_for_container2.mode_of_transport) <>
6051        NVL(l_del_id_for_container2.mode_of_transport, l_del_id_for_container1.mode_of_transport))
6052       OR (NVL(l_del_id_for_container1.service_level, l_del_id_for_container2.service_level) <>
6053        NVL(l_del_id_for_container2.service_level, l_del_id_for_container1.service_level))
6054       OR (NVL(l_del_id_for_container1.carrier_id, l_del_id_for_container2.carrier_id) <>
6055        NVL(l_del_id_for_container2.carrier_id, l_del_id_for_container1.carrier_id))
6056       THEN
6057       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
6058       --
6059       IF l_debug_on THEN
6060           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
6061       END IF;
6062       --
6063       FND_MESSAGE.SET_TOKEN('DETAIL_ID',
6064           nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
6065       --
6066       IF l_debug_on THEN
6067           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
6068       END IF;
6069       --
6070       FND_MESSAGE.SET_TOKEN('CONT_NAME',
6071           nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
6072       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6073       --
6074       IF l_debug_on THEN
6075           WSH_DEBUG_SV.pop(l_module_name);
6076       END IF;
6077       --
6078       return;
6079       END IF;
6080     END IF;
6081 /* End of check for grouping attributes */
6082 
6083 
6084 /* End of Check to see if the line is already packed */
6085 
6086 
6087   -- for bug 1336858 fix
6088 
6089   -- No need for savepoint
6090   -- savepoint before_cont_assignment;
6091 
6092         -- J: W/V Changes
6093         -- The first DD_WV_Post_Process call will decrement the cont1 W/V from delivery
6094         -- The second DD_WV_Post_Process call will increment the delivery W/V with cont2 W/V (since cont2 has to be
6095         -- assigned to the delivery if the cont1 being assigned to cont2 is already assigned to delivery)
6096         -- The third DD_WV_Post_Process cll will increment the cont2 W/V with cont1 W/V which in turn will adjust the
6097         -- delivery W/V, if the cont2 is in a delivery.
6098         IF (l_del_id_for_container1.delivery_id is not null) THEN
6099           IF l_debug_on THEN
6100             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
6101           END IF;
6102 
6103           WSH_WV_UTILS.DD_WV_Post_Process(
6104             p_delivery_detail_id => p_detail_id1,
6105             p_diff_gross_wt      => -1 * l_del_id_for_container1.gross_weight,
6106             p_diff_net_wt        => -1 * l_del_id_for_container1.net_weight,
6107             p_diff_volume        => -1 * l_del_id_for_container1.volume,
6108             p_diff_fill_volume   => -1 * l_del_id_for_container1.volume,
6109             x_return_status      => l_return_status);
6110 
6111           IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
6112                --
6113                x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6114                WSH_UTIL_CORE.Add_Message(x_return_status);
6115                IF l_debug_on THEN
6116                    WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
6117                    WSH_DEBUG_SV.pop(l_module_name);
6118                END IF;
6119                return;
6120           END IF;
6121 
6122         END IF;
6123 
6124   IF (l_del_id_for_container1.delivery_id IS not NULL) THEN
6125 
6126           IF (l_del_id_for_container2.delivery_id IS NULL) THEN
6127 	/* Bug 1571143,Combining the 2 cursors */
6128     -- K LPN CONV. rv
6129     -- Based on assumption that we are using wsh_delivery_assignments_v,
6130     -- delivery and its contents will belong to same organization.
6131     -- Similarly, container and its contents will belong to same organization.
6132     -- Hence, we are checking for WMS org or non-WMS org. at the
6133     -- parent level (i.e. delivery/container)
6134     -- rather than at line-level for performance reasons.
6135 
6136     -- If this assumptions were to be violated in anyway
6137     --    i.e Query was changed to refer to base table wsh_delivery_assignments instead of
6138     --     wsh_delivery_assignments_v
6139     -- or
6140     -- if existing query were to somehow return/fetch records where
6141     --    delivery and its contents may belong to diff. org.
6142     --    container and its contents may belong to diff. org.
6143     --    then
6144     --       Calls to check_wms_org needs to be re-adjusted at
6145     OPEN c_inside_outside_of_container(p_detail_id2);
6146     FETCH c_inside_outside_of_container BULK COLLECT INTO
6147           l_sync_tmp_recTbl.delivery_detail_id_tbl,
6148           l_sync_tmp_recTbl.parent_detail_id_tbl,
6149           l_sync_tmp_recTbl.delivery_id_Tbl;
6150     CLOSE c_inside_outside_of_container;
6151     IF (l_sync_tmp_recTbl.delivery_detail_id_tbl.count > 0 ) THEN
6152     --{
6153         --
6154         l_sync_tmp_recTbl.operation_type_tbl(1) := 'PRIOR';
6155         l_operation_type := 'PRIOR';
6156         --
6157         --
6158         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
6159         AND nvl(l_del_id_for_container2.line_direction,'O') IN ('O', 'IO')
6160         AND
6161         (
6162           (WSH_WMS_LPN_GRP.GK_WMS_ASSIGN_DLVY and l_wms_org = 'Y')
6163           OR
6164           (WSH_WMS_LPN_GRP.GK_INV_ASSIGN_DLVY and l_wms_org = 'N')
6165         )
6166         THEN
6167         --{
6168             --
6169             IF l_debug_on THEN
6170                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
6171             END IF;
6172             --
6173             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
6174             (
6175               p_sync_tmp_recTbl   => l_sync_tmp_recTbl,
6176               x_return_status     => l_return_status,
6177               p_operation_type    => l_operation_type
6178             );
6179             --
6180             IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
6181             --
6182               x_return_status := l_return_status;
6183             --
6184               IF l_debug_on THEN
6185                 WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
6186                 WSH_DEBUG_SV.pop(l_module_name);
6187               END IF;
6188             --
6189               return;
6190             --
6191             ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
6192             --
6193               l_num_warnings := l_num_warnings + 1;
6194             --
6195             END IF;
6196             --
6197         --}
6198         END IF;
6199         --
6200 
6201         FORALL i in l_sync_tmp_recTbl.delivery_detail_id_tbl.first..l_sync_tmp_recTbl.delivery_detail_id_tbl.last
6202         UPDATE wsh_delivery_assignments_v
6203         SET delivery_id = l_del_id_for_container1.delivery_id,
6204             last_update_date = SYSDATE,
6205             last_updated_by =  FND_GLOBAL.USER_ID,
6206             last_update_login =  FND_GLOBAL.LOGIN_ID
6207         WHERE delivery_detail_id = l_sync_tmp_recTbl.delivery_detail_id_tbl(i);
6208 
6209         -- OTM R12 : assign delivery detail
6210         IF (l_assign_update AND
6211             l_gc3_is_installed = 'Y' AND
6212             nvl(l_del_id_for_container1.ignore_for_planning, 'N') = 'N') THEN
6213 
6214           l_tms_interface_flag := NULL;
6215 
6216           Post_Otm_Assign_Del_Detail
6217             (p_delivery_id         => l_del_id_for_container1.delivery_id,
6218              p_delivery_was_empty  => l_delivery_was_empty,
6219              p_tms_interface_flag  => l_tms_interface_flag,
6220              p_gross_weight        => l_gross_weight2, --using the gross weight of container2
6221              x_return_status       => l_return_status);
6222 
6223           IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
6224             IF l_debug_on THEN
6225               WSH_DEBUG_SV.log(l_module_name,'error from Post_Otm_Assign_Del_Detail');
6226             END IF;
6227             raise FND_API.G_EXC_ERROR;
6228           ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
6229             l_num_warnings := l_num_warnings + 1;
6230           END IF;
6231 
6232         END IF;
6233         -- End of OTM R12 : assign delivery detail
6234 
6235         FOR i in l_sync_tmp_recTbl.delivery_detail_id_tbl.first..l_sync_tmp_recTbl.delivery_detail_id_tbl.last LOOP
6236             l_mdc_detail_tab(i) := l_sync_tmp_recTbl.delivery_detail_id_tbl(i);
6237         END LOOP;
6238         WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
6239                        p_detail_id_tab     => l_mdc_detail_tab,
6240                        x_return_status     => x_return_status);
6241 
6242         IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
6243             IF l_debug_on THEN
6244                WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
6245                WSH_DEBUG_SV.pop(l_module_name);
6246             END IF;
6247             return;
6248         END IF;
6249         l_mdc_detail_tab.delete;
6250         l_sync_tmp_recTbl.delivery_detail_id_tbl.delete;
6251         l_sync_tmp_recTbl.parent_detail_id_tbl.delete;
6252         l_sync_tmp_recTbl.delivery_id_tbl.delete;
6253         l_sync_tmp_recTbl.operation_type_tbl.delete;
6254     --}
6255     END IF;
6256     -- K LPN CONV. rv
6257 
6258                 -- J: W/V Changes
6259                 IF l_debug_on THEN
6260                   WSH_DEBUG_SV.logmsg(l_module_name,'Assigning Container to Delivery');
6261                   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
6262                 END IF;
6263 
6264                 WSH_WV_UTILS.DD_WV_Post_Process(
6265                   p_delivery_detail_id => p_detail_id2,
6266                   p_diff_gross_wt      => l_del_id_for_container2.gross_weight,
6267                   p_diff_net_wt        => l_del_id_for_container2.net_weight,
6268                   p_diff_volume        => l_del_id_for_container2.volume,
6269                   p_diff_fill_volume   => l_del_id_for_container2.volume,
6270                   x_return_status      => l_return_status);
6271 
6272                 IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
6273                      --
6274                      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6275                      WSH_UTIL_CORE.Add_Message(x_return_status);
6276                      IF l_debug_on THEN
6277                          WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
6278                          WSH_DEBUG_SV.pop(l_module_name);
6279                      END IF;
6280                      return;
6281                 END IF;
6282 
6283     /* H projects: pricing integration csun , adding delivery */
6284     m := m+1;
6285     l_del_tab(m) := l_del_id_for_container1.delivery_id;
6286           END IF;
6287 
6288   ELSIF (l_del_id_FOR_container2.delivery_id IS NOT NULL) THEN
6289 
6290         /* Bug 1571143 ,Combining the 2 cursors */
6291     -- K LPN CONV. rv
6292     -- Based on assumption that we are using wsh_delivery_assignments_v,
6293     -- delivery and its contents will belong to same organization.
6294     -- Similarly, container and its contents will belong to same organization.
6295     -- Hence, we are checking for WMS org or non-WMS org. at the
6296     -- parent level (i.e. delivery/container)
6297     -- rather than at line-level for performance reasons.
6298 
6299     -- If this assumptions were to be violated in anyway
6300     --    i.e Query was changed to refer to base table wsh_delivery_assignments instead of
6301     --     wsh_delivery_assignments_v
6302     -- or
6303     -- if existing query were to somehow return/fetch records where
6304     --    delivery and its contents may belong to diff. org.
6305     --    container and its contents may belong to diff. org.
6306     --    then
6307     --       Calls to check_wms_org needs to be re-adjusted at
6308     OPEN c_inside_outside_of_container(p_detail_id1);
6309     FETCH c_inside_outside_of_container bulk collect into
6310           l_sync_tmp_recTbl.delivery_detail_id_tbl,
6311           l_sync_tmp_recTbl.parent_detail_id_tbl,
6312           l_sync_tmp_recTbl.delivery_id_tbl;
6313 
6314     CLOSE c_inside_outside_of_container;
6315     IF (l_sync_tmp_recTbl.delivery_detail_id_tbl.count > 0 ) THEN
6316     --{
6317         --
6318         l_sync_tmp_recTbl.operation_type_tbl(1) := 'PRIOR';
6319         l_operation_type := 'PRIOR';
6320         --
6321         --
6322         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
6323         AND nvl(l_del_id_FOR_container2.line_direction,'O') IN ('O', 'IO')
6324         AND
6325         (
6326           (WSH_WMS_LPN_GRP.GK_WMS_ASSIGN_DLVY and l_wms_org = 'Y')
6327           OR
6328           (WSH_WMS_LPN_GRP.GK_INV_ASSIGN_DLVY and l_wms_org = 'N')
6329         )
6330         THEN
6331         --{
6332             --
6333             IF l_debug_on THEN
6334                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
6335             END IF;
6336             --
6337             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
6338             (
6339               p_sync_tmp_recTbl   => l_sync_tmp_recTbl,
6340               x_return_status     => l_return_status,
6341               p_operation_type    => l_operation_type
6342             );
6343             --
6344             IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
6345             --
6346               x_return_status := l_return_status;
6347             --
6348               IF l_debug_on THEN
6349                 WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
6350                 WSH_DEBUG_SV.pop(l_module_name);
6351               END IF;
6352             --
6353               return;
6354             --
6355             ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
6356             --
6357               l_num_warnings := l_num_warnings + 1;
6358             --
6359             END IF;
6360             --
6361         --}
6362         END IF;
6363         --
6364 
6365         FORALL i in l_sync_tmp_recTbl.delivery_detail_id_tbl.first..l_sync_tmp_recTbl.delivery_detail_id_tbl.last
6366         UPDATE wsh_delivery_assignments_v
6367         SET delivery_id = l_del_id_for_container2.delivery_id,
6368             last_update_date = SYSDATE,
6369             last_updated_by =  FND_GLOBAL.USER_ID,
6370             last_update_login =  FND_GLOBAL.LOGIN_ID
6371         WHERE delivery_detail_id = l_sync_tmp_recTbl.delivery_detail_id_tbl(i);
6372 
6373         -- OTM R12 : assign delivery detail
6374         IF (l_assign_update AND
6375             l_gc3_is_installed = 'Y' AND
6376             nvl(l_del_id_for_container2.ignore_for_planning, 'N') = 'N') THEN
6377 
6378           l_tms_interface_flag := NULL;
6379 
6380           Post_Otm_Assign_Del_Detail
6381             (p_delivery_id         => l_del_id_for_container2.delivery_id,
6382              p_delivery_was_empty  => l_delivery_was_empty,
6383              p_tms_interface_flag  => l_tms_interface_flag,
6384              p_gross_weight        => l_gross_weight1,  --using the gross weight of container1
6385              x_return_status       => l_return_status);
6386 
6387           IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
6388             IF l_debug_on THEN
6389               WSH_DEBUG_SV.log(l_module_name,'error from Post_Otm_Assign_Del_Detail');
6390             END IF;
6391             raise FND_API.G_EXC_ERROR;
6392           ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
6393             l_num_warnings := l_num_warnings + 1;
6394           END IF;
6395         END IF;
6396         -- End of OTM R12 : assign delivery detail
6397 
6398 
6399         FOR i in l_sync_tmp_recTbl.delivery_detail_id_tbl.first..l_sync_tmp_recTbl.delivery_detail_id_tbl.last LOOP
6400             l_mdc_detail_tab(i) := l_sync_tmp_recTbl.delivery_detail_id_tbl(i);
6401         END LOOP;
6402         WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
6403                    p_detail_id_tab     => l_mdc_detail_tab,
6404                    x_return_status     => x_return_status);
6405         IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
6406           IF l_debug_on THEN
6407             WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
6408             WSH_DEBUG_SV.pop(l_module_name);
6409           END IF;
6410           return;
6411         END IF;
6412         l_mdc_detail_tab.delete;
6413         l_sync_tmp_recTbl.delivery_detail_id_tbl.delete;
6414         l_sync_tmp_recTbl.parent_detail_id_tbl.delete;
6415         l_sync_tmp_recTbl.delivery_id_tbl.delete;
6416         l_sync_tmp_recTbl.operation_type_tbl.delete;
6417     --}
6418     END IF;
6419     -- K LPN CONV. rv
6420     /* H projects: pricing integration csun , adding delivery */
6421     m := m+1;
6422     l_del_tab(m) := l_del_id_FOR_container2.delivery_id;
6423   END IF;
6424 
6425 
6426   --
6427   -- K LPN CONV. rv
6428   IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
6429   AND nvl(l_del_id_FOR_container2.line_direction,'O') IN ('O', 'IO')
6430   AND
6431   (
6432    (WSH_WMS_LPN_GRP.GK_WMS_PACK and l_wms_org = 'Y')
6433    OR
6434    (WSH_WMS_LPN_GRP.GK_INV_PACK and l_wms_org = 'N')
6435   )
6436   THEN
6437   --{
6438 
6439       l_sync_tmp_rec.delivery_detail_id := p_detail_id1;
6440       l_sync_tmp_rec.parent_delivery_detail_id := l_del_id_FOR_container1.parent_delivery_detail_id;
6441       l_sync_tmp_rec.delivery_id := l_del_id_FOR_container1.delivery_id;
6442       l_sync_tmp_rec.operation_type := 'PRIOR';
6443       --
6444       IF l_debug_on THEN
6445           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
6446       END IF;
6447       --
6448       WSH_WMS_SYNC_TMP_PKG.MERGE
6449       (
6450         p_sync_tmp_rec      => l_sync_tmp_rec,
6451         x_return_status     => l_return_status
6452       );
6453       --
6454       IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
6455         --
6456         x_return_status := l_return_status;
6457         --
6458         IF l_debug_on THEN
6459           WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
6460           WSH_DEBUG_SV.pop(l_module_name);
6461         END IF;
6462         --
6463         return;
6464         --
6465       ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
6466         --
6467         l_num_warnings := l_num_warnings + 1;
6468         --
6469       END IF;
6470       --
6471 
6472   --}
6473   END IF;
6474   -- K LPN CONV. rv
6475   --
6476   UPDATE wsh_delivery_assignments_v
6477   SET parent_delivery_detail_id = p_detail_id2,
6478     last_update_date = SYSDATE,
6479     last_updated_by =  FND_GLOBAL.USER_ID,
6480     last_update_login =  FND_GLOBAL.LOGIN_ID
6481   WHERE delivery_detail_id = p_detail_id1;
6482   l_mdc_detail_tab(1) := p_detail_id1;
6483   WSH_DELIVERY_DETAILS_ACTIONS.Delete_Consol_Record(
6484                    p_detail_id_tab     => l_mdc_detail_tab,
6485                    x_return_status     => x_return_status);
6486 
6487   IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
6488     IF l_debug_on THEN
6489       WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
6490       WSH_DEBUG_SV.pop(l_module_name);
6491     END IF;
6492     return;
6493   END IF;
6494 
6495         -- K LPN CONV. rv
6496         IF NOT( l_wms_org = 'Y' AND nvl(wsh_wms_lpn_grp.g_caller,'WSH') like 'WMS%')
6497         THEN
6498         --{
6499             -- J: W/V Changes
6500             IF l_debug_on THEN
6501               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
6502             END IF;
6503             WSH_WV_UTILS.DD_WV_Post_Process(
6504               p_delivery_detail_id => p_detail_id1,
6505               p_diff_gross_wt      => l_del_id_for_container1.gross_weight,
6506               p_diff_net_wt        => l_del_id_for_container1.net_weight,
6507               p_diff_volume        => l_del_id_for_container1.volume,
6508               p_diff_fill_volume   => l_del_id_for_container1.volume,
6509               x_return_status      => l_return_status);
6510 
6511             IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
6512                  --
6513                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6514                  WSH_UTIL_CORE.Add_Message(x_return_status);
6515                  IF l_debug_on THEN
6516                      WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
6517                      WSH_DEBUG_SV.pop(l_module_name);
6518                  END IF;
6519                  return;
6520             END IF;
6521         --}
6522         END IF;
6523         -- K LPN CONV. rv
6524 
6525 
6526 /*
6527   -- bug 1336858 fix: don't allow the user to pack a container in itself
6528   -- or create a loop of containers packed inside each other.
6529   -- We need to check if this assignment now creates a loop
6530   declare
6531     i NUMBER := 0;
6532   begin
6533 
6534     select container_name into detail_cont_name
6535     from wsh_delivery_details where delivery_detail_id = p_detail_id1;
6536     if SQL%NOTFOUND then
6537     detail_cont_name := '(' || p_detail_id1 || ')';
6538     end if;
6539 
6540           IF l_debug_on THEN
6541              WSH_DEBUG_SV.log(l_module_name,'detail_cont_name',
6542                                                        detail_cont_name);
6543           END IF;
6544 
6545     select container_name into parent_cont_name
6546     from wsh_delivery_details where delivery_detail_id = p_detail_id2;
6547     if SQL%NOTFOUND then
6548     detail_cont_name := '(' || p_detail_id2 || ')';
6549     end if;
6550           IF l_debug_on THEN
6551              WSH_DEBUG_SV.log(l_module_name,'parent_cont_name',
6552                                                        parent_cont_name);
6553           END IF;
6554 
6555     for c IN check_loop(p_detail_id1) loop
6556     i := i + 1; -- do nothing...
6557     end loop;
6558 
6559     exception
6560     WHEN others THEN
6561     rollback to before_cont_assignment;
6562     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6563     fnd_message.SET_name('WSH', 'WSH_CONT_LOOP_NO_PACK');
6564     fnd_message.set_token('DETAIL_CONTAINER', detail_cont_name);
6565     fnd_message.set_token('PARENT_CONTAINER', parent_cont_name);
6566     wsh_util_core.add_message(x_return_status,l_module_name);
6567     --
6568     IF l_debug_on THEN
6569         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected Error has occured. Oracle Err Mesg is'||SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
6570         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION1 : OTHERS');
6571     END IF;
6572     --
6573     return;
6574   end;
6575   -- end of check for assignment loop
6576 */
6577 
6578   IF l_del_tab.count > 0 THEN
6579     /*  H integration: Pricing integration csun
6580       when plan a delivery
6581     */
6582     --
6583     IF l_debug_on THEN
6584         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
6585                     WSH_DEBUG_SV.log(l_module_name,'Count of l_del_tab',l_del_tab.count);
6586     END IF;
6587     --
6588     WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
6589        p_entity_type => 'DELIVERY',
6590        p_entity_ids   => l_del_tab,
6591        x_return_status => l_return_status);
6592     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
6593        raise mark_reprice_error;
6594     END IF;
6595   END IF;
6596 
6597   -- LPN CONV. rv
6598   IF (l_num_warnings > 0 AND x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
6599     --
6600     x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
6601     --
6602   ELSE
6603     --
6604     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
6605     --
6606   END IF;
6607   -- LPN CONV. rv
6608 
6609 
6610 --
6611 IF l_debug_on THEN
6612     WSH_DEBUG_SV.pop(l_module_name);
6613 END IF;
6614 --
6615   exception
6616 
6617     -- OTM R12 : assign delivery detail
6618     WHEN FND_API.G_EXC_ERROR then
6619       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6620       --
6621       IF l_debug_on THEN
6622           WSH_DEBUG_SV.pop(l_module_name);
6623       END IF;
6624       --
6625       RETURN;
6626     -- End of OTM R12 : assign delivery detail
6627 
6628     WHEN  mark_reprice_error THEN
6629       FND_MESSAGE.Set_Name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
6630       x_return_status := l_return_status;
6631       WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
6632       --
6633       IF l_debug_on THEN
6634           WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
6635           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
6636       END IF;
6637       --
6638     WHEN others THEN
6639       if c_del_id_for_cont_or_detail%ISOPEN THEN
6640         close c_del_id_for_cont_or_detail;
6641       end if;
6642       if c_del_id_for_cont_or_detail%ISOPEN THEN
6643         close c_del_id_for_cont_or_detail;
6644       end if;
6645       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
6646       wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',l_module_name);
6647       --
6648       IF l_debug_on THEN
6649           WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
6650           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
6651       END IF;
6652       --
6653 END Assign_Cont_To_Cont;
6654 
6655 -- THIS API IS OBSOLETED.
6656 --
6657 --Procedure:      Unassign_Cont_From_Cont
6658 --Parameters:      p_detail_id,
6659 --            x_return_status
6660 --Desription:     Unassign a container FROM another container
6661 --             the assumption here IS that you are take the container
6662 --              out of the immediate parent container ;
6663 --              only need to null out the parent_detail_id.
6664 --              if containers are assigned to any delivery, the assignment
6665 --              will remain
6666 
6667 PROCEDURE Unassign_Cont_FROM_Cont(
6668   p_detail_id   IN NUMBER,
6669   x_return_status  OUT NOCOPY  VARCHAR2)
6670 IS
6671 
6672 l_del_rec               C_DEL_ID_FOR_CONT_OR_DETAIL%ROWTYPE;
6673 l_return_status         VARCHAR2(1);
6674 -- J: W/V Changes
6675 l_param_info   WSH_SHIPPING_PARAMS_PVT.Parameter_Rec_Typ;
6676 l_cont_fill_pc NUMBER;
6677 e_abort        exception;
6678 
6679 --
6680 l_debug_on BOOLEAN;
6681 --
6682 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_CONT_FROM_CONT';
6683 --
6684 BEGIN
6685 
6686   --
6687   --
6688   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6689   --
6690   --
6691 END Unassign_Cont_from_Cont;
6692 
6693 
6694 
6695 
6696 --
6697 --Procedure:      Unassign_detail_from_Delivery
6698 --Parameters:      p_detail_id,
6699 --            x_return_status
6700 --Desription:     Unassigns a detail from a delivery
6701 
6702 PROCEDURE Unassign_Detail_from_Delivery(
6703   p_detail_id        IN NUMBER
6704 , x_return_status     OUT NOCOPY  VARCHAR2
6705 , p_validate_flag    IN VARCHAR2,
6706  p_action_prms  IN WSH_GLBL_VAR_STRCT_GRP.dd_action_parameters_rec_type   -- J-IB-NPARIKH
6707 )
6708 
6709 IS
6710 detail_not_assigned exception;
6711 check_ship_SET_failed exception;
6712 check_smc_failed exception;
6713 del_not_updatable exception;
6714 l_cost_count number;
6715 l_return_status varchar2(30);
6716 l_shp_SET BOOLEAN;
6717 l_smc BOOLEAN;
6718 l_packed number;
6719 l_dummy_record number;
6720 --added for Bug 2209035
6721 CURSOR c_delivery1(p_del_id number)
6722 IS
6723 SELECT status_code, planned_flag,name,
6724         nvl(shipment_direction,'O') shipment_direction,   -- J-IB-NPARIKH
6725         ignore_for_planning -- OTM R12 : unassign delivery detail
6726 FROM wsh_new_deliveries
6727 WHERE delivery_id = p_del_id;
6728 
6729 l_del1 c_delivery1%ROWTYPE;
6730 
6731 l_shipping_param_info   WSH_SHIPPING_PARAMS_PVT.Parameter_Rec_Typ;
6732 get_shipping_param_err  EXCEPTION;
6733 adjust_parent_wv_err    EXCEPTION;
6734 
6735 CURSOR c_assign_rec
6736 IS
6737 SELECT wda.delivery_id, wda.parent_delivery_detail_id,
6738        wdd.organization_id,
6739        wdd.weight_uom_code,
6740        wdd.volume_uom_code,
6741        wdd.inventory_item_id
6742 FROM   wsh_delivery_assignments_v wda,
6743        wsh_delivery_details  wdd
6744 WHERE  wda.delivery_detail_id = p_detail_id
6745 and    wdd.delivery_detail_id = wda.delivery_detail_id
6746 and   ((wda.delivery_id IS not null) or (wda.parent_delivery_detail_id IS not null));
6747 
6748 l_assign c_assign_rec%ROWTYPE;
6749 l_mdc_detail_tab wsh_util_core.id_tab_type;
6750 /** We just need a Warning when ever we Unassign a Detail from a Delivery and
6751   if that Detail is part of a Ship Set */
6752 l_delivery_detail_id NUMBER;
6753 invalid_detail exception;
6754 -- Update Cartonization if released warehouse and WMS org.
6755 
6756 update_mol_carton_group_error exception;
6757 
6758 cursor get_mo_line_id (p_del_det_id IN NUMBER) is
6759 select move_order_line_id, organization_id
6760 from wsh_delivery_details
6761 where delivery_detail_id = p_del_det_id
6762 and released_status = 'S';
6763 
6764 cursor c_grouping_id is
6765 select wsh_delivery_group_s.nextval from dual;
6766 
6767 l_msg_count      NUMBER;
6768 l_msg_data       VARCHAR2(4000);
6769 l_det_org NUMBER;
6770 l_mo_line_id NUMBER;
6771 l_carton_grouping_id NUMBER;
6772 
6773 CURSOR c_all_details_below IS
6774 SELECT  delivery_detail_id,
6775         parent_delivery_detail_id, -- LPN CONV. rv
6776         delivery_id  -- LPN CONV. rv
6777 FROM  wsh_delivery_assignments_v
6778 START WITH  delivery_detail_id = p_detail_id
6779 CONNECT BY  prior delivery_detail_id = parent_delivery_detail_id;
6780 
6781 -- J: W/V Changes
6782 l_detail_status         VARCHAR2(1);
6783 l_gross_wt              NUMBER;
6784 l_net_wt                NUMBER;
6785 l_vol                   NUMBER;
6786 l_container_flag        VARCHAR2(1);
6787 l_delivery_id           NUMBER;
6788 
6789 l_dd_id     WSH_UTIL_CORE.Id_Tab_Type;
6790 l_del_id_tbl           WSH_UTIL_CORE.Id_Tab_Type; -- LPN CONV. rv
6791 l_parent_dd_id_tbl     WSH_UTIL_CORE.Id_Tab_Type; -- LPN CONV. rv
6792 l_line_dir_tbl         WSH_GLBL_VAR_STRCT_GRP.v3_Tbl_Type; -- LPN CONV. rv
6793 l_cnt_flag_tbl         WSH_GLBL_VAR_STRCT_GRP.v3_Tbl_Type; -- LPN CONV. rv
6794 l_det_org_id_tbl       WSH_UTIL_CORE.Id_Tab_Type; -- LPN CONV. rv
6795 i        BINARY_INTEGER := 0;
6796 j        BINARY_INTEGER :=0;
6797 
6798 l_dummy_del_det_id NUMBER;
6799 l_del_det_id NUMBER;
6800 
6801 l_del_tab      WSH_UTIL_CORE.Id_Tab_Type;
6802 l_status                WSH_LOOKUPS.meaning%TYPE;
6803 
6804 CURSOR get_lookup (l_code VARCHAR2) IS
6805   SELECT meaning
6806   FROM wsh_lookups
6807   WHERE lookup_type = 'DELIVERY_STATUS'
6808   AND lookup_code = l_code;
6809 
6810 
6811 mark_reprice_error         EXCEPTION;
6812 remove_FC_error            EXCEPTION;
6813 l_detail_is_empty_cont VARCHAR2(1);
6814 
6815 l_ib_upd_flag              VARCHAR2(1);
6816 l_rel_status              VARCHAR2(32767);
6817 
6818 l_null_delivery_id        NUMBER; -- Bugfix 3768823
6819 
6820 l_detail_tab              WSH_UTIL_CORE.id_tab_type;  -- DBI Project
6821 l_dbi_rs                  VARCHAR2(1); -- Return Status from DBI API
6822 
6823 -- K LPN CONV. rv
6824 l_wms_org    VARCHAR2(10) := 'N';
6825 l_loop_wms_org    VARCHAR2(10) := 'N';
6826 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
6827 l_line_dir VARCHAR2(10);
6828 l_num_warnings NUMBER := 0;
6829 
6830 cursor l_parent_cnt_csr (p_cnt_inst_id IN NUMBER) is
6831 select organization_id,
6832        nvl(line_direction,'O')
6833 from wsh_delivery_details
6834 where delivery_detail_id = p_cnt_inst_id
6835 and container_flag = 'Y'
6836 and source_code = 'WSH';
6837 
6838 l_parent_cnt_orgn_id NUMBER;
6839 l_parent_cnt_line_dir VARCHAR2(10);
6840 -- K LPN CONV. rv
6841 --
6842 
6843 -- OTM R12 : unassign delivery detail
6844 l_interface_flag_tab  WSH_UTIL_CORE.COLUMN_TAB_TYPE;
6845 l_delivery_id_tab     WSH_UTIL_CORE.ID_TAB_TYPE;
6846 l_is_delivery_empty   VARCHAR2(1);
6847 l_gc3_is_installed    VARCHAR2(1);
6848 l_call_update         VARCHAR2(1);
6849 l_gross_weight        WSH_DELIVERY_DETAILS.GROSS_WEIGHT%TYPE;
6850 l_gross_weight_tbl    WSH_UTIL_CORE.ID_TAB_TYPE;
6851 -- End of OTM R12 : unassign delivery detail
6852 l_chk_wms_org VARCHAR2(10) := 'N';
6853 l_debug_on BOOLEAN;
6854 --
6855 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_DETAIL_FROM_DELIVERY';
6856 --
6857 BEGIN
6858 
6859 /*changing as per discussion with PM -- if detail is in a container, unassign from container as well. if detail itself is a container, unassign all children from delivery as well*/
6860 
6861   --
6862   --
6863   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
6864   --
6865   IF l_debug_on IS NULL
6866   THEN
6867       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
6868   END IF;
6869   --
6870   IF l_debug_on THEN
6871       WSH_DEBUG_SV.push(l_module_name);
6872       --
6873       WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
6874       WSH_DEBUG_SV.log(l_module_name,'P_VALIDATE_FLAG',P_VALIDATE_FLAG);
6875         WSH_DEBUG_SV.log(l_module_name,'p_action_prms.caller',p_action_prms.caller);
6876   END IF;
6877   --
6878   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
6879   -- OTM R12
6880   l_gc3_is_installed := WSH_UTIL_CORE.G_GC3_IS_INSTALLED;
6881 
6882   IF (l_gc3_is_installed IS NULL) THEN
6883     l_gc3_is_installed := WSH_UTIL_CORE.GC3_IS_INSTALLED;
6884   END IF;
6885   -- End of OTM R12
6886 
6887   SAVEPOINT before_unassign;
6888 
6889   OPEN c_assign_rec;
6890   FETCH c_assign_rec into l_assign;
6891   IF ((c_assign_rec%NOTFOUND) OR (l_assign.delivery_id IS null)) THEN
6892     CLOSE c_assign_rec;
6893     RAISE DETAIL_NOT_ASSIGNED ;
6894 
6895   END IF;
6896   CLOSE c_assign_rec;
6897 
6898 
6899 
6900   OPEN c_delivery1(l_assign.delivery_id);
6901   FETCH c_delivery1 into l_del1;
6902   CLOSE c_delivery1;
6903 
6904     open g_get_detail_info(p_detail_id);
6905     fetch g_get_detail_info into l_detail_status,l_gross_wt, l_net_wt, l_vol, l_container_flag, l_delivery_id;
6906     close  g_get_detail_info;
6907 
6908 				--
6909 				-- Unassign lines is allowed during ASN/Receipt integration
6910 				-- even though lines are shipped, so bypassing checks for those callers.
6911 				--
6912     IF l_detail_status = 'C'
6913         AND NVL(p_action_prms.caller,'!!!!') NOT LIKE '%' || WSH_UTIL_CORE.C_SPLIT_DLVY_SUFFIX   -- J-IB-NPARIKH
6914         AND NVL(p_action_prms.caller,'!!!!') NOT LIKE WSH_UTIL_CORE.C_IB_ASN_PREFIX || '%'   -- J-IB-NPARIKH
6915         AND NVL(p_action_prms.caller,'!!!!') NOT LIKE WSH_UTIL_CORE.C_IB_RECEIPT_PREFIX || '%'   -- J-IB-NPARIKH
6916         THEN
6917      Raise invalid_detail;
6918     END IF;
6919 
6920 
6921         IF l_debug_on THEN
6922             WSH_DEBUG_SV.log(l_module_name,'l_detail_status',
6923                                       l_detail_status);
6924             WSH_DEBUG_SV.log(l_module_name,'l_del1.status_code',
6925                                       l_del1.status_code);
6926             WSH_DEBUG_SV.log(l_module_name,'l_del1.planned_flag',
6927                                       l_del1.planned_flag);
6928             WSH_DEBUG_SV.log(l_module_name,'l_del1.name',
6929                                       l_del1.name);
6930             WSH_DEBUG_SV.log(l_module_name,'l_del1.ignore_for_planning',
6931                                       l_del1.ignore_for_planning);
6932             WSH_DEBUG_SV.log(l_module_name,'l_assign.delivery_id',
6933                                                     l_assign.delivery_id);
6934             WSH_DEBUG_SV.log(l_module_name,'l_assign.parent_delivery_detail_id',
6935                                             l_assign.parent_delivery_detail_id);
6936            WSH_DEBUG_SV.log(l_module_name,'l_assign.organization_id',
6937                                             l_assign.organization_id);
6938 
6939          END IF;
6940 
6941   /* security rule: delivery status has to be open and not planned */
6942   /* Error */
6943 				--
6944 				-- Unassign lines is allowed during ASN/Receipt integration
6945 				-- even though deliveries are shipped/planned, so bypassing checks
6946    			        -- for those callers.
6947 --bugfix 13083282
6948 --
6949  l_chk_wms_org :=wsh_util_validate.check_wms_org(l_assign.organization_id);
6950  --
6951    IF l_container_flag = 'Y' THEN --{ --bug 5100229
6952            IF l_debug_on THEN
6953               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.Is_Empty',WSH_DEBUG_SV.C_PROC_LEVEL);
6954            END IF;
6955            WSH_CONTAINER_UTILITIES.Is_Empty (p_container_instance_id => p_detail_id,
6956                                              x_empty_flag => l_detail_is_empty_cont,
6957                                              x_return_status => l_return_status);
6958            IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
6959               Raise invalid_detail;
6960            END IF;
6961         ELSE --}{
6962            l_detail_is_empty_cont := 'E';
6963   END IF; --}
6964 
6965  --
6966  IF l_debug_on THEN
6967      WSH_DEBUG_SV.log(l_module_name,'l_chk_wms_org', l_chk_wms_org);
6968      WSH_DEBUG_SV.log(l_module_name,'l_detail_is_empty_cont',l_detail_is_empty_cont);
6969 
6970 END IF;
6971 --
6972 
6973   IF (NVL(p_validate_flag, 'Y') = 'Y') THEN
6974     IF ((l_del1.status_code = 'CL') or
6975     (l_del1.status_code = 'IT') or
6976     (l_del1.status_code = 'CO') or
6977     (l_del1.status_code = 'SC') or  --sperera 940/945
6978     (l_del1.status_code = 'SR') or
6979     (l_del1.planned_flag IN ('Y','F') AND l_detail_status <> 'D' AND l_chk_wms_org <> 'Y' )  or
6980     (l_del1.planned_flag IN ('Y','F') AND l_detail_status <> 'D' AND l_chk_wms_org = 'Y' AND  l_detail_is_empty_cont <> 'Y' ))  /*Bug7025876 added AND condition*/
6981     --Bug 3543772   AND NVL(p_action_prms.caller,'!!!!') NOT LIKE '%' || WSH_UTIL_CORE.C_SPLIT_DLVY_SUFFIX   -- J-IB-NPARIKH
6982                 AND NVL(p_action_prms.caller,'!!!!') NOT LIKE WSH_UTIL_CORE.C_IB_ASN_PREFIX || '%'   -- J-IB-NPARIKH
6983                 AND NVL(p_action_prms.caller,'!!!!') NOT LIKE WSH_UTIL_CORE.C_IB_RECEIPT_PREFIX || '%'   -- J-IB-NPARIKH
6984                 THEN
6985                           IF l_del1.planned_flag IN ('Y','F') THEN
6986                             fnd_message.SET_name('WSH', 'WSH_DET_UNASSIGN_FIRMDEL');
6987                             FND_MESSAGE.SET_TOKEN('DEL_NAME',l_del1.name);
6988                           ELSE
6989                            OPEN get_lookup(l_del1.status_code);
6990                               FETCH get_lookup INTO l_status;
6991                            CLOSE get_lookup;
6992                            fnd_message.SET_name('WSH',
6993                                       'WSH_DET_DEL_NOT_UPDATABLE');
6994                            FND_MESSAGE.SET_TOKEN('STATUS',l_status);
6995                         END IF;
6996       RAISE DEL_NOT_UPDATABLE;
6997     END IF;
6998 
6999   END IF; -- validate flag IS Y
7000 
7001 
7002   /* H projects: pricing integration csun */
7003   l_del_tab.delete;
7004   l_del_tab(1) := l_assign.delivery_id;
7005 
7006   --
7007   IF l_debug_on THEN
7008       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
7009   END IF;
7010   --
7011   WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
7012     p_entity_type => 'DELIVERY',
7013     p_entity_ids   => l_del_tab,
7014     x_return_status => l_return_status);
7015     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS AND
7016        l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7017        RAISE mark_reprice_error;
7018     ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7019        IF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS  THEN
7020           x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
7021                       IF l_debug_on THEN
7022                          WSH_DEBUG_SV.log(l_module_name,'Mark_Reprice_Required completed with warnings.');
7023                       END IF;
7024 
7025        END IF;
7026     END IF;
7027 
7028 
7029         -- J: W/V Changes
7030         -- Decrement the parent W/V by DD W/V
7031   IF l_debug_on THEN
7032     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
7033   END IF;
7034         WSH_WV_UTILS.DD_WV_Post_Process(
7035           p_delivery_detail_id => p_detail_id,
7036           p_diff_gross_wt      => -1 * l_gross_wt,
7037           p_diff_net_wt        => -1 * l_net_wt,
7038           p_diff_volume        => -1 * l_vol,
7039           p_diff_fill_volume   => -1 * l_vol,
7040           p_check_for_empty    => 'Y',
7041           x_return_status      => l_return_status);
7042 
7043        IF (l_return_status IN  (WSH_UTIL_CORE.G_RET_STS_ERROR,WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7044              --
7045              x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7046              WSH_UTIL_CORE.Add_Message(x_return_status);
7047              IF l_debug_on THEN
7048                  WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
7049                  WSH_DEBUG_SV.pop(l_module_name);
7050              END IF;
7051              return;
7052         END IF;
7053 
7054   -- OTM R12 : unassign delivery detail
7055   -- l_gross_weight <> 0 means that any of the unassigned detail has
7056   -- gross_weight <> 0, which will be used later
7057   IF (l_gc3_is_installed = 'Y' AND
7058       NVL(l_del1.ignore_for_planning, 'N') = 'N') THEN
7059     l_gross_weight := 0;
7060   END IF;
7061   -- End of OTM R12 : unassign delivery detail
7062 
7063   --loop thru each lower detail and unassign from del
7064   OPEN c_all_details_below;
7065   --for locking all details
7066   LOOP
7067     -- OTM R12 : unassign delivery detail, legacy issue
7068     --           l_del_id_tbl and l_parent_dd_id_tbl need to be switched
7069     FETCH c_all_details_below into l_dd_id(i), l_parent_dd_id_tbl(i), l_del_id_tbl(i);
7070     EXIT WHEN c_all_details_below%notfound;
7071     SELECT delivery_detail_id, nvl(line_direction, 'O'), container_flag,
7072            organization_id,
7073            gross_weight          -- OTM R12 : unassign delivery detail
7074       INTO l_dummy_del_det_id, l_line_dir_tbl(i), l_cnt_flag_tbl(i),
7075            l_det_org_id_tbl(i),
7076            l_gross_weight_tbl(i) -- OTM R12 : unassign delivery detail
7077     FROM wsh_delivery_details
7078     WHERE delivery_detail_id=l_dd_id(i)
7079     FOR UPDATE NOWAIT;
7080 
7081     -- OTM R12 : unassign delivery detail
7082     IF (l_gc3_is_installed = 'Y' AND
7083         NVL(l_del1.ignore_for_planning, 'N') = 'N' AND
7084         l_gross_weight = 0) THEN
7085       l_gross_weight := l_gross_weight + NVL(l_gross_weight_tbl(i),0);
7086     END IF;
7087     -- End of OTM R12 : unassign delivery detail
7088 
7089     IF l_debug_on THEN
7090       WSH_DEBUG_SV.log(l_module_name,'l_dd_id',l_dd_id(i));
7091       -- OTM R12 : unassign delivery detail
7092       WSH_DEBUG_SV.log(l_module_name,'l_del_id',l_del_id_tbl(i));
7093       WSH_DEBUG_SV.log(l_module_name,'l_gross_weight',l_gross_weight_tbl(i));
7094       -- End of OTM R12 : unassign delivery detail
7095     END IF;
7096     i := i+1;
7097   END LOOP;
7098   CLOSE c_all_details_below;
7099 
7100   l_null_delivery_id := null; --bugfix 3768823
7101   FOR j IN 0..(l_dd_id.COUNT-1) LOOP
7102     --
7103     -- K LPN CONV. rv
7104     --
7105     l_loop_wms_org := wsh_util_validate.check_wms_org(l_det_org_id_tbl(j));
7106     --
7107     IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7108     AND l_line_dir_tbl(j) IN ('O', 'IO')
7109     AND l_cnt_flag_tbl(j) = 'Y'
7110     AND
7111     (
7112       (WSH_WMS_LPN_GRP.GK_WMS_UNASSIGN_DLVY and l_loop_wms_org = 'Y')
7113       OR
7114       (WSH_WMS_LPN_GRP.GK_INV_UNASSIGN_DLVY and l_loop_wms_org = 'N')
7115     )
7116     THEN
7117     --{
7118         l_sync_tmp_rec.delivery_detail_id := l_dd_id(j);
7119         l_sync_tmp_rec.parent_delivery_detail_id := l_parent_dd_id_tbl(j);
7120         l_sync_tmp_rec.delivery_id := l_del_id_tbl(j);
7121         l_sync_tmp_rec.operation_type := 'PRIOR';
7122         --
7123         IF l_debug_on THEN
7124             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
7125         END IF;
7126         --
7127         WSH_WMS_SYNC_TMP_PKG.MERGE
7128         (
7129           p_sync_tmp_rec      => l_sync_tmp_rec,
7130           x_return_status     => l_return_status
7131         );
7132         --
7133         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7134           --
7135           x_return_status := l_return_status;
7136           --
7137           IF l_debug_on THEN
7138             WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
7139             WSH_DEBUG_SV.pop(l_module_name);
7140           END IF;
7141           --
7142           return;
7143           --
7144         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
7145           --
7146           l_num_warnings := l_num_warnings + 1;
7147           --
7148         END IF;
7149         --
7150     --}
7151     END IF;
7152     -- K LPN CONV. rv
7153     --
7154     UPDATE wsh_delivery_assignments_v
7155        SET delivery_id = l_null_delivery_id, --bugfix 3768823
7156            last_update_date = SYSDATE,
7157            last_updated_by =  FND_GLOBAL.USER_ID,
7158            last_update_login =  FND_GLOBAL.LOGIN_ID
7159      WHERE delivery_detail_id = l_dd_id(j);
7160 
7161      -- bug 6700792: OTM Dock Door Appt Sched Proj
7162      --Upadating the loading sequence of the delivery detail to NULL while unassigning from delivery
7163      UPDATE wsh_delivery_details
7164      SET    load_seq_number = NULL,
7165             last_update_date = SYSDATE,
7166             last_updated_by =  FND_GLOBAL.USER_ID,
7167             last_update_login =  FND_GLOBAL.LOGIN_ID
7168      WHERE  delivery_detail_id = l_dd_id(j);
7169 
7170     IF (SQL%NOTFOUND) THEN
7171       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7172       RAISE NO_DATA_FOUND;
7173     END IF;
7174 
7175     l_mdc_detail_tab(1) := l_dd_id(j);
7176     WSH_DELIVERY_DETAILS_ACTIONS.Delete_Consol_Record(
7177                        p_detail_id_tab     => l_mdc_detail_tab,
7178                        x_return_status => x_return_status);
7179 
7180     IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7181       IF l_debug_on THEN
7182         WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
7183         WSH_DEBUG_SV.pop(l_module_name);
7184       END IF;
7185       return;
7186     END IF;
7187 
7188            IF l_debug_on THEN
7189               WSH_DEBUG_SV.log(l_module_name,'Updating for detail id',l_dd_id(j));
7190            END IF;
7191 
7192 
7193            -- J-IB-NPARIKH-{
7194            IF l_del1.shipment_Direction NOT IN ('O','IO')
7195            AND NVL(p_action_prms.caller,'!!!!') NOT LIKE '%' || WSH_UTIL_CORE.C_SPLIT_DLVY_SUFFIX
7196            THEN
7197                 l_ib_upd_flag := 'Y';
7198            ELSE
7199                 l_ib_upd_flag := 'N';
7200            END IF;
7201            --
7202            IF l_debug_on THEN
7203               WSH_DEBUG_SV.log(l_module_name,'l_ib_upd_flag',l_ib_upd_flag);
7204            END IF;
7205            --
7206            -- J-IB-NPARIKH-}
7207 
7208 
7209 
7210            IF l_detail_is_empty_cont ='Y' THEN
7211              --
7212              -- K LPN CONV. rv
7213              IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7214              AND l_line_dir_tbl(j) IN ('O', 'IO')
7215              AND
7216              (
7217                (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_loop_wms_org = 'Y')
7218                OR
7219                (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_loop_wms_org = 'N')
7220              )
7221              THEN
7222              --{
7223                  l_sync_tmp_rec.delivery_detail_id := l_dd_id(j);
7224                  l_sync_tmp_rec.operation_type := 'UPDATE';
7225                  --
7226                  IF l_debug_on THEN
7227                      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
7228                  END IF;
7229                  --
7230                  WSH_WMS_SYNC_TMP_PKG.MERGE
7231                  (
7232                    p_sync_tmp_rec      => l_sync_tmp_rec,
7233                    x_return_status     => l_return_status
7234                  );
7235                  --
7236                  IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7237                    --
7238                    x_return_status := l_return_status;
7239                    --
7240                    IF l_debug_on THEN
7241                      WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
7242                      WSH_DEBUG_SV.pop(l_module_name);
7243                    END IF;
7244                    --
7245                    return;
7246                    --
7247                  ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
7248                    --
7249                    l_num_warnings := l_num_warnings + 1;
7250                    --
7251                  END IF;
7252                  --
7253              --}
7254              END IF;
7255              -- K LPN CONV. rv
7256              --
7257              UPDATE wsh_delivery_details
7258              SET customer_id =  NULL,
7259                  ship_to_location_id = NULL,
7260                  intmed_ship_to_location_id = NULL,
7261                  fob_code = NULL,
7262                  freight_terms_code = NULL,
7263                  ship_method_code = NULL,
7264                  mode_of_transport = NULL,
7265                  service_level = NULL,
7266                  carrier_id = NULL,
7267                  deliver_to_location_id = NULL,
7268                  -- tracking_number = NULL, Bug# 3632485
7269                  line_direction = DECODE(line_direction,'IO','O',line_direction),   -- J-IB-NPARIKH
7270                  last_update_date = SYSDATE,
7271                  last_updated_by =  FND_GLOBAL.USER_ID,
7272                  last_update_login =  FND_GLOBAL.LOGIN_ID
7273              WHERE  delivery_detail_id = l_dd_id(j);
7274              IF (SQL%NOTFOUND) THEN
7275                x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7276                RAISE NO_DATA_FOUND;
7277              END IF;
7278              --
7279 
7280            END IF;
7281            IF l_ib_upd_flag ='Y' THEN
7282              UPDATE wsh_delivery_details
7283              SET  ship_from_location_id  = -1,   -- J-IB-NPARIKH
7284                routing_req_id         = NULL,   -- J-IB-NPARIKH
7285                rcv_shipment_line_id   = NULL,   -- J-IB-NPARIKH
7286                shipped_quantity       = NULL,   -- J-IB-NPARIKH
7287                shipped_quantity2      = NULL,   -- J-IB-NPARIKH
7288                picked_quantity        = NULL,   -- J-IB-NPARIKH
7289                picked_quantity2       = NULL,   -- J-IB-NPARIKH
7290                received_quantity      = NULL,   -- J-IB-NPARIKH
7291                received_quantity2     = NULL,   -- J-IB-NPARIKH
7292                returned_quantity      = NULL,   -- J-IB-NPARIKH
7293                returned_quantity2     = NULL,   -- J-IB-NPARIKH
7294                earliest_pickup_date   = NULL,   -- J-IB-NPARIKH
7295                latest_pickup_date     = NULL,   -- J-IB-NPARIKH
7296                released_status        = DECODE(nvl(requested_quantity,0),0,
7297                                                'D',
7298                                                'X'),   -- J-IB-NPARIKH
7299                ignore_for_planning    = 'Y',   -- J-IB-NPARIKH
7300                --wv_frozen_flag    = DECODE(l_ib_upd_flag,'Y','N',wv_frozen_flag),   -- J-IB-NPARIKH
7301                last_update_date = SYSDATE,
7302                last_updated_by =  FND_GLOBAL.USER_ID,
7303                last_update_login =  FND_GLOBAL.LOGIN_ID
7304             WHERE  delivery_detail_id = l_dd_id(j)
7305             returning released_status into l_rel_status;
7306 	    --bugfix 4530813
7307             IF (SQL%NOTFOUND) THEN
7308               x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7309               RAISE NO_DATA_FOUND;
7310             END IF;
7311             IF l_debug_on THEN
7312               WSH_DEBUG_SV.log(l_module_name,'Rel Status after the update is ', l_rel_status);
7313             END IF;
7314 
7315                -- released_status        = DECODE(released_status,'D','D',
7316                --                                 nvl(shipped_quantity,picked_quantity,requested_quantity),0,'D',
7317                --                                 decode(p_action_prms.caller,'WSH_IB_RROQ',0,-1),requested_quantity,'D',
7318                --                                 'X'),   -- J-IB-NPARIKH
7319              -- DBI API needs to be called for update in released_status/requested_qty
7320              -- So cannot call for l_dd_id completely, since selected few of those are
7321              -- getting processed here.So keep the ids in a local table and call DBI API
7322              -- after the loop for l_dd_id table.
7323              l_detail_tab(l_detail_tab.count + 1) := l_dd_id(j);
7324            END IF;
7325 
7326 
7327            -- Update Cartonization id
7328            OPEN get_mo_line_id(l_dd_id(j));
7329            FETCH get_mo_line_id INTO l_mo_line_id, l_det_org;
7330            CLOSE get_mo_line_id;
7331 
7332            IF l_mo_line_id IS NOT NULL AND
7333               (WSH_USA_INV_PVT.is_mo_type_putaway(p_move_order_line_id => l_mo_line_id)='N') AND --X-dock
7334               (WSH_UTIL_VALIDATE.Check_Wms_Org(l_det_org)='Y')
7335            THEN
7336 
7337               OPEN c_grouping_id;
7338               FETCH c_grouping_id into l_carton_grouping_id;
7339               CLOSE c_grouping_id;
7340 
7341               IF l_debug_on THEN
7342                  WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_MO_CANCEL_PVT.update_mol_carton_group',WSH_DEBUG_SV.C_PROC_LEVEL);
7343               END IF;
7344 
7345               INV_MO_Cancel_PVT.update_mol_carton_group(
7346                                  x_return_status => x_return_status,
7347                                  x_msg_cnt  => l_msg_count,
7348                                  x_msg_data => l_msg_data,
7349                                  p_line_id  => l_mo_line_id,
7350                                  p_carton_grouping_id => l_carton_grouping_id);
7351 
7352               IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR))
7353               THEN
7354 
7355                  RAISE update_mol_carton_group_error;
7356 
7357               END IF;
7358 
7359 
7360            END IF; -- IF (l_mo_line_id IS NOT NULL)...
7361 
7362 
7363 
7364   END LOOP;
7365 
7366   -- OTM R12 : unassign delivery detail
7367   --           executed only once after the loop assuming that all the
7368   --           delivery details fetched from cursor c_all_details_below belong
7369   --           to the same delivery
7370   IF (l_gc3_is_installed = 'Y' AND
7371       nvl(l_del1.ignore_for_planning, 'N') = 'N') THEN
7372 
7373     l_call_update := 'Y';
7374     l_delivery_id_tab(1) := l_assign.delivery_id;
7375     l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(l_assign.delivery_id);
7376 
7377     IF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
7378       --handle the error approriately to the procedure this code is in
7379       IF l_debug_on THEN
7380         WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
7381       END IF;
7382       raise FND_API.G_EXC_ERROR;
7383     ELSIF (l_is_delivery_empty = 'Y') THEN
7384       l_interface_flag_tab(1) := WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_REQUIRED;
7385     ELSIF (l_is_delivery_empty = 'N') THEN
7386      l_interface_flag_tab(1) := NULL;
7387     --Bug7608629
7388     --removed code which checked for gross weight
7389     --now irrespective of gross weight  UPDATE_TMS_INTERFACE_FLAG will be called
7390     END IF;
7391 
7392     IF l_call_update = 'Y' THEN
7393       WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG(
7394               p_delivery_id_tab        => l_delivery_id_tab,
7395               p_tms_interface_flag_tab => l_interface_flag_tab,
7396               x_return_status          => l_return_status);
7397 
7398       IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
7399         x_return_status := l_return_status;
7400         IF l_debug_on THEN
7401           WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG '||l_return_status);
7402           WSH_DEBUG_SV.pop(l_module_name);
7403         END IF;
7404         RETURN;
7405       ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
7406         l_num_warnings := l_num_warnings + 1;
7407       END IF;
7408     END IF;
7409   END IF;
7410   -- End of OTM R12 : unassign delivery detail
7411 
7412   -- Call DBI api after the loop
7413   -- DBI Project
7414   -- Update of wsh_delivery_details,  call DBI API after the action.
7415   -- This API will also check for DBI Installed or not
7416   IF l_debug_on THEN
7417     WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail count-',l_detail_tab.count);
7418   END IF;
7419   WSH_INTEGRATION.DBI_Update_Detail_Log
7420     (p_delivery_detail_id_tab => l_detail_tab,
7421      p_dml_type               => 'UPDATE',
7422      x_return_status          => l_dbi_rs);
7423 
7424   IF l_debug_on THEN
7425     WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
7426   END IF;
7427   IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
7428     x_return_status := l_dbi_rs;
7429     -- just pass this return status to caller API
7430     ROLLBACK TO before_unassign;
7431     --
7432     IF l_debug_on THEN
7433       WSH_DEBUG_SV.logmsg(l_module_name,'DBI API call failed',x_return_status);
7434        WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:DBI API FAILED');
7435       END IF;
7436     RETURN;
7437   END IF;
7438   -- End of Code for DBI Project
7439   --
7440 
7441   --also unassign from container
7442   IF (l_assign.parent_delivery_detail_id IS NOT null) THEN
7443            -- K LPN CONV. rv
7444            --
7445            open l_parent_cnt_csr(l_assign.parent_delivery_detail_id);
7446            fetch l_parent_cnt_csr into l_parent_cnt_orgn_id, l_parent_cnt_line_dir;
7447            close l_parent_cnt_csr;
7448            --
7449            IF l_debug_on THEN
7450              WSH_DEBUG_SV.log(l_module_name,' parent cnt orgn id is', l_parent_cnt_orgn_id);
7451              WSH_DEBUG_SV.log(l_module_name,' parent cnt line dir is', l_parent_cnt_line_dir);
7452            END IF;
7453            --
7454            l_wms_org := wsh_util_validate.check_wms_org(l_parent_cnt_orgn_id);
7455            --
7456            -- K LPN CONV. rv
7457            --
7458            IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7459            AND nvl(l_parent_cnt_line_dir,'O') IN ('O', 'IO')
7460            AND
7461            (
7462              (WSH_WMS_LPN_GRP.GK_WMS_UNPACK and l_wms_org = 'Y')
7463              OR
7464              (WSH_WMS_LPN_GRP.GK_INV_UNPACK and l_wms_org = 'N')
7465            )
7466            THEN
7467            --{
7468                l_sync_tmp_rec.delivery_detail_id := p_detail_id;
7469                l_sync_tmp_rec.parent_delivery_detail_id := l_assign.parent_delivery_detail_id;
7470                l_sync_tmp_rec.delivery_id := l_assign.delivery_id;
7471                l_sync_tmp_rec.operation_type := 'PRIOR';
7472                --
7473                IF l_debug_on THEN
7474                    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
7475                END IF;
7476                --
7477                WSH_WMS_SYNC_TMP_PKG.MERGE
7478                (
7479                  p_sync_tmp_rec      => l_sync_tmp_rec,
7480                  x_return_status     => l_return_status
7481                );
7482                --
7483                IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7484                  --
7485                  x_return_status := l_return_status;
7486                  --
7487                  IF l_debug_on THEN
7488                    WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
7489                    WSH_DEBUG_SV.pop(l_module_name);
7490                  END IF;
7491                  --
7492                  return;
7493                  --
7494                ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
7495                  --
7496                  l_num_warnings := l_num_warnings + 1;
7497                  --
7498                END IF;
7499                --
7500            --}
7501            END IF;
7502            -- K LPN CONV. rv
7503            --
7504            UPDATE wsh_delivery_assignments_v
7505            SET  parent_delivery_detail_id=NULL
7506            WHERE  delivery_detail_id = p_detail_id;
7507 
7508            --OTM Dock Door Appt Sched Proj
7509            --Upadating the loading sequence of the delivery detail to NULL while unassigning from delivery
7510            UPDATE wsh_delivery_details
7511            SET    load_seq_number = NULL,
7512                   last_update_date = SYSDATE,
7513                   last_updated_by =  FND_GLOBAL.USER_ID,
7514                   last_update_login =  FND_GLOBAL.LOGIN_ID
7515            WHERE  delivery_detail_id = p_detail_id;
7516 
7517 	   IF (SQL%NOTFOUND) THEN
7518               x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7519               RAISE NO_DATA_FOUND;
7520            END IF;
7521 
7522            l_mdc_detail_tab(1) := p_detail_id;
7523            WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
7524                       p_detail_id_tab => l_mdc_detail_tab,
7525                       x_return_status => x_return_status);
7526 
7527            IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7528              IF l_debug_on THEN
7529                WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
7530                WSH_DEBUG_SV.pop(l_module_name);
7531              END IF;
7532              return;
7533            END IF;
7534 
7535            WSH_SHIPPING_PARAMS_PVT.Get(
7536              p_organization_id     => l_assign.organization_id,
7537 	     x_param_info          => l_shipping_param_info,
7538              x_return_status       => l_return_status);
7539 
7540 
7541            IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR))
7542 	   THEN
7543               IF l_debug_on THEN
7544                WSH_DEBUG_SV.logmsg(l_module_name,'WSH_SHIPPING_PARAMS_PVT.Get returned '||l_return_status);
7545               END IF;
7546               RAISE get_shipping_param_err;
7547            END IF;
7548 
7549 
7550            IF l_shipping_param_info.PERCENT_FILL_BASIS_FLAG = 'Q' THEN
7551 
7552              WSH_WV_UTILS.ADJUST_PARENT_WV(
7553               p_entity_type   => 'CONTAINER',
7554               p_entity_id     => l_assign.parent_delivery_detail_id,
7555               p_gross_weight  => 0,
7556               p_net_weight    => 0,
7557               p_volume        => 0,
7558               p_filled_volume => 0,
7559               p_wt_uom_code   => l_assign.weight_uom_code,
7560               p_vol_uom_code  => l_assign.volume_uom_code,
7561               p_inv_item_id   => l_assign.inventory_item_id,
7562               x_return_status => l_return_status);
7563 
7564             IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR))
7565  	       THEN
7566                IF l_debug_on THEN
7567                 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_WV_UTILS.ADJUST_PARENT_WV returned '||l_return_status);
7568                END IF;
7569                RAISE adjust_parent_wv_err;
7570             END IF;
7571 
7572 
7573            END IF;
7574 
7575   END IF;
7576 
7577    /* Bug 2769639, remove FTE generated FC for the delivery detail and all the delivery details below it */
7578 
7579    IF WSH_UTIL_CORE.FTE_Is_Installed = 'Y'  AND l_dd_id.count > 0
7580    AND NVL(p_action_prms.caller,'!!!!') NOT LIKE '%' || WSH_UTIL_CORE.C_SPLIT_DLVY_SUFFIX
7581    THEN
7582       WSH_FREIGHT_COSTS_PVT.Remove_FTE_Freight_Costs(
7583          p_delivery_details_tab => l_dd_id,
7584          x_return_status => l_return_status) ;
7585       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS AND
7586          l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7587          raise remove_FC_error;
7588       ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7589          IF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
7590             x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
7591          END IF;
7592       END IF;
7593       IF l_debug_on THEN
7594          WSH_DEBUG_SV.log(l_module_name,'Remove_FTE_Freight_Costs completed returns with status: ' ||
7595                           l_return_status);
7596       END IF;
7597 
7598       NULL;
7599    END IF;
7600 
7601    -- LPN CONV. rv
7602    IF (l_num_warnings > 0 AND x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
7603      --
7604      x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
7605      --
7606    ELSE
7607      --
7608      x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
7609      --
7610    END IF;
7611    -- LPN CONV. rv
7612 
7613 
7614 
7615 --
7616 IF l_debug_on THEN
7617     WSH_DEBUG_SV.pop(l_module_name);
7618 END IF;
7619 --
7620   EXCEPTION
7621           WHEN mark_reprice_error  THEN
7622             x_return_status := l_return_status;
7623                   FND_MESSAGE.Set_Name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
7624         WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
7625         ROLLBACK TO before_unassign;
7626         --
7627         IF l_debug_on THEN
7628             WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7629             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
7630         END IF;
7631         --
7632     WHEN detail_not_assigned THEN
7633       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7634       fnd_message.set_name('WSH', 'WSH_DET_DETAIL_NOT_ASSIGNED');
7635       wsh_util_core.add_message(x_return_status,l_module_name);
7636       ROLLBACK TO before_unassign;
7637       --
7638       IF l_debug_on THEN
7639           WSH_DEBUG_SV.logmsg(l_module_name,'DETAIL_NOT_ASSIGNED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7640           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:DETAIL_NOT_ASSIGNED');
7641       END IF;
7642       --
7643     WHEN del_not_updatable THEN
7644       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7645       wsh_util_core.add_message(x_return_status,l_module_name);
7646       ROLLBACK TO before_unassign;
7647       --
7648       IF l_debug_on THEN
7649           WSH_DEBUG_SV.logmsg(l_module_name,'DEL_NOT_UPDATABLE exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7650           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:DEL_NOT_UPDATABLE');
7651       END IF;
7652       --
7653                 WHEN update_mol_carton_group_error THEN
7654       fnd_message.SET_name('WSH', 'WSH_MOL_CARTON_GROUP_ERROR');
7655                         x_return_status := l_return_status;
7656                         WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
7657 
7658                       --
7659                       IF l_debug_on THEN
7660                           WSH_DEBUG_SV.logmsg(l_module_name,'update_mol_carton_group_error exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7661                           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:update_mol_carton_group_error');
7662                       END IF;
7663 
7664     WHEN check_ship_set_failed THEN
7665       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7666 
7667 --
7668 IF l_debug_on THEN
7669     WSH_DEBUG_SV.logmsg(l_module_name,'CHECK_SHIP_SET_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7670     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CHECK_SHIP_SET_FAILED');
7671 END IF;
7672 --
7673     WHEN check_smc_failed THEN
7674       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7675       --
7676       IF l_debug_on THEN
7677           WSH_DEBUG_SV.logmsg(l_module_name,'CHECK_SMC_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7678           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CHECK_SMC_FAILED');
7679       END IF;
7680       --
7681     WHEN remove_FC_error  THEN
7682        x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7683       --
7684       IF l_debug_on THEN
7685           WSH_DEBUG_SV.logmsg(l_module_name,'Remove_FTE_Freight_Costs failed.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7686           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:REMOVE_FC_ERROR');
7687       END IF;
7688       --
7689        FND_MESSAGE.Set_Name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
7690         WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
7691       ROLLBACK TO before_unassign;
7692 
7693     WHEN get_shipping_param_err THEN
7694       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7695       FND_MESSAGE.Set_Name('WSH', 'WSH_PARAM_NOT_DEFINED');
7696       FND_MESSAGE.Set_Token('ORGANIZATION_CODE',
7697                         wsh_util_core.get_org_name(l_assign.organization_id));
7698       wsh_util_core.add_message(x_return_status,l_module_name);
7699       ROLLBACK TO before_unassign;
7700       --
7701       IF l_debug_on THEN
7702          WSH_DEBUG_SV.logmsg(l_module_name,'Failed to get Shipping Parameters',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7703          WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:GET_SHIPPING_PARAM_ERR');
7704       END IF;
7705 
7706     WHEN adjust_parent_wv_err THEN
7707       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7708       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
7709       FND_MESSAGE.SET_TOKEN('CONT_NAME',WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_assign.parent_delivery_detail_id));
7710       WSH_UTIL_CORE.ADD_MESSAGE(x_return_status,l_module_name);
7711 
7712       ROLLBACK TO before_unassign;
7713       --
7714       IF l_debug_on THEN
7715          WSH_DEBUG_SV.logmsg(l_module_name,'Failed to adjust the weight and volume of parent container '||to_char(l_assign.parent_delivery_detail_id),WSH_DEBUG_SV.C_EXCEP_LEVEL);
7716          WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:ADJUST_PARENT_WV_ERR');
7717       END IF;
7718 
7719     WHEN others THEN
7720       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
7721       wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_DETAIL_FROM_DELIVERY',l_module_name);
7722       ROLLBACK TO before_unassign;
7723 
7724 
7725 --
7726 IF l_debug_on THEN
7727     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
7728     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
7729 END IF;
7730 --
7731 END Unassign_Detail_FROM_Delivery;
7732 
7733 
7734 -------------------------------------------------------------------
7735 -- This procedure is only for backward compatibility. No one should call
7736 -- this procedure.
7737 -------------------------------------------------------------------
7738 
7739 PROCEDURE Unassign_Detail_from_Delivery(
7740   p_detail_id                IN NUMBER
7741 , x_return_status         OUT NOCOPY  VARCHAR2
7742 , p_validate_flag        IN VARCHAR2)
7743 
7744 IS
7745 
7746 --
7747 l_debug_on BOOLEAN;
7748 --
7749 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_DETAIL_FROM_DELIVERY';
7750 --
7751 l_action_prms   WSH_GLBL_VAR_STRCT_GRP.dd_action_parameters_rec_type;  -- J-IB-NPARIKH
7752 BEGIN
7753 
7754 /*changing as per discussion with PM -- if detail is in a container, unassign from container as well. if detail itself is a container, unassign all children from delivery as well*/
7755 
7756     --
7757     --
7758     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
7759     --
7760     IF l_debug_on IS NULL
7761     THEN
7762         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
7763     END IF;
7764     --
7765     IF l_debug_on THEN
7766         WSH_DEBUG_SV.push(l_module_name);
7767         --
7768         WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
7769         WSH_DEBUG_SV.log(l_module_name,'P_VALIDATE_FLAG',P_VALIDATE_FLAG);
7770     END IF;
7771     --
7772     IF l_debug_on THEN
7773        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_DETAIL_FROM_DELIVERY',WSH_DEBUG_SV.C_PROC_LEVEL);
7774     END IF;
7775     UNASSIGN_DETAIL_FROM_DELIVERY (p_detail_id,
7776                                      x_return_status,
7777                                      p_validate_flag,
7778                                      l_action_prms);
7779     --
7780     IF l_debug_on THEN
7781         WSH_DEBUG_SV.pop(l_module_name);
7782     END IF;
7783     --
7784     EXCEPTION
7785         WHEN others THEN
7786             x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
7787             wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_DETAIL_FROM_DELIVERY',l_module_name);
7788         --
7789         IF l_debug_on THEN
7790             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
7791         END IF;
7792         --
7793 END Unassign_Detail_FROM_Delivery;
7794 
7795 
7796 
7797 
7798 --
7799 --Procedure:      Unassign_multiple_details
7800 --Parameters:      P_REC_OF_DETAIL_IDS
7801 --              P_from_delivery
7802 --              P_from_container
7803 --            x_return_status
7804 --Desription:     Unasigns multiple details FROM a delivery or a container
7805 PROCEDURE Unassign_Multiple_Details(
7806   P_REC_OF_DETAIL_IDS  IN WSH_UTIL_CORE.ID_TAB_TYPE
7807 , P_FROM_delivery    IN VARCHAR2
7808 , P_FROM_container     IN VARCHAR2
7809 , x_return_status    out NOCOPY  varchar2
7810 , p_validate_flag    IN VARCHAR2
7811 , p_action_prms  IN WSH_GLBL_VAR_STRCT_GRP.dd_action_parameters_rec_type   -- J-IB-NPARIKH
7812 )
7813 IS
7814 
7815 CURSOR c_multi_assign_rec(c_delivery_detail_id number)
7816 IS
7817 SELECT   delivery_id, parent_delivery_detail_id
7818 FROM     wsh_delivery_assignments_v
7819 WHERE delivery_detail_id = c_delivery_Detail_id
7820 AND   ((delivery_id IS not null) or (parent_delivery_detail_id IS not null));
7821 l_multi_assign_rec c_multi_assign_rec%ROWTYPE;
7822 
7823 CURSOR c_multi_delivery(c_del_id number)
7824 IS
7825 SELECT *
7826 FROM wsh_new_deliveries
7827 WHERE delivery_id = c_del_id;
7828 l_multi_delivery c_multi_delivery%ROWTYPE;
7829 
7830 l_multi_cost_count number;
7831 l_ship_set BOOLEAN;
7832 l_smc_set BOOLEAN;
7833 l_return_status varchar2(30);
7834 check_ship_SET_failed exception;
7835 check_smc_failed  exception;
7836 l_num_errors    NUMBER;
7837 l_num_warnings    NUMBER;
7838 /*Bug 2136603- added variables */
7839 l_gross NUMBER;
7840 l_net NUMBER;
7841 l_volume NUMBER;
7842 l_fill NUMBER;
7843 l_cont_name VARCHAR2(30);
7844 --
7845 l_dlvy_tbl         WSH_UTIL_CORE.key_value_tab_type;   -- J-IB-NPARIKH
7846 l_dlvy_ext_tbl     WSH_UTIL_CORE.key_value_tab_type;   -- J-IB-NPARIKH
7847 l_del_tab          WSH_UTIL_CORE.ID_TAB_TYPE;
7848 l_index            NUMBER;
7849 L_DLVY_FREIGHT_TERMS_CODE  VARCHAR2(30);
7850 
7851 Cursor c_empty_delivery ( p_del_id number) --Pick To POD WF : Raise PO Cancellation for empty Inbound delivery
7852 IS
7853 SELECT wnd.delivery_id, wnd.organization_id
7854 FROM wsh_new_deliveries wnd
7855 WHERE wnd.delivery_id = p_del_id and wnd.shipment_direction='I'
7856 and  not exists (  SELECT wda.delivery_id
7857 FROM wsh_delivery_assignments_v  wda
7858 WHERE wda.delivery_id =wnd.delivery_id  );
7859 l_del_id NUMBER;
7860 l_org_id NUMBER;
7861 l_wf_rs VARCHAR2(1);
7862 
7863 -- K LPN CONV. rv
7864 l_lpn_in_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_in_rec_type;
7865 l_lpn_out_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_out_rec_type;
7866 l_msg_count NUMBER;
7867 l_msg_data VARCHAR2(32767);
7868 -- K LPN CONV. rv
7869 
7870 --
7871 l_debug_on BOOLEAN;
7872 --
7873 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_MULTIPLE_DETAILS';
7874 --
7875 BEGIN
7876   --
7877   --
7878   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
7879   --
7880   IF l_debug_on IS NULL
7881   THEN
7882       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
7883   END IF;
7884   --
7885   IF l_debug_on THEN
7886       WSH_DEBUG_SV.push(l_module_name);
7887       --
7888       WSH_DEBUG_SV.log(l_module_name,'P_FROM_DELIVERY',P_FROM_DELIVERY);
7889       WSH_DEBUG_SV.log(l_module_name,'P_FROM_CONTAINER',P_FROM_CONTAINER);
7890       WSH_DEBUG_SV.log(l_module_name,'P_VALIDATE_FLAG',P_VALIDATE_FLAG);
7891   END IF;
7892   --
7893   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
7894 
7895   -- initialize summary variables
7896   l_num_warnings := 0;
7897   l_num_errors := 0;
7898 
7899   IF (p_from_delivery = 'Y') THEN
7900      FOR i in p_rec_of_detail_ids.FIRST .. p_rec_of_detail_ids.LAST
7901     LOOP
7902       OPEN c_multi_assign_rec(p_rec_of_detail_ids(i));
7903       FETCH c_multi_assign_rec INTO l_multi_assign_rec;
7904 
7905                         IF l_debug_on THEN
7906                            WSH_DEBUG_SV.log(l_module_name,'p_rec_of_detail_ids',
7907                                p_rec_of_detail_ids(i));
7908                         END IF;
7909 
7910       IF (c_multi_assign_rec%NOTFOUND) THEN
7911         l_num_warnings := l_num_warnings + 1;
7912         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
7913         fnd_message.SET_name('WSH','WSH_DET_SPEC_DET_NOT_ASSIGNED');
7914         fnd_message.SET_token('DELIVERY_DETAIL_ID', p_rec_of_detail_ids(i));
7915         wsh_util_core.add_message(x_return_status,l_module_name);
7916         /* go ahead and process the next line */
7917         CLOSE c_multi_assign_rec;
7918         GOTO start_over_1;
7919       END IF;
7920       CLOSE c_multi_assign_rec;
7921 
7922       IF (l_multi_assign_rec.delivery_id IS null) THEN
7923         l_num_warnings := l_num_warnings + 1;
7924         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
7925         fnd_message.SET_name('WSH','WSH_DET_SPEC_DET_NOT_ASSIGNED');
7926         fnd_message.SET_token('DELIVERY_DETAIL_ID', p_rec_of_detail_ids(i));
7927         wsh_util_core.add_message(x_return_status,l_module_name);
7928         /* go ahead and process the next line */
7929         GOTO start_over_1;
7930       END IF;
7931 
7932             -- J-IB-NPARIKH-{
7933             --
7934             --
7935             IF l_debug_on THEN
7936                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.get_Cached_value',WSH_DEBUG_SV.C_PROC_LEVEL);
7937             END IF;
7938             --
7939             -- Build a cache of uniqye delivery IDs , from which lines are being unassigned
7940             --
7941             --
7942             WSH_UTIL_CORE.get_Cached_value
7943                 (
7944                     p_cache_tbl         => l_dlvy_tbl,
7945                     p_cache_ext_tbl     => l_dlvy_ext_tbl,
7946                     p_key               => l_multi_assign_rec.delivery_id,
7947                     p_value             => l_multi_assign_rec.delivery_id,
7948                     p_action            => 'PUT',
7949                     x_return_status     => l_return_status
7950                 );
7951             --
7952             --
7953             wsh_util_core.api_post_call
7954               (
7955                 p_return_status => l_return_status,
7956                 x_num_warnings  => l_num_warnings,
7957                 x_num_errors    => l_num_errors
7958               );
7959             --
7960             -- J-IB-NPARIKH-}
7961 
7962 
7963       Unassign_detail_from_delivery(
7964         p_detail_id   =>   p_rec_of_detail_ids(i),
7965         p_validate_flag   =>  p_validate_flag,
7966         x_return_status   =>  l_return_status,
7967                 p_action_prms       => p_action_prms   -- J-IB-NPARIKH
7968         );
7969       IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR
7970          l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
7971         l_num_errors := l_num_errors + 1;
7972       ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
7973         l_num_warnings := l_num_warnings + 1;
7974       END IF;
7975 
7976 
7977       <<start_over_1>>
7978       NULL;
7979     END LOOP;
7980         --
7981         --
7982         -- J-IB-NPARIKH-{
7983         --
7984         l_index := l_dlvy_tbl.FIRST;
7985         --
7986         WHILE l_index IS NOT NULL
7987         LOOP
7988         --{
7989 
7990             IF NVL(p_action_prms.caller,'!!!!') NOT LIKE WSH_UTIL_CORE.C_IB_RECEIPT_PREFIX || '%'   -- J-IB-NPARIKH
7991             THEN
7992             --{
7993 		IF l_debug_on THEN
7994 		  WSH_DEBUG_SV.logmsg(l_module_name,'WSH_TP_RELEASE.calculate_cont_del_tpdates',WSH_DEBUG_SV.C_PROC_LEVEL);
7995 		END IF;
7996 
7997 		l_del_tab(1) := l_dlvy_tbl(l_index).value;
7998 		WSH_TP_RELEASE.calculate_cont_del_tpdates(
7999 		  p_entity => 'DLVY',
8000 		  p_entity_ids =>l_del_tab,
8001 		  x_return_status => l_return_status);
8002 		    --}
8003 	      /*CURRENTLY NOT IN USE
8004 	      IF ( p_action_prms.caller = WSH_UTIL_CORE.C_IB_PO_PREFIX  ) -- Added for Pick to POD WF
8005 	      THEN	--PO cancellation unassigns DD from delivery, we check if delivery gets emptied out then we raise a event
8006 			OPEN c_empty_delivery( l_dlvy_tbl(l_index).value )  ;
8007 			Fetch c_empty_delivery into l_del_id, l_org_id;
8008 			If (c_empty_delivery%FOUND )
8009 			THEN
8010 				 --Raise Event: Pick To Pod Workflow
8011 				  WSH_WF_STD.Raise_Event(
8012 							p_entity_type => 'DELIVERY',
8013 							p_entity_id =>  l_del_id,
8014 							p_event => 'oracle.apps.fte.delivery.ib.pocancelled' ,
8015 							p_organization_id =>  l_org_id,
8016 							x_return_status => l_wf_rs ) ;
8017 				 IF l_debug_on THEN
8018 				     WSH_DEBUG_SV.log(l_module_name,'Delivery ID is  ',  l_del_id );
8019 				     WSH_DEBUG_SV.log(l_module_name,'Return Status After Calling WSH_WF_STD.Raise_Event',l_wf_rs);
8020 				 END IF;
8021 				--Done Raise Event: Pick To Pod Workflow
8022 			END IF;
8023 			CLOSE c_empty_delivery;
8024 		END IF;
8025 		*/
8026             END IF;
8027 
8028             --
8029             IF l_debug_on THEN
8030                 WSH_DEBUG_SV.log(l_module_name,'l_dlvy_tbl(l_index).value',l_dlvy_tbl(l_index).value);
8031                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERY_ACTIONS.update_freight_terms',WSH_DEBUG_SV.C_PROC_LEVEL);
8032             END IF;
8033             --
8034             WSH_NEW_DELIVERY_ACTIONS.update_freight_terms
8035                 (
8036                     p_delivery_id        => l_dlvy_tbl(l_index).value,
8037                     p_action_code        => 'UNASSIGN',
8038                     x_return_status      => l_return_status,
8039                     x_freight_terms_code => l_dlvy_freight_terms_code
8040                 );
8041             --
8042             --
8043             wsh_util_core.api_post_call
8044               (
8045                 p_return_status => l_return_status,
8046                 x_num_warnings  => l_num_warnings,
8047                 x_num_errors    => l_num_errors
8048               );
8049             --
8050             --
8051             l_index := l_dlvy_tbl.NEXT(l_index);
8052         --}
8053         END LOOP;
8054         --
8055         --
8056         l_index := l_dlvy_ext_tbl.FIRST;
8057         --
8058         WHILE l_index IS NOT NULL
8059         LOOP
8060         --{
8061             --
8062             IF NVL(p_action_prms.caller,'!!!!') NOT LIKE WSH_UTIL_CORE.C_IB_RECEIPT_PREFIX || '%'   -- J-IB-NPARIKH
8063             THEN
8064             --{
8065 
8066             IF l_debug_on THEN
8067               WSH_DEBUG_SV.logmsg(l_module_name,'WSH_TP_RELEASE.calculate_cont_del_tpdates',WSH_DEBUG_SV.C_PROC_LEVEL);
8068             END IF;
8069             l_del_tab(1) := l_dlvy_ext_tbl(l_index).value;
8070             WSH_TP_RELEASE.calculate_cont_del_tpdates(
8071               p_entity => 'DLVY',
8072               p_entity_ids =>l_del_tab,
8073               x_return_status => l_return_status);
8074             --}
8075 		/*IF ( p_action_prms.caller = WSH_UTIL_CORE.C_IB_PO_PREFIX  ) -- Added for Pick to POD WF
8076 		THEN	--PO cancellation unassigns DD from delivery, we check if delivery gets emptied out then we raise a event
8077 			OPEN c_empty_delivery( l_dlvy_ext_tbl(l_index).value )  ;
8078 			Fetch c_empty_delivery into l_del_id, l_org_id;
8079 			If (c_empty_delivery%FOUND )
8080 			THEN
8081 				 --Raise Event: Pick To Pod Workflow
8082 				  WSH_WF_STD.Raise_Event(
8083 							p_entity_type => 'DELIVERY',
8084 							p_entity_id =>  l_del_id,
8085 							p_event => 'oracle.apps.fte.delivery.ib.pocancelled' ,
8086 							p_organization_id =>  l_org_id,
8087 							x_return_status => l_wf_rs ) ;
8088 				 IF l_debug_on THEN
8089 				     WSH_DEBUG_SV.log(l_module_name,'Delivery ID is  ',  l_del_id );
8090 				     WSH_DEBUG_SV.log(l_module_name,'Return Status After Calling WSH_WF_STD.Raise_Event',l_wf_rs);
8091 				 END IF;
8092 				--Done Raise Event: Pick To Pod Workflow
8093 			END IF;
8094 			CLOSE c_empty_delivery;
8095 		END IF;*/
8096             END IF;
8097 
8098             IF l_debug_on THEN
8099                WSH_DEBUG_SV.log(l_module_name,'l_dlvy_ext_tbl(l_index).value',l_dlvy_ext_tbl(l_index).value);
8100                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERY_ACTIONS.update_freight_terms',WSH_DEBUG_SV.C_PROC_LEVEL);
8101             END IF;
8102             --
8103             WSH_NEW_DELIVERY_ACTIONS.update_freight_terms
8104                 (
8105                     p_delivery_id        => l_dlvy_ext_tbl(l_index).value,
8106                     p_action_code        => 'UNASSIGN',
8107                     x_return_status      => l_return_status,
8108                     x_freight_terms_code => l_dlvy_freight_terms_code
8109                 );
8110             --
8111             --
8112             wsh_util_core.api_post_call
8113               (
8114                 p_return_status => l_return_status,
8115                 x_num_warnings  => l_num_warnings,
8116                 x_num_errors    => l_num_errors
8117               );
8118             --
8119             --
8120             l_index := l_dlvy_ext_tbl.NEXT(l_index);
8121         --}
8122         END LOOP;
8123         --
8124         -- J-IB-NPARIKH-}
8125 
8126   END IF;
8127         IF l_debug_on THEN
8128             WSH_DEBUG_SV.log(l_module_name,'l_num_errors', l_num_errors);
8129             WSH_DEBUG_SV.log(l_module_name,'l_num_warnings', l_num_warnings);
8130         END IF;
8131 
8132   IF (p_from_container = 'Y') THEN
8133     FOR i in  p_rec_of_detail_ids.FIRST .. p_rec_of_detail_ids.LAST
8134     LOOP
8135       OPEN c_multi_assign_rec(p_rec_of_detail_ids(i));
8136       FETCH c_multi_assign_rec INTO l_multi_assign_rec;
8137                         IF l_debug_on THEN
8138                            WSH_DEBUG_SV.log(l_module_name,'p_rec_of_detail_ids'
8139                                           ,p_rec_of_detail_ids(i));
8140                            WSH_DEBUG_SV.log(l_module_name,'l_multi_assign_rec',
8141                                                l_multi_assign_rec.delivery_id);
8142                         END IF;
8143       IF (c_multi_assign_rec%NOTFOUND) THEN
8144         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8145         fnd_message.SET_name('WSH','WSH_DET_SPEC_DET_NOT_ASSIGNED');
8146         fnd_message.SET_token('DELIVERY_DETAIL_ID', p_rec_of_detail_ids(i));
8147         wsh_util_core.add_message(x_return_status,l_module_name);
8148         /* go ahead and process the next line */
8149          CLOSE c_multi_assign_rec;
8150         GOTO start_over_2;
8151       END IF;
8152       CLOSE c_multi_assign_rec;
8153 
8154 /* Bug 2166715 - check if line was actually packed or not */
8155             IF l_multi_assign_rec.parent_delivery_detail_id IS NULL THEN                      l_num_warnings := l_num_warnings + 1;
8156               fnd_message.SET_name('WSH','WSH_CONT_UNASSG_NULL');
8157               wsh_util_core.add_message(x_return_status,l_module_name);
8158             END IF;
8159 
8160       Unassign_detail_FROM_cont(
8161         p_detail_id       =>   p_rec_of_detail_ids(i),
8162         p_validate_flag      => p_validate_flag,
8163         x_return_status    => l_return_status
8164         );
8165       IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR
8166          l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
8167         l_num_errors := l_num_errors + 1;
8168       ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
8169         l_num_warnings := l_num_warnings + 1;
8170 
8171       END IF;
8172 
8173       IF l_debug_on THEN
8174         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_TP_RELEASE.calculate_cont_del_tpdates',WSH_DEBUG_SV.C_PROC_LEVEL);
8175       END IF;
8176       l_del_tab(1) := l_multi_assign_rec.parent_delivery_detail_id;
8177       WSH_TP_RELEASE.calculate_cont_del_tpdates(
8178                   p_entity => 'DLVB',
8179                   p_entity_ids =>l_del_tab,
8180       x_return_status => l_return_status);
8181 
8182          <<start_over_2>>
8183         NULL;
8184     END LOOP;
8185   END IF;
8186   --
8187   -- K LPN CONV. rv
8188   --
8189   IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8190   THEN
8191   --{
8192       IF l_debug_on THEN
8193         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
8194       END IF;
8195 
8196       WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8197         (
8198           p_in_rec             => l_lpn_in_sync_comm_rec,
8199           x_return_status      => l_return_status,
8200           x_out_rec            => l_lpn_out_sync_comm_rec
8201         );
8202       --
8203       --
8204       IF l_debug_on THEN
8205         WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
8206       END IF;
8207       --
8208       --
8209       WSH_UTIL_CORE.API_POST_CALL
8210         (
8211           p_return_status    => l_return_status,
8212           x_num_warnings     => l_num_warnings,
8213           x_num_errors       => l_num_errors,
8214           p_raise_error_flag => false
8215         );
8216   --}
8217   END IF;
8218   --
8219   -- K LPN CONV. rv
8220   --
8221   --
8222   IF (l_num_errors >= p_rec_of_detail_ids.COUNT) THEN
8223     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8224   ELSIF (l_num_warnings > 0 OR l_num_errors>0) THEN
8225     x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8226   END IF;
8227         IF l_debug_on THEN
8228             WSH_DEBUG_SV.log(l_module_name,'x_return_status',x_return_status);
8229             WSH_DEBUG_SV.log(l_module_name,'l_num_warnings',l_num_warnings);
8230             WSH_DEBUG_SV.log(l_module_name,'l_num_errors',l_num_errors);
8231             WSH_DEBUG_SV.pop(l_module_name);
8232         END IF;
8233 
8234   EXCEPTION
8235         -- J-IB-NPARIKH-{
8236        WHEN fnd_api.g_exc_error THEN
8237           x_return_status := fnd_api.g_ret_sts_error;
8238           --
8239           -- K LPN CONV. rv
8240           --
8241           IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8242           THEN
8243           --{
8244               IF l_debug_on THEN
8245                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
8246               END IF;
8247               WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8248                 (
8249                   p_in_rec             => l_lpn_in_sync_comm_rec,
8250                   x_return_status      => l_return_status,
8251                   x_out_rec            => l_lpn_out_sync_comm_rec
8252                 );
8253               --
8254               --
8255               IF l_debug_on THEN
8256                 WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
8257               END IF;
8258               --
8259               --
8260               IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
8261                 x_return_status := l_return_status;
8262               END IF;
8263               --
8264           --}
8265           END IF;
8266           --
8267           -- K LPN CONV. rv
8268           --
8269           --
8270           IF l_debug_on THEN
8271              wsh_debug_sv.pop(l_module_name, 'EXCEPTION:FND_API.G_EXC_ERROR');
8272           END IF;
8273        --
8274        WHEN fnd_api.g_exc_unexpected_error THEN
8275          x_return_status := fnd_api.g_ret_sts_unexp_error;
8276          --
8277          --
8278          -- K LPN CONV. rv
8279          --
8280          IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8281          THEN
8282          --{
8283               IF l_debug_on THEN
8284                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
8285               END IF;
8286 
8287              WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8288                (
8289                  p_in_rec             => l_lpn_in_sync_comm_rec,
8290                  x_return_status      => l_return_status,
8291                  x_out_rec            => l_lpn_out_sync_comm_rec
8292                );
8293              --
8294              --
8295              IF l_debug_on THEN
8296                WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
8297              END IF;
8298              --
8299              --
8300              --
8301          --}
8302          END IF;
8303          --
8304          -- K LPN CONV. rv
8305          --
8306           IF l_debug_on THEN
8307              wsh_debug_sv.pop(l_module_name, 'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
8308           END IF;
8309        --
8310 
8311         -- J-IB-NPARIKH-}
8312     WHEN CHECK_SHIP_SET_FAILED THEN
8313       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8314       --
8315           --
8316           -- K LPN CONV. rv
8317           --
8318           IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8319           THEN
8320           --{
8321               IF l_debug_on THEN
8322                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
8323               END IF;
8324 
8325               WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8326                 (
8327                   p_in_rec             => l_lpn_in_sync_comm_rec,
8328                   x_return_status      => l_return_status,
8329                   x_out_rec            => l_lpn_out_sync_comm_rec
8330                 );
8331               --
8332               --
8333               IF l_debug_on THEN
8334                 WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
8335               END IF;
8336               --
8337               --
8338               IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
8339                 x_return_status := l_return_status;
8340               END IF;
8341               --
8342           --}
8343           END IF;
8344           --
8345           -- K LPN CONV. rv
8346           --
8347       IF l_debug_on THEN
8348           WSH_DEBUG_SV.logmsg(l_module_name,'CHECK_SHIP_SET_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
8349           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CHECK_SHIP_SET_FAILED');
8350       END IF;
8351       --
8352     WHEN check_smc_failed THEN
8353        x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8354           --
8355           -- K LPN CONV. rv
8356           --
8357           IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8358           THEN
8359           --{
8360               IF l_debug_on THEN
8361                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
8362               END IF;
8363 
8364               WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8365                 (
8366                   p_in_rec             => l_lpn_in_sync_comm_rec,
8367                   x_return_status      => l_return_status,
8368                   x_out_rec            => l_lpn_out_sync_comm_rec
8369                 );
8370               --
8371               --
8372               IF l_debug_on THEN
8373                 WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
8374               END IF;
8375               --
8376               --
8377               IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
8378                 x_return_status := l_return_status;
8379               END IF;
8380               --
8381           --}
8382           END IF;
8383           --
8384           -- K LPN CONV. rv
8385           --
8386        --
8387        IF l_debug_on THEN
8388            WSH_DEBUG_SV.logmsg(l_module_name,'CHECK_SMC_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
8389            WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CHECK_SMC_FAILED');
8390        END IF;
8391        --
8392     WHEN others THEN
8393        x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8394        wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_MULTIPLE_DETAIL',l_module_name);
8395 --
8396 IF l_debug_on THEN
8397     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
8398 END IF;
8399 --
8400           --
8401           -- K LPN CONV. rv
8402           --
8403           IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8404           THEN
8405           --{
8406               IF l_debug_on THEN
8407                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
8408               END IF;
8409 
8410               WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8411                 (
8412                   p_in_rec             => l_lpn_in_sync_comm_rec,
8413                   x_return_status      => l_return_status,
8414                   x_out_rec            => l_lpn_out_sync_comm_rec
8415                 );
8416               --
8417               --
8418               IF l_debug_on THEN
8419                 WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
8420               END IF;
8421               --
8422               --
8423           --}
8424           END IF;
8425           --
8426           -- K LPN CONV. rv
8427           --
8428 
8429 --
8430 IF l_debug_on THEN
8431     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
8432 END IF;
8433 --
8434 END Unassign_Multiple_Details;
8435 
8436 -------------------------------------------------------------------
8437 -- This procedure is only for backward compatibility. No one should call
8438 -- this procedure.
8439 -------------------------------------------------------------------
8440 
8441 PROCEDURE Unassign_Multiple_Details(
8442   P_REC_OF_DETAIL_IDS    IN WSH_UTIL_CORE.ID_TAB_TYPE
8443 , P_FROM_delivery        IN VARCHAR2
8444 , P_FROM_container       IN VARCHAR2
8445 , x_return_status        out NOCOPY  varchar2
8446 , p_validate_flag      IN VARCHAR2
8447 )
8448 IS
8449 
8450 
8451 l_debug_on BOOLEAN;
8452 --
8453 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_MULTIPLE_DETAILS';
8454 --
8455 l_action_prms   WSH_GLBL_VAR_STRCT_GRP.dd_action_parameters_rec_type;  -- J-IB-NPARIKH
8456 BEGIN
8457     --
8458     --
8459     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
8460     --
8461     IF l_debug_on IS NULL
8462     THEN
8463         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
8464     END IF;
8465     --
8466     IF l_debug_on THEN
8467         WSH_DEBUG_SV.push(l_module_name);
8468         --
8469         WSH_DEBUG_SV.log(l_module_name,'P_FROM_DELIVERY',P_FROM_DELIVERY);
8470         WSH_DEBUG_SV.log(l_module_name,'P_FROM_CONTAINER',P_FROM_CONTAINER);
8471         WSH_DEBUG_SV.log(l_module_name,'P_VALIDATE_FLAG',P_VALIDATE_FLAG);
8472     END IF;
8473     --
8474     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8475     --
8476     IF l_debug_on THEN
8477         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_MULTIPLE_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
8478     END IF;
8479     --
8480     UNASSIGN_MULTIPLE_DETAILS
8481         (
8482               P_REC_OF_DETAIL_IDS
8483             , P_FROM_delivery
8484             , P_FROM_container
8485             , x_return_status
8486             , p_validate_flag
8487             , l_action_prms
8488         );
8489 
8490         IF l_debug_on THEN
8491             WSH_DEBUG_SV.pop(l_module_name);
8492         END IF;
8493 
8494     EXCEPTION
8495         WHEN others THEN
8496            x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8497         wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_MULTIPLE_DETAIL',l_module_name);
8498         --
8499         IF l_debug_on THEN
8500             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
8501         END IF;
8502 --
8503 END Unassign_Multiple_Details;
8504 
8505 --
8506 --Procedure:      Assign_multiple_details
8507 --Parameters:      P_REC_OF_DETAIL_IDS
8508 --            P_delivery_id,
8509 --            P_cont_ins_id,
8510 --            x_return_status
8511 --Desription:     Assings multiple details to a delivery or a container
8512 
8513 PROCEDURE Assign_Multiple_Details(
8514   p_rec_of_detail_ids IN WSH_UTIL_CORE.ID_TAB_TYPE,
8515   p_delivery_id NUMBER,
8516   P_cont_ins_id number,
8517   x_return_status OUT NOCOPY  varchar2)
8518 IS
8519 l_rowid varchar2(150);
8520 l_group_status varchar2(30);
8521 l_ship_method_match boolean;
8522 l_delivery_assignments_info WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_TYPE;
8523 l_cr_assg_status varchar2(30);
8524 l_delivery_assignment_id NUMBER;
8525 del_id number;
8526 cont_id number;
8527 
8528 
8529 CURSOR c_get_del_from_container(c_container_id number) IS
8530 SELECT delivery_id
8531 FROM wsh_delivery_assignments_v
8532 WHERE delivery_detail_id = c_container_id;
8533 
8534 l_num_errors    NUMBER;
8535 l_num_warnings    NUMBER;
8536 
8537 
8538 l_scc_unassign_from_del NUMBER  := 0;
8539 l_scc_unassign_from_con NUMBER  := 0;
8540 l_delivery_id           NUMBER := 0;
8541 l_del_tab               WSH_UTIL_CORE.Id_Tab_Type;
8542 l_return_status         VARCHAR2(1);
8543 m                       NUMBER := 0;
8544 
8545 
8546 mark_reprice_error      EXCEPTION;
8547 
8548 /* Bug 2276586 */
8549 l_delivery_id1 NUMBER;
8550 delivery_id_locked exception  ;
8551 PRAGMA EXCEPTION_INIT(delivery_id_locked, -54);
8552 
8553 
8554 
8555 l_has_lines               VARCHAR2(1);
8556 l_dlvy_freight_terms_code VARCHAR2(30);
8557 --
8558 --
8559 l_debug_on BOOLEAN;
8560 --
8561 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'ASSIGN_MULTIPLE_DETAILS';
8562 --
8563 BEGIN
8564   --
8565   --
8566   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
8567   --
8568   IF l_debug_on IS NULL
8569   THEN
8570       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
8571   END IF;
8572   --
8573   IF l_debug_on THEN
8574       WSH_DEBUG_SV.push(l_module_name);
8575       --
8576       WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
8577       WSH_DEBUG_SV.log(l_module_name,'P_CONT_INS_ID',P_CONT_INS_ID);
8578   END IF;
8579   --
8580   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8581   l_del_tab.delete;
8582   l_num_errors := 0;
8583   l_num_warnings := 0;
8584 
8585   IF ((p_delivery_id = -9999)  AND (p_cont_ins_id = -9999 )) THEN
8586      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8587      --
8588      IF l_debug_on THEN
8589          WSH_DEBUG_SV.pop(l_module_name);
8590      END IF;
8591      --
8592      return;
8593   END IF;
8594 
8595 -- Bug 2276586
8596    SELECT delivery_id, freight_Terms_code    -- J-IB-NPARIKH
8597      INTO l_delivery_id1, l_dlvy_freight_Terms_code
8598      FROM wsh_new_deliveries
8599     WHERE delivery_id = p_delivery_id
8600       FOR UPDATE NOWAIT;
8601 
8602   IF l_debug_on THEN
8603           WSH_DEBUG_SV.log(l_module_name,'Locking for Delivery id ',l_delivery_id1);
8604           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_VALIDATIONS.has_lines',WSH_DEBUG_SV.C_PROC_LEVEL);
8605         END IF;
8606 
8607     -- J-IB-NPARIKH-{
8608     --
8609     -- Determine if delivery has any non-container lines
8610     --
8611     l_has_lines := WSH_DELIVERY_VALIDATIONS.has_lines
8612                         (
8613                             p_delivery_id => p_delivery_id
8614                         );
8615     --
8616     -- J-IB-NPARIKH-}
8617 
8618 
8619     FOR i IN P_REC_OF_DETAIL_IDS.FIRST .. P_REC_OF_DETAIL_IDS.LAST
8620   LOOP
8621 
8622     IF (p_delivery_id <> -9999) THEN
8623       /* assigning it to a delivery */
8624        --
8625        IF l_debug_on THEN
8626                            WSH_DEBUG_SV.log(l_module_name,'Delivery id ',p_rec_of_detail_ids(i));
8627 
8628            WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_DETAIL_TO_DELIVERY',WSH_DEBUG_SV.C_PROC_LEVEL);
8629        END IF;
8630        --
8631        wsh_delivery_details_actions.assign_detail_to_delivery(
8632           p_detail_id => P_REC_OF_DETAIL_IDS(i),
8633           p_delivery_id => p_delivery_id,
8634           x_return_status => x_return_status,
8635           x_dlvy_has_lines          => l_has_lines,   -- J-IB-NPARIKH
8636           x_dlvy_freight_terms_code => l_dlvy_freight_terms_code   -- J-IB-NPARIKH
8637                 );
8638 
8639       IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
8640         IF (x_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
8641           x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8642           l_num_errors := l_num_errors + 1;
8643         ELSIF (x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
8644           x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8645           l_num_warnings := l_num_warnings + 1;
8646         END IF;
8647         goto start_over;
8648       /* H project : pricing integration csun , need to mark the reprice
8649                      flag if any of the delivery detail is assigned */
8650       ELSE
8651          l_scc_unassign_from_del := l_scc_unassign_from_del + 1;
8652       END IF;
8653       END IF;
8654 
8655     IF (p_cont_ins_id <> -9999) THEN
8656                          -- J: W/V Changes
8657                          -- replaced the direct update with Assign_Detail_To_Cont API
8658                          wsh_delivery_details_actions.Assign_Detail_To_Cont(
8659                            p_detail_id        => P_REC_OF_DETAIL_IDS(i),
8660                            p_parent_detail_id => p_cont_ins_id,
8661                            x_return_status    => x_return_status);
8662 
8663        IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
8664         IF (x_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
8665           x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8666           l_num_errors := l_num_errors + 1;
8667         ELSIF (x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
8668           x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8669           l_num_warnings := l_num_warnings + 1;
8670         END IF;
8671         goto start_over;
8672        /* H project : pricing integration csun , need to mark the reprice
8673                      flag if any of the delivery detail is assigned */
8674        ELSE
8675                            l_scc_unassign_from_con  :=  l_scc_unassign_from_con + 1;
8676        END IF;
8677 
8678     END IF;
8679       <<start_over>>
8680       NULL;
8681   END LOOP;
8682 
8683         IF l_debug_on THEN
8684           WSH_DEBUG_SV.log(l_module_name,
8685                        'l_scc_unassign_from_del',
8686                         l_scc_unassign_from_del);
8687           WSH_DEBUG_SV.log(l_module_name,
8688                        'l_scc_unassign_from_con',
8689                         l_scc_unassign_from_con);
8690         END IF;
8691 
8692   IF (l_num_errors > 0) THEN
8693     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8694     --
8695     IF l_debug_on THEN
8696         WSH_DEBUG_SV.log(l_module_name,'Ret status is error',l_num_errors);
8697         WSH_DEBUG_SV.pop(l_module_name);
8698     END IF;
8699     --
8700     return;
8701   ELSIF (l_num_warnings > 0) THEN
8702     x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8703   END IF;
8704 
8705 
8706   /* H projects: pricing integration csun get the delivery id the container is
8707   assigned to  and mark the delivery */
8708   IF l_scc_unassign_from_del > 0  THEN
8709       m := m + 1;
8710       l_del_tab(m) := p_delivery_id;
8711   END IF;
8712   IF l_scc_unassign_from_con > 0 THEN
8713      OPEN c_get_del_from_container(p_cont_ins_id) ;
8714      FETCH c_get_del_from_container INTO l_delivery_id;
8715      CLOSE c_get_del_from_container;
8716      IF l_delivery_id <> 0 and l_delivery_id IS NOT NULL THEN
8717         m := m + 1;
8718         l_del_tab(m) := l_delivery_id;
8719      END IF;
8720   END IF;
8721         IF l_del_tab.count > 0 THEN
8722     --
8723     IF l_debug_on THEN
8724         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
8725     END IF;
8726     --
8727     WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
8728        p_entity_type => 'DELIVERY',
8729        p_entity_ids   => l_del_tab,
8730        x_return_status => l_return_status);
8731     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8732        raise mark_reprice_error;
8733     END IF;
8734    END IF;
8735 
8736 
8737 --
8738 IF l_debug_on THEN
8739     WSH_DEBUG_SV.pop(l_module_name);
8740 END IF;
8741 --
8742   exception
8743   WHEN mark_reprice_error THEN
8744     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8745     fnd_message.SET_name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
8746     wsh_util_core.add_message(x_return_status,l_module_name);
8747 
8748 --
8749 IF l_debug_on THEN
8750     WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
8751     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
8752 END IF;
8753 --
8754         WHEN delivery_id_locked THEN
8755           x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8756     fnd_message.SET_name('WSH', 'WSH_NO_LOCK');
8757     wsh_util_core.add_message(x_return_status,l_module_name);
8758           --
8759           IF l_debug_on THEN
8760             WSH_DEBUG_SV.logmsg(l_module_name,'Delivery Id Locked exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
8761               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION : DELIVERY_ID_LOCKED');
8762           END IF;
8763           --
8764           return;
8765 
8766 --
8767 IF l_debug_on THEN
8768     WSH_DEBUG_SV.logmsg(l_module_name,'DELIVERY_ID_LOCKED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
8769     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:DELIVERY_ID_LOCKED');
8770 END IF;
8771 --
8772   WHEN others THEN
8773     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8774     wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_MULTIPLE_DETAILS',l_module_name);
8775 
8776 --
8777 IF l_debug_on THEN
8778     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
8779     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
8780 END IF;
8781 --
8782 END Assign_Multiple_Details;
8783 
8784 
8785 
8786 /*************************/
8787 /*   CODE FOR AUTO PACKING */
8788 -- This API has been created to be called
8789 -- from Auto Pack Lines
8790 -- Purpose is to split a delivery line as many times
8791 -- as required by just one call , rather than calling
8792 -- Split API multiple times
8793 
8794 --
8795 --Procedure:
8796 --Parameters:    p_from_detail_id
8797 --          p_req_quantity
8798 --          p_new_detail_id
8799 --          x_return_status
8800 --Desription:
8801 --        Splits a delivery detail according the new requested
8802 --        quantity. The newly created the detail has the requested
8803 --        quantity as p_req_quantity and the old detail has the
8804 --
8805 -- fabdi start : PICK CONFIRM
8806 --added a new parameter called p_req_quantity2      requested quantity as requested_quantity - p_requested_quantity
8807 -- fabdi end : PICK CONFIRM
8808 -- HW BUG#:1636578 added a new parameter p_converted_flag
8809 
8810 /*****************************************************
8811   SPLIT_DELIVERY_DETAILS_BULK api
8812 *****************************************************/
8813 PROCEDURE Split_Delivery_Details_Bulk (
8814 p_from_detail_id     IN  NUMBER,
8815 p_req_quantity       IN OUT NOCOPY  NUMBER,
8816 p_unassign_flag     IN  VARCHAR2 ,
8817 p_req_quantity2     IN  NUMBER ,
8818 p_converted_flag     IN VARCHAR2,
8819 p_manual_split   IN VARCHAR2 ,
8820 p_num_of_split        IN NUMBER ,       -- for empty container cases
8821 x_new_detail_id      OUT NOCOPY  NUMBER,
8822 x_dd_id_tab      OUT NOCOPY  WSH_UTIL_CORE.id_tab_type,
8823 x_return_status     OUT NOCOPY  VARCHAR2
8824 )
8825 IS
8826 
8827 l_new_delivery_detail_id number;
8828 -- HW OPMCONV. Removed OPM variables
8829 
8830 -- HW OPMCONV - Removed Format of qty2
8831 l_qty2            NUMBER;
8832 l_split_shipped_qty2      NUMBER(19,9):= NULL;
8833 -- HW BUG#:1636578 variable to calculate new qty2
8834 l_new_req_qty2 NUMBER;
8835 l_original_shipped_qty2    NUMBER(19,9):= NULL;
8836 
8837 
8838 l_new_req_qty   NUMBER;
8839 l_new_pick_qty  NUMBER;
8840 
8841 l_new_pick_qty2 NUMBER;
8842 
8843 l_delivery_id  number;
8844 l_parent_delivery_detail_id number;
8845 assignment number;
8846 l_delivery_assignment_id number;
8847 detail_rowid VARCHAR2(30);
8848 assignment_rowid VARCHAR2(30);
8849 total number;
8850 l_cr_dt_status varchar2(30);
8851 l_cr_assg_status varchar2(30);
8852 l_output_quantity number;
8853 l_return_status   varchar2(1);
8854 l_qty_return_status varchar2(30);
8855 
8856 chk_decimal_qty_failed exception;
8857 quantity_over EXCEPTION;
8858 negative_qty  EXCEPTION;
8859 zero_qty    EXCEPTION;
8860 /*   H integration: Pricing integration csun
8861    mark reprice required flag when split_delivery_details
8862  */
8863 l_entity_ids   WSH_UTIL_CORE.id_tab_type;
8864 reprice_required_err   EXCEPTION;
8865 l_delivery_assignments_info WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_Type;
8866 l_delivery_details_info WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type;
8867 l_split_weight number;
8868 l_split_volume number;
8869 l_split_return_status varchar2(30);
8870 l_shipped_quantity     NUMBER := NULL;
8871 l_old_stage_qty      NUMBER := NULL;
8872 l_ser_qty          NUMBER := NULL;
8873 
8874 
8875 l_dd_id_tab     WSH_UTIL_CORE.id_tab_type;
8876 l_num_of_split   NUMBER;
8877 
8878   old_delivery_detail_rec SplitDetailRecType;
8879 
8880 l_inv_controls_rec   WSH_DELIVERY_DETAILS_INV.inv_control_flag_rec;
8881 
8882 
8883 -- Bug 2637876
8884 l_original_shipped_qty   NUMBER;
8885 l_split_shipped_qty   NUMBER;
8886 l_serial_tab              WSH_DELIVERY_DETAILS_ACTIONS.serial_tab;
8887 i NUMBER;
8888 j NUMBER;
8889 l_serial_orig_rec WSH_DELIVERY_DETAILS_ACTIONS.SplitDetailRecType;
8890 l_new_serial_rec WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type;
8891 l_transaction_id_tab     WSH_UTIL_CORE.id_tab_type;
8892 l_serial_number WSH_DELIVERY_DETAILS.serial_number%TYPE;
8893 TYPE l_sr_no_tab IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
8894 l_serial_number_tab l_sr_no_tab;
8895 l_id1 NUMBER;
8896 l_s1 VARCHAR2(30);
8897 
8898 --
8899 l_debug_on BOOLEAN;
8900 --
8901 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'SPLIT_DELIVERY_DETAILS_BULK';
8902 --
8903 BEGIN
8904   --
8905   --
8906   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
8907   --
8908   IF l_debug_on IS NULL
8909   THEN
8910       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
8911   END IF;
8912   --
8913   IF l_debug_on THEN
8914       WSH_DEBUG_SV.push(l_module_name);
8915       --
8916       WSH_DEBUG_SV.log(l_module_name,'P_FROM_DETAIL_ID',P_FROM_DETAIL_ID);
8917       WSH_DEBUG_SV.log(l_module_name,'P_REQ_QUANTITY',P_REQ_QUANTITY);
8918       WSH_DEBUG_SV.log(l_module_name,'P_UNASSIGN_FLAG',P_UNASSIGN_FLAG);
8919       WSH_DEBUG_SV.log(l_module_name,'P_REQ_QUANTITY2',P_REQ_QUANTITY2);
8920       WSH_DEBUG_SV.log(l_module_name,'P_CONVERTED_FLAG',P_CONVERTED_FLAG);
8921       WSH_DEBUG_SV.log(l_module_name,'P_MANUAL_SPLIT',P_MANUAL_SPLIT);
8922   END IF;
8923   --
8924   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8925 
8926   OPEN c_split_detail_info(p_from_detail_id);
8927   FETCH c_split_detail_info into old_delivery_detail_rec;
8928   CLOSE c_split_detail_info;
8929 
8930     IF l_debug_on THEN
8931        WSH_DEBUG_SV.log(l_module_name,'delivery_detail_id',
8932                                old_delivery_detail_rec.delivery_detail_id);
8933        WSH_DEBUG_SV.log(l_module_name,'picked_quantity',
8934                                old_delivery_detail_rec.picked_quantity);
8935        WSH_DEBUG_SV.log(l_module_name,'organization_id',
8936                                old_delivery_detail_rec.organization_id);
8937        WSH_DEBUG_SV.log(l_module_name,'inventory_item_id',
8938                                old_delivery_detail_rec.inventory_item_id);
8939        WSH_DEBUG_SV.log(l_module_name,'requested_quantity_uom',
8940                                old_delivery_detail_rec.requested_quantity_uom);
8941     END IF;
8942 
8943   -- Bug 2419301 : Set oe_interfaced_flag to MISS CHAR so that create_new_detail_from_old API
8944   --               determines the value of oe_interfaced_flag for newly created dd
8945   old_delivery_detail_rec.oe_interfaced_flag:= NULL;
8946 
8947 
8948   -- Bug 1289812
8949   -- check if this split is valid operation
8950   IF (p_req_quantity >= NVL(old_delivery_detail_rec.picked_quantity,
8951                   old_delivery_detail_rec.requested_quantity)) THEN
8952   RAISE quantity_over;
8953   END IF;
8954   -- Bug 1299636
8955   -- check if this quantity to split is positive
8956   IF (p_req_quantity = 0) THEN
8957   RAISE zero_qty;
8958   ELSIF (p_req_quantity < 0) THEN
8959   RAISE negative_qty;
8960   END IF;
8961   l_qty2 := p_req_quantity2 ;
8962 
8963   /* need to validate the quantity passed meets the decimal quantity
8964    standard */
8965 
8966   --Check if org is a process one or not for the current record
8967   --
8968 -- HW OPMCONV - Removed checking for process org
8969 
8970          --  Patch J:  Catch Weights
8971          --  Need to split the secondary quantity in proportion to the primary quantity.
8972          --  Catch weight support currently only for non-opm lines.
8973 
8974          IF old_delivery_detail_rec.picked_quantity2 IS NOT NULL and p_req_quantity2 IS NULL
8975             and (NVL(old_delivery_detail_rec.picked_quantity,0) <> 0) THEN
8976 
8977             l_qty2 :=  old_delivery_detail_rec.picked_quantity2 * (p_req_quantity/old_delivery_detail_rec.picked_quantity);
8978             l_qty2 :=  round(l_qty2, 5);
8979 
8980          ELSE
8981 
8982             l_qty2 := p_req_quantity2 ;
8983 
8984          END IF;
8985 
8986 
8987    --
8988    IF l_debug_on THEN
8989        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
8990    END IF;
8991    --
8992    WSH_DETAILS_VALIDATIONS.check_decimal_quantity(
8993         p_item_id    => old_delivery_detail_rec.inventory_item_id,
8994         p_organization_id => old_delivery_detail_rec.organization_id,
8995         p_input_quantity  => p_req_quantity,
8996         p_uom_code    => old_delivery_detail_rec.requested_quantity_UOM,
8997         x_output_quantity => l_output_quantity,
8998         x_return_status   => l_qty_return_status);
8999 
9000    IF (l_qty_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
9001     RAISE chk_decimal_qty_failed;
9002    END IF;
9003    IF (l_output_quantity IS not NULL) THEN
9004      p_req_quantity := l_output_quantity;
9005    END IF;
9006 
9007   --
9008   IF l_debug_on THEN
9009       WSH_DEBUG_SV.logmsg(l_module_name, 'BEFORE CALLING SPLIT_DETAIL_INT_BULK AND P_REQ_QUANTITY IS '||P_REQ_QUANTITY  );
9010       WSH_DEBUG_SV.logmsg(l_module_name, 'BEFORE CALLING SPLIT_DETAIL_INT_BULK AND P_QUANTITY_TO_SPLIT2 IS '||L_QTY2  );
9011   END IF;
9012   --
9013 
9014 
9015 
9016 -- HW 2735317. Need to branch
9017 -- HW OPMCONV - Removed branching
9018 
9019 -- Fix for Bug 2637876 begins here
9020 -- to split serial numbers while auto packing
9021 
9022 -- Delete the PL SQL tables
9023   l_serial_tab.delete;
9024   l_dd_id_tab.delete;
9025   l_transaction_id_tab.delete;
9026   l_serial_number_tab.delete;
9027 
9028 -- Only for cases where transaction temp id is not null
9029   IF old_delivery_detail_rec.transaction_temp_id IS NOT NULL THEN
9030 
9031     l_serial_orig_rec := old_delivery_detail_rec; -- use old record
9032     l_original_shipped_qty := old_delivery_detail_rec.shipped_quantity;
9033     l_split_shipped_qty := p_req_quantity;
9034 
9035     j := 0;
9036 
9037     FOR i IN 1..p_num_of_split
9038     LOOP
9039 -- recalculate the shipped quantity
9040     l_original_shipped_qty := l_original_shipped_qty - l_split_shipped_qty;
9041     Split_Serial_Numbers_INT(x_old_detail_rec  => l_serial_orig_rec,
9042        x_new_delivery_detail_rec => l_new_serial_rec,
9043        p_old_shipped_quantity=> l_original_shipped_qty,
9044        p_new_shipped_quantity=> l_split_shipped_qty,
9045        x_return_status  => l_split_return_status);
9046 
9047     j := j + 1;
9048 
9049     l_transaction_id_tab(j) := l_new_serial_rec.transaction_temp_id;
9050     l_serial_number_tab(j) := l_new_serial_rec.serial_number;
9051 
9052     l_serial_tab(j).transaction_temp_id := l_new_serial_rec.transaction_temp_id;
9053     l_serial_tab(j).serial_number := l_new_serial_rec.serial_number;
9054     l_serial_tab(j).to_serial_number := l_new_serial_rec.to_serial_number;
9055 
9056     END LOOP;
9057 
9058     old_delivery_detail_rec.serial_number := l_serial_orig_rec.serial_number;
9059     old_delivery_detail_rec.transaction_temp_id := l_serial_orig_rec.transaction_temp_id;
9060 
9061     IF l_debug_on THEN
9062       WSH_DEBUG_SV.log(l_module_name,'Old DD id',old_delivery_detail_rec.delivery_detail_id);
9063       WSH_DEBUG_SV.log(l_module_name,'Old serial Number',old_delivery_detail_rec.serial_number);
9064       WSH_DEBUG_SV.log(l_module_name,'Old Temp id',old_delivery_detail_rec.transaction_temp_id);
9065       WSH_DEBUG_SV.log(l_module_name,'l_transaction_id_tab.COUNT',l_transaction_id_tab.count);
9066       WSH_DEBUG_SV.log(l_module_name,'l_serial_number_tab.COUNT',l_serial_number_tab.count);
9067       WSH_DEBUG_SV.log(l_module_name,'l_serial_tab.COUNT',l_serial_tab.count);
9068     END IF;
9069 
9070   END IF;
9071 
9072 -- HW OPMCONV. Removed parameter  l_process_flag
9073   Split_Detail_INT_Bulk(
9074        p_old_delivery_detail_rec => old_delivery_detail_rec,
9075        p_quantity_to_split     => p_req_quantity,
9076        p_quantity_to_split2   => l_qty2,
9077        p_unassign_flag       => p_unassign_flag,
9078        p_converted_flag     => p_converted_flag,
9079        p_manual_split     => p_manual_split,
9080        p_num_of_split               => p_num_of_split,
9081        x_split_detail_id     => x_new_detail_id,
9082        x_return_status       => x_return_status,
9083        x_dd_id_tab       => l_dd_id_tab
9084                   );
9085 
9086  -- Message will be set in split_detail_int_bulk
9087    IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
9088                           WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
9089                          ) THEN
9090      return;
9091    END IF;
9092 
9093    x_dd_id_tab := l_dd_id_tab;
9094 
9095 -- HW 2735317. Need to branch
9096 -- HW OPMCONV - Removed branching
9097   IF (old_delivery_detail_rec.transaction_temp_id IS NOT NULL
9098       OR old_delivery_detail_rec.serial_number IS NOT NULL) THEN
9099 
9100     -- Bug 4455732 : Combining transaction_temp_id and serial_number update into single cursor
9101     -- since single quantity detail can have transaction_temp_id also.
9102     FORALL i IN 1..l_dd_id_tab.count
9103     UPDATE wsh_delivery_details
9104        SET serial_number = decode(l_serial_number_tab(i),FND_API.G_MISS_CHAR,NULL,
9105                                    NULL,serial_number,l_serial_number_tab(i)) ,
9106            transaction_temp_id = decode(l_transaction_id_tab(i),FND_API.G_MISS_NUM,NULL,
9107                                          NULL,transaction_temp_id,l_transaction_id_tab(i))
9108      WHERE delivery_detail_id = l_dd_id_tab(i);
9109 
9110   END IF;  -- end of transaction temp id is not null
9111 
9112 
9113   /*  H integration: Pricing integration csun
9114     mark repirce required flag when split delivery details
9115    */
9116    l_entity_ids(1) := old_delivery_detail_rec.delivery_detail_id;
9117    --
9118    IF l_debug_on THEN
9119        WSH_DEBUG_SV.log(l_module_name,'entity id 1-',l_entity_ids(1));
9120        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
9121    END IF;
9122    --
9123    WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
9124        p_entity_type => 'DELIVERY_DETAIL',
9125        p_entity_ids   => l_entity_ids,
9126        x_return_status  => l_return_status);
9127    IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
9128                           WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
9129                          ) THEN
9130       raise reprice_required_err;
9131    END IF;
9132 
9133 --
9134 IF l_debug_on THEN
9135     WSH_DEBUG_SV.pop(l_module_name);
9136 END IF;
9137 --
9138   EXCEPTION
9139   WHEN chk_decimal_qty_failed THEN
9140     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9141     fnd_message.set_name('WSH', 'WSH_DET_DECIMAL_QTY_NOT_VALID');
9142     wsh_util_core.add_message(x_return_status,l_module_name);
9143     --
9144     IF l_debug_on THEN
9145         WSH_DEBUG_SV.logmsg(l_module_name,'CHK_DECIMAL_QTY_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
9146         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CHK_DECIMAL_QTY_FAILED');
9147     END IF;
9148     --
9149   WHEN quantity_over THEN
9150     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9151     fnd_message.set_name('WSH', 'WSH_DET_SPLIT_EXCEED');
9152     wsh_util_core.add_message(x_return_status,l_module_name);
9153     --
9154     IF l_debug_on THEN
9155         WSH_DEBUG_SV.logmsg(l_module_name,'QUANTITY_OVER exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
9156         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:QUANTITY_OVER');
9157     END IF;
9158     --
9159   WHEN zero_qty THEN
9160     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9161     fnd_message.set_name('WSH', 'WSH_NO_ZERO_NUM');
9162     wsh_util_core.add_message(x_return_status,l_module_name);
9163     --
9164     IF l_debug_on THEN
9165         WSH_DEBUG_SV.logmsg(l_module_name,'ZERO_QTY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
9166         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:ZERO_QTY');
9167     END IF;
9168     --
9169   WHEN negative_qty THEN
9170     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9171     fnd_message.set_name('WSH', 'WSH_NO_NEG_NUM');
9172     wsh_util_core.add_message(x_return_status,l_module_name);
9173     --
9174     IF l_debug_on THEN
9175         WSH_DEBUG_SV.logmsg(l_module_name,'NEGATIVE_QTY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
9176         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:NEGATIVE_QTY');
9177     END IF;
9178     --
9179   WHEN reprice_required_err THEN
9180     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9181     fnd_message.set_name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
9182     wsh_util_core.add_message(x_return_status,l_module_name);
9183     --
9184     IF l_debug_on THEN
9185         WSH_DEBUG_SV.logmsg(l_module_name,'REPRICE_REQUIRED_ERR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
9186         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:REPRICE_REQUIRED_ERR');
9187     END IF;
9188     --
9189   WHEN others THEN
9190     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9191     wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS_BULK',l_module_name);
9192     --
9193     IF l_debug_on THEN
9194         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
9195         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
9196     END IF;
9197     --
9198 END SPLIT_DELIVERY_DETAILS_BULK;
9199 
9200 /*****************************************************************
9201   Description :-
9202 
9203   Currently being used values of p_manual_split are
9204 
9205 NULL - default, normal mode of splitting backordered quantity
9206      then shipped quantity
9207 Y - split staged quantity
9208 C - split shipped quantity then backordered quantity (from packing code)
9209 B - called from update_inventory_info for OPM's use
9210 M - called from update_inventory_info for OPM's use
9211 S - called from update_inventory_info for OPM's use
9212 U - called from update_inventory_info for OPM's use
9213 
9214 *******************************************************************/
9215 
9216 -- This API is called from split_delivery_details_bulk with
9217 -- new parameters and functionality of Bulk creation of records
9218 
9219 /*****************************************************
9220 -----   SPLIT_DETAIL_INT_BULK api
9221 *****************************************************/
9222 -- HW OPMCONV - Removed parameter p_process_flag
9223 PROCEDURE Split_Detail_INT_bulk(
9224    p_old_delivery_detail_rec    IN  SplitDetailRecType,
9225    p_new_source_line_id  IN  NUMBER,
9226    p_quantity_to_split   IN  NUMBER,
9227    p_quantity_to_split2  IN  NUMBER  ,
9228    p_unassign_flag     IN  VARCHAR2 ,
9229    p_converted_flag   IN  VARCHAR2 ,
9230    p_manual_split   IN  VARCHAR2 ,
9231    p_split_sn     IN  VARCHAR2 ,
9232    p_num_of_split        IN NUMBER,        -- for empty container cases
9233    x_split_detail_id   OUT NOCOPY  NUMBER,
9234    x_return_status     OUT NOCOPY  VARCHAR2,
9235    x_dd_id_tab      OUT NOCOPY  WSH_UTIL_CORE.id_tab_type
9236   ) IS
9237 
9238 l_new_delivery_detail_id number;
9239 
9240 --HW OPMCONV - Removed OPM variables
9241 
9242 -- HW OPMCONV. Removed format of 19,9
9243 l_qty2            NUMBER;
9244 -- HW OPMCONV. Removed format of 19,9
9245 l_split_shipped_qty2      NUMBER := NULL;
9246 -- HW BUG#:1636578 variable to calculate new qty2
9247 l_new_req_qty2 NUMBER;
9248 -- HW OPMCONV. Removed format of 19,9
9249 l_original_shipped_qty2    NUMBER := NULL;
9250 
9251 l_new_req_qty   NUMBER;
9252 l_new_pick_qty  NUMBER;
9253 -- HW OPMCONV. No need for this variable anymore
9254 --l_new_pick_qty2 NUMBER;
9255 
9256 l_delivery_id  number;
9257 l_parent_delivery_detail_id number;
9258 assignment number;
9259 l_delivery_assignment_id number;
9260 assignment_rowid VARCHAR2(30);
9261 total number;
9262 l_cr_dt_status varchar2(30);
9263 l_cr_assg_status varchar2(30);
9264 l_output_quantity number;
9265 l_qty_return_status varchar2(30);
9266 new_det_wt_vol_failed exception;
9267 old_det_wt_vol_failed exception;
9268 l_delivery_assignments_info WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_Type;
9269 l_delivery_details_info WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type;
9270 l_split_weight number;
9271 l_split_volume number;
9272 l_split_return_status varchar2(30);
9273 l_shipped_quantity     NUMBER := NULL;
9274 l_old_stage_qty      NUMBER := NULL;
9275 l_ser_qty          NUMBER := NULL;
9276 
9277 l_original_shipped_qty   NUMBER := NULL;
9278 l_original_cc_qty     NUMBER := NULL;
9279 l_split_shipped_qty  NUMBER := NULL;
9280 l_split_cc_qty      NUMBER := NULL;
9281 -- HW OPMCONV. Removed format of 19,9
9282 l_split_cc_qty2    NUMBER := NULL;
9283 -- HW OPMCONV. Removed format of 19,9
9284 l_original_cc_qty2     NUMBER := NULL;
9285 l_return_status     VARCHAR2(30);
9286 -- HW OPMCONV - Removed OPM excpetion
9287 
9288 -- J: W/V Changes
9289 l_total_gross_wt NUMBER;
9290 l_total_net_wt   NUMBER;
9291 l_total_vol      NUMBER;
9292 l_org_wv_qty     NUMBER;
9293 l_new_wv_qty     NUMBER;
9294 l_final_req_qty  NUMBER; --bug# 6689448 (replenishment project)
9295 
9296 l_inv_controls_rec   WSH_DELIVERY_DETAILS_INV.inv_control_flag_rec;
9297 
9298 
9299 WSH_SN_SPLIT_ERR        EXCEPTION;
9300 WSH_NO_DATA_FOUND                               EXCEPTION;
9301 
9302 l_num_of_split        NUMBER; -- added for BULK Auto packing
9303 l_dd_id_tab           WSH_UTIL_CORE.id_tab_type;
9304 l_da_id_tab           WSH_UTIL_CORE.id_tab_type;
9305 
9306 l_updated_delivery_detail_rec          SplitDetailRecType;
9307 
9308 l_req_qty_update_index    NUMBER;
9309 -- HW Added qty2
9310 l_req_qty2_update_index    NUMBER;
9311 
9312 CURSOR c_get_req_pick_qty(p_del_det IN NUMBER) IS
9313 SELECT requested_quantity, picked_quantity,requested_quantity2
9314 FROM wsh_delivery_details
9315 WHERE delivery_detail_id = p_del_det;
9316 
9317 
9318 
9319 -- Bug 2734868
9320 l_requested_quantity WSH_DELIVERY_DETAILS.requested_quantity%TYPE;
9321 -- HW 12345 Added qty2
9322 l_requested_quantity2 WSH_DELIVERY_DETAILS.requested_quantity%TYPE;
9323 l_picked_quantity WSH_DELIVERY_DETAILS.picked_quantity%TYPE;
9324 wsh_split_error EXCEPTION;
9325 
9326 l_detail_tab    WSH_UTIL_CORE.id_tab_type; -- DBI Project
9327 l_dbi_rs        VARCHAR2(1); -- Return Status from DBI API
9328 
9329 --
9330 l_action VARCHAR2(100) := 'SPLIT-LINE';
9331 --
9332 l_debug_on BOOLEAN;
9333 --
9334 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'SPLIT_DETAIL_INT_BULK';
9335 --
9336 BEGIN
9337   --
9338   --
9339   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
9340   --
9341   IF l_debug_on IS NULL
9342   THEN
9343       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
9344   END IF;
9345   --
9346   IF l_debug_on THEN
9347       WSH_DEBUG_SV.push(l_module_name);
9348       --
9349       WSH_DEBUG_SV.log(l_module_name,'P_NEW_SOURCE_LINE_ID',P_NEW_SOURCE_LINE_ID);
9350       WSH_DEBUG_SV.log(l_module_name,'P_QUANTITY_TO_SPLIT',P_QUANTITY_TO_SPLIT);
9351       WSH_DEBUG_SV.log(l_module_name,'P_QUANTITY_TO_SPLIT2',P_QUANTITY_TO_SPLIT2);
9352       WSH_DEBUG_SV.log(l_module_name,'P_UNASSIGN_FLAG',P_UNASSIGN_FLAG);
9353       WSH_DEBUG_SV.log(l_module_name,'P_CONVERTED_FLAG',P_CONVERTED_FLAG);
9354       WSH_DEBUG_SV.log(l_module_name,'P_MANUAL_SPLIT',P_MANUAL_SPLIT);
9355       WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_SN',P_SPLIT_SN);
9356       WSH_DEBUG_SV.log(l_module_name,'old shipped_quantity',
9357                                     p_old_delivery_detail_rec.shipped_quantity);
9358       WSH_DEBUG_SV.log(l_module_name,'old cycle_count_quantity',
9359                                 p_old_delivery_detail_rec.cycle_count_quantity);
9360       WSH_DEBUG_SV.log(l_module_name,'old cycle_count_quantity2',
9361                                p_old_delivery_detail_rec.cycle_count_quantity2);
9362       WSH_DEBUG_SV.log(l_module_name,'old shipped_quantity2',
9363                                p_old_delivery_detail_rec.shipped_quantity2);
9364       WSH_DEBUG_SV.log(l_module_name,'old picked_quantity',
9365                                p_old_delivery_detail_rec.picked_quantity);
9366       WSH_DEBUG_SV.log(l_module_name,'old net_weight',
9367                                p_old_delivery_detail_rec.net_weight);
9368       WSH_DEBUG_SV.log(l_module_name,'old requested_quantity',
9369                                p_old_delivery_detail_rec.requested_quantity);
9370       WSH_DEBUG_SV.log(l_module_name,'old inventory_item_id',
9371                                p_old_delivery_detail_rec.inventory_item_id);
9372       WSH_DEBUG_SV.log(l_module_name,'old volume',
9373                                p_old_delivery_detail_rec.volume);
9374       WSH_DEBUG_SV.log(l_module_name,'old weight_uom_code',
9375                                p_old_delivery_detail_rec.weight_uom_code);
9376       WSH_DEBUG_SV.log(l_module_name,'old volume_uom_code',
9377                                p_old_delivery_detail_rec.volume_uom_code);
9378       WSH_DEBUG_SV.log(l_module_name,'old delivery_detail_id',
9379                                p_old_delivery_detail_rec.delivery_detail_id);
9380       WSH_DEBUG_SV.log(l_module_name,'old container_flag',
9381                                p_old_delivery_detail_rec.container_flag);
9382   END IF;
9383   --
9384   SAVEPOINT split_savepoint;
9385   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
9386 
9387   /* need to validate the quantity passed meets the decimal quantity
9388      standard */
9389 
9390 
9391 -- HW OPMCONV - Removed branching
9392 
9393   l_qty2 := p_quantity_to_split2;
9394 
9395     -- For bug 1307771. If shipped quantity is NULL.  Then leave the new
9396     -- shipped quantity to be NULL
9397   IF (p_old_delivery_detail_rec.shipped_quantity IS NULL AND p_old_delivery_detail_rec.cycle_count_quantity IS NULL) THEN
9398   l_split_shipped_qty := NULL;
9399   l_split_cc_qty := NULL;
9400   l_split_shipped_qty2 :=NULL;
9401   l_split_cc_qty2 := NULL;
9402      IF l_debug_on THEN
9403  	WSH_DEBUG_SV.log(l_module_name,' p_old_delivery_detail_rec.shipped_quantity ',p_old_delivery_detail_rec.shipped_quantity);
9404  	WSH_DEBUG_SV.log(l_module_name,' p_old_delivery_detail_rec.cycle_count_quantity ',p_old_delivery_detail_rec.cycle_count_quantity );
9405      END IF;
9406 
9407   ELSIF (p_manual_split = 'C') THEN
9408 
9409     l_split_shipped_qty := LEAST(p_old_delivery_detail_rec.shipped_quantity,
9410                    p_quantity_to_split);
9411   l_split_shipped_qty2 := LEAST(p_old_delivery_detail_rec.shipped_quantity2,
9412                   p_quantity_to_split2);
9413     l_split_cc_qty := LEAST(p_old_delivery_detail_rec.cycle_count_quantity,
9414                 (p_quantity_to_split - nvl(l_split_shipped_qty,0)));
9415   l_split_cc_qty2 := LEAST(p_old_delivery_detail_rec.cycle_count_quantity2,
9416                (p_quantity_to_split2 - NVL(l_split_shipped_qty2,0)));
9417 
9418   l_original_shipped_qty := p_old_delivery_detail_rec.shipped_quantity     -
9419  l_split_shipped_qty;
9420   l_original_cc_qty   := p_old_delivery_detail_rec.cycle_count_quantity   -
9421  l_split_cc_qty;
9422   l_original_shipped_qty2 := p_old_delivery_detail_rec.shipped_quantity2   -
9423  l_split_shipped_qty2;
9424   l_original_cc_qty2    := p_old_delivery_detail_rec.cycle_count_quantity2 -
9425  l_split_cc_qty2;
9426 
9427  ELSIF (p_manual_split = 'Y') THEN
9428 
9429   /* bug 1983460
9430   if the call is from ship confirm to split only the stage quantity
9431    the split delivery detail has null shipped and cc quantities.
9432   */
9433 
9434     l_split_shipped_qty := NULL;
9435     l_split_cc_qty := NULL;
9436       l_split_shipped_qty2 :=NULL;
9437       l_split_cc_qty2 := NULL;
9438 
9439   /* bug 1983460
9440   since the split shipped and split cc quantities are null, we should
9441   leave the original shipped and original cc quantities as they are.
9442   */
9443 
9444   l_original_shipped_qty := p_old_delivery_detail_rec.shipped_quantity;
9445   l_original_cc_qty   := p_old_delivery_detail_rec.cycle_count_quantity;
9446   l_original_shipped_qty2 := p_old_delivery_detail_rec.shipped_quantity2;
9447 
9448   l_original_cc_qty2    := p_old_delivery_detail_rec.cycle_count_quantity2;
9449 
9450 
9451   ELSE
9452   -- use cc qty to split p_quantity_to_split before we use shipped qty to complete the quantity split
9453   --  (This takes care of splitting lines to backorder/cycle-count, for example.)
9454   -- assumption: the quantities' relationships are valid
9455 
9456   l_split_cc_qty  := LEAST(p_old_delivery_detail_rec.cycle_count_quantity,   p_quantity_to_split);
9457   l_split_cc_qty2 := LEAST(p_old_delivery_detail_rec.cycle_count_quantity2,  p_quantity_to_split2);
9458 
9459   -- fail-safe: NVL to ensure that shipped qtys can still be split even if cc qtys are NULL
9460   l_split_shipped_qty  := LEAST(p_old_delivery_detail_rec.shipped_quantity,  (p_quantity_to_split  - NVL(l_split_cc_qty,0)));
9461   l_split_shipped_qty2 := LEAST(p_old_delivery_detail_rec.shipped_quantity2, (p_quantity_to_split2 - NVL(l_split_cc_qty2,0)));
9462 
9463   -- update original line's quantities accordingly
9464   l_original_shipped_qty := p_old_delivery_detail_rec.shipped_quantity     - l_split_shipped_qty;
9465   l_original_cc_qty   := p_old_delivery_detail_rec.cycle_count_quantity   - l_split_cc_qty;
9466 
9467   l_original_shipped_qty2 := p_old_delivery_detail_rec.shipped_quantity2   - l_split_shipped_qty2;
9468   l_original_cc_qty2    := p_old_delivery_detail_rec.cycle_count_quantity2 - l_split_cc_qty2;
9469   END IF;
9470   IF l_debug_on THEN
9471     WSH_DEBUG_SV.log(l_module_name,' l_split_cc_qty ',l_split_cc_qty);
9472     WSH_DEBUG_SV.log(l_module_name,' l_split_cc_qty2 ',l_split_cc_qty2 );
9473   END IF;
9474 
9475   --
9476   /*
9477   IF l_debug_on THEN
9478       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.INITIALIZE_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
9479   END IF;
9480   --
9481   WSH_DELIVERY_DETAILS_PKG.initialize_detail(
9482               p_delivery_detail_rec  =>  l_delivery_details_info);
9483   END IF;
9484   */
9485   IF p_old_delivery_detail_rec.picked_quantity IS NULL THEN
9486   l_delivery_details_info.requested_quantity := p_quantity_to_split;
9487   ELSE
9488   l_delivery_details_info.requested_quantity := LEAST(p_old_delivery_detail_rec.requested_quantity, p_quantity_to_split);
9489   l_delivery_details_info.picked_quantity := p_quantity_to_split;
9490 -- HW OPM for OM changes
9491 -- HW OPMCONV. No need to use   l_new_pick_qty2
9492 --l_delivery_details_info.picked_quantity2  := nvl(nvl(l_qty2,l_new_pick_qty2),FND_API.G_MISS_NUM);
9493 l_delivery_details_info.picked_quantity2  := nvl(l_qty2,FND_API.G_MISS_NUM);
9494 
9495   END IF;
9496 
9497   IF l_debug_on THEN
9498     WSH_DEBUG_SV.log(l_module_name, ' l_delivery_details_info.requested_quantity2',l_delivery_details_info.requested_quantity2);
9499   END IF;
9500 
9501   --Bug 7291415. 0 to be considered as valid value. Following IF condition modified.
9502    --IF ( NVL(l_qty2, 0) = 0  OR l_qty2 < 0 ) THEN
9503   IF ( NVL(l_qty2, -999) = -999  OR l_qty2 < 0 ) THEN
9504 
9505   l_delivery_details_info.requested_quantity2 := FND_API.G_MISS_NUM;
9506   ELSE
9507   l_delivery_details_info.requested_quantity2 := l_qty2;
9508   END IF;
9509 
9510 -- Bug 2181132 in Bulk API
9511 -- pass the value which is input
9512    l_delivery_details_info.source_line_set_id :=
9513           p_old_delivery_detail_rec.source_line_set_id;
9514 
9515   IF p_new_source_line_id IS NOT NULL THEN
9516   l_delivery_details_info.source_line_id := p_new_source_line_id;
9517   END IF;
9518 
9519 
9520   -- J: W/V Changes
9521   IF p_old_delivery_detail_rec.wv_frozen_flag = 'Y' THEN
9522     l_org_wv_qty := NVL(NVL(p_old_delivery_detail_rec.shipped_quantity,p_old_delivery_detail_rec.picked_quantity), p_old_delivery_detail_rec.requested_quantity);
9523 
9524     IF (p_manual_split = 'Y') THEN
9525       -- p_manual_split is 'Y' only when splitting for staged delivery details during ship confirm
9526       -- Staged delivery details W/V should always be reset back to original W/V
9527       l_new_wv_qty := 0;
9528     ELSE
9529       SELECT NVL(decode(l_split_shipped_qty,FND_API.G_MISS_NUM,null,l_split_shipped_qty),
9530                         NVL(decode(l_delivery_details_info.picked_quantity,FND_API.G_MISS_NUM,null,l_delivery_details_info.picked_quantity),
9531                             decode(l_delivery_details_info.requested_quantity,FND_API.G_MISS_NUM,null,l_delivery_details_info.requested_quantity)))
9532       INTO   l_new_wv_qty
9533       FROM   dual;
9534     END IF;
9535 
9536     IF l_org_wv_qty <> 0 THEN
9537       l_delivery_details_info.gross_weight :=  round( (l_new_wv_qty/l_org_wv_qty) * p_old_delivery_detail_rec.gross_weight ,5);
9538       l_delivery_details_info.net_weight   :=  round( (l_new_wv_qty/l_org_wv_qty) * p_old_delivery_detail_rec.net_weight ,5);
9539       l_delivery_details_info.volume       :=  round( (l_new_wv_qty/l_org_wv_qty) * p_old_delivery_detail_rec.volume ,5);
9540     ELSE
9541       l_delivery_details_info.gross_weight := 0;
9542       l_delivery_details_info.net_weight   := 0;
9543       l_delivery_details_info.volume       := 0;
9544     END IF;
9545 
9546   END IF;
9547 
9548   IF (l_split_shipped_qty is not null and l_split_shipped_qty = 0) or (p_manual_split = 'Y') THEN
9549     l_delivery_details_info.wv_frozen_flag  := 'N';
9550   ELSE
9551     l_delivery_details_info.wv_frozen_flag  := p_old_delivery_detail_rec.wv_frozen_flag;
9552   END IF;
9553   l_delivery_details_info.weight_uom_code := p_old_delivery_detail_rec.weight_uom_code;
9554   l_delivery_details_info.volume_uom_code := p_old_delivery_detail_rec.volume_uom_code;
9555 
9556   l_delivery_details_info.shipped_quantity := nvl(l_split_shipped_qty,FND_API.G_MISS_NUM);
9557   IF l_debug_on THEN
9558      WSH_DEBUG_SV.log(l_module_name,'l_split_shipped_qty2',l_split_shipped_qty2);
9559   END IF;
9560   IF ( NVL(l_split_shipped_qty2, 0) = 0 ) THEN
9561   l_delivery_details_info.shipped_quantity2 := FND_API.G_MISS_NUM;
9562   ELSE
9563   l_delivery_details_info.shipped_quantity2 := l_split_shipped_qty2;
9564   END IF;
9565   IF ( NVL(l_qty2, 0) = 0 OR l_qty2 < 0  ) THEN
9566   l_delivery_details_info.cancelled_quantity2 := FND_API.G_MISS_NUM;
9567   ELSE
9568   -- Bug 2116595
9569   l_delivery_details_info.cancelled_quantity2 := FND_API.G_MISS_NUM;
9570   END IF;
9571 
9572   l_delivery_details_info.cycle_count_quantity := nvl(l_split_cc_qty,FND_API.G_MISS_NUM);
9573 -- HW OPMCONV - No need to branch
9574 --  IF ( p_process_flag = FND_API.G_TRUE ) THEN
9575   l_delivery_details_info.cycle_count_quantity2 := nvl(l_split_cc_qty2,FND_API.G_MISS_NUM);
9576 --  END IF;
9577 
9578   -- Bug 2116595
9579   l_delivery_details_info.cancelled_quantity := FND_API.G_MISS_NUM;
9580   l_delivery_details_info.split_from_detail_id := p_old_delivery_detail_rec.delivery_detail_id;
9581 
9582   l_delivery_details_info.container_flag := p_old_delivery_detail_rec.container_flag;
9583   l_delivery_details_info.master_serial_number := FND_API.G_MISS_CHAR;
9584   l_delivery_details_info.serial_number := FND_API.G_MISS_CHAR;
9585   l_delivery_details_info.to_serial_number := FND_API.G_MISS_CHAR;
9586   l_delivery_details_info.transaction_temp_id := FND_API.G_MISS_NUM;
9587   l_delivery_details_info.last_update_date := SYSDATE;
9588   l_delivery_details_info.last_updated_by :=  FND_GLOBAL.USER_ID;
9589   l_delivery_details_info.last_update_login :=  FND_GLOBAL.LOGIN_ID;
9590   -- Bug 2419301
9591   l_delivery_details_info.oe_interfaced_flag := p_old_delivery_detail_rec.oe_interfaced_flag;
9592   --
9593   IF l_debug_on THEN
9594       WSH_DEBUG_SV.logmsg(l_module_name,  'SPLIT_DETAIL_INT_BULK: OE_INTERFACED_FLAG '||L_DELIVERY_DETAILS_INFO.OE_INTERFACED_FLAG  );
9595   END IF;
9596   --
9597   l_delivery_details_info.consignee_flag := p_old_delivery_detail_rec.consignee_flag; --RTV changes
9598 
9599   l_new_delivery_detail_id := NULL;
9600 
9601 
9602   l_updated_delivery_detail_rec := p_old_delivery_detail_rec;
9603 
9604 -- The Split Serial Number has not been tested
9605 -- this needs to be modified for Bulk split
9606 
9607 -- HW OPMCONV - Remove the whole branch since the code was commented
9608 
9609  l_num_of_split := p_num_of_split;
9610 
9611   --
9612   IF l_debug_on THEN
9613       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.CREATE_DD_FROM_OLD_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
9614   END IF;
9615   --
9616 -- call to new API
9617 -- with a value for p_num_of_rec
9618   WSH_DELIVERY_DETAILS_PKG.create_dd_from_old_bulk(
9619       p_delivery_detail_rec  =>  l_delivery_details_info,
9620             p_delivery_detail_id    =>   p_old_delivery_detail_rec.delivery_detail_id,
9621                   p_num_of_rec            =>     l_num_of_split,
9622       x_dd_id_tab   =>   l_dd_id_tab,
9623       x_return_status         =>   l_cr_dt_status);
9624 
9625  -- Bug 2870267
9626   -- The bulk API above creates delivery details with a requested qty
9627   -- of l_delivery_details_info.requested_quantity for each of the new details created.
9628   -- However if we overpick, the sum of these requested qtys would add up to
9629   -- the picked qty and not the requested qty of the original line.
9630   -- We need to make sure that the sum of the requested quantities add up to the requested quantity
9631   -- of the original line, and that the extra requested quantities that add up to the
9632   -- original picked quantity are zeroed out.
9633 
9634   OPEN c_get_req_pick_qty (p_old_delivery_detail_rec.delivery_detail_id);
9635 
9636   FETCH c_get_req_pick_qty INTO l_requested_quantity, l_picked_quantity,
9637          l_requested_quantity2;
9638 
9639   IF c_get_req_pick_qty%NOTFOUND THEN
9640 
9641     RAISE WSH_NO_DATA_FOUND;
9642 
9643   END IF;
9644 
9645   CLOSE c_get_req_pick_qty;
9646 
9647   --bug# 6689448 (replenishment project) (begin) : call WMS for whenever there is split on replenishment requested
9648   -- delivery detail lines with the new quantity for the old delivery detail line on p_primary_quantity parameter.
9649   -- Inturn WMS creates a new replenishment record for p_split_delivery_detail_id with old delivery detail line old qty - old delivery detail line
9650   --  new quantity (p_primary_quantity).
9651   IF ( p_old_delivery_detail_rec.replenishment_status = 'R' and p_old_delivery_detail_rec.released_status in ('R','B')) THEN
9652   --{
9653       l_final_req_qty := l_requested_quantity;
9654       FOR i IN 1..l_dd_id_tab.count LOOP
9655       --{
9656           l_final_req_qty := l_final_req_qty - l_delivery_details_info.requested_quantity;
9657           IF ((l_final_req_qty = l_requested_quantity) OR (l_final_req_qty < 0)) THEN
9658               EXIT;
9659           END IF;
9660           IF l_debug_on THEN
9661               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WMS_REPLENISHMENT_PUB.UPDATE_DELIVERY_DETAIL' ,WSH_DEBUG_SV.C_PROC_LEVEL);
9662           END IF;
9663           WMS_REPLENISHMENT_PUB.UPDATE_DELIVERY_DETAIL(
9664                p_delivery_detail_id       => p_old_delivery_detail_rec.delivery_detail_id,
9665                p_primary_quantity         => l_final_req_qty,
9666                p_split_delivery_detail_id => l_dd_id_tab(i),
9667                x_return_status            => x_return_status );
9668           IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9669           --{
9670               rollback to split_savepoint;
9671               IF l_debug_on THEN
9672                   WSH_DEBUG_SV.logmsg(l_module_name,  'UNEXPECTED ERROR FROM WMS_REPLENISHMENT_PUB.UPDATE_DELIVERY_DETAIL');
9673                   WSH_DEBUG_SV.pop(l_module_name);
9674               END IF;
9675               RETURN;
9676           --}
9677           END IF;
9678       --}
9679       END LOOP;
9680   --}
9681   END IF;
9682   --bug# 6689448 (replenishment project):end
9683 
9684   IF (l_picked_quantity > l_requested_quantity) AND (l_delivery_details_info.requested_quantity <> 0)  THEN --{
9685 
9686 
9687      -- Calculate the index of the delivery detail from the created table at which the sum of the new
9688      -- requested quantities would equal (or exceed) the requested quantity of the original line.
9689 
9690      l_req_qty_update_index := CEIL(l_requested_quantity/l_delivery_details_info.requested_quantity);
9691 -- HW 12345 Added qty2
9692      IF ( l_delivery_details_info.requested_quantity2 <> 0 ) THEN
9693        l_req_qty2_update_index := CEIL(l_requested_quantity2/l_delivery_details_info.requested_quantity2);
9694      ELSE
9695        l_req_qty2_update_index := NULL;
9696      END IF;
9697 
9698      -- If not a clean split, we need to update the requested quantity of the delivery detail at this
9699      -- index such that the sum of the requested quantities of all the new delivery details before this index
9700      -- plus the requested qty at this index add up to the original requested quantity.
9701 
9702      IF l_req_qty_update_index > (l_requested_quantity/l_delivery_details_info.requested_quantity) THEN
9703 
9704         -- Bug 3178233 - Need to add the IF condition because the update will fail in the following example:
9705         --               requested_quantity = 3, picked_quantity = 4, and split quantity is 2
9706         --               l_req_qty_update_index = CEIL(3/2) = 2
9707         --               Update at l_dd_id_tab(l_req_qty_update_index) = l_dd_id_tab(2) is a non-exist value which will fail.
9708         IF l_req_qty_update_index <= l_dd_id_tab.count THEN
9709 -- 12345 HW added qty2
9710            update wsh_delivery_details
9711            set requested_quantity = l_requested_quantity - ((l_req_qty_update_index - 1) * l_delivery_details_info.requested_quantity),
9712                requested_quantity2 = decode(l_delivery_details_info.requested_quantity2, fnd_api.g_miss_num, NULL, l_requested_quantity2 - ((l_req_qty2_update_index - 1) * l_delivery_details_info.requested_quantity2))
9713            where delivery_detail_id = l_dd_id_tab(l_req_qty_update_index);
9714         END IF;
9715      END IF;
9716 
9717      -- Set the requested quantity to zero in all the newly created lines after the above index.
9718 
9719      FORALL i in (l_req_qty_update_index + 1) .. l_dd_id_tab.count
9720 -- HW added qty2
9721      update wsh_delivery_details
9722      set requested_quantity = 0,
9723          requested_quantity2 = 0
9724      where delivery_detail_id = l_dd_id_tab(i);
9725 
9726     --
9727     -- DBI Project,Above 2 updates for requested quantity need to be tracked for DBI Call
9728     -- These can be combined since both use l_dd_id_tab
9729     -- DBI Project
9730     -- Update of wsh_delivery_details where requested_quantity/released_status
9731     -- are changed, call DBI API after the update.
9732     -- DBI API will check if DBI is installed
9733     IF l_debug_on THEN
9734       WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail Count-',l_dd_id_tab.count);
9735     END IF;
9736     WSH_INTEGRATION.DBI_Update_Detail_Log
9737       (p_delivery_detail_id_tab => l_dd_id_tab,
9738        p_dml_type               => 'UPDATE',
9739        x_return_status          => l_dbi_rs);
9740 
9741     IF l_debug_on THEN
9742       WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
9743     END IF;
9744     -- Only Handle Unexpected error
9745     IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
9746       x_return_status := l_dbi_rs;
9747       rollback to split_savepoint;
9748       --
9749       IF l_debug_on THEN
9750         WSH_DEBUG_SV.pop(l_module_name);
9751       END IF;
9752       --
9753       RETURN;
9754     END IF;
9755     -- End of Code for DBI Project
9756     --
9757 
9758   END IF;  --}
9759 
9760   -- END Bug 2870267
9761 
9762 -- J: W/V Changes
9763   IF p_old_delivery_detail_rec.wv_frozen_flag = 'N' THEN
9764     -- Bug 4416863
9765     -- During Partial Shipping with the remain qty as staged, w/v value should not be
9766     -- deducted again from the original line since during entering shipped_quantity
9767     -- w/v has been calculated for the original line.
9768     IF (p_manual_split = 'Y') THEN
9769       l_total_net_wt   := 0;
9770       l_total_gross_wt := 0;
9771       l_total_vol      := 0;
9772     ELSE
9773     -- end bug 4416863
9774       IF l_debug_on THEN
9775         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DETAIL_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
9776       END IF;
9777 
9778       l_total_net_wt := 0;
9779       l_total_gross_wt := 0;
9780       l_total_vol := 0;
9781       FOR i in 1..l_dd_id_tab.count LOOP
9782 
9783         WSH_WV_UTILS.Detail_Weight_Volume(
9784           p_delivery_detail_id => l_dd_id_tab(i),
9785           p_update_flag        => 'Y',
9786           x_net_weight         => l_split_weight,
9787           x_volume             => l_split_volume,
9788           x_return_status      => l_split_return_status);
9789         IF (l_split_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
9790           RAISE new_det_wt_vol_failed;
9791         END IF;
9792 
9793         l_total_net_wt := l_total_net_wt + l_split_weight;
9794         l_total_vol := l_total_vol + l_split_volume;
9795 
9796       END LOOP;
9797       l_total_gross_wt := l_total_net_wt;
9798     END IF;
9799   ELSE
9800      l_total_net_wt   := p_num_of_split * l_delivery_details_info.net_weight;
9801      l_total_gross_wt := p_num_of_split * l_delivery_details_info.gross_weight;
9802      l_total_vol      := p_num_of_split * l_delivery_details_info.volume;
9803   END IF;
9804 
9805   l_delivery_assignments_info.type := 'S';
9806 
9807   IF (p_unassign_flag = 'N') THEN
9808     l_delivery_assignments_info.delivery_id := p_old_delivery_detail_rec.delivery_id;
9809     l_delivery_assignments_info.parent_delivery_detail_id := p_old_delivery_detail_rec.parent_delivery_detail_id;
9810     IF p_old_delivery_detail_rec.wda_type =  'C' THEN
9811        l_delivery_assignments_info.type := 'O';
9812        l_delivery_assignments_info.parent_delivery_detail_id := NULL;
9813     END IF;
9814   ELSE
9815     l_delivery_assignments_info.delivery_id := NULL;
9816     l_delivery_assignments_info.parent_delivery_detail_id := NULL;
9817   END IF;
9818 
9819   l_delivery_assignments_info.delivery_detail_id := l_new_delivery_detail_id;
9820   --
9821   IF l_debug_on THEN
9822       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.CREATE_DELIV_ASSIGNMENT_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
9823   END IF;
9824   --
9825 
9826   -- this is a bulk call
9827   -- with new parameter of p_num_of_rec
9828   -- and pass l_dd_id_tab which will pass the delivery detail id
9829   wsh_delivery_details_pkg.create_deliv_assignment_bulk(
9830       p_delivery_assignments_info => l_delivery_assignments_info,
9831                         p_num_of_rec => l_num_of_split,
9832                         p_dd_id_tab    => l_dd_id_tab,
9833       x_da_id_tab => l_da_id_tab,
9834       x_return_status => l_cr_assg_status
9835       );
9836 
9837  -- K: MDC: We need to create the consolidation records as well
9838  --         If necessary.
9839  IF (p_unassign_flag = 'N') AND (p_old_delivery_detail_rec.wda_type =  'C') THEN
9840 
9841     l_delivery_assignments_info.type := 'C';
9842     l_delivery_assignments_info.parent_delivery_id := p_old_delivery_detail_rec.parent_delivery_id;
9843     l_delivery_assignments_info.parent_delivery_detail_id := p_old_delivery_detail_rec.parent_delivery_detail_id;
9844 
9845     wsh_delivery_details_pkg.create_deliv_assignment_bulk(
9846                       p_delivery_assignments_info => l_delivery_assignments_info,
9847                       p_num_of_rec                => l_num_of_split,
9848                       p_dd_id_tab                 => l_dd_id_tab,
9849                       x_da_id_tab                 => l_da_id_tab,
9850                       x_return_status             => l_cr_assg_status
9851                    );
9852     IF l_cr_assg_status IN ( WSH_UTIL_CORE.G_RET_STS_ERROR,
9853                           WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
9854                         ) THEN
9855        x_return_status := l_cr_assg_status;
9856        return;
9857     END IF;
9858 
9859 
9860  END IF;
9861 
9862 /*2442099*/
9863   FOR i in 1..l_dd_id_tab.count
9864   LOOP
9865    Log_Exceptions(p_old_delivery_detail_rec.delivery_detail_id,l_dd_id_tab(i),l_delivery_assignments_info.delivery_id,l_action);
9866  END LOOP;
9867 
9868   -- this is FOR RETURN variable
9869   x_dd_id_tab := l_dd_id_tab;
9870 
9871   /* NC - Added the following for OPM  BUG#1675561 */
9872   /* LG BUG#:2005977 */
9873   /* LG new */
9874 
9875   --
9876 -- HW OPMCONV - Removed branching
9877 
9878   /* Bug 2177410, also update net_weight and volume of original delivery detail
9879    because non item does not use WSH_WV_UTILS.Detail_Weight_Volume to
9880    adjust the net_weight and volume  */
9881 
9882   x_split_detail_id := l_new_delivery_detail_id;
9883 
9884 -- update original shipped qty since this was not decremented correctly before.
9885 -- now decrement it with proper split number
9886 
9887 -- Bug 2734868
9888 -- If nvl(picked,requested) quantity is set to zero, error
9889 -- should not be allowed
9890 -- example in case of 12(req) - 12(pic) - 15(ship) when l_num_of_split = 7
9891 
9892   IF (nvl(GREATEST(l_picked_quantity - (l_num_of_split*p_quantity_to_split),0
9893                    ),
9894          GREATEST(l_requested_quantity - (l_num_of_split*l_delivery_details_info.requested_quantity),0
9895                   )
9896          ) <= 0
9897      )THEN
9898     IF l_debug_on THEN
9899       WSH_DEBUG_SV.log(l_module_name, 'CANNOT SPLIT, NEED TO REVISIT THE QUANTITIES');
9900     END IF;
9901 
9902     RAISE wsh_split_error;
9903 
9904   END IF;
9905 
9906 -- End of Bug 2734868
9907 
9908 -- OPM HW Included this fix in 3011758
9909 -- Modified requested_quantity2,picked_quantity2 and shipped_quantity2
9910 -- to be the same as quantity1s
9911 
9912   UPDATE wsh_delivery_details
9913   SET requested_quantity  = GREATEST(requested_quantity - (l_num_of_split*l_delivery_details_info.requested_quantity), 0),
9914     requested_quantity2   = GREATEST(requested_quantity2 -(l_num_of_split*l_qty2), 0),
9915      picked_quantity       = GREATEST(picked_quantity - (l_num_of_split*p_quantity_to_split),0),
9916 -- HW OPMCONV. No need to use l_new_pick_qty2
9917 --  picked_quantity2      = GREATEST(picked_quantity2 - (l_num_of_split* nvl(l_qty2,l_new_pick_qty2)),0),
9918     picked_quantity2      = GREATEST(picked_quantity2 - (l_num_of_split* l_qty2) ,0),
9919     --shipped_quantity    = l_original_shipped_qty - p_quantity_to_split,
9920     shipped_quantity    = l_original_shipped_qty - GREATEST((l_num_of_split -1) * p_quantity_to_split,0),
9921     shipped_quantity2   = l_original_shipped_qty2 - GREATEST((l_num_of_split -1) * nvl(l_qty2,0),0),
9922     --shipped_quantity2   = l_original_shipped_qty2 - ((greatest(l_num_of_split -1),0) * p_quantity_to_split),
9923     cycle_count_quantity  = l_original_cc_qty,
9924     cycle_count_quantity2 = l_original_cc_qty2,
9925     serial_number   = decode(l_updated_delivery_detail_rec.serial_number,FND_API.G_MISS_CHAR,NULL,
9926                                           NULL,serial_number,l_updated_delivery_detail_rec.serial_number),
9927     to_serial_number  = decode(l_updated_delivery_detail_rec.to_serial_number,FND_API.G_MISS_CHAR,NULL,
9928                                           NULL,to_serial_number,l_updated_delivery_detail_rec.to_serial_number),
9929     transaction_temp_id   = decode(l_updated_delivery_detail_rec.transaction_temp_id,FND_API.G_MISS_NUM,NULL,
9930                                           NULL,transaction_temp_id,l_updated_delivery_detail_rec.transaction_temp_id),
9931 -- J: W/V Changes
9932     gross_weight          =  gross_weight - l_total_gross_wt,
9933     net_weight            =  net_weight - l_total_net_wt,
9934     volume                =  volume - l_total_vol,
9935 -- End J: W/V Changes
9936     last_update_date   = SYSDATE,
9937     last_updated_by = FND_GLOBAL.USER_ID,
9938     last_update_login  = FND_GLOBAL.LOGIN_ID
9939   WHERE delivery_detail_id = p_old_delivery_detail_rec.delivery_detail_id;
9940 
9941   /* call the wv util to calculate the wv for the original detail too */
9942   --
9943   IF l_debug_on THEN
9944      WSH_DEBUG_SV.log(l_module_name,'l_delivery_details_info.requested_quantity'
9945                                ,l_delivery_details_info.requested_quantity);
9946      WSH_DEBUG_SV.log(l_module_name,'l_qty2',l_qty2);
9947      WSH_DEBUG_SV.log(l_module_name,'l_original_shipped_qty',
9948                                                       l_original_shipped_qty);
9949      WSH_DEBUG_SV.log(l_module_name,'l_original_cc_qty2',l_original_cc_qty2);
9950      WSH_DEBUG_SV.log(l_module_name,'l_original_cc_qty',l_original_cc_qty);
9951   END IF;
9952   --
9953 
9954   --
9955   -- DBI Project
9956   -- Update of wsh_delivery_details where requested_quantity/released_status
9957   -- are changed, call DBI API after the update.
9958   -- This API will also check for DBI Installed or not
9959   IF l_debug_on THEN
9960     WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail id-',p_old_delivery_detail_rec.delivery_detail_id);
9961   END IF;
9962   l_detail_tab(1) := p_old_delivery_detail_rec.delivery_detail_id;
9963   WSH_INTEGRATION.DBI_Update_Detail_Log
9964     (p_delivery_detail_id_tab => l_detail_tab,
9965      p_dml_type               => 'UPDATE',
9966      x_return_status          => l_dbi_rs);
9967 
9968   IF l_debug_on THEN
9969     WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
9970   END IF;
9971   IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
9972     x_return_status := l_dbi_rs;
9973     -- just pass this return status to caller API
9974     rollback to split_savepoint;
9975     --
9976     IF l_debug_on THEN
9977       WSH_DEBUG_SV.pop(l_module_name);
9978     END IF;
9979     --
9980     RETURN;
9981   END IF;
9982   -- End of Code for DBI Project
9983   --
9984 
9985 
9986   -- J: W/V Changes
9987   -- Decrement the DD W/V from parent if p_unassign_flag is 'Y'
9988   IF (p_unassign_flag = 'Y') THEN
9989     IF l_debug_on THEN
9990         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
9991     END IF;
9992     --
9993     WSH_WV_UTILS.DD_WV_Post_Process(
9994           p_delivery_detail_id => p_old_delivery_detail_rec.delivery_detail_id,
9995           p_diff_gross_wt      => -1 * l_total_gross_wt,
9996           p_diff_net_wt        => -1 * l_total_net_wt,
9997           p_diff_fill_volume   => -1 * l_total_vol,
9998           x_return_status      => l_return_status);
9999 
10000     IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
10001          --
10002          rollback to split_savepoint;
10003          x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10004          WSH_UTIL_CORE.Add_Message(x_return_status);
10005          IF l_debug_on THEN
10006              WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
10007              WSH_DEBUG_SV.pop(l_module_name);
10008          END IF;
10009          return;
10010     END IF;
10011   END IF;
10012 
10013   --
10014   IF l_debug_on THEN
10015     WSH_DEBUG_SV.pop(l_module_name);
10016 
10017   END IF;
10018   --
10019 
10020   EXCEPTION
10021 -- HW OPMCONV. Removed OPM excpetion
10022 
10023   WHEN old_det_wt_vol_failed THEN
10024     rollback to split_savepoint;
10025     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10026     fnd_message.set_name('WSH', 'WSH_DET_WT_VOL_FAILED');
10027     FND_MESSAGE.SET_TOKEN('DETAIL_ID',  p_old_delivery_detail_rec.delivery_detail_id);
10028     wsh_util_core.add_message(x_return_status,l_module_name);
10029     --
10030     IF l_debug_on THEN
10031       WSH_DEBUG_SV.logmsg(l_module_name,'OLD_DET_WT_VOL_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
10032       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OLD_DET_WT_VOL_FAILED');
10033     END IF;
10034     --
10035   WHEN new_det_wt_vol_failed THEN
10036     rollback to split_savepoint;
10037     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10038     fnd_message.set_name('WSH', 'WSH_DET_WT_VOL_FAILED');
10039     FND_MESSAGE.SET_TOKEN('DETAIL_ID',  l_new_DELIVERY_DETAIL_ID);
10040     wsh_util_core.add_message(x_return_status,l_module_name);
10041     --
10042     IF l_debug_on THEN
10043       WSH_DEBUG_SV.logmsg(l_module_name,'NEW_DET_WT_VOL_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
10044       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:NEW_DET_WT_VOL_FAILED');
10045     END IF;
10046     --
10047   WHEN WSH_SPLIT_ERROR THEN
10048     rollback to split_savepoint;
10049     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10050     fnd_message.set_name('WSH', 'WSH_SPLIT_ERROR');
10051     fnd_message.set_token('DETAIL_ID',  p_old_delivery_detail_rec.delivery_detail_id);
10052     wsh_util_core.add_message(x_return_status,l_module_name);
10053     --
10054     IF l_debug_on THEN
10055       WSH_DEBUG_SV.logmsg(l_module_name,'WSH_SPLIT_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
10056       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_SPLIT_ERROR');
10057     END IF;
10058   WHEN WSH_SN_SPLIT_ERR THEN
10059     rollback to split_savepoint;
10060     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10061     fnd_message.set_name('WSH', 'WSH_SN_SPLIT_ERR');
10062     wsh_util_core.add_message(x_return_status,l_module_name);
10063     --
10064     IF l_debug_on THEN
10065       WSH_DEBUG_SV.logmsg(l_module_name,'WSH_SN_SPLIT_ERR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
10066       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_SN_SPLIT_ERR');
10067     END IF;
10068 
10069   WHEN WSH_NO_DATA_FOUND THEN
10070     IF c_get_req_pick_qty%ISOPEN THEN
10071       CLOSE c_get_req_pick_qty;
10072     END IF;
10073     rollback to split_savepoint;
10074     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10075     fnd_message.set_name('WSH', 'WSH_NO_DATA_FOUND');
10076     IF l_debug_on THEN
10077       WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_DATA_FOUND exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
10078       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_DATA_FOUND');
10079     END IF;
10080     --
10081   WHEN others THEN
10082     IF c_get_req_pick_qty%ISOPEN THEN
10083       CLOSE c_get_req_pick_qty;
10084     END IF;
10085     rollback to split_savepoint;
10086     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
10087     wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DETAIL_INT_BULK',l_module_name);
10088     --
10089     IF l_debug_on THEN
10090       WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
10091       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
10092     END IF;
10093     --
10094 END SPLIT_DETAIL_INT_BULK;
10095 
10096 /*************************/
10097 --
10098 --Procedure:
10099 --Parameters:    p_from_detail_id
10100 --          p_req_quantity
10101 --          p_new_detail_id
10102 --          x_return_status
10103 --Desription:
10104 --        Splits a delivery detail according the new requested
10105 --        quantity. The newly created the detail has the requested
10106 --        quantity as p_req_quantity and the old detail has the
10107 --
10108 -- fabdi start : PICK CONFIRM
10109 --added a new parameter called p_req_quantity2      requested quantity as requested_quantity - p_requested_quantity
10110 -- fabdi end : PICK CONFIRM
10111 -- HW BUG#:1636578 added a new parameter p_converted_flag
10112 
10113 /*****************************************************
10114 -----   SPLIT_DELIVERY_DETAILS api
10115 *****************************************************/
10116 PROCEDURE Split_Delivery_Details (
10117 p_from_detail_id     IN  NUMBER,
10118 p_req_quantity       IN OUT NOCOPY  NUMBER,
10119 x_new_detail_id      OUT NOCOPY  NUMBER,
10120 x_return_status     OUT NOCOPY  VARCHAR2,
10121 p_unassign_flag     IN  VARCHAR2 ,
10122 p_req_quantity2     IN  NUMBER ,
10123 p_converted_flag     IN VARCHAR2,
10124 p_manual_split   IN VARCHAR2 )
10125 IS
10126 
10127 l_new_delivery_detail_id number;
10128 
10129 -- HW OPMCONV - Removed OPM variables
10130 
10131 -- HW OPMCONV. Remove format 19,9
10132 -- muom
10133 l_qty             NUMBER;
10134 l_qty2            NUMBER;
10135 l_split_shipped_qty2      NUMBER(19,9):= NULL;
10136 -- HW BUG#:1636578 variable to calculate new qty2
10137 l_new_req_qty2 NUMBER;
10138 l_original_shipped_qty2    NUMBER(19,9):= NULL;
10139 
10140 l_new_req_qty   NUMBER;
10141 l_new_pick_qty  NUMBER;
10142 -- HW OPMCONV. No need to use l_new_pick_qty2
10143 --l_new_pick_qty2 NUMBER;
10144 
10145 -- STOPPED HERE --
10146 
10147 l_delivery_id  number;
10148 l_parent_delivery_detail_id number;
10149 assignment number;
10150 l_delivery_assignment_id number;
10151 detail_rowid VARCHAR2(30);
10152 assignment_rowid VARCHAR2(30);
10153 total number;
10154 l_cr_dt_status varchar2(30);
10155 l_cr_assg_status varchar2(30);
10156 l_output_quantity number;
10157 l_return_status   varchar2(1);
10158 l_qty_return_status varchar2(30);
10159 
10160 chk_decimal_qty_failed exception;
10161 quantity_over EXCEPTION;
10162 negative_qty  EXCEPTION;
10163 zero_qty    EXCEPTION;
10164 fail_create_detail EXCEPTION;
10165 /*   H integration: Pricing integration csun
10166    mark reprice required flag when split_delivery_details
10167  */
10168 l_entity_ids   WSH_UTIL_CORE.id_tab_type;
10169 reprice_required_err   EXCEPTION;
10170 l_delivery_assignments_info WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_Type;
10171 l_delivery_details_info WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type;
10172 l_split_weight number;
10173 l_split_volume number;
10174 l_split_return_status varchar2(30);
10175 l_shipped_quantity     NUMBER := NULL;
10176 l_old_stage_qty      NUMBER := NULL;
10177 l_ser_qty          NUMBER := NULL;
10178 
10179 
10180   old_delivery_detail_rec SplitDetailRecType;
10181 
10182 l_inv_controls_rec   WSH_DELIVERY_DETAILS_INV.inv_control_flag_rec;
10183 -- muom
10184 l_fulfillment_base VARCHAR2(1);
10185 l_dummy            NUMBER;
10186 
10187 
10188 --
10189 l_debug_on BOOLEAN;
10190 --
10191 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'SPLIT_DELIVERY_DETAILS';
10192 --
10193 BEGIN
10194   --
10195   --
10196   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10197   --
10198   IF l_debug_on IS NULL
10199   THEN
10200       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10201   END IF;
10202   --
10203   IF l_debug_on THEN
10204       WSH_DEBUG_SV.push(l_module_name);
10205       --
10206       WSH_DEBUG_SV.log(l_module_name,'P_FROM_DETAIL_ID',P_FROM_DETAIL_ID);
10207       WSH_DEBUG_SV.log(l_module_name,'P_REQ_QUANTITY',P_REQ_QUANTITY);
10208       WSH_DEBUG_SV.log(l_module_name,'P_UNASSIGN_FLAG',P_UNASSIGN_FLAG);
10209       WSH_DEBUG_SV.log(l_module_name,'P_REQ_QUANTITY2',P_REQ_QUANTITY2);
10210       WSH_DEBUG_SV.log(l_module_name,'P_CONVERTED_FLAG',P_CONVERTED_FLAG);
10211       WSH_DEBUG_SV.log(l_module_name,'P_MANUAL_SPLIT',P_MANUAL_SPLIT);
10212   END IF;
10213   --
10214   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10215 
10216   OPEN c_split_detail_info(p_from_detail_id);
10217   FETCH c_split_detail_info into old_delivery_detail_rec;
10218   CLOSE c_split_detail_info;
10219 
10220   -- Bug 2419301 : Set oe_interfaced_flag to MISS CHAR so that create_new_detail_from_old API
10221   --               determines the value of oe_interfaced_flag for newly created dd
10222   old_delivery_detail_rec.oe_interfaced_flag:= NULL;
10223 
10224   -- muom
10225   l_fulfillment_base := WSH_UTIL_CORE.Get_Line_Fulfillment_Base(old_delivery_detail_rec.source_code, old_delivery_detail_rec.source_line_id);
10226 
10227   -- muom
10228   IF l_fulfillment_base = 'P' THEN
10229     -- Bug 1289812
10230     -- check if this split is valid operation
10231     IF (
10232           p_req_quantity >= NVL(old_delivery_detail_rec.picked_quantity,old_delivery_detail_rec.requested_quantity)
10233         AND NVL(old_delivery_detail_rec.line_direction,'O') IN ('O','IO')  -- J-IB-NPARIKH
10234        )
10235        OR
10236        (
10237           p_req_quantity >= NVL(
10238                                   old_delivery_detail_rec.received_quantity,
10239                                   NVL(old_delivery_detail_rec.shipped_quantity,
10240                                   NVL(old_delivery_detail_rec.picked_quantity,
10241                                   old_delivery_detail_rec.requested_quantity))
10242                                )     -- J-IB-NPARIKH
10243         AND NVL(old_delivery_detail_rec.line_direction,'O') NOT IN ('O','IO')   -- J-IB-NPARIKH
10244        )
10245     THEN
10246     RAISE quantity_over;
10247     END IF;
10248     -- Bug 1299636
10249     -- check if this quantity to split is positive
10250     IF (p_req_quantity = 0) THEN
10251     RAISE zero_qty;
10252     ELSIF (p_req_quantity < 0) THEN
10253     RAISE negative_qty;
10254     END IF;
10255   ELSE
10256     IF (
10257           p_req_quantity2 >= NVL(old_delivery_detail_rec.picked_quantity2,old_delivery_detail_rec.requested_quantity2)
10258         AND NVL(old_delivery_detail_rec.line_direction,'O') IN ('O','IO')  -- J-IB-NPARIKH
10259        )
10260        OR
10261        (
10262           p_req_quantity2 >= NVL(
10263                                   old_delivery_detail_rec.received_quantity2,
10264                                   NVL(old_delivery_detail_rec.shipped_quantity2,
10265                                   NVL(old_delivery_detail_rec.picked_quantity2,
10266                                   old_delivery_detail_rec.requested_quantity2))
10267                                )     -- J-IB-NPARIKH
10268         AND NVL(old_delivery_detail_rec.line_direction,'O') NOT IN ('O','IO')   -- J-IB-NPARIKH
10269        )
10270     THEN
10271     RAISE quantity_over;
10272     END IF;
10273     IF (p_req_quantity2 = 0) THEN
10274     RAISE zero_qty;
10275     ELSIF (p_req_quantity2 < 0) THEN
10276     RAISE negative_qty;
10277     END IF;
10278   END IF;
10279 
10280   -- muom
10281   l_qty := p_req_quantity ;
10282   l_qty2 := p_req_quantity2 ;
10283 
10284   -- muom: IN Prior Reservations Case, if the Primary and Secondary are not in standard conversion and if the
10285   -- primary reservation is more the primary requested and secondary reservation is less than the secondary requested
10286   -- then you will get a call to this api when -ve p_req_quantity
10287   IF l_fulfillment_base = 'S' and l_qty <= 0 THEN
10288      l_qty :=
10289        wsh_wv_utils.convert_uom(
10290          from_uom => old_delivery_detail_rec.requested_quantity_uom2,
10291          to_uom   => old_delivery_detail_rec.requested_quantity_uom,
10292          quantity => l_qty2,
10293          item_id  => old_delivery_detail_rec.inventory_item_id,
10294          org_id   => old_delivery_detail_rec.organization_id);
10295      IF l_debug_on THEN
10296        WSH_DEBUG_SV.logmsg(l_module_name,'new l_qty '||l_qty);
10297      END IF;
10298    END IF;
10299 
10300   /* need to validate the quantity passed meets the decimal quantity
10301    standard */
10302 
10303   --  Patch J:  Catch Weights
10304   --  Need to split the secondary quantity in proportion to the primary quantity.
10305   --  Catch weight support currently only for non-opm lines.
10306   -- muom
10307   IF l_fulfillment_base = 'P' THEN
10308 
10309     IF   old_delivery_detail_rec.picked_quantity2 IS NOT NULL and p_req_quantity2 IS NULL
10310        and (NVL(old_delivery_detail_rec.picked_quantity,0) <> 0)
10311        AND NVL(old_delivery_detail_rec.line_direction,'O') in ('O','IO') -- J-IB-NPARIKH
10312     THEN
10313 
10314        l_qty2 :=  old_delivery_detail_rec.picked_quantity2 * (p_req_quantity/old_delivery_detail_rec.picked_quantity);
10315        l_qty2 :=  round(l_qty2,5);
10316        IF l_debug_on THEN
10317    	      wsh_debug_sv.log(l_module_name,' l_qty2 ',l_qty2);
10318    	    END IF;
10319     ELSE
10320 
10321        l_qty2 := p_req_quantity2 ;
10322 
10323     END IF;
10324   END IF;
10325 
10326    --
10327    IF l_debug_on THEN
10328        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
10329    END IF;
10330    --
10331    WSH_DETAILS_VALIDATIONS.check_decimal_quantity(
10332         p_item_id    => old_delivery_detail_rec.inventory_item_id,
10333         p_organization_id => old_delivery_detail_rec.organization_id,
10334         p_input_quantity  => l_qty,
10335         p_uom_code    => old_delivery_detail_rec.requested_quantity_UOM,
10336         x_output_quantity => l_output_quantity,
10337         x_return_status   => l_qty_return_status);
10338 
10339    IF (l_qty_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
10340     RAISE chk_decimal_qty_failed;
10341    END IF;
10342    IF (l_output_quantity IS not NULL) THEN
10343      p_req_quantity := l_output_quantity;
10344    END IF;
10345 
10346   -- muom
10347   IF l_debug_on THEN
10348       WSH_DEBUG_SV.logmsg(l_module_name, 'BEFORE CALLING SPLIT_DETAIL_INT, l_qty IS '||l_qty||' l_qty2 is '||l_qty2);
10349   END IF;
10350 
10351 -- HW OPMCONV - Removed l_process_flag parameter
10352   Split_Detail_INT(
10353        p_old_delivery_detail_rec => old_delivery_detail_rec,
10354        -- muom
10355        p_quantity_to_split     => l_qty,
10356        p_quantity_to_split2   => l_qty2,
10357        p_unassign_flag       => p_unassign_flag,
10358        p_converted_flag     => p_converted_flag,
10359        p_manual_split     => p_manual_split,
10360        -- muom
10361        p_fulfillment_base => l_fulfillment_base,
10362        x_split_detail_id     => x_new_detail_id,
10363        -- Bug 16722851
10364        x_rsv_to_split        => l_dummy,
10365        x_rsv_to_split2       => l_dummy,
10366        x_return_status       => x_return_status);
10367 
10368    -- Bug 3724578 : Return back to the caller if any error occurs
10369    --               while splitting the delivery detail line
10370    --- Message will be set in  Split_Detail_INT
10371   IF x_return_status IN ( WSH_UTIL_CORE.G_RET_STS_ERROR,
10372                          WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
10373     		       ) THEN
10374     return;
10375   END IF;
10376 
10377   --bug# 6689448 (replenishment project) (begin) : call WMS for whenever there is split on replenishment requested
10378   -- delivery detail lines with the new quantity for the old delivery detail line on p_primary_quantity parameter.
10379   -- Inturn WMS creates a new replenishment record for p_split_delivery_detail_id with old delivery detail line old qty - old delivery detail line
10380   --  new quantity (p_primary_quantity).
10381   IF ( old_delivery_detail_rec.replenishment_status = 'R' and old_delivery_detail_rec.released_status in ('R','B')) THEN
10382   --{
10383       IF l_debug_on THEN
10384           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WMS_REPLENISHMENT_PUB.UPDATE_DELIVERY_DETAIL' ,WSH_DEBUG_SV.C_PROC_LEVEL);
10385       END IF;
10386       WMS_REPLENISHMENT_PUB.UPDATE_DELIVERY_DETAIL(
10387           p_delivery_detail_id       => old_delivery_detail_rec.delivery_detail_id,
10388           -- muom
10389           p_primary_quantity         => old_delivery_detail_rec.requested_quantity - l_qty,
10390           p_split_delivery_detail_id => x_new_detail_id,
10391           x_return_status            => x_return_status);
10392       IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
10393       --{
10394           IF l_debug_on THEN
10395               WSH_DEBUG_SV.logmsg(l_module_name,  'UNEXPECTED ERROR FROM WMS_REPLENISHMENT_PUB.UPDATE_DELIVERY_DETAIL');
10396               WSH_DEBUG_SV.pop(l_module_name);
10397           END IF;
10398           RETURN;
10399       --}
10400       END IF;
10401    --}
10402    END IF;
10403    --bug# 6689448 (replenishment project): end
10404 
10405   /*  H integration: Pricing integration csun
10406     mark repirce required flag when split delivery details
10407    */
10408    l_entity_ids(1) := old_delivery_detail_rec.delivery_detail_id;
10409    --
10410    IF l_debug_on THEN
10411        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
10412    END IF;
10413    --
10414    WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
10415        p_entity_type => 'DELIVERY_DETAIL',
10416        p_entity_ids   => l_entity_ids,
10417        x_return_status  => l_return_status);
10418    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
10419       raise reprice_required_err;
10420    END IF;
10421 
10422 --
10423 IF l_debug_on THEN
10424     WSH_DEBUG_SV.pop(l_module_name);
10425 END IF;
10426 --
10427   EXCEPTION
10428   WHEN chk_decimal_qty_failed THEN
10429     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10430     fnd_message.set_name('WSH', 'WSH_DET_DECIMAL_QTY_NOT_VALID');
10431     wsh_util_core.add_message(x_return_status,l_module_name);
10432     --
10433     IF l_debug_on THEN
10434         WSH_DEBUG_SV.logmsg(l_module_name,'CHK_DECIMAL_QTY_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
10435         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CHK_DECIMAL_QTY_FAILED');
10436     END IF;
10437     --
10438   WHEN quantity_over THEN
10439     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10440     fnd_message.set_name('WSH', 'WSH_DET_SPLIT_EXCEED');
10441     wsh_util_core.add_message(x_return_status,l_module_name);
10442     --
10443     IF l_debug_on THEN
10444         WSH_DEBUG_SV.logmsg(l_module_name,'QUANTITY_OVER exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
10445         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:QUANTITY_OVER');
10446     END IF;
10447     --
10448   WHEN zero_qty THEN
10449     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10450     fnd_message.set_name('WSH', 'WSH_NO_ZERO_NUM');
10451     wsh_util_core.add_message(x_return_status,l_module_name);
10452     --
10453     IF l_debug_on THEN
10454         WSH_DEBUG_SV.logmsg(l_module_name,'ZERO_QTY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
10455         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:ZERO_QTY');
10456     END IF;
10457     --
10458   WHEN negative_qty THEN
10459     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10460     fnd_message.set_name('WSH', 'WSH_NO_NEG_NUM');
10461     wsh_util_core.add_message(x_return_status,l_module_name);
10462     --
10463     IF l_debug_on THEN
10464         WSH_DEBUG_SV.logmsg(l_module_name,'NEGATIVE_QTY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
10465         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:NEGATIVE_QTY');
10466     END IF;
10467     --
10468   WHEN reprice_required_err THEN
10469     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10470     fnd_message.set_name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
10471     wsh_util_core.add_message(x_return_status,l_module_name);
10472     --
10473     IF l_debug_on THEN
10474         WSH_DEBUG_SV.logmsg(l_module_name,'REPRICE_REQUIRED_ERR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
10475         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:REPRICE_REQUIRED_ERR');
10476     END IF;
10477     --
10478   WHEN others THEN
10479     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
10480     wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS',l_module_name);
10481     --
10482     IF l_debug_on THEN
10483         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
10484         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
10485     END IF;
10486     --
10487 END SPLIT_DELIVERY_DETAILS;
10488 PROCEDURE Split_Detail_INT(
10489          p_old_delivery_detail_rec    IN  SplitDetailRecType,
10490          p_new_source_line_id  IN  NUMBER  ,
10491          p_quantity_to_split   IN  NUMBER,
10492          p_quantity_to_split2  IN  NUMBER   ,
10493          p_unassign_flag     IN  VARCHAR2 ,
10494          p_converted_flag   IN  VARCHAR2 ,
10495          p_manual_split   IN  VARCHAR2 ,
10496          p_split_sn     IN  VARCHAR2 ,
10497          -- muom
10498          p_fulfillment_base IN VARCHAR2,
10499          x_split_detail_id   OUT NOCOPY  NUMBER,
10500          -- Bug 16722851
10501          x_rsv_to_split      OUT NOCOPY  NUMBER,
10502          x_rsv_to_split2     OUT NOCOPY  NUMBER,
10503          x_return_status     OUT NOCOPY  VARCHAR2) IS
10504 BEGIN
10505 Split_Detail_INT(
10506                  p_old_delivery_detail_rec => p_old_delivery_detail_rec,
10507                  p_new_source_line_id  => p_new_source_line_id,
10508                  p_quantity_to_split   => p_quantity_to_split,
10509                  p_quantity_to_split2  => p_quantity_to_split2,
10510                  p_unassign_flag       => p_unassign_flag,
10511                  p_converted_flag      => p_converted_flag,
10512                  p_manual_split        => p_manual_split,
10513                  p_split_sn            => p_split_sn,
10514                  p_source_code         => NULL,
10515                  p_fulfillment_base    => p_fulfillment_base,
10516                  x_split_detail_id     => x_split_detail_id,
10517                  x_rsv_to_split        => x_rsv_to_split,
10518                  x_rsv_to_split2       => x_rsv_to_split2,
10519                  x_return_status       => x_return_status);
10520 
10521 END Split_Detail_INT;
10522 
10523 
10524 
10525 /*****************************************************************
10526   Description :-
10527 
10528   Currently being used values of p_manual_split are
10529 
10530 NULL - default, normal mode of splitting backordered quantity
10531      then shipped quantity
10532 Y - split staged quantity
10533 C - split shipped quantity then backordered quantity (from packing code)
10534 B - called from update_inventory_info for OPM's use
10535 M - called from update_inventory_info for OPM's use
10536 S - called from update_inventory_info for OPM's use
10537 U - called from update_inventory_info for OPM's use
10538 
10539 *******************************************************************/
10540 
10541 /*****************************************************
10542 -----   SPLIT_DETAIL_INT api
10543 *****************************************************/
10544 -- HW OPMCONV. Removed p_process_flag
10545 PROCEDURE Split_Detail_INT(
10546          p_old_delivery_detail_rec    IN  SplitDetailRecType,
10547          p_new_source_line_id  IN  NUMBER  ,
10548          p_quantity_to_split   IN  NUMBER,
10549          p_quantity_to_split2  IN  NUMBER   ,
10550          p_unassign_flag     IN  VARCHAR2 ,
10551          p_converted_flag   IN  VARCHAR2 ,
10552          p_manual_split   IN  VARCHAR2 ,
10553          p_split_sn     IN  VARCHAR2 ,
10554          -- muom
10555          --Added for bug 16833534
10556          p_source_code IN VARCHAR2,
10557          p_fulfillment_base IN VARCHAR2,
10558          x_split_detail_id   OUT NOCOPY  NUMBER,
10559          -- Bug 16722851
10560          x_rsv_to_split      OUT NOCOPY  NUMBER,
10561          x_rsv_to_split2     OUT NOCOPY  NUMBER,
10562          x_return_status     OUT NOCOPY  VARCHAR2)
10563 IS
10564 l_new_delivery_detail_id number;
10565 -- HW OPMCONV. Removed OPM variables
10566 
10567 -- HW OPMCONV. Removed format of 19,9
10568 l_qty2            NUMBER;
10569 l_split_shipped_qty2      NUMBER(19,9):= NULL;
10570 -- HW BUG#:1636578 variable to calculate new qty2
10571 l_new_req_qty2 NUMBER;
10572 -- HW OPMCONV. Removed format of 19,9
10573 l_original_shipped_qty2    NUMBER := NULL;
10574 
10575 l_new_req_qty   NUMBER;
10576 l_new_pick_qty  NUMBER;
10577 -- HW OPMCONV. No need to use l_new_pick_qty2
10578 --l_new_pick_qty2 NUMBER;
10579 
10580 l_delivery_id  number;
10581 l_parent_delivery_detail_id number;
10582 assignment number;
10583 l_delivery_assignment_id number;
10584 detail_rowid VARCHAR2(30);
10585 assignment_rowid VARCHAR2(30);
10586 total number;
10587 l_cr_dt_status varchar2(30);
10588 l_cr_assg_status varchar2(30);
10589 l_output_quantity number;
10590 l_qty_return_status varchar2(30);
10591 new_det_wt_vol_failed exception;
10592 old_det_wt_vol_failed exception;
10593 l_delivery_assignments_info WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_Type;
10594 l_delivery_details_info WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type;
10595 l_split_weight number;
10596 l_split_volume number;
10597 l_split_return_status varchar2(30);
10598 l_shipped_quantity     NUMBER := NULL;
10599 l_old_stage_qty      NUMBER := NULL;
10600 l_ser_qty          NUMBER := NULL;
10601 
10602 l_original_req_qty   NUMBER := NULL;
10603 l_original_req_qty2  NUMBER := NULL;
10604 l_original_picked_qty  NUMBER := NULL;
10605 l_original_picked_qty2   NUMBER := NULL;
10606 l_original_recvd_qty   NUMBER := NULL;
10607 l_original_recvd_qty2  NUMBER := NULL;
10608 l_original_rtv_qty   NUMBER := NULL;
10609 l_original_rtv_qty2  NUMBER := NULL;
10610 l_split_req_qty  NUMBER := NULL;
10611 l_split_req_qty2   NUMBER := NULL;
10612 l_split_picked_qty   NUMBER := NULL;
10613 l_split_picked_qty2  NUMBER := NULL;
10614 l_split_recvd_qty  NUMBER := NULL;
10615 l_split_recvd_qty2   NUMBER := NULL;
10616 l_split_rtv_qty  NUMBER := NULL;
10617 l_split_rtv_qty2   NUMBER := NULL;
10618 l_original_shipped_qty   NUMBER := NULL;
10619 l_original_cc_qty     NUMBER := NULL;
10620 l_split_shipped_qty  NUMBER := NULL;
10621 l_split_cc_qty      NUMBER := NULL;
10622 -- HW OPMCONV. Removed format of 19,9
10623 l_split_cc_qty2    NUMBER := NULL;
10624 -- HW OPMCONV. Removed format of 19,9
10625 l_original_cc_qty2     NUMBER := NULL;
10626 l_return_status     VARCHAR2(30);
10627 -- J: W/V Changes
10628 l_total_gross_wt NUMBER;
10629 l_total_net_wt   NUMBER;
10630 l_total_vol      NUMBER;
10631 l_org_wv_qty     NUMBER;
10632 l_new_wv_qty     NUMBER;
10633 
10634 -- HW OPMCONV. Removed OPM excpetion
10635 
10636 
10637 l_inv_controls_rec   WSH_DELIVERY_DETAILS_INV.inv_control_flag_rec;
10638 
10639 WSH_CREATE_DET_ERR EXCEPTION;
10640 WSH_SN_SPLIT_ERR        EXCEPTION;
10641 
10642 l_updated_delivery_detail_rec          SplitDetailRecType;
10643 
10644 l_detail_tab WSH_UTIL_CORE.id_tab_type; -- DBI Project
10645 l_dbi_rs     VARCHAR2(1); -- Return Status from DBI API
10646 --
10647 l_upd_wv_on_split_stg_dd VARCHAR2(1);  -- bug #7580785.
10648 --
10649 l_debug_on BOOLEAN;
10650 --
10651 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'SPLIT_DETAIL_INT';
10652 --
10653 l_action VARCHAR2(100) := 'SPLIT-LINE';
10654 BEGIN
10655   --
10656   --
10657   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10658   --
10659   IF l_debug_on IS NULL
10660   THEN
10661       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10662   END IF;
10663   --
10664   IF l_debug_on THEN
10665       WSH_DEBUG_SV.push(l_module_name);
10666       --
10667       WSH_DEBUG_SV.log(l_module_name,'P_NEW_SOURCE_LINE_ID',P_NEW_SOURCE_LINE_ID);
10668       WSH_DEBUG_SV.log(l_module_name,'P_QUANTITY_TO_SPLIT',P_QUANTITY_TO_SPLIT);
10669       WSH_DEBUG_SV.log(l_module_name,'P_QUANTITY_TO_SPLIT2',P_QUANTITY_TO_SPLIT2);
10670       WSH_DEBUG_SV.log(l_module_name,'P_UNASSIGN_FLAG',P_UNASSIGN_FLAG);
10671       WSH_DEBUG_SV.log(l_module_name,'P_CONVERTED_FLAG',P_CONVERTED_FLAG);
10672       WSH_DEBUG_SV.log(l_module_name,'P_MANUAL_SPLIT',P_MANUAL_SPLIT);
10673       WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_SN',P_SPLIT_SN);
10674       -- muom
10675       WSH_DEBUG_SV.log(l_module_name,'P_FULFILLMENT_BASE',P_FULFILLMENT_BASE);
10676   END IF;
10677   --
10678   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10679 
10680   /* need to validate the quantity passed meets the decimal quantity
10681      standard */
10682 
10683 
10684 -- HW OPMCONV. Removed branching
10685   l_qty2 := p_quantity_to_split2;
10686   --IF p_source_code = 'OE' THEN
10687   -- Bug 16722851
10688   l_original_picked_qty  := p_old_delivery_detail_rec.picked_quantity - p_quantity_to_split;
10689   l_original_picked_qty2 := p_old_delivery_detail_rec.picked_quantity2 - l_qty2;
10690   x_rsv_to_split         := p_quantity_to_split;
10691   x_rsv_to_split2        := p_quantity_to_split2;
10692   --END IF;
10693 IF NVL(p_old_delivery_detail_rec.line_direction,'O') IN ('O','IO') -- J-IB-NPARIKH
10694 THEN
10695 --{
10696 
10697     -- For bug 1307771. If shipped quantity is NULL.  Then leave the new
10698     -- shipped quantity to be NULL
10699   IF (p_old_delivery_detail_rec.shipped_quantity IS NULL AND p_old_delivery_detail_rec.cycle_count_quantity IS NULL) THEN
10700   l_split_shipped_qty := NULL;
10701   l_split_cc_qty := NULL;
10702   l_split_shipped_qty2 :=NULL;
10703   l_split_cc_qty2 := NULL;
10704     IF l_debug_on THEN
10705  	WSH_DEBUG_SV.log(l_module_name,' p_old_delivery_detail_rec.shipped_quantity ',p_old_delivery_detail_rec.shipped_quantity);
10706  	WSH_DEBUG_SV.log(l_module_name,' p_old_delivery_detail_rec.cycle_count_quantity ',p_old_delivery_detail_rec.cycle_count_quantity );
10707     END IF;
10708   ELSIF (p_manual_split = 'C') THEN
10709 
10710     l_split_shipped_qty := LEAST(p_old_delivery_detail_rec.shipped_quantity,
10711                    p_quantity_to_split);
10712   l_split_shipped_qty2 := LEAST(p_old_delivery_detail_rec.shipped_quantity2,
10713                   p_quantity_to_split2);
10714     l_split_cc_qty := LEAST(p_old_delivery_detail_rec.cycle_count_quantity,
10715                 (p_quantity_to_split - nvl(l_split_shipped_qty,0)));
10716   l_split_cc_qty2 := LEAST(p_old_delivery_detail_rec.cycle_count_quantity2,
10717                (p_quantity_to_split2 - NVL(l_split_shipped_qty2,0)));
10718 
10719   l_original_shipped_qty := p_old_delivery_detail_rec.shipped_quantity     -
10720  l_split_shipped_qty;
10721   l_original_cc_qty   := p_old_delivery_detail_rec.cycle_count_quantity   -
10722  l_split_cc_qty;
10723   l_original_shipped_qty2 := p_old_delivery_detail_rec.shipped_quantity2   -
10724  l_split_shipped_qty2;
10725   l_original_cc_qty2    := p_old_delivery_detail_rec.cycle_count_quantity2 -
10726  l_split_cc_qty2;
10727 
10728  ELSIF (p_manual_split = 'Y') THEN
10729 
10730   /* bug 1983460
10731   if the call is from ship confirm to split only the stage quantity
10732    the split delivery detail has null shipped and cc quantities.
10733   */
10734 
10735     l_split_shipped_qty := NULL;
10736     l_split_cc_qty := NULL;
10737       l_split_shipped_qty2 :=NULL;
10738       l_split_cc_qty2 := NULL;
10739 
10740   /* bug 1983460
10741   since the split shipped and split cc quantities are null, we should
10742   leave the original shipped and original cc quantities as they are.
10743   */
10744 
10745   l_original_shipped_qty := p_old_delivery_detail_rec.shipped_quantity;
10746   l_original_cc_qty   := p_old_delivery_detail_rec.cycle_count_quantity;
10747   l_original_shipped_qty2 := p_old_delivery_detail_rec.shipped_quantity2;
10748 
10749   l_original_cc_qty2    := p_old_delivery_detail_rec.cycle_count_quantity2;
10750     IF l_debug_on THEN
10751  	WSH_DEBUG_SV.log(l_module_name,' l_split_cc_qty ',l_split_cc_qty);
10752  	WSH_DEBUG_SV.log(l_module_name,' l_split_cc_qty2 ',l_split_cc_qty2 );
10753     END IF;
10754 
10755   ELSE
10756   -- use cc qty to split p_quantity_to_split before we use shipped qty to complete the quantity split
10757   --  (This takes care of splitting lines to backorder/cycle-count, for example.)
10758   -- assumption: the quantities' relationships are valid
10759 
10760   l_split_cc_qty  := LEAST(p_old_delivery_detail_rec.cycle_count_quantity,   p_quantity_to_split);
10761   l_split_cc_qty2 := LEAST(p_old_delivery_detail_rec.cycle_count_quantity2,  p_quantity_to_split2);
10762 
10763   -- fail-safe: NVL to ensure that shipped qtys can still be split even if cc qtys are NULL
10764   l_split_shipped_qty  := LEAST(p_old_delivery_detail_rec.shipped_quantity,  (p_quantity_to_split  - NVL(l_split_cc_qty,0)));
10765   l_split_shipped_qty2 := LEAST(p_old_delivery_detail_rec.shipped_quantity2, (p_quantity_to_split2 - NVL(l_split_cc_qty2,0)));
10766 
10767   -- update original line's quantities accordingly
10768   l_original_shipped_qty := p_old_delivery_detail_rec.shipped_quantity     - l_split_shipped_qty;
10769   l_original_cc_qty   := p_old_delivery_detail_rec.cycle_count_quantity   - l_split_cc_qty;
10770 
10771   l_original_shipped_qty2 := p_old_delivery_detail_rec.shipped_quantity2   - l_split_shipped_qty2;
10772   l_original_cc_qty2    := p_old_delivery_detail_rec.cycle_count_quantity2 - l_split_cc_qty2;
10773   END IF;
10774 
10775   --
10776 
10777   IF p_old_delivery_detail_rec.picked_quantity IS NULL THEN
10778     l_delivery_details_info.requested_quantity := p_quantity_to_split;
10779     -- muom
10780     l_delivery_details_info.requested_quantity2 := p_quantity_to_split2;
10781   ELSE
10782     l_delivery_details_info.requested_quantity := LEAST(p_old_delivery_detail_rec.requested_quantity, p_quantity_to_split);
10783     l_delivery_details_info.picked_quantity := p_quantity_to_split;
10784     l_delivery_details_info.requested_quantity2 := LEAST(p_old_delivery_detail_rec.requested_quantity2, p_quantity_to_split2);
10785 
10786     -- muom: Always split the detail's Primary based on conversion from Secondary
10787     IF p_fulfillment_base = 'S' and l_delivery_details_info.requested_quantity2 > 0 THEN
10788       l_delivery_details_info.requested_quantity :=
10789          wsh_wv_utils.convert_uom(
10790            from_uom => p_old_delivery_detail_rec.requested_quantity_uom2,
10791            to_uom   => p_old_delivery_detail_rec.requested_quantity_uom,
10792            quantity => l_delivery_details_info.requested_quantity2,
10793            item_id  => p_old_delivery_detail_rec.inventory_item_id,
10794            org_id   => p_old_delivery_detail_rec.organization_id);
10795          IF l_debug_on THEN
10796            WSH_DEBUG_SV.logmsg(l_module_name,'*** new l_delivery_details_info.requested_quantity '||l_delivery_details_info.requested_quantity);
10797          END IF;
10798     END IF;
10799     l_delivery_details_info.picked_quantity2  := nvl(l_qty2,FND_API.G_MISS_NUM);
10800 
10801     -- Bug 16722851
10802     IF p_source_code  = 'OE' THEN --Added for bug 16833534
10803     IF p_fulfillment_base = 'P' and nvl(l_delivery_details_info.picked_quantity2,FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM THEN
10804       IF l_debug_on THEN
10805         WSH_DEBUG_SV.log(l_module_name, '*** p_old_delivery_detail_rec.picked_quantity',p_old_delivery_detail_rec.picked_quantity);
10806         WSH_DEBUG_SV.log(l_module_name, '*** p_old_delivery_detail_rec.shipped_quantity',p_old_delivery_detail_rec.shipped_quantity);
10807         WSH_DEBUG_SV.log(l_module_name, '*** p_old_delivery_detail_rec.picked_quantity2',p_old_delivery_detail_rec.picked_quantity2);
10808         WSH_DEBUG_SV.log(l_module_name, '*** p_old_delivery_detail_rec.shipped_quantity2',p_old_delivery_detail_rec.shipped_quantity2);
10809       END IF;
10810 
10811       -- Bug 16722851: Prorate the Secondary Picked/Shipped/Backordered quantities based on primary quantities
10812       l_delivery_details_info.picked_quantity2  := (p_old_delivery_detail_rec.picked_quantity2 * l_delivery_details_info.picked_quantity) / p_old_delivery_detail_rec.picked_quantity;
10813       IF p_old_delivery_detail_rec.shipped_quantity > 0  THEN
10814         l_split_shipped_qty2 := (p_old_delivery_detail_rec.shipped_quantity2 * l_split_shipped_qty) / p_old_delivery_detail_rec.shipped_quantity;
10815       ELSE
10816         l_split_shipped_qty2 := null;
10817       END IF;
10818       IF p_old_delivery_detail_rec.cycle_count_quantity > 0 THEN
10819         l_split_cc_qty2 := (p_old_delivery_detail_rec.cycle_count_quantity2 * l_split_cc_qty) / p_old_delivery_detail_rec.cycle_count_quantity;
10820       ELSE
10821         l_split_cc_qty2 := null;
10822       END IF;
10823 
10824       l_original_picked_qty2  := p_old_delivery_detail_rec.picked_quantity2 - l_delivery_details_info.picked_quantity2;
10825       l_original_shipped_qty2 := p_old_delivery_detail_rec.shipped_quantity2 - l_split_shipped_qty2;
10826       l_original_cc_qty2      := p_old_delivery_detail_rec.cycle_count_quantity2 - l_split_cc_qty2;
10827       x_rsv_to_split2         := l_delivery_details_info.picked_quantity2;
10828 
10829       IF l_debug_on THEN
10830         WSH_DEBUG_SV.log(l_module_name, 'New l_split_shipped_qty2',l_split_shipped_qty2);
10831         WSH_DEBUG_SV.log(l_module_name, 'New l_split_cc_qty2',l_split_cc_qty2);
10832         WSH_DEBUG_SV.log(l_module_name, 'New l_original_shipped_qty2',l_original_shipped_qty2);
10833         WSH_DEBUG_SV.log(l_module_name, 'New l_original_cc_qty2',l_original_cc_qty2);
10834         WSH_DEBUG_SV.log(l_module_name, 'x_rsv_to_split2',x_rsv_to_split2);
10835       END IF;
10836     ELSIF p_fulfillment_base = 'S' and l_delivery_details_info.picked_quantity > 0 THEN
10837       IF l_debug_on THEN
10838         WSH_DEBUG_SV.log(l_module_name, '*** p_old_delivery_detail_rec.picked_quantity',p_old_delivery_detail_rec.picked_quantity);
10839         WSH_DEBUG_SV.log(l_module_name, '*** p_old_delivery_detail_rec.shipped_quantity',p_old_delivery_detail_rec.shipped_quantity);
10840         WSH_DEBUG_SV.log(l_module_name, '*** p_old_delivery_detail_rec.picked_quantity2',p_old_delivery_detail_rec.picked_quantity2);
10841         WSH_DEBUG_SV.log(l_module_name, '*** p_old_delivery_detail_rec.shipped_quantity2',p_old_delivery_detail_rec.shipped_quantity2);
10842       END IF;
10843 
10844       -- Bug 16722851: Prorate the Primary Picked/Shipped/Backordered quantities based on secondary quantities
10845       l_delivery_details_info.picked_quantity  := (p_old_delivery_detail_rec.picked_quantity * l_delivery_details_info.picked_quantity2) / p_old_delivery_detail_rec.picked_quantity2;
10846       IF p_old_delivery_detail_rec.shipped_quantity2 > 0  THEN
10847         l_split_shipped_qty := (p_old_delivery_detail_rec.shipped_quantity * l_split_shipped_qty2) / p_old_delivery_detail_rec.shipped_quantity2;
10848       ELSE
10849         l_split_shipped_qty := null;
10850       END IF;
10851       IF p_old_delivery_detail_rec.cycle_count_quantity2 > 0 THEN
10852         l_split_cc_qty := (p_old_delivery_detail_rec.cycle_count_quantity * l_split_cc_qty2) / p_old_delivery_detail_rec.cycle_count_quantity2;
10853       ELSE
10854         l_split_cc_qty := null;
10855       END IF;
10856 
10857       l_original_picked_qty  := p_old_delivery_detail_rec.picked_quantity - l_delivery_details_info.picked_quantity;
10858       l_original_shipped_qty := p_old_delivery_detail_rec.shipped_quantity - l_split_shipped_qty;
10859       l_original_cc_qty      := p_old_delivery_detail_rec.cycle_count_quantity - l_split_cc_qty;
10860       x_rsv_to_split         := l_delivery_details_info.picked_quantity;
10861 
10862       IF l_debug_on THEN
10863         WSH_DEBUG_SV.log(l_module_name, 'New l_split_shipped_qty',l_split_shipped_qty);
10864         WSH_DEBUG_SV.log(l_module_name, 'New l_split_cc_qty',l_split_cc_qty);
10865         WSH_DEBUG_SV.log(l_module_name, 'New l_original_shipped_qty',l_original_shipped_qty);
10866         WSH_DEBUG_SV.log(l_module_name, 'New l_original_cc_qty',l_original_cc_qty);
10867         WSH_DEBUG_SV.log(l_module_name, 'x_rsv_to_split',x_rsv_to_split);
10868       END IF;
10869     END IF;
10870   END IF;
10871   END IF;
10872 
10873   IF l_debug_on THEN
10874        WSH_DEBUG_SV.log(l_module_name, ' l_delivery_details_info.requested_quantity2',l_delivery_details_info.requested_quantity2);
10875   END IF;
10876 
10877    --Bug 7291415. 0 to be considered as valid value. Following IF condition modified.
10878    --IF ( NVL(l_qty2, 0) = 0  OR l_qty2 < 0 ) THEN
10879   -- muom
10880   IF p_fulfillment_base = 'P' THEN
10881     IF ( NVL(l_qty2, -999) = -999  OR l_qty2 < 0 ) THEN
10882       l_delivery_details_info.requested_quantity2 := FND_API.G_MISS_NUM;
10883     ELSE
10884       l_delivery_details_info.requested_quantity2 := l_qty2;
10885     END IF;
10886   END IF;
10887   --
10888   --
10889 -- J-IB-NPARIKH-{
10890   l_original_req_qty     := GREATEST(p_old_delivery_detail_rec.requested_quantity
10891                           - l_delivery_details_info.requested_quantity, 0);
10892   l_original_req_qty2    := GREATEST(p_old_delivery_detail_rec.requested_quantity2 - l_qty2, 0);
10893   IF NOT ( p_source_code = 'OE' ) THEN --Added for bug 16833534
10894   l_original_picked_qty  := p_old_delivery_detail_rec.picked_quantity - p_quantity_to_split;
10895    --l_original_picked_qty2 := p_old_delivery_detail_rec.picked_quantity2 - nvl(l_qty2,l_new_pick_qty2);
10896    l_original_picked_qty2 := p_old_delivery_detail_rec.picked_quantity2 - l_qty2;
10897    END IF;
10898   --
10899   l_original_recvd_qty   := p_old_delivery_detail_rec.received_quantity;
10900   l_original_recvd_qty2  := p_old_delivery_detail_rec.received_quantity2;
10901   l_split_recvd_qty      := NULL;
10902   l_split_recvd_qty2     := NULL;
10903   -- J-IB-NPARIKH-}
10904 
10905 
10906 --}
10907   IF l_debug_on THEN
10908  	WSH_DEBUG_SV.log(l_module_name, ' l_original_req_qty ',l_original_req_qty);
10909  	WSH_DEBUG_SV.log(l_module_name, ' l_original_req_qty2 ',l_original_req_qty2);
10910  	WSH_DEBUG_SV.log(l_module_name, ' l_original_picked_qty ',l_original_picked_qty);
10911  	WSH_DEBUG_SV.log(l_module_name, ' l_original_picked_qty2 ',l_original_picked_qty2);
10912  	WSH_DEBUG_SV.log(l_module_name, ' l_original_shipped_qty ',l_original_shipped_qty);
10913  	WSH_DEBUG_SV.log(l_module_name, ' l_original_shipped_qty2 ',l_original_shipped_qty2);
10914  	WSH_DEBUG_SV.log(l_module_name, ' l_original_recvd_qty ',l_original_recvd_qty);
10915  	WSH_DEBUG_SV.log(l_module_name, ' l_original_recvd_qty2 ',l_original_recvd_qty2);
10916   END IF;
10917 ELSE  --    -- J-IB-NPARIKH
10918 --{
10919 				--
10920 				-- For inbound and drop-ship lines,
10921 				-- calculate quantities for new(child) line and original line
10922 				-- For new line, quantities are
10923 				--               LEAST( qty. on original line, input quantity to be split)
10924 				-- For original line, quantities are
10925 				--               GREATEST( qty. on original line -  qty. on new line, 0 )
10926 				-- For a line with picked=12, requested=10, if we split 11 then
10927 				--    new line      : picked=11, requested=10
10928 				--    original line : picked=1, requested=0
10929 				--
10930 				--
10931     l_split_cc_qty          := NULL;
10932     l_split_cc_qty2         := NULL;
10933     l_split_rtv_qty       := least(p_old_delivery_detail_rec.returned_quantity, p_quantity_to_split);
10934     l_split_recvd_qty       := least(p_old_delivery_detail_rec.received_quantity, p_quantity_to_split);
10935     l_split_shipped_qty     := least(p_old_delivery_detail_rec.shipped_quantity,  p_quantity_to_split);
10936     l_split_picked_qty      := least(p_old_delivery_detail_rec.picked_quantity,   p_quantity_to_split);
10937     l_split_req_qty         := least(p_old_delivery_detail_rec.requested_quantity,p_quantity_to_split);
10938     --
10939     l_split_rtv_qty2      := least(p_old_delivery_detail_rec.returned_quantity2, l_qty2);
10940     l_split_recvd_qty2      := least(p_old_delivery_detail_rec.received_quantity2, l_qty2);
10941     l_split_shipped_qty2    := least(p_old_delivery_detail_rec.shipped_quantity2,  l_qty2);
10942     l_split_picked_qty2     := least(p_old_delivery_detail_rec.picked_quantity2,   l_qty2);
10943     l_split_req_qty2        := least(p_old_delivery_detail_rec.requested_quantity2,l_qty2);
10944     --
10945     --
10946     l_delivery_details_info.requested_quantity  := nvl(l_split_req_qty, FND_API.G_MISS_NUM);
10947     l_delivery_details_info.requested_quantity2 := nvl(l_split_req_qty2,FND_API.G_MISS_NUM);
10948     l_delivery_details_info.picked_quantity     := nvl(l_split_picked_qty, FND_API.G_MISS_NUM);
10949     l_delivery_details_info.picked_quantity2    := nvl(l_split_picked_qty2,FND_API.G_MISS_NUM);
10950     l_delivery_details_info.shipped_quantity  := nvl(l_split_shipped_qty, FND_API.G_MISS_NUM);
10951     l_delivery_details_info.shipped_quantity2 := nvl(l_split_shipped_qty2,FND_API.G_MISS_NUM);
10952     l_delivery_details_info.received_quantity  := nvl(l_split_recvd_qty, FND_API.G_MISS_NUM);
10953     l_delivery_details_info.received_quantity2 := nvl(l_split_recvd_qty2,FND_API.G_MISS_NUM);
10954     l_delivery_details_info.returned_quantity  := nvl(l_split_rtv_qty, FND_API.G_MISS_NUM);
10955     l_delivery_details_info.returned_quantity2 := nvl(l_split_rtv_qty2,FND_API.G_MISS_NUM);
10956     --
10957     --
10958     l_original_shipped_qty  := GREATEST(
10959                                         p_old_delivery_detail_rec.shipped_quantity
10960                                         - NVL(l_split_shipped_qty,0),
10961                                         0
10962                                         );
10963     l_original_cc_qty       := GREATEST(
10964                                         p_old_delivery_detail_rec.cycle_count_quantity
10965                                         - NVL(l_split_cc_qty,0),
10966                                         0
10967                                         );
10968     l_original_shipped_qty2 := GREATEST(
10969                                         p_old_delivery_detail_rec.shipped_quantity2
10970                                         - NVL(l_split_shipped_qty2,0),
10971                                         0
10972                                         );
10973     l_original_cc_qty2      := GREATEST(
10974                                         p_old_delivery_detail_rec.cycle_count_quantity2
10975                                         - NVL(l_split_cc_qty2,0),
10976                                         0
10977                                         );
10978     --
10979     l_original_req_qty      := GREATEST(
10980                                         p_old_delivery_detail_rec.requested_quantity
10981                                         - NVL(l_split_req_qty,0),
10982                                         0
10983                                         );
10984     l_original_req_qty2     := GREATEST(
10985                                         p_old_delivery_detail_rec.requested_quantity2
10986                                         - NVL(l_split_req_qty2,0),
10987                                         0
10988                                         );
10989     l_original_picked_qty   := GREATEST(
10990                                         p_old_delivery_detail_rec.picked_quantity
10991                                         - NVL(l_split_picked_qty,0),
10992                                         0
10993                                         );
10994     l_original_picked_qty2  := GREATEST(
10995                                         p_old_delivery_detail_rec.picked_quantity2
10996                                         - NVL(l_split_picked_qty2,0),
10997                                         0
10998                                         );
10999     l_original_recvd_qty   := GREATEST(
11000                                         p_old_delivery_detail_rec.received_quantity
11001                                         - NVL(l_split_recvd_qty,0),
11002                                         0
11003                                         );
11004     l_original_recvd_qty2  := GREATEST(
11005                                         p_old_delivery_detail_rec.received_quantity2
11006                                         - NVL(l_split_recvd_qty2,0),
11007                                         0
11008                                         );
11009 
11010     IF l_debug_on THEN
11011        WSH_DEBUG_SV.log(l_module_name,' l_delivery_details_info.requested_quantity', l_delivery_details_info.requested_quantity);
11012        WSH_DEBUG_SV.log(l_module_name,'l_delivery_details_info.requested_quantity2',l_delivery_details_info.requested_quantity2);
11013        WSH_DEBUG_SV.log(l_module_name,' l_delivery_details_info.shipped_quantity', l_delivery_details_info.shipped_quantity);
11014        WSH_DEBUG_SV.log(l_module_name,'l_delivery_details_info.shipped_quantity2',l_delivery_details_info.shipped_quantity2);
11015        WSH_DEBUG_SV.log(l_module_name,' l_delivery_details_info.received_quantity', l_delivery_details_info.received_quantity);
11016        WSH_DEBUG_SV.log(l_module_name,'l_delivery_details_info.received_quantity2',l_delivery_details_info.received_quantity2);
11017        WSH_DEBUG_SV.log(l_module_name,' l_delivery_details_info.returned_quantity', l_delivery_details_info.returned_quantity);
11018        WSH_DEBUG_SV.log(l_module_name,'l_delivery_details_info.returned_quantity2',l_delivery_details_info.returned_quantity2);
11019        WSH_DEBUG_SV.log(l_module_name,'l_delivery_details_info.picked_quantity',l_delivery_details_info.picked_quantity);
11020        WSH_DEBUG_SV.log(l_module_name,'l_delivery_details_info.picked_quantity2',l_delivery_details_info.picked_quantity2);
11021        WSH_DEBUG_SV.log(l_module_name,'l_original_shipped_qty',l_original_shipped_qty);
11022        WSH_DEBUG_SV.log(l_module_name,'l_original_shipped_qty2',l_original_shipped_qty2);
11023        WSH_DEBUG_SV.log(l_module_name,'l_original_cc_qty',l_original_cc_qty);
11024        WSH_DEBUG_SV.log(l_module_name,'l_original_cc_qty2',l_original_cc_qty2);
11025        WSH_DEBUG_SV.log(l_module_name,'l_original_req_qty',l_original_req_qty);
11026        WSH_DEBUG_SV.log(l_module_name,'l_original_req_qty2',l_original_req_qty2);
11027        WSH_DEBUG_SV.log(l_module_name,'l_original_picked_qty',l_original_picked_qty);
11028        WSH_DEBUG_SV.log(l_module_name,'l_original_picked_qty2',l_original_picked_qty2);
11029        WSH_DEBUG_SV.log(l_module_name,'l_original_recvd_qty',l_original_recvd_qty);
11030        WSH_DEBUG_SV.log(l_module_name,'l_original_recvd_qty2',l_original_recvd_qty2);
11031        WSH_DEBUG_SV.log(l_module_name,'l_original_rtv_qty',l_original_rtv_qty);
11032        WSH_DEBUG_SV.log(l_module_name,'l_original_rtv_qty2',l_original_rtv_qty2);
11033     END IF;
11034 
11035   --
11036 --}
11037 END IF;
11038 
11039 -- Bug 2181132 in current code for single line
11040 -- donot need the check for null
11041   l_delivery_details_info.source_line_set_id :=
11042           p_old_delivery_detail_rec.source_line_set_id;
11043 
11044   IF p_new_source_line_id IS NOT NULL THEN
11045   l_delivery_details_info.source_line_id := p_new_source_line_id;
11046   END IF;
11047 
11048   -- J: W/V Changes
11049   IF p_old_delivery_detail_rec.wv_frozen_flag = 'Y' THEN
11050     l_org_wv_qty := NVL(p_old_delivery_detail_rec.received_quantity,NVL(p_old_delivery_detail_rec.shipped_quantity,NVL(p_old_delivery_detail_rec.picked_quantity, p_old_delivery_detail_rec.requested_quantity)));
11051 
11052     IF l_debug_on THEN
11053       WSH_DEBUG_SV.logmsg(l_module_name, 'Frozen Y');
11054     END IF;
11055 
11056     IF (p_manual_split = 'Y') THEN
11057       -- p_manual_split is 'Y' only when splitting for staged delivery details during ship confirm
11058       -- Staged delivery details W/V should always be reset back to original W/V
11059       l_new_wv_qty := 0;
11060     ELSE
11061       SELECT NVL(decode(l_split_recvd_qty,FND_API.G_MISS_NUM,null,l_split_recvd_qty),
11062                       NVL(decode(l_split_shipped_qty,FND_API.G_MISS_NUM,null,l_split_shipped_qty),
11063                           NVL(decode(l_delivery_details_info.picked_quantity,FND_API.G_MISS_NUM,null,l_delivery_details_info.picked_quantity),
11064                               decode(l_delivery_details_info.requested_quantity,FND_API.G_MISS_NUM,null,l_delivery_details_info.requested_quantity))))
11065       INTO   l_new_wv_qty
11066       FROM   dual;
11067     END IF;
11068 
11069     IF l_org_wv_qty <> 0 THEN
11070       l_delivery_details_info.gross_weight :=  round( (l_new_wv_qty/l_org_wv_qty) * p_old_delivery_detail_rec.gross_weight, 5);
11071       l_delivery_details_info.net_weight   :=  round( (l_new_wv_qty/l_org_wv_qty) * p_old_delivery_detail_rec.net_weight, 5);
11072       l_delivery_details_info.volume       :=  round( (l_new_wv_qty/l_org_wv_qty) * p_old_delivery_detail_rec.volume, 5);
11073     ELSE
11074       l_delivery_details_info.gross_weight := 0;
11075       l_delivery_details_info.net_weight   := 0;
11076       l_delivery_details_info.volume       := 0;
11077     END IF;
11078 
11079 
11080   END IF;
11081 
11082   IF (l_split_shipped_qty is not null and l_split_shipped_qty = 0) OR (p_manual_split = 'Y') THEN
11083     l_delivery_details_info.wv_frozen_flag  := 'N';
11084   ELSE
11085     l_delivery_details_info.wv_frozen_flag  := p_old_delivery_detail_rec.wv_frozen_flag;
11086   END IF;
11087   l_delivery_details_info.weight_uom_code := p_old_delivery_detail_rec.weight_uom_code;
11088   l_delivery_details_info.volume_uom_code := p_old_delivery_detail_rec.volume_uom_code;
11089 
11090   l_delivery_details_info.shipped_quantity := nvl(l_split_shipped_qty,FND_API.G_MISS_NUM);
11091   IF ( NVL(l_split_shipped_qty2, 0) = 0 ) THEN
11092   l_delivery_details_info.shipped_quantity2 := FND_API.G_MISS_NUM;
11093   ELSE
11094   l_delivery_details_info.shipped_quantity2 := l_split_shipped_qty2;
11095   END IF;
11096   --
11097   --
11098   l_delivery_details_info.received_quantity  := nvl(l_split_recvd_qty, FND_API.G_MISS_NUM);
11099   l_delivery_details_info.received_quantity2 := nvl(l_split_recvd_qty2,FND_API.G_MISS_NUM);
11100   --
11101   IF ( NVL(l_qty2, 0) = 0 OR l_qty2 < 0  ) THEN
11102   l_delivery_details_info.cancelled_quantity2 := FND_API.G_MISS_NUM;
11103   ELSE
11104   -- Bug 2116595
11105   l_delivery_details_info.cancelled_quantity2 := FND_API.G_MISS_NUM;
11106   END IF;
11107 
11108   l_delivery_details_info.cycle_count_quantity := nvl(l_split_cc_qty,FND_API.G_MISS_NUM);
11109 -- HW OPMCONV. No need to fork code
11110 --  IF ( p_process_flag = FND_API.G_TRUE ) THEN
11111     l_delivery_details_info.cycle_count_quantity2 := nvl(l_split_cc_qty2,FND_API.G_MISS_NUM);
11112 --  END IF;
11113 
11114   -- Bug 2116595
11115   l_delivery_details_info.cancelled_quantity := FND_API.G_MISS_NUM;
11116   l_delivery_details_info.split_from_detail_id := p_old_delivery_detail_rec.delivery_detail_id;
11117 
11118   l_delivery_details_info.container_flag := p_old_delivery_detail_rec.container_flag;
11119   l_delivery_details_info.master_serial_number := FND_API.G_MISS_CHAR;
11120   l_delivery_details_info.serial_number := FND_API.G_MISS_CHAR;
11121   l_delivery_details_info.to_serial_number := FND_API.G_MISS_CHAR;
11122   l_delivery_details_info.transaction_temp_id := FND_API.G_MISS_NUM;
11123   l_delivery_details_info.last_update_date := SYSDATE;
11124   l_delivery_details_info.last_updated_by :=  FND_GLOBAL.USER_ID;
11125   l_delivery_details_info.last_update_login :=  FND_GLOBAL.LOGIN_ID;
11126   -- Bug 2419301
11127   l_delivery_details_info.oe_interfaced_flag := p_old_delivery_detail_rec.oe_interfaced_flag;
11128   l_delivery_details_info.consignee_flag := p_old_delivery_detail_rec.consignee_flag; --RTV changes
11129   l_new_delivery_detail_id := NULL;
11130 
11131 
11132   l_updated_delivery_detail_rec := p_old_delivery_detail_rec;
11133 
11134 -- HW OPMCONV - Removed branching
11135   -- are there serial numbers to split?
11136 
11137   /* bug 1983460
11138    if p_manual_split is 'Y', only stage quantity is involved.
11139    Staged quantities can't have serial numbers and hence no need to call
11140   */
11141 
11142 
11143   IF (  p_split_sn = 'Y'
11144     AND NVL(p_old_delivery_detail_rec.shipped_quantity, 0) > NVL(l_original_shipped_qty, 0)
11145     AND ( (p_old_delivery_detail_rec.transaction_temp_id IS NOT NULL)
11146        OR (p_old_delivery_detail_rec.serial_number IS NOT NULL)
11147       )
11148   AND (NVL(p_manual_split,'!') <> 'Y')
11149     ) THEN
11150 
11151     Split_Serial_Numbers_INT(
11152        x_old_detail_rec     => l_updated_delivery_detail_rec,
11153        x_new_delivery_detail_rec => l_delivery_details_info,
11154        p_old_shipped_quantity => l_original_shipped_qty,
11155        p_new_shipped_quantity => l_split_shipped_qty,
11156        x_return_status       => l_split_return_status);
11157 
11158     IF (l_split_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
11159     RAISE wsh_sn_split_err;
11160     END IF;
11161 
11162   END IF; -- are there serial numbers to split?
11163 
11164   --
11165   IF l_debug_on THEN
11166       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.CREATE_NEW_DETAIL_FROM_OLD',WSH_DEBUG_SV.C_PROC_LEVEL);
11167   END IF;
11168   --
11169   WSH_DELIVERY_DETAILS_PKG.create_new_detail_from_old(
11170               p_delivery_detail_rec  =>  l_delivery_details_info,
11171               p_delivery_detail_id    =>   p_old_delivery_detail_rec.delivery_detail_id,
11172               x_row_id          =>   detail_rowid,
11173               x_delivery_detail_id    =>   l_new_delivery_detail_id,
11174               x_return_status      =>  l_cr_dt_status);
11175 
11176               IF l_cr_dt_status in (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
11177                  RAISE WSH_CREATE_DET_ERR;
11178               END IF;
11179 
11180 
11181   /* call wv util to calculate the weight and volume of the new detail */
11182   -- J: W/V Changes
11183   l_upd_wv_on_split_stg_dd := 'N'; -- bug # 7580785
11184   IF p_old_delivery_detail_rec.wv_frozen_flag = 'N' THEN
11185   --{
11186       -- bug # 7580785 :
11187       -- During Partial Shipping with the remain qty as staged, w/v value should not be
11188       -- deducted again from the original line since during entering shipped_quantity
11189       -- w/v has been calculated for the original line but W/V should be calculated on split staged DD.
11190       IF l_debug_on THEN
11191           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DETAIL_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
11192       END IF;
11193       WSH_WV_UTILS.Detail_Weight_Volume(
11194           p_delivery_detail_id => l_new_delivery_detail_id,
11195           p_update_flag        => 'Y',
11196           x_net_weight         => l_split_weight,
11197           x_volume             => l_split_volume,
11198           x_return_status      => l_split_return_status);
11199       IF (l_split_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
11200           RAISE new_det_wt_vol_failed;
11201       END IF;
11202       IF l_debug_on THEN
11203           WSH_DEBUG_SV.logmsg(l_module_name, ' After Update w/v');
11204           WSH_DEBUG_SV.log(l_module_name, 'l_split_weight',l_split_weight);
11205           WSH_DEBUG_SV.log(l_module_name, 'l_split_volume',l_split_volume);
11206           WSH_DEBUG_SV.log(l_module_name, 'p_manual_split',p_manual_split);
11207       END IF;
11208       -- Bug 4416863
11209       -- During Partial Shipping with the remain qty as staged, w/v value should not be
11210       -- deducted again from the original line since during entering shipped_quantity
11211       -- w/v has been calculated for the original line.
11212       IF (p_manual_split = 'Y') THEN
11213           l_total_net_wt   := 0;
11214           l_total_gross_wt := 0;
11215           l_total_vol      := 0;
11216           -- bug # 7580785: Needs to post the w/v changes to delivery after creating assignment records
11217           l_upd_wv_on_split_stg_dd := 'Y';
11218       ELSE
11219       -- end bug 4416863
11220           l_total_net_wt   := l_split_weight;
11221           l_total_gross_wt := l_split_weight;
11222           l_total_vol      := l_split_volume;
11223       END IF;
11224   ELSE
11225      l_total_net_wt   := l_delivery_details_info.net_weight;
11226      l_total_gross_wt := l_delivery_details_info.gross_weight;
11227      l_total_vol      := l_delivery_details_info.volume;
11228   END IF;
11229 
11230   IF (p_unassign_flag = 'N') THEN
11231     l_delivery_assignments_info.type := 'S';
11232     l_delivery_assignments_info.delivery_id := p_old_delivery_detail_rec.delivery_id;
11233     l_delivery_assignments_info.parent_delivery_detail_id := p_old_delivery_detail_rec.parent_delivery_detail_id;
11234     IF p_old_delivery_detail_rec.wda_type = 'C' THEN
11235        l_delivery_assignments_info.type := 'O';
11236        l_delivery_assignments_info.parent_delivery_detail_id := NULL;
11237     END IF;
11238   ELSE
11239     l_delivery_assignments_info.delivery_id := NULL;
11240     l_delivery_assignments_info.parent_delivery_detail_id := NULL;
11241   END IF;
11242 
11243   l_delivery_assignments_info.delivery_detail_id := l_new_delivery_detail_id;
11244   --
11245   IF l_debug_on THEN
11246       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.CREATE_DELIVERY_ASSIGNMENTS',WSH_DEBUG_SV.C_PROC_LEVEL);
11247   END IF;
11248   --
11249   wsh_delivery_details_pkg.create_delivery_assignments(
11250       l_delivery_assignments_info,
11251       assignment_rowid,
11252       l_delivery_assignment_id,
11253       l_cr_assg_status
11254       );
11255 
11256   -- Bug 3724578 : Return back to the caller if any error occurs
11257   --              while creating the delivery detail assignments
11258   --- Message will be set in  create_delivery_assignments
11259   IF l_cr_assg_status IN ( WSH_UTIL_CORE.G_RET_STS_ERROR,
11260                           WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
11261                         ) THEN
11262      x_return_status := l_cr_assg_status;
11263     return;
11264   END IF;
11265 
11266   -- K: MDC: We need to create consolidation records if necessary.
11267 
11268   IF (p_unassign_flag = 'N') AND (p_old_delivery_detail_rec.wda_type = 'C') THEN
11269 
11270       l_delivery_assignments_info.parent_delivery_id := p_old_delivery_detail_rec.parent_delivery_id;
11271       l_delivery_assignments_info.parent_delivery_detail_id := p_old_delivery_detail_rec.parent_delivery_detail_id;
11272       l_delivery_assignments_info.type := 'C';
11273 
11274       wsh_delivery_details_pkg.create_delivery_assignments(
11275       l_delivery_assignments_info,
11276       assignment_rowid,
11277       l_delivery_assignment_id,
11278       l_cr_assg_status
11279       );
11280 
11281       IF l_cr_assg_status IN ( WSH_UTIL_CORE.G_RET_STS_ERROR,
11282                           WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
11283                         ) THEN
11284          x_return_status := l_cr_assg_status;
11285          return;
11286       END IF;
11287 
11288   END IF;
11289 
11290 
11291 
11292 /*2442099*/
11293   Log_Exceptions(p_old_delivery_detail_rec.delivery_detail_id,l_new_delivery_detail_id,l_delivery_assignments_info.delivery_id,l_action);
11294 
11295   /* NC - Added the following for OPM  BUG#1675561 */
11296   /* LG BUG#:2005977 */
11297   /* LG new */
11298 
11299 /* HW OPMCONV - Removed branching
11300   /* Bug 2177410, also update net_weight and volume of original delivery detail
11301    because non item does not use WSH_WV_UTILS.Detail_Weight_Volume to
11302    adjust the net_weight and volume  */
11303 
11304   x_split_detail_id := l_new_delivery_detail_id;
11305 
11306   IF l_debug_on THEN
11307      WSH_DEBUG_SV.logmsg(l_module_name, 'Before Update wsh_delivery_details');
11308      WSH_DEBUG_SV.log(l_module_name, 'serial_number',l_updated_delivery_detail_rec.serial_number);
11309      WSH_DEBUG_SV.log(l_module_name, 'to_serial_number',l_updated_delivery_detail_rec.to_serial_number);
11310      WSH_DEBUG_SV.log(l_module_name, 'transaction_temp_id',l_updated_delivery_detail_rec.transaction_temp_id);
11311      WSH_DEBUG_SV.log(l_module_name, ' l_original_req_qty ',l_original_req_qty);
11312      WSH_DEBUG_SV.log(l_module_name, ' l_original_req_qty2 ',l_original_req_qty2);
11313      WSH_DEBUG_SV.log(l_module_name, ' l_original_picked_qty ',l_original_picked_qty);
11314      WSH_DEBUG_SV.log(l_module_name, ' l_original_picked_qty2 ',l_original_picked_qty2);
11315      WSH_DEBUG_SV.log(l_module_name, ' l_original_shipped_qty ',l_original_shipped_qty);
11316      WSH_DEBUG_SV.log(l_module_name, ' l_original_shipped_qty2 ',l_original_shipped_qty2);
11317      WSH_DEBUG_SV.log(l_module_name, ' l_original_recvd_qty ',l_original_recvd_qty);
11318      WSH_DEBUG_SV.log(l_module_name, ' l_original_recvd_qty2 ',l_original_recvd_qty2);--
11319      WSH_DEBUG_SV.log(l_module_name, ' l_original_rtv_qty ',l_original_rtv_qty);
11320      WSH_DEBUG_SV.log(l_module_name, ' l_original_rtv_qty2 ',l_original_rtv_qty2);
11321      WSH_DEBUG_SV.log(l_module_name, ' l_original_cc_qty ',l_original_cc_qty);
11322      WSH_DEBUG_SV.log(l_module_name, ' l_original_cc_qty2 ',l_original_cc_qty2);
11323   END IF;
11324 
11325   UPDATE wsh_delivery_details
11326   SET requested_quantity    = l_original_req_qty,    -- J-IB-NPARIKH, GREATEST(requested_quantity - l_delivery_details_info.requested_quantity, 0),
11327       requested_quantity2   = l_original_req_qty2,    -- J-IB-NPARIKH, GREATEST(requested_quantity2 - l_qty2, 0),
11328       picked_quantity      = l_original_picked_qty,    -- J-IB-NPARIKH, picked_quantity - p_quantity_to_split,
11329       picked_quantity2    = l_original_picked_qty2,    -- J-IB-NPARIKH, picked_quantity2 - nvl(l_qty2,l_new_pick_qty2),
11330     shipped_quantity    = l_original_shipped_qty,
11331     shipped_quantity2  = l_original_shipped_qty2,
11332       received_quantity    = l_original_recvd_qty,   -- J-IB-NPARIKH
11333       received_quantity2  = l_original_recvd_qty2,       -- J-IB-NPARIKH
11334       --returned_quantity    = l_original_rtv_qty,   -- J-IB-NPARIKH
11335       --returned_quantity2  = l_original_rtv_qty2,       -- J-IB-NPARIKH
11336     cycle_count_quantity  = l_original_cc_qty,
11337     cycle_count_quantity2 = l_original_cc_qty2,
11338     serial_number  = decode(l_updated_delivery_detail_rec.serial_number,FND_API.G_MISS_CHAR,NULL,
11339                                           NULL,serial_number,l_updated_delivery_detail_rec.serial_number),
11340     to_serial_number  = decode(l_updated_delivery_detail_rec.to_serial_number,FND_API.G_MISS_CHAR,NULL,
11341                                           NULL,to_serial_number,l_updated_delivery_detail_rec.to_serial_number),
11342     transaction_temp_id  = decode(l_updated_delivery_detail_rec.transaction_temp_id, FND_API.G_MISS_NUM,NULL,
11343                                           NULL,transaction_temp_id,l_updated_delivery_detail_rec.transaction_temp_id),
11344 -- J: W/V Changes
11345     gross_weight          =  gross_weight - l_total_gross_wt,
11346     net_weight            =  net_weight - l_total_net_wt,
11347     volume                =  volume - l_total_vol,
11348 -- End J: W/V Changes
11349     last_update_date   = SYSDATE,
11350     last_updated_by = FND_GLOBAL.USER_ID,
11351     last_update_login  = FND_GLOBAL.LOGIN_ID
11352   WHERE delivery_detail_id = p_old_delivery_detail_rec.delivery_detail_id;
11353 
11354   -- DBI Project
11355   -- Update of wsh_delivery_details where requested_quantity/released_status
11356   -- are changed, call DBI API after the update.
11357   -- This API will also check for DBI Installed or not
11358   IF l_debug_on THEN
11359     WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail id-',p_old_delivery_detail_rec.delivery_detail_id);
11360   END IF;
11361   l_detail_tab(1) := p_old_delivery_detail_rec.delivery_detail_id;
11362   WSH_INTEGRATION.DBI_Update_Detail_Log
11363     (p_delivery_detail_id_tab => l_detail_tab,
11364      p_dml_type               => 'UPDATE',
11365      x_return_status          => l_dbi_rs);
11366 
11367   IF l_debug_on THEN
11368     WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
11369   END IF;
11370   IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
11371     x_return_status := l_dbi_rs;
11372     -- just pass this return status to caller API
11373     IF l_debug_on THEN
11374       WSH_DEBUG_SV.pop(l_module_name);
11375     END IF;
11376     return;
11377   END IF;
11378   -- End of Code for DBI Project
11379   --
11380   -- bug # 7580785 : W/V should be populated on delivery.
11381   IF l_debug_on THEN
11382       WSH_DEBUG_SV.log(l_module_name, 'l_upd_wv_on_split_stg_dd',l_upd_wv_on_split_stg_dd);
11383   END IF;
11384   IF (l_upd_wv_on_split_stg_dd = 'Y') THEN
11385   --{
11386       IF l_debug_on THEN
11387           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
11388       END IF;
11389       WSH_WV_UTILS.DD_WV_Post_Process(
11390           p_delivery_detail_id  => l_new_delivery_detail_id,
11391           p_diff_gross_wt       => l_split_weight,
11392           p_diff_net_wt         => l_split_weight,
11393           p_diff_fill_volume    => NULL,
11394           p_diff_volume         => l_split_volume,
11395           x_return_status       => l_split_return_status);
11396       IF (l_split_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
11397           RAISE new_det_wt_vol_failed;
11398       END IF;
11399   --}
11400   END IF;
11401   -- Bug # 7580785 : end
11402   --
11403   -- J: W/V Changes
11404   -- Decrement the DD W/V from parent if p_unassign_flag is 'Y'
11405   IF (p_unassign_flag = 'Y') THEN
11406     IF l_debug_on THEN
11407         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
11408     END IF;
11409     --
11410     WSH_WV_UTILS.DD_WV_Post_Process(
11411           p_delivery_detail_id => p_old_delivery_detail_rec.delivery_detail_id,
11412           p_diff_gross_wt      => -1 * l_total_gross_wt,
11413           p_diff_net_wt        => -1 * l_total_net_wt,
11414           p_diff_fill_volume   => -1 * l_total_vol,
11415           x_return_status      => l_return_status);
11416 
11417     IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
11418          --
11419          x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11420          WSH_UTIL_CORE.Add_Message(x_return_status);
11421          IF l_debug_on THEN
11422              WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
11423              WSH_DEBUG_SV.pop(l_module_name);
11424          END IF;
11425          return;
11426     END IF;
11427   END IF;
11428 
11429 --
11430 IF l_debug_on THEN
11431     WSH_DEBUG_SV.pop(l_module_name);
11432 END IF;
11433 --
11434   EXCEPTION
11435 -- HW OPMCONV. Removed OPM exception
11436 
11437   WHEN old_det_wt_vol_failed THEN
11438     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11439     fnd_message.set_name('WSH', 'WSH_DET_WT_VOL_FAILED');
11440     FND_MESSAGE.SET_TOKEN('DETAIL_ID',  p_old_delivery_detail_rec.delivery_detail_id);
11441     wsh_util_core.add_message(x_return_status,l_module_name);
11442     --
11443     IF l_debug_on THEN
11444         WSH_DEBUG_SV.logmsg(l_module_name,'OLD_DET_WT_VOL_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
11445         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OLD_DET_WT_VOL_FAILED');
11446     END IF;
11447     --
11448   WHEN new_det_wt_vol_failed THEN
11449     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11450     fnd_message.set_name('WSH', 'WSH_DET_WT_VOL_FAILED');
11451     FND_MESSAGE.SET_TOKEN('DETAIL_ID',  l_new_DELIVERY_DETAIL_ID);
11452     wsh_util_core.add_message(x_return_status,l_module_name);
11453     --
11454     IF l_debug_on THEN
11455         WSH_DEBUG_SV.logmsg(l_module_name,'NEW_DET_WT_VOL_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
11456         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:NEW_DET_WT_VOL_FAILED');
11457     END IF;
11458     --
11459   WHEN WSH_SN_SPLIT_ERR THEN
11460     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11461     fnd_message.set_name('WSH', 'WSH_SN_SPLIT_ERR');
11462     wsh_util_core.add_message(x_return_status,l_module_name);
11463     --
11464     IF l_debug_on THEN
11465         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_SN_SPLIT_ERR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
11466         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_SN_SPLIT_ERR');
11467     END IF;
11468     --
11469   WHEN WSH_CREATE_DET_ERR THEN
11470     x_return_status := l_cr_dt_status;
11471     IF l_debug_on THEN
11472         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_SN_SPLIT_ERR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
11473         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_CREATE_DET_ERR');
11474     END IF;
11475 
11476         WHEN others THEN
11477                 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11478                 wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DETAIL_INT',l_module_name);
11479                 --
11480                 IF l_debug_on THEN
11481                     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11482                     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11483                 END IF;
11484                 --
11485 END SPLIT_DETAIL_INT;
11486 
11487 /*****************************************************
11488 -----   SPLIT_SERIAL_NUMBERS_INT api
11489 *****************************************************/
11490 
11491 PROCEDURE Split_Serial_Numbers_INT(
11492   x_old_detail_rec      IN OUT  NOCOPY  SplitDetailRecType,
11493     x_new_delivery_detail_rec IN OUT  NOCOPY  WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type,
11494     p_old_shipped_quantity  IN    NUMBER,
11495     p_new_shipped_quantity  IN    NUMBER,
11496     x_return_status      OUT NOCOPY      VARCHAR2) IS
11497 
11498   l_ser_qty  NUMBER;
11499 
11500   l_real_serial_prefix WSH_DELIVERY_DETAILS.SERIAL_NUMBER%TYPE;
11501   l_prefix_length   NUMBER;
11502   l_fm_numeric     NUMBER;
11503   l_to_numeric     NUMBER;
11504   l_range_count   NUMBER;
11505   l_qty_to_split     NUMBER;
11506   l_new_sn       WSH_DELIVERY_DETAILS.SERIAL_NUMBER%TYPE;
11507   l_new_to_sn     WSH_DELIVERY_DETAILS.TO_SERIAL_NUMBER%TYPE;
11508   l_old_to_sn     WSH_DELIVERY_DETAILS.TO_SERIAL_NUMBER%TYPE;
11509   l_transaction_temp_id  NUMBER := NULL;
11510   l_success             NUMBER;
11511 
11512 -- Bug 3782838
11513   CURSOR  c_sn_ranges(x_tt_id IN NUMBER) IS
11514   SELECT  msnt.rowid,
11515           msnt.transaction_temp_id,
11516           msnt.fm_serial_number,
11517           msnt.to_serial_number,
11518           msnt.attribute_category,
11519           msnt.attribute1,
11520           msnt.attribute2,
11521           msnt.attribute3,
11522           msnt.attribute4,
11523           msnt.attribute5,
11524           msnt.attribute6,
11525           msnt.attribute7,
11526           msnt.attribute8,
11527           msnt.attribute9,
11528           msnt.attribute10,
11529           msnt.attribute11,
11530           msnt.attribute12,
11531           msnt.attribute13,
11532           msnt.attribute14,
11533           msnt.attribute15,
11534           msnt.dff_updated_flag
11535   FROM  mtl_serial_numbers_temp msnt
11536   WHERE   msnt.transaction_temp_id = x_tt_id
11537   ORDER BY  msnt.fm_serial_number DESC;
11538 
11539   CURSOR c_temp_id IS
11540   select mtl_material_transactions_s.nextval
11541   from dual;
11542 
11543 --
11544 l_debug_on BOOLEAN;
11545 --
11546 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'SPLIT_SERIAL_NUMBERS_INT';
11547 --
11548 BEGIN
11549 
11550   --
11551   --
11552   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
11553   --
11554   IF l_debug_on IS NULL
11555   THEN
11556       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
11557   END IF;
11558   --
11559   IF l_debug_on THEN
11560       WSH_DEBUG_SV.push(l_module_name);
11561       --
11562       WSH_DEBUG_SV.log(l_module_name,'P_OLD_SHIPPED_QUANTITY',P_OLD_SHIPPED_QUANTITY);
11563       WSH_DEBUG_SV.log(l_module_name,'P_NEW_SHIPPED_QUANTITY',P_NEW_SHIPPED_QUANTITY);
11564       WSH_DEBUG_SV.log(l_module_name,'old serial_number',
11565                                        x_old_detail_rec.serial_number);
11566       WSH_DEBUG_SV.log(l_module_name,'old to_serial_number',
11567                                        x_old_detail_rec.to_serial_number);
11568       WSH_DEBUG_SV.log(l_module_name,'old transaction_temp_id',
11569                                        x_old_detail_rec.transaction_temp_id);
11570       WSH_DEBUG_SV.log(l_module_name,'old shipped_quantity',
11571                                        x_old_detail_rec.shipped_quantity);
11572       WSH_DEBUG_SV.log(l_module_name,'old delivery_detail_id',
11573                                        x_old_detail_rec.delivery_detail_id);
11574       WSH_DEBUG_SV.log(l_module_name,'old organization_id',
11575                                        x_old_detail_rec.organization_id);
11576       WSH_DEBUG_SV.log(l_module_name,'old inventory_item_id',
11577                                        x_old_detail_rec.inventory_item_id);
11578 
11579   END IF;
11580   --
11581   IF p_old_shipped_quantity = 0 THEN
11582   -- new delivery line has the full shipped quantity and gets all serial number info
11583 
11584   x_new_delivery_detail_rec.serial_number     := x_old_detail_rec.serial_number;
11585   x_new_delivery_detail_rec.to_serial_number  := x_old_detail_rec.to_serial_number;
11586   x_new_delivery_detail_rec.transaction_temp_id := x_old_detail_rec.transaction_temp_id;
11587 
11588   x_old_detail_rec.serial_number     := FND_API.G_MISS_CHAR;
11589   x_old_detail_rec.to_serial_number  :=  FND_API.G_MISS_CHAR;
11590   x_old_detail_rec.transaction_temp_id := FND_API.G_MISS_NUM;
11591 
11592   ELSIF p_old_shipped_quantity < x_old_detail_rec.shipped_quantity THEN
11593   -- we are reducing old shipped quantity
11594 
11595   IF x_old_detail_rec.transaction_temp_id IS NULL THEN
11596 
11597     IF x_old_detail_rec.to_serial_number IS NOT NULL THEN
11598 
11599     -- we have one range SERIAL_NUMBER - TO_SERIAL_NUMBER to split
11600     l_real_serial_prefix := RTRIM(x_old_detail_rec.serial_number,
11601                     '0123456789');
11602     l_prefix_length   := NVL(LENGTH(l_real_serial_prefix), 0);
11603     l_fm_numeric     := TO_NUMBER(SUBSTR(x_old_detail_rec.serial_number,
11604                        l_prefix_length + 1));
11605     l_to_numeric     := TO_NUMBER(SUBSTR(x_old_detail_rec.to_serial_number,
11606                          l_prefix_length + 1));
11607     l_range_count   := l_to_numeric - l_fm_numeric + 1;
11608 
11609     IF l_range_count > p_old_shipped_quantity THEN
11610       -- we need to split the serial number range.
11611       l_qty_to_split   := l_range_count - p_old_shipped_quantity;
11612 
11613       l_new_to_sn := x_old_detail_rec.to_serial_number;
11614       l_old_to_sn := l_real_serial_prefix
11615              || LPAD(TO_CHAR(l_to_numeric-l_qty_to_split),
11616                 LENGTH(x_old_detail_rec.serial_number) - l_prefix_length,
11617                 '0');
11618 
11619       l_new_sn  := l_real_serial_prefix
11620              || LPAD(TO_CHAR(l_to_numeric-l_qty_to_split+1),
11621                 LENGTH(x_old_detail_rec.serial_number) - l_prefix_length,
11622                 '0');
11623 
11624       -- compress range of same serial numbers to individual serial number
11625       IF l_old_to_sn = x_old_detail_rec.serial_number THEN
11626       l_old_to_sn :=  FND_API.G_MISS_CHAR;
11627       END IF;
11628       IF l_new_to_sn = l_new_sn THEN
11629       l_new_to_sn :=  FND_API.G_MISS_CHAR;
11630       END IF;
11631 
11632       x_old_detail_rec.to_serial_number     := l_old_to_sn;
11633       x_new_delivery_detail_rec.serial_number := l_new_sn;
11634       x_new_delivery_detail_rec.to_serial_number := l_new_to_sn;
11635 
11636     END IF;  -- l_range_count > p_old_shipped_quantity
11637                 IF l_debug_on THEN
11638                    WSH_DEBUG_SV.log(l_module_name,'serial_number',
11639                                       x_new_delivery_detail_rec.serial_number);
11640                    WSH_DEBUG_SV.log(l_module_name,'to_serial_number',
11641                                     x_new_delivery_detail_rec.to_serial_number);
11642                 END IF;
11643 
11644     END IF; -- x_old_detail_rec.to_serail_number IS NULL
11645 
11646   ELSE
11647 
11648     -- we have at least one record in MTL_SERIAL_NUMBERS_TEMP
11649     --
11650     IF l_debug_on THEN
11651         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_INV.GET_SERIAL_QTY',WSH_DEBUG_SV.C_PROC_LEVEL);
11652     END IF;
11653     --
11654     l_ser_qty := WSH_DELIVERY_DETAILS_INV.Get_Serial_Qty(
11655             p_organization_id => x_old_detail_rec.organization_id,
11656             p_delivery_detail_id => x_old_detail_rec.delivery_detail_id);
11657     l_qty_to_split := l_ser_qty - p_old_shipped_quantity;
11658     --
11659     IF l_debug_on THEN
11660       WSH_DEBUG_SV.log(l_module_name,'L_QTY_TO_SPLIT',l_qty_to_split);
11661     END IF;
11662     --
11663 
11664     IF l_qty_to_split >= 1 THEN
11665 
11666     IF p_new_shipped_quantity >= 1 THEN  -- Bug 3782838, Generate id for Single also
11667     --IF l_qty_to_split > 1 THEN
11668       -- more than one serial number, we need new transaction_temp_id
11669       OPEN  c_temp_id;
11670       FETCH c_temp_id INTO   l_transaction_temp_id;
11671       IF  c_temp_id%NOTFOUND THEN
11672       CLOSE c_temp_id;
11673       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11674       --
11675       IF l_debug_on THEN
11676           WSH_DEBUG_SV.log(l_module_name,'Return Status is error',x_return_status);
11677           WSH_DEBUG_SV.pop(l_module_name);
11678       END IF;
11679       --
11680       return;
11681       END IF;
11682       CLOSE c_temp_id;
11683                   IF l_debug_on THEN
11684                      WSH_DEBUG_SV.log(l_module_name,'l_transaction_temp_id',
11685                                                      l_transaction_temp_id);
11686                   END IF;
11687     END IF;
11688     x_new_delivery_detail_rec.transaction_temp_id := nvl(l_transaction_temp_id,FND_API.G_MISS_NUM);
11689 
11690     FOR c IN c_sn_ranges(x_old_detail_rec.transaction_temp_id) LOOP
11691 
11692       -- Bug 3782838 : Retain transaction_temp_id for single serial number
11693       IF (l_qty_to_split <= 0) THEN
11694         EXIT;  -- finished with splitting serial numbers
11695       END IF;
11696                   IF l_debug_on THEN
11697                      WSH_DEBUG_SV.log(l_module_name,'c.to_serial_number',
11698                                                          c.to_serial_number);
11699                      WSH_DEBUG_SV.log(l_module_name,'c.fm_serial_number',
11700                                                          c.fm_serial_number);
11701                   END IF;
11702 
11703       -- OR condition added for bug 4424259, making l_range_count = 1 if from and to serial numbers are same.
11704       IF c.to_serial_number IS NULL  OR ( c.fm_serial_number = c.to_serial_number ) THEN
11705       l_range_count := 1;
11706       ELSE
11707       -- serial number range
11708       l_real_serial_prefix := RTRIM(c.fm_serial_number,
11709                      '0123456789');
11710       l_prefix_length   := NVL(LENGTH(l_real_serial_prefix), 0);
11711       l_fm_numeric     := TO_NUMBER(SUBSTR(c.fm_serial_number,
11712                         l_prefix_length + 1));
11713       l_to_numeric     := TO_NUMBER(SUBSTR(c.to_serial_number,
11714                         l_prefix_length + 1));
11715       l_range_count   := l_to_numeric - l_fm_numeric + 1;
11716       END IF; -- c.to_serial_number IS NULL
11717                   IF l_debug_on THEN
11718                      WSH_DEBUG_SV.log(l_module_name,'l_range_count',
11719                                                         l_range_count);
11720                      WSH_DEBUG_SV.log(l_module_name,'l_qty_to_split',
11721                                                         l_qty_to_split);
11722                   END IF;
11723 
11724       IF l_range_count > l_qty_to_split THEN
11725 
11726       l_new_to_sn := c.to_serial_number;
11727       l_old_to_sn := l_real_serial_prefix
11728                || LPAD(TO_CHAR(l_to_numeric-l_qty_to_split),
11729                   LENGTH(c.fm_serial_number) - l_prefix_length,
11730                   '0');
11731       l_new_sn  := l_real_serial_prefix
11732                || LPAD(TO_CHAR(l_to_numeric-l_qty_to_split+1),
11733                   LENGTH(c.fm_serial_number) - l_prefix_length,
11734                   '0');
11735 
11736       IF p_old_shipped_quantity >= 1 THEN
11737         -- Bug 3782838 : Retain id for single serial number
11738         -- update record only if old delivery line still has at least 1 to ship.
11739         IF l_debug_on THEN
11740           WSH_DEBUG_SV.log(l_module_name,'l_old_to_sn',l_old_to_sn);
11741         END IF;
11742         UPDATE mtl_serial_numbers_temp
11743         SET  to_serial_number = l_old_to_sn,
11744             serial_prefix    = TO_CHAR(l_range_count - l_qty_to_split),
11745             last_update_date  = SYSDATE,
11746           last_updated_by  = FND_GLOBAL.USER_ID,
11747           last_update_login   = FND_GLOBAL.LOGIN_ID
11748         WHERE  rowid = c.rowid;
11749       END IF;
11750       IF l_debug_on THEN
11751         WSH_DEBUG_SV.log(l_module_name,
11752                          'inserting into mtl_serial_numbers_temp'
11753                         ,l_transaction_temp_id);
11754       END IF;
11755 
11756 -- Changes for 3782838
11757       IF l_transaction_temp_id IS NOT NULL THEN
11758         INSERT INTO mtl_serial_numbers_temp
11759           (TRANSACTION_TEMP_ID,
11760            LAST_UPDATE_DATE,
11761            LAST_UPDATED_BY,
11762            LAST_UPDATE_LOGIN,
11763            CREATION_DATE,
11764            CREATED_BY,
11765            FM_SERIAL_NUMBER,
11766            TO_SERIAL_NUMBER,
11767            SERIAL_PREFIX,
11768            ATTRIBUTE_CATEGORY,
11769            ATTRIBUTE1,
11770            ATTRIBUTE2,
11771            ATTRIBUTE3,
11772            ATTRIBUTE4,
11773            ATTRIBUTE5,
11774            ATTRIBUTE6,
11775            ATTRIBUTE7,
11776            ATTRIBUTE8,
11777            ATTRIBUTE9,
11778            ATTRIBUTE10,
11779            ATTRIBUTE11,
11780            ATTRIBUTE12,
11781            ATTRIBUTE13,
11782            ATTRIBUTE14,
11783            ATTRIBUTE15,
11784            DFF_UPDATED_FLAG)
11785           VALUES
11786           (l_transaction_temp_id,
11787            SYSDATE,
11788            FND_GLOBAL.USER_ID,
11789            FND_GLOBAL.LOGIN_ID,
11790            SYSDATE,
11791            FND_GLOBAL.USER_ID,
11792            l_new_sn,
11793            l_new_to_sn,
11794            TO_CHAR(l_qty_to_split),
11795            c.attribute_category,
11796            c.attribute1,
11797            c.attribute2,
11798            c.attribute3,
11799            c.attribute4,
11800            c.attribute5,
11801            c.attribute6,
11802            c.attribute7,
11803            c.attribute8,
11804            c.attribute9,
11805            c.attribute10,
11806            c.attribute11,
11807            c.attribute12,
11808            c.attribute13,
11809            c.attribute14,
11810            c.attribute15,
11811            c.dff_updated_flag
11812            );
11813 -- End of changes for 3782838
11814 
11815                         -- bug 2740681
11816                               IF l_debug_on THEN
11817                                WSH_DEBUG_SV.logmsg(l_module_name,'Before Calling  Serial_Check.Inv_Unmark_Serial');
11818                                WSH_DEBUG_SV.log(l_module_name,'l_new_sn,l_new_to_sn,inventory_item_id', l_new_sn
11819                                                               ||','||l_new_to_sn
11820                                                               ||','||x_old_detail_rec.inventory_item_id);
11821                               END IF;
11822                               Serial_Check.Inv_Unmark_Serial(
11823                                 l_new_sn,
11824                                 l_new_to_sn,
11825                                 NULL,
11826                                 NULL,
11827                                 NULL,
11828                                 NULL,
11829                                 x_old_detail_rec.inventory_item_id);
11830 
11831                               IF l_debug_on THEN
11832                                WSH_DEBUG_SV.logmsg(l_module_name,'After Calling  Serial_Check.Inv_Unmark_Serial');
11833                               END IF;
11834                               IF l_debug_on THEN
11835                                WSH_DEBUG_SV.logmsg(l_module_name,'Before Calling  Serial_Check.Inv_mark_Serial');
11836                                WSH_DEBUG_SV.log(l_module_name,'l_new_sn',l_new_sn);
11837                                WSH_DEBUG_SV.log(l_module_name,'l_new_to_sn',l_new_to_sn);
11838                                WSH_DEBUG_SV.log(l_module_name,'inventory_item_id',x_old_detail_rec.inventory_item_id);
11839                                WSH_DEBUG_SV.log(l_module_name,'organization_id',x_old_detail_rec.organization_id);
11840                                WSH_DEBUG_SV.log(l_module_name,'source_header_id',x_old_detail_rec.source_header_id);
11841                                WSH_DEBUG_SV.log(l_module_name,'l_transaction_temp_id',l_transaction_temp_id);
11842                                WSH_DEBUG_SV.log(l_module_name,'source_line_id',x_old_detail_rec.source_line_id);
11843                               END IF;
11844                               --RTV Changes
11845                               IF x_old_detail_rec.source_code = 'RTV' THEN
11846                                 Serial_Check.Inv_Mark_Serial(
11847                                   l_new_sn,
11848                                   l_new_to_sn,
11849                                   x_old_detail_rec.inventory_item_id,
11850                                   x_old_detail_rec.organization_id,
11851                                   x_old_detail_rec.source_header_id,
11852                                   l_transaction_temp_id,
11853                                   x_old_detail_rec.source_line_id,
11854                                   l_success);
11855                                 IF l_debug_on THEN
11856                                  WSH_DEBUG_SV.log(l_module_name,'After Serial_Check.Inv_mark_Serial l_success',l_success);
11857                                 END IF;
11858                               ELSE
11859                                 Serial_Check.Inv_Mark_Serial(
11860                                   l_new_sn,
11861                                   l_new_to_sn,
11862                                   x_old_detail_rec.inventory_item_id,
11863                                   x_old_detail_rec.organization_id,
11864                                   l_transaction_temp_id,
11865                                   l_transaction_temp_id,
11866                                   l_transaction_temp_id,
11867                                   l_success);
11868                                 IF l_debug_on THEN
11869                                  WSH_DEBUG_SV.log(l_module_name,'After Serial_Check.Inv_mark_Serial l_success',l_success);
11870                                 END IF;
11871                               END IF;
11872                               --RTV Changes
11873                               IF l_success < 0 THEN
11874                                  FND_MESSAGE.SET_NAME('WSH','WSH_SER_RANGE_MK_ERROR');
11875                                  FND_MESSAGE.SET_TOKEN('FM_SERIAL',l_new_sn);
11876                                  FND_MESSAGE.SET_TOKEN('TO_SERIAL',l_new_to_sn);
11877                                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11878                                  WSH_UTIL_CORE.Add_Message(x_return_status);
11879                               END IF;
11880                         -- bug 2740681
11881 
11882       ELSE
11883         x_new_delivery_detail_rec.serial_number := c.to_serial_number;
11884       END IF;
11885 
11886       l_qty_to_split := 0;
11887 
11888                         IF l_debug_on THEN
11889                            WSH_DEBUG_SV.log(l_module_name,'new serial_number',
11890                                       x_new_delivery_detail_rec.serial_number);
11891                         END IF;
11892       ELSE
11893                        IF l_debug_on THEN
11894                          WSH_DEBUG_SV.logmsg(l_module_name,'Split qty is grater than range');
11895                        END IF;
11896 
11897       IF l_transaction_temp_id IS NOT NULL THEN
11898                           IF l_debug_on THEN
11899                              WSH_DEBUG_SV.log(l_module_name,
11900                                'Updating mtl_serial_numbers_temp',
11901                                 l_transaction_temp_id);
11902                           END IF;
11903         -- we need to assign the full serial number range to the new line
11904         UPDATE mtl_serial_numbers_temp
11905         SET  transaction_temp_id = l_transaction_temp_id,
11906           last_update_date  = SYSDATE,
11907           last_updated_by  = FND_GLOBAL.USER_ID,
11908           last_update_login   = FND_GLOBAL.LOGIN_ID
11909         WHERE  rowid = c.rowid;
11910 
11911                           --Bug 2740681
11912                              IF l_debug_on THEN
11913                                WSH_DEBUG_SV.logmsg(l_module_name,'Before Calling  Serial_Check.Inv_Unmark_Serial');
11914                                WSH_DEBUG_SV.log(l_module_name,'fm_serial_number,to_serial_number,inventory_item_id', c.fm_serial_number ||','||c.to_serial_number ||','||x_old_detail_rec.inventory_item_id);
11915                              END IF;
11916                              Serial_Check.Inv_Unmark_Serial(
11917                                 c.fm_serial_number,
11918                                 c.to_serial_number,
11919                                 NULL,
11920                                 NULL,
11921                                 NULL,
11922                                 NULL,
11923                                 x_old_detail_rec.inventory_item_id);
11924                               IF l_debug_on THEN
11925                                WSH_DEBUG_SV.logmsg(l_module_name,'After Calling  Serial_Check.Inv_Unmark_Serial');
11926                               END IF;
11927                               IF l_debug_on THEN
11928                                WSH_DEBUG_SV.logmsg(l_module_name,'Before Calling  Serial_Check.Inv_mark_Serial');
11929                                WSH_DEBUG_SV.log(l_module_name,'fm_serial_number',c.fm_serial_number);
11930                                WSH_DEBUG_SV.log(l_module_name,'to_serial_number',c.to_serial_number);
11931                                WSH_DEBUG_SV.log(l_module_name,'inventory_item_id',x_old_detail_rec.inventory_item_id);
11932                                WSH_DEBUG_SV.log(l_module_name,'organization_id',x_old_detail_rec.organization_id);
11933                                WSH_DEBUG_SV.log(l_module_name,'source_header_id',x_old_detail_rec.source_header_id);
11934                                WSH_DEBUG_SV.log(l_module_name,'l_transaction_temp_id',l_transaction_temp_id);
11935                                WSH_DEBUG_SV.log(l_module_name,'source_line_id',x_old_detail_rec.source_line_id);
11936                               END IF;
11937                               --RTV Changes
11938                               IF x_old_detail_rec.source_code = 'RTV' THEN
11939                                 Serial_Check.Inv_Mark_Serial(
11940                                   c.fm_serial_number,
11941                                   c.to_serial_number,
11942                                   x_old_detail_rec.inventory_item_id,
11943                                   x_old_detail_rec.organization_id,
11944                                   x_old_detail_rec.source_header_id,
11945                                   l_transaction_temp_id,
11946                                   x_old_detail_rec.source_line_id,
11947                                   l_success);
11948                                 IF l_debug_on THEN
11949                                  WSH_DEBUG_SV.log(l_module_name,'After Serial_Check.Inv_mark_Serial l_success',l_success);
11950                                 END IF;
11951                               ELSE
11952                                 Serial_Check.Inv_Mark_Serial(
11953                                   c.fm_serial_number,
11954                                   c.to_serial_number,
11955                                   x_old_detail_rec.inventory_item_id,
11956                                   x_old_detail_rec.organization_id,
11957                                   l_transaction_temp_id,
11958                                   l_transaction_temp_id,
11959                                   l_transaction_temp_id,
11960                                   l_success);
11961                                 IF l_debug_on THEN
11962                                  WSH_DEBUG_SV.log(l_module_name,'After Serial_Check.Inv_mark_Serial l_success',l_success);
11963                                 END IF;
11964                               END IF;
11965                               --RTV changes
11966                               IF l_success < 0 THEN
11967                                  FND_MESSAGE.SET_NAME('WSH','WSH_SER_RANGE_MK_ERROR');
11968                                  FND_MESSAGE.SET_TOKEN('FM_SERIAL', c.fm_serial_number);
11969                                  FND_MESSAGE.SET_TOKEN('TO_SERIAL', c.to_serial_number);
11970                                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11971                                  WSH_UTIL_CORE.Add_Message(x_return_status);
11972                               END IF;
11973                           --bug 2740681
11974       ELSE
11975         -- we need to remove this serial number range (which has count of 1)
11976         x_new_delivery_detail_rec.serial_number := c.fm_serial_number;
11977         DELETE mtl_serial_numbers_temp
11978         WHERE  rowid = c.rowid;
11979       END IF;
11980 
11981       l_qty_to_split := l_qty_to_split - l_range_count;
11982 
11983       END IF; -- l_range_count > l_qty_to_split
11984                   IF l_debug_on THEN
11985                      WSH_DEBUG_SV.log(l_module_name,'l_qty_to_split',
11986                                                    l_qty_to_split);
11987                   END IF;
11988 
11989       IF (l_qty_to_split <= 0) AND (p_old_shipped_quantity > 1) THEN
11990       -- finished with splitting serial numbers
11991       EXIT;
11992       END IF;
11993 
11994     END LOOP;  -- c_sn_ranges
11995 
11996     END IF; -- l_qty_to_split >= 1
11997 
11998   END IF;  -- x_old_detail_rec.transaction_temp_id IS NULL
11999 
12000   END IF;  -- p_old_shipped_quantity < x_old_detail_rec.shipped_quantity
12001 
12002 --
12003 IF l_debug_on THEN
12004     WSH_DEBUG_SV.pop(l_module_name);
12005 END IF;
12006 --
12007   EXCEPTION
12008   WHEN others THEN
12009   x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12010   wsh_util_core.default_handler('WSH_USA_ACTIONS_PVT.SPLIT_SERIAL_NUMBERS_INT',l_module_name);
12011 
12012 --
12013 IF l_debug_on THEN
12014     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12015     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12016 END IF;
12017 --
12018 END Split_Serial_Numbers_INT;
12019 
12020 -- THIS PROCEDURE IS OBSOLETE
12021 --
12022 -- Name
12023 --   Explode_Delivery_Details
12024 -- Purpose
12025 --   Takes individual lines FROM MTL_SERIAL_NUMBERS_TEMP that
12026 --   are under serial number control and explodes them into multiple
12027 --   lines based on the serial numbers entered.
12028 --
12029 --   Bug 1752809: rewritten to explode into serial number ranges.
12030 --        This improves interface performance by minimizing
12031 --        number of delivery lines needed to interface serial numbers.
12032 --
12033 -- Arguments
12034 --   P_Delivery_Detail_Id FOR which IS under Serial number
12035 --   control and hence must do the explosion
12036 --   P_Return_Status
12037 --
12038 --
12039 PROCEDURE EXPLODE_DELIVERY_DETAILS(
12040   p_delivery_detail_id number,
12041   x_return_status out NOCOPY  varchar2)
12042 IS
12043 
12044 l_debug_on BOOLEAN;
12045 --
12046 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'EXPLODE_DELIVERY_DETAILS';
12047 --
12048 BEGIN
12049   --
12050   --
12051   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12052   --
12053   --
12054 END explode_delivery_Details;
12055 
12056 
12057 /*
12058 REM This API will unassign a line ( delivery_detail or container) from the Delivery and unapck it.
12059 REM If the unpack results in the container ( holding the line/container) becoming empty
12060 REM then it would unpack the container and unassign it from Delivery too.
12061 REM the unpack/unassign is done recursively, till all empty containers resulting from the initial
12062 REM unpacked line are unassigned/unpacked.
12063 REM If there is an empty container already packed inside another container, and did not
12064 REM become empty because of the current line was unpacked, those containers are left
12065 REM packed/assigned to the Delivery.
12066 */
12067 PROCEDURE unassign_unpack_empty_cont (
12068                                 p_ids_tobe_unassigned IN wsh_util_core.id_tab_type,
12069                                 p_validate_flag   IN VARCHAR2,
12070                                 x_return_status   OUT NOCOPY  VARCHAR2
12071                               )
12072 IS
12073 
12074 CURSOR get_container(detail_id NUMBER) IS
12075 SELECT  parent_delivery_detail_id,
12076         delivery_id     -- Bug#3542095
12077 FROM    wsh_delivery_assignments_v
12078 WHERE   delivery_detail_id = detail_id;
12079 
12080 CURSOR get_lines (cont_id NUMBER, detail_id NUMBER) IS
12081 SELECT delivery_detail_id
12082 FROM   wsh_delivery_assignments_v
12083 WHERE  parent_delivery_detail_id = cont_id
12084 AND    delivery_detail_id <> detail_id;
12085 
12086 l_parent_container_id   wsh_util_core.id_tab_type ;
12087 l_delivery_id           wsh_delivery_assignments_v.delivery_id%type;
12088 l_return_status         VARCHAR2(1):=NULL ;
12089 l_line_id               NUMBER := NULL;
12090 
12091 -- K LPN CONV. rv
12092 l_lpn_in_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_in_rec_type;
12093 l_lpn_out_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_out_rec_type;
12094 l_msg_count NUMBER;
12095 l_msg_data VARCHAR2(32767);
12096 e_return_excp EXCEPTION;
12097 
12098 cursor l_get_cnt_org_csr(p_detail_id IN NUMBER) is
12099 select organization_id,
12100        nvl(line_direction,'O')
12101 from   wsh_delivery_details
12102 where  delivery_detail_id = p_detail_id;
12103 
12104 l_orgn_id NUMBER;
12105 l_line_dir VARCHAR2(10);
12106 l_wms_org VARCHAR2(10) := 'N';
12107 -- K LPN CONV. rv
12108 
12109 --
12110 l_debug_on BOOLEAN;
12111 --
12112 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_UNPACK_EMPTY_CONT';
12113 --
12114 
12115 BEGIN
12116 
12117   --
12118   --
12119   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12120   --
12121   IF l_debug_on IS NULL
12122   THEN
12123       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12124   END IF;
12125   --
12126   IF l_debug_on THEN
12127      WSH_DEBUG_SV.push(l_module_name);
12128      --
12129      WSH_DEBUG_SV.log(l_module_name,'P_VALIDATE_FLAG',P_VALIDATE_FLAG);
12130   END IF;
12131 
12132   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12133 
12134   IF ( p_ids_tobe_unassigned.COUNT = 0 ) THEN
12135       --
12136       IF l_debug_on THEN
12137          WSH_DEBUG_SV.pop(l_module_name);
12138       END IF;
12139       --
12140      RETURN;
12141   END IF;
12142 
12143   FOR i in 1..p_ids_tobe_unassigned.COUNT LOOP
12144      IF l_debug_on THEN
12145         WSH_DEBUG_SV.log(l_module_name,'detail to be unassigned ',p_ids_tobe_unassigned(i));
12146      END IF;
12147      -- Get the parent container, if it exists
12148      OPEN get_container(p_ids_tobe_unassigned(i));
12149      FETCH get_container
12150      INTO l_parent_container_id(1)
12151           , l_delivery_id; -- Bug#3542095
12152      IF get_container%NOTFOUND THEN
12153         l_parent_container_id(1) := NULL;
12154      END IF;
12155      CLOSE get_container;
12156 
12157      IF l_debug_on THEN
12158         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_DETAIL_FROM_DELIVERY',WSH_DEBUG_SV.C_PROC_LEVEL);
12159      END IF;
12160 
12161      -- Unassign the Line or Container
12162      -- because this
12163      wsh_delivery_details_actions.unassign_detail_from_delivery(
12164                                     p_detail_id          => p_ids_tobe_unassigned(i),
12165                                     p_validate_flag      => p_validate_flag,
12166                                     x_return_status      => l_return_status
12167                                     );
12168 
12169      --
12170      IF l_debug_on THEN
12171         WSH_DEBUG_SV.log(l_module_name, 'AFTER CALLING UNASSIGN_DETAIL_FROM_DELIVERY: ', L_RETURN_STATUS);
12172      END IF;
12173      --
12174      -- Check if the Parent Container is empty, if yes, recursivelly call this API
12175      IF ( l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS ) THEN
12176         FND_MESSAGE.SET_NAME('WSH','WSH_DEL_UNASSIGN_DET_ERROR');
12177         FND_MESSAGE.SET_TOKEN('DEL_NAME',wsh_new_deliveries_pvt.get_name(l_delivery_id)); -- Bug#3542095
12178         FND_MESSAGE.SET_TOKEN('DET_NAME',p_ids_tobe_unassigned(i));
12179         x_return_status := l_return_status;
12180         WSH_UTIL_CORE.ADD_MESSAGE(x_return_status,l_module_name);
12181         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12182            --
12183            --IF l_debug_on THEN
12184               --WSH_DEBUG_SV.pop(l_module_name);
12185            --END IF;
12186            --
12187            --RETURN; LPN CONV. rv
12188            raise e_return_excp; -- LPN CONV. rv
12189         END IF;
12190      END IF;
12191 
12192      IF l_parent_container_id(1) IS NOT NULL THEN
12193         OPEN get_lines(l_parent_container_id(1), p_ids_tobe_unassigned(i));
12194         FETCH get_lines INTO l_line_id;
12195         IF get_lines%NOTFOUND THEN
12196            l_line_id := NULL;
12197         END IF;
12198         CLOSE get_lines;
12199 
12200         IF l_debug_on THEN
12201            WSH_DEBUG_SV.log(l_module_name, 'L_LINE_ID ', L_LINE_ID);
12202         END IF;
12203 
12204         IF l_line_id IS NULL THEN
12205            IF l_debug_on THEN
12206                WSH_DEBUG_SV.log(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_UNPACK_EMPTY_CONT
12207                                                recursively for ',l_parent_container_id(1));
12208            END IF;
12209 
12210            -- lpn conv
12211            -- This needs to be done so that the WMS enabled LPNs that become empty
12212            -- need to be deleted at a later stage through Confirm_Delivery
12213            open  l_get_cnt_org_csr(l_parent_container_id(1));
12214            fetch l_get_cnt_org_csr into l_orgn_id, l_line_dir;
12215            close l_get_cnt_org_csr;
12216            l_wms_org := wsh_util_validate.check_wms_org(l_orgn_id);
12217            IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
12218            AND l_line_dir IN ('O', 'IO')
12219            AND l_wms_org = 'Y' THEN
12220            --{
12221                insert into wsh_wms_sync_tmp
12222                       (delivery_detail_id,
12223                        operation_type,
12224                        creation_date)
12225                values (l_parent_container_id(1),
12226                        'DELETE',
12227                        WSH_WMS_LPN_GRP.G_HW_TIME_STAMP);
12228            --}
12229            END IF;
12230            -- lpn conv
12231 
12232            unassign_unpack_empty_cont ( p_ids_tobe_unassigned => l_parent_container_id,
12233                                         p_validate_flag   => p_validate_flag,
12234                                         x_return_status   => l_return_status);
12235            IF l_debug_on THEN
12236               WSH_DEBUG_SV.log(l_module_name, 'After calling UNASSIGN_UNPACK_EMPTY_CONT: ', L_RETURN_STATUS);
12237            END IF;
12238            IF ( l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS ) THEN
12239               IF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12240                     x_return_status := l_return_status ;
12241               ELSIF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
12242                     x_return_status := l_return_status ;
12243               END IF;
12244            END IF;
12245            IF x_return_status IN ( WSH_UTIL_CORE.G_RET_STS_ERROR,WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ) THEN
12246               --IF l_debug_on THEN
12247                  --WSH_DEBUG_SV.pop(l_module_name);
12248               --END IF;
12249               --RETURN; LPN CONV. rv
12250               raise e_return_excp; -- LPN CONV. rv
12251            END IF;
12252         END IF; -- end of l_line_id is null
12253 
12254      END IF;
12255 
12256   END LOOP;
12257 
12258   --
12259   -- K LPN CONV. rv
12260   --
12261   IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
12262   THEN
12263   --{
12264       IF l_debug_on THEN
12265         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
12266       END IF;
12267 
12268       WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
12269         (
12270           p_in_rec             => l_lpn_in_sync_comm_rec,
12271           x_return_status      => l_return_status,
12272           x_out_rec            => l_lpn_out_sync_comm_rec
12273         );
12274       --
12275       --
12276       IF l_debug_on THEN
12277         WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
12278       END IF;
12279       --
12280       --
12281       IF ( l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS ) THEN
12282         IF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12283           x_return_status := l_return_status ;
12284         ELSIF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) and x_return_status <> WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
12285           x_return_status := l_return_status ;
12286         END IF;
12287       END IF;
12288 
12289   --}
12290   END IF;
12291   --
12292   -- K LPN CONV. rv
12293   --
12294   -- Added a pop as it was missing.
12295   IF l_debug_on THEN
12296     WSH_DEBUG_SV.pop(l_module_name);
12297   END IF;
12298 
12299 EXCEPTION
12300   WHEN e_return_excp THEN
12301           --
12302           -- K LPN CONV. rv
12303           --
12304           IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
12305           THEN
12306           --{
12307               IF l_debug_on THEN
12308                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
12309               END IF;
12310 
12311               WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
12312                 (
12313                   p_in_rec             => l_lpn_in_sync_comm_rec,
12314                   x_return_status      => l_return_status,
12315                   x_out_rec            => l_lpn_out_sync_comm_rec
12316                 );
12317               --
12318               --
12319               IF l_debug_on THEN
12320                 WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
12321               END IF;
12322               --
12323               --
12324               IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR,WSH_UTIL_CORE.G_RET_STS_ERROR) AND x_return_status <> WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
12325                 x_return_status := l_return_status;
12326               END IF;
12327               --
12328           --}
12329           END IF;
12330           --
12331           -- K LPN CONV. rv
12332           --
12333           IF l_debug_on THEN
12334             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:e_return_excp');
12335           END IF;
12336 
12337   WHEN OTHERS THEN
12338        wsh_util_core.default_handler('WSH_NEW_DELIVERY_ACTIONS.unassign_unpack_empty_cont');
12339        x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12340   --
12341   IF l_debug_on THEN
12342      WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12343   END IF;
12344   --
12345       --
12346       -- K LPN CONV. rv
12347       --
12348       IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
12349       THEN
12350       --{
12351           IF l_debug_on THEN
12352             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
12353           END IF;
12354 
12355           WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
12356             (
12357               p_in_rec             => l_lpn_in_sync_comm_rec,
12358               x_return_status      => l_return_status,
12359               x_out_rec            => l_lpn_out_sync_comm_rec
12360             );
12361           --
12362           --
12363           IF l_debug_on THEN
12364             WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
12365           END IF;
12366           --
12367           --
12368       --}
12369       END IF;
12370       --
12371       -- K LPN CONV. rv
12372       --
12373   --
12374   -- Debug Statements
12375   --
12376   IF l_debug_on THEN
12377      WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12378   END IF;
12379   --
12380 
12381 END unassign_unpack_empty_cont;
12382 
12383 /*2442099*/
12384 
12385 PROCEDURE Log_Exceptions(p_old_delivery_detail_id IN NUMBER,
12386                          p_new_delivery_detail_id IN NUMBER,
12387                          p_delivery_id            IN NUMBER,
12388                          p_action                 IN VARCHAR2 DEFAULT NULL)
12389 
12390 IS
12391 
12392 cursor parent_del_exception is
12393 --Changed for BUG#3330869
12394 --SELECT *
12395 SELECT  message,
12396 	exception_name,
12397 	trip_id,
12398 	trip_name,
12399 	trip_stop_id,
12400 	delivery_id,
12401 	delivery_name,
12402 	delivery_assignment_id,
12403 	container_name,
12404 	inventory_item_id,
12405 	lot_number,
12406 -- HW OPMCONV - No need for sublot_number
12407 --      sublot_number,
12408 	revision,
12409 	serial_number,
12410 	unit_of_measure,
12411 	unit_of_measure2,
12412 	subinventory,
12413 	locator_id,
12414 	arrival_date,
12415 	departure_date,
12416 	error_message,
12417         attribute_category,
12418         attribute1,
12419         attribute2,
12420         attribute3,
12421         attribute4,
12422         attribute5,
12423         attribute6,
12424         attribute7,
12425         attribute8,
12426         attribute9,
12427         attribute10,
12428         attribute11,
12429         attribute12,
12430 	attribute13,
12431         attribute14,
12432         attribute15,
12433 	request_id,
12434 	logged_at_location_id,
12435 	logging_entity,
12436 	logging_entity_id,
12437 	exception_location_id,
12438 	manually_logged,
12439 	batch_id,
12440         status
12441 --select *
12442 from wsh_exceptions
12443 where delivery_detail_id = p_old_delivery_detail_id;
12444 
12445 l_exception_return_status               VARCHAR2(30);
12446 l_exception_msg_count                   NUMBER;
12447 l_exception_msg_data                    VARCHAR2(4000) := NULL;
12448 l_dummy_exception_id                    NUMBER;
12449 l_exception_error_message               VARCHAR2(2000) := NULL;
12450 l_qty1                                  NUMBER;
12451 l_qty2                                  NUMBER;
12452 l_trip_id                               NUMBER;
12453 l_trip_name                             VARCHAR2(30);
12454 l_trip_stop_id                          NUMBER;
12455 l_delivery_id                           NUMBER;
12456 l_delivery_name                         VARCHAR2(30);
12457 l_departure_date                        DATE;
12458 l_arrival_date                          DATE;
12459 --
12460 l_debug_on BOOLEAN;
12461 --
12462 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'Log_Exceptions';
12463 --
12464 
12465 BEGIN
12466   --
12467   --
12468   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12469   --
12470   IF l_debug_on IS NULL THEN
12471         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12472   END IF;
12473   --
12474   IF l_debug_on THEN
12475   WSH_DEBUG_SV.push(l_module_name);
12476   --
12477   WSH_DEBUG_SV.log(l_module_name,'P_OLD_DELIVERY_DETAIL_ID',P_OLD_DELIVERY_DETAIL_ID);
12478   WSH_DEBUG_SV.log(l_module_name,'P_NEW_DELIVERY_DETAIL_ID',P_NEW_DELIVERY_DETAIL_ID);
12479   WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
12480   --
12481   END IF;
12482 
12483   select requested_quantity,requested_quantity2 into l_qty1,l_qty2
12484   from wsh_delivery_details
12485   where delivery_detail_id = p_new_delivery_detail_id;
12486 
12487   IF l_debug_on THEN
12488                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_XC_UTIL.LOG_EXCEPTION',WSH_DEBUG_SV.C_PROC_LEVEL);
12489   END IF;
12490   --
12491         FOR pexceptions in parent_del_exception
12492         LOOP
12493         IF p_delivery_id is NOT NULL THEN
12494                 l_trip_id := pexceptions.trip_id;
12495                 l_trip_name := pexceptions.trip_name;
12496                 l_trip_stop_id := pexceptions.trip_stop_id;
12497                 l_delivery_id := pexceptions.delivery_id;
12498                 l_delivery_name := pexceptions.delivery_name;
12499                 l_departure_date := pexceptions.departure_date;
12500                 l_arrival_date := pexceptions.arrival_date;
12501         ELSE
12502                 l_trip_id := NULL;
12503                 l_trip_name := NULL;
12504                 l_trip_stop_id := NULL;
12505                 l_delivery_id := NULL;
12506                 l_delivery_name := NULL;
12507                 l_departure_date := NULL;
12508                 l_arrival_date := NULL;
12509         END IF;
12510 
12511         -- Bug 4481016,During Split, Exceptions will not be updated
12512         -- To ensure exceptions are logged against split delivery detail, its required
12513         -- to pass null to l_dummy_exception_id which is used to determine, when to INSERT
12514         -- and when to UPDATE exceptions
12515         IF l_debug_on THEN
12516           WSH_DEBUG_SV.log(l_module_name,'EXCEPTION NAME-',pexceptions.exception_name);
12517           WSH_DEBUG_SV.log(l_module_name,'p_action -',p_action);
12518 
12519         END IF;
12520 
12521         l_dummy_exception_id := NULL;
12522 
12523         wsh_xc_util.log_exception(
12524                       p_api_version             => 1.0,
12525                       x_return_status           => l_exception_return_status,
12526                       x_msg_count               => l_exception_msg_count,
12527                       x_msg_data                => l_exception_msg_data,
12528                       x_exception_id            => l_dummy_exception_id ,
12529                       p_exception_location_id   => pexceptions.exception_location_id,
12530                       p_logged_at_location_id   => pexceptions.logged_at_location_id,
12531                       p_logging_entity          => pexceptions.logging_entity,
12532                       p_logging_entity_id       => pexceptions.logging_entity_id,
12533                       p_exception_name          => pexceptions.exception_name,
12534                       p_message                 => pexceptions.message,
12535 --                      p_severity                => pexceptions.severity,
12536                       p_manually_logged         => pexceptions.manually_logged,
12537 --                      p_exception_handling      => pexceptions.status,
12538                       p_trip_id                 => l_trip_id,
12539                       p_trip_name               => l_trip_name,
12540                       p_trip_stop_id            => l_trip_stop_id,
12541                       p_delivery_id             => l_delivery_id,
12542                       p_delivery_name           => l_delivery_name,
12543                       p_delivery_detail_id      => p_new_delivery_detail_id,
12544                       p_delivery_assignment_id  => pexceptions.delivery_assignment_id,
12545                       p_container_name          => pexceptions.container_name,
12546                       p_inventory_item_id       => pexceptions.inventory_item_id,
12547                       p_lot_number              => pexceptions.lot_number,
12548 -- HW OPMCONV - No need for sublot_number
12549 --                    p_sublot_number           => pexceptions.sublot_number,
12550                       p_revision                => pexceptions.revision,
12551                       p_serial_number           => pexceptions.serial_number,
12552                       p_unit_of_measure         => pexceptions.unit_of_measure,
12553                       p_quantity                => l_qty1,
12554                       p_unit_of_measure2        => pexceptions.unit_of_measure2,
12555                       p_quantity2               => l_qty2,
12556                       p_subinventory            => pexceptions.subinventory,
12557                       p_locator_id              => pexceptions.locator_id,
12558                       p_arrival_date            => l_arrival_date,
12559                       p_departure_date          => l_departure_date,
12560                       p_error_message           => pexceptions.error_message,
12561                       p_attribute_category      => pexceptions.attribute_category,
12562                       p_attribute1              => pexceptions.attribute1,
12563                       p_attribute2              => pexceptions.attribute2,
12564                       p_attribute3              => pexceptions.attribute3,
12565                       p_attribute4              => pexceptions.attribute4,
12566                       p_attribute5              => pexceptions.attribute5,
12567                       p_attribute6              => pexceptions.attribute6,
12568                       p_attribute7              => pexceptions.attribute7,
12569                       p_attribute8              => pexceptions.attribute8,
12570                       p_attribute9              => pexceptions.attribute9,
12571                       p_attribute10             => pexceptions.attribute10,
12572                       p_attribute11             => pexceptions.attribute11,
12573                       p_attribute12             => pexceptions.attribute12,
12574                       p_attribute13             => pexceptions.attribute13,
12575                       p_attribute14             => pexceptions.attribute14,
12576                       p_attribute15             => pexceptions.attribute15,
12577                       p_request_id              => pexceptions.request_id,
12578                       p_batch_id                => pexceptions.batch_id,
12579                       p_status                  => pexceptions.status,
12580                       p_action                  => p_action);
12581 
12582         END LOOP;
12583         IF (l_exception_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
12584         --
12585         -- Debug Statements
12586         --
12587         IF l_debug_on THEN
12588                 WSH_DEBUG_SV.logmsg(l_module_name,  'WSH_XC_UTIL.LOG_EXCEPTION DID NOTRETURN SUCCESS'  );
12589         END IF;
12590         --
12591         END IF;
12592 
12593   IF l_debug_on THEN
12594         WSH_DEBUG_SV.pop(l_module_name);
12595   END IF;
12596 
12597 EXCEPTION
12598   WHEN OTHERS THEN
12599   IF l_debug_on THEN
12600     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12601                 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12602   END IF;
12603 
12604 END Log_Exceptions;
12605 /*2442099*/
12606 
12607 --  Procedure:      Consolidate_Source_Line
12608 --
12609 --  Parameters: p_Cons_Source_Line_Rec_Tab  -> List of delivery details and its corresponding req qtys,
12610 --		 			       bo qtys, source line ids and delivery ids.
12611 --		x_consolidate_ids     ->  Contains the list of existing BO dd_ids, into which the dd_ids passed
12612 --					  in the parameter p_Cons_Source_Line_Rec_Tab got consolidated.
12613 --
12614 --  Description:    This is an internal API.
12615 --                  Consolidates all the unpacked and unassigned back order delivery detail lines
12616 --                  into one delivery detail Line for the given source_line_id. x_consolidate_ids(i)
12617 --                  contains final consolidated delivery detail id corresponding to the ith record
12618 --                  in p_Cons_Source_Line_Rec_Tab.
12619 --
12620 -- HW OPM BUG#:3121616 added requested_quantity2
12621 PROCEDURE Consolidate_Source_Line(
12622     p_Cons_Source_Line_Rec_Tab  IN           WSH_DELIVERY_DETAILS_ACTIONS.Cons_Source_Line_Rec_Tab,
12623     x_consolidate_ids           OUT  NOCOPY  WSH_UTIL_CORE.Id_Tab_Type,
12624     x_return_status             OUT  NOCOPY  VARCHAR2 ) IS
12625 
12626 CURSOR get_bo_dds_cur(p_delivery_detail_id IN NUMBER, p_source_line_id IN NUMBER,p_delivery_id IN NUMBER) is
12627 SELECT  wdd.delivery_detail_id, wdd.requested_quantity,wdd.requested_quantity2
12628 FROM  wsh_delivery_details wdd,
12629       wsh_delivery_assignments_v wda
12630 WHERE     wdd.source_line_id = p_source_line_id
12631 AND       wdd.delivery_detail_id <> p_delivery_detail_id
12632 AND       wdd.released_status = 'B'
12633 AND       wdd.replenishment_status IS NULL --bug# 6749200 (replenishment project)
12634 AND       wdd.delivery_detail_id = wda.delivery_detail_id
12635 AND       wdd.container_flag = 'N'
12636 AND	  wdd.source_code = 'OE'    -- Enables the Consolidation ONLY for the lines imported from Order Management.
12637 AND       (( wda.delivery_id is NULL AND wda.parent_delivery_detail_id is NULL )
12638               OR ( wda.delivery_id = nvl(p_delivery_id,-99)))
12639 FOR UPDATE NOWAIT;
12640 
12641 CURSOR get_line_info_cur(p_line_id IN NUMBER) is
12642 SELECT shipping_instructions,
12643        packing_instructions
12644 FROM oe_order_lines_all
12645 WHERE line_id = p_line_id;
12646 
12647 
12648 -- Tables to store delivery detail id's
12649 
12650 l_cons_dd_ids		       WSH_UTIL_CORE.Id_Tab_Type; -- To store the final delivery details
12651 l_cons_qtys                    WSH_UTIL_CORE.Id_Tab_Type;
12652 -- HW OPM BUG#:3121616 added qty2s
12653 l_cons_qty2s                   WSH_UTIL_CORE.Id_Tab_Type;
12654 l_partial_dd_ids               WSH_UTIL_CORE.Id_Tab_Type; -- To store partial Back Order Del Det
12655 l_partial_org_req_qtys         WSH_UTIL_CORE.Id_Tab_Type;
12656 l_partial_req_qtys             WSH_UTIL_CORE.Id_Tab_Type;
12657 -- HW OPM BUG#:3121616 added qty2s
12658 l_partial_req_qty2s            WSH_UTIL_CORE.Id_Tab_Type;
12659 l_delete_dd_ids                WSH_UTIL_CORE.Id_Tab_Type; -- To store the Del Det to be deleted
12660 -- Bug#3399109 :Changed the Data Type from Id_Tab_Type to tbl_varchar
12661 l_ship_instructions            WSH_UTIL_CORE.tbl_varchar; -- To store shipping instructions
12662 l_pack_instructions            WSH_UTIL_CORE.tbl_varchar; -- To store packing instructions
12663 
12664 
12665 
12666 l_del_det_Id                        NUMBER;
12667 l_req_qty                           NUMBER;
12668 -- HW OPM BUG#:3121616 added qty2s
12669 l_req_qty2                          NUMBER;
12670 l_total_req_qty                     NUMBER := 0;
12671 -- HW OPM BUG#:3121616 added qty2s
12672 l_total_req_qty2                    NUMBER := 0;
12673 l_temp_cnt                          NUMBER;
12674 
12675 
12676 l_user_id                   NUMBER;
12677 l_login_id                  NUMBER;
12678 l_return_status             VARCHAR2(30);
12679 -- J: W/V Changes
12680 l_tmp_weight                NUMBER;
12681 l_tmp_volume                NUMBER;
12682 l_new_gross_wt              NUMBER;
12683 l_new_net_wt                NUMBER;
12684 l_new_vol                   NUMBER;
12685 l_gross_weight              NUMBER;
12686 l_net_weight                NUMBER;
12687 l_volume                    NUMBER;
12688 l_wv_frozen_flag            VARCHAR2(1);
12689 
12690 l_dbi_rs                    VARCHAR2(1); -- Return Status from DBI API
12691 l_dd_txn_id    NUMBER;
12692 l_txn_return_status  VARCHAR2(1);
12693 
12694 -- muom
12695 l_fulfill_base varchar2(1);
12696 
12697 --
12698 l_debug_on BOOLEAN;
12699 --
12700 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'CONSOLIDATE_SOURCE_LINE';
12701 --
12702 
12703 BEGIN
12704   --
12705   -- Debug Statements
12706   --
12707   --
12708   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12709   --
12710   IF l_debug_on IS NULL  THEN
12711 
12712      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12713   END IF;
12714   --
12715   IF l_debug_on THEN
12716 
12717   WSH_DEBUG_SV.push(l_module_name);
12718   END IF;
12719   --
12720 
12721   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12722   l_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12723   l_user_id  := FND_GLOBAL.user_id;
12724   l_login_id := FND_GLOBAL.login_id;
12725 
12726   FOR i IN 1..p_Cons_Source_Line_Rec_Tab.count  --{ Looping thru' the input params
12727   LOOP
12728     --
12729     -- Debug Statements
12730     --
12731     IF l_debug_on THEN
12732        WSH_DEBUG_SV.log(l_module_name,'********* Processing the Delivery Detail Id:',p_Cons_Source_Line_Rec_Tab(i).delivery_detail_id);
12733     END IF;
12734     --
12735     l_temp_cnt := l_delete_dd_ids.COUNT;
12736     l_total_req_qty   := 0;
12737 
12738     OPEN get_bo_dds_cur(p_Cons_Source_Line_Rec_Tab(i).delivery_detail_id,p_Cons_Source_Line_Rec_Tab(i).source_line_id,p_Cons_Source_Line_Rec_Tab(i).delivery_id);
12739 
12740     LOOP  --{  Fetch all the unassigned unpacked  Backordered  Delivery Details for the same source line id
12741 
12742    -- HW OPM BUG#:3121616 added qty2
12743       FETCH get_bo_dds_cur INTO l_del_det_Id,l_req_qty,l_req_qty2;
12744       EXIT WHEN (get_bo_dds_cur%NOTFOUND);
12745       --
12746       -- Debug Statements
12747       --
12748       IF l_debug_on THEN
12749          --
12750          WSH_DEBUG_SV.log(l_module_name,'Found Existing Back Order Del Det line: ',l_del_det_Id);
12751       END IF;
12752       --
12753       l_delete_dd_ids(l_delete_dd_ids.COUNT + 1) :=l_del_det_Id;
12754       l_total_req_qty := l_total_req_qty + l_req_qty;
12755 -- HW OPM BUG#:3121616 added qty2
12756       l_total_req_qty2 := l_total_req_qty2 + l_req_qty2;
12757 
12758     END LOOP; --} done fetching the existing unasssigned unpacked Backorder lines
12759     CLOSE get_bo_dds_cur;
12760 
12761     IF ( l_delete_dd_ids.COUNT > l_temp_cnt ) --{ Consolidation is possible or not
12762     THEN
12763        -- Use the last Deliver Detail found for the consolidation purpose, accordingly
12764        -- delete the delivery details id from l_delete_dd_ids table.
12765        l_cons_dd_ids (l_cons_dd_ids.COUNT + 1) := l_delete_dd_ids(l_delete_dd_ids.COUNT);
12766        l_delete_dd_ids.delete(l_delete_dd_ids.COUNT);
12767        l_cons_qtys(l_cons_qtys.COUNT + 1) := l_total_req_qty + p_Cons_Source_Line_Rec_Tab(i).bo_qty;
12768 -- HW OPM BUG#:3121616 added qty2s
12769        l_cons_qty2s(l_cons_qty2s.COUNT + 1) := l_total_req_qty2 + p_Cons_Source_Line_Rec_Tab(i).bo_qty2;
12770 -- end of 3121616
12771 
12772 
12773        --
12774        -- Debug Statements
12775        --
12776        IF l_debug_on THEN
12777            WSH_DEBUG_SV.log(l_module_name,'Consolidated Into Delivery Detail Id ',l_cons_dd_ids(l_cons_dd_ids.COUNT));
12778        END IF;
12779 
12780        -- Getting the shipping and packing instructions from the source line id. which are to be assigned
12781        -- to final delivery detail for the given source line id.
12782        open get_line_info_cur(p_Cons_Source_Line_Rec_Tab(i).source_line_id);
12783        fetch get_line_info_cur into l_ship_instructions(l_ship_instructions.COUNT + 1),l_pack_instructions(l_pack_instructions.COUNT + 1);
12784        close get_line_info_cur;
12785 
12786        -- muom
12787        l_fulfill_base := NVL(p_Cons_Source_Line_Rec_Tab(i).fulfillment_base,'P');
12788        IF l_debug_on THEN
12789          WSH_DEBUG_SV.logmsg(l_module_name,'Fulfillment Base is '||l_fulfill_base);
12790          WSH_DEBUG_SV.logmsg(l_module_name,'p_Cons_Source_Line_Rec_Tab(i).bo_qty '||p_Cons_Source_Line_Rec_Tab(i).bo_qty||' p_Cons_Source_Line_Rec_Tab(i).req_qty '||p_Cons_Source_Line_Rec_Tab(i).req_qty);
12791          WSH_DEBUG_SV.logmsg(l_module_name,'p_Cons_Source_Line_Rec_Tab(i).bo_qty2 '||p_Cons_Source_Line_Rec_Tab(i).bo_qty2||' p_Cons_Source_Line_Rec_Tab(i).req_qty2 '||p_Cons_Source_Line_Rec_Tab(i).req_qty2);
12792        END IF;
12793 
12794        --  Storing the final delivery detail id in the out parameter
12795        x_consolidate_ids(i):= l_cons_dd_ids(l_cons_dd_ids.COUNT);
12796 
12797        -- If it is partial back ordering then don't delete it, update the existing delivery detail
12798        -- Qty otherwise delete the delivery detail being processing.
12799        -- muom
12800        IF (l_fulfill_base = 'P' and p_Cons_Source_Line_Rec_Tab(i).bo_qty < p_Cons_Source_Line_Rec_Tab(i).req_qty) OR
12801           (l_fulfill_base = 'S' and p_Cons_Source_Line_Rec_Tab(i).bo_qty2 < p_Cons_Source_Line_Rec_Tab(i).req_qty2)
12802        THEN
12803           l_partial_dd_ids (l_partial_dd_ids.COUNT + 1) := p_Cons_Source_Line_Rec_Tab(i).delivery_detail_id;
12804           l_partial_org_req_qtys(l_partial_req_qtys.COUNT + 1) := p_Cons_Source_Line_Rec_Tab(i).req_qty;
12805           l_partial_req_qtys (l_partial_req_qtys.COUNT + 1) := p_Cons_Source_Line_Rec_Tab(i).req_qty - p_Cons_Source_Line_Rec_Tab(i).bo_qty;
12806           l_partial_req_qty2s (l_partial_req_qty2s.COUNT + 1) := p_Cons_Source_Line_Rec_Tab(i).req_qty2 - p_Cons_Source_Line_Rec_Tab(i).bo_qty2;
12807           --
12808           -- Debug Statements
12809           --
12810           IF l_debug_on THEN
12811              WSH_DEBUG_SV.log(l_module_name,'Updating Req Qty for the Del Det Id (Bo Qty < Req. Qty) ',l_partial_dd_ids (l_partial_dd_ids.COUNT));
12812           END IF;
12813           --
12814        ELSE
12815           l_delete_dd_ids(l_delete_dd_ids.COUNT+1):= p_Cons_Source_Line_Rec_Tab(i).delivery_detail_id;
12816           --
12817           -- Debug Statements
12818           --
12819           IF l_debug_on THEN
12820              WSH_DEBUG_SV.log(l_module_name,'Deleting the Del Det Id (Bo Qty = Req qty)',l_delete_dd_ids(l_delete_dd_ids.COUNT));
12821           END IF;
12822           --
12823       END IF; --} Is it Partial BO
12824    ELSE -- No consolidation if possible for the delivery Detail id
12825       --
12826       -- Debug Statements
12827       --
12828       IF l_debug_on THEN
12829          WSH_DEBUG_SV.log(l_module_name,'No Existing Back Order Del Det Lines found');
12830       END IF;
12831       --
12832       x_consolidate_ids (i) := p_Cons_Source_Line_Rec_Tab(i).delivery_detail_id;
12833    END IF; --} Check for existing back order lines
12834 
12835   END LOOP;  --} End of the Delivery Detail Table
12836 
12837   IF (get_bo_dds_cur%ISOPEN) THEN
12838       CLOSE get_bo_dds_cur;
12839   END IF;
12840 
12841 
12842   -- Handling the Tables created in the above process (BULK Collect)
12843   -- Deleting all the Delivery Detail in the Delete table
12844   FOR i IN 1..l_delete_dd_ids.COUNT
12845   LOOP  -- {
12846      -- deleting the delivery detail line
12847      --
12848      -- Debug Statements
12849      --
12850      IF l_debug_on THEN
12851         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.DELETE_DELIVERY_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
12852      END IF;
12853      --
12854      WSH_DELIVERY_DETAILS_PKG.Delete_Delivery_Details(
12855                     p_delivery_detail_id  => l_delete_dd_ids(i),
12856                     x_return_status       => l_return_status );
12857 
12858      --
12859      IF l_debug_on THEN
12860         WSH_DEBUG_SV.logmsg(l_module_name, 'After calling DELETE_DELIVERY_DETAILS: ' || l_return_status );
12861      END IF;
12862      --
12863      IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
12864         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12865      ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
12866         RAISE FND_API.G_EXC_ERROR;
12867      END IF;
12868 
12869   END LOOP; -- }
12870 
12871   IF l_debug_on THEN
12872     WSH_DEBUG_SV.log(l_module_name,'Updating details for consolidation.Detail Count-',l_cons_dd_ids.count);
12873   END IF;
12874   -- Updating the selected Delivery Details for the consolidation with corresponding total Qty
12875   FOR i IN 1..l_cons_dd_ids.COUNT LOOP
12876 	-- HW OPM BUG#:3121616 added qty2s
12877 	  UPDATE wsh_delivery_details
12878 	  SET requested_quantity  =  l_cons_qtys(i),
12879 	      requested_quantity2  = l_cons_qty2s(i),
12880 	     tracking_number     = null,
12881 	     master_container_item_id = null,
12882 	     detail_container_item_id = null,
12883 	     seal_code                = null,
12884 	     shipping_instructions    = l_ship_instructions(i),
12885 	     packing_instructions     =  l_pack_instructions(i)
12886 	  WHERE delivery_detail_id     = l_cons_dd_ids (i);
12887 
12888         WSH_DD_TXNS_PVT.create_dd_txn_from_dd  (p_delivery_detail_id => l_cons_dd_ids(i),
12889  										x_dd_txn_id => l_dd_txn_id,
12890  										x_return_status =>l_txn_return_status);
12891 
12892          IF (l_txn_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
12893                   x_return_status := l_txn_return_status;
12894                   RETURN;
12895         END IF;
12896    END LOOP;
12897 
12898   --
12899   -- DBI Project
12900   -- Update of wsh_delivery_details where requested_quantity/released_status
12901   -- are changed, call DBI API after the update.
12902   -- DBI API will check if DBI is installed
12903   IF l_debug_on THEN
12904     WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail Count-',l_cons_dd_ids.count);
12905   END IF;
12906   WSH_INTEGRATION.DBI_Update_Detail_Log
12907     (p_delivery_detail_id_tab => l_cons_dd_ids,
12908      p_dml_type               => 'UPDATE',
12909      x_return_status          => l_dbi_rs);
12910 
12911   IF l_debug_on THEN
12912     WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
12913   END IF;
12914   -- Only Handle Unexpected error
12915   IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
12916     --
12917     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12918   END IF;
12919   -- End of Code for DBI Project
12920   --
12921 
12922   -- Bug#3670261
12923   -- Deleting the Freight Costs associated with the delivery details selected for Consolidation
12924   FORALL i IN 1..l_cons_dd_ids.COUNT
12925   DELETE FROM WSH_FREIGHT_COSTS
12926   WHERE  delivery_detail_id = l_cons_dd_ids(i);
12927   IF l_debug_on THEN
12928       WSH_DEBUG_SV.log(l_module_name,'Freight Cost Rows deleted',SQL%ROWCOUNT);
12929   END IF;
12930 
12931   -- J: W/V Changes
12932   IF l_debug_on THEN
12933     WSH_DEBUG_SV.logmsg(l_module_name,'l_cons_dd_ids.COUNT '||l_cons_dd_ids.COUNT);
12934   END IF;
12935 
12936   IF l_cons_dd_ids.COUNT > 0 THEN
12937 
12938     FOR l_index in l_cons_dd_ids.FIRST..l_cons_dd_ids.LAST LOOP
12939 
12940       IF l_debug_on THEN
12941         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DETAIL_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
12942       END IF;
12943       --
12944       WSH_WV_UTILS.Detail_Weight_Volume(
12945         p_delivery_detail_id => l_cons_dd_ids(l_index),
12946         p_update_flag        => 'Y',
12947         p_post_process_flag  => 'Y',
12948         p_calc_wv_if_frozen  => 'Y',
12949         x_net_weight         => l_tmp_weight,
12950         x_volume             => l_tmp_volume,
12951         x_return_status      => l_return_status);
12952       IF l_debug_on THEN
12953         WSH_DEBUG_SV.log(l_module_name,'l_return_status',l_return_status);
12954       END IF;
12955       IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
12956         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12957       ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
12958         RAISE FND_API.G_EXC_ERROR;
12959       ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12960         x_return_status := l_return_status;
12961       END IF;
12962 
12963     END LOOP;
12964   END IF;
12965 
12966   IF l_debug_on THEN
12967     WSH_DEBUG_SV.log(l_module_name,'Updating partial bkorder cases.Detail Count-',l_partial_dd_ids.count);
12968   END IF;
12969   -- Updating the partial Back order cases. Qty should be subtracted for the partial case
12970   FORALL i IN 1..l_partial_dd_ids.COUNT
12971 -- HW OPM BUG#:3121616 added qty2s
12972   UPDATE wsh_delivery_details
12973   SET requested_quantity = l_partial_req_qtys(i),
12974       requested_quantity2 = l_partial_req_qty2s(i)
12975   WHERE delivery_detail_id = l_partial_dd_ids (i);
12976 
12977   --
12978   -- DBI Project
12979   -- Update of wsh_delivery_details where requested_quantity/released_status
12980   -- are changed, call DBI API after the update.
12981   -- DBI API will check if DBI is installed
12982   IF l_debug_on THEN
12983     WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail Count-',l_partial_dd_ids.count);
12984   END IF;
12985   WSH_INTEGRATION.DBI_Update_Detail_Log
12986     (p_delivery_detail_id_tab => l_partial_dd_ids,
12987      p_dml_type               => 'UPDATE',
12988      x_return_status          => l_dbi_rs);
12989 
12990   IF l_debug_on THEN
12991     WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
12992   END IF;
12993   -- Only Handle Unexpected error
12994   IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
12995     --
12996     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12997   END IF;
12998   -- End of Code for DBI Project
12999   --
13000 
13001   -- We need to adjust the W/V if DDs W/V is frozen
13002   IF l_partial_dd_ids.COUNT > 0 THEN
13003 
13004     IF l_debug_on THEN
13005       WSH_DEBUG_SV.logmsg(l_module_name,'l_partial_dd_ids.COUNT '||l_partial_dd_ids.COUNT);
13006     END IF;
13007 
13008     FOR l_index in l_partial_dd_ids.FIRST..l_partial_dd_ids.LAST LOOP
13009 
13010       SELECT gross_weight,
13011              net_weight,
13012              volume,
13013              nvl(wv_frozen_flag,'Y')
13014       INTO   l_gross_weight,
13015              l_net_weight,
13016              l_volume,
13017              l_wv_frozen_flag
13018       FROM   wsh_delivery_details
13019       WHERE  delivery_detail_id = l_partial_dd_ids(l_index);
13020 
13021       IF l_wv_frozen_flag = 'Y' THEN
13022 
13023         IF l_debug_on THEN
13024           WSH_DEBUG_SV.logmsg(l_module_name,'W/V Frozen flag is Y for DD '||l_partial_dd_ids(l_index));
13025         END IF;
13026 
13027         l_new_gross_wt := round(l_gross_weight * (l_partial_req_qtys(l_index)/l_partial_org_req_qtys(l_index)) ,5);
13028         l_new_net_wt   := round(l_net_weight * (l_partial_req_qtys(l_index)/l_partial_org_req_qtys(l_index)) ,5);
13029         l_new_vol      := round(l_volume * (l_partial_req_qtys(l_index)/l_partial_org_req_qtys(l_index)) ,5);
13030 
13031         IF l_debug_on THEN
13032           WSH_DEBUG_SV.logmsg(l_module_name,'Updating DD '||l_partial_dd_ids(l_index)||' with Gross '||l_new_gross_wt||' Net '||l_new_net_wt||' Vol '||l_new_vol);
13033         END IF;
13034 
13035         UPDATE wsh_delivery_details
13036         set    gross_weight = l_new_gross_wt,
13037                net_weight   = l_new_net_wt,
13038                volume       = l_new_vol
13039         WHERE  delivery_detail_id = l_partial_dd_ids(l_index);
13040 
13041         IF l_debug_on THEN
13042           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
13043         END IF;
13044 
13045         WSH_WV_UTILS.DD_WV_Post_Process(
13046           p_delivery_detail_id => l_partial_dd_ids(l_index),
13047           p_diff_gross_wt      => -1 * (l_gross_weight - l_new_gross_wt),
13048           p_diff_net_wt        => -1 * (l_net_weight - l_new_net_wt),
13049           p_diff_fill_volume   => -1 * (l_volume - l_new_vol),
13050           x_return_status      => l_return_status);
13051 
13052         IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
13053           --
13054            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13055            WSH_UTIL_CORE.Add_Message(x_return_status);
13056            IF l_debug_on THEN
13057              WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
13058              WSH_DEBUG_SV.pop(l_module_name);
13059            END IF;
13060            return;
13061         END IF;
13062 
13063       END IF;
13064     END LOOP;
13065   END IF;
13066 
13067   --
13068   -- Debug Statements
13069   --
13070   IF l_debug_on THEN
13071      WSH_DEBUG_SV.pop(l_module_name);
13072   END IF;
13073   --
13074   EXCEPTION
13075 
13076     WHEN FND_API.G_EXC_ERROR THEN
13077             x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13078 
13079             --
13080             IF l_debug_on THEN
13081               WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13082               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
13083             END IF;
13084             --
13085             return;
13086      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
13087             x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13088             --
13089             IF l_debug_on THEN
13090               WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_UNEXPECTED_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13091               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
13092             END IF;
13093             --
13094             return;
13095 
13096 
13097       WHEN OTHERS THEN
13098          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13099          WSH_UTIL_CORE.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.Consolidate_Source_Lines ' );
13100          --
13101          -- Debug Statements
13102          --
13103          IF l_debug_on THEN
13104             WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13105             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13106          END IF;
13107           --
13108 END Consolidate_Source_Line;
13109 
13110 
13111 --
13112 --  Procedure:   Process_Delivery_Details
13113 --  Parameters:
13114 --	p_delivery_detail_id:  delivery detail id need to be processed
13115 --	p_bo_qty	    :  backordered quantity to unreserve
13116 --	p_overpick_qty	    :  overpicked quantity to unreserve
13117 --	p_bo_mode	    :  either UNRESERVE/CYCLE_COUNT
13118 --	p_delete_flag	    :  'Y' will delete the delivery detail passed
13119 --			       'N' doesnot delete.
13120 --  Description: This procedure will do unreservation, unpack/unassign
13121 --  for the passed delivery detail id. It deletes the delivery detail
13122 --  if p_delete_flag is passed as 'Y'.
13123 --  Added this procedure as part of code changes for the Bug#3317692
13124 PROCEDURE Process_Delivery_Details (
13125  	p_delivery_detail_id	IN   NUMBER,
13126 	p_bo_qty		IN   NUMBER,
13127 	p_bo_qty2s		IN   NUMBER,
13128 	p_overpick_qty		IN   NUMBER,
13129         -- muom
13130 	p_overpick_qty2s        IN   NUMBER,
13131 	p_bo_mode		IN   VARCHAR2,
13132         p_delete_flag	        IN   VARCHAR2 DEFAULT NULL,
13133  	x_return_status		OUT  NOCOPY   VARCHAR2
13134 ) IS
13135 
13136 l_delivery_detail_ids		WSH_UTIL_CORE.Id_Tab_Type;
13137 l_idx				NUMBER;
13138 
13139 l_inventory_item_id     NUMBER   := NULL;
13140 l_organization_id       NUMBER   := NULL;
13141 l_subinventory          VARCHAR2(10) := NULL;
13142 l_serial_number         VARCHAR2(30) := NULL;
13143 l_transaction_temp_id   NUMBER   := NULL;
13144 l_inv_controls_rec      WSH_DELIVERY_DETAILS_INV.inv_control_flag_rec;
13145 l_return_status         VARCHAR2(5) := NULL;
13146 --Added for bug 10062808
13147    CURSOR c_detail(c_detail_id  NUMBER) IS
13148    SELECT organization_id,
13149           inventory_item_id,
13150           WSH_UTIL_CORE.Get_Line_Fulfillment_Base('OE',source_line_id) fulfillment_base
13151    FROM wsh_delivery_details
13152    WHERE delivery_detail_id = c_detail_id  AND
13153             NVL(container_flag, 'N') = 'N';
13154    l_qty_unres  NUMBER;
13155    l_item_info   WSH_DELIVERY_DETAILS_INV.mtl_system_items_rec;
13156    l_bo_mode  VARCHAR2(30);
13157    -- muom
13158    l_qty2_unres  NUMBER;
13159    l_fulfillment_base VARCHAR2(1);
13160 
13161 --
13162 l_debug_on BOOLEAN;
13163 --
13164 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'PROCESS_DELIVERY_DETAILS';
13165 --
13166 BEGIN
13167 	--
13168 	--
13169 	l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13170 	--
13171 	IF l_debug_on IS NULL
13172 	THEN
13173 	    l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13174 	END IF;
13175 	--
13176 	IF l_debug_on THEN
13177 	    WSH_DEBUG_SV.push(l_module_name);
13178 	    --
13179 	    WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_DETAIL_ID',p_delivery_detail_id);
13180 	    WSH_DEBUG_SV.log(l_module_name,'P_BO_QTY',p_bo_qty);
13181 	    WSH_DEBUG_SV.log(l_module_name,'P_OVERPICK_QTY',p_overpick_qty);
13182             -- muom
13183 	    WSH_DEBUG_SV.log(l_module_name,'P_BO_QTY2S',p_bo_qty2s);
13184 	    WSH_DEBUG_SV.log(l_module_name,'P_OVERPICK_QTY2S',p_overpick_qty2s);
13185 	    WSH_DEBUG_SV.log(l_module_name,'P_BO_MODE',P_BO_MODE);
13186 	    WSH_DEBUG_SV.log(l_module_name,'P_DELETE_FLAG',P_DELETE_FLAG);
13187 	END IF;
13188 	--
13189 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13190 
13191 	--
13192         -- Debug Statements
13193         --
13194         IF l_debug_on THEN
13195            WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.unassign_unpack_empty_cont',WSH_DEBUG_SV.C_PROC_LEVEL);
13196         END IF;
13197         --
13198 	l_delivery_detail_ids(1) := p_delivery_detail_id;
13199         IF (p_delete_flag = 'Y') THEN --{
13200 	        WSH_DELIVERY_DETAILS_ACTIONS.unassign_unpack_empty_cont (
13201 		               p_ids_tobe_unassigned  => l_delivery_detail_ids ,
13202                                p_validate_flag => 'N',
13203                                x_return_status   => l_return_status
13204                               );
13205 		IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
13206 			raise FND_API.G_EXC_ERROR;
13207 	        ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
13208 		        raise FND_API.G_EXC_UNEXPECTED_ERROR;
13209 	        END IF;
13210 	END IF; --}
13211     --Added for bug 10062808
13212            OPEN c_detail(p_delivery_detail_id );
13213            FETCH c_detail INTO l_organization_id,l_inventory_item_id,l_fulfillment_base; --muom
13214            CLOSE c_detail;
13215 
13216            WSH_DELIVERY_DETAILS_INV.Get_item_information(
13217                p_organization_id       =>  l_organization_id,
13218                p_inventory_item_id     =>  l_inventory_item_id,
13219                x_mtl_system_items_rec  =>  l_item_info,
13220                x_return_status         =>  l_return_status
13221                );
13222            IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
13223                raise FND_API.G_EXC_ERROR;
13224            ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
13225                raise FND_API.G_EXC_UNEXPECTED_ERROR;
13226            END IF;
13227            IF l_debug_on THEN
13228                WSH_DEBUG_SV.LOG(l_module_name, 'Is item lot divisible?', l_item_info.lot_divisible_flag);
13229                -- muom
13230                WSH_DEBUG_SV.LOG(l_module_name, 'l_fulfillment_base', l_fulfillment_base);
13231            END IF;
13232 
13233         IF l_item_info.lot_divisible_flag = 'Y' OR l_item_info.lot_control_code <> 2  THEN --{
13234             -- muom
13235             IF (l_fulfillment_base = 'P' and p_bo_qty > 0) OR (l_fulfillment_base = 'S' and p_bo_qty2s > 0) THEN --{
13236                 --
13237                 -- Debug Statements
13238                 --
13239                 IF l_debug_on THEN
13240                     WSH_DEBUG_SV.logmsg(l_module_name,'Unreserving the Backordered quantity ');
13241                     WSH_DEBUG_SV.logmsg(l_module_name,'... delivery_detail_id '|| p_delivery_detail_id);
13242                     -- muom
13243                     WSH_DEBUG_SV.logmsg(l_module_name,'... backordered quantity '||p_bo_qty||' backordered quantity2 '||p_bo_qty2s );
13244                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNRESERVE_DELIVERY_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
13245                 END IF;
13246                 --
13247                 IF (l_fulfillment_base='S' AND p_overpick_qty2s= 0 AND p_overpick_qty>0 ) THEN
13248                        WSH_DEBUG_SV.logmsg(l_module_name,'..with . backordered quantity+overpicked quantity '||p_bo_qty||'+'||p_overpick_qty||' backordered quantity2 '||p_bo_qty2s );
13249                   wsh_delivery_details_actions.unreserve_delivery_detail(
13250                           p_delivery_Detail_id    => p_delivery_detail_id,
13251                           p_unreserve_mode        => p_bo_mode ,
13252                           p_quantity_to_unreserve => p_bo_qty+p_overpick_qty,
13253                           p_override_retain_ato_rsv    => 'N',
13254                           p_quantity2_to_unreserve => p_bo_qty2s,
13255                           x_return_status         => l_return_status
13256                           );
13257 
13258                 ELSE
13259                 wsh_delivery_details_actions.unreserve_delivery_detail(
13260                         p_delivery_Detail_id    => p_delivery_detail_id,
13261                         p_unreserve_mode        => p_bo_mode ,
13262                         p_quantity_to_unreserve => p_bo_qty,
13263                         p_override_retain_ato_rsv    => 'N',
13264                         p_quantity2_to_unreserve => p_bo_qty2s,
13265                         x_return_status         => l_return_status
13266                         );
13267                 END IF;
13268                 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
13269                     raise FND_API.G_EXC_ERROR;
13270                 ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
13271                     raise FND_API.G_EXC_UNEXPECTED_ERROR;
13272                 END IF;
13273             END IF; --}
13274 
13275             -- muom
13276             IF (l_fulfillment_base = 'P' and p_overpick_qty > 0) OR (l_fulfillment_base = 'S' and p_overpick_qty2s > 0) THEN --{
13277                 --
13278                 -- Debug Statements
13279                 --
13280                 IF l_debug_on THEN
13281                     WSH_DEBUG_SV.logmsg(l_module_name,'Unreserving the Backordered quantity ');
13282                     WSH_DEBUG_SV.logmsg(l_module_name,'... delivery_detail_id '|| p_delivery_detail_id);
13283                     WSH_DEBUG_SV.logmsg(l_module_name,'... overpicked quantity '||p_overpick_qty||' overpicked quantity2 '||p_overpick_qty2s );
13284                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNRESERVE_DELIVERY_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
13285                 END IF;
13286                 --
13287 
13288                 --Bug 4721577 Do not retain reservation for overpicked quantities
13289                 -- muom
13290                 IF l_fulfillment_base = 'P' THEN
13291                     IF p_bo_mode = 'RETAIN_RSV' THEN
13292                         wsh_delivery_details_actions.unreserve_delivery_detail(
13293                             p_delivery_Detail_id    => p_delivery_detail_id,
13294                             p_unreserve_mode        => 'UNRESERVE' ,
13295                             p_quantity_to_unreserve => p_overpick_qty,
13296                             p_override_retain_ato_rsv    => 'Y',
13297                             p_quantity2_to_unreserve => p_bo_qty2s,
13298                             x_return_status         => l_return_status
13299                             );
13300                     ELSE
13301                         wsh_delivery_details_actions.unreserve_delivery_detail(
13302                             p_delivery_Detail_id    => p_delivery_detail_id,
13303                             p_unreserve_mode        => p_bo_mode ,
13304                             p_quantity_to_unreserve => p_overpick_qty,
13305                             p_override_retain_ato_rsv    => 'Y',
13306                             p_quantity2_to_unreserve => p_bo_qty2s,
13307                             x_return_status         => l_return_status
13308                             );
13309                     END IF;
13310                 ELSE
13311                     IF p_bo_mode = 'RETAIN_RSV' THEN
13312                         wsh_delivery_details_actions.unreserve_delivery_detail(
13313                             p_delivery_Detail_id    => p_delivery_detail_id,
13314                             p_unreserve_mode        => 'UNRESERVE' ,
13315                             p_quantity_to_unreserve => p_overpick_qty,
13316                             p_override_retain_ato_rsv    => 'Y',
13317                             p_quantity2_to_unreserve => p_overpick_qty2s,
13318                             x_return_status         => l_return_status
13319                             );
13320                     ELSE
13321                         wsh_delivery_details_actions.unreserve_delivery_detail(
13322                             p_delivery_Detail_id    => p_delivery_detail_id,
13323                             p_unreserve_mode        => p_bo_mode ,
13324                             p_quantity_to_unreserve => p_overpick_qty,
13325                             p_override_retain_ato_rsv    => 'Y',
13326                             p_quantity2_to_unreserve => p_overpick_qty2s,
13327                             x_return_status         => l_return_status
13328                             );
13329                     END IF;
13330                 END IF;
13331     		IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
13332 	    	       raise FND_API.G_EXC_ERROR;
13333 		    ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
13334     		       raise FND_API.G_EXC_UNEXPECTED_ERROR;
13335 	      	END IF;
13336     	END IF;  --}
13337         ELSE
13338             -- muom
13339             IF (l_fulfillment_base = 'P' and p_bo_qty > 0) OR (l_fulfillment_base = 'S' and p_bo_qty2s > 0) THEN --{
13340                 --
13341                 --For Lot Indivisible items, when bo mode is 'RETAIN_RSV'
13342                 --complete reservation sould be blown off.
13343                 -- This concurs with the API WSH_SHIP_CONFIRM_ACTIONS2.Backorder
13344                 --
13345                 l_bo_mode := p_bo_mode;
13346                 IF l_bo_mode = 'RETAIN_RSV' THEN
13347                     l_bo_mode := 'UNRESERVE';
13348                 END IF;
13349 
13350                 l_qty_unres :=p_bo_qty + p_overpick_qty;
13351                 -- muom
13352                 l_qty2_unres :=p_bo_qty2s + p_overpick_qty2s;
13353                 ------
13354                 --This change should not be done in WSH_SHIP_CONFIRM_ACTIONS2.Backorder before calling
13355                 --WSH_DELIVERY_DETAILS_ACTIONS.Consolidate_Delivery_Details because
13356                 ------
13357                 --When backorder quantity is not equal to requested
13358                 --Consolidate_Delivery_Details API calls Process_Delivery_Details with 'delete_flag' as 'N'
13359 
13360                 --So the delivery detail would not be canceled after unreserving the quantity and requested quantity
13361                 --on the would be updated to 'requested quantity - backorder quantity(which also includes overpicked)'
13362                 --resulting in negative value.
13363                 -----
13364 
13365                 IF l_debug_on THEN
13366                     WSH_DEBUG_SV.logmsg(l_module_name,'Unreserving the Backordered quantity ');
13367                     WSH_DEBUG_SV.logmsg(l_module_name,'... delivery_detail_id '|| p_delivery_detail_id);
13368                     WSH_DEBUG_SV.logmsg(l_module_name,'... backordered quantity '||l_qty_unres );
13369                     -- muom
13370                     WSH_DEBUG_SV.logmsg(l_module_name,'... backordered quantity2 '||l_qty2_unres );
13371                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNRESERVE_DELIVERY_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
13372                 END IF;
13373                 --
13374                 -- muom
13375                 IF l_fulfillment_base = 'P' THEN
13376                     wsh_delivery_details_actions.unreserve_delivery_detail(
13377                         p_delivery_Detail_id    => p_delivery_detail_id,
13378                         p_unreserve_mode        => l_bo_mode ,
13379                         p_quantity_to_unreserve => l_qty_unres ,
13380                         p_override_retain_ato_rsv    => 'N',
13381                         p_quantity2_to_unreserve => p_bo_qty2s,
13382                         x_return_status         => l_return_status
13383                         );
13384                 ELSE
13385                     wsh_delivery_details_actions.unreserve_delivery_detail(
13386                         p_delivery_Detail_id    => p_delivery_detail_id,
13387                         p_unreserve_mode        => l_bo_mode ,
13388                         p_quantity_to_unreserve => l_qty_unres ,
13389                         p_override_retain_ato_rsv    => 'N',
13390                         p_quantity2_to_unreserve => l_qty2_unres ,
13391                         x_return_status         => l_return_status
13392                         );
13393                 END IF;
13394                 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
13395                     raise FND_API.G_EXC_ERROR;
13396                 ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
13397                     raise FND_API.G_EXC_UNEXPECTED_ERROR;
13398                 END IF;
13399 
13400             END IF; --}
13401 
13402         END IF;--}Item is lot Indivisible
13403 
13404 
13405         IF (p_delete_flag = 'Y') THEN --{
13406 		--
13407 	        -- Debug Statements
13408 		--
13409 		IF l_debug_on THEN
13410 		      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.Delete_Delivery_Details',WSH_DEBUG_SV.C_PROC_LEVEL);
13411 		END IF;
13412 		--
13413 
13414 		WSH_DELIVERY_DETAILS_PKG.Delete_Delivery_Details(
13415 			p_delivery_detail_id => p_delivery_detail_id,
13416 			p_cancel_flag        => 'N',
13417 			x_return_status      => l_return_status);
13418 		IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
13419 			raise FND_API.G_EXC_ERROR;
13420 	        ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
13421 		        raise FND_API.G_EXC_UNEXPECTED_ERROR;
13422 	        END IF;
13423 	END IF;  --}
13424 
13425 	IF l_debug_on THEN
13426 	    WSH_DEBUG_SV.pop(l_module_name);
13427 	END IF;
13428 
13429   EXCEPTION
13430       WHEN FND_API.G_EXC_ERROR then
13431            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13432            IF c_detail%ISOPEN THEN
13433                CLOSE c_detail;
13434            END IF;
13435            IF l_debug_on THEN
13436                WSH_DEBUG_SV.pop(l_module_name);
13437            END IF;
13438        WHEN FND_API.G_EXC_UNEXPECTED_ERROR then
13439            x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13440            IF c_detail%ISOPEN THEN
13441                CLOSE c_detail;
13442            END IF;
13443            IF l_debug_on THEN
13444                WSH_DEBUG_SV.pop(l_module_name);
13445            END IF;
13446    	WHEN others THEN
13447  		x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13448         IF c_detail%ISOPEN THEN
13449            CLOSE c_detail;
13450         END IF;
13451 		wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_PKG.Process_Delivery_Details',l_module_name);
13452 		--
13453 		IF l_debug_on THEN
13454 		    WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13455 		    WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13456 		END IF;
13457 		--
13458 END Process_Delivery_Details;
13459 
13460 --  Procedure:      Consolidate_Delivery_Details
13461 --
13462 --  Parameters: p_delivery_details_tab  -> list of delivery details and its corresponding req qtys, bo qtys,
13463 --		 			   source line ids and delivery ids
13464 --              p_bo_mode		-> Either  'UNRESERVE'  or 'CYCLE_COUNT' or 'RETAIN_RSV'
13465 --                                         'RETAIN_RSV' added for bug 4721577, however this API is not affected
13466 --                                         beacuse of this change.
13467 --		x_cons_delivery_details_tab -> This is a filtered table of p_delivery_details_tab.
13468 --					   This contains the list of dd_ids into which the dd_ids passed
13469 --		                           in the parameter p_delivery_details_tab get consolidated.
13470 --					   This also contains the corresponding req qtys, bo qyts and
13471 --					   source line ids. Corresponding delivery_id field will be NULL.
13472 --		x_remain_bo_qtys	-> Contains the sum of backorder quantities of delivery details(except
13473 --					   for the dd_id in x_cons_delivery_details_tab) for each source line.
13474 --					   x_remain_bo_qtys has a quantity for each dd_id in
13475 --					   x_cons_delivery_details_tab.
13476 --  Description:    This API is Internally used by ShipConfirm to
13477 --                  consolidate the delivery details going to be BackOrdered.
13478 --                  This Procedure takes the list of delivery details
13479 --                  under a Delivery and consolidates them into one
13480 --                  delivery detail for each source line id.
13481 --
13482 -- HW OPM BUG#:3121616 Added x_remain_bo_qty2s
13483 PROCEDURE Consolidate_Delivery_Details(
13484 	 	p_delivery_details_tab  IN     WSH_DELIVERY_DETAILS_ACTIONS.Cons_Source_Line_Rec_Tab,
13485 		p_bo_mode	        IN     VARCHAR2,
13486 	 	x_cons_delivery_details_tab  OUT NOCOPY  WSH_DELIVERY_DETAILS_ACTIONS.Cons_Source_Line_Rec_Tab,
13487 		x_remain_bo_qtys	OUT NOCOPY   WSH_UTIL_CORE.Id_Tab_Type,
13488                 x_remain_bo_qty2s	OUT NOCOPY   WSH_UTIL_CORE.Id_Tab_Type,
13489 		x_return_status		OUT NOCOPY   VARCHAR2
13490     ) IS
13491 l_line_ids		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the source line ids passed as parameter
13492 l_detail_ids		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the delivery detail ids passed as parameter
13493 l_delivery_details_tab  WSH_DELIVERY_DETAILS_ACTIONS.Cons_Source_Line_Rec_Tab;   -- Stores the delivery detail records with req-qty >0
13494 l_freight_detail_ids	WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the delivery details for which the freight costs need to be deleted.
13495 l_req_qtys		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the requested quantities passed as parameter
13496 l_bo_qtys		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the BO quantities passed as parameter
13497 l_overpick_qtys         WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the Overpicked quantities passed as parameter
13498 -- HW OPM BUG#:3121616 added qty2s
13499 -- muom
13500 l_req_qty2s             WSH_UTIL_CORE.Id_Tab_Type;
13501 l_overpick_qty2s        WSH_UTIL_CORE.Id_Tab_Type;
13502 l_bo_qty2s		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the BO quantities2 passed as parameter
13503 l_cons_dd_ids		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores consolidate dd_id for line_id at l_cons_dd_ids(line_id)
13504 l_cons_dd_flags		WSH_UTIL_CORE.Column_Tab_Type;
13505 l_cons_bo_qtys		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores bo qty of consolidate dd_id for line_id at l_cons_bo_ids(line_id)
13506 l_cons_overpick_qtys    WSH_UTIL_CORE.Id_Tab_Type;  -- Stores overpicked qty of consolidate dd_id for line_id at l_cons_bo_ids(line_id)
13507 -- HW OPM BUG#:3121616 added qty2s
13508 l_cons_bo_qty2s		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores bo qty2 of consolidate dd_id for line_id at l_cons_bo2_ids(line_id)
13509 l_cons_req_qtys		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores req qty of consolidate dd_id for line_id at l_cons_req_ids(line_id)
13510 l_delete_dd_ids		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the all delivery details need to be deleted(that are getting
13511  					               -- completely BackOrdered), except one delivery detail for each source line.
13512 
13513 l_curr_line_id		NUMBER;  -- This temporary variable stores the current line_id in a loop.
13514 l_cons_dd_id		NUMBER;	 -- This contains the delivery_detail_id that gets consolidation into
13515 l_found_complete_bo	VARCHAR2(1);
13516 l_total_bo_qty		NUMBER;
13517 -- HW OPM BUG#:3121616 added qty2s
13518 l_total_bo_qty2         NUMBER;
13519 l_return_status		VARCHAR2(1);
13520 
13521 l_idx			NUMBER := 1;
13522 l_cmp_idx		NUMBER := 1;
13523 l_next_idx		NUMBER := 1;
13524 
13525 l_detail_tab            WSH_UTIL_CORE.id_tab_type; -- DBI Project
13526 l_dbi_rs                VARCHAR2(1); -- Return Status from DBI API
13527 -- muom
13528 l_fulfillment_base      WSH_UTIL_CORE.Column_Tab_Type;
13529 
13530 --
13531 l_debug_on BOOLEAN;
13532 --
13533 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'CONSOLIDATE_DELIVERY_DETAILS';
13534 --
13535 BEGIN
13536   --
13537   --
13538   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13539   --
13540   IF l_debug_on IS NULL
13541   THEN
13542       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13543   END IF;
13544   --
13545   IF l_debug_on THEN
13546       WSH_DEBUG_SV.push(l_module_name);
13547 
13548       WSH_DEBUG_SV.log(l_module_name,'P_BO_MODE',p_bo_mode);
13549   END IF;
13550   --
13551 
13552   l_return_status := FND_API.G_RET_STS_SUCCESS;
13553   x_return_status := FND_API.G_RET_STS_SUCCESS;
13554 
13555   -- Store the passed parameter values into local pl/sql tables
13556   FOR i IN p_delivery_details_tab.FIRST .. p_delivery_details_tab.LAST LOOP --{
13557     -- RTV BO Cons Changes
13558     IF p_delivery_details_tab(i).source in ('OE','OKE','WSH') THEN
13559 	l_detail_ids(i) := p_delivery_details_tab(i).delivery_detail_id;
13560 	l_line_ids(i)   := p_delivery_details_tab(i).source_line_id;
13561 	l_req_qtys(i)   := p_delivery_details_tab(i).req_qty;
13562 	l_bo_qtys(i)    := p_delivery_details_tab(i).bo_qty;
13563         l_overpick_qtys(i)    := p_delivery_details_tab(i).overpick_qty;    -- Bug#3263952
13564 -- HW OPM BUG#:3121616 added qty2s
13565         -- muom
13566 	l_req_qty2s(i)      := p_delivery_details_tab(i).req_qty2;
13567         l_overpick_qty2s(i) := p_delivery_details_tab(i).overpick_qty2;
13568 	l_bo_qty2s(i)       := p_delivery_details_tab(i).bo_qty2;
13569 
13570         l_fulfillment_base(i) := p_delivery_details_tab(i).fulfillment_base;
13571 
13572 
13573         -- muom
13574         IF (l_fulfillment_base(i) = 'P' and p_delivery_details_tab(i).req_qty = 0) OR
13575            (l_fulfillment_base(i) = 'S' and p_delivery_details_tab(i).req_qty2 = 0) THEN
13576 	        l_cons_dd_flags(i) := 'Y';
13577         ELSE
13578 	        l_cons_dd_flags(i) := 'N';
13579         END IF;
13580      ELSE
13581        l_cons_dd_flags(i) := 'Y'; -- Do not allow consolidation of wdds with source other than OE/OKE/WSH
13582      END IF;
13583 
13584   END LOOP; --}
13585 
13586   -- Following Code gets the dd_id for each source_line, that will be used for consolidation
13587   -- from the passed list of delivery details.
13588   l_idx := p_delivery_details_tab.FIRST;
13589   WHILE l_idx IS NOT NULL
13590   LOOP  -- {
13591 
13592      -- Do not consider dd's with requested_quantity = 0 , for consolidation now . These are already
13593      -- marked earlier.
13594       -- RTV BO Cons Changes
13595       -- muom
13596       IF ((l_fulfillment_base(l_idx) = 'P' and p_delivery_details_tab(l_idx).req_qty > 0) OR
13597           (l_fulfillment_base(l_idx) = 'S' and p_delivery_details_tab(l_idx).req_qty2 > 0)) AND
13598           p_delivery_details_tab(l_idx).source in ('OE','OKE','WSH') THEN
13599 	       l_delivery_details_tab(l_idx) := p_delivery_details_tab(l_idx);
13600       END IF;
13601       l_idx := p_delivery_details_tab.NEXT(l_idx);
13602   END LOOP; --}
13603 
13604   IF l_debug_on THEN
13605     WSH_DEBUG_SV.logmsg(l_module_name,'Finding the delivery detail to Consolidate into, from the input list',WSH_DEBUG_SV.C_PROC_LEVEL);
13606   END IF;
13607 
13608   -- Mark the corresponding entry in l_cons_dd_flags(i) to 'Y', if l_detail_ids(i) is
13609   -- the consolidated delivery detail. Mark l_cons_dd_flags(i) to 'N' otherwise.
13610   -- Logic: Parse thru the entire list for a source line and set the first found completely backordered
13611   --        delivery detail as the consolidate delivery detail.
13612   --	    If we don't find the completely backordered delivery detail under the source line,
13613   --	    then set the first delivery detail in the list for the source line as the consolidate delivery detail.
13614   --
13615   l_idx := l_delivery_details_tab.FIRST;
13616   WHILE l_idx IS NOT NULL
13617   LOOP  -- {
13618 	l_found_complete_bo := 'N';
13619         -- muom
13620 	IF (l_fulfillment_base(l_idx) = 'P' and l_delivery_details_tab(l_idx).bo_qty = l_delivery_details_tab(l_idx).req_qty ) OR
13621            (l_fulfillment_base(l_idx) = 'S' and l_delivery_details_tab(l_idx).bo_qty2 = l_delivery_details_tab(l_idx).req_qty2 ) THEN --{
13622 		l_found_complete_bo  := 'Y';
13623 		l_cons_dd_flags(l_idx) := 'Y';
13624  	END IF; --}
13625 
13626 	l_next_idx := l_delivery_details_tab.NEXT(l_idx);
13627 	WHILE l_next_idx IS NOT NULL
13628 	LOOP  --{
13629 		IF l_delivery_details_tab(l_next_idx).source_line_id = l_delivery_details_tab(l_idx).source_line_id THEN
13630 		    IF l_found_complete_bo = 'N' AND
13631                               -- muom
13632 			      ((l_fulfillment_base(l_next_idx) = 'P' and l_delivery_details_tab(l_next_idx).bo_qty = l_delivery_details_tab(l_next_idx).req_qty) OR
13633                                (l_fulfillment_base(l_next_idx) = 'S' and l_delivery_details_tab(l_next_idx).bo_qty2 = l_delivery_details_tab(l_next_idx).req_qty2)) THEN
13634 			 l_found_complete_bo  := 'Y';
13635 			 l_cons_dd_flags(l_next_idx) := 'Y';
13636 		    END IF;
13637 	            l_delivery_details_tab.DELETE(l_next_idx);
13638 		END IF;
13639   	        l_next_idx := l_delivery_details_tab.NEXT(l_next_idx);
13640 	END LOOP; --}
13641 
13642 	IF l_found_complete_bo = 'N' THEN
13643         	l_cons_dd_flags(l_idx) := 'Y';
13644 	END IF;
13645 	l_delivery_details_tab.DELETE(l_idx);
13646 
13647 	l_idx := l_delivery_details_tab.NEXT(l_idx);
13648   END LOOP;  --}
13649   --
13650 
13651   -- Keep the delivery_detail_ids used for consolidation and the corresponding quantities
13652   -- to pass them back to the Caller.
13653   l_idx := p_delivery_details_tab.FIRST;
13654   WHILE l_idx IS NOT NULL
13655   LOOP  --{
13656 	IF l_cons_dd_flags(l_idx) = 'Y' THEN --{
13657   	     x_cons_delivery_details_tab(x_cons_delivery_details_tab.COUNT+1).delivery_detail_id :=  p_delivery_details_tab(l_idx).delivery_detail_id;
13658   	     x_cons_delivery_details_tab(x_cons_delivery_details_tab.COUNT).req_qty  :=  p_delivery_details_tab(l_idx).req_qty;
13659   	     x_cons_delivery_details_tab(x_cons_delivery_details_tab.COUNT).bo_qty   :=  p_delivery_details_tab(l_idx).bo_qty;
13660 -- HW OPM BUG#:3121616 added qty2s
13661              -- muom
13662   	     x_cons_delivery_details_tab(x_cons_delivery_details_tab.COUNT).req_qty2  :=  p_delivery_details_tab(l_idx).req_qty2;
13663   	     x_cons_delivery_details_tab(x_cons_delivery_details_tab.COUNT).bo_qty2         :=  p_delivery_details_tab(l_idx).bo_qty2;
13664   	     x_cons_delivery_details_tab(x_cons_delivery_details_tab.COUNT).source_line_id  :=  p_delivery_details_tab(l_idx).source_line_id;
13665 	     x_cons_delivery_details_tab(x_cons_delivery_details_tab.COUNT).overpick_qty := p_delivery_details_tab(l_idx).overpick_qty;
13666              -- muom
13667 	     x_cons_delivery_details_tab(x_cons_delivery_details_tab.COUNT).overpick_qty2 := p_delivery_details_tab(l_idx).overpick_qty2;
13668 	     x_cons_delivery_details_tab(x_cons_delivery_details_tab.COUNT).fulfillment_base := p_delivery_details_tab(l_idx).fulfillment_base;
13669 								     -- Bug#3263952
13670              -- RTV BO Cons Changes
13671              x_remain_bo_qtys(x_cons_delivery_details_tab.COUNT) := 0;
13672              x_remain_bo_qty2s(x_cons_delivery_details_tab.COUNT) := 0;
13673 
13674 	     IF l_debug_on THEN
13675                IF p_delivery_details_tab(l_idx).req_qty > 0 THEN
13676 		     WSH_DEBUG_SV.logmsg(l_module_name,'Delivery details of the Source Line '||p_delivery_details_tab(l_idx).source_line_id ||
13677 			' are getting consolidated into dd_id :'||p_delivery_details_tab(l_idx).delivery_detail_id,WSH_DEBUG_SV.C_PROC_LEVEL);
13678   	       END IF;
13679 	     END IF;
13680 	END IF;  --}
13681   	l_idx := p_delivery_details_tab.NEXT(l_idx);
13682   END LOOP; --}
13683 
13684   --  loop thru' input delivery details using the index variable l_idx.
13685   --  add the backordered quantities of the all the delivery details under the same line_id
13686   --  and delete those delivery details from the pl/sql table l_detail_ids.
13687   l_idx := l_detail_ids.FIRST;
13688   WHILE l_idx IS NOT NULL
13689   LOOP  --{ loop thru' l_detail_ids
13690         l_curr_line_id := l_line_ids(l_idx);
13691 
13692   	-- Calculating the consolidate backorder quantity for l_curr_line_id.
13693   	-- Loop thru' the list and sum up the backorder quantities of the delivery details for l_curr_line_id.
13694 	-- Delete the delivery_details of l_curr_line_id from the pl/sql table l_detail_ids,
13695 	-- after getting the corresponding backorder quantity.
13696 	l_total_bo_qty := 0;  -- Used to store the Consolidated BO qty.
13697 -- HW OPM BUG#:3121616 added qty2s
13698 	l_total_bo_qty2 := 0;  -- Used to store the Consolidated BO qty2
13699   	l_cmp_idx := l_idx;  -- Starting from l_idx, find all dds from l_detail_ids which belong to the
13700 		 	     -- current line id
13701 	WHILE l_cmp_idx IS NOT NULL
13702 	LOOP --{
13703 	    IF ( (l_curr_line_id = l_line_ids(l_cmp_idx)) AND (l_cons_dd_flags(l_cmp_idx) <> 'Y') ) THEN
13704 	 --{
13705      	        l_total_bo_qty := l_total_bo_qty + l_bo_qtys(l_cmp_idx);
13706 -- HW OPM BUG#:3121616 added qty2s
13707                 l_total_bo_qty2 := l_total_bo_qty2 + l_bo_qty2s(l_cmp_idx);
13708 
13709                 -- If a delivery detail is completely backorderd, delete it physically(pass p_delete_flag as 'Y'
13710 		-- to process_delivery_details).
13711                 -- muom
13712 		IF (l_fulfillment_base(l_cmp_idx) = 'P' and l_bo_qtys(l_cmp_idx) = l_req_qtys(l_cmp_idx)) OR
13713                    (l_fulfillment_base(l_cmp_idx) = 'S' and l_bo_qty2s(l_cmp_idx) = l_req_qty2s(l_cmp_idx)) THEN
13714 	     --{
13715 	           --
13716 		   IF l_debug_on THEN
13717 		      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Process_Delivery_Details',WSH_DEBUG_SV.C_PROC_LEVEL);
13718 	  	      WSH_DEBUG_SV.logmsg(l_module_name,'.. to process completely backordered delivery detail '||l_detail_ids(l_cmp_idx),WSH_DEBUG_SV.C_PROC_LEVEL);
13719 		   END IF;
13720 		   --
13721 		   Process_Delivery_Details (
13722 		 	p_delivery_detail_id	=> l_detail_ids(l_cmp_idx),
13723 			p_bo_qty		=> l_bo_qtys(l_cmp_idx),
13724 			p_overpick_qty		=> l_overpick_qtys(l_cmp_idx),
13725 			p_bo_mode		=> p_bo_mode,
13726 		        p_delete_flag	        => 'Y',
13727 			p_bo_qty2s		=> l_bo_qty2s(l_cmp_idx),
13728                         -- muom
13729 			p_overpick_qty2s        => l_overpick_qty2s(l_cmp_idx),
13730 		 	x_return_status		=> l_return_status
13731 			);
13732 	  	   IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
13733 			raise FND_API.G_EXC_ERROR;
13734 		   ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
13735 		        raise FND_API.G_EXC_UNEXPECTED_ERROR;
13736 		   END IF;
13737 
13738    	        -- If a delivery detail is partially backordered , unreserve the backordered
13739 		-- quantity and later update its requested quantity. This delivery detail should not be
13740 		-- deleted ( pass p_delete_flag as 'N' to process_delivery_details).
13741                 -- muom
13742 		ELSIF (l_fulfillment_base(l_cmp_idx) = 'P' AND (l_bo_qtys(l_cmp_idx) > 0 OR l_overpick_qtys(l_cmp_idx) > 0)) OR
13743                       (l_fulfillment_base(l_cmp_idx) = 'S' AND (l_bo_qty2s(l_cmp_idx) > 0 OR l_overpick_qty2s(l_cmp_idx) > 0)) THEN
13744 		   --
13745 		   IF l_debug_on THEN
13746 		      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Process_Delivery_Details',WSH_DEBUG_SV.C_PROC_LEVEL);
13747       	  	      WSH_DEBUG_SV.logmsg(l_module_name,'.. to process partially backordered delivery detail '||l_detail_ids(l_cmp_idx),WSH_DEBUG_SV.C_PROC_LEVEL);
13748 		   END IF;
13749 		   --
13750 	  	   Process_Delivery_Details (
13751 		 	p_delivery_detail_id	=> l_detail_ids(l_cmp_idx),
13752 			p_bo_qty		=> l_bo_qtys(l_cmp_idx),
13753 			p_overpick_qty		=> l_overpick_qtys(l_cmp_idx),
13754 			p_bo_mode		=> p_bo_mode,
13755 		        p_delete_flag	        => 'N',
13756 			p_bo_qty2s		=> l_bo_qty2s(l_cmp_idx),
13757                         -- muom
13758 			p_overpick_qty2s        => l_overpick_qty2s(l_cmp_idx),
13759 		 	x_return_status		=> l_return_status
13760 			);
13761 	  	   IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
13762 			raise FND_API.G_EXC_ERROR;
13763 		   ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
13764 		        raise FND_API.G_EXC_UNEXPECTED_ERROR;
13765 		   END IF;
13766 
13767 -- HW OPM BUG#:3121616 added qty2s
13768  	           update wsh_delivery_details
13769 		   set requested_quantity = requested_quantity - l_bo_qtys(l_cmp_idx),
13770                        requested_quantity2 = requested_quantity2 - l_bo_qty2s(l_cmp_idx),
13771                        picked_quantity = picked_quantity - l_bo_qtys(l_cmp_idx) - l_overpick_qtys(l_cmp_idx),
13772                        picked_quantity2 = picked_quantity2 - l_bo_qty2s(l_cmp_idx),
13773 	               cycle_count_quantity = 0,
13774                        cycle_count_quantity2 = 0
13775 	           where delivery_detail_id = l_detail_ids(l_cmp_idx);
13776                    -- DBI needs to track the delivery details whose requested_qty or released_status changes
13777                    -- Populate the delivery details involved here and then make a single call after the
13778                    -- loop ends
13779                    l_detail_tab(l_detail_tab.count + 1) := l_detail_ids(l_cmp_idx);
13780 		END IF;  --}
13781   	      --}
13782   	        l_detail_ids.DELETE(l_cmp_idx);
13783 
13784 	    -- delivery detail with l_cons_dd_flags(l_cmp_idx)='Y' should be deleted from l_detail_ids.
13785 	    ELSIF ( l_line_ids(l_cmp_idx) = l_curr_line_id ) THEN
13786 	        l_detail_ids.DELETE(l_cmp_idx);
13787             END IF;
13788             l_cmp_idx := l_detail_ids.NEXT(l_cmp_idx);
13789         END LOOP; --} inner Loop(l_cmp_idx)
13790 
13791         -- DBI Project
13792         -- Update of wsh_delivery_details where requested_quantity/released_status
13793         -- are changed, call DBI API after the update.
13794         -- This API will also check for DBI Installed or not
13795         IF l_debug_on THEN
13796           WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail count-',l_detail_tab.count);
13797         END IF;
13798         WSH_INTEGRATION.DBI_Update_Detail_Log
13799           (p_delivery_detail_id_tab => l_detail_tab,
13800            p_dml_type               => 'UPDATE',
13801            x_return_status          => l_dbi_rs);
13802 
13803         IF l_debug_on THEN
13804           WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
13805         END IF;
13806         IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
13807           -- just pass this return status to caller API
13808           raise FND_API.G_EXC_UNEXPECTED_ERROR;
13809         END IF;
13810         -- End of Code for DBI Project
13811         --
13812 
13813 	-- Assign the Consolidate BO qtys to the OUT parameter
13814 --Bug 7257451 now storing the remain bo qty's in x_remain_bo_qtys/x_remain_bo_qty2s at same index(l_next_idx)
13815 --as in x_cons_delivery_details_tab so that both table are in sync
13816 	l_next_idx := x_cons_delivery_details_tab.FIRST;
13817 	WHILE l_next_idx IS NOT NULL
13818 	LOOP --{
13819 	    IF x_cons_delivery_details_tab(l_next_idx).source_line_id = l_curr_line_id THEN
13820                 -- muom
13821 		IF (x_cons_delivery_details_tab(l_next_idx).fulfillment_base = 'P' and x_cons_delivery_details_tab(l_next_idx).req_qty = 0) OR
13822                    (x_cons_delivery_details_tab(l_next_idx).fulfillment_base = 'S' and x_cons_delivery_details_tab(l_next_idx).req_qty2 = 0) THEN
13823 			x_remain_bo_qtys(l_next_idx) := 0;
13824 		  	x_remain_bo_qty2s(l_next_idx) := 0;
13825 	        ELSE
13826 		  	x_remain_bo_qtys(l_next_idx) := l_total_bo_qty;
13827 		-- Bug#3670261
13828 		-- Delete the Freight Costs only if Consolidation happens and
13829 		-- if delivery detail is going to be completely backordered.
13830                 -- muom
13831 		IF (x_cons_delivery_details_tab(l_next_idx).fulfillment_base = 'P' and l_total_bo_qty > 0 AND
13832 		    x_cons_delivery_details_tab(l_next_idx).req_qty = x_cons_delivery_details_tab(l_next_idx).bo_qty) OR
13833                   (x_cons_delivery_details_tab(l_next_idx).fulfillment_base = 'S' and l_total_bo_qty2 > 0 AND
13834                   x_cons_delivery_details_tab(l_next_idx).req_qty2 = x_cons_delivery_details_tab(l_next_idx).bo_qty2)
13835                   THEN
13836 		      l_freight_detail_ids(l_freight_detail_ids.COUNT+1) := x_cons_delivery_details_tab(l_next_idx).delivery_detail_id;
13837 		END IF;
13838 		--
13839 	-- HW OPM BUG#:3121616 added qty2s. Added NVL since x_remain_bo_qtys2 is
13840         -- an OUT parameter and for discrete and OPM single UOM lines returning NULL
13841         -- will cause a problem
13842 		  	x_remain_bo_qty2s(l_next_idx) := nvl(l_total_bo_qty2,0);
13843 		END IF;
13844 	    END IF;
13845        	    l_next_idx := x_cons_delivery_details_tab.NEXT(l_next_idx);
13846 	END LOOP;  --}
13847 	--
13848 	IF l_debug_on THEN
13849 	   WSH_DEBUG_SV.logmsg(l_module_name,'Consolidated Backordered Quantity of the Source Line '||l_curr_line_id||' is '||l_total_bo_qty,WSH_DEBUG_SV.C_PROC_LEVEL);
13850 -- HW OPM BUG#:3121616 added qty2s
13851 	   WSH_DEBUG_SV.logmsg(l_module_name,'Consolidated Backordered Quantity2 of the Source Line '||l_curr_line_id||' is '||l_total_bo_qty2,WSH_DEBUG_SV.C_PROC_LEVEL);
13852         END IF;
13853   	l_idx := l_detail_ids.NEXT(l_idx);
13854   END LOOP;   -- } Outer Loop(l_idx)
13855 
13856   -- Bug#3670261
13857   -- Deleting the Freight Costs associated with the delivery details selected for Consolidation
13858   FORALL i IN 1..l_freight_detail_ids.COUNT
13859   DELETE FROM WSH_FREIGHT_COSTS
13860   WHERE  delivery_detail_id = l_freight_detail_ids(i);
13861   IF l_debug_on THEN
13862       WSH_DEBUG_SV.log(l_module_name,'Freight Cost Rows deleted',SQL%ROWCOUNT);
13863   END IF;
13864 
13865   l_req_qtys.DELETE;
13866   l_bo_qtys.DELETE;
13867 -- HW OPM BUG#:3121616 added qty2s
13868   l_bo_qty2s.DELETE;
13869 
13870   --
13871   -- Debug Statements
13872   --
13873   IF l_debug_on THEN
13874      WSH_DEBUG_SV.pop(l_module_name);
13875   END IF;
13876   --
13877 
13878  EXCEPTION
13879    WHEN FND_API.G_EXC_ERROR THEN
13880       x_return_status := FND_API.G_RET_STS_ERROR;
13881       --
13882       IF l_debug_on THEN
13883          wsh_debug_sv.logmsg(l_module_name, 'FND_API.G_EXC_ERROR exception has occired.',wsh_debug_sv.c_excep_level);
13884          wsh_debug_sv.pop(l_module_name, 'EXCEPTION:FND_API.G_EXC_ERROR');
13885       END IF;
13886       --
13887 
13888    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
13889       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13890       --
13891       IF l_debug_on THEN
13892          wsh_debug_sv.logmsg(l_module_name, 'FND_API.G_EXC_UNEXPECTED_ERROR exception has occured.', wsh_debug_sv.c_excep_level);
13893          wsh_debug_sv.pop(l_module_name, 'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
13894       END IF;
13895       --
13896 
13897    WHEN OTHERS THEN
13898       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13899       WSH_UTIL_CORE.Default_Handler('WSH_DELIVERY_DETAILS_ACTIONS.Consolidate_Delivery_Details',l_module_name);
13900       --
13901       -- Debug Statements
13902       --
13903       IF l_debug_on THEN
13904          WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13905          WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13906       END IF;
13907       --
13908 
13909 END Consolidate_Delivery_Details;
13910 
13911 
13912 -- K: MDC
13913 PROCEDURE Delete_Consol_Record(
13914                        p_detail_id_tab IN wsh_util_core.id_tab_type,
13915                        x_return_status OUT NOCOPY VARCHAR2) IS
13916 
13917 l_debug_on BOOLEAN;
13918 --
13919 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'delete_consol_record';
13920 BEGIN
13921   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13922   --
13923   IF l_debug_on IS NULL
13924   THEN
13925       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13926   END IF;
13927   IF l_debug_on THEN
13928       WSH_DEBUG_SV.push(l_module_name);
13929   END IF;
13930 
13931    x_return_status := FND_API.G_RET_STS_SUCCESS;
13932 
13933    FORALL i in p_detail_id_tab.first..p_detail_id_tab.LAST
13934    update wsh_delivery_assignments
13935    set type = 'S'
13936    where type = 'O'
13937    and delivery_detail_id = p_detail_id_tab(i);
13938 
13939    IF sql%found THEN
13940 
13941      FORALL i in p_detail_id_tab.first..p_detail_id_tab.LAST
13942      delete from wsh_delivery_assignments
13943      where delivery_detail_id = p_detail_id_tab(i)
13944      and type = 'C';
13945 
13946    END IF;
13947   IF l_debug_on THEN
13948      WSH_DEBUG_SV.pop(l_module_name);
13949   END IF;
13950 EXCEPTION
13951    WHEN OTHERS THEN
13952       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13953       WSH_UTIL_CORE.Default_Handler('WSH_DELIVERY_DETAILS_ACTIONS.Unassign_Top_Detail_from_Delivery',l_module_name);
13954       --
13955       -- Debug Statements
13956       --
13957       IF l_debug_on THEN
13958          WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13959          WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13960       END IF;
13961       --
13962 END Delete_Consol_Record;
13963 
13964 PROCEDURE Create_Consol_Record(
13965                     p_detail_id_tab IN wsh_util_core.id_tab_type,
13966                     x_return_status OUT NOCOPY VARCHAR2) IS
13967 
13968  cursor c_get_consolidation_delivery (p_det_id IN NUMBER) is
13969  select l1.delivery_id, l2.delivery_id
13970  from wsh_delivery_legs l1, wsh_delivery_legs l2, wsh_delivery_assignments a
13971  where a.delivery_detail_id = p_det_id
13972  and l1.delivery_id = a.delivery_id
13973  and l1.parent_delivery_leg_id = l2.delivery_leg_id
13974  and a.parent_delivery_detail_id is NULL
13975  and NVL(a.type, 'S') = 'S';
13976 
13977  l_consol_delivery_id_tab wsh_util_core.id_tab_type;
13978  l_delivery_id_tab wsh_util_core.id_tab_type;
13979  l_detail_id_tab wsh_util_core.id_tab_type;
13980  l_delivery_id NUMBER;
13981  l_consol_delivery_id NUMBER;
13982  i NUMBER;
13983  j NUMBER := 0;
13984 
13985 l_debug_on BOOLEAN;
13986 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'create_consol_record';
13987 
13988 BEGIN
13989 --
13990   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13991   --
13992   IF l_debug_on IS NULL
13993   THEN
13994       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13995   END IF;
13996   IF l_debug_on THEN
13997       WSH_DEBUG_SV.push(l_module_name);
13998       WSH_DEBUG_SV.log(l_module_name, 'p_detail_id_tab.count',p_detail_id_tab.count );
13999   END IF;
14000 
14001   x_return_status := FND_API.G_RET_STS_SUCCESS;
14002 
14003   i := p_detail_id_tab.FIRST;
14004 
14005   WHILE i is NOT NULL LOOP
14006 
14007     IF l_debug_on THEN
14008       WSH_DEBUG_SV.log(l_module_name, 'p_detail_id_tab(i)',  p_detail_id_tab(i) );
14009     END IF;
14010     OPEN c_get_consolidation_delivery(p_detail_id_tab(i));
14011     FETCH c_get_consolidation_delivery
14012     INTO l_delivery_id, l_consol_delivery_id;
14013     IF c_get_consolidation_delivery%FOUND THEN
14014        j := j + 1;
14015        l_consol_delivery_id_tab(j) := l_consol_delivery_id;
14016        l_delivery_id_tab(j) := l_delivery_id;
14017        l_detail_id_tab(j) := p_detail_id_tab(i);
14018     END IF;
14019     CLOSE c_get_consolidation_delivery;
14020     i := p_detail_id_tab.next(i);
14021 
14022   END LOOP;
14023 
14024   IF l_detail_id_tab.count > 0 THEN
14025 
14026      IF l_debug_on THEN
14027         WSH_DEBUG_SV.logmsg(l_module_name, 'updating tabcount', l_detail_id_tab.count);
14028      END IF;
14029      FORALL i in l_detail_id_tab.first..l_detail_id_tab.count
14030      update wsh_delivery_assignments
14031      set type = 'O',
14032          parent_delivery_detail_id = NULL
14033      where NVL(type, 'S') = 'S'
14034      and delivery_detail_id = l_detail_id_tab(i);
14035 
14036      FORALL i in l_detail_id_tab.first..l_detail_id_tab.count
14037      INSERT INTO wsh_delivery_assignments (
14038      delivery_id,
14039      parent_delivery_id,
14040      delivery_detail_id,
14041      parent_delivery_detail_id,
14042      creation_date,
14043      created_by,
14044      last_update_date,
14045      last_updated_by,
14046      last_update_login,
14047      program_application_id,
14048      program_id,
14049      program_update_date,
14050      request_id,
14051      active_flag,
14052      delivery_assignment_id,
14053      type
14054      ) VALUES (
14055      l_delivery_id_tab(i),
14056      l_consol_delivery_id_tab(i),
14057      l_detail_id_tab(i),
14058      NULL,
14059      SYSDATE,
14060      FND_GLOBAL.USER_ID,
14061      SYSDATE,
14062      FND_GLOBAL.USER_ID,
14063      FND_GLOBAL.USER_ID,
14064      NULL,
14065      NULL,
14066      NULL,
14067      NULL,
14068      NULL,
14069      wsh_delivery_assignments_s.nextval,
14070      'C'
14071      );
14072 
14073 
14074   END IF;
14075 
14076 
14077   IF l_debug_on THEN
14078      WSH_DEBUG_SV.pop(l_module_name);
14079   END IF;
14080 
14081 EXCEPTION
14082 
14083    WHEN OTHERS THEN
14084       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
14085       WSH_UTIL_CORE.Default_Handler('WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record',l_module_name);
14086       --
14087       -- Debug Statements
14088       --
14089       IF l_debug_on THEN
14090          WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
14091          WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
14092       END IF;
14093       --
14094 END Create_Consol_Record;
14095 
14096 END WSH_DELIVERY_DETAILS_ACTIONS;