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.36.12010000.3 2008/11/06 11:53:07 anvarshn 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 
216 BEGIN
217 
218 
219   -- If the quantity to reserve is passed and null or missing, we do not
220   -- need to go through this procedure.
221   --
222   --
223   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
224   --
225   IF l_debug_on IS NULL
226   THEN
227       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
228   END IF;
229   --
230   IF l_debug_on THEN
231       WSH_DEBUG_SV.push(l_module_name);
232       --
233       -- 2587777
234 
235       WSH_DEBUG_SV.log(l_module_name,'P_QUANTITY2_TO_UNRESERVE',P_QUANTITY2_TO_UNRESERVE);
236       WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_DETAIL_ID:P_QUANTITY_TO_UNRESERVE:P_QUANTITY2_TO_UNRESERVE: P_UNRESERVE_MODE:
237                                       P_OVERRIDE_RETAIN_ATO_RSV ;',
238                                      P_DELIVERY_DETAIL_ID
239                               ||':'||P_QUANTITY_TO_UNRESERVE
240                               ||':'||P_QUANTITY2_TO_UNRESERVE
241                               ||':'||P_UNRESERVE_MODE
242                               ||':'||P_OVERRIDE_RETAIN_ATO_RSV);
243   END IF;
244   --
245   IF p_quantity_to_unreserve is null OR
246    p_quantity_to_unreserve = FND_API.G_MISS_NUM THEN
247    goto end_of_loop;
248   END IF;
249 
250   --
251   IF l_debug_on THEN
252       WSH_DEBUG_SV.logmsg(l_module_name, 'P_DELIVERY_DETAIL_ID : G_CODE_RELEASE_LEVEL ;'
253                                           || P_DELIVERY_DETAIL_ID ||': '|| G_CODE_RELEASE_LEVEL  );
254   END IF;
255   --
256 
257   IF ( G_CODE_RELEASE_LEVEL is NULL ) THEN
258     G_CODE_RELEASE_LEVEL := WSH_CODE_CONTROL.Get_Code_Release_Level;
259   END IF;
260 
261   --
262   IF l_debug_on THEN
263       WSH_DEBUG_SV.logmsg(l_module_name, 'G_CODE_RELEASE_LEVEL ' || G_CODE_RELEASE_LEVEL  );
264   END IF;
265   --
266 
267   OPEN  c_line_details;
268   FETCH c_line_details INTO  l_line_rec ;
269 
270   IF c_line_details%NOTFOUND THEN
271   CLOSE c_line_details;
272   goto end_of_loop;
273   END IF;
274   CLOSE c_line_details;
275 
276   -- HW BUG#:2005977
277   --
278   IF l_debug_on THEN
279 -- 2747520
280       WSH_DEBUG_SV.log(l_module_name,'Ln_id:Hdr_id:Org_id:Src-doc-id:SubInv:Rev:Lot#:Locat-id ; ',
281                        l_line_rec.line_id
282                ||':'|| l_line_rec.header_id
283                ||':'|| l_line_rec.organization_id
284                ||':'|| l_line_rec.source_document_type_id
285                ||':'|| l_line_rec.subinventory
286                ||':'|| l_line_rec.revision
287                ||':'|| l_line_rec.lot_number
288 -- HW 4178299  - Added inventory_item_id, uom and uom2
289                ||':'|| l_line_rec.inventory_item_id
290                ||':'|| l_line_rec.requested_quantity_uom
291                ||':'|| l_line_rec.ordered_quantity_uom2
292                ||':'|| l_line_rec.locator_id);
293       WSH_DEBUG_SV.log(l_module_name,'ATO-Ln-id : Rel-Stat : Dt-Sched HH24:MI:SS ; ',
294                        l_line_rec.ato_line_id
295                ||':'|| l_line_rec.released_status
296                ||':'|| to_char(l_line_rec.date_scheduled,'MM/DD/YYYY HH24:MI:SS'));
297 
298 -- 2587777
299 
300   END IF;
301   --
302 --HW OPMCONV - Removed checking for process org
303 
304   -- end of BUG#:2005977
305   IF l_line_rec.source_document_type_id = 10 THEN
306    -- This is an internal order line. We need to give
307    -- a different demand source type for these lines.
308       l_rsv_rec.demand_source_type_id   :=
309       INV_RESERVATION_GLOBAL.G_SOURCE_TYPE_INTERNAL_ORD;
310           -- intenal order
311   ELSE
312     l_rsv_rec.demand_source_type_id  :=
313       INV_RESERVATION_GLOBAL.G_SOURCE_TYPE_OE; -- order entry
314   END IF;
315 
316   -- Get demand_source_header_id from mtl_sales_orders
317 
318   --
319   IF l_debug_on THEN
320       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_SALESORDER.GET_SALESORDER_FOR_OEHEADER',WSH_DEBUG_SV.C_PROC_LEVEL);
321   END IF;
322   --
323   -- caching the sales_order_id : 2807093-2747520
324   IF ( l_sales_order_id is NULL OR l_line_rec.header_id <> nvl(g_header_id, 0) ) THEN
325     l_sales_order_id := inv_salesorder.get_salesorder_for_oeheader(
326                           l_line_rec.header_id);
327     g_header_id      := l_line_rec.header_id;
328   END IF;
329   --
330   IF l_debug_on THEN
331       WSH_DEBUG_SV.logmsg(l_module_name, 'L_SALES_ORDER_ID' || L_SALES_ORDER_ID  );
332   END IF;
333   --
334 
335   l_rsv_rec.demand_source_header_id     := l_sales_order_id;
336   l_rsv_rec.demand_source_line_id := l_line_rec.line_id;
337 
338   -- Bug 1842613 : Initializing inventory controls present in wsh_delivery_details
339   IF ( l_line_rec.organization_id IS NOT NULL )  THEN
340    l_rsv_rec.organization_id := l_line_rec.organization_id;
341   END IF;
342   IF ( l_line_rec.subinventory IS NOT NULL) THEN
343    l_rsv_rec.subinventory_code := l_line_rec.subinventory;
344   END IF;
345   IF ( l_line_rec.revision IS NOT NULL ) THEN
346    l_rsv_rec.revision := l_line_rec.revision;
347   END IF;
348   IF ( l_line_rec.lot_number IS NOT NULL ) THEN
349    l_rsv_rec.lot_number := l_line_rec.lot_number;
350   END IF;
351   IF ( l_line_rec.locator_id IS NOT NULL ) THEN
352    l_rsv_rec.locator_id := l_line_rec.locator_id;
353   END IF;
354 --Added condition p_unreserve_mode = 'RETAIN_RSV' for bug 4721577
355 IF ( p_unreserve_mode = 'RETAIN_RSV' AND
356      l_line_rec.parent_delivery_detail_id IS NOT NULL AND
357      wsh_util_validate.Check_Wms_Org(l_line_rec.organization_id)='Y') THEN
358     OPEN  c_lpn_id(l_line_rec.parent_delivery_detail_id);
359     FETCH c_lpn_id INTO l_lpn_id;
360     IF (c_lpn_id%FOUND) THEN
361 	IF l_lpn_id is not null THEN
362            l_rsv_rec.lpn_id := l_lpn_id;
363         END IF;
364     END IF;
365     CLOSE c_lpn_id;
366   END IF;
367   --
368 
369   --bug 4950329: query only staged reservations for cycle-count
370   IF (p_unreserve_mode = 'CYCLE_COUNT')  THEN
371     l_rsv_rec.staged_flag := 'Y';
372   END IF;
373 
374 
375 -- HW BUG#:2005977 for OPM. Need to branch
376 -- HW OPMCONV - No need to branch code
377    --
378    IF l_debug_on THEN
379        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_RESERVATION_PUB.QUERY_RESERVATION',WSH_DEBUG_SV.C_PROC_LEVEL);
380    END IF;
381    --
382 -- Bug 3431358(Moved this code from top to here)
383 -- 2747520 : Set reservation_type to 'U'nstaged or 'S'taged
384   IF (l_line_rec.released_status in ('R','B','N') ) THEN
385       l_cancel_rsv_type := 'U';
386       OPEN  c_nonstaged_qty;
387       FETCH c_nonstaged_qty
388       INTO  l_nonstaged_qty, l_nonstaged_qty2;
389       CLOSE c_nonstaged_qty;
390   ELSIF (l_line_rec.released_status in ('C','Y')) THEN
391       l_cancel_rsv_type := 'S';
392   ELSIF (l_line_rec.released_status = 'S') THEN
393       l_cancel_rsv_type := 'U';
394       --X-dock
395       IF l_line_rec.move_order_line_id IS NOT NULL THEN
396         l_trolin_rec := INV_TROLIN_UTIL.Query_Row(p_line_id => l_line_rec.move_order_line_id);
397       ELSE -- MOL is null for X-dock case
398         l_trolin_rec.quantity_detailed := l_line_rec.requested_quantity;
399         l_trolin_rec.secondary_quantity_detailed := l_line_rec.requested_quantity2;
400       END IF;
401       -- end of X-dock changes
402 
403       IF (l_trolin_rec.quantity_detailed > 0) THEN
404         l_dtld_qty_to_unreserve := l_trolin_rec.quantity_detailed;
405 -- HW OPMCONV - Added Qty2
406         l_dtld_qty2_to_unreserve := l_trolin_rec.secondary_quantity_detailed;
407       ELSE
408 -- HW OPMCONV - Added Qty2
409         l_dtld_qty_to_unreserve := 0;
410         l_dtld_qty2_to_unreserve := 0;
411       END IF;
412   ELSE
413       l_cancel_rsv_type := 'X';   -- ignoring if not in above released status
414   END IF;
415 -- 2747520
416 -- End Bug3431358
417 
418 --2587777
419          IF ( G_ATO_RSV_PROFILE  IS NULL ) THEN
420             fnd_profile.get('WSH_RETAIN_ATO_RESERVATIONS', G_ATO_RSV_PROFILE);
421             if ( G_ATO_RSV_PROFILE is NULL ) THEN     -- By Default this Profile is 'N'
422                 G_ATO_RSV_PROFILE := 'N';
423             end if;
424          END IF;
425          IF l_debug_on THEN
426             WSH_DEBUG_SV.log(l_module_name,'g_ato_rsv_profile',G_ATO_RSV_PROFILE);
427          END IF;
428 --2587777
429 
430   --X-dock
431   IF l_line_rec.released_status = WSH_DELIVERY_DETAILS_PKG.C_RELEASED_TO_WAREHOUSE THEN
432     WSH_USA_INV_PVT.get_putaway_detail_id
433       (p_detail_id          => p_delivery_detail_id,
434        p_released_status    => l_line_rec.released_status,
435        p_move_order_line_id => l_line_rec.move_order_line_id,
436        x_detail_id          => l_rsv_rec.demand_source_line_detail,
437        x_return_status      => l_return_status);
438 
439     IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
440       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
441     ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
442       RAISE FND_API.G_EXC_ERROR;
443     END IF;
444   END IF;
445   --end of X-dock
446 
447    inv_reservation_pub.query_reservation
448      (p_api_version_number        => 1.0,
449       p_init_msg_lst              => fnd_api.g_true,
450       x_return_status             => l_return_status,
451       x_msg_count                 => l_msg_count,
452       x_msg_data                  => l_msg_data,
453       p_query_input               => l_rsv_rec,
454       p_cancel_order_mode         => INV_RESERVATION_GLOBAL.G_CANCEL_ORDER_YES,
455       x_mtl_reservation_tbl       => l_rsv_tbl,
456       x_mtl_reservation_tbl_count => l_count,
457       x_error_code                => l_x_error_code,
458       p_lock_records              => l_lock_records,
459       p_sort_by_req_date          => l_sort_by_req_date
460      );
461 
462 
463   -- 2747520: for Non-Staged
464    IF ( l_cancel_rsv_type = 'U') THEN
465      l_nonstaged_rsv_qty  := 0;
466 
467      FOR l_counter in  1..l_count
468      LOOP
469          IF l_debug_on THEN
470            WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_STAGED_RESERVATION_UTIL.QUERY_STAGED_FLAG',WSH_DEBUG_SV.C_PROC_LEVEL);
471          END IF;
472 
473          INV_STAGED_RESERVATION_UTIL.query_staged_flag(
474            x_return_status   =>  x_return_status,
475            x_msg_count       =>  l_msg_count,
476            x_msg_data        =>  l_msg_data,
477            x_staged_flag     =>  l_staged_flag,
478            p_reservation_id  =>  l_rsv_tbl(l_counter).reservation_id);
479 
480      IF l_staged_flag <> 'Y' THEN
481 -- HW OPMCONV - Added Qty2
482       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));
483       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));
484      END IF;
485 
486     END LOOP;
487   END IF;
488 -- 2747520
489 
490    l_qty_to_unreserve   := p_quantity_to_unreserve;
491 -- HW OPMCONV - Added Qty2
492    l_qty2_to_unreserve   := p_quantity2_to_unreserve;
493 
494 
495 -- HW 4178299 - Need to convert Qty2 to get correct value
496    IF l_debug_on THEN
497           WSH_DEBUG_SV.log(l_module_name,'Value of Qty2_to_Unreserve before conversion is ',
498                                           l_qty2_to_unreserve);
499 
500    END IF;
501 
502    IF ( l_qty2_to_unreserve is NOT NULL OR
503         l_qty2_to_unreserve <> FND_API.G_MISS_NUM ) THEN
504 
505         l_qty2_to_unreserve := WSH_WV_UTILS.convert_uom
506                  (
507                   item_id      => l_line_rec.inventory_item_id
508                  ,org_id       => l_line_rec.organization_id
509                  ,from_uom     => l_line_rec.requested_quantity_uom
510                  ,to_uom       => l_line_rec.ordered_quantity_uom2
511                  ,quantity     => l_qty_to_unreserve
512                  ,lot_number   => l_line_rec.lot_number);
513 
514         IF l_debug_on THEN
515           WSH_DEBUG_SV.log(l_module_name,'Value of Qty2_to_Unreserve AFTER conversion is ',
516                            l_qty2_to_unreserve);
517 
518         END IF;
519 
520    END IF;
521 
522 -- HW end of 4178299
523 
524 
525 
526 -- 2747520   -- if rsv_type = U
527    IF ( l_cancel_rsv_type = 'U') THEN
528     l_remaining_nonstaged_qty := l_nonstaged_qty - l_qty_to_unreserve;
529 -- HW OPMCONV - Added Qty2
530     l_remaining_nonstaged_qty2 := l_nonstaged_qty2 - l_qty2_to_unreserve;
531     IF l_debug_on THEN
532         WSH_DEBUG_SV.log(l_module_name,'l_nonstaged_rsv_qty:l_nonstaged_qty:l_dtld_qty_to_unreserve:l_remaining_nonstaged_qty ;',
533                        l_nonstaged_rsv_qty
534                 ||':'||l_nonstaged_qty
535                 ||':'||l_dtld_qty_to_unreserve
536                 ||':'||l_remaining_nonstaged_qty );
537 -- HW OPMCONV - Added Qty2
538         WSH_DEBUG_SV.log(l_module_name,'l_nonstaged_rsv_qty2:l_nonstaged_qty:l_dtld_qty2_to_unreserve:l_remaining_nonstaged_qty2 ;',
539                        l_nonstaged_rsv_qty2
540                 ||':'||l_nonstaged_qty2
541                 ||':'||l_dtld_qty2_to_unreserve
542                 ||':'||l_remaining_nonstaged_qty2 );
543 
544     END IF;
545     -- Only Unreserve the Excess Unstgd. Rsvtns.
546     IF (l_nonstaged_rsv_qty > l_remaining_nonstaged_qty) THEN
547       l_qty_to_unreserve := l_nonstaged_rsv_qty - l_remaining_nonstaged_qty;
548 -- HW OPMCONV - Added Qty2
549       l_qty2_to_unreserve := l_nonstaged_rsv_qty2 - l_remaining_nonstaged_qty2;
550     ELSE
551       l_qty_to_unreserve   := 0;
552 -- HW OPMCONV - Added Qty2
553       l_qty2_to_unreserve   := 0;
554     END IF;
555    END IF;       -- if rsv_type = U
556 -- 2747520
557 
558          IF l_debug_on THEN
559            WSH_DEBUG_SV.log(l_module_name,'l_rsv_tbl.COUNT:l_x_error_code :: ',
560                                           l_rsv_tbl.COUNT||':'||l_x_error_code);
561          END IF;
562 
563    FOR I IN 1..l_rsv_tbl.COUNT LOOP
564 
565        l_rsv_rec := l_rsv_tbl(I);
566   --
567   IF l_debug_on THEN
568 -- 2587777
569           WSH_DEBUG_SV.log(l_module_name,'rsv.id:inv-item-id:Rsvtn-Qty:Org-id:SubInv-Code:Locator-id:Rev:Lot# ; ',
570                         l_rsv_rec.reservation_id
571                  ||':'||l_rsv_rec.inventory_item_id
572                  ||':'||l_rsv_rec.reservation_quantity
573                  ||':'||l_rsv_rec.secondary_reservation_quantity
574                  ||':'||L_RSV_REC.ORGANIZATION_ID
575                  ||':'||L_RSV_REC.SUBINVENTORY_CODE
576                  ||':'||L_RSV_REC.LOCATOR_ID
577                  ||':'||L_RSV_REC.REVISION
578                  ||':'||L_RSV_REC.LOT_NUMBER  );
579 -- 2587777
580   END IF;
581   --
582 -- 2747520 : Query Staged Reservation
583  IF l_debug_on THEN
584   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_STAGED_RESERVATION_UTIL.QUERY_STAGED_FLAG',WSH_DEBUG_SV.C_PROC_LEVEL);
585  END IF;
586 --
587   inv_staged_reservation_util.query_staged_flag(
588   x_return_status     => l_return_status
589   , x_msg_count         => l_msg_count
590   , x_msg_data          => l_msg_data
591   , x_staged_flag       => l_staged_flag
592   , p_reservation_id    => l_rsv_rec.reservation_id);
593   --
594   IF l_debug_on THEN
595 
596    WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS QUERY STAGED FLAG: ' || L_RETURN_STATUS  );
597   END IF;
598   --
599 
600   IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
601     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
602   ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
603    RAISE FND_API.G_EXC_ERROR;
604   END IF;
605 
606  IF l_debug_on THEN
607     WSH_DEBUG_SV.log(l_module_name, 'RES QTY : QTY TO UNRESVRVE : l_staged_flag ; ',
608                               L_RSV_REC.RESERVATION_QUANTITY
609                        ||':'||L_QTY_TO_UNRESERVE
610                        ||':'||l_staged_flag );
611 
612 -- HW OPMCONV - Added Qty2
613     WSH_DEBUG_SV.log(l_module_name, 'RES QTY2 : QTY2 TO UNRESVRVE : l_staged_flag ; ',
614                               L_RSV_REC.SECONDARY_RESERVATION_QUANTITY
615                        ||':'||L_QTY2_TO_UNRESERVE
616                        ||':'||l_staged_flag );
617 
618  END IF;
619 
620  --
621  -- 2747520 : This will also ensure that Only Non-Staged Staged line UnReserves Non-Stged Rsvtns.
622  --          and Staged Rsvtns. UnReserves Staged Rsvtns.
623  --
624  -- cancel Non-Staged Reservations by non-stged lines
625  IF (l_cancel_rsv_type = 'U' and p_unreserve_mode = 'UNRESERVE' and l_staged_flag <> 'Y') THEN
626 
627        -- Check if Retain ATO Profile
628        IF ( l_line_rec.ato_line_id IS NOT NULL  AND
629                 nvl(p_override_retain_ato_rsv, 'N') = 'N' AND
630                 G_ATO_RSV_PROFILE    = 'Y'  AND
631                 G_CODE_RELEASE_LEVEL > '110508' ) THEN
632           NULL;  -- Don't Update or Delete the REservations if the above criteria (ATO -Unstgd. Rsvn)is met
633        ELSE
634 
635         IF l_debug_on THEN
636           WSH_DEBUG_SV.log(l_module_name,'BEFORE l_prim_rsv_qty: tbl_detailed_qty ; ',
637                                           l_rsv_tbl(I).primary_reservation_quantity ||':'||
638                                           l_rsv_tbl(I).detailed_quantity);
639 -- HW OPMCONV - Added Qty2
640           WSH_DEBUG_SV.log(l_module_name,'BEFORE l_secondary_rsv_qty: tbl_detailed_qty2 ; ',
641                                           l_rsv_tbl(I).secondary_reservation_quantity ||':'||
642                                           l_rsv_tbl(I).secondary_detailed_quantity);
643         END IF;
644 
645         -- Start with orginal primary_reservation_quantity and detailed_quantity
646         l_rsv_new_rec.primary_reservation_quantity := l_rsv_tbl(I).primary_reservation_quantity;
647         l_rsv_new_rec.detailed_quantity            := nvl(l_rsv_tbl(I).detailed_quantity,0);
648 
649 -- HW OPMCONV - Added Qty2
650         l_rsv_new_rec.secondary_reservation_quantity := l_rsv_tbl(I).secondary_reservation_quantity;
651         l_rsv_new_rec.secondary_detailed_quantity            := nvl(l_rsv_tbl(I).secondary_detailed_quantity,0);
652 
653         -- Tackle Detailed Quantity
654         IF nvl(l_rsv_tbl(I).detailed_quantity,0) <> 0  THEN
655 
656            IF (l_dtld_qty_to_unreserve > 0) THEN
657              IF (nvl(l_rsv_tbl(I).detailed_quantity,0) <= l_dtld_qty_to_unreserve) THEN
658                l_dtld_qty_to_unreserve := l_dtld_qty_to_unreserve - nvl(l_rsv_tbl(I).detailed_quantity,0);
659 -- HW OPMCONV - Added Qty2
660                l_dtld_qty2_to_unreserve := l_dtld_qty2_to_unreserve - nvl(l_rsv_tbl(I).secondary_detailed_quantity,0);
661 
662                l_rsv_new_rec.detailed_quantity := 0;
663                l_rsv_new_rec.primary_reservation_quantity := l_rsv_new_rec.primary_reservation_quantity - nvl(l_rsv_tbl(I).detailed_quantity,0);
664 -- HW OPMCONV - Added Qty2
665                l_rsv_new_rec.secondary_detailed_quantity := 0;
666                l_rsv_new_rec.secondary_reservation_quantity := l_rsv_new_rec.secondary_reservation_quantity - nvl(l_rsv_tbl(I).secondary_detailed_quantity,0);
667              ELSE
668                l_rsv_new_rec.detailed_quantity := l_rsv_new_rec.detailed_quantity - l_dtld_qty_to_unreserve;
669                l_rsv_new_rec.primary_reservation_quantity := l_rsv_new_rec.primary_reservation_quantity - l_dtld_qty_to_unreserve;
670                l_dtld_qty_to_unreserve := 0;
671 -- HW OPMCONV - Added Qty2
672                l_rsv_new_rec.secondary_detailed_quantity := l_rsv_new_rec.secondary_detailed_quantity - l_dtld_qty_to_unreserve;
673                l_rsv_new_rec.secondary_reservation_quantity := l_rsv_new_rec.secondary_reservation_quantity - l_dtld_qty2_to_unreserve;
674                l_dtld_qty2_to_unreserve := 0;
675              END IF;
676            END IF;
677 
678         END IF;
679 
680         -- Tackle Primary Reservation Quantity
681         IF (l_qty_to_unreserve > 0) THEN
682           IF ((l_rsv_new_rec.primary_reservation_quantity - l_rsv_new_rec.detailed_quantity) <= l_qty_to_unreserve) THEN
683           IF l_debug_on THEN
684           WSH_DEBUG_SV.logmsg(l_module_name, 'ONE Before calculation l_qty_to_unreserve: ' || l_qty_to_unreserve  );
685 
686        END IF;
687             l_qty_to_unreserve := l_qty_to_unreserve - (l_rsv_new_rec.primary_reservation_quantity - l_rsv_new_rec.detailed_quantity);
688 -- HW OPMCONV - Added Qty2
689             l_qty2_to_unreserve := l_qty2_to_unreserve - (l_rsv_new_rec.secondary_reservation_quantity - l_rsv_new_rec.secondary_detailed_quantity);
690              IF l_debug_on THEN
691           WSH_DEBUG_SV.logmsg(l_module_name, 'ONE After calculation l_qty_to_unreserve: ' || l_qty_to_unreserve  );
692 
693        END IF;
694 
695             l_rsv_new_rec.primary_reservation_quantity := l_rsv_new_rec.detailed_quantity;
696 -- HW OPMCONV - Added Qty2
697             l_rsv_new_rec.secondary_reservation_quantity := l_rsv_new_rec.secondary_detailed_quantity;
698           ELSE
699             l_rsv_new_rec.primary_reservation_quantity := l_rsv_new_rec.primary_reservation_quantity - l_qty_to_unreserve;
700             l_qty_to_unreserve := 0;
701 -- HW OPMCONV - Added Qty2
702             l_rsv_new_rec.secondary_reservation_quantity := l_rsv_new_rec.secondary_reservation_quantity - l_qty2_to_unreserve;
703             l_qty2_to_unreserve := 0;
704           END IF;
705         END IF;
706 
707         IF l_debug_on THEN
708           WSH_DEBUG_SV.log(l_module_name,'NEW l_prim_rsv_qty: new tbl_detailed_qty ; ',
709                                           l_rsv_new_rec.primary_reservation_quantity ||':'||
710                                           l_rsv_new_rec.detailed_quantity);
711 -- HW OPMCONV - Added Qty2
712           WSH_DEBUG_SV.log(l_module_name,'NEW l_seccondary_rsv_qty: new tbl_detailed_qty2 ; ',
713                                           l_rsv_new_rec.secondary_reservation_quantity ||':'||
714                                           l_rsv_new_rec.secondary_detailed_quantity);
715         END IF;
716 
717         IF l_debug_on THEN
718           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_RESERVATION_pub.update_resevation 1',WSH_DEBUG_SV.C_PROC_LEVEL);
719         END IF;
720 
721 -- HW OPMCONV - NULL Qty2 if they are not presents
722         IF ( (  l_rsv_new_rec.secondary_reservation_quantity = 0 OR
723               l_rsv_new_rec.secondary_reservation_quantity = FND_API.G_MISS_NUM )
724             OR ( l_rsv_new_rec.secondary_detailed_quantity = 0  OR
725                  l_rsv_new_rec.secondary_detailed_quantity = FND_API.G_MISS_NUM ) ) THEN
726                 l_rsv_new_rec.secondary_reservation_quantity := NULL;
727                 l_rsv_new_rec.secondary_detailed_quantity := NULL;
728         END IF;
729 
730 
731         IF (l_rsv_new_rec.primary_reservation_quantity > 0) THEN
732 
733 
734 
735           inv_reservation_pub.update_reservation
736              (p_api_version_number       => 1.0,
737               p_init_msg_lst            => fnd_api.g_true,
738               x_return_status           => l_return_status,
739               x_msg_count               => l_msg_count,
740               x_msg_data                => l_msg_data,
741               p_original_rsv_rec        => l_rsv_rec,
742               p_to_rsv_rec              => l_rsv_new_rec,
743               p_original_serial_number  => l_dummy_sn, -- no serial contorl
744               p_to_serial_number        => l_dummy_sn, -- no serial control
745               p_validation_flag         => fnd_api.g_true,
746 	      -- Bug 5099694
747               p_over_reservation_flag  =>3
748              );
749 
750            IF l_debug_on THEN
751              WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS UPDATE REservation 1: ' || L_RETURN_STATUS  );
752              WSH_DEBUG_SV.log(l_module_name,'l_new_prim_rsv_qty: tbl_detailed_qty ; ',
753                                              l_rsv_new_rec.primary_reservation_quantity ||':'||
754                                              l_rsv_tbl(I).detailed_quantity);
755 -- HW OPMCONV - Added Qty2
756              WSH_DEBUG_SV.log(l_module_name,'l_new_secondary_rsv_qty: tbl_detailed_qty2 ; ',
757                                              l_rsv_new_rec.secondary_reservation_quantity ||':'||
758                                              l_rsv_tbl(I).secondary_detailed_quantity);
759            END IF;
760 
761            IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
762              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
763            ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
764              RAISE FND_API.G_EXC_ERROR;
765            END IF;
766 
767          ELSE
768 
769            IF l_debug_on THEN
770              WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_RESERVATION_pub.delete_resevation 1',WSH_DEBUG_SV.C_PROC_LEVEL);
771            END IF;
772 
773            inv_reservation_pub.delete_reservation
774            ( p_api_version_number => 1.0
775            , p_init_msg_lst       => fnd_api.g_true
776            , x_return_status      => l_return_status
777            , x_msg_count          => l_msg_count
778            , x_msg_data           => l_msg_data
779            , p_rsv_rec            => l_rsv_rec
780            , p_serial_number      => l_dummy_sn
781            );
782 
783            IF l_debug_on THEN
784              WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS DELETE REservation 1: ' || L_RETURN_STATUS  );
785            END IF;
786 
787            IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
788              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
789            ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
790              RAISE FND_API.G_EXC_ERROR;
791            END IF;
792 
793          END IF;
794 
795          IF l_debug_on THEN
796            WSH_DEBUG_SV.log(l_module_name,'l_qty_to_unreserve:l_dtld_qty_to_unreserve ; ',
797                                            l_qty_to_unreserve ||':'||
798                                            l_dtld_qty_to_unreserve);
799 -- HW OPMCONV - Added Qty2
800            WSH_DEBUG_SV.log(l_module_name,'l_qty2_to_unreserve:l_dtld_qty2_to_unreserve ; ',
801                                            l_qty2_to_unreserve ||':'||
802                                            l_dtld_qty2_to_unreserve);
803          END IF;
804 
805 
806          IF ((l_qty_to_unreserve <= 0) AND (l_dtld_qty_to_unreserve <= 0)) THEN
807            goto end_of_loop;
808          END IF;
809 
810        END IF;  -- check ATO Profile
811 
812 -- Added 'RETAIN_RSV' for bug 4721577
813 ELSIF ( (l_cancel_rsv_type = 'S' and l_staged_flag = 'Y' and p_unreserve_mode in ( 'UNRESERVE', 'RETAIN_RSV' ) ) OR
814           (p_unreserve_mode not in ( 'UNRESERVE', 'RETAIN_RSV' ) ) ) THEN
815 
816      IF (l_rsv_rec.reservation_quantity <= l_qty_to_unreserve) THEN     -- rsv. Qty <=
817 -- Added 'RETAIN_RSV' for bug 4721577
818       IF ( NVL(p_unreserve_mode, 'UNRESERVE') in ( 'UNRESERVE', 'RETAIN_RSV' ) ) THEN
819 -- 2587777 :                 -- Ato Item and for Patchset level higher than 'H' , i.e. from 'I' onwards
820  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
821                   ( p_unreserve_mode = 'RETAIN_RSV' ) ) AND
822                 G_CODE_RELEASE_LEVEL > '110508' )
823 
824 	   THEN
825 
826 		--
827                 IF l_debug_on THEN
828                   WSH_DEBUG_SV.log(l_module_name,'l_staged_flag: ',l_staged_flag);
829                 END IF;
830                 --
831 
832                       IF ( nvl(l_staged_flag, 'N')  = 'Y') THEN    -- Staged Flag = Y
833 
834                        --
835                        IF l_debug_on THEN
836                          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_STAGED_RESERVATION_UTIL.UPDATE_STAGED_FLAG',WSH_DEBUG_SV.C_PROC_LEVEL);
837                        END IF;
838                        --
839                        inv_staged_reservation_util.update_staged_flag(
840                            x_return_status       => l_return_status
841                          , x_msg_count           => l_msg_count
842                          , x_msg_data            => l_msg_data
843                          , p_staged_flag         => 'N'
844                          , p_reservation_id      => l_rsv_rec.reservation_id);
845 
846                        --
847                         IF l_debug_on THEN
848                           WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS UPDATE STAGED FLAG: ' || L_RETURN_STATUS  );
849                         END IF;
850                        --
851                         IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
852                           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
853                         ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
854                           RAISE FND_API.G_EXC_ERROR;
855                         END IF;
856                      END IF;  -- Staged Flag
857 
858           ELSE  -- Non- ATO Item
859 -- 2587777
860            --
861            IF l_debug_on THEN
862                WSH_DEBUG_SV.logmsg(l_module_name, 'CALLING INVS DELETE_RESERVATION'  );
863            END IF;
864            --
865            IF l_debug_on THEN
866                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_RESERVATION_PUB.DELETE_RESERVATION',WSH_DEBUG_SV.C_PROC_LEVEL);
867            END IF;
868            --
869 
870            inv_reservation_pub.delete_reservation
871              (p_api_version_number   => 1.0,
872               p_init_msg_lst     => fnd_api.g_true,
873               x_return_status       => l_return_status,
874               x_msg_count         => l_msg_count,
875               x_msg_data       => l_msg_data,
876               p_rsv_rec         => l_rsv_rec,
877               p_serial_number       => l_dummy_sn
878              );
879           --
880           IF l_debug_on THEN
881             WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS DELETE_RESERVATION: ' || L_RETURN_STATUS  );
882           END IF;
883           --
884 
885           IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
886             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
887           ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
888             RAISE FND_API.G_EXC_ERROR;
889           END IF;
890        END IF; -- ATO line
891     else      -- p_unreserve_mode = 'CYCLE_COUNT'
892       --
893       IF l_debug_on THEN
894         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit ONE INV_PICK_RELEASE_PUB.RESERVE_UNCONFIRMED_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
895         WSH_DEBUG_SV.log(l_module_name, 'l_rsv_rec.reservation_quantity: '  || l_rsv_rec.reservation_quantity  );
896         WSH_DEBUG_SV.log(l_module_name, ' l_rsv_rec.reservation_quantity2: ' || l_rsv_rec.secondary_reservation_quantity  );
897       END IF;
898       --
899        IF ( l_rsv_rec.secondary_reservation_quantity = 0 OR
900             l_rsv_rec.secondary_reservation_quantity =   FND_API.G_MISS_NUM ) THEN
901             l_rsv_rec.secondary_reservation_quantity := NULL;
902        END IF;
903 -- HW INVCONV - Added Qty2
904       Inv_Pick_Release_Pub.Reserve_Unconfirmed_Quantity(
905        p_api_version => 1.0,
906        p_init_msg_list => FND_API.G_FALSE,
907        p_commit => FND_API.G_FALSE,
908        x_return_status => l_reserve_status,
909        x_msg_count => l_reserve_msg_count,
910        x_msg_data => l_reserve_msg_data,
911        p_missing_quantity => l_rsv_rec.reservation_quantity ,
912        p_missing_quantity2 => l_rsv_rec.secondary_reservation_quantity ,
913        p_reservation_id => l_rsv_rec.reservation_id,
914        p_demand_source_header_id => l_sales_order_id,
915        p_demand_source_line_id => l_line_rec.line_id,
916        p_organization_id => l_rsv_rec.organization_id,
917        p_inventory_item_id => l_rsv_rec.inventory_item_id,
918        p_subinventory_code => l_rsv_rec.subinventory_code ,
919        p_locator_id => l_rsv_rec.locator_id,
920        p_revision => l_rsv_rec.revision,
921        p_lot_number => l_rsv_rec.lot_number);
922 
923        IF ((l_reserve_status = WSH_UTIL_CORE.G_RET_STS_ERROR) or
924         (l_reserve_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN     -- rsv.status
925         --
926         IF l_debug_on THEN
927             WSH_DEBUG_SV.logmsg(l_module_name, 'RESERVE UNCONFIRMED QUANTITY FAILED'  );
928             WSH_DEBUG_SV.logmsg(l_module_name, 'MESSAGE COUNT: '|| TO_CHAR ( L_RESERVE_MSG_COUNT )  );
929         END IF;
930         --
931          IF (l_reserve_msg_count = 0)  or (l_reserve_msg_count is NULL) THEN  -- rsv.msg.count
932           null;
933           ELSE
934           FOR i in 1 ..l_reserve_msg_count
935           LOOP
936              l_reserve_message := fnd_msg_pub.get(i,'T');
937              l_reserve_message := replace(l_reserve_message,chr(0), ' ');
938              --
939              IF l_debug_on THEN
940                  WSH_DEBUG_SV.logmsg(l_module_name,  L_RESERVE_MESSAGE  );
941              END IF;
942              --
943           END LOOP;
944          END if;   -- rsv.msg.count
945          x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
946          --
947          IF l_debug_on THEN
948              WSH_DEBUG_SV.logmsg(l_module_name,  'RESERVE_UNCONFIRMED_QUANTITY FAILED.. GOING ON... '  );
949          END IF;
950          --
951          END IF;
952         end if;     -- rsv.status
953 
954         IF l_debug_on THEN
955           WSH_DEBUG_SV.log(l_module_name,'l_qty_to_unreserve',
956                             l_qty_to_unreserve);
957           WSH_DEBUG_SV.log(l_module_name,'reservation_quantity',
958                                          l_rsv_rec.reservation_quantity);
959         END IF;
960         IF l_debug_on THEN
961           WSH_DEBUG_SV.logmsg(l_module_name, 'Before calculation l_qty_to_unreserve: ' || l_qty_to_unreserve  );
962 
963      END IF;
964 
965         l_qty_to_unreserve := l_qty_to_unreserve -
966                                        l_rsv_rec.reservation_quantity;
967 -- HW OPMCONV- Added Qty2
968        l_qty2_to_unreserve := l_qty2_to_unreserve -
969                                        l_rsv_rec.secondary_reservation_quantity;
970        IF l_debug_on THEN
971 
972           WSH_DEBUG_SV.logmsg(l_module_name, 'After calculation l_qty_to_unreserve: ' || l_qty_to_unreserve  );
973           WSH_DEBUG_SV.logmsg(l_module_name, 'After calculation l_qty2_to_unreserve: ' || l_qty2_to_unreserve  );
974 
975        END IF;
976 
977         IF (l_qty_to_unreserve <= 0) THEN
978              goto end_of_loop;
979         END IF;
980 
981      ELSE         --  rsv. qty >
982 
983        l_rsv_new_rec     := l_rsv_rec;
984 
985      --
986      IF l_debug_on THEN
987        WSH_DEBUG_SV.logmsg(l_module_name, 'OLD QTY : NEW QTY :: ' || L_RSV_REC.RESERVATION_QUANTITY
988                                            ||': '|| L_RSV_NEW_REC.RESERVATION_QUANTITY  );
989 
990 -- HW OPMCONV - Added Qty2
991        WSH_DEBUG_SV.logmsg(l_module_name, 'OLD QTY2 : NEW QTY2 :: ' || L_RSV_REC.SECONDARY_RESERVATION_QUANTITY
992                                            ||': '|| L_RSV_NEW_REC.SECONDARY_RESERVATION_QUANTITY  );
993      END IF;
994      --
995      l_rsv_new_rec.attribute1  := l_line_rec.preferred_grade;
996      l_rsv_new_rec.attribute2  := l_line_rec.ordered_quantity2;
997      l_rsv_new_rec.attribute3  := l_line_rec.ordered_quantity_uom2;
998 
999 -- Added 'RETAIN_RSV' for bug 4721577
1000                 if ( NVL(p_unreserve_mode,'UNRESERVE') in ( 'RETAIN_RSV', 'UNRESERVE' ) ) then
1001  -- 2587777               -- Ato Item  and Patchset level higher than 'H', i.e. from 'I' onwards
1002          IF ( ( ( l_line_rec.ato_line_id IS NOT NULL      AND
1003                          G_ATO_RSV_PROFILE  = 'Y'     AND
1004                  nvl(p_override_retain_ato_rsv, 'N') = 'N' ) OR
1005                  ( p_unreserve_mode = 'RETAIN_RSV' ) ) AND
1006                            G_CODE_RELEASE_LEVEL > '110508' ) THEN
1007 
1008            --   transfer reservation for ATOs
1009            --   2747520: At this point, it is assumed that the Rsv. records are Staged Only (filtered above) and
1010            --    the detailed_qty. for such staged recs. will be always 0
1011 
1012            l_rsv_new_rec.reservation_quantity         := l_qty_to_unreserve ;
1013            l_rsv_new_rec.primary_reservation_quantity := l_qty_to_unreserve ;
1014 -- HW OPMCONV- Added Qty2
1015            l_rsv_new_rec.secondary_reservation_quantity := l_qty2_to_unreserve ;
1016            l_rsv_new_rec.detailed_quantity            := least(nvl(l_rsv_rec.detailed_quantity, 0), l_qty_to_unreserve);
1017 -- HW OPMCONV- Added Qty2
1018            l_rsv_new_rec.secondary_detailed_quantity  := least(nvl(l_rsv_rec.secondary_detailed_quantity, 0), l_qty2_to_unreserve);
1019 -- 2847687 : after discussion with INV the Req.date will now be passed on as date_sched instead of sysdate
1020            l_rsv_new_rec.requirement_date             := l_line_rec.date_scheduled;
1021            l_rsv_new_rec.ship_ready_flag              := 2;
1022 -- R12, X-dock
1023            l_rsv_new_rec.demand_source_line_detail   := null;
1024 
1025             --
1026             IF l_debug_on THEN
1027               WSH_DEBUG_SV.logmsg(l_module_name, 'NEW Split Record QTY : Dtld QTY :: ' ||
1028                                                    L_RSV_NEW_REC.RESERVATION_QUANTITY ||': '||
1029                                                    L_RSV_NEW_REC.DETAILED_QUANTITY  );
1030 -- HW OPMCONV - Added Qty2
1031               WSH_DEBUG_SV.logmsg(l_module_name, 'NEW Split Record QTY2 : Dtld QTY2 :: ' ||
1032                                                    L_RSV_NEW_REC.SECONDARY_RESERVATION_QUANTITY ||': '||
1033                                                    L_RSV_NEW_REC.SECONDARY_DETAILED_QUANTITY  );
1034             END IF;
1035             --
1036             IF l_debug_on THEN
1037               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_RESERVATION_PUB.TRANSFER_RESERVATION',WSH_DEBUG_SV.C_PROC_LEVEL);
1038             END IF;
1039             --
1040             --
1041 
1042 -- HW OPMCONV - NULL Qty2 if they are not presents
1043         IF ( (  l_rsv_new_rec.secondary_reservation_quantity = 0 OR
1044               l_rsv_new_rec.secondary_reservation_quantity = FND_API.G_MISS_NUM )
1045             OR ( l_rsv_new_rec.secondary_detailed_quantity = 0 OR
1046                  l_rsv_new_rec.secondary_detailed_quantity = FND_API.G_MISS_NUM ) ) THEN
1047                 l_rsv_new_rec.secondary_reservation_quantity := NULL;
1048                 l_rsv_new_rec.secondary_detailed_quantity := NULL;
1049         END IF;
1050 
1051 
1052           INV_RESERVATION_PUB.transfer_reservation
1053               (p_api_version_number     => 1.0,
1054                p_init_msg_lst           => fnd_api.g_true,
1055                x_return_status          => l_return_status,
1056                x_msg_count              => l_msg_count,
1057                x_msg_data               => l_msg_data,
1058                p_original_rsv_rec       => l_rsv_rec,
1059                p_to_rsv_rec             => l_rsv_new_rec,
1060                p_original_serial_number => l_dummy_sn, -- no serial contorl
1061                p_to_serial_number       => l_dummy_sn, -- no serial control
1062                p_validation_flag        => fnd_api.g_true,
1063 	       -- Bug 5099694
1064                p_over_reservation_flag  =>3,
1065                x_to_reservation_id      => l_new_rsv_id
1066               );
1067               --
1068               IF l_debug_on THEN
1069                WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS TRANSFER RESERVATION: ' || L_RETURN_STATUS  );
1070                WSH_DEBUG_SV.log(l_module_name,'New Rec: reservation id: ', l_new_rsv_id);
1071               END IF;
1072               --
1073 
1074               IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1075                  RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1076               ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
1077                  RAISE FND_API.G_EXC_ERROR;
1078               END IF;
1079 
1080               --
1081               IF l_debug_on THEN
1082                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_STAGED_RESERVATION_UTIL.QUERY_STAGED_FLAG',WSH_DEBUG_SV.C_PROC_LEVEL);
1083               END IF;
1084               --
1085 
1086               inv_staged_reservation_util.query_staged_flag(
1087                            x_return_status                       => l_return_status
1088                            , x_msg_count                         => l_msg_count
1089                            , x_msg_data                          => l_msg_data
1090                            , x_staged_flag                       => l_staged_flag
1091                            , p_reservation_id                    => l_new_rsv_id);
1092               --
1093               IF l_debug_on THEN
1094                 WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS QUERY STAGED FLAG: ' || L_RETURN_STATUS  );
1095                 WSH_DEBUG_SV.log(l_module_name,'l_staged_flag: ',l_staged_flag);
1096               END IF;
1097               --
1098 
1099               IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1100                  RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1101               ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
1102                  RAISE FND_API.G_EXC_ERROR;
1103               END IF;
1104 
1105               If ( nvl(l_staged_flag, 'N')  = 'Y') then    -- Staged
1106               --
1107               IF l_debug_on THEN
1108                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_STAGED_RESERVATION_UTIL.UPDATE_STAGED_FLAG',WSH_DEBUG_SV.C_PROC_LEVEL);
1109               END IF;
1110               --
1111                  inv_staged_reservation_util.update_staged_flag(
1112                     x_return_status                      => l_return_status
1113                     , x_msg_count                        => l_msg_count
1114                     , x_msg_data                         => l_msg_data
1115                     , p_staged_flag                      => 'N'
1116                     , p_reservation_id                   => l_new_rsv_id);
1117               --
1118               IF l_debug_on THEN
1119                WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS UPDATE STAGED FLAG: ' || L_RETURN_STATUS  );
1120               END IF;
1121               --
1122               IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1123                  RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1124               ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
1125                  RAISE FND_API.G_EXC_ERROR;
1126               END IF;
1127              End if;  -- Staged_flag = Y
1128 
1129            ELSE  -- (i.e. Not an ATO )
1130 -- 2587777
1131    IF l_debug_on THEN
1132           WSH_DEBUG_SV.logmsg(l_module_name, 'TWO Before calculation l_qty_to_unreserve: ' || l_qty_to_unreserve  );
1133           WSH_DEBUG_SV.logmsg(l_module_name, 'TWO Before calculation _rsv_new_rec.reservation_quantity: ' || l_rsv_new_rec.reservation_quantity  );
1134 
1135        END IF;
1136 
1137             l_rsv_new_rec.reservation_quantity :=  l_rsv_rec.reservation_quantity - l_qty_to_unreserve ;
1138 -- HW OPMCONV - Added Qty2
1139             l_rsv_new_rec.secondary_reservation_quantity :=  l_rsv_rec.secondary_reservation_quantity - l_qty2_to_unreserve ;
1140             IF l_debug_on THEN
1141                 WSH_DEBUG_SV.logmsg(l_module_name, 'ONE After calculation l_rsv_new_rec.reservation_quantity: ' || l_rsv_new_rec.reservation_quantity  );
1142                 WSH_DEBUG_SV.logmsg(l_module_name, 'ONE After calculation l_rsv_new_rec.secondary_reservation_quantity: ' || l_rsv_new_rec.secondary_reservation_quantity  );
1143                 WSH_DEBUG_SV.logmsg(l_module_name, 'TWO Before calculation ll_rsv_new_rec.primary_reservation_quantity: ' || l_rsv_new_rec.primary_reservation_quantity );
1144                 WSH_DEBUG_SV.logmsg(l_module_name, 'TWO Before calculation l_rsv_rec.reservation_quantity: ' || l_rsv_rec.reservation_quantity );
1145 -- HW OPMCONV - Added Qty2
1146                 WSH_DEBUG_SV.logmsg(l_module_name, 'TWO Before calculation ll_rsv_new_rec.secondary_reservation_quantity: ' || l_rsv_new_rec.secondary_reservation_quantity );
1147                 WSH_DEBUG_SV.logmsg(l_module_name, 'TWO Before calculation l_rsv_rec.secondary_reservation_quantity: ' || l_rsv_rec.secondary_reservation_quantity );
1148 
1149             END IF;
1150 
1151             l_rsv_new_rec.primary_reservation_quantity := l_rsv_rec.reservation_quantity - l_qty_to_unreserve ;
1152 -- HW OPMCONV - Added Qty2
1153             l_rsv_new_rec.secondary_reservation_quantity := l_rsv_rec.secondary_reservation_quantity - l_qty2_to_unreserve ;
1154 
1155             IF l_debug_on THEN
1156               WSH_DEBUG_SV.logmsg(l_module_name, 'TWO After calculation ll_rsv_new_rec.primary_reservation_quantity: ' || l_rsv_new_rec.primary_reservation_quantity );
1157               WSH_DEBUG_SV.logmsg(l_module_name, 'TWO After calculation ll_rsv_new_rec.secondary_reservation_quantity: ' || l_rsv_new_rec.secondary_reservation_quantity );
1158             END IF;
1159 
1160            --
1161            IF l_debug_on THEN
1162                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_RESERVATION_PUB.UPDATE_RESERVATION',WSH_DEBUG_SV.C_PROC_LEVEL);
1163            END IF;
1164            --
1165            -- HW OPMCONV - NULL Qty2 if they are not presents
1166         IF (  l_rsv_new_rec.secondary_reservation_quantity = 0  OR
1167               l_rsv_new_rec.secondary_reservation_quantity = FND_API.G_MISS_NUM ) THEN
1168 
1169             l_rsv_new_rec.secondary_reservation_quantity := NULL;
1170 
1171         END IF;
1172 
1173            inv_reservation_pub.update_reservation
1174              (p_api_version_number     => 1.0,
1175               p_init_msg_lst           => fnd_api.g_true,
1176               x_return_status          => l_return_status,
1177               x_msg_count              => l_msg_count,
1178               x_msg_data               => l_msg_data,
1179               p_original_rsv_rec       => l_rsv_rec,
1180               p_to_rsv_rec             => l_rsv_new_rec,
1181               p_original_serial_number => l_dummy_sn, -- no serial contorl
1182               p_to_serial_number       => l_dummy_sn, -- no serial control
1183               p_validation_flag        => fnd_api.g_true,
1184 	     -- Bug 5099694
1185               p_over_reservation_flag  =>3
1186              );
1187            --
1188            IF l_debug_on THEN
1189                WSH_DEBUG_SV.logmsg(l_module_name, 'AFTER CALLING INVS UPDATE_RESERVATION: ' || L_RETURN_STATUS  );
1190            END IF;
1191            --
1192            IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN   -- UnExp Erro
1193             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1194            ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN    -- STS Error
1195             IF l_msg_data is not null THEN     -- msg.data not null
1196               fnd_message.set_encoded(l_msg_data);
1197               l_buffer := fnd_message.get;
1198              --
1199              IF l_debug_on THEN
1200                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit OE_MSG_PUB.ADD_TEXT',WSH_DEBUG_SV.C_PROC_LEVEL);
1201              END IF;
1202              --
1203              oe_msg_pub.add_text(p_message_text => l_buffer);
1204              --
1205              IF l_debug_on THEN
1206                  WSH_DEBUG_SV.logmsg(l_module_name, 'ERROR : '|| L_BUFFER  );
1207              END IF;
1208              --
1209             END IF;    -- msg.data not null
1210             RAISE FND_API.G_EXC_ERROR;
1211            END IF;      --  UnExp Error
1212         END IF;     -- (if ATO ..)
1213     else  -- p_unreserve_mode = 'CYCLE_COUNT'
1214       --
1215       IF l_debug_on THEN
1216           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit TWO INV_PICK_RELEASE_PUB.RESERVE_UNCONFIRMED_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
1217           WSH_DEBUG_SV.log(l_module_name, 'p_missing_quantity: ' || l_qty_to_unreserve  );
1218           WSH_DEBUG_SV.log(l_module_name, 'p_missing_quantity2: '|| l_qty2_to_unreserve  );
1219 
1220       END IF;
1221       --
1222 
1223       IF ( l_qty2_to_unreserve = 0 or l_qty2_to_unreserve = FND_API.G_MISS_NUM) THEN
1224           l_qty2_to_unreserve := NULL;
1225       END IF;
1226 
1227       Inv_Pick_Release_Pub.Reserve_Unconfirmed_Quantity(
1228        p_api_version => 1.0,
1229        p_init_msg_list => FND_API.G_FALSE,
1230        p_commit => FND_API.G_FALSE,
1231        x_return_status => l_reserve_status,
1232        x_msg_count => l_reserve_msg_count,
1233        x_msg_data => l_reserve_msg_data,
1234        p_missing_quantity => l_qty_to_unreserve ,
1235        p_missing_quantity2 => l_qty2_to_unreserve ,
1236        p_reservation_id => l_rsv_rec.reservation_id ,
1237        p_demand_source_header_id => l_sales_order_id,
1238        p_demand_source_line_id => l_line_rec.line_id,
1239        p_organization_id => l_rsv_rec.organization_id,
1240        p_inventory_item_id => l_rsv_rec.inventory_item_id,
1241        p_subinventory_code => l_rsv_rec.subinventory_code ,
1242        p_locator_id => l_rsv_rec.locator_id,
1243        p_revision => l_rsv_rec.revision,
1244        p_lot_number => l_rsv_rec.lot_number);
1245      IF ((l_reserve_status = WSH_UTIL_CORE.G_RET_STS_ERROR) or
1246       (l_reserve_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN   -- Sts or UnExp. Error
1247       --
1248       IF l_debug_on THEN
1249           WSH_DEBUG_SV.logmsg(l_module_name,  'RESERVE UNCONFIRMED QUANTITY FAILED'  );
1250       END IF;
1251       --
1252       --
1253       IF l_debug_on THEN
1254           WSH_DEBUG_SV.logmsg(l_module_name,  'MESSAGE COUNT: '|| TO_CHAR ( L_RESERVE_MSG_COUNT )  );
1255       END IF;
1256       --
1257        IF (l_reserve_msg_count = 0)  or (l_reserve_msg_count is NULL) THEN   -- Msg. Count
1258         null;
1259        ELSE
1260         FOR i in 1 ..l_reserve_msg_count
1261         LOOP
1262          l_reserve_message := fnd_msg_pub.get(i,'T');
1263          l_reserve_message := replace(l_reserve_message,chr(0), ' ');
1264          --
1265          IF l_debug_on THEN
1266              WSH_DEBUG_SV.logmsg(l_module_name,  L_RESERVE_MESSAGE  );
1267          END IF;
1268          --
1269         END LOOP;
1270        END if;     -- If Msg. Count
1271       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1272       --
1273       IF l_debug_on THEN
1274           WSH_DEBUG_SV.logmsg(l_module_name,  'RESERVE_UNCONFIRMED_QUANTITY FAILED.. GOING ON... '  );
1275       END IF;
1276       --
1277      END IF;   -- Sts or UnExp. Error
1278     END IF;    -- UnReserve Mode
1279     goto end_of_loop; -- Bug 2100800: Get out of the loop as there should be nothing more to unreserve.
1280    END IF;          -- Staged and  Cycle-Count
1281   END IF;  --  2747520: Cancel Unstaged
1282  END LOOP;
1283  null;
1284 
1285 -- HW OPMCONV - Removed brnaching the code
1286 
1287  <<end_of_loop>>
1288 
1289   --
1290   IF l_debug_on THEN
1291       WSH_DEBUG_SV.logmsg(l_module_name, 'EXITING UNRESERVE_DELIVERY_DETAIL '  );
1292   END IF;
1293   --
1294 
1295 --
1296 IF l_debug_on THEN
1297     WSH_DEBUG_SV.pop(l_module_name);
1298 END IF;
1299 --
1300 EXCEPTION
1301   -- bug 2442178: added expected exceptions to appropriately set return status
1302   WHEN FND_API.G_EXC_ERROR THEN
1303     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1304     --
1305     IF l_debug_on THEN
1306       WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1307       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
1308     END IF;
1309     --
1310     return;
1311   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1312     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1313     --
1314     IF l_debug_on THEN
1315       WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_UNEXPECTED_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1316       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
1317     END IF;
1318     --
1319     return;
1320 
1321   WHEN OTHERS THEN
1322     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1323     wsh_util_core.default_handler('WSH_NEW_DELIVERY_ACTIONS.UNRESERVE_DELIVERY_DETAIL',l_module_name);
1324     --
1325     IF l_debug_on THEN
1326       WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
1327       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
1328     END IF;
1329     --
1330 END Unreserve_delivery_detail ;
1331 
1332 
1333 --
1334 --Procedure:      Assign_Detail_to_Delivery
1335 --Parameters:      p_detail_id,
1336 --           p_delivery_id,
1337 --           x_return_status
1338 --           x_dlvy_has_lines : 'Y' :delivery has non-container lines.
1339 --                              'N' : delivery does not have non-container lines
1340 --           x_dlvy_freight_Terms_code : Delivery's freight term code
1341 --Description:      This procedure will assign the specified
1342 --           delivery_detail to the specIFied delivery
1343 --           and return the status
1344 
1345 PROCEDURE Assign_Detail_to_Delivery(
1346    P_DETAIL_ID     IN number,
1347    P_DELIVERY_ID     IN number,
1348    X_RETURN_STATUS    OUT NOCOPY  varchar2,
1349     x_dlvy_has_lines          IN OUT NOCOPY VARCHAR2,    -- J-IB-NPARIKH
1350     x_dlvy_freight_terms_code IN OUT NOCOPY VARCHAR2, -- J-IB-NPARIKH
1351     p_caller        IN VARCHAR2 --bug 5100229
1352    ) IS
1353 
1354 CURSOR c_topmost_container IS
1355 SELECT  delivery_detail_id
1356 FROM  wsh_delivery_assignments_v
1357 WHERE parent_delivery_detail_id is null
1358 START WITH delivery_detail_id =p_detail_id
1359 CONNECT BY prior parent_delivery_detail_id = delivery_detail_id
1360 and rownum < 10;
1361 --restricting to 10 levels (performance)
1362 
1363 -- /== Workflow Changes
1364 --WF: CMR
1365 CURSOR c_get_del_lines_count(p_delv_id NUMBER) IS
1366 SELECT
1367 COUNT(1) lines_count,
1368 COUNT(DECODE(WDD.pickable_flag,'Y',DECODE(WDD.released_status,'R',NULL,
1369                                                               'X',NULL,
1370                                                               'N',NULL,
1371                                                               1
1372                                          ),
1373                                NULL
1374             )
1375      ) picked_lines_count
1376 FROM wsh_delivery_assignments_v wda,
1377      wsh_delivery_details wdd
1378 WHERE
1379      wda.delivery_detail_id= wdd.delivery_detail_id AND
1380      wdd.container_flag = 'N' AND
1381      wda.delivery_id = p_delv_id;
1382 
1383 CURSOR c_get_org_id ( p_delv_id NUMBER) IS
1384  SELECT organization_id
1385  FROM wsh_new_deliveries
1386  WHERE delivery_id=p_delv_id;
1387 
1388 l_org_id NUMBER;
1389 l_del_lines_count NUMBER;
1390 l_process_started VARCHAR2(1);
1391 l_return_status VARCHAR2(1);
1392 l_wf_rs VARCHAR2(1);
1393 l_start_wf BOOLEAN;
1394 l_raise_pickinitiated_event BOOLEAN;
1395 l_count_picked_lines Number;
1396 l_del_entity_ids WSH_UTIL_CORE.column_tab_type;
1397 l_purged_count    NUMBER;
1398 --WF: CMR
1399 l_raise_carrierselect_event BOOLEAN;
1400 l_del_ids WSH_UTIL_CORE.ID_tab_type;
1401 l_del_old_carrier_ids WSH_UTIL_CORE.ID_tab_type;
1402 -- Workflow Changes ==/
1403 
1404 
1405 l_topmost_delivery_detail_id NUMBER;
1406 
1407 assign_fail exception;
1408 
1409 --
1410 l_debug_on BOOLEAN;
1411 --
1412 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'ASSIGN_DETAIL_TO_DELIVERY';
1413 --
1414 BEGIN
1415   --
1416   --
1417   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
1418   --
1419   IF l_debug_on IS NULL
1420   THEN
1421       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
1422   END IF;
1423   --
1424   IF l_debug_on THEN
1425       WSH_DEBUG_SV.push(l_module_name);
1426       --
1427       WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
1428       WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
1429         WSH_DEBUG_SV.log(l_module_name,'x_dlvy_has_lines',x_dlvy_has_lines);
1430         WSH_DEBUG_SV.log(l_module_name,'x_dlvy_freight_terms_code',x_dlvy_freight_terms_code);
1431   END IF;
1432   --
1433   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1434 
1435   /* if detail is not assigned to a container, update WDA. else find topmost container
1436   in the hierarchy (this can be a detail in case of loose details), iterate thru each
1437     level and assign each level to delivery any error in any level => rollback changes*/
1438 
1439   SAVEPOINT before_assign_topmost_cont;
1440   OPEN  c_topmost_container;
1441   FETCH   c_topmost_container INTO l_topmost_delivery_detail_id;
1442   IF    (c_topmost_container%FOUND)  THEN
1443 
1444      --/== Workflow Changes
1445      l_start_wf :=FALSE;
1446      l_raise_pickinitiated_event :=FALSE;
1447 
1448      OPEN c_get_del_lines_count(p_delivery_id);
1449      FETCH c_get_del_lines_count into l_del_lines_count,l_count_picked_lines ;
1450      CLOSE c_get_del_lines_count;
1451      IF (l_del_lines_count = 0) THEN
1452 	 l_start_wf := TRUE;
1453 	 l_raise_pickinitiated_event :=TRUE;
1454 	 --WF: CMR CURRENTLY NOT IN USE
1455 	 --l_raise_carrierselect_event :=TRUE;
1456      ELSIF (l_count_picked_lines =0) THEN
1457 	l_raise_pickinitiated_event :=TRUE;
1458      END IF;
1459      -- Workflow Changes ==/
1460      --
1461      IF l_debug_on THEN
1462          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);
1463      END IF;
1464      --
1465 
1466      wsh_delivery_details_actions.assign_top_detail_to_delivery(
1467         P_DETAIL_ID => l_topmost_delivery_detail_id,
1468         P_DELIVERY_ID => p_delivery_id,
1469         X_RETURN_STATUS => x_return_status,
1470         x_dlvy_has_lines          => x_dlvy_has_lines,   -- J-IB-NPARIKH
1471         x_dlvy_freight_terms_code => x_dlvy_freight_terms_code,     -- J-IB-NPARIKHS
1472         p_caller         => p_caller --bug 5100229
1473             );
1474 
1475     IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS ) THEN
1476       RAISE assign_fail;
1477     END IF;
1478 
1479      --/==  Workflow Changes
1480      IF (l_start_wf OR l_raise_pickinitiated_event ) THEN
1481 	     OPEN c_get_del_lines_count(p_delivery_id );
1482 	     FETCH c_get_del_lines_count INTO l_del_lines_count, l_count_picked_lines;
1483 	     CLOSE c_get_del_lines_count;
1484 
1485 	     OPEN c_get_org_id ( p_delivery_id );
1486 	     FETCH c_get_org_id INTO l_org_id;
1487 	     CLOSE c_get_org_id;
1488      END IF;
1489 
1490      IF ( l_start_wf AND l_del_lines_count > 0 )THEN
1491 	-- Check for existing WF process and if it exists Call Purge Workflow
1492 	-- After Purge, start a new workflow Process.
1493 	-- Purging is required since a New Delivery Workflow will be selected according
1494 	-- to the Delivery Detail Assigned to it
1495 	IF l_debug_on THEN
1496 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WF_STD.CHECK_WF_EXISTS',WSH_DEBUG_SV.C_PROC_LEVEL);
1497 	END IF;
1498 	WSH_WF_STD. Check_Wf_Exists(
1499 						p_entity_type => 'DELIVERY',
1500 						p_entity_id => p_delivery_id,
1501 						x_wf_process_exists => l_process_started,
1502 						x_return_status => l_return_status);
1503 	IF l_debug_on THEN
1504 			WSH_DEBUG_SV.log(l_module_name,'L_PROCESS_STARTED',l_process_started);
1505 			WSH_DEBUG_SV.log(l_module_name,'L_RETURN_STATUS',l_return_status);
1506 	END IF;
1507 
1508 	IF(l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS AND l_process_started='Y' ) THEN
1509 		IF l_debug_on THEN
1510 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WF_STD.PURGE_ENTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
1511 		END IF;
1512 		l_del_entity_ids(1) := p_delivery_id;
1513 		WSH_WF_STD.Purge_Entity(
1514 			p_entity_type => 'DELIVERY',
1515 			p_entity_ids  => l_del_entity_ids,
1516 			x_success_count  => l_purged_count,
1517 			x_return_status => l_return_status);
1518 		IF l_debug_on THEN
1519 			WSH_DEBUG_SV.log(l_module_name,'L_PURGED_COUNT',l_purged_count);
1520 			WSH_DEBUG_SV.log(l_module_name,'L_RETURN_STATUS',l_return_status);
1521 		END IF;
1522 	 END IF;	-- If WorkFlow Exists
1523 
1524 	 IF(l_return_status=WSH_UTIL_CORE.G_RET_STS_SUCCESS ) THEN
1525 		IF l_debug_on THEN
1526 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WF_STD.START_WF_PROCESS',WSH_DEBUG_SV.C_PROC_LEVEL);
1527 		END IF;
1528 
1529 		 WSH_WF_STD.start_wf_process(
1530 								p_entity_type		=> 'DELIVERY',
1531 								p_entity_id		=> p_delivery_id,
1532 								p_organization_id	=>l_org_id,
1533 								x_process_started	=>l_process_started,
1534 								x_return_status	=>l_return_status
1535 								 );
1536 		 IF l_debug_on THEN
1537 			WSH_DEBUG_SV.log(l_module_name,'L_PROCESS_STARTED',l_process_started);
1538 			WSH_DEBUG_SV.log(l_module_name,'L_RETURN_STATUS',l_return_status);
1539 		 END IF;
1540 	 END IF;
1541 
1542      END IF;-- If Start Workflow
1543 
1544      --Raise Event: Pick To Pod Workflow
1545      IF ( l_raise_pickinitiated_event AND  l_count_picked_lines > 0 ) THEN
1546 		IF l_debug_on THEN
1547 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WF_STD.RAISE_EVENT',WSH_DEBUG_SV.C_PROC_LEVEL);
1548 		END IF;
1549 		WSH_WF_STD.Raise_Event(
1550 					p_entity_type => 'DELIVERY',
1551 					p_entity_id =>  p_delivery_id,
1552 					p_event => 'oracle.apps.wsh.delivery.pik.pickinitiated' ,
1553 					p_organization_id =>  l_org_id,
1554 					x_return_status => l_wf_rs ) ;
1555 		 IF l_debug_on THEN
1556 		     WSH_DEBUG_SV.log(l_module_name,'Delivery ID is  ',  p_delivery_id );
1557 		     WSH_DEBUG_SV.log(l_module_name,'Return Status After Calling WSH_WF_STD.Raise_Event',l_wf_rs);
1558 		 END IF;
1559      END IF;
1560      -- Done Raise Event: Pick To Pod Workflow
1561      /* CURRENTLY NOT IN USE
1562      --WF: CMR
1563      IF (l_raise_carrierselect_event) THEN
1564        l_del_ids(1) := p_delivery_id;
1565        WSH_WF_STD.Get_Carrier(p_del_ids => l_del_ids,
1566                               x_del_old_carrier_ids => l_del_old_carrier_ids,
1567                               x_return_status => l_wf_rs);
1568 
1569        IF (l_del_old_carrier_ids(1) IS NOT NULL) THEN
1570 
1571          WSH_WF_STD.Assign_Unassign_Carrier(p_delivery_id => l_del_ids(1),
1572                                             p_old_carrier_id => NULL,
1573                                             p_new_carrier_id => l_del_old_carrier_ids(1),
1574                                             x_return_status => l_wf_rs);
1575        END IF;
1576 
1577      END IF;
1578      */
1579      -- Workflow Changes ==/
1580 
1581   END IF;--for topmost container
1582   CLOSE  c_topmost_container;
1583   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1584   --
1585   IF l_debug_on THEN
1586       WSH_DEBUG_SV.pop(l_module_name);
1587   END IF;
1588   --
1589   return;
1590   --
1591   exception
1592     WHEN assign_fail THEN
1593       ROLLBACK TO before_assign_topmost_cont;
1594       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1595       wsh_util_core.add_message(x_return_status,l_module_name);
1596       --
1597       IF l_debug_on THEN
1598           WSH_DEBUG_SV.logmsg(l_module_name,'ASSIGN_FAIL exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1599           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:ASSIGN_FAIL');
1600       END IF;
1601       --
1602     WHEN others THEN
1603       ROLLBACK TO before_assign_topmost_cont;
1604       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1605       wsh_util_core.add_message(x_return_status,l_module_name);
1606       wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_DELIVERY_DETAIL',l_module_name);
1607 
1608 --
1609 IF l_debug_on THEN
1610     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
1611     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
1612 END IF;
1613 --
1614 END Assign_Detail_to_Delivery;
1615 
1616 -------------------------------------------------------------------
1617 -- This procedure is only for backward compatibility. No one should call
1618 -- this procedure.
1619 -------------------------------------------------------------------
1620 
1621 PROCEDURE Assign_Detail_to_Delivery(
1622     P_DETAIL_ID     IN NUMBER,
1623     P_DELIVERY_ID   IN NUMBER,
1624     X_RETURN_STATUS OUT NOCOPY  VARCHAR2,
1625     p_caller        IN VARCHAR2 --bug 5100229
1626     ) IS
1627 
1628 --
1629 l_debug_on BOOLEAN;
1630 --
1631 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'Assign_Detail_to_Delivery';
1632 --
1633 l_has_lines               VARCHAR2(1);
1634 l_dlvy_freight_terms_code VARCHAR2(30);
1635 --
1636 BEGIN
1637     --
1638     --
1639     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
1640     --
1641     IF l_debug_on IS NULL
1642     THEN
1643         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
1644     END IF;
1645     --
1646     IF l_debug_on THEN
1647         WSH_DEBUG_SV.push(l_module_name);
1648         --
1649         WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
1650         WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
1651     END IF;
1652     --
1653     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1654     --
1655     l_has_lines := WSH_DELIVERY_VALIDATIONS.has_lines
1656                         (
1657                             p_delivery_id => p_delivery_id
1658                         );
1659     --
1660     Assign_Detail_to_Delivery
1661         (
1662             p_detail_id               => p_detail_id,
1663             p_delivery_id             => p_delivery_id,
1664             X_RETURN_STATUS           => X_RETURN_STATUS,
1665             x_dlvy_has_lines          => l_has_lines,
1666             x_dlvy_freight_Terms_code => l_dlvy_freight_Terms_code,
1667             p_caller                  => p_caller --bug 5100229
1668         );
1669     --
1670     IF l_debug_on THEN
1671         WSH_DEBUG_SV.pop(l_module_name);
1672     END IF;
1673     --
1674 EXCEPTION
1675     WHEN others THEN
1676         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1677         wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.Assign_Detail_to_Delivery',l_module_name);
1678         --
1679         IF l_debug_on THEN
1680             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
1681         END IF;
1682 END Assign_Detail_to_Delivery;
1683 
1684 -- OTM R12 : assign delivery detail
1685 
1686 --========================================================================
1687 -- PROCEDURE : Pre_Otm_Assign_Del_Detail
1688 --
1689 --             API added for R12 Glog Integration
1690 --
1691 -- PURPOSE :   To check whether the delivery was empty(no actual details)
1692 --             before any delivery_detail is assigned.  Also checks if
1693 --             if detail and containers are already on the same delivery
1694 --
1695 -- PARAMETERS:
1696 --     p_delivery_id         delivery id
1697 --     p_detail_id           delivery detail id
1698 --     p_container1_id       container 1's id
1699 --     p_container2_id       container 2's id
1700 --     p_assignment_type     assignment types can be DD2D, DD2C, C2C.
1701 --                           this covers detail to delivery, detail to container,
1702 --                           container to container, and container to delivery will
1703 --                           be same as DD2D.
1704 --     x_delivery_was_empty  TRUE if it was empty, FALSE if it was not empty
1705 --     x_tms_update          TRUE if tms update needed, FALSE if detail and
1706 --                           containers already on the same delivery
1707 --     x_gross_weight1       the gross weight of the detail or container getting assigned
1708 --     x_gross_weight2       the gross weight of the container being assigned to.
1709 --     x_return status       SUCCESS or ERROR
1710 --========================================================================
1711 
1712 
1713 PROCEDURE Pre_Otm_Assign_Del_Detail
1714                     (p_delivery_id        IN         NUMBER,
1715                      p_detail_id          IN         NUMBER,
1716                      p_container1_id      IN         NUMBER,
1717                      p_container2_id      IN         NUMBER,
1718                      p_assignment_type    IN         VARCHAR2,
1719                      x_delivery_was_empty OUT NOCOPY BOOLEAN,
1720                      x_assign_update      OUT NOCOPY BOOLEAN,
1721                      x_gross_weight1      OUT NOCOPY NUMBER,
1722                      x_gross_weight2      OUT NOCOPY NUMBER,
1723                      x_return_status      OUT NOCOPY VARCHAR2) IS
1724 
1725   CURSOR c_get_delivery_id(p_id IN NUMBER) IS
1726     SELECT delivery_id
1727     FROM   wsh_delivery_assignments
1728     WHERE  delivery_detail_id = p_id;
1729 
1730   CURSOR c_get_gross_weight (p_id NUMBER) IS
1731     SELECT nvl(gross_weight, 0)
1732     FROM   wsh_delivery_details
1733     WHERE  delivery_detail_id = p_id;
1734 
1735   l_is_delivery_empty    VARCHAR2(1);
1736   l_delivery1            NUMBER;
1737   l_delivery2            NUMBER;
1738   l_debug_on             BOOLEAN;
1739   l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.'||G_PACKAGE_NAME||'.'||'Pre_Otm_Assign_Del_Detail';
1740 
1741 
1742 BEGIN
1743 
1744   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
1745   --
1746   IF l_debug_on IS NULL
1747   THEN
1748       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
1749   END IF;
1750   --
1751   IF l_debug_on THEN
1752       WSH_DEBUG_SV.push(l_module_name);
1753       WSH_DEBUG_SV.log(l_module_name, 'P_DELIVERY_ID', p_delivery_id);
1754       WSH_DEBUG_SV.log(l_module_name, 'P_DETAIL_ID', p_detail_id);
1755       WSH_DEBUG_SV.log(l_module_name, 'P_CONTAINER1_ID', p_container1_id);
1756       WSH_DEBUG_SV.log(l_module_name, 'P_CONTAINER2_ID', p_container2_id);
1757       WSH_DEBUG_SV.log(l_module_name, 'P_ASSIGNMENT_TYPE', p_assignment_type);
1758   END IF;
1759 
1760   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1761   x_delivery_was_empty := FALSE;
1762   x_assign_update := TRUE;  -- default to true unless everything on the same delivery.
1763 
1764   IF (p_assignment_type = 'DD2D') THEN --detail to delivery, delivery id provided
1765 
1766     OPEN c_get_delivery_id(p_detail_id);
1767     FETCH c_get_delivery_id INTO l_delivery1;
1768     CLOSE c_get_delivery_id;
1769 
1770     OPEN c_get_gross_weight(p_detail_id);
1771     FETCH c_get_gross_weight INTO x_gross_weight1;
1772     CLOSE c_get_gross_weight;
1773 
1774     IF (l_delivery1 = p_delivery_id) THEN --already assigned to the delivery
1775       x_assign_update := FALSE; --same delivery, no need to update
1776     ELSE
1777 
1778       l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(p_delivery_id);
1779       IF (l_is_delivery_empty = 'Y') THEN
1780         x_delivery_was_empty := TRUE;
1781       ELSIF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
1782         IF l_debug_on THEN
1783           WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
1784         END IF;
1785         raise FND_API.G_EXC_ERROR;
1786       END IF;
1787     END IF;
1788 
1789   ELSIF (p_assignment_type IN ('DD2C', 'C2C')) THEN
1790 
1791     IF (p_assignment_type = 'DD2C') THEN
1792       --detail to container, check delivery id of p_detail_id and p_container1_id
1793       OPEN c_get_delivery_id(p_detail_id);
1794       FETCH c_get_delivery_id INTO l_delivery1;
1795       CLOSE c_get_delivery_id;
1796 
1797       OPEN c_get_delivery_id(p_container1_id);
1798       FETCH c_get_delivery_id INTO l_delivery2;
1799       CLOSE c_get_delivery_id;
1800 
1801       OPEN c_get_gross_weight(p_detail_id);
1802       FETCH c_get_gross_weight INTO x_gross_weight1;
1803       CLOSE c_get_gross_weight;
1804 
1805       OPEN c_get_gross_weight(p_container1_id);
1806       FETCH c_get_gross_weight INTO x_gross_weight2;
1807       CLOSE c_get_gross_weight;
1808 
1809     ELSE
1810       --container to container, check delivery id of p_container1_id and p_container2_id
1811       OPEN c_get_delivery_id(p_container1_id);
1812       FETCH c_get_delivery_id INTO l_delivery1;
1813       CLOSE c_get_delivery_id;
1814 
1815       OPEN c_get_delivery_id(p_container2_id);
1816       FETCH c_get_delivery_id INTO l_delivery2;
1817       CLOSE c_get_delivery_id;
1818 
1819       OPEN c_get_gross_weight(p_container1_id);
1820       FETCH c_get_gross_weight INTO x_gross_weight1;
1821       CLOSE c_get_gross_weight;
1822 
1823       OPEN c_get_gross_weight(p_container2_id);
1824       FETCH c_get_gross_weight INTO x_gross_weight2;
1825       CLOSE c_get_gross_weight;
1826 
1827     END IF;
1828 
1829     IF (l_delivery1 = l_delivery2) THEN --both belong to same delivery and not NULL
1830       x_assign_update := FALSE; --same delivery, no need to update
1831     ELSIF (l_delivery1 IS NOT NULL) THEN --cannot have both NOT NULL
1832 
1833       l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(l_delivery1);
1834       IF (l_is_delivery_empty = 'Y') THEN
1835         x_delivery_was_empty := TRUE;
1836       ELSIF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
1837         IF l_debug_on THEN
1838           WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
1839         END IF;
1840         raise FND_API.G_EXC_ERROR;
1841       END IF;
1842     ELSIF (l_delivery2 IS NOT NULL) THEN
1843 
1844       l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(l_delivery2);
1845       IF (l_is_delivery_empty = 'Y') THEN
1846         x_delivery_was_empty := TRUE;
1847       ELSIF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
1848         IF l_debug_on THEN
1849           WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
1850         END IF;
1851         raise FND_API.G_EXC_ERROR;
1852       END IF;
1853     END IF;
1854 
1855   ELSE
1856     IF l_debug_on THEN
1857       WSH_DEBUG_SV.log(l_module_name,'Error in wrong assignment_type', p_assignment_type);
1858     END IF;
1859     raise FND_API.G_EXC_ERROR;
1860   END IF;
1861 
1862   IF l_debug_on THEN
1863       WSH_DEBUG_SV.log(l_module_name, 'x_delivery_was_empty', x_delivery_was_empty);
1864       WSH_DEBUG_SV.log(l_module_name, 'x_assign_update', x_assign_update);
1865       WSH_DEBUG_SV.log(l_module_name, 'x_gross_weight1', x_gross_weight1);
1866       WSH_DEBUG_SV.log(l_module_name, 'x_gross_weight2', x_gross_weight2);
1867   END IF;
1868 
1869   IF l_debug_on THEN
1870       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
1871       WSH_DEBUG_SV.pop(l_module_name);
1872   END IF;
1873 
1874 EXCEPTION
1875   WHEN FND_API.G_EXC_ERROR THEN
1876     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1877 
1878     IF c_get_gross_weight%ISOPEN THEN
1879       CLOSE c_get_gross_weight;
1880     END IF;
1881 
1882     IF c_get_delivery_id%ISOPEN THEN
1883       CLOSE c_get_delivery_id;
1884     END IF;
1885 
1886     --
1887     IF l_debug_on THEN
1888       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
1889       WSH_DEBUG_SV.pop(l_module_name);
1890     END IF;
1891     --
1892     RETURN;
1893   WHEN OTHERS THEN
1894     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1895 
1896     IF c_get_gross_weight%ISOPEN THEN
1897       CLOSE c_get_gross_weight;
1898     END IF;
1899 
1900     IF c_get_delivery_id%ISOPEN THEN
1901       CLOSE c_get_delivery_id;
1902     END IF;
1903 
1904     --
1905     IF l_debug_on THEN
1906       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
1907       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION OTHERS');
1908     END IF;
1909     --
1910     RETURN;
1911 
1912 END Pre_Otm_Assign_Del_Detail;
1913 
1914 --========================================================================
1915 -- PROCEDURE : Post_Otm_Assign_Del_Detail
1916 --
1917 --             API added for R12 Glog Integration
1918 --
1919 -- PURPOSE :   updates delivery's tms_interface_flag via API
1920 --             based on the changes of detail assignments to the delivery
1921 --
1922 -- PARAMETERS:
1923 --     p_delivery_id         delivery_id
1924 --     p_delivery_was_empty  whether the delivery was empty before the new
1925 --                           assignment
1926 --     p_tms_interface_flag  delivery's latest tms_interface_flag if available
1927 --     p_gross_weight        delivery detail's gross weight if avilable
1928 --     p_delivery_detail_ids table of delivery detail ids to get gross weight
1929 --     x_return status       SUCCESS or ERROR
1930 --========================================================================
1931 
1932 PROCEDURE Post_Otm_Assign_Del_Detail
1933              (p_delivery_id         IN  NUMBER,
1934               p_delivery_was_empty  IN  BOOLEAN,
1935               p_tms_interface_flag  IN  VARCHAR2,
1936               p_gross_weight        IN  NUMBER,
1937               x_return_status       OUT NOCOPY VARCHAR2) IS
1938 
1939 
1940   l_call_update          VARCHAR2(1);
1941   l_return_status        VARCHAR2(1);
1942   l_tms_interface_flag   WSH_NEW_DELIVERIES.TMS_INTERFACE_FLAG%TYPE;
1943   l_is_delivery_empty    VARCHAR2(1);
1944   l_interface_flag_tab   WSH_UTIL_CORE.COLUMN_TAB_TYPE;
1945   l_delivery_info        WSH_NEW_DELIVERIES_PVT.Delivery_Rec_Type;
1946   l_delivery_id_tab      WSH_UTIL_CORE.ID_TAB_TYPE;
1947   l_num_warnings         NUMBER;
1948   l_debug_on             BOOLEAN;
1949   l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.'||G_PACKAGE_NAME||'.'||'Post_Otm_Assign_Del_Detail';
1950 
1951 BEGIN
1952 
1953   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
1954   --
1955   IF l_debug_on IS NULL
1956   THEN
1957       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
1958   END IF;
1959   --
1960   IF l_debug_on THEN
1961       WSH_DEBUG_SV.push(l_module_name);
1962       WSH_DEBUG_SV.log(l_module_name, 'P_DELIVERY_ID', p_delivery_id);
1963       WSH_DEBUG_SV.log(l_module_name, 'P_DELIVERY_WAS_EMPTY', p_delivery_was_empty);
1964       WSH_DEBUG_SV.log(l_module_name, 'P_TMS_INTERFACE_FLAG', p_tms_interface_flag);
1965       WSH_DEBUG_SV.log(l_module_name, 'P_GROSS_WEIGHT', p_gross_weight);
1966   END IF;
1967 
1968   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1969 
1970   l_call_update := 'Y';
1971   l_delivery_id_tab(1) := p_delivery_id;
1972 
1973   IF (p_delivery_was_empty) THEN
1974     l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(p_delivery_id);
1975 
1976     IF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
1977       IF l_debug_on THEN
1978         WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
1979       END IF;
1980       raise FND_API.G_EXC_ERROR;
1981     ELSIF (l_is_delivery_empty = 'Y') THEN
1982       l_call_update := 'N';
1983     ELSIF (l_is_delivery_empty = 'N') THEN
1984       IF (p_tms_interface_flag IS NOT NULL) THEN
1985         l_tms_interface_flag := p_tms_interface_flag;
1986       ELSE
1987         WSH_DELIVERY_VALIDATIONS.get_delivery_information(
1988                      p_delivery_id   => p_delivery_id,
1989                      x_delivery_rec  => l_delivery_info,
1990                      x_return_status => l_return_status);
1991 
1992         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
1993           IF l_debug_on THEN
1994             WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_DELIVERY_VALIDATIONS.get_delivery_information');
1995           END IF;
1996           raise FND_API.G_EXC_ERROR;
1997         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
1998           l_num_warnings := l_num_warnings + 1;
1999         END IF;
2000         l_tms_interface_flag := nvl(l_delivery_info.tms_interface_flag, WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT);
2001 
2002       END IF;
2003 
2004       IF l_debug_on THEN
2005         WSH_DEBUG_SV.log(l_module_name, 'P_DELIVERY_WAS_EMPTY - L_TMS_INTERFACE_FLAG', l_tms_interface_flag);
2006       END IF;
2007 
2008       IF (l_tms_interface_flag = WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT) THEN
2009         l_interface_flag_tab(1) := WSH_NEW_DELIVERIES_PVT.C_TMS_CREATE_REQUIRED;
2010       ELSIF (l_tms_interface_flag in
2011              (WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_REQUIRED,
2012               WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_IN_PROCESS)) THEN
2013         l_interface_flag_tab(1) := WSH_NEW_DELIVERIES_PVT.C_TMS_UPDATE_REQUIRED;
2014       ELSE
2015         l_call_update := 'N';
2016       END IF;
2017     END IF;
2018   ELSE -- (NOT p_delivery_was_empty)
2019 
2020     IF (p_gross_weight = 0) THEN
2021       l_call_update := 'N';  -- do not update if assign/unassign 0/NULL
2022                              -- weight line/LPN to nonempty delivery
2023     ELSE
2024       l_interface_flag_tab(1) := NULL;
2025       -- setting this flag here to null so that
2026       -- the update_tms_interface_flag procedure will take care of it.
2027     END IF;
2028   END IF;
2029 
2030   IF (l_call_update = 'Y') THEN
2031     WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG(
2032                p_delivery_id_tab        => l_delivery_id_tab,
2033                p_tms_interface_flag_tab => l_interface_flag_tab,
2034                x_return_status          => l_return_status);
2035 
2036     IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
2037       IF l_debug_on THEN
2038         WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG '||l_return_status);
2039       END IF;
2040       raise FND_API.G_EXC_ERROR;
2041     ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
2042       l_num_warnings := l_num_warnings + 1;
2043     END IF;
2044   END IF;
2045 
2046 
2047   IF (l_num_warnings > 0) THEN
2048     x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2049   END IF;
2050 
2051   IF l_debug_on THEN
2052       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
2053       WSH_DEBUG_SV.pop(l_module_name);
2054   END IF;
2055 
2056 EXCEPTION
2057   WHEN FND_API.G_EXC_ERROR THEN
2058     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2059     --
2060     IF l_debug_on THEN
2061       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
2062       WSH_DEBUG_SV.pop(l_module_name);
2063     END IF;
2064     --
2065     RETURN;
2066   WHEN OTHERS THEN
2067     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2068     --
2069     IF l_debug_on THEN
2070       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
2071       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION OTHERS');
2072     END IF;
2073     --
2074     RETURN;
2075 END Post_Otm_Assign_Del_Detail;
2076 
2077 -- End of OTM R12 : assign delivery detail
2078 
2079 
2080 --
2081 --Procedure:    Assign_Detail_to_Cont
2082 --Parameters:      p_detail_id,
2083 --           p_parent_detail_id,
2084 --           x_return_status
2085 --Description:      This procedure will assign the specified
2086 --           delivery_detail to the specIFied container
2087 --           and return the status
2088 
2089 --        if container is already assigned to a delivery,
2090 --        its parent containers and child containers must
2091 --        be also assigned to the same delivery already.
2092 --        So all it needs to do IS just get the delivery_id
2093 --        from the current container and assign it to the detail also.
2094 
2095 --        if the detail is already assigned to a delivery,
2096 --        then drill up and down to update the delivery id for all the
2097 --        parent and chile containers
2098 
2099 
2100 
2101 PROCEDURE Assign_Detail_To_Cont(
2102   p_detail_id     IN NUMBER,
2103   p_parent_detail_id   IN NUMBER,
2104   x_return_status    OUT NOCOPY  VARCHAR2)
2105 IS
2106 
2107 l_del_id_for_container c_del_id_for_cont_or_detail%ROWTYPE;
2108 l_del_id_for_detail c_del_id_for_cont_or_detail%ROWTYPE;
2109 
2110 l_group_by_flags WSH_DELIVERY_AUTOCREATE.group_by_flags_rec_type;
2111 
2112 invalid_detail exception;
2113 l_plan_flag varchar2(1);
2114 l_content_count NUMBER;
2115 
2116 /* H projects: pricing integration csun */
2117 m     NUMBER := 0;
2118 l_del_tab   WSH_UTIL_CORE.Id_Tab_Type;
2119 l_return_status         VARCHAR2(1);
2120 mark_reprice_error  EXCEPTION;
2121 l_ship_to               NUMBER;
2122 l_container_has_content BOOLEAN;
2123 l_mdc_detail_tab WSH_UTIL_CORE.Id_Tab_Type;
2124 l_ignore_det_tab WSH_UTIL_CORE.Id_Tab_Type;
2125 
2126 --
2127 l_debug_on BOOLEAN;
2128 --
2129 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'ASSIGN_DETAIL_TO_CONT';
2130 --
2131   l_display_error   BOOLEAN;
2132 
2133   CURSOR c_get_shipto (v_container_id NUMBER) IS
2134   SELECT ship_to_location_id
2135   FROM wsh_delivery_details
2136   WHERE delivery_detail_id = v_container_id;
2137 
2138   -- Bug 3715176
2139   CURSOR c_get_plan_flag (v_delivery_id NUMBER) IS
2140   SELECT nvl(planned_flag,'N')
2141   FROM   wsh_new_deliveries
2142   WHERE  delivery_id = v_delivery_id;
2143 
2144   CURSOR c_get_content_count(v_delivery_detail_id NUMBER) IS
2145   SELECT count(*)
2146   FROM   wsh_delivery_assignments_v wda
2147   WHERE	 wda.parent_delivery_detail_id = v_delivery_detail_id And rownum = 1;
2148   -- Bug 3715176
2149 
2150   -- Bug 4452930
2151   CURSOR c_topmost_container(p_detail_id NUMBER) IS
2152   SELECT  delivery_detail_id
2153   FROM  wsh_delivery_assignments_v
2154   WHERE parent_delivery_detail_id is null
2155   START WITH delivery_detail_id =p_detail_id
2156   CONNECT BY prior parent_delivery_detail_id = delivery_detail_id
2157   and rownum < 10;
2158   --restricting to 10 levels (performance)
2159   l_topmost_cont NUMBER;
2160 
2161   -- Bug 4452930
2162 
2163 l_attr_tab  wsh_delivery_autocreate.grp_attr_tab_type;
2164 l_group_tab  wsh_delivery_autocreate.grp_attr_tab_type;
2165 l_action_rec wsh_delivery_autocreate.action_rec_type;
2166 l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
2167 l_matched_entities wsh_util_core.id_tab_type;
2168 l_out_rec wsh_delivery_autocreate.out_rec_type;
2169 l_group_index NUMBER;
2170 
2171 l_num_warnings          number := 0;
2172 
2173 -- K LPN CONV. rv
2174 l_wms_org    VARCHAR2(10) := 'N';
2175 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
2176 l_sync_tmp_recTbl wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
2177 l_operation_type VARCHAR2(100);
2178 -- K LPN CONV. rv
2179 
2180 -- OTM R12 : update delivery
2181 l_delivery_info_tab       WSH_NEW_DELIVERIES_PVT.Delivery_Attr_Tbl_Type;
2182 l_delivery_info           WSH_NEW_DELIVERIES_PVT.Delivery_Rec_Type;
2183 l_new_interface_flag_tab  WSH_UTIL_CORE.COLUMN_TAB_TYPE;
2184 l_tms_update              VARCHAR2(1);
2185 l_trip_not_found          VARCHAR2(1);
2186 l_trip_info_rec           WSH_DELIVERY_VALIDATIONS.trip_info_rec_type;
2187 l_tms_version_number      WSH_NEW_DELIVERIES.TMS_VERSION_NUMBER%TYPE;
2188 l_gc3_is_installed        VARCHAR2(1);
2189 
2190 -- End of OTM R12 : update delivery
2191 
2192 -- OTM R12 : assign delivery detail
2193 l_delivery_was_empty      BOOLEAN;
2194 l_tms_interface_flag      WSH_NEW_DELIVERIES.TMS_INTERFACE_FLAG%TYPE;
2195 l_gross_weight1           WSH_NEW_DELIVERIES.GROSS_WEIGHT%TYPE;
2196 l_gross_weight2           WSH_NEW_DELIVERIES.GROSS_WEIGHT%TYPE;
2197 l_delivery_detail_ids     WSH_GLBL_VAR_STRCT_GRP.NUM_TBL_TYPE;
2198 l_assign_update           BOOLEAN;
2199 
2200 -- End of OTM R12 : assign delivery detail
2201 
2202 BEGIN
2203   --
2204   --
2205   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
2206   --
2207   IF l_debug_on IS NULL
2208   THEN
2209       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
2210   END IF;
2211   --
2212   IF l_debug_on THEN
2213       WSH_DEBUG_SV.push(l_module_name);
2214       --
2215       WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
2216       WSH_DEBUG_SV.log(l_module_name,'P_PARENT_DETAIL_ID',P_PARENT_DETAIL_ID);
2217   END IF;
2218   --
2219   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
2220 
2221   -- OTM R12
2222   l_gc3_is_installed := WSH_UTIL_CORE.G_GC3_IS_INSTALLED;
2223 
2224   IF (l_gc3_is_installed IS NULL) THEN
2225     l_gc3_is_installed := WSH_UTIL_CORE.GC3_IS_INSTALLED;
2226   END IF;
2227   l_assign_update := FALSE; --default assignment tms update to false
2228   -- End of OTM R12
2229 
2230 
2231   OPEN c_del_id_for_cont_or_detail(p_parent_detail_id);
2232   FETCH c_del_id_for_cont_or_detail into l_del_id_FOR_container;
2233   CLOSE c_del_id_for_cont_or_detail;
2234 
2235   OPEN c_del_id_for_cont_or_detail(p_detail_id);
2236   FETCH c_del_id_for_cont_or_detail into l_del_id_for_detail;
2237   CLOSE c_del_id_for_cont_or_detail;
2238 
2239   -- K LPN CONV. rv
2240   l_wms_org := wsh_util_validate.check_wms_org(l_del_id_FOR_container.organization_id);
2241   -- K LPN CONV. rv
2242 
2243   -- J: W/V Changes
2244   -- Return if the dd is already assigned to the specified container
2245   IF l_del_id_for_detail.parent_delivery_detail_id = p_parent_detail_id THEN
2246           IF l_debug_on THEN
2247             WSH_DEBUG_SV.logmsg(l_module_name,'DD '||p_detail_id||' is already assigned to '||p_parent_detail_id||'. Returning');
2248             WSH_DEBUG_SV.pop(l_module_name);
2249           END IF;
2250           return;
2251   END IF;
2252 
2253 
2254   OPEN c_get_shipto(p_parent_detail_id);
2255   FETCH c_get_shipto into l_ship_to;
2256   IF c_get_shipto%NOTFOUND THEN
2257               l_ship_to := NULL;
2258   END IF;
2259   CLOSE c_get_shipto;
2260 
2261   l_container_has_content := l_ship_to IS NOT NULL;
2262 
2263   IF l_debug_on THEN
2264           WSH_DEBUG_SV.log(l_module_name,'l_del_id_FOR_container',
2265                            l_del_id_FOR_container.delivery_id);
2266           WSH_DEBUG_SV.log(l_module_name,'l_del_id_FOR_detail',
2267                            l_del_id_for_detail.delivery_id);
2268           WSH_DEBUG_SV.log(l_module_name,'l_ship_to', l_ship_to);
2269   END IF;
2270   /* Added code to check for grouping attributes */
2271   IF (l_del_id_for_detail.organization_id <>
2272                                 l_del_id_for_container.organization_id) THEN
2273            FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_ORG_DIFF');
2274            FND_MESSAGE.SET_TOKEN('ENTITY1',p_detail_id);
2275            --
2276            IF l_debug_on THEN
2277               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2278            END IF;
2279            --
2280            FND_MESSAGE.SET_TOKEN('ENTITY2',
2281               nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2282                                                            p_parent_detail_id));
2283            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2284            WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2285            --
2286            IF l_debug_on THEN
2287               WSH_DEBUG_SV.pop(l_module_name);
2288            END IF;
2289            --
2290            RETURN;
2291   END IF;
2292   IF (l_del_id_for_detail.ship_from_location_id <>
2293                            l_del_id_for_container.ship_from_location_id) THEN
2294            FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
2295            FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2296            --
2297            IF l_debug_on THEN
2298                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2299            END IF;
2300            --
2301            FND_MESSAGE.SET_TOKEN('CONT_NAME',
2302                 nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2303                                                         p_parent_detail_id));
2304            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2305            WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2306            --
2307            IF l_debug_on THEN
2308               WSH_DEBUG_SV.pop(l_module_name);
2309            END IF;
2310            --
2311            RETURN;
2312   END IF;
2313 
2314   --J TP Release
2315   IF (l_del_id_for_detail.ignore_for_planning <>
2316                            l_del_id_for_container.ignore_for_planning) THEN
2317 
2318            -- R12: MDC
2319            -- If called by WMS, and line is part of a consol delivery,
2320            -- then the ignore for planning flag is always 'Y'. For WMS,
2321            -- we need to set the parent consol's ignore for planning status
2322            -- to be 'Y' before we attempt to pack.
2323 
2324            IF (l_wms_org = 'Y') AND
2325               ((l_del_id_for_detail.wda_type = 'O') OR (l_del_id_for_container.wda_type = 'O'))
2326            THEN --{
2327               IF l_del_id_for_detail.wda_type = 'O' THEN
2328                  l_ignore_det_tab(1) := p_parent_detail_id;
2329               ELSE
2330                  l_ignore_det_tab(1) := p_detail_id;
2331               END IF;
2332 
2333               WSH_TP_RELEASE.change_ignoreplan_status
2334                    (p_entity        => 'DLVB',
2335                     p_in_ids        => l_ignore_det_tab,
2336                     p_action_code   => 'IGNORE_PLAN',
2337                     x_return_status => x_return_status);
2338 
2339               IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
2340 
2341                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_DIFF_IGNOREPLAN');
2342                  FND_MESSAGE.SET_TOKEN('ENTITY1',p_detail_id);
2343                  --
2344                  IF l_debug_on THEN
2345                      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2346                  END IF;
2347                  --
2348                  FND_MESSAGE.SET_TOKEN('ENTITY2',
2349                  nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2350                                                         p_parent_detail_id));
2351                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2352                  --
2353                  IF l_debug_on THEN
2354                     WSH_DEBUG_SV.pop(l_module_name);
2355                  END IF;
2356                  --
2357                  RETURN;
2358 
2359 
2360               END IF;
2361 
2362            ELSE --}
2363               l_display_error := TRUE;
2364               IF (l_wms_org = 'Y')  AND (NOT l_container_has_content) THEN--{
2365                  --
2366                     l_ignore_det_tab(1) := p_parent_detail_id;
2367                     WSH_TP_RELEASE.change_ignoreplan_status
2368                       (p_entity        => 'DLVB',
2369                        p_in_ids        => l_ignore_det_tab,
2370                        p_action_code   => 'IGNORE_PLAN',
2371                        x_return_status => l_return_status);
2372 
2373                     IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN --{
2374                        l_display_error := TRUE;
2375                     ELSE
2376                        l_display_error := FALSE;
2377                     END IF;--}
2378               END IF ; --}
2379 
2380               IF l_display_error THEN --{
2381                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_DIFF_IGNOREPLAN');
2382                  FND_MESSAGE.SET_TOKEN('ENTITY1',p_detail_id);
2383                  --
2384                  IF l_debug_on THEN
2385                      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2386                  END IF;
2387                  --
2388                  FND_MESSAGE.SET_TOKEN('ENTITY2',
2389                  nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2390                                                         p_parent_detail_id));
2391                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2392                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2393                  --
2394                  IF l_debug_on THEN
2395                     WSH_DEBUG_SV.pop(l_module_name);
2396                  END IF;
2397                  --
2398                  RETURN;
2399               END IF; --}
2400            END IF;
2401   END IF;
2402 
2403   --
2404   -- J-IB-NPARIKH-{
2405   --
2406   IF (l_del_id_for_detail.line_direction <> l_del_id_for_container.line_direction)
2407   THEN
2408   --{
2409             --
2410             -- O line can be assigned to empty IO container
2411             -- IO line can be assigned to empty O container
2412             -- Otherwise, line and container's line direction must match
2413             --
2414             IF  l_del_id_for_detail.line_direction    IN ('O','IO')
2415             AND l_del_id_for_container.line_direction IN ('O','IO')
2416             THEN
2417             --{
2418                 NULL;
2419             --}
2420             ELSE
2421             --{
2422                 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
2423                 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2424                 --
2425                 IF l_debug_on THEN
2426                    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2427                 END IF;
2428                 --
2429                 FND_MESSAGE.SET_TOKEN('CONT_NAME',
2430                     nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2431                                                             p_parent_detail_id));
2432                 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2433                 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2434                 --
2435                 IF l_debug_on THEN
2436                   WSH_DEBUG_SV.pop(l_module_name);
2437                 END IF;
2438                 --
2439                 RETURN;
2440             --}
2441             END IF;
2442   --}
2443   END IF;
2444   --
2445   -- J-IB-NPARIKH-}
2446   --
2447   --
2448   IF l_debug_on THEN
2449            WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.GET_GROUP_BY_ATTR',WSH_DEBUG_SV.C_PROC_LEVEL);
2450   END IF;
2451   --
2452   WSH_DELIVERY_AUTOCREATE.get_group_by_attr(
2453            p_organization_id => l_del_id_for_detail.organization_id,
2454            x_group_by_flags  => l_group_by_flags,
2455            x_return_status   => x_return_status);
2456 
2457   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2458            x_return_status := x_return_status;
2459            WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2460            --
2461            IF l_debug_on THEN
2462               WSH_DEBUG_SV.pop(l_module_name);
2463            END IF;
2464            --
2465            RETURN;
2466   END IF;
2467 
2468   /*---------
2469         When the container has no content then do not do these checks
2470         since all these attributes on the container will be null.
2471   ----------*/
2472 
2473   IF l_container_has_content THEN
2474            IF l_debug_on THEN
2475               WSH_DEBUG_SV.log(l_module_name,'l_group_by_flags.customer',
2476                                                 l_group_by_flags.customer);
2477               WSH_DEBUG_SV.log(l_module_name,'del_id_for_detail.customer',
2478                                         l_del_id_for_detail.customer_id);
2479               WSH_DEBUG_SV.log(l_module_name,'id_for_container.customer',
2480                                         l_del_id_for_container.customer_id);
2481            END IF;
2482 
2483     --- Bug 3715176
2484     -- If delivery is same for container and line then it should not check firm status.
2485     IF l_del_id_for_detail.delivery_id = l_del_id_for_container.delivery_id then
2486       NULL;
2487 
2488     Elsif l_del_id_for_detail.delivery_id is NOT NULL OR
2489           l_del_id_for_container.delivery_id is NOT NULL then
2490           Open  c_get_content_count(p_parent_detail_id);
2491 	  Fetch c_get_content_count into l_content_count;
2492 	  Close c_get_content_count;
2493 
2494       IF l_content_count > 0 THEN
2495 	IF l_del_id_for_detail.delivery_id IS NOT NULL then
2496 	     OPEN c_get_plan_flag(l_del_id_for_detail.delivery_id);
2497 	     FETCH c_get_plan_flag into l_plan_flag;
2498 	     CLOSE c_get_plan_flag;
2499 
2500   	  if l_plan_flag <> 'N' then
2501 	         FND_MESSAGE.SET_NAME('WSH','WSH_DEL_STATUS_NOT_PROPER');
2502 
2503 		 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2504 
2505                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2506                  --
2507                  IF l_debug_on THEN
2508                     WSH_DEBUG_SV.pop(l_module_name);
2509                  END IF;
2510                  --
2511                  return;
2512           end if;
2513 	END IF;
2514 
2515 	IF l_del_id_for_container.delivery_id IS NOT NULL then
2516 	     OPEN c_get_plan_flag(l_del_id_for_container.delivery_id);
2517 	     FETCH c_get_plan_flag into l_plan_flag;
2518 	     CLOSE c_get_plan_flag;
2519 
2520   	  if l_plan_flag <> 'N' then
2521 	         FND_MESSAGE.SET_NAME('WSH','WSH_DEL_STATUS_NOT_PROPER');
2522 
2523 		 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2524 
2525                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2526                  --
2527                  IF l_debug_on THEN
2528                     WSH_DEBUG_SV.pop(l_module_name);
2529                  END IF;
2530                  --
2531                  return;
2532           end if;
2533 	END IF;
2534       END IF;
2535     END IF;
2536     -- Bug 3715176
2537 
2538     /*  bug 2677298 frontport from bug 2655474: issue #1:
2539     **    set x_return_status to error if grouping attributes do not match
2540     */
2541 
2542 
2543     IF l_group_by_flags.customer = 'Y' THEN
2544               IF   (NVL(l_del_id_for_detail.customer_id,-1) <>
2545                              NVL(l_del_id_for_container.customer_id,-1)) THEN
2546 
2547                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
2548                  FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2549                  --
2550                  IF l_debug_on THEN
2551                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2552                  END IF;
2553                  --
2554                  FND_MESSAGE.SET_TOKEN('CONT_NAME',
2555                  nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2556                                                        p_parent_detail_id));
2557                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2558                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2559                  --
2560                  IF l_debug_on THEN
2561                     WSH_DEBUG_SV.pop(l_module_name);
2562                  END IF;
2563                  --
2564                  return;
2565               END IF;
2566    END IF;
2567    IF l_group_by_flags.intmed = 'Y' THEN
2568               IF (NVL(l_del_id_for_detail.intmed_ship_to_location_id,-1)<>
2569                  NVL(l_del_id_for_container.intmed_ship_to_location_id,-1))
2570               THEN
2571 
2572                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
2573                  FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2574                  --
2575                  IF l_debug_on THEN
2576                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2577                  END IF;
2578                  --
2579                  FND_MESSAGE.SET_TOKEN('CONT_NAME',
2580                   nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2581                   p_parent_detail_id));
2582                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2583                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2584                  --
2585                  IF l_debug_on THEN
2586                     WSH_DEBUG_SV.pop(l_module_name);
2587                  END IF;
2588                  --
2589                  return;
2590               END IF;
2591    END IF;
2592 
2593    IF l_debug_on THEN
2594               WSH_DEBUG_SV.log(l_module_name,'fob_code',
2595                                                  l_del_id_for_detail.fob_code);
2596                WSH_DEBUG_SV.log(l_module_name,'container fob_code',
2597                                               l_del_id_for_container.fob_code);
2598                WSH_DEBUG_SV.log(l_module_name,'fob',
2599                                                        l_group_by_flags.fob);
2600    END IF;
2601 
2602    IF l_group_by_flags.fob = 'Y' THEN
2603               IF  (NVL(l_del_id_for_detail.fob_code,'#')<>
2604                              NVL(l_del_id_for_container.fob_code,'#')) THEN
2605 
2606                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
2607                  FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2608                  --
2609                  IF l_debug_on THEN
2610                      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2611                  END IF;
2612                   --
2613                  FND_MESSAGE.SET_TOKEN('CONT_NAME',
2614                  nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2615                        p_parent_detail_id));
2616                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2617                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2618                  --
2619                  IF l_debug_on THEN
2620                     WSH_DEBUG_SV.pop(l_module_name);
2621                  END IF;
2622                  --
2623                  return;
2624               END IF;
2625    END IF;
2626    IF l_debug_on THEN
2627               WSH_DEBUG_SV.log(l_module_name,'freight_terms_code',
2628                                      l_del_id_for_detail.freight_terms_code);
2629                WSH_DEBUG_SV.log(l_module_name,
2630                                               'container freight_terms_code',
2631                                     l_del_id_for_container.freight_terms_code);
2632                 WSH_DEBUG_SV.log(l_module_name,'freight_terms',
2633                                                l_group_by_flags.freight_terms);
2634    END IF;
2635 
2636    IF l_group_by_flags.freight_terms = 'Y' THEN
2637               IF  (NVL(l_del_id_for_detail.freight_terms_code,'#')<>
2638                     NVL(l_del_id_for_container.freight_terms_code,'#')) THEN
2639 
2640                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
2641                  FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2642                  --
2643                  IF l_debug_on THEN
2644                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2645                  END IF;
2646                  --
2647                  FND_MESSAGE.SET_TOKEN('CONT_NAME',
2648                  nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2649                   p_parent_detail_id));
2650                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2651                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2652                  --
2653                  IF l_debug_on THEN
2654                      WSH_DEBUG_SV.pop(l_module_name);
2655                  END IF;
2656                  --
2657                  return;
2658               END IF;
2659    END IF;
2660 
2661    IF l_debug_on THEN
2662               WSH_DEBUG_SV.log(l_module_name,'ship_method_code',
2663                                         l_del_id_for_detail.ship_method_code);
2664               WSH_DEBUG_SV.log(l_module_name, 'container ship_method_code',
2665                                    l_del_id_for_container.ship_method_code);
2666               WSH_DEBUG_SV.log(l_module_name,'ship_method',
2667                                                l_group_by_flags.ship_method);
2668    END IF;
2669 
2670    IF l_group_by_flags.ship_method = 'Y' THEN
2671               IF  (NVL(NVL(l_del_id_for_detail.mode_of_transport,l_del_id_for_container.mode_of_transport),'#')<>
2672                    NVL(NVL(l_del_id_for_container.mode_of_transport,l_del_id_for_detail.mode_of_transport),'#'))
2673               OR  (NVL(NVL(l_del_id_for_detail.service_level,l_del_id_for_container.service_level),'#')<>
2674                    NVL(NVL(l_del_id_for_container.service_level,l_del_id_for_detail.service_level),'#'))
2675               OR  (NVL(NVL(l_del_id_for_detail.carrier_id,l_del_id_for_container.carrier_id),-1)<>
2676                    NVL(NVL(l_del_id_for_container.carrier_id,l_del_id_for_detail.carrier_id),-1)) THEN
2677 
2678                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
2679                  FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2680                  --
2681                  IF l_debug_on THEN
2682                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2683                  END IF;
2684                  --
2685                  FND_MESSAGE.SET_TOKEN('CONT_NAME',
2686                  nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2687                                                            p_parent_detail_id));
2688                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2689                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2690                  --
2691                  IF l_debug_on THEN
2692                     WSH_DEBUG_SV.pop(l_module_name);
2693                  END IF;
2694                  --
2695                  return;
2696               END IF;
2697     END IF;
2698   END IF;
2699   /* End of Check for grouping attributes */
2700 
2701   IF l_debug_on THEN
2702                    WSH_DEBUG_SV.log(l_module_name,'parent_delivery_detail_id',
2703                                 l_del_id_for_detail.parent_delivery_detail_id);
2704                    WSH_DEBUG_SV.log(l_module_name,
2705                                      'container parent_delivery_detail_id',
2706                               l_del_id_for_container.parent_delivery_detail_id);
2707   END IF;
2708 
2709   /* Check to see if the line is already packed */
2710   IF (l_del_id_for_detail.parent_delivery_detail_id IS NOT NULL
2711       AND l_del_id_for_detail.parent_delivery_detail_id <>
2712         p_parent_detail_id
2713       ) THEN
2714       FND_MESSAGE.SET_NAME('WSH','WSH_DET_PACK_ERROR');
2715       FND_MESSAGE.SET_TOKEN('DET_LINE',p_detail_id);
2716       --
2717       IF l_debug_on THEN
2718           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2719       END IF;
2720       --
2721       FND_MESSAGE.SET_TOKEN('CONT_NAME',
2722          nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2723                p_parent_detail_id));
2724       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2725       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2726       --
2727       IF l_debug_on THEN
2728           WSH_DEBUG_SV.pop(l_module_name);
2729       END IF;
2730       --
2731       return;
2732   END IF;
2733   /* End of Check to see if the line is already packed */
2734 
2735 
2736   -- J: W/V Changes
2737   IF l_debug_on THEN
2738                    WSH_DEBUG_SV.log(l_module_name,'l_del_id_for_detail.released_status',
2739                                                       l_del_id_for_detail.released_status);
2740   END IF;
2741 
2742   IF l_del_id_for_detail.released_status = 'C' THEN
2743       Raise invalid_detail;
2744   END IF;
2745 
2746 
2747   /*  bug 2677298 frontport from bug 2655474: issue #2:
2748   **    set x_return_status to error if line and container are in different deliveries.
2749   */
2750   IF (l_del_id_for_detail.delivery_id <> l_del_id_for_container.delivery_id)  THEN
2751     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_DIFF_DELIVERIES');
2752     FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
2753     --
2754     IF l_debug_on THEN
2755         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2756     END IF;
2757     --
2758     FND_MESSAGE.SET_TOKEN('CONT_NAME',
2759        nvl(wsh_container_utilities.get_cont_name(p_parent_detail_id),
2760              p_parent_detail_id));
2761     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2762     WSH_UTIL_CORE.Add_Message(x_return_status);
2763     --
2764     IF l_debug_on THEN
2765         WSH_DEBUG_SV.pop(l_module_name);
2766     END IF;
2767     --
2768     return;
2769   END IF;
2770 
2771   -- J: W/V Changes
2772   -- The first DD_WV_Post_Process call will decrement the DD W/V from delivery
2773   -- The second DD_WV_Post_Process call will increment the delivery W/V with container W/V (since container has to be
2774   -- assigned to the delivery if the detail being assigned to container is already assigned to delivery)
2775   -- The third DD_WV_Post_Process will will increment the container W/V with DD W/V which in turn will adjust the
2776   -- delivery W/V, if the container is in a delivery.
2777   IF (l_del_id_for_detail.delivery_id is not null) THEN
2778           IF l_debug_on THEN
2779             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
2780           END IF;
2781 
2782           WSH_WV_UTILS.DD_WV_Post_Process(
2783             p_delivery_detail_id => p_detail_id,
2784             p_diff_gross_wt      => -1 * l_del_id_for_detail.gross_weight,
2785             p_diff_net_wt        => -1 * l_del_id_for_detail.net_weight,
2786             p_diff_volume        => -1 * l_del_id_for_detail.volume,
2787             p_diff_fill_volume   => -1 * l_del_id_for_detail.volume,
2788             x_return_status      => l_return_status);
2789 
2790           IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
2791                --
2792                x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2793                WSH_UTIL_CORE.Add_Message(x_return_status);
2794                IF l_debug_on THEN
2795                    WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
2796                    WSH_DEBUG_SV.pop(l_module_name);
2797                END IF;
2798                return;
2799           END IF;
2800 
2801   END IF;
2802 
2803   /* container is already assigned to a delivery */
2804 
2805   /* bug 2691385 and 2655474: avoid unnecessary update if line is already in delivery. */
2806   /****
2807           !!!!! We should NOT assume that the delivery grouping attributes of the delivery match
2808           !!!!! with that of the delivery details.
2809           !!!!! Bugs 2794866, 2397552.
2810   ****/
2811 
2812 
2813   IF (l_del_id_for_container.delivery_id IS not null) and (l_del_id_for_detail.delivery_id is null) THEN
2814 
2815 
2816     -- OTM R12 : assign delivery detail, this is the case where detail is assigned to the delivery
2817 
2818     IF (l_gc3_is_installed = 'Y' AND
2819         nvl(l_del_id_for_container.ignore_for_planning, 'N') = 'N') THEN
2820 
2821       Pre_Otm_Assign_Del_Detail
2822               (p_delivery_id        => NULL,
2823                p_detail_id          => p_detail_id,
2824                p_container1_id      => p_parent_detail_id,
2825                p_container2_id      => NULL,
2826                p_assignment_type    => 'DD2C',
2827                x_delivery_was_empty => l_delivery_was_empty,
2828                x_assign_update      => l_assign_update,
2829                x_gross_weight1      => l_gross_weight1,
2830                x_gross_weight2      => l_gross_weight2,
2831                x_return_status      => l_return_status);
2832 
2833       IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
2834         IF l_debug_on THEN
2835           WSH_DEBUG_SV.log(l_module_name,'error from Pre_Otm_Assign_Del_Detail');
2836         END IF;
2837         raise FND_API.G_EXC_ERROR;
2838       END IF;
2839     END IF;
2840     -- End of OTM R12 : assign delivery detail
2841 
2842 
2843                IF l_debug_on THEN
2844                   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.CHECK_ASSIGN_DELIVERY',WSH_DEBUG_SV.C_PROC_LEVEL);
2845                END IF;
2846 
2847                l_attr_tab(1).entity_id := l_del_id_for_container.delivery_id;
2848                l_attr_tab(1).entity_type := 'DELIVERY';
2849                l_attr_tab(2).entity_id := p_detail_id;
2850                l_attr_tab(2).entity_type := 'DELIVERY_DETAIL';
2851 
2852                l_action_rec.action := 'MATCH_GROUPS';
2853                l_action_rec.check_single_grp := 'Y';
2854 
2855                WSH_DELIVERY_AUTOCREATE.Find_Matching_Groups(p_attr_tab => l_attr_tab,
2856                         p_action_rec => l_action_rec,
2857                         p_target_rec => l_target_rec,
2858                         p_group_tab => l_group_tab,
2859                         x_matched_entities => l_matched_entities,
2860                         x_out_rec => l_out_rec,
2861                         x_return_status => x_return_status);
2862 
2863                IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
2864                      --
2865                      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2866                      WSH_UTIL_CORE.Add_Message(x_return_status);
2867                      IF l_debug_on THEN
2868                          WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
2869                          WSH_DEBUG_SV.pop(l_module_name);
2870                      END IF;
2871                      return;
2872                END IF;
2873 
2874 
2875 
2876                IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
2877                      --
2878                      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2879                      WSH_UTIL_CORE.Add_Message(x_return_status);
2880                      IF l_debug_on THEN
2881                          WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
2882                          WSH_DEBUG_SV.pop(l_module_name);
2883                      END IF;
2884                      return;
2885                END IF;
2886 
2887     -- Update the delivery with the line's line direction
2888 
2889     -- Lock the delivery before update.
2890 
2891     BEGIN
2892 
2893        wsh_new_deliveries_pvt.lock_dlvy_no_compare(p_delivery_id => l_del_id_for_container.delivery_id);
2894 
2895     EXCEPTION
2896 
2897        WHEN OTHERS THEN
2898           x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2899           FND_MESSAGE.Set_Name('WSH', 'WSH_NO_LOCK');
2900           WSH_UTIL_CORE.add_message (WSH_UTIL_CORE.G_RET_STS_ERROR);
2901           IF l_debug_on THEN
2902              WSH_DEBUG_SV.log(l_module_name,'Could not lock delivery: ',l_del_id_for_container.delivery_id);
2903              WSH_DEBUG_SV.pop(l_module_name);
2904           END IF;
2905           RETURN;
2906     END;
2907 
2908     l_group_index := l_group_tab.FIRST;
2909 
2910     -- OTM R12 : update delivery
2911     l_tms_update := 'N';
2912     l_new_interface_flag_tab(1) := NULL;
2913 
2914     IF (l_gc3_is_installed = 'Y' AND
2915         nvl(l_del_id_for_container.ignore_for_planning, 'N') = 'N') THEN
2916       l_trip_not_found := 'N';
2917 
2918       --get trip information for delivery, no update when trip not OPEN
2919       WSH_DELIVERY_VALIDATIONS.get_trip_information
2920                    (p_delivery_id     => l_del_id_for_container.delivery_id,
2921                     x_trip_info_rec   => l_trip_info_rec,
2922                     x_return_status   => l_return_status);
2923 
2924       IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
2925         x_return_status := l_return_status;
2926         IF l_debug_on THEN
2927           WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_DELIVERY_VALIDATIONS.get_trip_information');
2928           WSH_DEBUG_SV.pop(l_module_name);
2929         END IF;
2930         RETURN;
2931       END IF;
2932 
2933       IF (l_trip_info_rec.trip_id IS NULL) THEN
2934         l_trip_not_found := 'Y';
2935       END IF;
2936 
2937       -- only do changes when there's no trip or trip status is OPEN
2938       IF (l_trip_info_rec.status_code = 'OP' OR
2939           l_trip_not_found = 'Y') THEN
2940 
2941         WSH_DELIVERY_VALIDATIONS.get_delivery_information(
2942                               p_delivery_id   => l_del_id_for_container.delivery_id,
2943                               x_delivery_rec  => l_delivery_info,
2944                               x_return_status => l_return_status);
2945 
2946         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
2947           x_return_status := l_return_status;
2948           IF l_debug_on THEN
2949             WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_DELIVERY_VALIDATIONS.get_delivery_information');
2950             WSH_DEBUG_SV.pop(l_module_name);
2951           END IF;
2952           RETURN;
2953         END IF;
2954 
2955         -- if service level, mode of transport, or carrier id is changed
2956         -- with the nvl updates, then update is needed
2957 
2958         IF (nvl(l_delivery_info.service_level,
2959                 nvl(l_group_tab(l_group_index).service_level, '@@')) <>
2960             nvl(l_delivery_info.service_level, '@@') OR
2961             nvl(l_delivery_info.mode_of_transport,
2962                 nvl(l_group_tab(l_group_index).mode_of_transport, '@@')) <>
2963             nvl(l_delivery_info.mode_of_transport, '@@') OR
2964             nvl(l_delivery_info.carrier_id,
2965                 nvl(l_group_tab(l_group_index).carrier_id, -1)) <>
2966             nvl(l_delivery_info.carrier_id, -1)) THEN
2967 
2968           IF (l_delivery_info.tms_interface_flag NOT IN
2969               (WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT,
2970                WSH_NEW_DELIVERIES_PVT.C_TMS_CREATE_REQUIRED,
2971                WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_REQUIRED,
2972                WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_IN_PROCESS,
2973                WSH_NEW_DELIVERIES_PVT.C_TMS_UPDATE_REQUIRED)) THEN
2974             l_tms_update := 'Y';
2975             l_delivery_info_tab(1) := l_delivery_info;
2976             l_new_interface_flag_tab(1) := WSH_NEW_DELIVERIES_PVT.C_TMS_UPDATE_REQUIRED;
2977             l_tms_version_number := nvl(l_delivery_info.tms_version_number, 1) + 1;
2978           END IF;
2979         END IF; -- checking the value differences
2980       END IF; -- IF ((l_trip_not_found = 'N' AND
2981     END IF; -- IF (l_gc3_is_installed = 'Y'
2982 
2983     IF l_debug_on THEN
2984       WSH_DEBUG_SV.log(l_module_name, 'l_gc3_is_installed', l_gc3_is_installed);
2985       WSH_DEBUG_SV.log(l_module_name, 'l_tms_update', l_tms_update);
2986       IF (l_tms_update = 'Y') THEN
2987         WSH_DEBUG_SV.log(l_module_name, 'l_new_interface_flag_tab', l_new_interface_flag_tab(1));
2988         WSH_DEBUG_SV.log(l_module_name, 'l_tms_version_number', l_tms_version_number);
2989       END IF;
2990     END IF;
2991 
2992     -- End of OTM R12 : update delivery
2993 
2994     UPDATE wsh_new_deliveries
2995     SET shipment_direction = l_del_id_for_detail.line_direction,
2996         service_level = NVL(service_level,l_group_tab(l_group_index).service_level),
2997         mode_of_transport = NVL(mode_of_transport, l_group_tab(l_group_index).mode_of_transport),
2998         carrier_id = NVL(carrier_id, l_group_tab(l_group_index).carrier_id),
2999         -- OTM R12
3000         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)),
3001         TMS_VERSION_NUMBER = decode(l_tms_update, 'Y', l_tms_version_number, nvl(tms_version_number, 1)),
3002         -- End of OTM R12
3003         last_update_date = SYSDATE,
3004         last_updated_by =  FND_GLOBAL.USER_ID,
3005         last_update_login =  FND_GLOBAL.LOGIN_ID
3006     where delivery_id = l_del_id_for_container.delivery_id;
3007 
3008     -- OTM R12 : update delivery
3009     IF (l_gc3_is_installed = 'Y' AND l_tms_update = 'Y') THEN
3010       WSH_XC_UTIL.LOG_OTM_EXCEPTION(
3011                           p_delivery_info_tab      => l_delivery_info_tab,
3012                           p_new_interface_flag_tab => l_new_interface_flag_tab,
3013                           x_return_status          => l_return_status);
3014 
3015       IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
3016         x_return_status := l_return_status;
3017         IF l_debug_on THEN
3018           WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_XC_UTIL.log_otm_exception');
3019           WSH_DEBUG_SV.pop(l_module_name);
3020         END IF;
3021         RETURN;
3022       END IF;
3023     END IF;
3024     -- End of OTM R12 : update delivery
3025 
3026     -- K LPN CONV. rv
3027     IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
3028     AND nvl(l_del_id_FOR_container.line_direction,'O') IN ('O', 'IO')
3029     AND
3030     (
3031       ((WSH_WMS_LPN_GRP.GK_WMS_PACK or WSH_WMS_LPN_GRP.GK_WMS_ASSIGN_DLVY) and l_wms_org = 'Y')
3032       OR
3033       ((WSH_WMS_LPN_GRP.GK_INV_PACK or WSH_WMS_LPN_GRP.GK_INV_ASSIGN_DLVY) and l_wms_org = 'N')
3034     )
3035     THEN
3036     --{
3037         l_sync_tmp_rec.delivery_detail_id := p_detail_id;
3038         l_sync_tmp_rec.parent_delivery_detail_id := l_del_id_for_detail.parent_delivery_detail_id;
3039         l_sync_tmp_rec.delivery_id := l_del_id_for_detail.delivery_id;
3040         l_sync_tmp_rec.operation_type := 'PRIOR';
3041         --
3042         IF l_debug_on THEN
3043             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
3044         END IF;
3045         --
3046         WSH_WMS_SYNC_TMP_PKG.MERGE
3047         (
3048           p_sync_tmp_rec      => l_sync_tmp_rec,
3049           x_return_status     => l_return_status
3050         );
3051         --
3052         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
3053         --
3054           x_return_status := l_return_status;
3055         --
3056           IF l_debug_on THEN
3057             WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
3058             WSH_DEBUG_SV.pop(l_module_name);
3059           END IF;
3060         --
3061           return;
3062         --
3063         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
3064         --
3065           l_num_warnings := l_num_warnings + 1;
3066         --
3067         END IF;
3068         --
3069     --}
3070     END IF;
3071     -- K LPN CONV. rv
3072     --
3073 
3074     UPDATE wsh_delivery_assignments_v
3075     SET parent_delivery_detail_id = p_parent_detail_id,
3076        delivery_id = l_del_id_for_container.delivery_id,
3077          last_update_date = SYSDATE,
3078          last_updated_by =  FND_GLOBAL.USER_ID,
3079          last_update_login =  FND_GLOBAL.LOGIN_ID
3080     WHERE delivery_detail_id = p_detail_id;
3081 
3082     -- OTM R12 : assign delivery detail
3083     IF (l_assign_update AND
3084         l_gc3_is_installed = 'Y' AND
3085         nvl(l_del_id_for_container.ignore_for_planning, 'N') = 'N') THEN
3086 
3087       IF (l_tms_update = 'Y') THEN
3088         l_tms_interface_flag := l_new_interface_flag_tab(1);
3089       ELSIF (l_trip_info_rec.status_code = 'OP' OR
3090              l_trip_not_found = 'Y') THEN
3091         l_tms_interface_flag := nvl(l_delivery_info.tms_interface_flag, WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT);
3092       ELSE
3093         l_tms_interface_flag := NULL;
3094       END IF;
3095 
3096       Post_Otm_Assign_Del_Detail
3097               (p_delivery_id         => l_del_id_for_container.delivery_id,
3098                p_delivery_was_empty  => l_delivery_was_empty,
3099                p_tms_interface_flag  => l_tms_interface_flag,
3100                p_gross_weight        => l_gross_weight1,  --using the gross weight of the detail
3101                x_return_status       => l_return_status);
3102 
3103       IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
3104         IF l_debug_on THEN
3105           WSH_DEBUG_SV.log(l_module_name,'error from Post_Otm_Assign_Del_Detail');
3106         END IF;
3107         raise FND_API.G_EXC_ERROR;
3108       ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
3109         l_num_warnings := l_num_warnings + 1;
3110       END IF;
3111     END IF;
3112     -- End of OTM R12 : assign delivery detail
3113 
3114     -- K: MDC delete consolidation record of it exists
3115     l_mdc_detail_tab(1) := p_detail_id;
3116     WSH_DELIVERY_DETAILS_ACTIONS.Delete_Consol_Record(
3117                        p_detail_id_tab   => l_mdc_detail_tab,
3118                        x_return_status   => x_return_status);
3119 
3120     IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
3121       IF l_debug_on THEN
3122         WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3123         WSH_DEBUG_SV.pop(l_module_name);
3124       END IF;
3125       return;
3126     END IF;
3127 
3128 
3129     /* H integration: Pricing integration csun , marking the delivery */
3130     m := m + 1;
3131     l_del_tab(m) := l_del_id_for_detail.delivery_id;
3132   ELSIF (l_del_id_for_container.delivery_id is null)
3133           OR   (l_del_id_for_container.delivery_id =  l_del_id_for_detail.delivery_id )THEN
3134     --
3135     -- K LPN CONV. rv
3136     -- Only packing.
3137     IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
3138     AND nvl(l_del_id_FOR_container.line_direction,'O') IN ('O', 'IO')
3139     AND
3140     (
3141       (WSH_WMS_LPN_GRP.GK_WMS_PACK and l_wms_org = 'Y')
3142       OR
3143       (WSH_WMS_LPN_GRP.GK_INV_PACK and l_wms_org = 'N')
3144     )
3145     THEN
3146     --{
3147         --
3148         l_sync_tmp_rec.delivery_detail_id := p_detail_id;
3149         l_sync_tmp_rec.parent_delivery_detail_id := l_del_id_for_detail.parent_delivery_detail_id;
3150         l_sync_tmp_rec.delivery_id := l_del_id_for_detail.delivery_id;
3151         l_sync_tmp_rec.operation_type := 'PRIOR';
3152         --
3153         IF l_debug_on THEN
3154             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
3155         END IF;
3156         --
3157         WSH_WMS_SYNC_TMP_PKG.MERGE
3158         (
3159           p_sync_tmp_rec      => l_sync_tmp_rec,
3160           x_return_status     => l_return_status
3161         );
3162         --
3163         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
3164         --
3165           x_return_status := l_return_status;
3166         --
3167           IF l_debug_on THEN
3168             WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
3169             WSH_DEBUG_SV.pop(l_module_name);
3170           END IF;
3171         --
3172           return;
3173         --
3174         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
3175         --
3176           l_num_warnings := l_num_warnings + 1;
3177         --
3178         END IF;
3179         --
3180     --}
3181     END IF;
3182     -- K LPN CONV. rv
3183     --
3184 
3185     UPDATE wsh_delivery_assignments_v
3186     SET parent_delivery_detail_id = p_parent_detail_id,
3187     last_update_date = SYSDATE,
3188     last_updated_by =  FND_GLOBAL.USER_ID,
3189     last_update_login =  FND_GLOBAL.LOGIN_ID
3190     WHERE delivery_detail_id = p_detail_id;
3191 
3192     l_mdc_detail_tab(1) := p_detail_id;
3193     WSH_DELIVERY_DETAILS_ACTIONS.Delete_Consol_Record(
3194                        p_detail_id_tab   => l_mdc_detail_tab,
3195                        x_return_status   => x_return_status);
3196 
3197     IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
3198       IF l_debug_on THEN
3199         WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3200         WSH_DEBUG_SV.pop(l_module_name);
3201       END IF;
3202       return;
3203     END IF;
3204   END IF;
3205 
3206   /* detail is already assigned to a delivery */
3207   /* updating delivery_id for all containers and details inside
3208      of the container AND updating delivery_id FOR all containers outside of the
3209      container */
3210   /* Bug 1571143 */
3211   /* bug 2677298 frontport from bug 2655474: update container only if it is not in delivery */
3212   IF (    (l_del_id_for_detail.delivery_id is not null)
3213             AND (l_del_id_for_container.delivery_id is null)  ) THEN
3214 
3215     -- K LPN CONV. rv
3216     -- Based on assumption that we are using wsh_delivery_assignments_v,
3217     -- delivery and its contents will belong to same organization.
3218     -- Similarly, container and its contents will belong to same organization.
3219     -- Hence, we are checking for WMS org or non-WMS org. at the
3220     -- parent level (i.e. delivery/container)
3221     -- rather than at line-level for performance reasons.
3222 
3223     -- If this assumptions were to be violated in anyway
3224     --    i.e Query was changed to refer to base table wsh_delivery_assignments instead of
3225     --     wsh_delivery_assignments_v
3226     -- or
3227     -- if existing query were to somehow return/fetch records where
3228     --    delivery and its contents may belong to diff. org.
3229     --    container and its contents may belong to diff. org.
3230     --    then
3231     --       Calls to check_wms_org needs to be re-adjusted at
3232     --       appropriate level (line/delivery/container).
3233     -- K LPN CONV. rv
3234 
3235     -- Bug 4452930
3236     OPEN c_topmost_container(p_parent_detail_id);
3237     FETCH c_topmost_container INTO l_topmost_cont;
3238     CLOSE c_topmost_container;
3239 
3240     IF   l_topmost_cont IS NULL THEN
3241       l_topmost_cont := p_parent_detail_id;
3242     END IF;
3243 
3244 
3245     -- OTM R12 : assign delivery detail,
3246     -- this is the case where container is assigned to delivery, had to get topmost container
3247 
3248     IF (l_gc3_is_installed = 'Y' AND
3249         nvl(l_del_id_for_container.ignore_for_planning, 'N') = 'N') THEN
3250 
3251       Pre_Otm_Assign_Del_Detail
3252               (p_delivery_id        => NULL,
3253                p_detail_id          => p_detail_id,
3254                p_container1_id      => l_topmost_cont,
3255                p_container2_id      => NULL,
3256                p_assignment_type    => 'DD2C',
3257                x_delivery_was_empty => l_delivery_was_empty,
3258                x_assign_update      => l_assign_update,
3259                x_gross_weight1      => l_gross_weight1,
3260                x_gross_weight2      => l_gross_weight2,
3261                x_return_status      => l_return_status);
3262 
3263       IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
3264         IF l_debug_on THEN
3265           WSH_DEBUG_SV.log(l_module_name,'error from Pre_Otm_Assign_Del_Detail');
3266         END IF;
3267         raise FND_API.G_EXC_ERROR;
3268       END IF;
3269     END IF;
3270     -- End of OTM R12 : assign delivery detail
3271 
3272 
3273     OPEN c_inside_outside_of_container(l_topmost_cont);
3274     -- Bug 4452930
3275     FETCH c_inside_outside_of_container bulk collect into
3276           l_sync_tmp_recTbl.delivery_detail_id_tbl,
3277           l_sync_tmp_recTbl.parent_detail_id_tbl,
3278           l_sync_tmp_recTbl.delivery_id_tbl;
3279 
3280     CLOSE c_inside_outside_of_container;
3281     IF (l_sync_tmp_recTbl.delivery_detail_id_tbl.count > 0 ) THEN
3282     --{
3283 
3284         --
3285         l_sync_tmp_recTbl.operation_type_tbl(1) := 'PRIOR';
3286         l_operation_type := 'PRIOR';
3287         --
3288         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
3289         AND nvl(l_del_id_for_detail.line_direction,'O') IN ('O', 'IO')
3290         AND
3291         (
3292           (WSH_WMS_LPN_GRP.GK_WMS_ASSIGN_DLVY and l_wms_org = 'Y')
3293           OR
3294           (WSH_WMS_LPN_GRP.GK_INV_ASSIGN_DLVY and l_wms_org = 'N')
3295         )
3296         THEN
3297         --{
3298             --
3299             IF l_debug_on THEN
3300                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
3301             END IF;
3302             --
3303             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
3304             (
3305               p_sync_tmp_recTbl   => l_sync_tmp_recTbl,
3306               x_return_status     => l_return_status,
3307               p_operation_type    => l_operation_type
3308             );
3309             --
3310             IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
3311             --
3312               x_return_status := l_return_status;
3313             --
3314               IF l_debug_on THEN
3315                 WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
3316                 WSH_DEBUG_SV.pop(l_module_name);
3317               END IF;
3318             --
3319               return;
3320             --
3321             ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
3322             --
3323               l_num_warnings := l_num_warnings + 1;
3324             --
3325             END IF;
3326             --
3327 
3328         --}
3329         END IF;
3330         --
3331 
3332         FORALL i in l_sync_tmp_recTbl.delivery_detail_id_tbl.first..l_sync_tmp_recTbl.delivery_detail_id_tbl.last
3333         UPDATE wsh_delivery_assignments_v
3334         SET delivery_id = l_del_id_FOR_detail.delivery_id,
3335             last_update_date = SYSDATE,
3336             last_updated_by =  FND_GLOBAL.USER_ID,
3337             last_update_login =  FND_GLOBAL.LOGIN_ID
3338         WHERE delivery_detail_id = l_sync_tmp_recTbl.delivery_detail_id_tbl(i);
3339 
3340         -- OTM R12 : assign delivery detail
3341         -- executed only once since it's for the same delivery
3342         IF (l_assign_update AND
3343             l_gc3_is_installed = 'Y' AND
3344             nvl(l_del_id_for_detail.ignore_for_planning, 'N') = 'N') THEN
3345 
3346           -- when it comes here, OTM R12 update delivery is not called before
3347           -- inside the same procedure, so can't use those variables
3348 
3349           l_tms_interface_flag := NULL;
3350 
3351           Post_Otm_Assign_Del_Detail
3352             (p_delivery_id         => l_del_id_for_detail.delivery_id,
3353              p_delivery_was_empty  => l_delivery_was_empty,
3354              p_tms_interface_flag  => l_tms_interface_flag,
3355              p_gross_weight        => l_gross_weight2, --using the container gross weight
3356              x_return_status       => l_return_status);
3357 
3358           IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
3359             IF l_debug_on THEN
3360               WSH_DEBUG_SV.log(l_module_name,'error from Post_Otm_Assign_Del_Detail');
3361             END IF;
3362             raise FND_API.G_EXC_ERROR;
3363           ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
3364             l_num_warnings := l_num_warnings + 1;
3365           END IF;
3366         END IF;
3367         -- End of OTM R12 : assign delivery detail
3368 
3369         FOR i in l_sync_tmp_recTbl.delivery_detail_id_tbl.first..l_sync_tmp_recTbl.delivery_detail_id_tbl.last LOOP
3370             l_mdc_detail_tab(i) := l_sync_tmp_recTbl.delivery_detail_id_tbl(i);
3371         END LOOP;
3372         WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
3373                        p_detail_id_tab => l_mdc_detail_tab,
3374                        x_return_status => x_return_status);
3375 
3376         IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
3377           IF l_debug_on THEN
3378             WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3379             WSH_DEBUG_SV.pop(l_module_name);
3380           END IF;
3381           return;
3382         END IF;
3383         l_mdc_detail_tab.delete;
3384         l_sync_tmp_recTbl.delivery_detail_id_tbl.delete;
3385         l_sync_tmp_recTbl.parent_detail_id_tbl.delete;
3386         l_sync_tmp_recTbl.delivery_id_tbl.delete;
3387         l_sync_tmp_recTbl.operation_type_tbl.delete;
3388 
3389     --}
3390     END IF;
3391     -- K LPN CONV. rv
3392 
3393                -- J: W/V Changes
3394                -- Container is being assigned to delivery. Call DD_WV_Post_Process to adjust the W/V of the parent
3395                IF l_debug_on THEN
3396                  WSH_DEBUG_SV.logmsg(l_module_name,'Assigning Container to Delivery');
3397                  WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
3398                END IF;
3399 
3400                WSH_WV_UTILS.DD_WV_Post_Process(
3401                  p_delivery_detail_id => p_parent_detail_id,
3402                  p_diff_gross_wt      => l_del_id_for_container.gross_weight,
3403                  p_diff_net_wt        => l_del_id_for_container.net_weight,
3404                  p_diff_volume        => l_del_id_for_container.volume,
3405                  p_diff_fill_volume   => l_del_id_for_container.volume,
3406                  x_return_status      => l_return_status);
3407 
3408                IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
3409                     --
3410                     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3411                     WSH_UTIL_CORE.Add_Message(x_return_status);
3412                     IF l_debug_on THEN
3413                         WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3414                         WSH_DEBUG_SV.pop(l_module_name);
3415                     END IF;
3416                     return;
3417                END IF;
3418 
3419 
3420     /* H integration: Pricing integration csun , marking the delivery */
3421     m := m + 1;
3422     l_del_tab(m) := l_del_id_for_detail.delivery_id;
3423 
3424    END IF;
3425 
3426 
3427          -- K LPN CONV. rv
3428          IF NOT( l_wms_org = 'Y' AND nvl(wsh_wms_lpn_grp.g_caller,'WSH') like 'WMS%')
3429          THEN
3430          --{
3431     -- J: W/V Changes
3432              IF l_debug_on THEN
3433                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
3434              END IF;
3435 
3436              WSH_WV_UTILS.DD_WV_Post_Process(
3437                p_delivery_detail_id => p_detail_id,
3438                p_diff_gross_wt      => l_del_id_for_detail.gross_weight,
3439                p_diff_net_wt        => l_del_id_for_detail.net_weight,
3440                p_diff_volume        => l_del_id_for_detail.volume,
3441                p_diff_fill_volume   => l_del_id_for_detail.volume,
3442                x_return_status      => l_return_status);
3443 
3444              IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
3445                 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3446                    l_num_warnings := l_num_warnings + 1;
3447                 ELSE
3448                   --
3449                   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3450                   WSH_UTIL_CORE.Add_Message(x_return_status);
3451                   IF l_debug_on THEN
3452                       WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3453                       WSH_DEBUG_SV.pop(l_module_name);
3454                   END IF;
3455                   return;
3456                 END IF;
3457              END IF;
3458          --}
3459          END IF;
3460          -- K LPN CONV. rv
3461 
3462    /*  H integration: Pricing integration csun   */
3463     IF l_del_tab.count > 0 THEN
3464     --
3465     IF l_debug_on THEN
3466         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
3467     END IF;
3468     --
3469     WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
3470        p_entity_type => 'DELIVERY',
3471        p_entity_ids   => l_del_tab,
3472        x_return_status => l_return_status);
3473     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3474        raise mark_reprice_error;
3475     END IF;
3476     END IF;
3477 
3478   IF l_num_warnings > 0 THEN
3479      x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
3480   END IF;
3481 
3482 --
3483 IF l_debug_on THEN
3484     WSH_DEBUG_SV.pop(l_module_name);
3485 END IF;
3486 --
3487   exception
3488 
3489   -- OTM R12 : assign delivery detail
3490   WHEN FND_API.G_EXC_ERROR then
3491     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3492     --
3493     IF l_debug_on THEN
3494         WSH_DEBUG_SV.pop(l_module_name);
3495     END IF;
3496     --
3497     RETURN;
3498   -- End of OTM R12 : assign delivery detail
3499 
3500   WHEN mark_reprice_error then
3501     FND_MESSAGE.Set_Name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
3502     x_return_status := l_return_status;
3503     WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
3504     --
3505     IF l_debug_on THEN
3506         WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
3507         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
3508     END IF;
3509     --
3510   WHEN invalid_detail then
3511     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3512     fnd_message.SET_name('WSH', 'WSH_DET_CONFIRMED_DETAIL');
3513     FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
3514     wsh_util_core.add_message(x_return_status,l_module_name);
3515     --
3516     IF l_debug_on THEN
3517         WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DETAIL exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
3518         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_DETAIL');
3519     END IF;
3520     --
3521     RETURN;
3522   WHEN others THEN
3523     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3524     wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_DETAIL_TO_CONT',l_module_name);
3525     --
3526     IF l_debug_on THEN
3527         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
3528         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3529     END IF;
3530     --
3531 END Assign_Detail_To_Cont;
3532 -- -------------------------------------------------------------------------------
3533 --Procedure:  Unssign_Detail_from_Cont
3534 --Parameters: p_detail_id,
3535 --    p_parent_detail_id,
3536 --    x_return_status
3537 --Description:  if detail is already assigned to a delivery which means
3538 --    the container must be assigned to the same delivery too,
3539 --    in this case even though the detail is getting removed
3540 --    from the container, it will still stay assigned to the
3541 --    delivery
3542 --    if the container is already assigned to a delivery,
3543 --    the detail must also be assigned to the same delivery
3544 
3545 
3546 PROCEDURE Unassign_Detail_from_Cont(
3547   p_detail_id   IN NUMBER,
3548   x_return_status   OUT NOCOPY  VARCHAR2,
3549   p_validate_flag   IN VARCHAR2)
3550 IS
3551 
3552 invalid_detail exception;
3553 -- J: W/V Changes
3554 e_abort        exception;
3555 l_param_info   WSH_SHIPPING_PARAMS_PVT.Parameter_Rec_Typ;
3556 l_cont_fill_pc NUMBER;
3557 
3558 /* H projects: pricing integration csun */
3559 l_del_tab   WSH_UTIL_CORE.Id_Tab_Type;
3560 l_return_status         VARCHAR2(1);
3561 l_del_rec  C_DEL_ID_FOR_CONT_OR_DETAIL%ROWTYPE;
3562 mark_reprice_error  EXCEPTION;
3563 
3564 l_num_warnings          number := 0;
3565 -- K LPN CONV. rv
3566 l_wms_org    VARCHAR2(10) := 'N';
3567 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
3568 l_mdc_detail_tab wsh_util_core.id_tab_type;
3569 
3570 cursor l_parent_cnt_csr (p_cnt_inst_id IN NUMBER) is
3571 select organization_id,
3572        nvl(line_direction,'O')
3573 from wsh_delivery_details
3574 where delivery_detail_id = p_cnt_inst_id
3575 and container_flag = 'Y'
3576 and source_code = 'WSH';
3577 
3578 l_parent_cnt_orgn_id NUMBER;
3579 l_parent_cnt_line_dir VARCHAR2(10);
3580 -- K LPN CONV. rv
3581 
3582 --
3583 l_debug_on BOOLEAN;
3584 --
3585 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_DETAIL_FROM_CONT';
3586 --
3587 BEGIN
3588   --
3589   --
3590   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3591   --
3592   IF l_debug_on IS NULL
3593   THEN
3594       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3595   END IF;
3596   --
3597   IF l_debug_on THEN
3598       WSH_DEBUG_SV.push(l_module_name);
3599       --
3600       WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
3601       WSH_DEBUG_SV.log(l_module_name,'P_VALIDATE_FLAG',P_VALIDATE_FLAG);
3602   END IF;
3603   --
3604   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3605 
3606         -- J: W/V Changes
3607   OPEN C_DEL_ID_FOR_CONT_OR_DETAIL(p_detail_id);
3608   FETCH C_DEL_ID_FOR_CONT_OR_DETAIL INTO l_del_rec;
3609   CLOSE C_DEL_ID_FOR_CONT_OR_DETAIL;
3610 
3611 
3612         IF l_del_rec.parent_delivery_detail_id is NULL THEN
3613           IF l_debug_on THEN
3614             WSH_DEBUG_SV.logmsg(l_module_name,'DD '||p_detail_id||' is already unassigned. Returning');
3615             WSH_DEBUG_SV.pop(l_module_name);
3616           END IF;
3617           return;
3618 
3619         -- LPN CONV. rv
3620         ELSE
3621           --
3622           open l_parent_cnt_csr(l_del_rec.parent_delivery_detail_id);
3623           fetch l_parent_cnt_csr into l_parent_cnt_orgn_id, l_parent_cnt_line_dir;
3624           close l_parent_cnt_csr;
3625           --
3626           IF l_debug_on THEN
3627             WSH_DEBUG_SV.log(l_module_name,' parent cnt orgn id is', l_parent_cnt_orgn_id);
3628             WSH_DEBUG_SV.log(l_module_name,' parent cnt line dir is', l_parent_cnt_line_dir);
3629           END IF;
3630           --
3631           l_wms_org := wsh_util_validate.check_wms_org(l_parent_cnt_orgn_id);
3632           --
3633         -- LPN CONV. rv
3634           --
3635         END IF;
3636 
3637   --
3638   IF l_debug_on THEN
3639       WSH_DEBUG_SV.log(l_module_name,'l_del_rec.released_status',l_del_rec.released_status);
3640   END IF;
3641   --
3642 
3643   IF l_del_rec.released_status = 'C' THEN
3644     Raise invalid_detail;
3645   END IF;
3646 
3647   -- K LPN CONV. rv
3648 
3649         IF NOT( l_wms_org = 'Y' AND nvl(wsh_wms_lpn_grp.g_caller,'WSH') like 'WMS%')
3650         THEN
3651         --{
3652 
3653             -- J: W/V Changes
3654             -- Decrement the DD W/V from container
3655             IF l_debug_on THEN
3656               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
3657             END IF;
3658 
3659             WSH_WV_UTILS.DD_WV_Post_Process(
3660               p_delivery_detail_id => p_detail_id,
3661               p_diff_gross_wt      => -1 * l_del_rec.gross_weight,
3662               p_diff_net_wt        => -1 * l_del_rec.net_weight,
3663               p_diff_volume        => -1 * l_del_rec.volume,
3664               p_diff_fill_volume   => -1 * l_del_rec.volume,
3665               p_check_for_empty    => 'Y',
3666               x_return_status      => l_return_status);
3667 
3668             IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
3669                 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3670                    l_num_warnings := l_num_warnings + 1;
3671                 ELSE
3672                  --
3673                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3674                  WSH_UTIL_CORE.Add_Message(x_return_status);
3675                  IF l_debug_on THEN
3676                      WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3677                      WSH_DEBUG_SV.pop(l_module_name);
3678                  END IF;
3679                  return;
3680                END IF;
3681             END IF;
3682         --}
3683         END IF;
3684 
3685   -- K LPN CONV. rv
3686   --
3687   -- K LPN CONV. rv
3688   IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
3689   AND nvl(l_parent_cnt_line_dir,'O') IN ('O', 'IO')
3690   AND
3691   (
3692     (WSH_WMS_LPN_GRP.GK_WMS_UNPACK and l_wms_org = 'Y')
3693     OR
3694     (WSH_WMS_LPN_GRP.GK_INV_UNPACK and l_wms_org = 'N')
3695   )
3696   THEN
3697   --{
3698       l_sync_tmp_rec.delivery_detail_id := p_detail_id;
3699       l_sync_tmp_rec.parent_delivery_detail_id := l_del_rec.parent_delivery_detail_id;
3700       l_sync_tmp_rec.delivery_id := l_del_rec.delivery_id;
3701       l_sync_tmp_rec.operation_type := 'PRIOR';
3702       --
3703       IF l_debug_on THEN
3704           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
3705       END IF;
3706       --
3707       WSH_WMS_SYNC_TMP_PKG.MERGE
3708       (
3709         p_sync_tmp_rec      => l_sync_tmp_rec,
3710         x_return_status     => l_return_status
3711       );
3712 
3713       IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
3714       THEN
3715         IF l_debug_on THEN
3716           WSH_DEBUG_SV.log(l_module_name,'WSH_WMS_SYNC_TMP_PKG.MERGE returned ',l_return_status);
3717         END IF;
3718         RAISE e_abort;
3719       ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3720         l_num_warnings := l_num_warnings + 1;
3721       END IF;
3722   --}
3723   END IF;
3724   -- K LPN CONV. rv
3725   --
3726   UPDATE wsh_delivery_assignments_v
3727   SET parent_delivery_detail_id = NULL,
3728     last_update_date = SYSDATE,
3729     last_updated_by =  FND_GLOBAL.USER_ID,
3730     last_update_login =  FND_GLOBAL.LOGIN_ID
3731   WHERE delivery_detail_id = p_detail_id;
3732   l_mdc_detail_tab(1) := p_detail_id;
3733   WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
3734                        p_detail_id_tab   => l_mdc_detail_tab,
3735                        x_return_status => x_return_status);
3736 
3737   IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
3738     IF l_debug_on THEN
3739       WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
3740       WSH_DEBUG_SV.pop(l_module_name);
3741     END IF;
3742     return;
3743   END IF;
3744   -- J: W/V Changes
3745   -- Need to recalculate the fill% if 'Percent Fill Basis' is Quantity
3746   -- Reason: DD_WV_Post_Process would have calculated the fill% but the delivery detail is not unassigned at
3747   --         that point of time. So the fill% will be wrong if 'Percent Fill Basis' is Quantity since the fill%
3748   --         calculation considers the delivery detail which is not yet unassigned
3749   IF l_debug_on THEN
3750     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_SHIPPING_PARAMS_PVT.Get',WSH_DEBUG_SV.C_PROC_LEVEL);
3751   END IF;
3752 
3753   WSH_SHIPPING_PARAMS_PVT.Get(
3754     p_organization_id => l_del_rec.organization_id,
3755     x_param_info      => l_param_info,
3756     x_return_status   => l_return_status);
3757 
3758   IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
3759     IF l_debug_on THEN
3760       WSH_DEBUG_SV.logmsg(l_module_name,'WSH_SHIPPING_PARAMS_PVT.Get returned '||l_return_status);
3761     END IF;
3762     raise e_abort;
3763   END IF;
3764 
3765   IF (l_param_info.percent_fill_basis_flag = 'Q') THEN
3766 
3767     -- K LPN CONV. rv
3768     IF NOT( l_wms_org = 'Y' AND nvl(wsh_wms_lpn_grp.g_caller,'WSH') like 'WMS%')
3769     THEN
3770     --{
3771         IF l_debug_on THEN
3772           WSH_DEBUG_SV.logmsg(l_module_name,'Need to recalculate the fill% for container');
3773           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CALC_CONT_FILL_PC',WSH_DEBUG_SV.C_PROC_LEVEL);
3774         END IF;
3775 
3776              WSH_WV_UTILS.ADJUST_PARENT_WV(
3777               p_entity_type   => 'CONTAINER',
3778               p_entity_id     => l_del_rec.parent_delivery_detail_id,
3779               p_gross_weight  => 0,
3780               p_net_weight    => 0,
3781               p_volume        => 0,
3782               p_filled_volume => 0,
3783               p_wt_uom_code   => l_del_rec.weight_uom_code,
3784               p_vol_uom_code  => l_del_rec.volume_uom_code,
3785               p_inv_item_id   => l_del_rec.inventory_item_id,
3786               x_return_status => l_return_status);
3787 
3788             IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
3789  	       THEN
3790                IF l_debug_on THEN
3791                 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_WV_UTILS.ADJUST_PARENT_WV returned '||l_return_status);
3792                END IF;
3793                RAISE e_abort;
3794             ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3795                l_num_warnings := l_num_warnings + 1;
3796             END IF;
3797 
3798     --}
3799     END IF;
3800     -- K LPN CONV. rv
3801   END IF;
3802 
3803   --
3804   IF l_debug_on THEN
3805       WSH_DEBUG_SV.log(l_module_name,'Delivery Id for l_del_rec',l_del_rec.delivery_id);
3806   END IF;
3807   --
3808 
3809         -- J: W/V Changes
3810         -- Assign the DD W/V back to delivery
3811         IF l_del_rec.delivery_id IS NOT NULL THEN
3812           IF l_debug_on THEN
3813             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
3814           END IF;
3815 
3816           WSH_WV_UTILS.DD_WV_Post_Process(
3817             p_delivery_detail_id => p_detail_id,
3818             p_diff_gross_wt      => l_del_rec.gross_weight,
3819             p_diff_net_wt        => l_del_rec.net_weight,
3820             p_diff_volume        => l_del_rec.volume,
3821             p_diff_fill_volume   => l_del_rec.volume,
3822             x_return_status      => l_return_status);
3823           IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
3824             IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3825                l_num_warnings := l_num_warnings + 1;
3826             ELSE
3827                --
3828                x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3829                WSH_UTIL_CORE.Add_Message(x_return_status);
3830                IF l_debug_on THEN
3831                    WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3832                    WSH_DEBUG_SV.pop(l_module_name);
3833                END IF;
3834                return;
3835             END IF;
3836           END IF;
3837 
3838         END IF;
3839 
3840   /*  H integration: Pricing integration csun */
3841   IF l_del_rec.delivery_id IS not NULL THEN
3842      l_del_tab.delete;
3843      l_del_tab(1) := l_del_rec.delivery_id;
3844     --
3845     IF l_debug_on THEN
3846         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
3847     END IF;
3848     --
3849     WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
3850        p_entity_type => 'DELIVERY',
3851        p_entity_ids   => l_del_tab,
3852        x_return_status => l_return_status);
3853     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3854        raise mark_reprice_error;
3855     END IF;
3856   END IF;
3857 
3858   IF l_num_warnings > 0 THEN
3859      x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
3860   END IF;
3861 
3862 --
3863 IF l_debug_on THEN
3864     WSH_DEBUG_SV.pop(l_module_name);
3865 END IF;
3866 --
3867 exception
3868   -- J: W/V Changes
3869   WHEN e_abort THEN
3870     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3871     IF l_debug_on THEN
3872       WSH_DEBUG_SV.pop(l_module_name);
3873     END IF;
3874 
3875   WHEN mark_reprice_error THEN
3876     FND_MESSAGE.Set_Name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
3877     x_return_status := l_return_status;
3878     WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
3879 
3880 --
3881 IF l_debug_on THEN
3882     WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
3883     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
3884 END IF;
3885 --
3886   WHEN invalid_detail then
3887     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3888     fnd_message.SET_name('WSH', 'WSH_DET_CONFIRMED_DETAIL');
3889     FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
3890     wsh_util_core.add_message(x_return_status,l_module_name);
3891     --
3892     IF l_debug_on THEN
3893         WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DETAIL exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
3894         WSH_DEBUG_SV.pop(l_module_name);
3895     END IF;
3896     --
3897     RETURN;
3898   WHEN others THEN
3899     wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_DETAIL_FROM_CONT',l_module_name);
3900     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3901 
3902 --
3903 IF l_debug_on THEN
3904     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
3905     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3906 END IF;
3907 --
3908 END Unassign_Detail_FROM_Cont;
3909 
3910 
3911 -- THIS PROCEDURE IS OBSOLETE
3912 --
3913 --Procedure:       Assign_Cont_To_Delivery
3914 --Parameters:      p_detail_id,
3915 --         p_delivery_id,
3916 --         x_return_status
3917 --Description:     This procedure is called when assigning a container to
3918 --              a delivery.
3919 --              It assigns all delivery lines and child containers to
3920 --              the delivery as well.
3921 --changing to just call assign_detail_to_delivery
3922 
3923 PROCEDURE Assign_Cont_To_Delivery(
3924   P_DETAIL_ID IN NUMBER,
3925   P_DELIVERY_ID  IN NUMBER,
3926   X_RETURN_STATUS OUT NOCOPY  VARCHAR2) IS
3927 assign_cont_del exception;
3928 --
3929 l_debug_on BOOLEAN;
3930 --
3931 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'ASSIGN_CONT_TO_DELIVERY';
3932 --
3933 BEGIN
3934   --
3935   --
3936   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3937   --
3938   --
3939 END Assign_Cont_To_Delivery;
3940 
3941 
3942 -------------------------------------------------------------------
3943 --Assign_Top_Detail_To_Delivery should only be called for the topmost
3944 --container in a hierarchy/detail (if it is a loose detail) assigns
3945 --all the details below (including containers) to delivery
3946 -- x_dlvy_has_lines : 'Y' :delivery has non-container lines.
3947 --                    'N' : delivery does not have non-container lines
3948 -- x_dlvy_freight_Terms_code : Delivery's freight term code
3949 -------------------------------------------------------------------
3950 
3951 
3952 PROCEDURE Assign_Top_Detail_To_Delivery(
3953   P_DETAIL_ID     IN NUMBER,
3954   P_DELIVERY_ID   IN NUMBER,
3955   X_RETURN_STATUS OUT NOCOPY  VARCHAR2,
3956     x_dlvy_has_lines          IN OUT NOCOPY VARCHAR2,    --
3957     x_dlvy_freight_terms_code IN OUT NOCOPY VARCHAR2,    -- J-IB-NPARIKH
3958     p_caller        IN VARCHAR2 --bug 5100229
3959     ) IS
3960 
3961 TYPE del_det_id_tab_type IS TABLE OF wsh_delivery_details.delivery_detail_id%TYPE INDEX BY BINARY_INTEGER;
3962 
3963 l_rowid varchar2(150);
3964 l_delivery_assignment_id NUMBER;
3965 --  cont_id NUMBER;
3966 del_id NUMBER;
3967 l_summary varchar2(3000);
3968 l_details varchar2(3000);
3969 l_get_msg_count number;
3970 
3971 l_cr_assn_status varchar2(30);
3972 l_group_status varchar2(30);
3973 l_arrival_status varchar2(30);
3974 l_ship_method_match BOOLEAN;
3975 
3976 l_attr_flag VARCHAR2(1) := 'N';
3977 l_cont_name VARCHAR2(30);
3978 
3979 invalid_del exception;
3980 invalid_detail exception;
3981 del_not_updatable exception;
3982 grouping_attributes_not_match exception;
3983 arrival_SET_failed exception;
3984 ship_method_not_match exception;
3985 l_delivery_assignments_info WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_Type;
3986 l_mdc_detail_tab wsh_util_core.id_tab_type;
3987 DETAIL_DEL_FROM_to_not_SAME exception;
3988 det_confirmed exception;
3989 update_mol_carton_group_error exception;
3990 
3991 
3992 CURSOR c_delivery IS
3993 SELECT status_code,planned_flag, initial_pickup_location_id,ultimate_dropoff_location_id,
3994 customer_id, intmed_ship_to_location_id, fob_code, freight_terms_code, ship_method_code,
3995 carrier_id, mode_of_transport, service_level,
3996 -- deliveryMerge
3997 batch_id,
3998         NVL(shipment_direction,'O') shipment_direction,   -- J-IB-NPARIKH
3999         shipping_control,   -- J-IB-NPARIKH
4000         vendor_id,   -- J-IB-NPARIKH
4001         party_id,   -- J-IB-NPARIKH
4002         NVL(ignore_for_planning,'N') ignore_for_planning, --J TP Release ttrichy
4003         organization_id    -- K LPN CONV. rv
4004 FROM wsh_new_deliveries
4005 WHERE delivery_id = p_delivery_id;
4006 l_del c_delivery%ROWTYPE;
4007 
4008 CURSOR c_detail(c_detail_id NUMBER) IS
4009 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,
4010        wdd.freight_terms_code,   -- J-IB-NPARIKH
4011        NVL(line_direction,'O') line_direction,   -- J-IB-NPARIKH
4012        shipping_control,   -- J-IB-NPARIKH
4013        vendor_id,   -- J-IB-NPARIKH
4014        party_id,   -- J-IB-NPARIKH
4015        NVL(ignore_for_planning,'N') ignore_for_planning,--J TP Release ttrichy
4016        mode_of_transport, carrier_id, service_level,
4017        wda.parent_delivery_detail_id, -- K LPN CONV. rv
4018        wdd.gross_weight               -- OTM R12 : assign delivery detail
4019 FROM wsh_delivery_details wdd, wsh_delivery_assignments_v wda
4020 WHERE wdd.delivery_detail_id = wda.delivery_detail_id and wdd.delivery_detail_id = c_detail_id;
4021 
4022 
4023 l_detail c_detail%ROWTYPE;
4024 
4025 l_del_assign NUMBER;
4026 
4027 CURSOR c_all_details_below IS
4028 SELECT  delivery_detail_id
4029 FROM  wsh_delivery_assignments_v
4030 START WITH  delivery_detail_id = p_detail_id
4031 CONNECT BY  prior delivery_detail_id = parent_delivery_detail_id;
4032 
4033 CURSOR c_getdet_ignore IS
4034 select NVL(ignore_for_planning, 'N') ignore_for_planning
4035 from wsh_delivery_details
4036 where delivery_detail_id=p_detail_id;
4037 
4038 -- J: W/V Changes
4039 l_detail_status         VARCHAR2(1);
4040 l_gross_wt              NUMBER;
4041 l_net_wt                NUMBER;
4042 l_vol                   NUMBER;
4043 l_container_flag        VARCHAR2(1);
4044 l_delivery_id           NUMBER;
4045 
4046 l_service_level         VARCHAR2(30);
4047 l_mode_of_transport     VARCHAR2(30);
4048 l_ship_method     VARCHAR2(30);
4049 l_carrier_id            NUMBER;
4050 
4051 l_dd_id      del_det_id_tab_type;
4052 i        BINARY_INTEGER := 0;
4053 j        BINARY_INTEGER :=0;
4054 
4055 l_dummy_del_det_id NUMBER;
4056 
4057 /* H projects: pricing integration csun */
4058 l_scc_unassign_from_del  NUMBER := 0;
4059 l_del_tab   WSH_UTIL_CORE.Id_Tab_Type;
4060 l_status                WSH_LOOKUPS.meaning%TYPE;
4061 l_return_status         VARCHAR2(1);
4062 
4063 CURSOR get_lookup (l_code VARCHAR2) IS
4064   SELECT meaning
4065   FROM wsh_lookups
4066   WHERE lookup_type = 'DELIVERY_STATUS'
4067   AND lookup_code = l_code;
4068 
4069 mark_reprice_error  EXCEPTION;
4070 l_dlvy_freight_terms_code VARCHAR2(30);
4071 l_update_dlvy             BOOLEAN;
4072 
4073 
4074 l_msg_count      NUMBER;
4075 l_msg_data       VARCHAR2(4000);
4076 
4077 -- bug 2691385
4078 l_detail_is_empty_cont VARCHAR2(1) := 'N';
4079 
4080 l_attr_tab  wsh_delivery_autocreate.grp_attr_tab_type;
4081 l_group_tab  wsh_delivery_autocreate.grp_attr_tab_type;
4082 l_action_rec wsh_delivery_autocreate.action_rec_type;
4083 l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
4084 l_matched_entities wsh_util_core.id_tab_type;
4085 l_out_rec wsh_delivery_autocreate.out_rec_type;
4086 
4087 -- K LPN CONV. rv
4088 l_detail_wms_org    VARCHAR2(10) := 'N';
4089 l_line_dir          VARCHAR2(10);
4090 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
4091 l_num_warnings NUMBER := 0;
4092 -- K LPN CONV. rv
4093 
4094 -- OTM R12 : update delivery
4095 l_delivery_info_tab       WSH_NEW_DELIVERIES_PVT.Delivery_Attr_Tbl_Type;
4096 l_delivery_info           WSH_NEW_DELIVERIES_PVT.Delivery_Rec_Type;
4097 l_new_interface_flag_tab  WSH_UTIL_CORE.COLUMN_TAB_TYPE;
4098 l_tms_update              VARCHAR2(1);
4099 l_trip_not_found          VARCHAR2(1);
4100 l_trip_info_rec           WSH_DELIVERY_VALIDATIONS.trip_info_rec_type;
4101 l_tms_version_number      WSH_NEW_DELIVERIES.TMS_VERSION_NUMBER%TYPE;
4102 l_gc3_is_installed        VARCHAR2(1);
4103 
4104 -- End of OTM R12 : update delivery
4105 
4106 -- OTM R12 : assign delivery detail
4107 l_delivery_was_empty      BOOLEAN;
4108 l_tms_interface_flag      WSH_NEW_DELIVERIES.TMS_INTERFACE_FLAG%TYPE;
4109 l_gross_weight1           WSH_DELIVERY_DETAILS.GROSS_WEIGHT%TYPE;
4110 l_gross_weight2           WSH_DELIVERY_DETAILS.GROSS_WEIGHT%TYPE;
4111 l_delivery_detail_ids     WSH_GLBL_VAR_STRCT_GRP.NUM_TBL_TYPE;
4112 l_assign_update           BOOLEAN;
4113 -- End of OTM R12 : assign delivery detail
4114 
4115 --
4116 l_debug_on BOOLEAN;
4117 --
4118 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'ASSIGN_TOP_DETAIL_TO_DELIVERY';
4119 --
4120 BEGIN
4121   --
4122   --
4123   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4124   --
4125   IF l_debug_on IS NULL
4126   THEN
4127       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4128   END IF;
4129   --
4130   IF l_debug_on THEN
4131       WSH_DEBUG_SV.push(l_module_name);
4132       --
4133       WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
4134       WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
4135             WSH_DEBUG_SV.log(l_module_name,'x_dlvy_has_lines',x_dlvy_has_lines);
4136       WSH_DEBUG_SV.log(l_module_name,'P_CALLER',P_CALLER);
4137   END IF;
4138   --
4139   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4140 
4141   -- OTM R12
4142   l_gc3_is_installed := WSH_UTIL_CORE.G_GC3_IS_INSTALLED;
4143 
4144   IF (l_gc3_is_installed IS NULL) THEN
4145     l_gc3_is_installed := WSH_UTIL_CORE.GC3_IS_INSTALLED;
4146   END IF;
4147   l_assign_update := FALSE; --default assignment tms update to false
4148   -- End of OTM R12
4149 
4150         -- J: W/V Changes
4151         open g_get_detail_info(p_detail_id);
4152         fetch g_get_detail_info
4153         into l_detail_status,l_gross_wt, l_net_wt, l_vol, l_container_flag, l_delivery_id;
4154         close  g_get_detail_info;
4155 
4156         IF l_delivery_id is NOT NULL THEN
4157           IF l_delivery_id <> p_delivery_id THEN
4158             FND_MESSAGE.SET_NAME('WSH','WSH_DET_ASSIGNED_DEL');
4159             FND_MESSAGE.SET_TOKEN('DET_NAME',p_detail_id);
4160             FND_MESSAGE.SET_TOKEN('DEL_NAME',l_delivery_id);
4161             x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4162             wsh_util_core.add_message(x_return_status,l_module_name);
4163             --
4164             IF l_debug_on THEN
4165               WSH_DEBUG_SV.pop(l_module_name);
4166             END IF;
4167             --
4168             RETURN;
4169           ELSE
4170             IF l_debug_on THEN
4171               WSH_DEBUG_SV.logmsg(l_module_name,'DD '||p_detail_id||' is already assigned to '||l_delivery_id||'. Returning');
4172               WSH_DEBUG_SV.pop(l_module_name);
4173             END IF;
4174             return;
4175           END IF;
4176         END IF;
4177 
4178 
4179     --
4180     -- J-IB-NPARIKH-{
4181     IF x_dlvy_has_lines IS NULL
4182     THEN
4183     --{
4184         FND_MESSAGE.SET_NAME('WSH', 'WSH_REQUIRED_FIELD_NULL');
4185         FND_MESSAGE.SET_TOKEN('FIELD_NAME', 'x_dlvy_has_lines');
4186         RAISE FND_API.G_EXC_ERROR;
4187     --}
4188     END IF;
4189     -- J-IB-NPARIKH-}
4190     --
4191     --
4192   OPEN c_delivery;
4193   FETCH c_delivery into l_del;
4194   IF (c_delivery%NOTFOUND) THEN
4195     CLOSE c_delivery;
4196     RAISE INVALID_DEL;
4197   END IF;
4198 
4199   CLOSE c_delivery;
4200 
4201   --
4202   IF l_debug_on THEN
4203     WSH_DEBUG_SV.log(l_module_name,'status_code',l_del.status_code);
4204    WSH_DEBUG_SV.log(l_module_name,'Delivery Freight Terms',l_del.freight_Terms_code);
4205   END IF;
4206   --
4207   /* security rule, delivery status should be open or packed and not planned  */
4208   /* the value for the flag can be Y or N updated with Bug 1559785*/
4209   IF ((l_del.status_code = 'CO') OR
4210       (l_del.status_code = 'IT') OR
4211       (l_del.status_code = 'CL') OR
4212       (l_del.status_code = 'SR') OR -- sperera 940/945
4213       (l_del.status_code = 'SC') OR
4214       (l_del.planned_flag IN ('Y','F')))
4215      AND l_del.shipment_direction IN ('O','IO')   -- J-IB-NPARIKH
4216   THEN
4217      IF l_del.planned_flag IN ('Y','F') THEN
4218         fnd_message.SET_name('WSH', 'WSH_PLAN_DEL_NOT_UPDATABLE');
4219      ELSE
4220         OPEN get_lookup(l_del.status_code);
4221         FETCH get_lookup INTO l_status;
4222         CLOSE get_lookup;
4223         fnd_message.SET_name('WSH', 'WSH_DET_DEL_NOT_UPDATABLE');
4224         FND_MESSAGE.SET_TOKEN('STATUS',l_status);
4225      END IF;
4226      RAISE DEL_NOT_UPDATABLE;
4227   END IF;
4228 
4229 
4230   -- OTM R12 : assign delivery detail
4231   IF (l_gc3_is_installed = 'Y' AND
4232       nvl(l_del.ignore_for_planning, 'N') = 'N') THEN
4233 
4234     Pre_Otm_Assign_Del_Detail
4235               (p_delivery_id        => p_delivery_id,
4236                p_detail_id          => p_detail_id,
4237                p_container1_id      => NULL,
4238                p_container2_id      => NULL,
4239                p_assignment_type    => 'DD2D',
4240                x_delivery_was_empty => l_delivery_was_empty,
4241                x_assign_update      => l_assign_update,
4242                x_gross_weight1      => l_gross_weight1,
4243                x_gross_weight2      => l_gross_weight2,
4244                x_return_status      => l_return_status);
4245 
4246     IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
4247       IF l_debug_on THEN
4248         WSH_DEBUG_SV.log(l_module_name,'error from Pre_Otm_Assign_Del_Detail');
4249       END IF;
4250       raise FND_API.G_EXC_ERROR;
4251     END IF;
4252   END IF;
4253   -- End of OTM R12 : assign delivery detail
4254 
4255        --J TP Release ttrichy
4256        FOR cur in c_getdet_ignore LOOP
4257           IF l_del.ignore_for_planning <> cur.ignore_for_planning THEN
4258              fnd_message.set_name('WSH', 'WSH_DET_DEL_DIFF_IGNOREPLAN');
4259              IF l_debug_on THEN
4260                   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4261              END IF;
4262              fnd_message.set_token('ENTITY1',nvl(wsh_container_utilities.get_cont_name(p_detail_id), p_detail_id));
4263              IF l_debug_on THEN
4264                   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.GET_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4265              END IF;
4266              fnd_message.set_token('ENTITY2',wsh_new_deliveries_pvt.get_name(p_delivery_id));
4267           END IF;
4268        END LOOP;
4269 
4270   OPEN c_all_details_below;
4271   --for locking all details
4272   LOOP
4273     FETCH c_all_details_below into l_dd_id(i);
4274     EXIT WHEN c_all_details_below%notfound;
4275     SELECT l_dd_id(i) into l_dummy_del_det_id
4276     FROM wsh_delivery_details
4277     WHERE delivery_detail_id=l_dd_id(i)
4278     FOR UPDATE NOWAIT;
4279     i:=i+1;
4280   END LOOP;
4281   CLOSE c_all_details_below;
4282 
4283   FOR j IN 0..(l_dd_id.COUNT-1) LOOP
4284     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4285    /* For each detail */
4286     IF (l_dd_id(j) < 0) THEN
4287       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4288       fnd_message.SET_name('WSH', 'WSH_DET_DETAIL_NOT_ASSIGNED');
4289       wsh_util_core.add_message(x_return_status,l_module_name);
4290       --
4291       IF l_debug_on THEN
4292         WSH_DEBUG_SV.pop(l_module_name);
4293       END IF;
4294       --
4295       RETURN;
4296     END IF;
4297 
4298 
4299 
4300 
4301     OPEN c_detail(l_dd_id(j));
4302     FETCH c_detail into l_detail;
4303     CLOSE c_detail;
4304 
4305       --
4306       IF l_debug_on THEN
4307         WSH_DEBUG_SV.log(l_module_name,'Released Status',l_detail.released_status);
4308         WSH_DEBUG_SV.log(l_module_name,'Delivery Id',l_detail.delivery_id);
4309         WSH_DEBUG_SV.log(l_module_name,'p_Delivery Id',p_delivery_id);
4310        WSH_DEBUG_SV.log(l_module_name,'Line Freight Terms',l_detail.freight_Terms_code);
4311       END IF;
4312       --
4313     --
4314     -- Bypass this check for inbound lines as a they can be assigned to delivery
4315     -- during ASN/Receipt integration, (line status is C)
4316     --
4317     IF l_detail.released_status = 'C'
4318       AND l_detail.line_direction IN ('O','IO')   -- J-IB-NPARIKH
4319       THEN
4320       RAISE DET_CONFIRMED;
4321     END IF;
4322 
4323 
4324     IF  ((l_detail.delivery_id IS NOT NULL) AND (l_detail.delivery_id <> p_delivery_id)) THEN
4325        FND_MESSAGE.SET_NAME('WSH','WSH_DET_ASSIGNED_DEL');
4326        FND_MESSAGE.SET_TOKEN('DET_NAME',l_detail.delivery_detail_id);
4327             FND_MESSAGE.SET_TOKEN('DEL_NAME',l_detail.delivery_id);
4328        x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4329        wsh_util_core.add_message(x_return_status,l_module_name);
4330        --
4331        IF l_debug_on THEN
4332            WSH_DEBUG_SV.pop(l_module_name);
4333        END IF;
4334        --
4335        RETURN;
4336     END IF;
4337 
4338           IF l_detail.container_flag = 'Y' THEN --{ Bug 5100229
4339             -- bug 2691385 -  check to see if the container is empty
4340             WSH_CONTAINER_UTILITIES.Is_Empty (p_container_instance_id => l_dd_id(j),
4341                                             x_empty_flag => l_detail_is_empty_cont,
4342                                             x_return_status => x_return_status);
4343             IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
4344               return;
4345             END IF;
4346           ELSE --}{
4347              l_detail_is_empty_cont := 'E';
4348           END IF; --}
4349 
4350           -- If the container is empty, update the delivery grouping attributes for the container
4351           -- to be the delivery grouping attributes of the delivery.
4352           IF (l_detail_is_empty_cont = 'Y')
4353           THEN
4354           --{
4355                 IF  l_detail.line_direction  IN ('O','IO')
4356                 AND l_del.shipment_direction IN ('O','IO')
4357                 THEN
4358                     l_detail.line_direction := l_del.shipment_direction;
4359                 END IF;
4360                 --
4361                 /*
4362                 IF  l_detail.line_direction  NOT IN ('O','IO')
4363                 AND l_del.shipment_direction NOT IN ('O','IO')
4364                 THEN
4365                     l_detail.line_direction := l_del.shipment_direction;
4366                 END IF;
4367                 */
4368                 --
4369                 -- K LPN CONV. rv
4370                 --
4371                 l_detail_wms_org := wsh_util_validate.check_wms_org(l_detail.organization_id);
4372                 --
4373                 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
4374                 AND l_detail.line_direction IN ('O','IO')
4375                 AND
4376                 (
4377                   (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_detail_wms_org = 'Y')
4378                   OR
4379                   (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_detail_wms_org = 'N')
4380                 )
4381                 THEN
4382                 --{
4383                     l_sync_tmp_rec.delivery_detail_id := l_dd_id(j);
4384                     l_sync_tmp_rec.operation_type := 'UPDATE';
4385                     --
4386                     IF l_debug_on THEN
4387                         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
4388                     END IF;
4389                     --
4390                     WSH_WMS_SYNC_TMP_PKG.MERGE
4391                     (
4392                       p_sync_tmp_rec      => l_sync_tmp_rec,
4393                       x_return_status     => l_return_status
4394                     );
4395 
4396                     IF l_debug_on THEN
4397                       WSH_DEBUG_SV.log(l_module_name,'Return Status is ',l_return_status);
4398                     END IF;
4399                     --
4400                     IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
4401                     --
4402                       x_return_status := l_return_status;
4403                     --
4404                       IF l_debug_on THEN
4405                         WSH_DEBUG_SV.pop(l_module_name);
4406                       END IF;
4407                     --
4408                       return;
4409                     --
4410                     ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
4411                     --
4412                       l_num_warnings := l_num_warnings + 1;
4413                     --
4414                     END IF;
4415                     --
4416                 --}
4417                 END IF;
4418                 -- K LPN CONV. rv
4419 
4420                 UPDATE WSH_DELIVERY_DETAILS
4421                    SET ship_from_location_id = l_del.initial_pickup_location_id,
4422                        ship_to_location_id = l_del.ultimate_dropoff_location_id,
4423                        customer_id = l_del.customer_id,
4424                        intmed_ship_to_location_id = l_del.intmed_ship_to_location_id,
4425                        fob_code = l_del.fob_code,
4426                        freight_terms_code = l_del.freight_terms_code,
4427                        ship_method_code = l_del.ship_method_code,
4428                        service_level = l_del.service_level,
4429                        carrier_id = l_del.carrier_id,
4430                        mode_of_transport = l_del.mode_of_transport,
4431                        line_direction      = l_detail.line_direction ,   -- J-IB-NPARIKH
4432                        shipping_control    = l_del.shipping_control   -- J-IB-NPARIKH
4433                  WHERE delivery_detail_id = l_dd_id(j);
4434 
4435                 IF (SQL%NOTFOUND) THEN
4436                   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4437                   RAISE NO_DATA_FOUND;
4438                 END IF;
4439 
4440                --Bug 3383843
4441                -- Need to open and fetch again because of previous updates
4442                OPEN c_detail(l_dd_id(j));
4443                FETCH c_detail into l_detail;
4444                CLOSE c_detail;
4445               -- Bug 3383843
4446 
4447           --}
4448           END IF;
4449           -- end 2691385
4450 
4451 
4452     IF l_detail.container_flag='Y' THEN
4453         --
4454         IF l_debug_on THEN
4455             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
4456         END IF;
4457         --
4458         WSH_CONTAINER_ACTIONS.Check_Cont_Attributes (
4459       l_detail.delivery_detail_id,
4460       l_attr_flag,
4461       x_return_status);
4462 
4463       IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4464       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4465       fnd_message.SET_name('WSH', 'WSH_CONT_ATTR_ERROR');
4466          FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_detail.delivery_detail_id);
4467       wsh_util_core.add_message(x_return_status,l_module_name);
4468       --
4469       IF l_debug_on THEN
4470           WSH_DEBUG_SV.pop(l_module_name);
4471       END IF;
4472       --
4473       return;
4474       END IF;
4475     END IF;
4476 
4477        /* security rule, group by attributes must be the same as the delivery's */
4478        /* Error */
4479        --
4480        IF l_debug_on THEN
4481            WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.CHECK_ASSIGN_DELIVERY',WSH_DEBUG_SV.C_PROC_LEVEL);
4482        END IF;
4483       --
4484 
4485        l_attr_tab(1).entity_id := p_delivery_id;
4486        l_attr_tab(1).entity_type := 'DELIVERY';
4487        l_attr_tab(2).entity_id := l_detail.delivery_detail_id;
4488        l_attr_tab(2).entity_type := 'DELIVERY_DETAIL';
4489 
4490        l_action_rec.action := 'MATCH_GROUPS';
4491        l_action_rec.check_single_grp := 'Y';
4492 
4493        -- IF this procedure is called from autocreate-delivery then
4494        -- the matching is already done.
4495 
4496        IF NVL(p_caller , 'WSH') <> 'AUTOCREATE' THEN --{ bug 5100229
4497           WSH_DELIVERY_AUTOCREATE.Find_Matching_Groups(p_attr_tab => l_attr_tab,
4498                         p_action_rec => l_action_rec,
4499                         p_target_rec => l_target_rec,
4500                         p_group_tab => l_group_tab,
4501                         x_matched_entities => l_matched_entities,
4502                         x_out_rec => l_out_rec,
4503                         x_return_status => l_group_status);
4504 
4505           IF (l_group_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
4506              x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4507              --
4508              IF l_debug_on THEN
4509                  WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
4510                  WSH_DEBUG_SV.pop(l_module_name);
4511              END IF;
4512              --
4513              RETURN;
4514           END IF;
4515        END IF; --}
4516 
4517        -- Pack J: Generic Carrier
4518        -- Update the ship method components in the delivery
4519        -- to match the assigned delivery_detail.
4520        -- Also update the line direction.
4521 
4522        IF NVL(p_caller, 'WSH')  <> 'AUTOCREATE' THEN --{ bug 5100229
4523 
4524           -- if this is called from autocreate delivery then the ship
4525           -- method componants are already set there for the delivery.
4526 
4527           l_service_level  := l_group_tab(l_group_tab.first).service_level;
4528           l_mode_of_transport  := l_group_tab(l_group_tab.first).mode_of_transport;
4529           l_carrier_id        :=  l_group_tab(l_group_tab.first).carrier_id;
4530           l_ship_method        :=  l_group_tab(l_group_tab.first).ship_method_code;
4531        END IF; --}
4532 
4533        -- OTM R12 : update delivery
4534        l_tms_update := 'N';
4535        l_new_interface_flag_tab(1) := NULL;
4536 
4537        IF (l_gc3_is_installed = 'Y' AND
4538            nvl(l_del.ignore_for_planning, 'N') = 'N') THEN
4539          l_trip_not_found := 'N';
4540 
4541          --get trip information for delivery, no update when trip not OPEN
4542          WSH_DELIVERY_VALIDATIONS.get_trip_information
4543                       (p_delivery_id     => p_delivery_id,
4544                        x_trip_info_rec   => l_trip_info_rec,
4545                        x_return_status   => l_return_status);
4546 
4547          IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
4548            x_return_status := l_return_status;
4549            IF l_debug_on THEN
4550              WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_DELIVERY_VALIDATIONS.get_trip_information');
4551              WSH_DEBUG_SV.pop(l_module_name);
4552            END IF;
4553            RETURN;
4554          END IF;
4555 
4556          IF (l_trip_info_rec.trip_id IS NULL) THEN
4557            l_trip_not_found := 'Y';
4558          END IF;
4559 
4560          -- only do changes when there's no trip or trip status is OPEN
4561          IF (l_trip_info_rec.status_code = 'OP' OR
4562              l_trip_not_found = 'Y') THEN
4563 
4564            WSH_DELIVERY_VALIDATIONS.get_delivery_information(
4565                                  p_delivery_id   => p_delivery_id,
4566                                  x_delivery_rec  => l_delivery_info,
4567                                  x_return_status => l_return_status);
4568 
4569            IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
4570              x_return_status := l_return_status;
4571              IF l_debug_on THEN
4572                WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_DELIVERY_VALIDATIONS.get_delivery_information');
4573                WSH_DEBUG_SV.pop(l_module_name);
4574              END IF;
4575              RETURN;
4576            END IF;
4577 
4578            -- if delivery is include for planning and service level, mode of
4579            -- transport, carrier id, or ship mdethod is changed with the nvl
4580            -- updates, then update is needed
4581 
4582            IF (nvl(l_delivery_info.service_level,
4583                    nvl(l_service_level, '@@')) <>
4584                nvl(l_delivery_info.service_level, '@@') OR
4585                nvl(l_delivery_info.mode_of_transport,
4586                    nvl(l_mode_of_transport, '@@')) <>
4587                nvl(l_delivery_info.mode_of_transport, '@@') OR
4588                nvl(l_delivery_info.carrier_id, nvl(l_carrier_id, -1)) <>
4589                nvl(l_delivery_info.carrier_id, -1) OR
4590                nvl(l_delivery_info.ship_method_code,
4591                    nvl(l_ship_method, '@@')) <>
4592                nvl(l_delivery_info.ship_method_code, '@@')) THEN
4593 
4594              IF (l_delivery_info.tms_interface_flag NOT IN
4595                  (WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT,
4596                   WSH_NEW_DELIVERIES_PVT.C_TMS_CREATE_REQUIRED,
4597                   WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_REQUIRED,
4598                   WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_IN_PROCESS,
4599                   WSH_NEW_DELIVERIES_PVT.C_TMS_UPDATE_REQUIRED)) THEN
4600                l_tms_update := 'Y';
4601                l_delivery_info_tab(1) := l_delivery_info;
4602                l_new_interface_flag_tab(1) := WSH_NEW_DELIVERIES_PVT.C_TMS_UPDATE_REQUIRED;
4603                l_tms_version_number := nvl(l_delivery_info.tms_version_number, 1) + 1;
4604              END IF;
4605            END IF; -- checking the value differences
4606          END IF; -- IF ((l_trip_not_found = 'N' AND
4607        END IF; -- IF (l_gc3_is_installed = 'Y'
4608 
4609        IF l_debug_on THEN
4610          WSH_DEBUG_SV.log(l_module_name, 'l_gc3_is_installed', l_gc3_is_installed);
4611          WSH_DEBUG_SV.log(l_module_name, 'l_tms_update', l_tms_update);
4612          IF (l_tms_update = 'Y') THEN
4613            WSH_DEBUG_SV.log(l_module_name, 'l_new_interface_flag_tab', l_new_interface_flag_tab(1));
4614            WSH_DEBUG_SV.log(l_module_name, 'l_tms_version_number', l_tms_version_number);
4615          END IF;
4616        END IF;
4617 
4618        -- End of OTM R12 : update delivery
4619 
4620        UPDATE WSH_NEW_DELIVERIES
4621           SET MODE_OF_TRANSPORT = decode(mode_of_transport, NULL, l_mode_of_transport, mode_of_transport),
4622               SERVICE_LEVEL = decode(service_level, NULL, l_service_level, service_level),
4623               CARRIER_ID = decode(carrier_id, NULL, l_carrier_id, carrier_id),
4624               SHIP_METHOD_CODE = decode(ship_method_code, NULL, l_ship_method, ship_method_code),
4625               SHIPMENT_DIRECTION = l_detail.line_direction,
4626               -- OTM R12
4627               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)),
4628               TMS_VERSION_NUMBER = decode(l_tms_update, 'Y', l_tms_version_number, nvl(tms_version_number, 1))
4629               -- End of OTM R12
4630         WHERE delivery_id = p_delivery_id;
4631 
4632        -- OTM R12 : update delivery
4633        IF (l_gc3_is_installed = 'Y' AND l_tms_update = 'Y') THEN
4634          WSH_XC_UTIL.LOG_OTM_EXCEPTION(
4635                 p_delivery_info_tab      => l_delivery_info_tab,
4636                 p_new_interface_flag_tab => l_new_interface_flag_tab,
4637                 x_return_status          => l_return_status);
4638 
4639          IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
4640            x_return_status := l_return_status;
4641            IF l_debug_on THEN
4642              WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_XC_UTIL.log_otm_exception');
4643              WSH_DEBUG_SV.pop(l_module_name);
4644            END IF;
4645            RETURN;
4646          END IF;
4647        END IF;
4648        -- End of OTM R12 : update delivery
4649 
4650   /* security rule, ship-to-location and ship-FROM-location must be the
4651   same as the delivery's */
4652   /* Error */
4653 
4654                   IF l_debug_on THEN
4655                      WSH_DEBUG_SV.log(l_module_name,'initial_pickup_location_id'
4656                                          ,l_del.initial_pickup_location_id);
4657                      WSH_DEBUG_SV.log(l_module_name,'ship_from_location_id',
4658                                           l_detail.ship_from_location_id);
4659                      WSH_DEBUG_SV.log(l_module_name,
4660                                           'ultimate_dropoff_location_id',
4661                                           l_del.ultimate_dropoff_location_id);
4662                      WSH_DEBUG_SV.log(l_module_name,'ship_to_location_id',
4663                                           l_detail.ship_to_location_id);
4664                    END IF;
4665        IF ((l_del.initial_pickup_location_id <> l_detail.ship_from_location_id)
4666         or (l_del.ultimate_dropoff_location_id <> l_detail.ship_to_location_id)
4667        or (l_detail.ship_to_location_id IS null)) THEN
4668       RAISE DETAIL_DEL_FROM_to_not_SAME ;
4669        END IF;
4670     --
4671     -- K LPN CONV. rv
4672     IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
4673     AND l_detail.line_direction IN ('O', 'IO')
4674     AND l_detail.container_flag='Y'
4675     AND
4676     (
4677       (WSH_WMS_LPN_GRP.GK_WMS_ASSIGN_DLVY and l_detail_wms_org = 'Y')
4678       OR
4679       (WSH_WMS_LPN_GRP.GK_INV_ASSIGN_DLVY and l_detail_wms_org = 'N')
4680     )
4681     THEN
4682     --{
4683         l_sync_tmp_rec.delivery_detail_id := l_detail.delivery_detail_id;
4684         l_sync_tmp_rec.parent_delivery_detail_id := l_detail.parent_delivery_detail_id;
4685         l_sync_tmp_rec.delivery_id := l_detail.delivery_id;
4686         l_sync_tmp_rec.operation_type := 'PRIOR';
4687         --
4688         IF l_debug_on THEN
4689             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
4690         END IF;
4691         --
4692         WSH_WMS_SYNC_TMP_PKG.MERGE
4693         (
4694           p_sync_tmp_rec      => l_sync_tmp_rec,
4695           x_return_status     => l_return_status
4696         );
4697 
4698         --
4699         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
4700         --
4701           x_return_status := l_return_status;
4702         --
4703           IF l_debug_on THEN
4704             WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
4705             WSH_DEBUG_SV.pop(l_module_name);
4706           END IF;
4707         --
4708           return;
4709         --
4710         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
4711         --
4712           l_num_warnings := l_num_warnings + 1;
4713         --
4714         END IF;
4715         --
4716     --}
4717     END IF;
4718     -- K LPN CONV. rv
4719     --
4720 
4721     UPDATE wsh_delivery_assignments_v
4722     SET delivery_id = p_delivery_id,
4723         last_update_date = SYSDATE,
4724         last_updated_by =  FND_GLOBAL.USER_ID,
4725         last_update_login =  FND_GLOBAL.LOGIN_ID
4726     WHERE delivery_detail_id = l_detail.delivery_detail_id;
4727     IF (SQL%NOTFOUND) THEN
4728            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4729            RAISE NO_DATA_FOUND;
4730     END IF;
4731 
4732     l_mdc_detail_tab(1) := l_detail.delivery_detail_id;
4733     WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
4734                        p_detail_id_tab     => l_mdc_detail_tab,
4735                        x_return_status => x_return_status);
4736 
4737     IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
4738       IF l_debug_on THEN
4739         WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
4740         WSH_DEBUG_SV.pop(l_module_name);
4741       END IF;
4742       return;
4743     END IF;
4744 
4745 
4746                 -- J-IB-NPARIKH-{
4747                 --
4748                 --
4749                 -- Set freight terms for inbound/drop-ship delivery
4750                 --   For non-empty delivery, set freight term to null,
4751                 --   if line's freight term is different
4752                 --   For an empty delivery, set freight term to line's value
4753                 --
4754                 x_dlvy_freight_terms_code := l_del.freight_terms_code;
4755                 --
4756                 IF  NVL(l_detail.container_flag,'N') = 'N'
4757                 AND l_detail.line_direction     NOT IN ('O','IO')
4758                 THEN
4759                 --{
4760                     IF  x_dlvy_has_lines                          = 'Y'
4761                     AND x_dlvy_freight_terms_code                 IS NOT NULL
4762                     AND NVL(l_detail.freight_terms_code,'!!!!!') <> x_dlvy_freight_terms_code
4763                     THEN
4764                         --
4765                         -- Non-empty delivery has different freight term than line's
4766                         -- So, we need to update delivery freight term to NULL
4767                         --
4768                         x_dlvy_freight_terms_code := NULL;
4769                     ELSIF x_dlvy_has_lines                          = 'N'
4770                     AND   NVL(l_detail.freight_terms_code,'!!!!!') <> NVL(x_dlvy_freight_terms_code,'!!!!!')
4771                     THEN
4772                         x_dlvy_freight_terms_code := l_detail.freight_terms_code;
4773                     END IF;
4774                     --
4775                     --
4776                     IF NVL(l_del.freight_terms_code,'!!!!!') <> NVL(x_dlvy_freight_terms_code,'!!!!!')
4777                     THEN
4778                     --{
4779                         --
4780                         IF l_debug_on THEN
4781                             WSH_DEBUG_SV.log(l_module_name,'Delivery updated Freight Terms',x_dlvy_freight_terms_code);
4782                         END IF;
4783                         --
4784 
4785                         -- OTM R12 : update delivery
4786                         -- no code changes are needed for the following update
4787                         -- since this routine is only for Inbound/drop-ship
4788                         -- deliveries, OTM flow will never reach here
4789 
4790                         UPDATE  wsh_new_deliveries
4791                         SET     freight_terms_code = x_dlvy_freight_terms_code,
4792                                 last_update_date   = SYSDATE,
4793                                 last_updated_by    = FND_GLOBAL.USER_ID,
4794                                 last_update_login  = FND_GLOBAL.LOGIN_ID
4795                         WHERE   delivery_id        = p_delivery_id;
4796                         --
4797                         IF (SQL%NOTFOUND)
4798                         THEN
4799                             x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4800                             RAISE INVALID_DEL;
4801                         END IF;
4802                     --}
4803                     END IF;
4804                 --}
4805                 END IF;
4806                 --
4807                 x_dlvy_has_lines := 'Y';
4808                 --
4809                 -- J-IB-NPARIKH-}
4810 
4811 
4812              IF (l_detail.released_status = WSH_DELIVERY_DETAILS_PKG.C_RELEASED_TO_WAREHOUSE) THEN
4813              --{
4814                IF (wsh_util_validate.Check_Wms_Org(l_detail.organization_id)='Y') AND
4815                   (l_detail.move_order_line_id IS NOT NULL AND
4816                    (WSH_USA_INV_PVT.is_mo_type_putaway
4817                          (p_move_order_line_id => l_detail.move_order_line_id) = 'N') -- X-dock
4818                   ) THEN -- check if  wms org
4819 
4820                -- Update Cartonization ID.
4821                IF l_debug_on THEN
4822                  WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_MO_CANCEL_PVT.update_mol_carton_group',WSH_DEBUG_SV.C_PROC_LEVEL);
4823                END IF;
4824 
4825                INV_MO_Cancel_PVT.update_mol_carton_group
4826                  (p_line_id            => l_detail.move_order_line_id,
4827                   p_carton_grouping_id => p_delivery_id,
4828                   x_return_status      => x_return_status,
4829                   x_msg_cnt            => l_msg_count,
4830                   x_msg_data           => l_msg_data);
4831 
4832                 IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
4833                                         WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
4834                   RAISE update_mol_carton_group_error;
4835                 END IF;
4836                END IF;
4837              --}
4838              END IF;
4839 
4840   --if container check attr flag, update container hierarchy
4841     IF l_detail.container_flag='Y' THEN
4842         IF l_attr_flag = 'N' THEN
4843         --
4844         IF l_debug_on THEN
4845             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
4846         END IF;
4847         --
4848         WSH_CONTAINER_ACTIONS.Update_Cont_Hierarchy (
4849             NULL,
4850             p_delivery_id,
4851             l_detail.delivery_detail_id,
4852             x_return_status);
4853         IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4854           FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
4855           --
4856           IF l_debug_on THEN
4857               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4858           END IF;
4859           --
4860           l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_detail.delivery_detail_id);
4861           FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4862           WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4863               --
4864               IF l_debug_on THEN
4865                   WSH_DEBUG_SV.pop(l_module_name);
4866               END IF;
4867               --
4868               return;
4869           END IF;
4870       END IF;
4871       x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4872     END IF;--for container
4873     /* H projects: pricing integration csun , if any lines are
4874        successfully unassign from the delivery, the delivery needs to be marked
4875        for repricing */
4876     l_scc_unassign_from_del := l_scc_unassign_from_del + 1;
4877   END LOOP;
4878         /* For each detail*/
4879 
4880 
4881   -- OTM R12 : assign delivery detail
4882   IF (l_assign_update AND
4883       l_gc3_is_installed = 'Y' AND
4884       nvl(l_del.ignore_for_planning, 'N') = 'N') THEN
4885 
4886     IF (l_tms_update = 'Y') THEN
4887       l_tms_interface_flag := l_new_interface_flag_tab(1);
4888     ELSIF (l_trip_info_rec.status_code = 'OP' OR
4889            l_trip_not_found = 'Y') THEN
4890       l_tms_interface_flag := nvl(l_delivery_info.tms_interface_flag, WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT);
4891     ELSE
4892       l_tms_interface_flag := NULL;
4893     END IF;
4894 
4895     Post_Otm_Assign_Del_Detail
4896               (p_delivery_id         => p_delivery_id,
4897                p_delivery_was_empty  => l_delivery_was_empty,
4898                p_tms_interface_flag  => l_tms_interface_flag,
4899                p_gross_weight        => l_gross_weight1,
4900                x_return_status       => l_return_status);
4901 
4902     IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
4903       IF l_debug_on THEN
4904         WSH_DEBUG_SV.log(l_module_name,'error from Post_Otm_Assign_Del_Detail');
4905       END IF;
4906       raise FND_API.G_EXC_ERROR;
4907     ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
4908       l_num_warnings := l_num_warnings + 1;
4909     END IF;
4910   END IF;
4911   -- End of OTM R12 : assign delivery detail
4912 
4913         -- J: W/V Changes
4914         -- Increment the delivery W/V by DD W/V
4915         IF l_debug_on THEN
4916           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
4917         END IF;
4918         WSH_WV_UTILS.DD_WV_Post_Process(
4919           p_delivery_detail_id => p_detail_id,
4920           p_diff_gross_wt      => l_gross_wt,
4921           p_diff_net_wt        => l_net_wt,
4922           p_diff_volume        => l_vol,
4923           p_diff_fill_volume   => l_vol,
4924           x_return_status      => l_return_status);
4925 
4926         IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
4927              --
4928              x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4929              WSH_UTIL_CORE.Add_Message(x_return_status);
4930              IF l_debug_on THEN
4931                  WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
4932                  WSH_DEBUG_SV.pop(l_module_name);
4933              END IF;
4934              return;
4935         END IF;
4936 
4937   --
4938   IF l_debug_on THEN
4939            WSH_DEBUG_SV.log(l_module_name,'l_scc_unassign_from_del',
4940                             l_scc_unassign_from_del);
4941   END IF;
4942 
4943         /*  H integration: Pricing integration csun */
4944         IF l_scc_unassign_from_del > 0 THEN
4945                 l_del_tab.delete;
4946                 l_del_tab(1) := p_delivery_id;
4947 
4948     --
4949     IF l_debug_on THEN
4950         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
4951     END IF;
4952     --
4953     WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
4954        p_entity_type => 'DELIVERY',
4955        p_entity_ids   => l_del_tab,
4956        x_return_status => l_return_status);
4957     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4958        raise mark_reprice_error;
4959           END IF;
4960   END IF;
4961 
4962   -- LPN CONV. rv
4963   IF (l_num_warnings > 0 AND x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
4964     --
4965     x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4966     --
4967   ELSE
4968     --
4969     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4970     --
4971   END IF;
4972   -- LPN CONV. rv
4973 
4974 
4975 --
4976 IF l_debug_on THEN
4977     WSH_DEBUG_SV.pop(l_module_name);
4978 END IF;
4979 --
4980   EXCEPTION
4981                 -- J-IB-NPARIKH-{
4982                 WHEN FND_API.G_EXC_ERROR THEN
4983                     x_return_status := WSH_UTIL_CORE.g_ret_sts_error;
4984                     WSH_UTIL_CORE.add_message (WSH_UTIL_CORE.g_ret_sts_error,l_module_name);
4985                     --
4986                     IF l_debug_on
4987                     THEN
4988                         WSH_DEBUG_SV.pop(l_module_name, 'EXCEPTION:FND_API.G_EXC_ERROR');
4989                     END IF;
4990                 -- J-IB-NPARIKH-}
4991 
4992     WHEN  mark_reprice_error THEN
4993       FND_MESSAGE.Set_Name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
4994       x_return_status := l_return_status;
4995       WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
4996 
4997 --
4998 IF l_debug_on THEN
4999     WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5000     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
5001 END IF;
5002 --
5003                 WHEN update_mol_carton_group_error THEN
5004       fnd_message.SET_name('WSH', 'WSH_MOL_CARTON_GROUP_ERROR');
5005                         x_return_status := l_return_status;
5006                         WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
5007 
5008                       --
5009                       IF l_debug_on THEN
5010                           WSH_DEBUG_SV.logmsg(l_module_name,'update_mol_carton_group_error exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5011                           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:update_mol_carton_group_error');
5012                       END IF;
5013 
5014 
5015     WHEN INVALID_DEL THEN
5016       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5017       fnd_message.SET_name('WSH', 'WSH_DET_INVALID_DEL');
5018       wsh_util_core.add_message(x_return_status,l_module_name);
5019           --
5020           IF l_debug_on THEN
5021               WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DEL exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5022               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_DEL');
5023           END IF;
5024           RETURN;
5025           --
5026     WHEN DEL_NOT_UPDATABLE THEN
5027       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5028       wsh_util_core.add_message(x_return_status,l_module_name);
5029           --
5030           IF l_debug_on THEN
5031               WSH_DEBUG_SV.logmsg(l_module_name,'DEL_NOT_UPDATABLE exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5032               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:DEL_NOT_UPDATABLE');
5033           END IF;
5034           --
5035           RETURN;
5036     WHEN INVALID_DETAIL THEN
5037       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5038       fnd_message.SET_name('WSH', 'WSH_DET_INVALID_DETAIL');
5039       FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
5040       wsh_util_core.add_message(x_return_status,l_module_name);
5041           --
5042           IF l_debug_on THEN
5043               WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DETAIL exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5044               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_DETAIL');
5045           END IF;
5046           --
5047           RETURN;
5048         WHEN DET_CONFIRMED THEN
5049             x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5050             fnd_message.SET_name('WSH', 'WSH_DET_CONFIRMED_DETAIL');
5051             FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_detail_id);
5052             wsh_util_core.add_message(x_return_status,l_module_name);
5053           --
5054           IF l_debug_on THEN
5055               WSH_DEBUG_SV.logmsg(l_module_name,'DET_CONFIRMED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5056               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:DET_CONFIRMED');
5057           END IF;
5058           --
5059           RETURN;
5060     WHEN detail_del_FROM_to_not_same THEN
5061       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5062       fnd_message.SET_name('WSH', 'WSH_DET_SHIP_F_T_N_MATCH');
5063       wsh_util_core.add_message(x_return_status,l_module_name);
5064 
5065 
5066 
5067 --
5068 IF l_debug_on THEN
5069     WSH_DEBUG_SV.logmsg(l_module_name,'DETAIL_DEL_FROM_TO_NOT_SAME exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5070     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:DETAIL_DEL_FROM_TO_NOT_SAME');
5071 END IF;
5072 --
5073           RETURN;
5074     WHEN ship_method_not_match THEN
5075       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5076       fnd_message.SET_name('WSH', 'WSH_DET_SHIP_METHOD_NOT_MATCH');
5077       wsh_util_core.add_message(x_return_status,l_module_name);
5078           --
5079           IF l_debug_on THEN
5080               WSH_DEBUG_SV.logmsg(l_module_name,'SHIP_METHOD_NOT_MATCH exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
5081               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:SHIP_METHOD_NOT_MATCH');
5082           END IF;
5083           --
5084           RETURN;
5085     WHEN others THEN
5086        x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
5087       wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_TOP_DETAIL_TO_DELIVERY',l_module_name);
5088           --
5089           IF l_debug_on THEN
5090               WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
5091               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
5092           END IF;
5093           --
5094           RETURN;
5095 END Assign_Top_Detail_To_Delivery;
5096 -------------------------------------------------------------------
5097 -- This procedure is only for backward compatibility. No one should call
5098 -- this procedure.
5099 -------------------------------------------------------------------
5100 
5101 PROCEDURE Assign_Top_Detail_To_Delivery(
5102     P_DETAIL_ID     IN NUMBER,
5103     P_DELIVERY_ID   IN NUMBER,
5104     X_RETURN_STATUS OUT NOCOPY  VARCHAR2
5105     ) IS
5106 
5107 --
5108 l_debug_on BOOLEAN;
5109 --
5110 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'ASSIGN_TOP_DETAIL_TO_DELIVERY';
5111 --
5112 l_has_lines               VARCHAR2(1);
5113 l_dlvy_freight_terms_code VARCHAR2(30);
5114 --
5115 BEGIN
5116     --
5117     --
5118     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
5119     --
5120     IF l_debug_on IS NULL
5121     THEN
5122         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
5123     END IF;
5124     --
5125     IF l_debug_on THEN
5126         WSH_DEBUG_SV.push(l_module_name);
5127         --
5128         WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
5129         WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
5130     END IF;
5131     --
5132     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
5133     --
5134     l_has_lines := WSH_DELIVERY_VALIDATIONS.has_lines
5135                         (
5136                             p_delivery_id => p_delivery_id
5137                         );
5138     --
5139     ASSIGN_TOP_DETAIL_TO_DELIVERY
5140         (
5141             p_detail_id               => p_detail_id,
5142             p_delivery_id             => p_delivery_id,
5143             X_RETURN_STATUS           => X_RETURN_STATUS,
5144             x_dlvy_has_lines               => l_has_lines,
5145             x_dlvy_freight_Terms_code => l_dlvy_freight_Terms_code
5146         );
5147     --
5148     IF l_debug_on THEN
5149         WSH_DEBUG_SV.pop(l_module_name);
5150     END IF;
5151     --
5152 EXCEPTION
5153     WHEN others THEN
5154         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
5155         wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_TOP_DETAIL_TO_DELIVERY',l_module_name);
5156         --
5157         IF l_debug_on THEN
5158             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
5159         END IF;
5160 END Assign_Top_Detail_To_Delivery;
5161 
5162 -- THIS PROCEDURE IS OBSOLETE
5163 --
5164 --Procedure:      Unassign_Cont_from_Delivery
5165 --Parameters:      p_detail_id,
5166 --            x_return_status
5167 --Desription:     Unassign an container FROM a delivery
5168 -- Note:         need to drill up down to UPDATE delivery_id to NULL
5169 
5170 PROCEDURE Unassign_Cont_from_Delivery(
5171   p_detail_id   IN NUMBER,
5172   X_RETURN_STATUS  OUT NOCOPY  VARCHAR2,
5173   p_validate_flag  IN VARCHAR2) IS
5174 
5175 --
5176 l_debug_on BOOLEAN;
5177 --
5178 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_CONT_FROM_DELIVERY';
5179 --
5180 BEGIN
5181   --
5182   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5183   --
5184 END Unassign_Cont_FROM_Delivery;
5185 
5186 --
5187 --Procedure:      Assign_Cont_to_Cont
5188 --Parameters:      p_detail_id1
5189 --              p_detail_id2
5190 --            x_return_status
5191 --Desription:      Assigns a container to another container
5192 
5193 -- it is called when assigning container1 to container2
5194 -- if container1 is already assigned to a delivery,  then drill up and down
5195 -- of the container2 and assign delivery_id to all the parent and child
5196 -- containers of the container2.
5197 
5198 -- if container2 is already assigned to a delivery,   then drill up and down
5199 -- of container1 and assign delivery_id to all parent and child containers
5200 -- of the container1
5201 
5202 
5203 PROCEDURE Assign_Cont_To_Cont(
5204   p_detail_id1   IN NUMBER,
5205   p_detail_id2   IN NUMBER,
5206   x_return_status OUT NOCOPY  VARCHAR2)
5207 IS
5208 
5209 --Bug 3522687 : OMFST:J:R2:RG:APPLN HANGS WHILE PERFORMING MANUAL PACKING ACTION
5210 --Modified cursor check_loop
5211 /*
5212 CURSOR check_loop(x_delivery_detail_id NUMBER) IS
5213  SELECT delivery_detail_id
5214  FROM wsh_delivery_assignments_v
5215  START WITH delivery_detail_id = x_delivery_detail_id
5216  CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id;
5217 */
5218 
5219   CURSOR c_get_shipto (p_container_id NUMBER) IS
5220   SELECT ship_to_location_id
5221   FROM wsh_delivery_details
5222   WHERE delivery_detail_id = p_container_id;
5223 
5224   l_container_is_empty   BOOLEAN;
5225   l_ship_to_loc          NUMBER;
5226   l_display_error        BOOLEAN;
5227 
5228 
5229 CURSOR check_loop(p_inner_cont_id NUMBER,p_outer_cont_id NUMBER) IS
5230   SELECT delivery_detail_id
5231   FROM   wsh_delivery_assignments_v
5232   WHERE delivery_detail_id =  p_outer_cont_id
5233   START WITH delivery_detail_id = p_inner_cont_id
5234   CONNECT BY prior delivery_detail_id = parent_delivery_detail_id;
5235 
5236   -- Bug 3715176
5237   CURSOR c_get_plan_flag (v_delivery_id NUMBER) IS
5238   SELECT nvl(planned_flag,'N')
5239   FROM   wsh_new_deliveries
5240   WHERE  delivery_id = v_delivery_id;
5241 
5242   CURSOR c_get_content_count(v_delivery_detail_id NUMBER) IS
5243   SELECT count(*)
5244   FROM   wsh_delivery_assignments_v wda
5245   WHERE	 wda.parent_delivery_detail_id = v_delivery_detail_id and rownum = 1;
5246   -- Bug 3715176
5247 
5248 /*  Commenting this out - Bug 2457558
5249 -- Bug 2167042-added to check fill percentage for a container
5250 --             when packing a container
5251 
5252 CURSOR Get_Min_Fill(v_cont_id NUMBER) IS
5253 SELECT nvl(minimum_fill_percent,0)
5254   FROM WSH_DELIVERY_DETAILS
5255  WHERE delivery_detail_id = v_cont_id
5256    AND container_flag = 'Y';
5257 
5258 l_min_fill NUMBER;
5259 l_fill NUMBER;
5260 l_gross NUMBER;
5261 l_net NUMBER;
5262 l_volume NUMBER;
5263 l_cont_name VARCHAR2(30);
5264 x_pack_status VARCHAR2(30);
5265 
5266 End of adding cursor for fill percentage
5267 */
5268 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
5269 l_del_id_for_container1 C_DEL_ID_FOR_CONT_OR_DETAIL%ROWTYPE;
5270 l_del_id_for_container2 C_DEL_ID_FOR_CONT_OR_DETAIL%ROWTYPE;
5271 
5272 detail_cont_name WSH_DELIVERY_DETAILS.CONTAINER_NAME%TYPE;
5273 parent_cont_name WSH_DELIVERY_DETAILS.CONTAINER_NAME%TYPE;
5274 
5275 l_group_by_flags WSH_DELIVERY_AUTOCREATE.group_by_flags_rec_type;
5276 /* H projects: pricing integration csun */
5277 m	    NUMBER := 0;
5278 l_del_tab   WSH_UTIL_CORE.Id_Tab_Type;
5279 mark_reprice_error  EXCEPTION;
5280 l_plan_flag varchar2(1);
5281 l_content_count NUMBER;
5282 
5283 l_out_container  NUMBER := 0 ;
5284 --
5285 -- K LPN CONV. rv
5286 l_wms_org    VARCHAR2(10) := 'N';
5287 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
5288 l_sync_tmp_recTbl wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
5289 l_num_warnings NUMBER := 0;
5290 l_operation_type VARCHAR2(100);
5291 -- K LPN CONV. rv
5292 l_mdc_detail_tab   WSH_UTIL_CORE.Id_Tab_Type;
5293 l_ignore_det_tab   WSH_UTIL_CORE.Id_Tab_Type;
5294 
5295 -- OTM R12 : assign delivery detail
5296 l_delivery_was_empty      BOOLEAN;
5297 l_tms_interface_flag      WSH_NEW_DELIVERIES.TMS_INTERFACE_FLAG%TYPE;
5298 l_gross_weight1           WSH_DELIVERY_DETAILS.GROSS_WEIGHT%TYPE;
5299 l_gross_weight2           WSH_DELIVERY_DETAILS.GROSS_WEIGHT%TYPE;
5300 l_gc3_is_installed        VARCHAR2(1);
5301 l_assign_update           BOOLEAN;
5302 -- End of OTM R12 : assign delivery detail
5303 
5304 l_debug_on BOOLEAN;
5305 --
5306 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'ASSIGN_CONT_TO_CONT';
5307 --
5308 BEGIN
5309   -- assumption:  IF both container1 and container2 are already
5310   -- assigned to deliveries. Both deliveries must be the same
5311   --
5312   --
5313   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
5314   --
5315   IF l_debug_on IS NULL
5316   THEN
5317       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
5318   END IF;
5319   --
5320   IF l_debug_on THEN
5321       WSH_DEBUG_SV.push(l_module_name);
5322       --
5323       WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID1',P_DETAIL_ID1);
5324       WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID2',P_DETAIL_ID2);
5325   END IF;
5326   --
5327   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
5328 
5329   -- OTM R12
5330   l_gc3_is_installed := WSH_UTIL_CORE.G_GC3_IS_INSTALLED;
5331 
5332   IF (l_gc3_is_installed IS NULL) THEN
5333     l_gc3_is_installed := WSH_UTIL_CORE.GC3_IS_INSTALLED;
5334   END IF;
5335   l_assign_update := FALSE;  --default assignment tms update to false
5336   -- End of OTM R12
5337 
5338   OPEN c_del_id_FOR_cont_or_detail(p_detail_id1);
5339   FETCH c_del_id_for_cont_or_detail into l_del_id_for_container1;
5340   CLOSE c_del_id_for_cont_or_detail;
5341 
5342         -- J: W/V Changes
5343   IF l_del_id_for_container1.parent_delivery_detail_id = p_detail_id2 THEN
5344       IF l_debug_on THEN
5345             WSH_DEBUG_SV.logmsg(l_module_name,'Cont '||p_detail_id1||' is already assigned to '||p_detail_id2||'. Returning');
5346             WSH_DEBUG_SV.pop(l_module_name);
5347       END IF;
5348       return;
5349   END IF;
5350 
5351   OPEN c_del_id_for_cont_or_detail(p_detail_id2);
5352   FETCH c_del_id_for_cont_or_detail into l_del_id_for_container2;
5353   CLOSE c_del_id_for_cont_or_detail;
5354 
5355   -- K LPN CONV. rv
5356   --
5357   l_wms_org := wsh_util_validate.check_wms_org(l_del_id_for_container2.organization_id);
5358   --
5359   -- K LPN CONV. rv
5360         IF l_debug_on THEN
5361            WSH_DEBUG_SV.log(l_module_name,'delivery_id 1',
5362                                          l_del_id_for_container1.delivery_id);
5363            WSH_DEBUG_SV.log(l_module_name,'organization_id 1',
5364                                       l_del_id_for_container1.organization_id);
5365            WSH_DEBUG_SV.log(l_module_name,'ship_from_location_id 1',
5366                                  l_del_id_for_container1.ship_from_location_id);
5367            WSH_DEBUG_SV.log(l_module_name,'customer_id 1',
5368                                          l_del_id_for_container1.customer_id);
5369            WSH_DEBUG_SV.log(l_module_name,'intmed_ship_to_location_id 1',
5370                             l_del_id_for_container1.intmed_ship_to_location_id);
5371            WSH_DEBUG_SV.log(l_module_name,'fob_code 1',
5372                                          l_del_id_for_container1.fob_code);
5373            WSH_DEBUG_SV.log(l_module_name,'freight_terms_code 1',
5374                                    l_del_id_for_container1.freight_terms_code);
5375            WSH_DEBUG_SV.log(l_module_name,'ship_method_code 1',
5376                                       l_del_id_for_container1.ship_method_code);
5377            WSH_DEBUG_SV.log(l_module_name,'parent_delivery_detail_id 1',
5378                             l_del_id_for_container1.parent_delivery_detail_id);
5379 
5380            WSH_DEBUG_SV.log(l_module_name,'delivery_id 2',
5381                                          l_del_id_for_container2.delivery_id);
5382            WSH_DEBUG_SV.log(l_module_name,'organization_id 2',
5383                                       l_del_id_for_container2.organization_id);
5384            WSH_DEBUG_SV.log(l_module_name,'ship_from_location_id 2',
5385                                  l_del_id_for_container2.ship_from_location_id);
5386            WSH_DEBUG_SV.log(l_module_name,'customer_id 2',
5387                                          l_del_id_for_container2.customer_id);
5388            WSH_DEBUG_SV.log(l_module_name,'intmed_ship_to_location_id 2',                                                       l_del_id_for_container2.intmed_ship_to_location_id);
5389            WSH_DEBUG_SV.log(l_module_name,'fob_code 2',
5390                                          l_del_id_for_container2.fob_code);
5391            WSH_DEBUG_SV.log(l_module_name,'freight_terms_code 2',
5392                                    l_del_id_for_container2.freight_terms_code);
5393            WSH_DEBUG_SV.log(l_module_name,'ship_method_code 2',
5394                                       l_del_id_for_container2.ship_method_code);
5395            WSH_DEBUG_SV.log(l_module_name,'parent_delivery_detail_id 2',
5396                             l_del_id_for_container2.parent_delivery_detail_id);
5397            WSH_DEBUG_SV.log(l_module_name,'customer',
5398                                              l_group_by_flags.customer);
5399            WSH_DEBUG_SV.log(l_module_name,'intmed',
5400                                             l_group_by_flags.intmed);
5401            WSH_DEBUG_SV.log(l_module_name,'fob', l_group_by_flags.fob);
5402            WSH_DEBUG_SV.log(l_module_name,'freight_terms',
5403                                              l_group_by_flags.freight_terms);
5404            WSH_DEBUG_SV.log(l_module_name,'ship_method',
5405                                              l_group_by_flags.ship_method);
5406 
5407         END IF;
5408 
5409 
5410      /* Check to see if the line is already packed */
5411      IF (l_del_id_for_container1.parent_delivery_detail_id IS NOT NULL
5412       AND l_del_id_for_container1.parent_delivery_detail_id <>
5413         p_detail_id2
5414       ) THEN
5415       FND_MESSAGE.SET_NAME('WSH','WSH_DET_PACK_ERROR');
5416       --
5417       IF l_debug_on THEN
5418           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5419       END IF;
5420       --
5421       FND_MESSAGE.SET_TOKEN('DET_LINE',
5422           nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5423       --
5424       IF l_debug_on THEN
5425           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5426       END IF;
5427       --
5428       FND_MESSAGE.SET_TOKEN('CONT_NAME',
5429           nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5430       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5431       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5432       --
5433       IF l_debug_on THEN
5434           WSH_DEBUG_SV.pop(l_module_name);
5435       END IF;
5436       --
5437       return;
5438     END IF;
5439 
5440   -- OTM R12 : assign delivery detail
5441   IF (l_gc3_is_installed = 'Y' AND
5442       nvl(l_del_id_for_container1.ignore_for_planning, 'N') = 'N') THEN
5443 
5444     Pre_Otm_Assign_Del_Detail
5445               (p_delivery_id        => NULL,
5446                p_detail_id          => NULL,
5447                p_container1_id      => p_detail_id1,
5448                p_container2_id      => p_detail_id2,
5449                p_assignment_type    => 'C2C',
5450                x_delivery_was_empty => l_delivery_was_empty,
5451                x_assign_update      => l_assign_update,
5452                x_gross_weight1      => l_gross_weight1,
5453                x_gross_weight2      => l_gross_weight2,
5454                x_return_status      => l_return_status);
5455 
5456     IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
5457       --handle the error approriately to the procedure this code is in
5458       IF l_debug_on THEN
5459         WSH_DEBUG_SV.log(l_module_name,'error from Pre_Otm_Assign_Del_Detail');
5460       END IF;
5461       raise FND_API.G_EXC_ERROR;
5462     END IF;
5463   END IF;
5464   -- End of OTM R12 : assign delivery detail
5465 
5466     --Bug 3522687 : OMFST:J:R2:RG:APPLN HANGS WHILE PERFORMING MANUAL PACKING ACTION
5467     --Cursor check_loop returns delivery_detail_id of the
5468     --outer container if outer container is packed in the inner container.
5469 
5470 	OPEN check_loop(p_detail_id1,p_detail_id2);
5471 	FETCH check_loop into l_out_container;
5472 
5473 	-- If cursor returns then we have self nesting in containers
5474 
5475 	IF (check_loop%FOUND) THEN
5476 
5477 	     CLOSE check_loop;
5478  	     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_LOOP_NO_PACK');
5479 		--
5480 	     IF l_debug_on THEN
5481 		 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5482 	     END IF;
5483 		--
5484 	     FND_MESSAGE.SET_TOKEN('DETAIL_CONTAINER',
5485 		nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5486 		--
5487 	     IF l_debug_on THEN
5488 		WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5489 	     END IF;
5490 		--
5491 	     FND_MESSAGE.SET_TOKEN('PARENT_CONTAINER',
5492 		nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5493 		x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5494 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5495 		--
5496 	     IF l_debug_on THEN
5497 		  WSH_DEBUG_SV.pop(l_module_name);
5498              END IF;
5499 		--
5500 	    return;
5501 	END IF;
5502         CLOSE check_loop;
5503     -- End of fix for bug 3522687
5504 
5505     /* Added code to validate grouping attributes for Child Container and master
5506     Container */
5507     IF (l_del_id_for_container1.organization_id <>
5508        l_del_id_for_container2.organization_id) THEN
5509       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_ORG_DIFF');
5510       --
5511       IF l_debug_on THEN
5512           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5513       END IF;
5514       --
5515       FND_MESSAGE.SET_TOKEN('ENTITY1',
5516             nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5517       --
5518       IF l_debug_on THEN
5519           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5520       END IF;
5521       --
5522       FND_MESSAGE.SET_TOKEN('ENTITY2',
5523             nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5524       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5525       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5526       --
5527       IF l_debug_on THEN
5528           WSH_DEBUG_SV.pop(l_module_name);
5529       END IF;
5530       --
5531       RETURN;
5532     END IF;
5533 
5534     IF (l_del_id_for_container1.ship_from_location_id <>
5535        l_del_id_for_container2.ship_from_location_id) THEN
5536       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
5537       --
5538       IF l_debug_on THEN
5539           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5540       END IF;
5541       --
5542       FND_MESSAGE.SET_TOKEN('DETAIL_ID',
5543           nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5544       --
5545       IF l_debug_on THEN
5546           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5547       END IF;
5548       --
5549       FND_MESSAGE.SET_TOKEN('CONT_NAME',
5550         nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5551       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5552       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5553       --
5554       IF l_debug_on THEN
5555           WSH_DEBUG_SV.pop(l_module_name);
5556       END IF;
5557       --
5558       RETURN;
5559      END IF;
5560 
5561         --J TP Release
5562       IF (l_del_id_for_container1.ignore_for_planning <>
5563               l_del_id_for_container2.ignore_for_planning) THEN
5564 
5565 
5566            -- R12: MDC
5567            -- If called by WMS, and line is part of a consol delivery,
5568            -- then the ignore for planning flag is always 'Y'. For WMS,
5569            -- we need to set the child detail's ignore for planning status
5570            -- to be 'Y' before we attempt to pack.
5571 
5572            IF (l_wms_org = 'Y') AND
5573               ((l_del_id_for_container1.wda_type = 'O') OR (l_del_id_for_container2.wda_type = 'O')) --{
5574            THEN
5575               IF l_del_id_for_container1.wda_type = 'O' THEN
5576                  l_ignore_det_tab(1) := p_detail_id2;
5577               ELSE
5578                  l_ignore_det_tab(1) := p_detail_id1;
5579               END IF;
5580 
5581               WSH_TP_RELEASE.change_ignoreplan_status
5582                    (p_entity        => 'DLVB',
5583                     p_in_ids        => l_ignore_det_tab,
5584                     p_action_code   => 'IGNORE_PLAN',
5585                     x_return_status => x_return_status);
5586 
5587               IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
5588 
5589                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_DIFF_IGNOREPLAN');
5590                  FND_MESSAGE.SET_TOKEN('ENTITY1',nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5591                  --
5592                  IF l_debug_on THEN
5593                      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5594                  END IF;
5595                  --
5596                  FND_MESSAGE.SET_TOKEN('ENTITY2',nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5597                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5598                  --
5599                  IF l_debug_on THEN
5600                     WSH_DEBUG_SV.pop(l_module_name);
5601                  END IF;
5602                  --
5603                  RETURN;
5604 
5605               END IF;
5606 
5607 
5608            ELSE --}
5609               l_display_error := TRUE;
5610               IF (l_wms_org = 'Y')  THEN--{
5611                  OPEN c_get_shipto(p_detail_id2);
5612                  FETCH c_get_shipto INTO l_ship_to_loc;
5613                  CLOSE c_get_shipto;
5614                  --
5615                  l_container_is_empty := l_ship_to_loc IS NULL;
5616                  --
5617                  IF l_container_is_empty THEN --{
5618 
5619 
5620                     l_ignore_det_tab(1) := p_detail_id2;
5621                     WSH_TP_RELEASE.change_ignoreplan_status
5622                       (p_entity        => 'DLVB',
5623                        p_in_ids        => l_ignore_det_tab,
5624                        p_action_code   => 'IGNORE_PLAN',
5625                        x_return_status => l_return_status);
5626 
5627                     IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN --{
5628                        l_display_error := TRUE;
5629                     ELSE
5630                        l_display_error := FALSE;
5631                     END IF;--}
5632                  END IF; --}
5633               END IF ; --}
5634 
5635               IF l_display_error THEN --{
5636                  FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_DIFF_IGNOREPLAN');
5637                  --
5638                  IF l_debug_on THEN
5639                      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5640                  END IF;
5641                  FND_MESSAGE.SET_TOKEN('ENTITY1',nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5642                  --
5643                  IF l_debug_on THEN
5644                      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5645                  END IF;
5646                  --
5647                  FND_MESSAGE.SET_TOKEN('ENTITY2',nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5648                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5649                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5650                  --
5651                  IF l_debug_on THEN
5652                     WSH_DEBUG_SV.pop(l_module_name);
5653                  END IF;
5654                  --
5655                  RETURN;
5656               END IF; --}
5657            END IF;
5658         END IF;
5659 
5660             --
5661             -- J-IB-NPARIKH-{
5662             --
5663             --
5664             -- O container can be assigned to empty IO container
5665             -- IO container can be assigned to empty O container
5666             -- Otherwise, both containers' line direction must match
5667             --
5668             IF (l_del_id_for_container1.line_direction <> l_del_id_for_container2.line_direction)
5669             THEN
5670             --{
5671                 IF  l_del_id_for_container1.line_direction IN ('O','IO')
5672                 AND l_del_id_for_container2.line_direction IN ('O','IO')
5673                 THEN
5674                 --{
5675                     NULL;
5676                 --}
5677                 ELSE
5678                 --{
5679                       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
5680                       --
5681                       IF l_debug_on THEN
5682                           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5683                       END IF;
5684                       --
5685                       FND_MESSAGE.SET_TOKEN('DETAIL_ID',
5686                               nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5687                       --
5688                       IF l_debug_on THEN
5689                           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5690                       END IF;
5691                       --
5692                       FND_MESSAGE.SET_TOKEN('CONT_NAME',
5693                             nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5694                       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5695                       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5696                       --
5697                       IF l_debug_on THEN
5698                           WSH_DEBUG_SV.pop(l_module_name);
5699                       END IF;
5700                       --
5701                       RETURN;
5702                 --}
5703                 END IF;
5704             --}
5705             END IF;
5706             --
5707             -- J-IB-NPARIKH-}
5708             --
5709     --
5710     IF l_debug_on THEN
5711         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.GET_GROUP_BY_ATTR',WSH_DEBUG_SV.C_PROC_LEVEL);
5712     END IF;
5713     --
5714     WSH_DELIVERY_AUTOCREATE.get_group_by_attr(
5715        p_organization_id => l_del_id_for_container1.organization_id,
5716        x_group_by_flags  => l_group_by_flags,
5717        x_return_status   => x_return_status);
5718 
5719     IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
5720       x_return_status := x_return_status;
5721       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5722       --
5723       IF l_debug_on THEN
5724           WSH_DEBUG_SV.pop(l_module_name);
5725       END IF;
5726       --
5727       RETURN;
5728     END IF;
5729 
5730           --- Bug 3715176
5731           -- If delivery is same for container to pack and to be packed then it should not check firm status.
5732           IF l_del_id_for_container1.delivery_id = l_del_id_for_container2.delivery_id then
5733 	        NULL;
5734 
5735 	  Elsif l_del_id_for_container1.delivery_id is NOT NULL OR
5736 	        l_del_id_for_container2.delivery_id is NOT NULL then
5737 
5738           Open  c_get_content_count(p_detail_id2);
5739 	  Fetch c_get_content_count into l_content_count;
5740 	  Close c_get_content_count;
5741 
5742           IF l_content_count > 0 THEN
5743 	  IF l_del_id_for_container1.delivery_id IS NOT NULL then
5744 	     OPEN c_get_plan_flag(l_del_id_for_container1.delivery_id);
5745 	     FETCH c_get_plan_flag into l_plan_flag;
5746 	     CLOSE c_get_plan_flag;
5747 
5748   	   if l_plan_flag <> 'N' then
5749 	         FND_MESSAGE.SET_NAME('WSH','WSH_DEL_STATUS_NOT_PROPER');
5750 
5751 		 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5752 
5753                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5754                  --
5755                  IF l_debug_on THEN
5756                     WSH_DEBUG_SV.pop(l_module_name);
5757                  END IF;
5758                  --
5759                  return;
5760              end if;
5761 	   END IF;
5762 
5763 	   IF l_del_id_for_container2.delivery_id IS NOT NULL then
5764 	     OPEN c_get_plan_flag(l_del_id_for_container2.delivery_id);
5765 	     FETCH c_get_plan_flag into l_plan_flag;
5766 	     CLOSE c_get_plan_flag;
5767 
5768   	   if l_plan_flag <> 'N' then
5769 	         FND_MESSAGE.SET_NAME('WSH','WSH_DEL_STATUS_NOT_PROPER');
5770 
5771 		 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5772 
5773                  WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5774                  --
5775                  IF l_debug_on THEN
5776                     WSH_DEBUG_SV.pop(l_module_name);
5777                  END IF;
5778                  --
5779                  return;
5780              end if;
5781 	   END IF;
5782           END IF;
5783          END IF;
5784         -- Bug 3715176
5785 
5786 
5787     IF l_group_by_flags.customer = 'Y' THEN
5788       IF (l_del_id_for_container1.customer_id <>
5789        l_del_id_for_container2.customer_id) THEN
5790       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
5791       --
5792       IF l_debug_on THEN
5793           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5794       END IF;
5795       --
5796       FND_MESSAGE.SET_TOKEN('DETAIL_ID',
5797           nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5798       --
5799       IF l_debug_on THEN
5800           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5801       END IF;
5802       --
5803       FND_MESSAGE.SET_TOKEN('CONT_NAME',
5804           nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5805       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5806       --
5807       IF l_debug_on THEN
5808           WSH_DEBUG_SV.pop(l_module_name);
5809       END IF;
5810       --
5811       return;
5812       END IF;
5813     END IF;
5814     IF l_group_by_flags.intmed = 'Y' THEN
5815       IF (l_del_id_for_container1.intmed_ship_to_location_id <>
5816        l_del_id_for_container2.intmed_ship_to_location_id) THEN
5817       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
5818       --
5819       IF l_debug_on THEN
5820           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5821       END IF;
5822       --
5823       FND_MESSAGE.SET_TOKEN('DETAIL_ID',
5824           nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5825       --
5826       IF l_debug_on THEN
5827           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5828       END IF;
5829       --
5830       FND_MESSAGE.SET_TOKEN('CONT_NAME',
5831           nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5832       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5833       --
5834       IF l_debug_on THEN
5835           WSH_DEBUG_SV.pop(l_module_name);
5836       END IF;
5837       --
5838       return;
5839       END IF;
5840     END IF;
5841     IF l_group_by_flags.fob = 'Y' THEN
5842       IF (l_del_id_for_container1.fob_code <>
5843        l_del_id_for_container2.fob_code) THEN
5844       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
5845       --
5846       IF l_debug_on THEN
5847           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5848       END IF;
5849       --
5850       FND_MESSAGE.SET_TOKEN('DETAIL_ID',
5851           nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5852       --
5853       IF l_debug_on THEN
5854           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5855       END IF;
5856       --
5857       FND_MESSAGE.SET_TOKEN('CONT_NAME',
5858           nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5859       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5860       --
5861       IF l_debug_on THEN
5862           WSH_DEBUG_SV.pop(l_module_name);
5863       END IF;
5864       --
5865       return;
5866       END IF;
5867     END IF;
5868     IF l_group_by_flags.freight_terms = 'Y' THEN
5869       IF (l_del_id_for_container1.freight_terms_code <>
5870        l_del_id_for_container2.freight_terms_code) THEN
5871       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
5872       --
5873       IF l_debug_on THEN
5874           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5875       END IF;
5876       --
5877       FND_MESSAGE.SET_TOKEN('DETAIL_ID',
5878           nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5879       --
5880       IF l_debug_on THEN
5881           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5882       END IF;
5883       --
5884       FND_MESSAGE.SET_TOKEN('CONT_NAME',
5885           nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5886       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5887       --
5888       IF l_debug_on THEN
5889           WSH_DEBUG_SV.pop(l_module_name);
5890       END IF;
5891       --
5892       return;
5893       END IF;
5894     END IF;
5895     IF l_group_by_flags.ship_method = 'Y' THEN
5896       IF (NVL(l_del_id_for_container1.mode_of_transport, l_del_id_for_container2.mode_of_transport) <>
5897        NVL(l_del_id_for_container2.mode_of_transport, l_del_id_for_container1.mode_of_transport))
5898       OR (NVL(l_del_id_for_container1.service_level, l_del_id_for_container2.service_level) <>
5899        NVL(l_del_id_for_container2.service_level, l_del_id_for_container1.service_level))
5900       OR (NVL(l_del_id_for_container1.carrier_id, l_del_id_for_container2.carrier_id) <>
5901        NVL(l_del_id_for_container2.carrier_id, l_del_id_for_container1.carrier_id))
5902       THEN
5903       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NOT_MATCH');
5904       --
5905       IF l_debug_on THEN
5906           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5907       END IF;
5908       --
5909       FND_MESSAGE.SET_TOKEN('DETAIL_ID',
5910           nvl(wsh_container_utilities.get_cont_name(p_detail_id1), p_detail_id1));
5911       --
5912       IF l_debug_on THEN
5913           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
5914       END IF;
5915       --
5916       FND_MESSAGE.SET_TOKEN('CONT_NAME',
5917           nvl(wsh_container_utilities.get_cont_name(p_detail_id2), p_detail_id2));
5918       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5919       --
5920       IF l_debug_on THEN
5921           WSH_DEBUG_SV.pop(l_module_name);
5922       END IF;
5923       --
5924       return;
5925       END IF;
5926     END IF;
5927 /* End of check for grouping attributes */
5928 
5929 
5930 /* End of Check to see if the line is already packed */
5931 
5932 
5933   -- for bug 1336858 fix
5934 
5935   -- No need for savepoint
5936   -- savepoint before_cont_assignment;
5937 
5938         -- J: W/V Changes
5939         -- The first DD_WV_Post_Process call will decrement the cont1 W/V from delivery
5940         -- The second DD_WV_Post_Process call will increment the delivery W/V with cont2 W/V (since cont2 has to be
5941         -- assigned to the delivery if the cont1 being assigned to cont2 is already assigned to delivery)
5942         -- The third DD_WV_Post_Process cll will increment the cont2 W/V with cont1 W/V which in turn will adjust the
5943         -- delivery W/V, if the cont2 is in a delivery.
5944         IF (l_del_id_for_container1.delivery_id is not null) THEN
5945           IF l_debug_on THEN
5946             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
5947           END IF;
5948 
5949           WSH_WV_UTILS.DD_WV_Post_Process(
5950             p_delivery_detail_id => p_detail_id1,
5951             p_diff_gross_wt      => -1 * l_del_id_for_container1.gross_weight,
5952             p_diff_net_wt        => -1 * l_del_id_for_container1.net_weight,
5953             p_diff_volume        => -1 * l_del_id_for_container1.volume,
5954             p_diff_fill_volume   => -1 * l_del_id_for_container1.volume,
5955             x_return_status      => l_return_status);
5956 
5957           IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
5958                --
5959                x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5960                WSH_UTIL_CORE.Add_Message(x_return_status);
5961                IF l_debug_on THEN
5962                    WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
5963                    WSH_DEBUG_SV.pop(l_module_name);
5964                END IF;
5965                return;
5966           END IF;
5967 
5968         END IF;
5969 
5970   IF (l_del_id_for_container1.delivery_id IS not NULL) THEN
5971 
5972           IF (l_del_id_for_container2.delivery_id IS NULL) THEN
5973 	/* Bug 1571143,Combining the 2 cursors */
5974     -- K LPN CONV. rv
5975     -- Based on assumption that we are using wsh_delivery_assignments_v,
5976     -- delivery and its contents will belong to same organization.
5977     -- Similarly, container and its contents will belong to same organization.
5978     -- Hence, we are checking for WMS org or non-WMS org. at the
5979     -- parent level (i.e. delivery/container)
5980     -- rather than at line-level for performance reasons.
5981 
5982     -- If this assumptions were to be violated in anyway
5983     --    i.e Query was changed to refer to base table wsh_delivery_assignments instead of
5984     --     wsh_delivery_assignments_v
5985     -- or
5986     -- if existing query were to somehow return/fetch records where
5987     --    delivery and its contents may belong to diff. org.
5988     --    container and its contents may belong to diff. org.
5989     --    then
5990     --       Calls to check_wms_org needs to be re-adjusted at
5991     OPEN c_inside_outside_of_container(p_detail_id2);
5992     FETCH c_inside_outside_of_container BULK COLLECT INTO
5993           l_sync_tmp_recTbl.delivery_detail_id_tbl,
5994           l_sync_tmp_recTbl.parent_detail_id_tbl,
5995           l_sync_tmp_recTbl.delivery_id_Tbl;
5996     CLOSE c_inside_outside_of_container;
5997     IF (l_sync_tmp_recTbl.delivery_detail_id_tbl.count > 0 ) THEN
5998     --{
5999         --
6000         l_sync_tmp_recTbl.operation_type_tbl(1) := 'PRIOR';
6001         l_operation_type := 'PRIOR';
6002         --
6003         --
6004         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
6005         AND nvl(l_del_id_for_container2.line_direction,'O') IN ('O', 'IO')
6006         AND
6007         (
6008           (WSH_WMS_LPN_GRP.GK_WMS_ASSIGN_DLVY and l_wms_org = 'Y')
6009           OR
6010           (WSH_WMS_LPN_GRP.GK_INV_ASSIGN_DLVY and l_wms_org = 'N')
6011         )
6012         THEN
6013         --{
6014             --
6015             IF l_debug_on THEN
6016                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
6017             END IF;
6018             --
6019             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
6020             (
6021               p_sync_tmp_recTbl   => l_sync_tmp_recTbl,
6022               x_return_status     => l_return_status,
6023               p_operation_type    => l_operation_type
6024             );
6025             --
6026             IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
6027             --
6028               x_return_status := l_return_status;
6029             --
6030               IF l_debug_on THEN
6031                 WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
6032                 WSH_DEBUG_SV.pop(l_module_name);
6033               END IF;
6034             --
6035               return;
6036             --
6037             ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
6038             --
6039               l_num_warnings := l_num_warnings + 1;
6040             --
6041             END IF;
6042             --
6043         --}
6044         END IF;
6045         --
6046 
6047         FORALL i in l_sync_tmp_recTbl.delivery_detail_id_tbl.first..l_sync_tmp_recTbl.delivery_detail_id_tbl.last
6048         UPDATE wsh_delivery_assignments_v
6049         SET delivery_id = l_del_id_for_container1.delivery_id,
6050             last_update_date = SYSDATE,
6051             last_updated_by =  FND_GLOBAL.USER_ID,
6052             last_update_login =  FND_GLOBAL.LOGIN_ID
6053         WHERE delivery_detail_id = l_sync_tmp_recTbl.delivery_detail_id_tbl(i);
6054 
6055         -- OTM R12 : assign delivery detail
6056         IF (l_assign_update AND
6057             l_gc3_is_installed = 'Y' AND
6058             nvl(l_del_id_for_container1.ignore_for_planning, 'N') = 'N') THEN
6059 
6060           l_tms_interface_flag := NULL;
6061 
6062           Post_Otm_Assign_Del_Detail
6063             (p_delivery_id         => l_del_id_for_container1.delivery_id,
6064              p_delivery_was_empty  => l_delivery_was_empty,
6065              p_tms_interface_flag  => l_tms_interface_flag,
6066              p_gross_weight        => l_gross_weight2, --using the gross weight of container2
6067              x_return_status       => l_return_status);
6068 
6069           IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
6070             IF l_debug_on THEN
6071               WSH_DEBUG_SV.log(l_module_name,'error from Post_Otm_Assign_Del_Detail');
6072             END IF;
6073             raise FND_API.G_EXC_ERROR;
6074           ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
6075             l_num_warnings := l_num_warnings + 1;
6076           END IF;
6077 
6078         END IF;
6079         -- End of OTM R12 : assign delivery detail
6080 
6081         FOR i in l_sync_tmp_recTbl.delivery_detail_id_tbl.first..l_sync_tmp_recTbl.delivery_detail_id_tbl.last LOOP
6082             l_mdc_detail_tab(i) := l_sync_tmp_recTbl.delivery_detail_id_tbl(i);
6083         END LOOP;
6084         WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
6085                        p_detail_id_tab     => l_mdc_detail_tab,
6086                        x_return_status     => x_return_status);
6087 
6088         IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
6089             IF l_debug_on THEN
6090                WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
6091                WSH_DEBUG_SV.pop(l_module_name);
6092             END IF;
6093             return;
6094         END IF;
6095         l_mdc_detail_tab.delete;
6096         l_sync_tmp_recTbl.delivery_detail_id_tbl.delete;
6097         l_sync_tmp_recTbl.parent_detail_id_tbl.delete;
6098         l_sync_tmp_recTbl.delivery_id_tbl.delete;
6099         l_sync_tmp_recTbl.operation_type_tbl.delete;
6100     --}
6101     END IF;
6102     -- K LPN CONV. rv
6103 
6104                 -- J: W/V Changes
6105                 IF l_debug_on THEN
6106                   WSH_DEBUG_SV.logmsg(l_module_name,'Assigning Container to Delivery');
6107                   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
6108                 END IF;
6109 
6110                 WSH_WV_UTILS.DD_WV_Post_Process(
6111                   p_delivery_detail_id => p_detail_id2,
6112                   p_diff_gross_wt      => l_del_id_for_container2.gross_weight,
6113                   p_diff_net_wt        => l_del_id_for_container2.net_weight,
6114                   p_diff_volume        => l_del_id_for_container2.volume,
6115                   p_diff_fill_volume   => l_del_id_for_container2.volume,
6116                   x_return_status      => l_return_status);
6117 
6118                 IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
6119                      --
6120                      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6121                      WSH_UTIL_CORE.Add_Message(x_return_status);
6122                      IF l_debug_on THEN
6123                          WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
6124                          WSH_DEBUG_SV.pop(l_module_name);
6125                      END IF;
6126                      return;
6127                 END IF;
6128 
6129     /* H projects: pricing integration csun , adding delivery */
6130     m := m+1;
6131     l_del_tab(m) := l_del_id_for_container1.delivery_id;
6132           END IF;
6133 
6134   ELSIF (l_del_id_FOR_container2.delivery_id IS NOT NULL) THEN
6135 
6136         /* Bug 1571143 ,Combining the 2 cursors */
6137     -- K LPN CONV. rv
6138     -- Based on assumption that we are using wsh_delivery_assignments_v,
6139     -- delivery and its contents will belong to same organization.
6140     -- Similarly, container and its contents will belong to same organization.
6141     -- Hence, we are checking for WMS org or non-WMS org. at the
6142     -- parent level (i.e. delivery/container)
6143     -- rather than at line-level for performance reasons.
6144 
6145     -- If this assumptions were to be violated in anyway
6146     --    i.e Query was changed to refer to base table wsh_delivery_assignments instead of
6147     --     wsh_delivery_assignments_v
6148     -- or
6149     -- if existing query were to somehow return/fetch records where
6150     --    delivery and its contents may belong to diff. org.
6151     --    container and its contents may belong to diff. org.
6152     --    then
6153     --       Calls to check_wms_org needs to be re-adjusted at
6154     OPEN c_inside_outside_of_container(p_detail_id1);
6155     FETCH c_inside_outside_of_container bulk collect into
6156           l_sync_tmp_recTbl.delivery_detail_id_tbl,
6157           l_sync_tmp_recTbl.parent_detail_id_tbl,
6158           l_sync_tmp_recTbl.delivery_id_tbl;
6159 
6160     CLOSE c_inside_outside_of_container;
6161     IF (l_sync_tmp_recTbl.delivery_detail_id_tbl.count > 0 ) THEN
6162     --{
6163         --
6164         l_sync_tmp_recTbl.operation_type_tbl(1) := 'PRIOR';
6165         l_operation_type := 'PRIOR';
6166         --
6167         --
6168         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
6169         AND nvl(l_del_id_FOR_container2.line_direction,'O') IN ('O', 'IO')
6170         AND
6171         (
6172           (WSH_WMS_LPN_GRP.GK_WMS_ASSIGN_DLVY and l_wms_org = 'Y')
6173           OR
6174           (WSH_WMS_LPN_GRP.GK_INV_ASSIGN_DLVY and l_wms_org = 'N')
6175         )
6176         THEN
6177         --{
6178             --
6179             IF l_debug_on THEN
6180                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
6181             END IF;
6182             --
6183             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
6184             (
6185               p_sync_tmp_recTbl   => l_sync_tmp_recTbl,
6186               x_return_status     => l_return_status,
6187               p_operation_type    => l_operation_type
6188             );
6189             --
6190             IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
6191             --
6192               x_return_status := l_return_status;
6193             --
6194               IF l_debug_on THEN
6195                 WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
6196                 WSH_DEBUG_SV.pop(l_module_name);
6197               END IF;
6198             --
6199               return;
6200             --
6201             ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
6202             --
6203               l_num_warnings := l_num_warnings + 1;
6204             --
6205             END IF;
6206             --
6207         --}
6208         END IF;
6209         --
6210 
6211         FORALL i in l_sync_tmp_recTbl.delivery_detail_id_tbl.first..l_sync_tmp_recTbl.delivery_detail_id_tbl.last
6212         UPDATE wsh_delivery_assignments_v
6213         SET delivery_id = l_del_id_for_container2.delivery_id,
6214             last_update_date = SYSDATE,
6215             last_updated_by =  FND_GLOBAL.USER_ID,
6216             last_update_login =  FND_GLOBAL.LOGIN_ID
6217         WHERE delivery_detail_id = l_sync_tmp_recTbl.delivery_detail_id_tbl(i);
6218 
6219         -- OTM R12 : assign delivery detail
6220         IF (l_assign_update AND
6221             l_gc3_is_installed = 'Y' AND
6222             nvl(l_del_id_for_container2.ignore_for_planning, 'N') = 'N') THEN
6223 
6224           l_tms_interface_flag := NULL;
6225 
6226           Post_Otm_Assign_Del_Detail
6227             (p_delivery_id         => l_del_id_for_container2.delivery_id,
6228              p_delivery_was_empty  => l_delivery_was_empty,
6229              p_tms_interface_flag  => l_tms_interface_flag,
6230              p_gross_weight        => l_gross_weight1,  --using the gross weight of container1
6231              x_return_status       => l_return_status);
6232 
6233           IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
6234             IF l_debug_on THEN
6235               WSH_DEBUG_SV.log(l_module_name,'error from Post_Otm_Assign_Del_Detail');
6236             END IF;
6237             raise FND_API.G_EXC_ERROR;
6238           ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
6239             l_num_warnings := l_num_warnings + 1;
6240           END IF;
6241         END IF;
6242         -- End of OTM R12 : assign delivery detail
6243 
6244 
6245         FOR i in l_sync_tmp_recTbl.delivery_detail_id_tbl.first..l_sync_tmp_recTbl.delivery_detail_id_tbl.last LOOP
6246             l_mdc_detail_tab(i) := l_sync_tmp_recTbl.delivery_detail_id_tbl(i);
6247         END LOOP;
6248         WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
6249                    p_detail_id_tab     => l_mdc_detail_tab,
6250                    x_return_status     => x_return_status);
6251         IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
6252           IF l_debug_on THEN
6253             WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
6254             WSH_DEBUG_SV.pop(l_module_name);
6255           END IF;
6256           return;
6257         END IF;
6258         l_mdc_detail_tab.delete;
6259         l_sync_tmp_recTbl.delivery_detail_id_tbl.delete;
6260         l_sync_tmp_recTbl.parent_detail_id_tbl.delete;
6261         l_sync_tmp_recTbl.delivery_id_tbl.delete;
6262         l_sync_tmp_recTbl.operation_type_tbl.delete;
6263     --}
6264     END IF;
6265     -- K LPN CONV. rv
6266     /* H projects: pricing integration csun , adding delivery */
6267     m := m+1;
6268     l_del_tab(m) := l_del_id_FOR_container2.delivery_id;
6269   END IF;
6270 
6271 
6272   --
6273   -- K LPN CONV. rv
6274   IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
6275   AND nvl(l_del_id_FOR_container2.line_direction,'O') IN ('O', 'IO')
6276   AND
6277   (
6278    (WSH_WMS_LPN_GRP.GK_WMS_PACK and l_wms_org = 'Y')
6279    OR
6280    (WSH_WMS_LPN_GRP.GK_INV_PACK and l_wms_org = 'N')
6281   )
6282   THEN
6283   --{
6284 
6285       l_sync_tmp_rec.delivery_detail_id := p_detail_id1;
6286       l_sync_tmp_rec.parent_delivery_detail_id := l_del_id_FOR_container1.parent_delivery_detail_id;
6287       l_sync_tmp_rec.delivery_id := l_del_id_FOR_container1.delivery_id;
6288       l_sync_tmp_rec.operation_type := 'PRIOR';
6289       --
6290       IF l_debug_on THEN
6291           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
6292       END IF;
6293       --
6294       WSH_WMS_SYNC_TMP_PKG.MERGE
6295       (
6296         p_sync_tmp_rec      => l_sync_tmp_rec,
6297         x_return_status     => l_return_status
6298       );
6299       --
6300       IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
6301         --
6302         x_return_status := l_return_status;
6303         --
6304         IF l_debug_on THEN
6305           WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
6306           WSH_DEBUG_SV.pop(l_module_name);
6307         END IF;
6308         --
6309         return;
6310         --
6311       ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
6312         --
6313         l_num_warnings := l_num_warnings + 1;
6314         --
6315       END IF;
6316       --
6317 
6318   --}
6319   END IF;
6320   -- K LPN CONV. rv
6321   --
6322   UPDATE wsh_delivery_assignments_v
6323   SET parent_delivery_detail_id = p_detail_id2,
6324     last_update_date = SYSDATE,
6325     last_updated_by =  FND_GLOBAL.USER_ID,
6326     last_update_login =  FND_GLOBAL.LOGIN_ID
6327   WHERE delivery_detail_id = p_detail_id1;
6328   l_mdc_detail_tab(1) := p_detail_id1;
6329   WSH_DELIVERY_DETAILS_ACTIONS.Delete_Consol_Record(
6330                    p_detail_id_tab     => l_mdc_detail_tab,
6331                    x_return_status     => x_return_status);
6332 
6333   IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
6334     IF l_debug_on THEN
6335       WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
6336       WSH_DEBUG_SV.pop(l_module_name);
6337     END IF;
6338     return;
6339   END IF;
6340 
6341         -- K LPN CONV. rv
6342         IF NOT( l_wms_org = 'Y' AND nvl(wsh_wms_lpn_grp.g_caller,'WSH') like 'WMS%')
6343         THEN
6344         --{
6345             -- J: W/V Changes
6346             IF l_debug_on THEN
6347               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
6348             END IF;
6349             WSH_WV_UTILS.DD_WV_Post_Process(
6350               p_delivery_detail_id => p_detail_id1,
6351               p_diff_gross_wt      => l_del_id_for_container1.gross_weight,
6352               p_diff_net_wt        => l_del_id_for_container1.net_weight,
6353               p_diff_volume        => l_del_id_for_container1.volume,
6354               p_diff_fill_volume   => l_del_id_for_container1.volume,
6355               x_return_status      => l_return_status);
6356 
6357             IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
6358                  --
6359                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6360                  WSH_UTIL_CORE.Add_Message(x_return_status);
6361                  IF l_debug_on THEN
6362                      WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
6363                      WSH_DEBUG_SV.pop(l_module_name);
6364                  END IF;
6365                  return;
6366             END IF;
6367         --}
6368         END IF;
6369         -- K LPN CONV. rv
6370 
6371 
6372 /*
6373   -- bug 1336858 fix: don't allow the user to pack a container in itself
6374   -- or create a loop of containers packed inside each other.
6375   -- We need to check if this assignment now creates a loop
6376   declare
6377     i NUMBER := 0;
6378   begin
6379 
6380     select container_name into detail_cont_name
6381     from wsh_delivery_details where delivery_detail_id = p_detail_id1;
6382     if SQL%NOTFOUND then
6383     detail_cont_name := '(' || p_detail_id1 || ')';
6384     end if;
6385 
6386           IF l_debug_on THEN
6387              WSH_DEBUG_SV.log(l_module_name,'detail_cont_name',
6388                                                        detail_cont_name);
6389           END IF;
6390 
6391     select container_name into parent_cont_name
6392     from wsh_delivery_details where delivery_detail_id = p_detail_id2;
6393     if SQL%NOTFOUND then
6394     detail_cont_name := '(' || p_detail_id2 || ')';
6395     end if;
6396           IF l_debug_on THEN
6397              WSH_DEBUG_SV.log(l_module_name,'parent_cont_name',
6398                                                        parent_cont_name);
6399           END IF;
6400 
6401     for c IN check_loop(p_detail_id1) loop
6402     i := i + 1; -- do nothing...
6403     end loop;
6404 
6405     exception
6406     WHEN others THEN
6407     rollback to before_cont_assignment;
6408     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6409     fnd_message.SET_name('WSH', 'WSH_CONT_LOOP_NO_PACK');
6410     fnd_message.set_token('DETAIL_CONTAINER', detail_cont_name);
6411     fnd_message.set_token('PARENT_CONTAINER', parent_cont_name);
6412     wsh_util_core.add_message(x_return_status,l_module_name);
6413     --
6414     IF l_debug_on THEN
6415         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected Error has occured. Oracle Err Mesg is'||SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
6416         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION1 : OTHERS');
6417     END IF;
6418     --
6419     return;
6420   end;
6421   -- end of check for assignment loop
6422 */
6423 
6424   IF l_del_tab.count > 0 THEN
6425     /*  H integration: Pricing integration csun
6426       when plan a delivery
6427     */
6428     --
6429     IF l_debug_on THEN
6430         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
6431                     WSH_DEBUG_SV.log(l_module_name,'Count of l_del_tab',l_del_tab.count);
6432     END IF;
6433     --
6434     WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
6435        p_entity_type => 'DELIVERY',
6436        p_entity_ids   => l_del_tab,
6437        x_return_status => l_return_status);
6438     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
6439        raise mark_reprice_error;
6440     END IF;
6441   END IF;
6442 
6443   -- LPN CONV. rv
6444   IF (l_num_warnings > 0 AND x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
6445     --
6446     x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
6447     --
6448   ELSE
6449     --
6450     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
6451     --
6452   END IF;
6453   -- LPN CONV. rv
6454 
6455 
6456 --
6457 IF l_debug_on THEN
6458     WSH_DEBUG_SV.pop(l_module_name);
6459 END IF;
6460 --
6461   exception
6462 
6463     -- OTM R12 : assign delivery detail
6464     WHEN FND_API.G_EXC_ERROR then
6465       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6466       --
6467       IF l_debug_on THEN
6468           WSH_DEBUG_SV.pop(l_module_name);
6469       END IF;
6470       --
6471       RETURN;
6472     -- End of OTM R12 : assign delivery detail
6473 
6474     WHEN  mark_reprice_error THEN
6475       FND_MESSAGE.Set_Name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
6476       x_return_status := l_return_status;
6477       WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
6478       --
6479       IF l_debug_on THEN
6480           WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
6481           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
6482       END IF;
6483       --
6484     WHEN others THEN
6485       if c_del_id_for_cont_or_detail%ISOPEN THEN
6486         close c_del_id_for_cont_or_detail;
6487       end if;
6488       if c_del_id_for_cont_or_detail%ISOPEN THEN
6489         close c_del_id_for_cont_or_detail;
6490       end if;
6491       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
6492       wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',l_module_name);
6493       --
6494       IF l_debug_on THEN
6495           WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
6496           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
6497       END IF;
6498       --
6499 END Assign_Cont_To_Cont;
6500 
6501 -- THIS API IS OBSOLETED.
6502 --
6503 --Procedure:      Unassign_Cont_From_Cont
6504 --Parameters:      p_detail_id,
6505 --            x_return_status
6506 --Desription:     Unassign a container FROM another container
6507 --             the assumption here IS that you are take the container
6508 --              out of the immediate parent container ;
6509 --              only need to null out the parent_detail_id.
6510 --              if containers are assigned to any delivery, the assignment
6511 --              will remain
6512 
6513 PROCEDURE Unassign_Cont_FROM_Cont(
6514   p_detail_id   IN NUMBER,
6515   x_return_status  OUT NOCOPY  VARCHAR2)
6516 IS
6517 
6518 l_del_rec               C_DEL_ID_FOR_CONT_OR_DETAIL%ROWTYPE;
6519 l_return_status         VARCHAR2(1);
6520 -- J: W/V Changes
6521 l_param_info   WSH_SHIPPING_PARAMS_PVT.Parameter_Rec_Typ;
6522 l_cont_fill_pc NUMBER;
6523 e_abort        exception;
6524 
6525 --
6526 l_debug_on BOOLEAN;
6527 --
6528 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_CONT_FROM_CONT';
6529 --
6530 BEGIN
6531 
6532   --
6533   --
6534   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6535   --
6536   --
6537 END Unassign_Cont_from_Cont;
6538 
6539 
6540 
6541 
6542 --
6543 --Procedure:      Unassign_detail_from_Delivery
6544 --Parameters:      p_detail_id,
6545 --            x_return_status
6546 --Desription:     Unassigns a detail from a delivery
6547 
6548 PROCEDURE Unassign_Detail_from_Delivery(
6549   p_detail_id        IN NUMBER
6550 , x_return_status     OUT NOCOPY  VARCHAR2
6551 , p_validate_flag    IN VARCHAR2,
6552  p_action_prms  IN WSH_GLBL_VAR_STRCT_GRP.dd_action_parameters_rec_type   -- J-IB-NPARIKH
6553 )
6554 
6555 IS
6556 detail_not_assigned exception;
6557 check_ship_SET_failed exception;
6558 check_smc_failed exception;
6559 del_not_updatable exception;
6560 l_cost_count number;
6561 l_return_status varchar2(30);
6562 l_shp_SET BOOLEAN;
6563 l_smc BOOLEAN;
6564 l_packed number;
6565 l_dummy_record number;
6566 --added for Bug 2209035
6567 CURSOR c_delivery1(p_del_id number)
6568 IS
6569 SELECT status_code, planned_flag,name,
6570         nvl(shipment_direction,'O') shipment_direction,   -- J-IB-NPARIKH
6571         ignore_for_planning -- OTM R12 : unassign delivery detail
6572 FROM wsh_new_deliveries
6573 WHERE delivery_id = p_del_id;
6574 
6575 l_del1 c_delivery1%ROWTYPE;
6576 
6577 l_shipping_param_info   WSH_SHIPPING_PARAMS_PVT.Parameter_Rec_Typ;
6578 get_shipping_param_err  EXCEPTION;
6579 adjust_parent_wv_err    EXCEPTION;
6580 
6581 CURSOR c_assign_rec
6582 IS
6583 SELECT wda.delivery_id, wda.parent_delivery_detail_id,
6584        wdd.organization_id,
6585        wdd.weight_uom_code,
6586        wdd.volume_uom_code,
6587        wdd.inventory_item_id
6588 FROM   wsh_delivery_assignments_v wda,
6589        wsh_delivery_details  wdd
6590 WHERE  wda.delivery_detail_id = p_detail_id
6591 and    wdd.delivery_detail_id = wda.delivery_detail_id
6592 and   ((wda.delivery_id IS not null) or (wda.parent_delivery_detail_id IS not null));
6593 
6594 l_assign c_assign_rec%ROWTYPE;
6595 l_mdc_detail_tab wsh_util_core.id_tab_type;
6596 /** We just need a Warning when ever we Unassign a Detail from a Delivery and
6597   if that Detail is part of a Ship Set */
6598 l_delivery_detail_id NUMBER;
6599 invalid_detail exception;
6600 -- Update Cartonization if released warehouse and WMS org.
6601 
6602 update_mol_carton_group_error exception;
6603 
6604 cursor get_mo_line_id (p_del_det_id IN NUMBER) is
6605 select move_order_line_id, organization_id
6606 from wsh_delivery_details
6607 where delivery_detail_id = p_del_det_id
6608 and released_status = 'S';
6609 
6610 cursor c_grouping_id is
6611 select wsh_delivery_group_s.nextval from dual;
6612 
6613 l_msg_count      NUMBER;
6614 l_msg_data       VARCHAR2(4000);
6615 l_det_org NUMBER;
6616 l_mo_line_id NUMBER;
6617 l_carton_grouping_id NUMBER;
6618 
6619 CURSOR c_all_details_below IS
6620 SELECT  delivery_detail_id,
6621         parent_delivery_detail_id, -- LPN CONV. rv
6622         delivery_id  -- LPN CONV. rv
6623 FROM  wsh_delivery_assignments_v
6624 START WITH  delivery_detail_id = p_detail_id
6625 CONNECT BY  prior delivery_detail_id = parent_delivery_detail_id;
6626 
6627 -- J: W/V Changes
6628 l_detail_status         VARCHAR2(1);
6629 l_gross_wt              NUMBER;
6630 l_net_wt                NUMBER;
6631 l_vol                   NUMBER;
6632 l_container_flag        VARCHAR2(1);
6633 l_delivery_id           NUMBER;
6634 
6635 l_dd_id     WSH_UTIL_CORE.Id_Tab_Type;
6636 l_del_id_tbl           WSH_UTIL_CORE.Id_Tab_Type; -- LPN CONV. rv
6637 l_parent_dd_id_tbl     WSH_UTIL_CORE.Id_Tab_Type; -- LPN CONV. rv
6638 l_line_dir_tbl         WSH_GLBL_VAR_STRCT_GRP.v3_Tbl_Type; -- LPN CONV. rv
6639 l_cnt_flag_tbl         WSH_GLBL_VAR_STRCT_GRP.v3_Tbl_Type; -- LPN CONV. rv
6640 l_det_org_id_tbl       WSH_UTIL_CORE.Id_Tab_Type; -- LPN CONV. rv
6641 i        BINARY_INTEGER := 0;
6642 j        BINARY_INTEGER :=0;
6643 
6644 l_dummy_del_det_id NUMBER;
6645 l_del_det_id NUMBER;
6646 
6647 l_del_tab      WSH_UTIL_CORE.Id_Tab_Type;
6648 l_status                WSH_LOOKUPS.meaning%TYPE;
6649 
6650 CURSOR get_lookup (l_code VARCHAR2) IS
6651   SELECT meaning
6652   FROM wsh_lookups
6653   WHERE lookup_type = 'DELIVERY_STATUS'
6654   AND lookup_code = l_code;
6655 
6656 
6657 mark_reprice_error         EXCEPTION;
6658 remove_FC_error            EXCEPTION;
6659 l_detail_is_empty_cont VARCHAR2(1);
6660 
6661 l_ib_upd_flag              VARCHAR2(1);
6662 l_rel_status              VARCHAR2(32767);
6663 
6664 l_null_delivery_id        NUMBER; -- Bugfix 3768823
6665 
6666 l_detail_tab              WSH_UTIL_CORE.id_tab_type;  -- DBI Project
6667 l_dbi_rs                  VARCHAR2(1); -- Return Status from DBI API
6668 
6669 -- K LPN CONV. rv
6670 l_wms_org    VARCHAR2(10) := 'N';
6671 l_loop_wms_org    VARCHAR2(10) := 'N';
6672 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
6673 l_line_dir VARCHAR2(10);
6674 l_num_warnings NUMBER := 0;
6675 
6676 cursor l_parent_cnt_csr (p_cnt_inst_id IN NUMBER) is
6677 select organization_id,
6678        nvl(line_direction,'O')
6679 from wsh_delivery_details
6680 where delivery_detail_id = p_cnt_inst_id
6681 and container_flag = 'Y'
6682 and source_code = 'WSH';
6683 
6684 l_parent_cnt_orgn_id NUMBER;
6685 l_parent_cnt_line_dir VARCHAR2(10);
6686 -- K LPN CONV. rv
6687 --
6688 
6689 -- OTM R12 : unassign delivery detail
6690 l_interface_flag_tab  WSH_UTIL_CORE.COLUMN_TAB_TYPE;
6691 l_delivery_id_tab     WSH_UTIL_CORE.ID_TAB_TYPE;
6692 l_is_delivery_empty   VARCHAR2(1);
6693 l_gc3_is_installed    VARCHAR2(1);
6694 l_call_update         VARCHAR2(1);
6695 l_gross_weight        WSH_DELIVERY_DETAILS.GROSS_WEIGHT%TYPE;
6696 l_gross_weight_tbl    WSH_UTIL_CORE.ID_TAB_TYPE;
6697 -- End of OTM R12 : unassign delivery detail
6698 
6699 l_debug_on BOOLEAN;
6700 --
6701 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_DETAIL_FROM_DELIVERY';
6702 --
6703 BEGIN
6704 
6705 /*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*/
6706 
6707   --
6708   --
6709   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
6710   --
6711   IF l_debug_on IS NULL
6712   THEN
6713       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
6714   END IF;
6715   --
6716   IF l_debug_on THEN
6717       WSH_DEBUG_SV.push(l_module_name);
6718       --
6719       WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
6720       WSH_DEBUG_SV.log(l_module_name,'P_VALIDATE_FLAG',P_VALIDATE_FLAG);
6721         WSH_DEBUG_SV.log(l_module_name,'p_action_prms.caller',p_action_prms.caller);
6722   END IF;
6723   --
6724   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
6725   -- OTM R12
6726   l_gc3_is_installed := WSH_UTIL_CORE.G_GC3_IS_INSTALLED;
6727 
6728   IF (l_gc3_is_installed IS NULL) THEN
6729     l_gc3_is_installed := WSH_UTIL_CORE.GC3_IS_INSTALLED;
6730   END IF;
6731   -- End of OTM R12
6732 
6733   SAVEPOINT before_unassign;
6734 
6735   OPEN c_assign_rec;
6736   FETCH c_assign_rec into l_assign;
6737   IF ((c_assign_rec%NOTFOUND) OR (l_assign.delivery_id IS null)) THEN
6738     CLOSE c_assign_rec;
6739     RAISE DETAIL_NOT_ASSIGNED ;
6740 
6741   END IF;
6742   CLOSE c_assign_rec;
6743 
6744 
6745 
6746   OPEN c_delivery1(l_assign.delivery_id);
6747   FETCH c_delivery1 into l_del1;
6748   CLOSE c_delivery1;
6749 
6750     open g_get_detail_info(p_detail_id);
6751     fetch g_get_detail_info into l_detail_status,l_gross_wt, l_net_wt, l_vol, l_container_flag, l_delivery_id;
6752     close  g_get_detail_info;
6753 
6754 				--
6755 				-- Unassign lines is allowed during ASN/Receipt integration
6756 				-- even though lines are shipped, so bypassing checks for those callers.
6757 				--
6758     IF l_detail_status = 'C'
6759         AND NVL(p_action_prms.caller,'!!!!') NOT LIKE '%' || WSH_UTIL_CORE.C_SPLIT_DLVY_SUFFIX   -- J-IB-NPARIKH
6760         AND NVL(p_action_prms.caller,'!!!!') NOT LIKE WSH_UTIL_CORE.C_IB_ASN_PREFIX || '%'   -- J-IB-NPARIKH
6761         AND NVL(p_action_prms.caller,'!!!!') NOT LIKE WSH_UTIL_CORE.C_IB_RECEIPT_PREFIX || '%'   -- J-IB-NPARIKH
6762         THEN
6763      Raise invalid_detail;
6764     END IF;
6765 
6766 
6767         IF l_debug_on THEN
6768             WSH_DEBUG_SV.log(l_module_name,'l_detail_status',
6769                                       l_detail_status);
6770             WSH_DEBUG_SV.log(l_module_name,'l_del1.status_code',
6771                                       l_del1.status_code);
6772             WSH_DEBUG_SV.log(l_module_name,'l_del1.planned_flag',
6773                                       l_del1.planned_flag);
6774             WSH_DEBUG_SV.log(l_module_name,'l_del1.name',
6775                                       l_del1.name);
6776             WSH_DEBUG_SV.log(l_module_name,'l_del1.ignore_for_planning',
6777                                       l_del1.ignore_for_planning);
6778             WSH_DEBUG_SV.log(l_module_name,'l_assign.delivery_id',
6779                                                     l_assign.delivery_id);
6780             WSH_DEBUG_SV.log(l_module_name,'_assign.parent_delivery_detail_id',
6781                                             l_assign.parent_delivery_detail_id);
6782 
6783          END IF;
6784 
6785   /* security rule: delivery status has to be open and not planned */
6786   /* Error */
6787 				--
6788 				-- Unassign lines is allowed during ASN/Receipt integration
6789 				-- even though deliveries are shipped/planned, so bypassing checks
6790 				-- for those callers.
6791 				--
6792   IF (NVL(p_validate_flag, 'Y') = 'Y') THEN
6793     IF ((l_del1.status_code = 'CL') or
6794     (l_del1.status_code = 'IT') or
6795     (l_del1.status_code = 'CO') or
6796     (l_del1.status_code = 'SC') or  --sperera 940/945
6797     (l_del1.status_code = 'SR') or
6798     (l_del1.planned_flag IN ('Y','F') AND l_detail_status <> 'D')) /*Bug7025876 added AND condition*/
6799     --Bug 3543772   AND NVL(p_action_prms.caller,'!!!!') NOT LIKE '%' || WSH_UTIL_CORE.C_SPLIT_DLVY_SUFFIX   -- J-IB-NPARIKH
6800                 AND NVL(p_action_prms.caller,'!!!!') NOT LIKE WSH_UTIL_CORE.C_IB_ASN_PREFIX || '%'   -- J-IB-NPARIKH
6801                 AND NVL(p_action_prms.caller,'!!!!') NOT LIKE WSH_UTIL_CORE.C_IB_RECEIPT_PREFIX || '%'   -- J-IB-NPARIKH
6802                 THEN
6803                           IF l_del1.planned_flag IN ('Y','F') THEN
6804                             fnd_message.SET_name('WSH', 'WSH_DET_UNASSIGN_FIRMDEL');
6805                             FND_MESSAGE.SET_TOKEN('DEL_NAME',l_del1.name);
6806                           ELSE
6807                            OPEN get_lookup(l_del1.status_code);
6808                               FETCH get_lookup INTO l_status;
6809                            CLOSE get_lookup;
6810                            fnd_message.SET_name('WSH',
6811                                       'WSH_DET_DEL_NOT_UPDATABLE');
6812                            FND_MESSAGE.SET_TOKEN('STATUS',l_status);
6813                         END IF;
6814       RAISE DEL_NOT_UPDATABLE;
6815     END IF;
6816 
6817   END IF; -- validate flag IS Y
6818 
6819         IF l_container_flag = 'Y' THEN --{ --bug 5100229
6820            IF l_debug_on THEN
6821               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.Is_Empty',WSH_DEBUG_SV.C_PROC_LEVEL);
6822            END IF;
6823            WSH_CONTAINER_UTILITIES.Is_Empty (p_container_instance_id => p_detail_id,
6824                                              x_empty_flag => l_detail_is_empty_cont,
6825                                              x_return_status => l_return_status);
6826            IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
6827               Raise invalid_detail;
6828            END IF;
6829         ELSE --}{
6830            l_detail_is_empty_cont := 'E';
6831         END IF; --}
6832 
6833   /* H projects: pricing integration csun */
6834   l_del_tab.delete;
6835   l_del_tab(1) := l_assign.delivery_id;
6836 
6837   --
6838   IF l_debug_on THEN
6839       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
6840   END IF;
6841   --
6842   WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
6843     p_entity_type => 'DELIVERY',
6844     p_entity_ids   => l_del_tab,
6845     x_return_status => l_return_status);
6846     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS AND
6847        l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
6848        RAISE mark_reprice_error;
6849     ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
6850        IF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS  THEN
6851           x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
6852                       IF l_debug_on THEN
6853                          WSH_DEBUG_SV.log(l_module_name,'Mark_Reprice_Required completed with warnings.');
6854                       END IF;
6855 
6856        END IF;
6857     END IF;
6858 
6859 
6860         -- J: W/V Changes
6861         -- Decrement the parent W/V by DD W/V
6862   IF l_debug_on THEN
6863     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
6864   END IF;
6865         WSH_WV_UTILS.DD_WV_Post_Process(
6866           p_delivery_detail_id => p_detail_id,
6867           p_diff_gross_wt      => -1 * l_gross_wt,
6868           p_diff_net_wt        => -1 * l_net_wt,
6869           p_diff_volume        => -1 * l_vol,
6870           p_diff_fill_volume   => -1 * l_vol,
6871           p_check_for_empty    => 'Y',
6872           x_return_status      => l_return_status);
6873 
6874        IF (l_return_status IN  (WSH_UTIL_CORE.G_RET_STS_ERROR,WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
6875              --
6876              x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6877              WSH_UTIL_CORE.Add_Message(x_return_status);
6878              IF l_debug_on THEN
6879                  WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
6880                  WSH_DEBUG_SV.pop(l_module_name);
6881              END IF;
6882              return;
6883         END IF;
6884 
6885   -- OTM R12 : unassign delivery detail
6886   -- l_gross_weight <> 0 means that any of the unassigned detail has
6887   -- gross_weight <> 0, which will be used later
6888   IF (l_gc3_is_installed = 'Y' AND
6889       NVL(l_del1.ignore_for_planning, 'N') = 'N') THEN
6890     l_gross_weight := 0;
6891   END IF;
6892   -- End of OTM R12 : unassign delivery detail
6893 
6894   --loop thru each lower detail and unassign from del
6895   OPEN c_all_details_below;
6896   --for locking all details
6897   LOOP
6898     -- OTM R12 : unassign delivery detail, legacy issue
6899     --           l_del_id_tbl and l_parent_dd_id_tbl need to be switched
6900     FETCH c_all_details_below into l_dd_id(i), l_parent_dd_id_tbl(i), l_del_id_tbl(i);
6901     EXIT WHEN c_all_details_below%notfound;
6902     SELECT delivery_detail_id, nvl(line_direction, 'O'), container_flag,
6903            organization_id,
6904            gross_weight          -- OTM R12 : unassign delivery detail
6905       INTO l_dummy_del_det_id, l_line_dir_tbl(i), l_cnt_flag_tbl(i),
6906            l_det_org_id_tbl(i),
6907            l_gross_weight_tbl(i) -- OTM R12 : unassign delivery detail
6908     FROM wsh_delivery_details
6909     WHERE delivery_detail_id=l_dd_id(i)
6910     FOR UPDATE NOWAIT;
6911 
6912     -- OTM R12 : unassign delivery detail
6913     IF (l_gc3_is_installed = 'Y' AND
6914         NVL(l_del1.ignore_for_planning, 'N') = 'N' AND
6915         l_gross_weight = 0) THEN
6916       l_gross_weight := l_gross_weight + NVL(l_gross_weight_tbl(i),0);
6917     END IF;
6918     -- End of OTM R12 : unassign delivery detail
6919 
6920     IF l_debug_on THEN
6921       WSH_DEBUG_SV.log(l_module_name,'l_dd_id',l_dd_id(i));
6922       -- OTM R12 : unassign delivery detail
6923       WSH_DEBUG_SV.log(l_module_name,'l_del_id',l_del_id_tbl(i));
6924       WSH_DEBUG_SV.log(l_module_name,'l_gross_weight',l_gross_weight_tbl(i));
6925       -- End of OTM R12 : unassign delivery detail
6926     END IF;
6927     i := i+1;
6928   END LOOP;
6929   CLOSE c_all_details_below;
6930 
6931   l_null_delivery_id := null; --bugfix 3768823
6932   FOR j IN 0..(l_dd_id.COUNT-1) LOOP
6933     --
6934     -- K LPN CONV. rv
6935     --
6936     l_loop_wms_org := wsh_util_validate.check_wms_org(l_det_org_id_tbl(j));
6937     --
6938     IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
6939     AND l_line_dir_tbl(j) IN ('O', 'IO')
6940     AND l_cnt_flag_tbl(j) = 'Y'
6941     AND
6942     (
6943       (WSH_WMS_LPN_GRP.GK_WMS_UNASSIGN_DLVY and l_loop_wms_org = 'Y')
6944       OR
6945       (WSH_WMS_LPN_GRP.GK_INV_UNASSIGN_DLVY and l_loop_wms_org = 'N')
6946     )
6947     THEN
6948     --{
6949         l_sync_tmp_rec.delivery_detail_id := l_dd_id(j);
6950         l_sync_tmp_rec.parent_delivery_detail_id := l_parent_dd_id_tbl(j);
6951         l_sync_tmp_rec.delivery_id := l_del_id_tbl(j);
6952         l_sync_tmp_rec.operation_type := 'PRIOR';
6953         --
6954         IF l_debug_on THEN
6955             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
6956         END IF;
6957         --
6958         WSH_WMS_SYNC_TMP_PKG.MERGE
6959         (
6960           p_sync_tmp_rec      => l_sync_tmp_rec,
6961           x_return_status     => l_return_status
6962         );
6963         --
6964         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
6965           --
6966           x_return_status := l_return_status;
6967           --
6968           IF l_debug_on THEN
6969             WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
6970             WSH_DEBUG_SV.pop(l_module_name);
6971           END IF;
6972           --
6973           return;
6974           --
6975         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
6976           --
6977           l_num_warnings := l_num_warnings + 1;
6978           --
6979         END IF;
6980         --
6981     --}
6982     END IF;
6983     -- K LPN CONV. rv
6984     --
6985     UPDATE wsh_delivery_assignments_v
6986        SET delivery_id = l_null_delivery_id, --bugfix 3768823
6987            last_update_date = SYSDATE,
6988            last_updated_by =  FND_GLOBAL.USER_ID,
6989            last_update_login =  FND_GLOBAL.LOGIN_ID
6990      WHERE delivery_detail_id = l_dd_id(j);
6991 
6992      -- bug 6700792: OTM Dock Door Appt Sched Proj
6993      --Upadating the loading sequence of the delivery detail to NULL while unassigning from delivery
6994      UPDATE wsh_delivery_details
6995      SET    load_seq_number = NULL,
6996             last_update_date = SYSDATE,
6997             last_updated_by =  FND_GLOBAL.USER_ID,
6998             last_update_login =  FND_GLOBAL.LOGIN_ID
6999      WHERE  delivery_detail_id = l_dd_id(j);
7000 
7001     IF (SQL%NOTFOUND) THEN
7002       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7003       RAISE NO_DATA_FOUND;
7004     END IF;
7005 
7006     l_mdc_detail_tab(1) := l_dd_id(j);
7007     WSH_DELIVERY_DETAILS_ACTIONS.Delete_Consol_Record(
7008                        p_detail_id_tab     => l_mdc_detail_tab,
7009                        x_return_status => x_return_status);
7010 
7011     IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7012       IF l_debug_on THEN
7013         WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
7014         WSH_DEBUG_SV.pop(l_module_name);
7015       END IF;
7016       return;
7017     END IF;
7018 
7019            IF l_debug_on THEN
7020               WSH_DEBUG_SV.log(l_module_name,'Updating for detail id',l_dd_id(j));
7021            END IF;
7022 
7023 
7024            -- J-IB-NPARIKH-{
7025            IF l_del1.shipment_Direction NOT IN ('O','IO')
7026            AND NVL(p_action_prms.caller,'!!!!') NOT LIKE '%' || WSH_UTIL_CORE.C_SPLIT_DLVY_SUFFIX
7027            THEN
7028                 l_ib_upd_flag := 'Y';
7029            ELSE
7030                 l_ib_upd_flag := 'N';
7031            END IF;
7032            --
7033            IF l_debug_on THEN
7034               WSH_DEBUG_SV.log(l_module_name,'l_ib_upd_flag',l_ib_upd_flag);
7035            END IF;
7036            --
7037            -- J-IB-NPARIKH-}
7038 
7039 
7040 
7041            IF l_detail_is_empty_cont ='Y' THEN
7042              --
7043              -- K LPN CONV. rv
7044              IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7045              AND l_line_dir_tbl(j) IN ('O', 'IO')
7046              AND
7047              (
7048                (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_loop_wms_org = 'Y')
7049                OR
7050                (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_loop_wms_org = 'N')
7051              )
7052              THEN
7053              --{
7054                  l_sync_tmp_rec.delivery_detail_id := l_dd_id(j);
7055                  l_sync_tmp_rec.operation_type := 'UPDATE';
7056                  --
7057                  IF l_debug_on THEN
7058                      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
7059                  END IF;
7060                  --
7061                  WSH_WMS_SYNC_TMP_PKG.MERGE
7062                  (
7063                    p_sync_tmp_rec      => l_sync_tmp_rec,
7064                    x_return_status     => l_return_status
7065                  );
7066                  --
7067                  IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7068                    --
7069                    x_return_status := l_return_status;
7070                    --
7071                    IF l_debug_on THEN
7072                      WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
7073                      WSH_DEBUG_SV.pop(l_module_name);
7074                    END IF;
7075                    --
7076                    return;
7077                    --
7078                  ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
7079                    --
7080                    l_num_warnings := l_num_warnings + 1;
7081                    --
7082                  END IF;
7083                  --
7084              --}
7085              END IF;
7086              -- K LPN CONV. rv
7087              --
7088              UPDATE wsh_delivery_details
7089              SET customer_id =  NULL,
7090                  ship_to_location_id = NULL,
7091                  intmed_ship_to_location_id = NULL,
7092                  fob_code = NULL,
7093                  freight_terms_code = NULL,
7094                  ship_method_code = NULL,
7095                  mode_of_transport = NULL,
7096                  service_level = NULL,
7097                  carrier_id = NULL,
7098                  deliver_to_location_id = NULL,
7099                  -- tracking_number = NULL, Bug# 3632485
7100                  line_direction = DECODE(line_direction,'IO','O',line_direction),   -- J-IB-NPARIKH
7101                  last_update_date = SYSDATE,
7102                  last_updated_by =  FND_GLOBAL.USER_ID,
7103                  last_update_login =  FND_GLOBAL.LOGIN_ID
7104              WHERE  delivery_detail_id = l_dd_id(j);
7105              IF (SQL%NOTFOUND) THEN
7106                x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7107                RAISE NO_DATA_FOUND;
7108              END IF;
7109              --
7110 
7111            END IF;
7112            IF l_ib_upd_flag ='Y' THEN
7113              UPDATE wsh_delivery_details
7114              SET  ship_from_location_id  = -1,   -- J-IB-NPARIKH
7115                routing_req_id         = NULL,   -- J-IB-NPARIKH
7116                rcv_shipment_line_id   = NULL,   -- J-IB-NPARIKH
7117                shipped_quantity       = NULL,   -- J-IB-NPARIKH
7118                shipped_quantity2      = NULL,   -- J-IB-NPARIKH
7119                picked_quantity        = NULL,   -- J-IB-NPARIKH
7120                picked_quantity2       = NULL,   -- J-IB-NPARIKH
7121                received_quantity      = NULL,   -- J-IB-NPARIKH
7122                received_quantity2     = NULL,   -- J-IB-NPARIKH
7123                returned_quantity      = NULL,   -- J-IB-NPARIKH
7124                returned_quantity2     = NULL,   -- J-IB-NPARIKH
7125                earliest_pickup_date   = NULL,   -- J-IB-NPARIKH
7126                latest_pickup_date     = NULL,   -- J-IB-NPARIKH
7127                released_status        = DECODE(nvl(requested_quantity,0),0,
7128                                                'D',
7129                                                'X'),   -- J-IB-NPARIKH
7130                ignore_for_planning    = 'Y',   -- J-IB-NPARIKH
7131                --wv_frozen_flag    = DECODE(l_ib_upd_flag,'Y','N',wv_frozen_flag),   -- J-IB-NPARIKH
7132                last_update_date = SYSDATE,
7133                last_updated_by =  FND_GLOBAL.USER_ID,
7134                last_update_login =  FND_GLOBAL.LOGIN_ID
7135             WHERE  delivery_detail_id = l_dd_id(j)
7136             returning released_status into l_rel_status;
7137 	    --bugfix 4530813
7138             IF (SQL%NOTFOUND) THEN
7139               x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7140               RAISE NO_DATA_FOUND;
7141             END IF;
7142             IF l_debug_on THEN
7143               WSH_DEBUG_SV.log(l_module_name,'Rel Status after the update is ', l_rel_status);
7144             END IF;
7145 
7146                -- released_status        = DECODE(released_status,'D','D',
7147                --                                 nvl(shipped_quantity,picked_quantity,requested_quantity),0,'D',
7148                --                                 decode(p_action_prms.caller,'WSH_IB_RROQ',0,-1),requested_quantity,'D',
7149                --                                 'X'),   -- J-IB-NPARIKH
7150              -- DBI API needs to be called for update in released_status/requested_qty
7151              -- So cannot call for l_dd_id completely, since selected few of those are
7152              -- getting processed here.So keep the ids in a local table and call DBI API
7153              -- after the loop for l_dd_id table.
7154              l_detail_tab(l_detail_tab.count + 1) := l_dd_id(j);
7155            END IF;
7156 
7157 
7158            -- Update Cartonization id
7159            OPEN get_mo_line_id(l_dd_id(j));
7160            FETCH get_mo_line_id INTO l_mo_line_id, l_det_org;
7161            CLOSE get_mo_line_id;
7162 
7163            IF l_mo_line_id IS NOT NULL AND
7164               (WSH_USA_INV_PVT.is_mo_type_putaway(p_move_order_line_id => l_mo_line_id)='N') AND --X-dock
7165               (WSH_UTIL_VALIDATE.Check_Wms_Org(l_det_org)='Y')
7166            THEN
7167 
7168               OPEN c_grouping_id;
7169               FETCH c_grouping_id into l_carton_grouping_id;
7170               CLOSE c_grouping_id;
7171 
7172               IF l_debug_on THEN
7173                  WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit INV_MO_CANCEL_PVT.update_mol_carton_group',WSH_DEBUG_SV.C_PROC_LEVEL);
7174               END IF;
7175 
7176               INV_MO_Cancel_PVT.update_mol_carton_group(
7177                                  x_return_status => x_return_status,
7178                                  x_msg_cnt  => l_msg_count,
7179                                  x_msg_data => l_msg_data,
7180                                  p_line_id  => l_mo_line_id,
7181                                  p_carton_grouping_id => l_carton_grouping_id);
7182 
7183               IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR))
7184               THEN
7185 
7186                  RAISE update_mol_carton_group_error;
7187 
7188               END IF;
7189 
7190 
7191            END IF; -- IF (l_mo_line_id IS NOT NULL)...
7192 
7193 
7194 
7195   END LOOP;
7196 
7197   -- OTM R12 : unassign delivery detail
7198   --           executed only once after the loop assuming that all the
7199   --           delivery details fetched from cursor c_all_details_below belong
7200   --           to the same delivery
7201   IF (l_gc3_is_installed = 'Y' AND
7202       nvl(l_del1.ignore_for_planning, 'N') = 'N') THEN
7203 
7204     l_call_update := 'Y';
7205     l_delivery_id_tab(1) := l_assign.delivery_id;
7206     l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(l_assign.delivery_id);
7207 
7208     IF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
7209       --handle the error approriately to the procedure this code is in
7210       IF l_debug_on THEN
7211         WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
7212       END IF;
7213       raise FND_API.G_EXC_ERROR;
7214     ELSIF (l_is_delivery_empty = 'Y') THEN
7215       l_interface_flag_tab(1) := WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_REQUIRED;
7216     ELSIF (l_is_delivery_empty = 'N') THEN
7217       IF (l_gross_weight = 0) THEN
7218         -- do not update if assign/unassign 0/NULL weight line/LPN
7219         -- to nonempty delivery
7220         l_call_update := 'N';
7221       ELSE
7222         l_interface_flag_tab(1) := NULL;
7223         --setting this flag here to null so that the
7224         --update_tms_interface_flag procedure will take care of it.
7225       END IF;
7226     END IF;
7227 
7228     IF l_call_update = 'Y' THEN
7229       WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG(
7230               p_delivery_id_tab        => l_delivery_id_tab,
7231               p_tms_interface_flag_tab => l_interface_flag_tab,
7232               x_return_status          => l_return_status);
7233 
7234       IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
7235         x_return_status := l_return_status;
7236         IF l_debug_on THEN
7237           WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG '||l_return_status);
7238           WSH_DEBUG_SV.pop(l_module_name);
7239         END IF;
7240         RETURN;
7241       ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
7242         l_num_warnings := l_num_warnings + 1;
7243       END IF;
7244     END IF;
7245   END IF;
7246   -- End of OTM R12 : unassign delivery detail
7247 
7248   -- Call DBI api after the loop
7249   -- DBI Project
7250   -- Update of wsh_delivery_details,  call DBI API after the action.
7251   -- This API will also check for DBI Installed or not
7252   IF l_debug_on THEN
7253     WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail count-',l_detail_tab.count);
7254   END IF;
7255   WSH_INTEGRATION.DBI_Update_Detail_Log
7256     (p_delivery_detail_id_tab => l_detail_tab,
7257      p_dml_type               => 'UPDATE',
7258      x_return_status          => l_dbi_rs);
7259 
7260   IF l_debug_on THEN
7261     WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
7262   END IF;
7263   IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
7264     x_return_status := l_dbi_rs;
7265     -- just pass this return status to caller API
7266     ROLLBACK TO before_unassign;
7267     --
7268     IF l_debug_on THEN
7269       WSH_DEBUG_SV.logmsg(l_module_name,'DBI API call failed',x_return_status);
7270        WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:DBI API FAILED');
7271       END IF;
7272     RETURN;
7273   END IF;
7274   -- End of Code for DBI Project
7275   --
7276 
7277   --also unassign from container
7278   IF (l_assign.parent_delivery_detail_id IS NOT null) THEN
7279            -- K LPN CONV. rv
7280            --
7281            open l_parent_cnt_csr(l_assign.parent_delivery_detail_id);
7282            fetch l_parent_cnt_csr into l_parent_cnt_orgn_id, l_parent_cnt_line_dir;
7283            close l_parent_cnt_csr;
7284            --
7285            IF l_debug_on THEN
7286              WSH_DEBUG_SV.log(l_module_name,' parent cnt orgn id is', l_parent_cnt_orgn_id);
7287              WSH_DEBUG_SV.log(l_module_name,' parent cnt line dir is', l_parent_cnt_line_dir);
7288            END IF;
7289            --
7290            l_wms_org := wsh_util_validate.check_wms_org(l_parent_cnt_orgn_id);
7291            --
7292            -- K LPN CONV. rv
7293            --
7294            IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7295            AND nvl(l_parent_cnt_line_dir,'O') IN ('O', 'IO')
7296            AND
7297            (
7298              (WSH_WMS_LPN_GRP.GK_WMS_UNPACK and l_wms_org = 'Y')
7299              OR
7300              (WSH_WMS_LPN_GRP.GK_INV_UNPACK and l_wms_org = 'N')
7301            )
7302            THEN
7303            --{
7304                l_sync_tmp_rec.delivery_detail_id := p_detail_id;
7305                l_sync_tmp_rec.parent_delivery_detail_id := l_assign.parent_delivery_detail_id;
7306                l_sync_tmp_rec.delivery_id := l_assign.delivery_id;
7307                l_sync_tmp_rec.operation_type := 'PRIOR';
7308                --
7309                IF l_debug_on THEN
7310                    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WMS_SYNC_TMP_PKG.MERGE',WSH_DEBUG_SV.C_PROC_LEVEL);
7311                END IF;
7312                --
7313                WSH_WMS_SYNC_TMP_PKG.MERGE
7314                (
7315                  p_sync_tmp_rec      => l_sync_tmp_rec,
7316                  x_return_status     => l_return_status
7317                );
7318                --
7319                IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7320                  --
7321                  x_return_status := l_return_status;
7322                  --
7323                  IF l_debug_on THEN
7324                    WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
7325                    WSH_DEBUG_SV.pop(l_module_name);
7326                  END IF;
7327                  --
7328                  return;
7329                  --
7330                ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
7331                  --
7332                  l_num_warnings := l_num_warnings + 1;
7333                  --
7334                END IF;
7335                --
7336            --}
7337            END IF;
7338            -- K LPN CONV. rv
7339            --
7340            UPDATE wsh_delivery_assignments_v
7341            SET  parent_delivery_detail_id=NULL
7342            WHERE  delivery_detail_id = p_detail_id;
7343 
7344            --OTM Dock Door Appt Sched Proj
7345            --Upadating the loading sequence of the delivery detail to NULL while unassigning from delivery
7346            UPDATE wsh_delivery_details
7347            SET    load_seq_number = NULL,
7348                   last_update_date = SYSDATE,
7349                   last_updated_by =  FND_GLOBAL.USER_ID,
7350                   last_update_login =  FND_GLOBAL.LOGIN_ID
7351            WHERE  delivery_detail_id = p_detail_id;
7352 
7353 	   IF (SQL%NOTFOUND) THEN
7354               x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7355               RAISE NO_DATA_FOUND;
7356            END IF;
7357 
7358            l_mdc_detail_tab(1) := p_detail_id;
7359            WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
7360                       p_detail_id_tab => l_mdc_detail_tab,
7361                       x_return_status => x_return_status);
7362 
7363            IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7364              IF l_debug_on THEN
7365                WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
7366                WSH_DEBUG_SV.pop(l_module_name);
7367              END IF;
7368              return;
7369            END IF;
7370 
7371            WSH_SHIPPING_PARAMS_PVT.Get(
7372              p_organization_id     => l_assign.organization_id,
7373 	     x_param_info          => l_shipping_param_info,
7374              x_return_status       => l_return_status);
7375 
7376 
7377            IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR))
7378 	   THEN
7379               IF l_debug_on THEN
7380                WSH_DEBUG_SV.logmsg(l_module_name,'WSH_SHIPPING_PARAMS_PVT.Get returned '||l_return_status);
7381               END IF;
7382               RAISE get_shipping_param_err;
7383            END IF;
7384 
7385 
7386            IF l_shipping_param_info.PERCENT_FILL_BASIS_FLAG = 'Q' THEN
7387 
7388              WSH_WV_UTILS.ADJUST_PARENT_WV(
7389               p_entity_type   => 'CONTAINER',
7390               p_entity_id     => l_assign.parent_delivery_detail_id,
7391               p_gross_weight  => 0,
7392               p_net_weight    => 0,
7393               p_volume        => 0,
7394               p_filled_volume => 0,
7395               p_wt_uom_code   => l_assign.weight_uom_code,
7396               p_vol_uom_code  => l_assign.volume_uom_code,
7397               p_inv_item_id   => l_assign.inventory_item_id,
7398               x_return_status => l_return_status);
7399 
7400             IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR))
7401  	       THEN
7402                IF l_debug_on THEN
7403                 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_WV_UTILS.ADJUST_PARENT_WV returned '||l_return_status);
7404                END IF;
7405                RAISE adjust_parent_wv_err;
7406             END IF;
7407 
7408 
7409            END IF;
7410 
7411   END IF;
7412 
7413    /* Bug 2769639, remove FTE generated FC for the delivery detail and all the delivery details below it */
7414 
7415    IF WSH_UTIL_CORE.FTE_Is_Installed = 'Y'  AND l_dd_id.count > 0
7416    AND NVL(p_action_prms.caller,'!!!!') NOT LIKE '%' || WSH_UTIL_CORE.C_SPLIT_DLVY_SUFFIX
7417    THEN
7418       WSH_FREIGHT_COSTS_PVT.Remove_FTE_Freight_Costs(
7419          p_delivery_details_tab => l_dd_id,
7420          x_return_status => l_return_status) ;
7421       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS AND
7422          l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7423          raise remove_FC_error;
7424       ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7425          IF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
7426             x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
7427          END IF;
7428       END IF;
7429       IF l_debug_on THEN
7430          WSH_DEBUG_SV.log(l_module_name,'Remove_FTE_Freight_Costs completed returns with status: ' ||
7431                           l_return_status);
7432       END IF;
7433 
7434       NULL;
7435    END IF;
7436 
7437    -- LPN CONV. rv
7438    IF (l_num_warnings > 0 AND x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
7439      --
7440      x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
7441      --
7442    ELSE
7443      --
7444      x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
7445      --
7446    END IF;
7447    -- LPN CONV. rv
7448 
7449 
7450 
7451 --
7452 IF l_debug_on THEN
7453     WSH_DEBUG_SV.pop(l_module_name);
7454 END IF;
7455 --
7456   EXCEPTION
7457           WHEN mark_reprice_error  THEN
7458             x_return_status := l_return_status;
7459                   FND_MESSAGE.Set_Name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
7460         WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
7461         ROLLBACK TO before_unassign;
7462         --
7463         IF l_debug_on THEN
7464             WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7465             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
7466         END IF;
7467         --
7468     WHEN detail_not_assigned THEN
7469       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7470       fnd_message.set_name('WSH', 'WSH_DET_DETAIL_NOT_ASSIGNED');
7471       wsh_util_core.add_message(x_return_status,l_module_name);
7472       ROLLBACK TO before_unassign;
7473       --
7474       IF l_debug_on THEN
7475           WSH_DEBUG_SV.logmsg(l_module_name,'DETAIL_NOT_ASSIGNED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7476           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:DETAIL_NOT_ASSIGNED');
7477       END IF;
7478       --
7479     WHEN del_not_updatable THEN
7480       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7481       wsh_util_core.add_message(x_return_status,l_module_name);
7482       ROLLBACK TO before_unassign;
7483       --
7484       IF l_debug_on THEN
7485           WSH_DEBUG_SV.logmsg(l_module_name,'DEL_NOT_UPDATABLE exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7486           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:DEL_NOT_UPDATABLE');
7487       END IF;
7488       --
7489                 WHEN update_mol_carton_group_error THEN
7490       fnd_message.SET_name('WSH', 'WSH_MOL_CARTON_GROUP_ERROR');
7491                         x_return_status := l_return_status;
7492                         WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
7493 
7494                       --
7495                       IF l_debug_on THEN
7496                           WSH_DEBUG_SV.logmsg(l_module_name,'update_mol_carton_group_error exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7497                           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:update_mol_carton_group_error');
7498                       END IF;
7499 
7500     WHEN check_ship_set_failed THEN
7501       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7502 
7503 --
7504 IF l_debug_on THEN
7505     WSH_DEBUG_SV.logmsg(l_module_name,'CHECK_SHIP_SET_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7506     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CHECK_SHIP_SET_FAILED');
7507 END IF;
7508 --
7509     WHEN check_smc_failed THEN
7510       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7511       --
7512       IF l_debug_on THEN
7513           WSH_DEBUG_SV.logmsg(l_module_name,'CHECK_SMC_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7514           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CHECK_SMC_FAILED');
7515       END IF;
7516       --
7517     WHEN remove_FC_error  THEN
7518        x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7519       --
7520       IF l_debug_on THEN
7521           WSH_DEBUG_SV.logmsg(l_module_name,'Remove_FTE_Freight_Costs failed.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7522           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:REMOVE_FC_ERROR');
7523       END IF;
7524       --
7525        FND_MESSAGE.Set_Name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
7526         WSH_UTIL_CORE.add_message (x_return_status,l_module_name);
7527       ROLLBACK TO before_unassign;
7528 
7529     WHEN get_shipping_param_err THEN
7530       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7531       FND_MESSAGE.Set_Name('WSH', 'WSH_PARAM_NOT_DEFINED');
7532       FND_MESSAGE.Set_Token('ORGANIZATION_CODE',
7533                         wsh_util_core.get_org_name(l_assign.organization_id));
7534       wsh_util_core.add_message(x_return_status,l_module_name);
7535       ROLLBACK TO before_unassign;
7536       --
7537       IF l_debug_on THEN
7538          WSH_DEBUG_SV.logmsg(l_module_name,'Failed to get Shipping Parameters',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7539          WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:GET_SHIPPING_PARAM_ERR');
7540       END IF;
7541 
7542     WHEN adjust_parent_wv_err THEN
7543       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7544       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
7545       FND_MESSAGE.SET_TOKEN('CONT_NAME',WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_assign.parent_delivery_detail_id));
7546       WSH_UTIL_CORE.ADD_MESSAGE(x_return_status,l_module_name);
7547 
7548       ROLLBACK TO before_unassign;
7549       --
7550       IF l_debug_on THEN
7551          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);
7552          WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:ADJUST_PARENT_WV_ERR');
7553       END IF;
7554 
7555     WHEN others THEN
7556       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
7557       wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_DETAIL_FROM_DELIVERY',l_module_name);
7558       ROLLBACK TO before_unassign;
7559 
7560 
7561 --
7562 IF l_debug_on THEN
7563     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
7564     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
7565 END IF;
7566 --
7567 END Unassign_Detail_FROM_Delivery;
7568 
7569 
7570 -------------------------------------------------------------------
7571 -- This procedure is only for backward compatibility. No one should call
7572 -- this procedure.
7573 -------------------------------------------------------------------
7574 
7575 PROCEDURE Unassign_Detail_from_Delivery(
7576   p_detail_id                IN NUMBER
7577 , x_return_status         OUT NOCOPY  VARCHAR2
7578 , p_validate_flag        IN VARCHAR2)
7579 
7580 IS
7581 
7582 --
7583 l_debug_on BOOLEAN;
7584 --
7585 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_DETAIL_FROM_DELIVERY';
7586 --
7587 l_action_prms   WSH_GLBL_VAR_STRCT_GRP.dd_action_parameters_rec_type;  -- J-IB-NPARIKH
7588 BEGIN
7589 
7590 /*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*/
7591 
7592     --
7593     --
7594     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
7595     --
7596     IF l_debug_on IS NULL
7597     THEN
7598         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
7599     END IF;
7600     --
7601     IF l_debug_on THEN
7602         WSH_DEBUG_SV.push(l_module_name);
7603         --
7604         WSH_DEBUG_SV.log(l_module_name,'P_DETAIL_ID',P_DETAIL_ID);
7605         WSH_DEBUG_SV.log(l_module_name,'P_VALIDATE_FLAG',P_VALIDATE_FLAG);
7606     END IF;
7607     --
7608     IF l_debug_on THEN
7609        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_DETAIL_FROM_DELIVERY',WSH_DEBUG_SV.C_PROC_LEVEL);
7610     END IF;
7611     UNASSIGN_DETAIL_FROM_DELIVERY (p_detail_id,
7612                                      x_return_status,
7613                                      p_validate_flag,
7614                                      l_action_prms);
7615     --
7616     IF l_debug_on THEN
7617         WSH_DEBUG_SV.pop(l_module_name);
7618     END IF;
7619     --
7620     EXCEPTION
7621         WHEN others THEN
7622             x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
7623             wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_DETAIL_FROM_DELIVERY',l_module_name);
7624         --
7625         IF l_debug_on THEN
7626             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
7627         END IF;
7628         --
7629 END Unassign_Detail_FROM_Delivery;
7630 
7631 
7632 
7633 
7634 --
7635 --Procedure:      Unassign_multiple_details
7636 --Parameters:      P_REC_OF_DETAIL_IDS
7637 --              P_from_delivery
7638 --              P_from_container
7639 --            x_return_status
7640 --Desription:     Unasigns multiple details FROM a delivery or a container
7641 PROCEDURE Unassign_Multiple_Details(
7642   P_REC_OF_DETAIL_IDS  IN WSH_UTIL_CORE.ID_TAB_TYPE
7643 , P_FROM_delivery    IN VARCHAR2
7644 , P_FROM_container     IN VARCHAR2
7645 , x_return_status    out NOCOPY  varchar2
7646 , p_validate_flag    IN VARCHAR2
7647 , p_action_prms  IN WSH_GLBL_VAR_STRCT_GRP.dd_action_parameters_rec_type   -- J-IB-NPARIKH
7648 )
7649 IS
7650 
7651 CURSOR c_multi_assign_rec(c_delivery_detail_id number)
7652 IS
7653 SELECT   delivery_id, parent_delivery_detail_id
7654 FROM     wsh_delivery_assignments_v
7655 WHERE delivery_detail_id = c_delivery_Detail_id
7656 AND   ((delivery_id IS not null) or (parent_delivery_detail_id IS not null));
7657 l_multi_assign_rec c_multi_assign_rec%ROWTYPE;
7658 
7659 CURSOR c_multi_delivery(c_del_id number)
7660 IS
7661 SELECT *
7662 FROM wsh_new_deliveries
7663 WHERE delivery_id = c_del_id;
7664 l_multi_delivery c_multi_delivery%ROWTYPE;
7665 
7666 l_multi_cost_count number;
7667 l_ship_set BOOLEAN;
7668 l_smc_set BOOLEAN;
7669 l_return_status varchar2(30);
7670 check_ship_SET_failed exception;
7671 check_smc_failed  exception;
7672 l_num_errors    NUMBER;
7673 l_num_warnings    NUMBER;
7674 /*Bug 2136603- added variables */
7675 l_gross NUMBER;
7676 l_net NUMBER;
7677 l_volume NUMBER;
7678 l_fill NUMBER;
7679 l_cont_name VARCHAR2(30);
7680 --
7681 l_dlvy_tbl         WSH_UTIL_CORE.key_value_tab_type;   -- J-IB-NPARIKH
7682 l_dlvy_ext_tbl     WSH_UTIL_CORE.key_value_tab_type;   -- J-IB-NPARIKH
7683 l_del_tab          WSH_UTIL_CORE.ID_TAB_TYPE;
7684 l_index            NUMBER;
7685 L_DLVY_FREIGHT_TERMS_CODE  VARCHAR2(30);
7686 
7687 Cursor c_empty_delivery ( p_del_id number) --Pick To POD WF : Raise PO Cancellation for empty Inbound delivery
7688 IS
7689 SELECT wnd.delivery_id, wnd.organization_id
7690 FROM wsh_new_deliveries wnd
7691 WHERE wnd.delivery_id = p_del_id and wnd.shipment_direction='I'
7692 and  not exists (  SELECT wda.delivery_id
7693 FROM wsh_delivery_assignments_v  wda
7694 WHERE wda.delivery_id =wnd.delivery_id  );
7695 l_del_id NUMBER;
7696 l_org_id NUMBER;
7697 l_wf_rs VARCHAR2(1);
7698 
7699 -- K LPN CONV. rv
7700 l_lpn_in_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_in_rec_type;
7701 l_lpn_out_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_out_rec_type;
7702 l_msg_count NUMBER;
7703 l_msg_data VARCHAR2(32767);
7704 -- K LPN CONV. rv
7705 
7706 --
7707 l_debug_on BOOLEAN;
7708 --
7709 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_MULTIPLE_DETAILS';
7710 --
7711 BEGIN
7712   --
7713   --
7714   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
7715   --
7716   IF l_debug_on IS NULL
7717   THEN
7718       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
7719   END IF;
7720   --
7721   IF l_debug_on THEN
7722       WSH_DEBUG_SV.push(l_module_name);
7723       --
7724       WSH_DEBUG_SV.log(l_module_name,'P_FROM_DELIVERY',P_FROM_DELIVERY);
7725       WSH_DEBUG_SV.log(l_module_name,'P_FROM_CONTAINER',P_FROM_CONTAINER);
7726       WSH_DEBUG_SV.log(l_module_name,'P_VALIDATE_FLAG',P_VALIDATE_FLAG);
7727   END IF;
7728   --
7729   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
7730 
7731   -- initialize summary variables
7732   l_num_warnings := 0;
7733   l_num_errors := 0;
7734 
7735   IF (p_from_delivery = 'Y') THEN
7736      FOR i in p_rec_of_detail_ids.FIRST .. p_rec_of_detail_ids.LAST
7737     LOOP
7738       OPEN c_multi_assign_rec(p_rec_of_detail_ids(i));
7739       FETCH c_multi_assign_rec INTO l_multi_assign_rec;
7740 
7741                         IF l_debug_on THEN
7742                            WSH_DEBUG_SV.log(l_module_name,'p_rec_of_detail_ids',
7743                                p_rec_of_detail_ids(i));
7744                         END IF;
7745 
7746       IF (c_multi_assign_rec%NOTFOUND) THEN
7747         l_num_warnings := l_num_warnings + 1;
7748         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
7749         fnd_message.SET_name('WSH','WSH_DET_SPEC_DET_NOT_ASSIGNED');
7750         fnd_message.SET_token('DELIVERY_DETAIL_ID', p_rec_of_detail_ids(i));
7751         wsh_util_core.add_message(x_return_status,l_module_name);
7752         /* go ahead and process the next line */
7753         CLOSE c_multi_assign_rec;
7754         GOTO start_over_1;
7755       END IF;
7756       CLOSE c_multi_assign_rec;
7757 
7758       IF (l_multi_assign_rec.delivery_id IS null) THEN
7759         l_num_warnings := l_num_warnings + 1;
7760         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
7761         fnd_message.SET_name('WSH','WSH_DET_SPEC_DET_NOT_ASSIGNED');
7762         fnd_message.SET_token('DELIVERY_DETAIL_ID', p_rec_of_detail_ids(i));
7763         wsh_util_core.add_message(x_return_status,l_module_name);
7764         /* go ahead and process the next line */
7765         GOTO start_over_1;
7766       END IF;
7767 
7768             -- J-IB-NPARIKH-{
7769             --
7770             --
7771             IF l_debug_on THEN
7772                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.get_Cached_value',WSH_DEBUG_SV.C_PROC_LEVEL);
7773             END IF;
7774             --
7775             -- Build a cache of uniqye delivery IDs , from which lines are being unassigned
7776             --
7777             --
7778             WSH_UTIL_CORE.get_Cached_value
7779                 (
7780                     p_cache_tbl         => l_dlvy_tbl,
7781                     p_cache_ext_tbl     => l_dlvy_ext_tbl,
7782                     p_key               => l_multi_assign_rec.delivery_id,
7783                     p_value             => l_multi_assign_rec.delivery_id,
7784                     p_action            => 'PUT',
7785                     x_return_status     => l_return_status
7786                 );
7787             --
7788             --
7789             wsh_util_core.api_post_call
7790               (
7791                 p_return_status => l_return_status,
7792                 x_num_warnings  => l_num_warnings,
7793                 x_num_errors    => l_num_errors
7794               );
7795             --
7796             -- J-IB-NPARIKH-}
7797 
7798 
7799       Unassign_detail_from_delivery(
7800         p_detail_id   =>   p_rec_of_detail_ids(i),
7801         p_validate_flag   =>  p_validate_flag,
7802         x_return_status   =>  l_return_status,
7803                 p_action_prms       => p_action_prms   -- J-IB-NPARIKH
7804         );
7805       IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR
7806          l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
7807         l_num_errors := l_num_errors + 1;
7808       ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
7809         l_num_warnings := l_num_warnings + 1;
7810       END IF;
7811 
7812 
7813       <<start_over_1>>
7814       NULL;
7815     END LOOP;
7816         --
7817         --
7818         -- J-IB-NPARIKH-{
7819         --
7820         l_index := l_dlvy_tbl.FIRST;
7821         --
7822         WHILE l_index IS NOT NULL
7823         LOOP
7824         --{
7825 
7826             IF NVL(p_action_prms.caller,'!!!!') NOT LIKE WSH_UTIL_CORE.C_IB_RECEIPT_PREFIX || '%'   -- J-IB-NPARIKH
7827             THEN
7828             --{
7829 		IF l_debug_on THEN
7830 		  WSH_DEBUG_SV.logmsg(l_module_name,'WSH_TP_RELEASE.calculate_cont_del_tpdates',WSH_DEBUG_SV.C_PROC_LEVEL);
7831 		END IF;
7832 
7833 		l_del_tab(1) := l_dlvy_tbl(l_index).value;
7834 		WSH_TP_RELEASE.calculate_cont_del_tpdates(
7835 		  p_entity => 'DLVY',
7836 		  p_entity_ids =>l_del_tab,
7837 		  x_return_status => l_return_status);
7838 		    --}
7839 	      /*CURRENTLY NOT IN USE
7840 	      IF ( p_action_prms.caller = WSH_UTIL_CORE.C_IB_PO_PREFIX  ) -- Added for Pick to POD WF
7841 	      THEN	--PO cancellation unassigns DD from delivery, we check if delivery gets emptied out then we raise a event
7842 			OPEN c_empty_delivery( l_dlvy_tbl(l_index).value )  ;
7843 			Fetch c_empty_delivery into l_del_id, l_org_id;
7844 			If (c_empty_delivery%FOUND )
7845 			THEN
7846 				 --Raise Event: Pick To Pod Workflow
7847 				  WSH_WF_STD.Raise_Event(
7848 							p_entity_type => 'DELIVERY',
7849 							p_entity_id =>  l_del_id,
7850 							p_event => 'oracle.apps.fte.delivery.ib.pocancelled' ,
7851 							p_organization_id =>  l_org_id,
7852 							x_return_status => l_wf_rs ) ;
7853 				 IF l_debug_on THEN
7854 				     WSH_DEBUG_SV.log(l_module_name,'Delivery ID is  ',  l_del_id );
7855 				     WSH_DEBUG_SV.log(l_module_name,'Return Status After Calling WSH_WF_STD.Raise_Event',l_wf_rs);
7856 				 END IF;
7857 				--Done Raise Event: Pick To Pod Workflow
7858 			END IF;
7859 			CLOSE c_empty_delivery;
7860 		END IF;
7861 		*/
7862             END IF;
7863 
7864             --
7865             IF l_debug_on THEN
7866                 WSH_DEBUG_SV.log(l_module_name,'l_dlvy_tbl(l_index).value',l_dlvy_tbl(l_index).value);
7867                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERY_ACTIONS.update_freight_terms',WSH_DEBUG_SV.C_PROC_LEVEL);
7868             END IF;
7869             --
7870             WSH_NEW_DELIVERY_ACTIONS.update_freight_terms
7871                 (
7872                     p_delivery_id        => l_dlvy_tbl(l_index).value,
7873                     p_action_code        => 'UNASSIGN',
7874                     x_return_status      => l_return_status,
7875                     x_freight_terms_code => l_dlvy_freight_terms_code
7876                 );
7877             --
7878             --
7879             wsh_util_core.api_post_call
7880               (
7881                 p_return_status => l_return_status,
7882                 x_num_warnings  => l_num_warnings,
7883                 x_num_errors    => l_num_errors
7884               );
7885             --
7886             --
7887             l_index := l_dlvy_tbl.NEXT(l_index);
7888         --}
7889         END LOOP;
7890         --
7891         --
7892         l_index := l_dlvy_ext_tbl.FIRST;
7893         --
7894         WHILE l_index IS NOT NULL
7895         LOOP
7896         --{
7897             --
7898             IF NVL(p_action_prms.caller,'!!!!') NOT LIKE WSH_UTIL_CORE.C_IB_RECEIPT_PREFIX || '%'   -- J-IB-NPARIKH
7899             THEN
7900             --{
7901 
7902             IF l_debug_on THEN
7903               WSH_DEBUG_SV.logmsg(l_module_name,'WSH_TP_RELEASE.calculate_cont_del_tpdates',WSH_DEBUG_SV.C_PROC_LEVEL);
7904             END IF;
7905             l_del_tab(1) := l_dlvy_ext_tbl(l_index).value;
7906             WSH_TP_RELEASE.calculate_cont_del_tpdates(
7907               p_entity => 'DLVY',
7908               p_entity_ids =>l_del_tab,
7909               x_return_status => l_return_status);
7910             --}
7911 		/*IF ( p_action_prms.caller = WSH_UTIL_CORE.C_IB_PO_PREFIX  ) -- Added for Pick to POD WF
7912 		THEN	--PO cancellation unassigns DD from delivery, we check if delivery gets emptied out then we raise a event
7913 			OPEN c_empty_delivery( l_dlvy_ext_tbl(l_index).value )  ;
7914 			Fetch c_empty_delivery into l_del_id, l_org_id;
7915 			If (c_empty_delivery%FOUND )
7916 			THEN
7917 				 --Raise Event: Pick To Pod Workflow
7918 				  WSH_WF_STD.Raise_Event(
7919 							p_entity_type => 'DELIVERY',
7920 							p_entity_id =>  l_del_id,
7921 							p_event => 'oracle.apps.fte.delivery.ib.pocancelled' ,
7922 							p_organization_id =>  l_org_id,
7923 							x_return_status => l_wf_rs ) ;
7924 				 IF l_debug_on THEN
7925 				     WSH_DEBUG_SV.log(l_module_name,'Delivery ID is  ',  l_del_id );
7926 				     WSH_DEBUG_SV.log(l_module_name,'Return Status After Calling WSH_WF_STD.Raise_Event',l_wf_rs);
7927 				 END IF;
7928 				--Done Raise Event: Pick To Pod Workflow
7929 			END IF;
7930 			CLOSE c_empty_delivery;
7931 		END IF;*/
7932             END IF;
7933 
7934             IF l_debug_on THEN
7935                WSH_DEBUG_SV.log(l_module_name,'l_dlvy_ext_tbl(l_index).value',l_dlvy_ext_tbl(l_index).value);
7936                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERY_ACTIONS.update_freight_terms',WSH_DEBUG_SV.C_PROC_LEVEL);
7937             END IF;
7938             --
7939             WSH_NEW_DELIVERY_ACTIONS.update_freight_terms
7940                 (
7941                     p_delivery_id        => l_dlvy_ext_tbl(l_index).value,
7942                     p_action_code        => 'UNASSIGN',
7943                     x_return_status      => l_return_status,
7944                     x_freight_terms_code => l_dlvy_freight_terms_code
7945                 );
7946             --
7947             --
7948             wsh_util_core.api_post_call
7949               (
7950                 p_return_status => l_return_status,
7951                 x_num_warnings  => l_num_warnings,
7952                 x_num_errors    => l_num_errors
7953               );
7954             --
7955             --
7956             l_index := l_dlvy_ext_tbl.NEXT(l_index);
7957         --}
7958         END LOOP;
7959         --
7960         -- J-IB-NPARIKH-}
7961 
7962   END IF;
7963         IF l_debug_on THEN
7964             WSH_DEBUG_SV.log(l_module_name,'l_num_errors', l_num_errors);
7965             WSH_DEBUG_SV.log(l_module_name,'l_num_warnings', l_num_warnings);
7966         END IF;
7967 
7968   IF (p_from_container = 'Y') THEN
7969     FOR i in  p_rec_of_detail_ids.FIRST .. p_rec_of_detail_ids.LAST
7970     LOOP
7971       OPEN c_multi_assign_rec(p_rec_of_detail_ids(i));
7972       FETCH c_multi_assign_rec INTO l_multi_assign_rec;
7973                         IF l_debug_on THEN
7974                            WSH_DEBUG_SV.log(l_module_name,'p_rec_of_detail_ids'
7975                                           ,p_rec_of_detail_ids(i));
7976                            WSH_DEBUG_SV.log(l_module_name,'l_multi_assign_rec',
7977                                                l_multi_assign_rec.delivery_id);
7978                         END IF;
7979       IF (c_multi_assign_rec%NOTFOUND) THEN
7980         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
7981         fnd_message.SET_name('WSH','WSH_DET_SPEC_DET_NOT_ASSIGNED');
7982         fnd_message.SET_token('DELIVERY_DETAIL_ID', p_rec_of_detail_ids(i));
7983         wsh_util_core.add_message(x_return_status,l_module_name);
7984         /* go ahead and process the next line */
7985          CLOSE c_multi_assign_rec;
7986         GOTO start_over_2;
7987       END IF;
7988       CLOSE c_multi_assign_rec;
7989 
7990 /* Bug 2166715 - check if line was actually packed or not */
7991             IF l_multi_assign_rec.parent_delivery_detail_id IS NULL THEN                      l_num_warnings := l_num_warnings + 1;
7992               fnd_message.SET_name('WSH','WSH_CONT_UNASSG_NULL');
7993               wsh_util_core.add_message(x_return_status,l_module_name);
7994             END IF;
7995 
7996       Unassign_detail_FROM_cont(
7997         p_detail_id       =>   p_rec_of_detail_ids(i),
7998         p_validate_flag      => p_validate_flag,
7999         x_return_status    => l_return_status
8000         );
8001       IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR
8002          l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
8003         l_num_errors := l_num_errors + 1;
8004       ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
8005         l_num_warnings := l_num_warnings + 1;
8006 
8007       END IF;
8008 
8009       IF l_debug_on THEN
8010         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_TP_RELEASE.calculate_cont_del_tpdates',WSH_DEBUG_SV.C_PROC_LEVEL);
8011       END IF;
8012       l_del_tab(1) := l_multi_assign_rec.parent_delivery_detail_id;
8013       WSH_TP_RELEASE.calculate_cont_del_tpdates(
8014                   p_entity => 'DLVB',
8015                   p_entity_ids =>l_del_tab,
8016       x_return_status => l_return_status);
8017 
8018          <<start_over_2>>
8019         NULL;
8020     END LOOP;
8021   END IF;
8022   --
8023   -- K LPN CONV. rv
8024   --
8025   IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8026   THEN
8027   --{
8028       IF l_debug_on THEN
8029         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);
8030       END IF;
8031 
8032       WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8033         (
8034           p_in_rec             => l_lpn_in_sync_comm_rec,
8035           x_return_status      => l_return_status,
8036           x_out_rec            => l_lpn_out_sync_comm_rec
8037         );
8038       --
8039       --
8040       IF l_debug_on THEN
8041         WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
8042       END IF;
8043       --
8044       --
8045       WSH_UTIL_CORE.API_POST_CALL
8046         (
8047           p_return_status    => l_return_status,
8048           x_num_warnings     => l_num_warnings,
8049           x_num_errors       => l_num_errors,
8050           p_raise_error_flag => false
8051         );
8052   --}
8053   END IF;
8054   --
8055   -- K LPN CONV. rv
8056   --
8057   --
8058   IF (l_num_errors >= p_rec_of_detail_ids.COUNT) THEN
8059     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8060   ELSIF (l_num_warnings > 0 OR l_num_errors>0) THEN
8061     x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8062   END IF;
8063         IF l_debug_on THEN
8064             WSH_DEBUG_SV.log(l_module_name,'x_return_status',x_return_status);
8065             WSH_DEBUG_SV.log(l_module_name,'l_num_warnings',l_num_warnings);
8066             WSH_DEBUG_SV.log(l_module_name,'l_num_errors',l_num_errors);
8067             WSH_DEBUG_SV.pop(l_module_name);
8068         END IF;
8069 
8070   EXCEPTION
8071         -- J-IB-NPARIKH-{
8072        WHEN fnd_api.g_exc_error THEN
8073           x_return_status := fnd_api.g_ret_sts_error;
8074           --
8075           -- K LPN CONV. rv
8076           --
8077           IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8078           THEN
8079           --{
8080               IF l_debug_on THEN
8081                 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);
8082               END IF;
8083               WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8084                 (
8085                   p_in_rec             => l_lpn_in_sync_comm_rec,
8086                   x_return_status      => l_return_status,
8087                   x_out_rec            => l_lpn_out_sync_comm_rec
8088                 );
8089               --
8090               --
8091               IF l_debug_on THEN
8092                 WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
8093               END IF;
8094               --
8095               --
8096               IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
8097                 x_return_status := l_return_status;
8098               END IF;
8099               --
8100           --}
8101           END IF;
8102           --
8103           -- K LPN CONV. rv
8104           --
8105           --
8106           IF l_debug_on THEN
8107              wsh_debug_sv.pop(l_module_name, 'EXCEPTION:FND_API.G_EXC_ERROR');
8108           END IF;
8109        --
8110        WHEN fnd_api.g_exc_unexpected_error THEN
8111          x_return_status := fnd_api.g_ret_sts_unexp_error;
8112          --
8113          --
8114          -- K LPN CONV. rv
8115          --
8116          IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8117          THEN
8118          --{
8119               IF l_debug_on THEN
8120                 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);
8121               END IF;
8122 
8123              WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8124                (
8125                  p_in_rec             => l_lpn_in_sync_comm_rec,
8126                  x_return_status      => l_return_status,
8127                  x_out_rec            => l_lpn_out_sync_comm_rec
8128                );
8129              --
8130              --
8131              IF l_debug_on THEN
8132                WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
8133              END IF;
8134              --
8135              --
8136              --
8137          --}
8138          END IF;
8139          --
8140          -- K LPN CONV. rv
8141          --
8142           IF l_debug_on THEN
8143              wsh_debug_sv.pop(l_module_name, 'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
8144           END IF;
8145        --
8146 
8147         -- J-IB-NPARIKH-}
8148     WHEN CHECK_SHIP_SET_FAILED THEN
8149       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8150       --
8151           --
8152           -- K LPN CONV. rv
8153           --
8154           IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8155           THEN
8156           --{
8157               IF l_debug_on THEN
8158                 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);
8159               END IF;
8160 
8161               WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8162                 (
8163                   p_in_rec             => l_lpn_in_sync_comm_rec,
8164                   x_return_status      => l_return_status,
8165                   x_out_rec            => l_lpn_out_sync_comm_rec
8166                 );
8167               --
8168               --
8169               IF l_debug_on THEN
8170                 WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
8171               END IF;
8172               --
8173               --
8174               IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
8175                 x_return_status := l_return_status;
8176               END IF;
8177               --
8178           --}
8179           END IF;
8180           --
8181           -- K LPN CONV. rv
8182           --
8183       IF l_debug_on THEN
8184           WSH_DEBUG_SV.logmsg(l_module_name,'CHECK_SHIP_SET_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
8185           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CHECK_SHIP_SET_FAILED');
8186       END IF;
8187       --
8188     WHEN check_smc_failed THEN
8189        x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8190           --
8191           -- K LPN CONV. rv
8192           --
8193           IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8194           THEN
8195           --{
8196               IF l_debug_on THEN
8197                 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);
8198               END IF;
8199 
8200               WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8201                 (
8202                   p_in_rec             => l_lpn_in_sync_comm_rec,
8203                   x_return_status      => l_return_status,
8204                   x_out_rec            => l_lpn_out_sync_comm_rec
8205                 );
8206               --
8207               --
8208               IF l_debug_on THEN
8209                 WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
8210               END IF;
8211               --
8212               --
8213               IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
8214                 x_return_status := l_return_status;
8215               END IF;
8216               --
8217           --}
8218           END IF;
8219           --
8220           -- K LPN CONV. rv
8221           --
8222        --
8223        IF l_debug_on THEN
8224            WSH_DEBUG_SV.logmsg(l_module_name,'CHECK_SMC_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
8225            WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CHECK_SMC_FAILED');
8226        END IF;
8227        --
8228     WHEN others THEN
8229        x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8230        wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_MULTIPLE_DETAIL',l_module_name);
8231 --
8232 IF l_debug_on THEN
8233     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
8234 END IF;
8235 --
8236           --
8237           -- K LPN CONV. rv
8238           --
8239           IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8240           THEN
8241           --{
8242               IF l_debug_on THEN
8243                 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);
8244               END IF;
8245 
8246               WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8247                 (
8248                   p_in_rec             => l_lpn_in_sync_comm_rec,
8249                   x_return_status      => l_return_status,
8250                   x_out_rec            => l_lpn_out_sync_comm_rec
8251                 );
8252               --
8253               --
8254               IF l_debug_on THEN
8255                 WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
8256               END IF;
8257               --
8258               --
8259           --}
8260           END IF;
8261           --
8262           -- K LPN CONV. rv
8263           --
8264 
8265 --
8266 IF l_debug_on THEN
8267     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
8268 END IF;
8269 --
8270 END Unassign_Multiple_Details;
8271 
8272 -------------------------------------------------------------------
8273 -- This procedure is only for backward compatibility. No one should call
8274 -- this procedure.
8275 -------------------------------------------------------------------
8276 
8277 PROCEDURE Unassign_Multiple_Details(
8278   P_REC_OF_DETAIL_IDS    IN WSH_UTIL_CORE.ID_TAB_TYPE
8279 , P_FROM_delivery        IN VARCHAR2
8280 , P_FROM_container       IN VARCHAR2
8281 , x_return_status        out NOCOPY  varchar2
8282 , p_validate_flag      IN VARCHAR2
8283 )
8284 IS
8285 
8286 
8287 l_debug_on BOOLEAN;
8288 --
8289 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_MULTIPLE_DETAILS';
8290 --
8291 l_action_prms   WSH_GLBL_VAR_STRCT_GRP.dd_action_parameters_rec_type;  -- J-IB-NPARIKH
8292 BEGIN
8293     --
8294     --
8295     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
8296     --
8297     IF l_debug_on IS NULL
8298     THEN
8299         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
8300     END IF;
8301     --
8302     IF l_debug_on THEN
8303         WSH_DEBUG_SV.push(l_module_name);
8304         --
8305         WSH_DEBUG_SV.log(l_module_name,'P_FROM_DELIVERY',P_FROM_DELIVERY);
8306         WSH_DEBUG_SV.log(l_module_name,'P_FROM_CONTAINER',P_FROM_CONTAINER);
8307         WSH_DEBUG_SV.log(l_module_name,'P_VALIDATE_FLAG',P_VALIDATE_FLAG);
8308     END IF;
8309     --
8310     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8311     --
8312     IF l_debug_on THEN
8313         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_MULTIPLE_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
8314     END IF;
8315     --
8316     UNASSIGN_MULTIPLE_DETAILS
8317         (
8318               P_REC_OF_DETAIL_IDS
8319             , P_FROM_delivery
8320             , P_FROM_container
8321             , x_return_status
8322             , p_validate_flag
8323             , l_action_prms
8324         );
8325 
8326         IF l_debug_on THEN
8327             WSH_DEBUG_SV.pop(l_module_name);
8328         END IF;
8329 
8330     EXCEPTION
8331         WHEN others THEN
8332            x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8333         wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_MULTIPLE_DETAIL',l_module_name);
8334         --
8335         IF l_debug_on THEN
8336             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
8337         END IF;
8338 --
8339 END Unassign_Multiple_Details;
8340 
8341 --
8342 --Procedure:      Assign_multiple_details
8343 --Parameters:      P_REC_OF_DETAIL_IDS
8344 --            P_delivery_id,
8345 --            P_cont_ins_id,
8346 --            x_return_status
8347 --Desription:     Assings multiple details to a delivery or a container
8348 
8349 PROCEDURE Assign_Multiple_Details(
8350   p_rec_of_detail_ids IN WSH_UTIL_CORE.ID_TAB_TYPE,
8351   p_delivery_id NUMBER,
8352   P_cont_ins_id number,
8353   x_return_status OUT NOCOPY  varchar2)
8354 IS
8355 l_rowid varchar2(150);
8356 l_group_status varchar2(30);
8357 l_ship_method_match boolean;
8358 l_delivery_assignments_info WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_TYPE;
8359 l_cr_assg_status varchar2(30);
8360 l_delivery_assignment_id NUMBER;
8361 del_id number;
8362 cont_id number;
8363 
8364 
8365 CURSOR c_get_del_from_container(c_container_id number) IS
8366 SELECT delivery_id
8367 FROM wsh_delivery_assignments_v
8368 WHERE delivery_detail_id = c_container_id;
8369 
8370 l_num_errors    NUMBER;
8371 l_num_warnings    NUMBER;
8372 
8373 
8374 l_scc_unassign_from_del NUMBER  := 0;
8375 l_scc_unassign_from_con NUMBER  := 0;
8376 l_delivery_id           NUMBER := 0;
8377 l_del_tab               WSH_UTIL_CORE.Id_Tab_Type;
8378 l_return_status         VARCHAR2(1);
8379 m                       NUMBER := 0;
8380 
8381 
8382 mark_reprice_error      EXCEPTION;
8383 
8384 /* Bug 2276586 */
8385 l_delivery_id1 NUMBER;
8386 delivery_id_locked exception  ;
8387 PRAGMA EXCEPTION_INIT(delivery_id_locked, -54);
8388 
8389 
8390 
8391 l_has_lines               VARCHAR2(1);
8392 l_dlvy_freight_terms_code VARCHAR2(30);
8393 --
8394 --
8395 l_debug_on BOOLEAN;
8396 --
8397 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'ASSIGN_MULTIPLE_DETAILS';
8398 --
8399 BEGIN
8400   --
8401   --
8402   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
8403   --
8404   IF l_debug_on IS NULL
8405   THEN
8406       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
8407   END IF;
8408   --
8409   IF l_debug_on THEN
8410       WSH_DEBUG_SV.push(l_module_name);
8411       --
8412       WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
8413       WSH_DEBUG_SV.log(l_module_name,'P_CONT_INS_ID',P_CONT_INS_ID);
8414   END IF;
8415   --
8416   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8417   l_del_tab.delete;
8418   l_num_errors := 0;
8419   l_num_warnings := 0;
8420 
8421   IF ((p_delivery_id = -9999)  AND (p_cont_ins_id = -9999 )) THEN
8422      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8423      --
8424      IF l_debug_on THEN
8425          WSH_DEBUG_SV.pop(l_module_name);
8426      END IF;
8427      --
8428      return;
8429   END IF;
8430 
8431 -- Bug 2276586
8432    SELECT delivery_id, freight_Terms_code    -- J-IB-NPARIKH
8433      INTO l_delivery_id1, l_dlvy_freight_Terms_code
8434      FROM wsh_new_deliveries
8435     WHERE delivery_id = p_delivery_id
8436       FOR UPDATE NOWAIT;
8437 
8438   IF l_debug_on THEN
8439           WSH_DEBUG_SV.log(l_module_name,'Locking for Delivery id ',l_delivery_id1);
8440           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_VALIDATIONS.has_lines',WSH_DEBUG_SV.C_PROC_LEVEL);
8441         END IF;
8442 
8443     -- J-IB-NPARIKH-{
8444     --
8445     -- Determine if delivery has any non-container lines
8446     --
8447     l_has_lines := WSH_DELIVERY_VALIDATIONS.has_lines
8448                         (
8449                             p_delivery_id => p_delivery_id
8450                         );
8451     --
8452     -- J-IB-NPARIKH-}
8453 
8454 
8455     FOR i IN P_REC_OF_DETAIL_IDS.FIRST .. P_REC_OF_DETAIL_IDS.LAST
8456   LOOP
8457 
8458     IF (p_delivery_id <> -9999) THEN
8459       /* assigning it to a delivery */
8460        --
8461        IF l_debug_on THEN
8462                            WSH_DEBUG_SV.log(l_module_name,'Delivery id ',p_rec_of_detail_ids(i));
8463 
8464            WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_DETAIL_TO_DELIVERY',WSH_DEBUG_SV.C_PROC_LEVEL);
8465        END IF;
8466        --
8467        wsh_delivery_details_actions.assign_detail_to_delivery(
8468           p_detail_id => P_REC_OF_DETAIL_IDS(i),
8469           p_delivery_id => p_delivery_id,
8470           x_return_status => x_return_status,
8471           x_dlvy_has_lines          => l_has_lines,   -- J-IB-NPARIKH
8472           x_dlvy_freight_terms_code => l_dlvy_freight_terms_code   -- J-IB-NPARIKH
8473                 );
8474 
8475       IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
8476         IF (x_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
8477           x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8478           l_num_errors := l_num_errors + 1;
8479         ELSIF (x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
8480           x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8481           l_num_warnings := l_num_warnings + 1;
8482         END IF;
8483         goto start_over;
8484       /* H project : pricing integration csun , need to mark the reprice
8485                      flag if any of the delivery detail is assigned */
8486       ELSE
8487          l_scc_unassign_from_del := l_scc_unassign_from_del + 1;
8488       END IF;
8489       END IF;
8490 
8491     IF (p_cont_ins_id <> -9999) THEN
8492                          -- J: W/V Changes
8493                          -- replaced the direct update with Assign_Detail_To_Cont API
8494                          wsh_delivery_details_actions.Assign_Detail_To_Cont(
8495                            p_detail_id        => P_REC_OF_DETAIL_IDS(i),
8496                            p_parent_detail_id => p_cont_ins_id,
8497                            x_return_status    => x_return_status);
8498 
8499        IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
8500         IF (x_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
8501           x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8502           l_num_errors := l_num_errors + 1;
8503         ELSIF (x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
8504           x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8505           l_num_warnings := l_num_warnings + 1;
8506         END IF;
8507         goto start_over;
8508        /* H project : pricing integration csun , need to mark the reprice
8509                      flag if any of the delivery detail is assigned */
8510        ELSE
8511                            l_scc_unassign_from_con  :=  l_scc_unassign_from_con + 1;
8512        END IF;
8513 
8514     END IF;
8515       <<start_over>>
8516       NULL;
8517   END LOOP;
8518 
8519         IF l_debug_on THEN
8520           WSH_DEBUG_SV.log(l_module_name,
8521                        'l_scc_unassign_from_del',
8522                         l_scc_unassign_from_del);
8523           WSH_DEBUG_SV.log(l_module_name,
8524                        'l_scc_unassign_from_con',
8525                         l_scc_unassign_from_con);
8526         END IF;
8527 
8528   IF (l_num_errors > 0) THEN
8529     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8530     --
8531     IF l_debug_on THEN
8532         WSH_DEBUG_SV.log(l_module_name,'Ret status is error',l_num_errors);
8533         WSH_DEBUG_SV.pop(l_module_name);
8534     END IF;
8535     --
8536     return;
8537   ELSIF (l_num_warnings > 0) THEN
8538     x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8539   END IF;
8540 
8541 
8542   /* H projects: pricing integration csun get the delivery id the container is
8543   assigned to  and mark the delivery */
8544   IF l_scc_unassign_from_del > 0  THEN
8545       m := m + 1;
8546       l_del_tab(m) := p_delivery_id;
8547   END IF;
8548   IF l_scc_unassign_from_con > 0 THEN
8549      OPEN c_get_del_from_container(p_cont_ins_id) ;
8550      FETCH c_get_del_from_container INTO l_delivery_id;
8551      CLOSE c_get_del_from_container;
8552      IF l_delivery_id <> 0 and l_delivery_id IS NOT NULL THEN
8553         m := m + 1;
8554         l_del_tab(m) := l_delivery_id;
8555      END IF;
8556   END IF;
8557         IF l_del_tab.count > 0 THEN
8558     --
8559     IF l_debug_on THEN
8560         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
8561     END IF;
8562     --
8563     WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
8564        p_entity_type => 'DELIVERY',
8565        p_entity_ids   => l_del_tab,
8566        x_return_status => l_return_status);
8567     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8568        raise mark_reprice_error;
8569     END IF;
8570    END IF;
8571 
8572 
8573 --
8574 IF l_debug_on THEN
8575     WSH_DEBUG_SV.pop(l_module_name);
8576 END IF;
8577 --
8578   exception
8579   WHEN mark_reprice_error THEN
8580     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8581     fnd_message.SET_name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
8582     wsh_util_core.add_message(x_return_status,l_module_name);
8583 
8584 --
8585 IF l_debug_on THEN
8586     WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
8587     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
8588 END IF;
8589 --
8590         WHEN delivery_id_locked THEN
8591           x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8592     fnd_message.SET_name('WSH', 'WSH_NO_LOCK');
8593     wsh_util_core.add_message(x_return_status,l_module_name);
8594           --
8595           IF l_debug_on THEN
8596             WSH_DEBUG_SV.logmsg(l_module_name,'Delivery Id Locked exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
8597               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION : DELIVERY_ID_LOCKED');
8598           END IF;
8599           --
8600           return;
8601 
8602 --
8603 IF l_debug_on THEN
8604     WSH_DEBUG_SV.logmsg(l_module_name,'DELIVERY_ID_LOCKED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
8605     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:DELIVERY_ID_LOCKED');
8606 END IF;
8607 --
8608   WHEN others THEN
8609     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8610     wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_MULTIPLE_DETAILS',l_module_name);
8611 
8612 --
8613 IF l_debug_on THEN
8614     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
8615     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
8616 END IF;
8617 --
8618 END Assign_Multiple_Details;
8619 
8620 
8621 
8622 /*************************/
8623 /*   CODE FOR AUTO PACKING */
8624 -- This API has been created to be called
8625 -- from Auto Pack Lines
8626 -- Purpose is to split a delivery line as many times
8627 -- as required by just one call , rather than calling
8628 -- Split API multiple times
8629 
8630 --
8631 --Procedure:
8632 --Parameters:    p_from_detail_id
8633 --          p_req_quantity
8634 --          p_new_detail_id
8635 --          x_return_status
8636 --Desription:
8637 --        Splits a delivery detail according the new requested
8638 --        quantity. The newly created the detail has the requested
8639 --        quantity as p_req_quantity and the old detail has the
8640 --
8641 -- fabdi start : PICK CONFIRM
8642 --added a new parameter called p_req_quantity2      requested quantity as requested_quantity - p_requested_quantity
8643 -- fabdi end : PICK CONFIRM
8644 -- HW BUG#:1636578 added a new parameter p_converted_flag
8645 
8646 /*****************************************************
8647   SPLIT_DELIVERY_DETAILS_BULK api
8648 *****************************************************/
8649 PROCEDURE Split_Delivery_Details_Bulk (
8650 p_from_detail_id     IN  NUMBER,
8651 p_req_quantity       IN OUT NOCOPY  NUMBER,
8652 p_unassign_flag     IN  VARCHAR2 ,
8653 p_req_quantity2     IN  NUMBER ,
8654 p_converted_flag     IN VARCHAR2,
8655 p_manual_split   IN VARCHAR2 ,
8656 p_num_of_split        IN NUMBER ,       -- for empty container cases
8657 x_new_detail_id      OUT NOCOPY  NUMBER,
8658 x_dd_id_tab      OUT NOCOPY  WSH_UTIL_CORE.id_tab_type,
8659 x_return_status     OUT NOCOPY  VARCHAR2
8660 )
8661 IS
8662 
8663 l_new_delivery_detail_id number;
8664 -- HW OPMCONV. Removed OPM variables
8665 
8666 -- HW OPMCONV - Removed Format of qty2
8667 l_qty2            NUMBER;
8668 l_split_shipped_qty2      NUMBER(19,9):= NULL;
8669 -- HW BUG#:1636578 variable to calculate new qty2
8670 l_new_req_qty2 NUMBER;
8671 l_original_shipped_qty2    NUMBER(19,9):= NULL;
8672 
8673 
8674 l_new_req_qty   NUMBER;
8675 l_new_pick_qty  NUMBER;
8676 
8677 l_new_pick_qty2 NUMBER;
8678 
8679 l_delivery_id  number;
8680 l_parent_delivery_detail_id number;
8681 assignment number;
8682 l_delivery_assignment_id number;
8683 detail_rowid VARCHAR2(30);
8684 assignment_rowid VARCHAR2(30);
8685 total number;
8686 l_cr_dt_status varchar2(30);
8687 l_cr_assg_status varchar2(30);
8688 l_output_quantity number;
8689 l_return_status   varchar2(1);
8690 l_qty_return_status varchar2(30);
8691 
8692 chk_decimal_qty_failed exception;
8693 quantity_over EXCEPTION;
8694 negative_qty  EXCEPTION;
8695 zero_qty    EXCEPTION;
8696 /*   H integration: Pricing integration csun
8697    mark reprice required flag when split_delivery_details
8698  */
8699 l_entity_ids   WSH_UTIL_CORE.id_tab_type;
8700 reprice_required_err   EXCEPTION;
8701 l_delivery_assignments_info WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_Type;
8702 l_delivery_details_info WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type;
8703 l_split_weight number;
8704 l_split_volume number;
8705 l_split_return_status varchar2(30);
8706 l_shipped_quantity     NUMBER := NULL;
8707 l_old_stage_qty      NUMBER := NULL;
8708 l_ser_qty          NUMBER := NULL;
8709 
8710 
8711 l_dd_id_tab     WSH_UTIL_CORE.id_tab_type;
8712 l_num_of_split   NUMBER;
8713 
8714   old_delivery_detail_rec SplitDetailRecType;
8715 
8716 l_inv_controls_rec   WSH_DELIVERY_DETAILS_INV.inv_control_flag_rec;
8717 
8718 
8719 -- Bug 2637876
8720 l_original_shipped_qty   NUMBER;
8721 l_split_shipped_qty   NUMBER;
8722 l_serial_tab              WSH_DELIVERY_DETAILS_ACTIONS.serial_tab;
8723 i NUMBER;
8724 j NUMBER;
8725 l_serial_orig_rec WSH_DELIVERY_DETAILS_ACTIONS.SplitDetailRecType;
8726 l_new_serial_rec WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type;
8727 l_transaction_id_tab     WSH_UTIL_CORE.id_tab_type;
8728 l_serial_number WSH_DELIVERY_DETAILS.serial_number%TYPE;
8729 TYPE l_sr_no_tab IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
8730 l_serial_number_tab l_sr_no_tab;
8731 l_id1 NUMBER;
8732 l_s1 VARCHAR2(30);
8733 
8734 --
8735 l_debug_on BOOLEAN;
8736 --
8737 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'SPLIT_DELIVERY_DETAILS_BULK';
8738 --
8739 BEGIN
8740   --
8741   --
8742   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
8743   --
8744   IF l_debug_on IS NULL
8745   THEN
8746       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
8747   END IF;
8748   --
8749   IF l_debug_on THEN
8750       WSH_DEBUG_SV.push(l_module_name);
8751       --
8752       WSH_DEBUG_SV.log(l_module_name,'P_FROM_DETAIL_ID',P_FROM_DETAIL_ID);
8753       WSH_DEBUG_SV.log(l_module_name,'P_REQ_QUANTITY',P_REQ_QUANTITY);
8754       WSH_DEBUG_SV.log(l_module_name,'P_UNASSIGN_FLAG',P_UNASSIGN_FLAG);
8755       WSH_DEBUG_SV.log(l_module_name,'P_REQ_QUANTITY2',P_REQ_QUANTITY2);
8756       WSH_DEBUG_SV.log(l_module_name,'P_CONVERTED_FLAG',P_CONVERTED_FLAG);
8757       WSH_DEBUG_SV.log(l_module_name,'P_MANUAL_SPLIT',P_MANUAL_SPLIT);
8758   END IF;
8759   --
8760   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8761 
8762   OPEN c_split_detail_info(p_from_detail_id);
8763   FETCH c_split_detail_info into old_delivery_detail_rec;
8764   CLOSE c_split_detail_info;
8765 
8766     IF l_debug_on THEN
8767        WSH_DEBUG_SV.log(l_module_name,'delivery_detail_id',
8768                                old_delivery_detail_rec.delivery_detail_id);
8769        WSH_DEBUG_SV.log(l_module_name,'picked_quantity',
8770                                old_delivery_detail_rec.picked_quantity);
8771        WSH_DEBUG_SV.log(l_module_name,'organization_id',
8772                                old_delivery_detail_rec.organization_id);
8773        WSH_DEBUG_SV.log(l_module_name,'inventory_item_id',
8774                                old_delivery_detail_rec.inventory_item_id);
8775        WSH_DEBUG_SV.log(l_module_name,'requested_quantity_uom',
8776                                old_delivery_detail_rec.requested_quantity_uom);
8777     END IF;
8778 
8779   -- Bug 2419301 : Set oe_interfaced_flag to MISS CHAR so that create_new_detail_from_old API
8780   --               determines the value of oe_interfaced_flag for newly created dd
8781   old_delivery_detail_rec.oe_interfaced_flag:= NULL;
8782 
8783 
8784   -- Bug 1289812
8785   -- check if this split is valid operation
8786   IF (p_req_quantity >= NVL(old_delivery_detail_rec.picked_quantity,
8787                   old_delivery_detail_rec.requested_quantity)) THEN
8788   RAISE quantity_over;
8789   END IF;
8790   -- Bug 1299636
8791   -- check if this quantity to split is positive
8792   IF (p_req_quantity = 0) THEN
8793   RAISE zero_qty;
8794   ELSIF (p_req_quantity < 0) THEN
8795   RAISE negative_qty;
8796   END IF;
8797   l_qty2 := p_req_quantity2 ;
8798 
8799   /* need to validate the quantity passed meets the decimal quantity
8800    standard */
8801 
8802   --Check if org is a process one or not for the current record
8803   --
8804 -- HW OPMCONV - Removed checking for process org
8805 
8806          --  Patch J:  Catch Weights
8807          --  Need to split the secondary quantity in proportion to the primary quantity.
8808          --  Catch weight support currently only for non-opm lines.
8809 
8810          IF old_delivery_detail_rec.picked_quantity2 IS NOT NULL and p_req_quantity2 IS NULL
8811             and (NVL(old_delivery_detail_rec.picked_quantity,0) <> 0) THEN
8812 
8813             l_qty2 :=  old_delivery_detail_rec.picked_quantity2 * (p_req_quantity/old_delivery_detail_rec.picked_quantity);
8814             l_qty2 :=  round(l_qty2, 5);
8815 
8816          ELSE
8817 
8818             l_qty2 := p_req_quantity2 ;
8819 
8820          END IF;
8821 
8822 
8823    --
8824    IF l_debug_on THEN
8825        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
8826    END IF;
8827    --
8828    WSH_DETAILS_VALIDATIONS.check_decimal_quantity(
8829         p_item_id    => old_delivery_detail_rec.inventory_item_id,
8830         p_organization_id => old_delivery_detail_rec.organization_id,
8831         p_input_quantity  => p_req_quantity,
8832         p_uom_code    => old_delivery_detail_rec.requested_quantity_UOM,
8833         x_output_quantity => l_output_quantity,
8834         x_return_status   => l_qty_return_status);
8835 
8836    IF (l_qty_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
8837     RAISE chk_decimal_qty_failed;
8838    END IF;
8839    IF (l_output_quantity IS not NULL) THEN
8840      p_req_quantity := l_output_quantity;
8841    END IF;
8842 
8843   --
8844   IF l_debug_on THEN
8845       WSH_DEBUG_SV.logmsg(l_module_name, 'BEFORE CALLING SPLIT_DETAIL_INT_BULK AND P_REQ_QUANTITY IS '||P_REQ_QUANTITY  );
8846       WSH_DEBUG_SV.logmsg(l_module_name, 'BEFORE CALLING SPLIT_DETAIL_INT_BULK AND P_QUANTITY_TO_SPLIT2 IS '||L_QTY2  );
8847   END IF;
8848   --
8849 
8850 
8851 
8852 -- HW 2735317. Need to branch
8853 -- HW OPMCONV - Removed branching
8854 
8855 -- Fix for Bug 2637876 begins here
8856 -- to split serial numbers while auto packing
8857 
8858 -- Delete the PL SQL tables
8859   l_serial_tab.delete;
8860   l_dd_id_tab.delete;
8861   l_transaction_id_tab.delete;
8862   l_serial_number_tab.delete;
8863 
8864 -- Only for cases where transaction temp id is not null
8865   IF old_delivery_detail_rec.transaction_temp_id IS NOT NULL THEN
8866 
8867     l_serial_orig_rec := old_delivery_detail_rec; -- use old record
8868     l_original_shipped_qty := old_delivery_detail_rec.shipped_quantity;
8869     l_split_shipped_qty := p_req_quantity;
8870 
8871     j := 0;
8872 
8873     FOR i IN 1..p_num_of_split
8874     LOOP
8875 -- recalculate the shipped quantity
8876     l_original_shipped_qty := l_original_shipped_qty - l_split_shipped_qty;
8877     Split_Serial_Numbers_INT(x_old_detail_rec  => l_serial_orig_rec,
8878        x_new_delivery_detail_rec => l_new_serial_rec,
8879        p_old_shipped_quantity=> l_original_shipped_qty,
8880        p_new_shipped_quantity=> l_split_shipped_qty,
8881        x_return_status  => l_split_return_status);
8882 
8883     j := j + 1;
8884 
8885     l_transaction_id_tab(j) := l_new_serial_rec.transaction_temp_id;
8886     l_serial_number_tab(j) := l_new_serial_rec.serial_number;
8887 
8888     l_serial_tab(j).transaction_temp_id := l_new_serial_rec.transaction_temp_id;
8889     l_serial_tab(j).serial_number := l_new_serial_rec.serial_number;
8890     l_serial_tab(j).to_serial_number := l_new_serial_rec.to_serial_number;
8891 
8892     END LOOP;
8893 
8894     old_delivery_detail_rec.serial_number := l_serial_orig_rec.serial_number;
8895     old_delivery_detail_rec.transaction_temp_id := l_serial_orig_rec.transaction_temp_id;
8896 
8897     IF l_debug_on THEN
8898       WSH_DEBUG_SV.log(l_module_name,'Old DD id',old_delivery_detail_rec.delivery_detail_id);
8899       WSH_DEBUG_SV.log(l_module_name,'Old serial Number',old_delivery_detail_rec.serial_number);
8900       WSH_DEBUG_SV.log(l_module_name,'Old Temp id',old_delivery_detail_rec.transaction_temp_id);
8901       WSH_DEBUG_SV.log(l_module_name,'l_transaction_id_tab.COUNT',l_transaction_id_tab.count);
8902       WSH_DEBUG_SV.log(l_module_name,'l_serial_number_tab.COUNT',l_serial_number_tab.count);
8903       WSH_DEBUG_SV.log(l_module_name,'l_serial_tab.COUNT',l_serial_tab.count);
8904     END IF;
8905 
8906   END IF;
8907 
8908 -- HW OPMCONV. Removed parameter  l_process_flag
8909   Split_Detail_INT_Bulk(
8910        p_old_delivery_detail_rec => old_delivery_detail_rec,
8911        p_quantity_to_split     => p_req_quantity,
8912        p_quantity_to_split2   => l_qty2,
8913        p_unassign_flag       => p_unassign_flag,
8914        p_converted_flag     => p_converted_flag,
8915        p_manual_split     => p_manual_split,
8916        p_num_of_split               => p_num_of_split,
8917        x_split_detail_id     => x_new_detail_id,
8918        x_return_status       => x_return_status,
8919        x_dd_id_tab       => l_dd_id_tab
8920                   );
8921 
8922  -- Message will be set in split_detail_int_bulk
8923    IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
8924                           WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
8925                          ) THEN
8926      return;
8927    END IF;
8928 
8929    x_dd_id_tab := l_dd_id_tab;
8930 
8931 -- HW 2735317. Need to branch
8932 -- HW OPMCONV - Removed branching
8933   IF (old_delivery_detail_rec.transaction_temp_id IS NOT NULL
8934       OR old_delivery_detail_rec.serial_number IS NOT NULL) THEN
8935 
8936     -- Bug 4455732 : Combining transaction_temp_id and serial_number update into single cursor
8937     -- since single quantity detail can have transaction_temp_id also.
8938     FORALL i IN 1..l_dd_id_tab.count
8939     UPDATE wsh_delivery_details
8940        SET serial_number = decode(l_serial_number_tab(i),FND_API.G_MISS_CHAR,NULL,
8941                                    NULL,serial_number,l_serial_number_tab(i)) ,
8942            transaction_temp_id = decode(l_transaction_id_tab(i),FND_API.G_MISS_NUM,NULL,
8943                                          NULL,transaction_temp_id,l_transaction_id_tab(i))
8944      WHERE delivery_detail_id = l_dd_id_tab(i);
8945 
8946   END IF;  -- end of transaction temp id is not null
8947 
8948 
8949   /*  H integration: Pricing integration csun
8950     mark repirce required flag when split delivery details
8951    */
8952    l_entity_ids(1) := old_delivery_detail_rec.delivery_detail_id;
8953    --
8954    IF l_debug_on THEN
8955        WSH_DEBUG_SV.log(l_module_name,'entity id 1-',l_entity_ids(1));
8956        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
8957    END IF;
8958    --
8959    WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
8960        p_entity_type => 'DELIVERY_DETAIL',
8961        p_entity_ids   => l_entity_ids,
8962        x_return_status  => l_return_status);
8963    IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
8964                           WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
8965                          ) THEN
8966       raise reprice_required_err;
8967    END IF;
8968 
8969 --
8970 IF l_debug_on THEN
8971     WSH_DEBUG_SV.pop(l_module_name);
8972 END IF;
8973 --
8974   EXCEPTION
8975   WHEN chk_decimal_qty_failed THEN
8976     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8977     fnd_message.set_name('WSH', 'WSH_DET_DECIMAL_QTY_NOT_VALID');
8978     wsh_util_core.add_message(x_return_status,l_module_name);
8979     --
8980     IF l_debug_on THEN
8981         WSH_DEBUG_SV.logmsg(l_module_name,'CHK_DECIMAL_QTY_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
8982         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CHK_DECIMAL_QTY_FAILED');
8983     END IF;
8984     --
8985   WHEN quantity_over THEN
8986     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8987     fnd_message.set_name('WSH', 'WSH_DET_SPLIT_EXCEED');
8988     wsh_util_core.add_message(x_return_status,l_module_name);
8989     --
8990     IF l_debug_on THEN
8991         WSH_DEBUG_SV.logmsg(l_module_name,'QUANTITY_OVER exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
8992         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:QUANTITY_OVER');
8993     END IF;
8994     --
8995   WHEN zero_qty THEN
8996     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8997     fnd_message.set_name('WSH', 'WSH_NO_ZERO_NUM');
8998     wsh_util_core.add_message(x_return_status,l_module_name);
8999     --
9000     IF l_debug_on THEN
9001         WSH_DEBUG_SV.logmsg(l_module_name,'ZERO_QTY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
9002         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:ZERO_QTY');
9003     END IF;
9004     --
9005   WHEN negative_qty THEN
9006     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9007     fnd_message.set_name('WSH', 'WSH_NO_NEG_NUM');
9008     wsh_util_core.add_message(x_return_status,l_module_name);
9009     --
9010     IF l_debug_on THEN
9011         WSH_DEBUG_SV.logmsg(l_module_name,'NEGATIVE_QTY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
9012         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:NEGATIVE_QTY');
9013     END IF;
9014     --
9015   WHEN reprice_required_err THEN
9016     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9017     fnd_message.set_name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
9018     wsh_util_core.add_message(x_return_status,l_module_name);
9019     --
9020     IF l_debug_on THEN
9021         WSH_DEBUG_SV.logmsg(l_module_name,'REPRICE_REQUIRED_ERR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
9022         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:REPRICE_REQUIRED_ERR');
9023     END IF;
9024     --
9025   WHEN others THEN
9026     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9027     wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS_BULK',l_module_name);
9028     --
9029     IF l_debug_on THEN
9030         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
9031         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
9032     END IF;
9033     --
9034 END SPLIT_DELIVERY_DETAILS_BULK;
9035 
9036 /*****************************************************************
9037   Description :-
9038 
9039   Currently being used values of p_manual_split are
9040 
9041 NULL - default, normal mode of splitting backordered quantity
9042      then shipped quantity
9043 Y - split staged quantity
9044 C - split shipped quantity then backordered quantity (from packing code)
9045 B - called from update_inventory_info for OPM's use
9046 M - called from update_inventory_info for OPM's use
9047 S - called from update_inventory_info for OPM's use
9048 U - called from update_inventory_info for OPM's use
9049 
9050 *******************************************************************/
9051 
9052 -- This API is called from split_delivery_details_bulk with
9053 -- new parameters and functionality of Bulk creation of records
9054 
9055 /*****************************************************
9056 -----   SPLIT_DETAIL_INT_BULK api
9057 *****************************************************/
9058 -- HW OPMCONV - Removed parameter p_process_flag
9059 PROCEDURE Split_Detail_INT_bulk(
9060    p_old_delivery_detail_rec    IN  SplitDetailRecType,
9061    p_new_source_line_id  IN  NUMBER,
9062    p_quantity_to_split   IN  NUMBER,
9063    p_quantity_to_split2  IN  NUMBER  ,
9064    p_unassign_flag     IN  VARCHAR2 ,
9065    p_converted_flag   IN  VARCHAR2 ,
9066    p_manual_split   IN  VARCHAR2 ,
9067    p_split_sn     IN  VARCHAR2 ,
9068    p_num_of_split        IN NUMBER,        -- for empty container cases
9069    x_split_detail_id   OUT NOCOPY  NUMBER,
9070    x_return_status     OUT NOCOPY  VARCHAR2,
9071    x_dd_id_tab      OUT NOCOPY  WSH_UTIL_CORE.id_tab_type
9072   ) IS
9073 
9074 l_new_delivery_detail_id number;
9075 
9076 --HW OPMCONV - Removed OPM variables
9077 
9078 -- HW OPMCONV. Removed format of 19,9
9079 l_qty2            NUMBER;
9080 -- HW OPMCONV. Removed format of 19,9
9081 l_split_shipped_qty2      NUMBER := NULL;
9082 -- HW BUG#:1636578 variable to calculate new qty2
9083 l_new_req_qty2 NUMBER;
9084 -- HW OPMCONV. Removed format of 19,9
9085 l_original_shipped_qty2    NUMBER := NULL;
9086 
9087 l_new_req_qty   NUMBER;
9088 l_new_pick_qty  NUMBER;
9089 -- HW OPMCONV. No need for this variable anymore
9090 --l_new_pick_qty2 NUMBER;
9091 
9092 l_delivery_id  number;
9093 l_parent_delivery_detail_id number;
9094 assignment number;
9095 l_delivery_assignment_id number;
9096 assignment_rowid VARCHAR2(30);
9097 total number;
9098 l_cr_dt_status varchar2(30);
9099 l_cr_assg_status varchar2(30);
9100 l_output_quantity number;
9101 l_qty_return_status varchar2(30);
9102 new_det_wt_vol_failed exception;
9103 old_det_wt_vol_failed exception;
9104 l_delivery_assignments_info WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_Type;
9105 l_delivery_details_info WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type;
9106 l_split_weight number;
9107 l_split_volume number;
9108 l_split_return_status varchar2(30);
9109 l_shipped_quantity     NUMBER := NULL;
9110 l_old_stage_qty      NUMBER := NULL;
9111 l_ser_qty          NUMBER := NULL;
9112 
9113 l_original_shipped_qty   NUMBER := NULL;
9114 l_original_cc_qty     NUMBER := NULL;
9115 l_split_shipped_qty  NUMBER := NULL;
9116 l_split_cc_qty      NUMBER := NULL;
9117 -- HW OPMCONV. Removed format of 19,9
9118 l_split_cc_qty2    NUMBER := NULL;
9119 -- HW OPMCONV. Removed format of 19,9
9120 l_original_cc_qty2     NUMBER := NULL;
9121 l_return_status     VARCHAR2(30);
9122 -- HW OPMCONV - Removed OPM excpetion
9123 
9124 -- J: W/V Changes
9125 l_total_gross_wt NUMBER;
9126 l_total_net_wt   NUMBER;
9127 l_total_vol      NUMBER;
9128 l_org_wv_qty     NUMBER;
9129 l_new_wv_qty     NUMBER;
9130 l_final_req_qty  NUMBER; --bug# 6689448 (replenishment project)
9131 
9132 l_inv_controls_rec   WSH_DELIVERY_DETAILS_INV.inv_control_flag_rec;
9133 
9134 
9135 WSH_SN_SPLIT_ERR        EXCEPTION;
9136 WSH_NO_DATA_FOUND                               EXCEPTION;
9137 
9138 l_num_of_split        NUMBER; -- added for BULK Auto packing
9139 l_dd_id_tab           WSH_UTIL_CORE.id_tab_type;
9140 l_da_id_tab           WSH_UTIL_CORE.id_tab_type;
9141 
9142 l_updated_delivery_detail_rec          SplitDetailRecType;
9143 
9144 l_req_qty_update_index    NUMBER;
9145 -- HW Added qty2
9146 l_req_qty2_update_index    NUMBER;
9147 
9148 CURSOR c_get_req_pick_qty(p_del_det IN NUMBER) IS
9149 SELECT requested_quantity, picked_quantity,requested_quantity2
9150 FROM wsh_delivery_details
9151 WHERE delivery_detail_id = p_del_det;
9152 
9153 
9154 
9155 -- Bug 2734868
9156 l_requested_quantity WSH_DELIVERY_DETAILS.requested_quantity%TYPE;
9157 -- HW 12345 Added qty2
9158 l_requested_quantity2 WSH_DELIVERY_DETAILS.requested_quantity%TYPE;
9159 l_picked_quantity WSH_DELIVERY_DETAILS.picked_quantity%TYPE;
9160 wsh_split_error EXCEPTION;
9161 
9162 l_detail_tab    WSH_UTIL_CORE.id_tab_type; -- DBI Project
9163 l_dbi_rs        VARCHAR2(1); -- Return Status from DBI API
9164 
9165 --
9166 l_action VARCHAR2(100) := 'SPLIT-LINE';
9167 --
9168 l_debug_on BOOLEAN;
9169 --
9170 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'SPLIT_DETAIL_INT_BULK';
9171 --
9172 BEGIN
9173   --
9174   --
9175   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
9176   --
9177   IF l_debug_on IS NULL
9178   THEN
9179       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
9180   END IF;
9181   --
9182   IF l_debug_on THEN
9183       WSH_DEBUG_SV.push(l_module_name);
9184       --
9185       WSH_DEBUG_SV.log(l_module_name,'P_NEW_SOURCE_LINE_ID',P_NEW_SOURCE_LINE_ID);
9186       WSH_DEBUG_SV.log(l_module_name,'P_QUANTITY_TO_SPLIT',P_QUANTITY_TO_SPLIT);
9187       WSH_DEBUG_SV.log(l_module_name,'P_QUANTITY_TO_SPLIT2',P_QUANTITY_TO_SPLIT2);
9188       WSH_DEBUG_SV.log(l_module_name,'P_UNASSIGN_FLAG',P_UNASSIGN_FLAG);
9189       WSH_DEBUG_SV.log(l_module_name,'P_CONVERTED_FLAG',P_CONVERTED_FLAG);
9190       WSH_DEBUG_SV.log(l_module_name,'P_MANUAL_SPLIT',P_MANUAL_SPLIT);
9191       WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_SN',P_SPLIT_SN);
9192       WSH_DEBUG_SV.log(l_module_name,'old shipped_quantity',
9193                                     p_old_delivery_detail_rec.shipped_quantity);
9194       WSH_DEBUG_SV.log(l_module_name,'old cycle_count_quantity',
9195                                 p_old_delivery_detail_rec.cycle_count_quantity);
9196       WSH_DEBUG_SV.log(l_module_name,'old cycle_count_quantity2',
9197                                p_old_delivery_detail_rec.cycle_count_quantity2);
9198       WSH_DEBUG_SV.log(l_module_name,'old shipped_quantity2',
9199                                p_old_delivery_detail_rec.shipped_quantity2);
9200       WSH_DEBUG_SV.log(l_module_name,'old picked_quantity',
9201                                p_old_delivery_detail_rec.picked_quantity);
9202       WSH_DEBUG_SV.log(l_module_name,'old net_weight',
9203                                p_old_delivery_detail_rec.net_weight);
9204       WSH_DEBUG_SV.log(l_module_name,'old requested_quantity',
9205                                p_old_delivery_detail_rec.requested_quantity);
9206       WSH_DEBUG_SV.log(l_module_name,'old inventory_item_id',
9207                                p_old_delivery_detail_rec.inventory_item_id);
9208       WSH_DEBUG_SV.log(l_module_name,'old volume',
9209                                p_old_delivery_detail_rec.volume);
9210       WSH_DEBUG_SV.log(l_module_name,'old weight_uom_code',
9211                                p_old_delivery_detail_rec.weight_uom_code);
9212       WSH_DEBUG_SV.log(l_module_name,'old volume_uom_code',
9213                                p_old_delivery_detail_rec.volume_uom_code);
9214       WSH_DEBUG_SV.log(l_module_name,'old delivery_detail_id',
9215                                p_old_delivery_detail_rec.delivery_detail_id);
9216       WSH_DEBUG_SV.log(l_module_name,'old container_flag',
9217                                p_old_delivery_detail_rec.container_flag);
9218   END IF;
9219   --
9220   SAVEPOINT split_savepoint;
9221   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
9222 
9223   /* need to validate the quantity passed meets the decimal quantity
9224      standard */
9225 
9226 
9227 -- HW OPMCONV - Removed branching
9228 
9229   l_qty2 := p_quantity_to_split2;
9230 
9231     -- For bug 1307771. If shipped quantity is NULL.  Then leave the new
9232     -- shipped quantity to be NULL
9233   IF (p_old_delivery_detail_rec.shipped_quantity IS NULL AND p_old_delivery_detail_rec.cycle_count_quantity IS NULL) THEN
9234   l_split_shipped_qty := NULL;
9235   l_split_cc_qty := NULL;
9236   l_split_shipped_qty2 :=NULL;
9237   l_split_cc_qty2 := NULL;
9238 
9239   ELSIF (p_manual_split = 'C') THEN
9240 
9241     l_split_shipped_qty := LEAST(p_old_delivery_detail_rec.shipped_quantity,
9242                    p_quantity_to_split);
9243   l_split_shipped_qty2 := LEAST(p_old_delivery_detail_rec.shipped_quantity2,
9244                   p_quantity_to_split2);
9245     l_split_cc_qty := LEAST(p_old_delivery_detail_rec.cycle_count_quantity,
9246                 (p_quantity_to_split - nvl(l_split_shipped_qty,0)));
9247   l_split_cc_qty2 := LEAST(p_old_delivery_detail_rec.cycle_count_quantity2,
9248                (p_quantity_to_split2 - NVL(l_split_shipped_qty2,0)));
9249 
9250   l_original_shipped_qty := p_old_delivery_detail_rec.shipped_quantity     -
9251  l_split_shipped_qty;
9252   l_original_cc_qty   := p_old_delivery_detail_rec.cycle_count_quantity   -
9253  l_split_cc_qty;
9254   l_original_shipped_qty2 := p_old_delivery_detail_rec.shipped_quantity2   -
9255  l_split_shipped_qty2;
9256   l_original_cc_qty2    := p_old_delivery_detail_rec.cycle_count_quantity2 -
9257  l_split_cc_qty2;
9258 
9259  ELSIF (p_manual_split = 'Y') THEN
9260 
9261   /* bug 1983460
9262   if the call is from ship confirm to split only the stage quantity
9263    the split delivery detail has null shipped and cc quantities.
9264   */
9265 
9266     l_split_shipped_qty := NULL;
9267     l_split_cc_qty := NULL;
9268       l_split_shipped_qty2 :=NULL;
9269       l_split_cc_qty2 := NULL;
9270 
9271   /* bug 1983460
9272   since the split shipped and split cc quantities are null, we should
9273   leave the original shipped and original cc quantities as they are.
9274   */
9275 
9276   l_original_shipped_qty := p_old_delivery_detail_rec.shipped_quantity;
9277   l_original_cc_qty   := p_old_delivery_detail_rec.cycle_count_quantity;
9278   l_original_shipped_qty2 := p_old_delivery_detail_rec.shipped_quantity2;
9279 
9280   l_original_cc_qty2    := p_old_delivery_detail_rec.cycle_count_quantity2;
9281 
9282 
9283   ELSE
9284   -- use cc qty to split p_quantity_to_split before we use shipped qty to complete the quantity split
9285   --  (This takes care of splitting lines to backorder/cycle-count, for example.)
9286   -- assumption: the quantities' relationships are valid
9287 
9288   l_split_cc_qty  := LEAST(p_old_delivery_detail_rec.cycle_count_quantity,   p_quantity_to_split);
9289   l_split_cc_qty2 := LEAST(p_old_delivery_detail_rec.cycle_count_quantity2,  p_quantity_to_split2);
9290 
9291   -- fail-safe: NVL to ensure that shipped qtys can still be split even if cc qtys are NULL
9292   l_split_shipped_qty  := LEAST(p_old_delivery_detail_rec.shipped_quantity,  (p_quantity_to_split  - NVL(l_split_cc_qty,0)));
9293   l_split_shipped_qty2 := LEAST(p_old_delivery_detail_rec.shipped_quantity2, (p_quantity_to_split2 - NVL(l_split_cc_qty2,0)));
9294 
9295   -- update original line's quantities accordingly
9296   l_original_shipped_qty := p_old_delivery_detail_rec.shipped_quantity     - l_split_shipped_qty;
9297   l_original_cc_qty   := p_old_delivery_detail_rec.cycle_count_quantity   - l_split_cc_qty;
9298 
9299   l_original_shipped_qty2 := p_old_delivery_detail_rec.shipped_quantity2   - l_split_shipped_qty2;
9300   l_original_cc_qty2    := p_old_delivery_detail_rec.cycle_count_quantity2 - l_split_cc_qty2;
9301   END IF;
9302 
9303   --
9304   /*
9305   IF l_debug_on THEN
9306       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.INITIALIZE_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
9307   END IF;
9308   --
9309   WSH_DELIVERY_DETAILS_PKG.initialize_detail(
9310               p_delivery_detail_rec  =>  l_delivery_details_info);
9311   */
9312 
9313   IF p_old_delivery_detail_rec.picked_quantity IS NULL THEN
9314   l_delivery_details_info.requested_quantity := p_quantity_to_split;
9315   ELSE
9316   l_delivery_details_info.requested_quantity := LEAST(p_old_delivery_detail_rec.requested_quantity, p_quantity_to_split);
9317   l_delivery_details_info.picked_quantity := p_quantity_to_split;
9318 -- HW OPM for OM changes
9319 -- HW OPMCONV. No need to use   l_new_pick_qty2
9320 --l_delivery_details_info.picked_quantity2  := nvl(nvl(l_qty2,l_new_pick_qty2),FND_API.G_MISS_NUM);
9321 l_delivery_details_info.picked_quantity2  := nvl(l_qty2,FND_API.G_MISS_NUM);
9322 
9323   END IF;
9324 
9325   IF ( NVL(l_qty2, 0) = 0  OR l_qty2 < 0 ) THEN
9326   l_delivery_details_info.requested_quantity2 := FND_API.G_MISS_NUM;
9327   ELSE
9328   l_delivery_details_info.requested_quantity2 := l_qty2;
9329   END IF;
9330 
9331 -- Bug 2181132 in Bulk API
9332 -- pass the value which is input
9333    l_delivery_details_info.source_line_set_id :=
9334           p_old_delivery_detail_rec.source_line_set_id;
9335 
9336   IF p_new_source_line_id IS NOT NULL THEN
9337   l_delivery_details_info.source_line_id := p_new_source_line_id;
9338   END IF;
9339 
9340 
9341   -- J: W/V Changes
9342   IF p_old_delivery_detail_rec.wv_frozen_flag = 'Y' THEN
9343     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);
9344 
9345     IF (p_manual_split = 'Y') THEN
9346       -- p_manual_split is 'Y' only when splitting for staged delivery details during ship confirm
9347       -- Staged delivery details W/V should always be reset back to original W/V
9348       l_new_wv_qty := 0;
9349     ELSE
9350       SELECT NVL(decode(l_split_shipped_qty,FND_API.G_MISS_NUM,null,l_split_shipped_qty),
9351                         NVL(decode(l_delivery_details_info.picked_quantity,FND_API.G_MISS_NUM,null,l_delivery_details_info.picked_quantity),
9352                             decode(l_delivery_details_info.requested_quantity,FND_API.G_MISS_NUM,null,l_delivery_details_info.requested_quantity)))
9353       INTO   l_new_wv_qty
9354       FROM   dual;
9355     END IF;
9356 
9357     IF l_org_wv_qty <> 0 THEN
9358       l_delivery_details_info.gross_weight :=  round( (l_new_wv_qty/l_org_wv_qty) * p_old_delivery_detail_rec.gross_weight ,5);
9359       l_delivery_details_info.net_weight   :=  round( (l_new_wv_qty/l_org_wv_qty) * p_old_delivery_detail_rec.net_weight ,5);
9360       l_delivery_details_info.volume       :=  round( (l_new_wv_qty/l_org_wv_qty) * p_old_delivery_detail_rec.volume ,5);
9361     ELSE
9362       l_delivery_details_info.gross_weight := 0;
9363       l_delivery_details_info.net_weight   := 0;
9364       l_delivery_details_info.volume       := 0;
9365     END IF;
9366 
9367   END IF;
9368 
9369   IF (l_split_shipped_qty is not null and l_split_shipped_qty = 0) or (p_manual_split = 'Y') THEN
9370     l_delivery_details_info.wv_frozen_flag  := 'N';
9371   ELSE
9372     l_delivery_details_info.wv_frozen_flag  := p_old_delivery_detail_rec.wv_frozen_flag;
9373   END IF;
9374   l_delivery_details_info.weight_uom_code := p_old_delivery_detail_rec.weight_uom_code;
9375   l_delivery_details_info.volume_uom_code := p_old_delivery_detail_rec.volume_uom_code;
9376 
9377   l_delivery_details_info.shipped_quantity := nvl(l_split_shipped_qty,FND_API.G_MISS_NUM);
9378   IF l_debug_on THEN
9379      WSH_DEBUG_SV.log(l_module_name,'l_split_shipped_qty2',l_split_shipped_qty2);
9380   END IF;
9381   IF ( NVL(l_split_shipped_qty2, 0) = 0 ) THEN
9382   l_delivery_details_info.shipped_quantity2 := FND_API.G_MISS_NUM;
9383   ELSE
9384   l_delivery_details_info.shipped_quantity2 := l_split_shipped_qty2;
9385   END IF;
9386   IF ( NVL(l_qty2, 0) = 0 OR l_qty2 < 0  ) THEN
9387   l_delivery_details_info.cancelled_quantity2 := FND_API.G_MISS_NUM;
9388   ELSE
9389   -- Bug 2116595
9390   l_delivery_details_info.cancelled_quantity2 := FND_API.G_MISS_NUM;
9391   END IF;
9392 
9393   l_delivery_details_info.cycle_count_quantity := nvl(l_split_cc_qty,FND_API.G_MISS_NUM);
9394 -- HW OPMCONV - No need to branch
9395 --  IF ( p_process_flag = FND_API.G_TRUE ) THEN
9396   l_delivery_details_info.cycle_count_quantity2 := nvl(l_split_cc_qty2,FND_API.G_MISS_NUM);
9397 --  END IF;
9398 
9399   -- Bug 2116595
9400   l_delivery_details_info.cancelled_quantity := FND_API.G_MISS_NUM;
9401   l_delivery_details_info.split_from_detail_id := p_old_delivery_detail_rec.delivery_detail_id;
9402 
9403   l_delivery_details_info.container_flag := p_old_delivery_detail_rec.container_flag;
9404   l_delivery_details_info.master_serial_number := FND_API.G_MISS_CHAR;
9405   l_delivery_details_info.serial_number := FND_API.G_MISS_CHAR;
9406   l_delivery_details_info.to_serial_number := FND_API.G_MISS_CHAR;
9407   l_delivery_details_info.transaction_temp_id := FND_API.G_MISS_NUM;
9408   l_delivery_details_info.last_update_date := SYSDATE;
9409   l_delivery_details_info.last_updated_by :=  FND_GLOBAL.USER_ID;
9410   l_delivery_details_info.last_update_login :=  FND_GLOBAL.LOGIN_ID;
9411   -- Bug 2419301
9412   l_delivery_details_info.oe_interfaced_flag := p_old_delivery_detail_rec.oe_interfaced_flag;
9413   --
9414   IF l_debug_on THEN
9415       WSH_DEBUG_SV.logmsg(l_module_name,  'SPLIT_DETAIL_INT_BULK: OE_INTERFACED_FLAG '||L_DELIVERY_DETAILS_INFO.OE_INTERFACED_FLAG  );
9416   END IF;
9417   --
9418 
9419   l_new_delivery_detail_id := NULL;
9420 
9421 
9422   l_updated_delivery_detail_rec := p_old_delivery_detail_rec;
9423 
9424 -- The Split Serial Number has not been tested
9425 -- this needs to be modified for Bulk split
9426 
9427 -- HW OPMCONV - Remove the whole branch since the code was commented
9428 
9429  l_num_of_split := p_num_of_split;
9430 
9431   --
9432   IF l_debug_on THEN
9433       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);
9434   END IF;
9435   --
9436 -- call to new API
9437 -- with a value for p_num_of_rec
9438   WSH_DELIVERY_DETAILS_PKG.create_dd_from_old_bulk(
9439       p_delivery_detail_rec  =>  l_delivery_details_info,
9440             p_delivery_detail_id    =>   p_old_delivery_detail_rec.delivery_detail_id,
9441                   p_num_of_rec            =>     l_num_of_split,
9442       x_dd_id_tab   =>   l_dd_id_tab,
9443       x_return_status         =>   l_cr_dt_status);
9444 
9445  -- Bug 2870267
9446   -- The bulk API above creates delivery details with a requested qty
9447   -- of l_delivery_details_info.requested_quantity for each of the new details created.
9448   -- However if we overpick, the sum of these requested qtys would add up to
9449   -- the picked qty and not the requested qty of the original line.
9450   -- We need to make sure that the sum of the requested quantities add up to the requested quantity
9451   -- of the original line, and that the extra requested quantities that add up to the
9452   -- original picked quantity are zeroed out.
9453 
9454   OPEN c_get_req_pick_qty (p_old_delivery_detail_rec.delivery_detail_id);
9455 
9456   FETCH c_get_req_pick_qty INTO l_requested_quantity, l_picked_quantity,
9457          l_requested_quantity2;
9458 
9459   IF c_get_req_pick_qty%NOTFOUND THEN
9460 
9461     RAISE WSH_NO_DATA_FOUND;
9462 
9463   END IF;
9464 
9465   CLOSE c_get_req_pick_qty;
9466 
9467   --bug# 6689448 (replenishment project) (begin) : call WMS for whenever there is split on replenishment requested
9468   -- delivery detail lines with the new quantity for the old delivery detail line on p_primary_quantity parameter.
9469   -- Inturn WMS creates a new replenishment record for p_split_delivery_detail_id with old delivery detail line old qty - old delivery detail line
9470   --  new quantity (p_primary_quantity).
9471   IF ( p_old_delivery_detail_rec.replenishment_status = 'R' and p_old_delivery_detail_rec.released_status in ('R','B')) THEN
9472   --{
9473       l_final_req_qty := l_requested_quantity;
9474       FOR i IN 1..l_dd_id_tab.count LOOP
9475       --{
9476           l_final_req_qty := l_final_req_qty - l_delivery_details_info.requested_quantity;
9477           IF ((l_final_req_qty = l_requested_quantity) OR (l_final_req_qty < 0)) THEN
9478               EXIT;
9479           END IF;
9480           IF l_debug_on THEN
9481               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WMS_REPLENISHMENT_PUB.UPDATE_DELIVERY_DETAIL' ,WSH_DEBUG_SV.C_PROC_LEVEL);
9482           END IF;
9483           WMS_REPLENISHMENT_PUB.UPDATE_DELIVERY_DETAIL(
9484                p_delivery_detail_id       => p_old_delivery_detail_rec.delivery_detail_id,
9485                p_primary_quantity         => l_final_req_qty,
9486                p_split_delivery_detail_id => l_dd_id_tab(i),
9487                x_return_status            => x_return_status );
9488           IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9489           --{
9490               rollback to split_savepoint;
9491               IF l_debug_on THEN
9492                   WSH_DEBUG_SV.logmsg(l_module_name,  'UNEXPECTED ERROR FROM WMS_REPLENISHMENT_PUB.UPDATE_DELIVERY_DETAIL');
9493                   WSH_DEBUG_SV.pop(l_module_name);
9494               END IF;
9495               RETURN;
9496           --}
9497           END IF;
9498       --}
9499       END LOOP;
9500   --}
9501   END IF;
9502   --bug# 6689448 (replenishment project):end
9503 
9504   IF (l_picked_quantity > l_requested_quantity) AND (l_delivery_details_info.requested_quantity <> 0)  THEN --{
9505 
9506 
9507      -- Calculate the index of the delivery detail from the created table at which the sum of the new
9508      -- requested quantities would equal (or exceed) the requested quantity of the original line.
9509 
9510      l_req_qty_update_index := CEIL(l_requested_quantity/l_delivery_details_info.requested_quantity);
9511 -- HW 12345 Added qty2
9512      IF ( l_delivery_details_info.requested_quantity2 <> 0 ) THEN
9513        l_req_qty2_update_index := CEIL(l_requested_quantity2/l_delivery_details_info.requested_quantity2);
9514      ELSE
9515        l_req_qty2_update_index := NULL;
9516      END IF;
9517 
9518      -- If not a clean split, we need to update the requested quantity of the delivery detail at this
9519      -- index such that the sum of the requested quantities of all the new delivery details before this index
9520      -- plus the requested qty at this index add up to the original requested quantity.
9521 
9522      IF l_req_qty_update_index > (l_requested_quantity/l_delivery_details_info.requested_quantity) THEN
9523 
9524         -- Bug 3178233 - Need to add the IF condition because the update will fail in the following example:
9525         --               requested_quantity = 3, picked_quantity = 4, and split quantity is 2
9526         --               l_req_qty_update_index = CEIL(3/2) = 2
9527         --               Update at l_dd_id_tab(l_req_qty_update_index) = l_dd_id_tab(2) is a non-exist value which will fail.
9528         IF l_req_qty_update_index <= l_dd_id_tab.count THEN
9529 -- 12345 HW added qty2
9530            update wsh_delivery_details
9531            set requested_quantity = l_requested_quantity - ((l_req_qty_update_index - 1) * l_delivery_details_info.requested_quantity),
9532                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))
9533            where delivery_detail_id = l_dd_id_tab(l_req_qty_update_index);
9534         END IF;
9535      END IF;
9536 
9537      -- Set the requested quantity to zero in all the newly created lines after the above index.
9538 
9539      FORALL i in (l_req_qty_update_index + 1) .. l_dd_id_tab.count
9540 -- HW added qty2
9541      update wsh_delivery_details
9542      set requested_quantity = 0,
9543          requested_quantity2 = 0
9544      where delivery_detail_id = l_dd_id_tab(i);
9545 
9546     --
9547     -- DBI Project,Above 2 updates for requested quantity need to be tracked for DBI Call
9548     -- These can be combined since both use l_dd_id_tab
9549     -- DBI Project
9550     -- Update of wsh_delivery_details where requested_quantity/released_status
9551     -- are changed, call DBI API after the update.
9552     -- DBI API will check if DBI is installed
9553     IF l_debug_on THEN
9554       WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail Count-',l_dd_id_tab.count);
9555     END IF;
9556     WSH_INTEGRATION.DBI_Update_Detail_Log
9557       (p_delivery_detail_id_tab => l_dd_id_tab,
9558        p_dml_type               => 'UPDATE',
9559        x_return_status          => l_dbi_rs);
9560 
9561     IF l_debug_on THEN
9562       WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
9563     END IF;
9564     -- Only Handle Unexpected error
9565     IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
9566       x_return_status := l_dbi_rs;
9567       rollback to split_savepoint;
9568       --
9569       IF l_debug_on THEN
9570         WSH_DEBUG_SV.pop(l_module_name);
9571       END IF;
9572       --
9573       RETURN;
9574     END IF;
9575     -- End of Code for DBI Project
9576     --
9577 
9578   END IF;  --}
9579 
9580   -- END Bug 2870267
9581 
9582 -- J: W/V Changes
9583   IF p_old_delivery_detail_rec.wv_frozen_flag = 'N' THEN
9584     -- Bug 4416863
9585     -- During Partial Shipping with the remain qty as staged, w/v value should not be
9586     -- deducted again from the original line since during entering shipped_quantity
9587     -- w/v has been calculated for the original line.
9588     IF (p_manual_split = 'Y') THEN
9589       l_total_net_wt   := 0;
9590       l_total_gross_wt := 0;
9591       l_total_vol      := 0;
9592     ELSE
9593     -- end bug 4416863
9594       IF l_debug_on THEN
9595         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DETAIL_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
9596       END IF;
9597 
9598       l_total_net_wt := 0;
9599       l_total_gross_wt := 0;
9600       l_total_vol := 0;
9601       FOR i in 1..l_dd_id_tab.count LOOP
9602 
9603         WSH_WV_UTILS.Detail_Weight_Volume(
9604           p_delivery_detail_id => l_dd_id_tab(i),
9605           p_update_flag        => 'Y',
9606           x_net_weight         => l_split_weight,
9607           x_volume             => l_split_volume,
9608           x_return_status      => l_split_return_status);
9609         IF (l_split_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
9610           RAISE new_det_wt_vol_failed;
9611         END IF;
9612 
9613         l_total_net_wt := l_total_net_wt + l_split_weight;
9614         l_total_vol := l_total_vol + l_split_volume;
9615 
9616       END LOOP;
9617       l_total_gross_wt := l_total_net_wt;
9618     END IF;
9619   ELSE
9620      l_total_net_wt   := p_num_of_split * l_delivery_details_info.net_weight;
9621      l_total_gross_wt := p_num_of_split * l_delivery_details_info.gross_weight;
9622      l_total_vol      := p_num_of_split * l_delivery_details_info.volume;
9623   END IF;
9624 
9625   l_delivery_assignments_info.type := 'S';
9626 
9627   IF (p_unassign_flag = 'N') THEN
9628     l_delivery_assignments_info.delivery_id := p_old_delivery_detail_rec.delivery_id;
9629     l_delivery_assignments_info.parent_delivery_detail_id := p_old_delivery_detail_rec.parent_delivery_detail_id;
9630     IF p_old_delivery_detail_rec.wda_type =  'C' THEN
9631        l_delivery_assignments_info.type := 'O';
9632        l_delivery_assignments_info.parent_delivery_detail_id := NULL;
9633     END IF;
9634   ELSE
9635     l_delivery_assignments_info.delivery_id := NULL;
9636     l_delivery_assignments_info.parent_delivery_detail_id := NULL;
9637   END IF;
9638 
9639   l_delivery_assignments_info.delivery_detail_id := l_new_delivery_detail_id;
9640   --
9641   IF l_debug_on THEN
9642       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.CREATE_DELIV_ASSIGNMENT_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
9643   END IF;
9644   --
9645 
9646   -- this is a bulk call
9647   -- with new parameter of p_num_of_rec
9648   -- and pass l_dd_id_tab which will pass the delivery detail id
9649   wsh_delivery_details_pkg.create_deliv_assignment_bulk(
9650       p_delivery_assignments_info => l_delivery_assignments_info,
9651                         p_num_of_rec => l_num_of_split,
9652                         p_dd_id_tab    => l_dd_id_tab,
9653       x_da_id_tab => l_da_id_tab,
9654       x_return_status => l_cr_assg_status
9655       );
9656 
9657  -- K: MDC: We need to create the consolidation records as well
9658  --         If necessary.
9659  IF (p_unassign_flag = 'N') AND (p_old_delivery_detail_rec.wda_type =  'C') THEN
9660 
9661     l_delivery_assignments_info.type := 'C';
9662     l_delivery_assignments_info.parent_delivery_id := p_old_delivery_detail_rec.parent_delivery_id;
9663     l_delivery_assignments_info.parent_delivery_detail_id := p_old_delivery_detail_rec.parent_delivery_detail_id;
9664 
9665     wsh_delivery_details_pkg.create_deliv_assignment_bulk(
9666                       p_delivery_assignments_info => l_delivery_assignments_info,
9667                       p_num_of_rec                => l_num_of_split,
9668                       p_dd_id_tab                 => l_dd_id_tab,
9669                       x_da_id_tab                 => l_da_id_tab,
9670                       x_return_status             => l_cr_assg_status
9671                    );
9672     IF l_cr_assg_status IN ( WSH_UTIL_CORE.G_RET_STS_ERROR,
9673                           WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
9674                         ) THEN
9675        x_return_status := l_cr_assg_status;
9676        return;
9677     END IF;
9678 
9679 
9680  END IF;
9681 
9682 /*2442099*/
9683   FOR i in 1..l_dd_id_tab.count
9684   LOOP
9685    Log_Exceptions(p_old_delivery_detail_rec.delivery_detail_id,l_dd_id_tab(i),l_delivery_assignments_info.delivery_id,l_action);
9686  END LOOP;
9687 
9688   -- this is FOR RETURN variable
9689   x_dd_id_tab := l_dd_id_tab;
9690 
9691   /* NC - Added the following for OPM  BUG#1675561 */
9692   /* LG BUG#:2005977 */
9693   /* LG new */
9694 
9695   --
9696 -- HW OPMCONV - Removed branching
9697 
9698   /* Bug 2177410, also update net_weight and volume of original delivery detail
9699    because non item does not use WSH_WV_UTILS.Detail_Weight_Volume to
9700    adjust the net_weight and volume  */
9701 
9702   x_split_detail_id := l_new_delivery_detail_id;
9703 
9704 -- update original shipped qty since this was not decremented correctly before.
9705 -- now decrement it with proper split number
9706 
9707 -- Bug 2734868
9708 -- If nvl(picked,requested) quantity is set to zero, error
9709 -- should not be allowed
9710 -- example in case of 12(req) - 12(pic) - 15(ship) when l_num_of_split = 7
9711 
9712   IF (nvl(GREATEST(l_picked_quantity - (l_num_of_split*p_quantity_to_split),0
9713                    ),
9714          GREATEST(l_requested_quantity - (l_num_of_split*l_delivery_details_info.requested_quantity),0
9715                   )
9716          ) <= 0
9717      )THEN
9718     IF l_debug_on THEN
9719       WSH_DEBUG_SV.log(l_module_name, 'CANNOT SPLIT, NEED TO REVISIT THE QUANTITIES');
9720     END IF;
9721 
9722     RAISE wsh_split_error;
9723 
9724   END IF;
9725 
9726 -- End of Bug 2734868
9727 
9728 -- OPM HW Included this fix in 3011758
9729 -- Modified requested_quantity2,picked_quantity2 and shipped_quantity2
9730 -- to be the same as quantity1s
9731 
9732   UPDATE wsh_delivery_details
9733   SET requested_quantity  = GREATEST(requested_quantity - (l_num_of_split*l_delivery_details_info.requested_quantity), 0),
9734     requested_quantity2   = GREATEST(requested_quantity2 -(l_num_of_split*l_qty2), 0),
9735      picked_quantity       = GREATEST(picked_quantity - (l_num_of_split*p_quantity_to_split),0),
9736 -- HW OPMCONV. No need to use l_new_pick_qty2
9737 --  picked_quantity2      = GREATEST(picked_quantity2 - (l_num_of_split* nvl(l_qty2,l_new_pick_qty2)),0),
9738     picked_quantity2      = GREATEST(picked_quantity2 - (l_num_of_split* l_qty2) ,0),
9739     --shipped_quantity    = l_original_shipped_qty - p_quantity_to_split,
9740     shipped_quantity    = l_original_shipped_qty - GREATEST((l_num_of_split -1) * p_quantity_to_split,0),
9741     shipped_quantity2   = l_original_shipped_qty2 - GREATEST((l_num_of_split -1) * nvl(l_qty2,0),0),
9742     --shipped_quantity2   = l_original_shipped_qty2 - ((greatest(l_num_of_split -1),0) * p_quantity_to_split),
9743     cycle_count_quantity  = l_original_cc_qty,
9744     cycle_count_quantity2 = l_original_cc_qty2,
9745     serial_number   = decode(l_updated_delivery_detail_rec.serial_number,FND_API.G_MISS_CHAR,NULL,
9746                                           NULL,serial_number,l_updated_delivery_detail_rec.serial_number),
9747     to_serial_number  = decode(l_updated_delivery_detail_rec.to_serial_number,FND_API.G_MISS_CHAR,NULL,
9748                                           NULL,to_serial_number,l_updated_delivery_detail_rec.to_serial_number),
9749     transaction_temp_id   = decode(l_updated_delivery_detail_rec.transaction_temp_id,FND_API.G_MISS_NUM,NULL,
9750                                           NULL,transaction_temp_id,l_updated_delivery_detail_rec.transaction_temp_id),
9751 -- J: W/V Changes
9752     gross_weight          =  gross_weight - l_total_gross_wt,
9753     net_weight            =  net_weight - l_total_net_wt,
9754     volume                =  volume - l_total_vol,
9755 -- End J: W/V Changes
9756     last_update_date   = SYSDATE,
9757     last_updated_by = FND_GLOBAL.USER_ID,
9758     last_update_login  = FND_GLOBAL.LOGIN_ID
9759   WHERE delivery_detail_id = p_old_delivery_detail_rec.delivery_detail_id;
9760 
9761   /* call the wv util to calculate the wv for the original detail too */
9762   --
9763   IF l_debug_on THEN
9764      WSH_DEBUG_SV.log(l_module_name,'l_delivery_details_info.requested_quantity'
9765                                ,l_delivery_details_info.requested_quantity);
9766      WSH_DEBUG_SV.log(l_module_name,'l_qty2',l_qty2);
9767      WSH_DEBUG_SV.log(l_module_name,'l_original_shipped_qty',
9768                                                       l_original_shipped_qty);
9769      WSH_DEBUG_SV.log(l_module_name,'l_original_cc_qty2',l_original_cc_qty2);
9770      WSH_DEBUG_SV.log(l_module_name,'l_original_cc_qty',l_original_cc_qty);
9771   END IF;
9772   --
9773 
9774   --
9775   -- DBI Project
9776   -- Update of wsh_delivery_details where requested_quantity/released_status
9777   -- are changed, call DBI API after the update.
9778   -- This API will also check for DBI Installed or not
9779   IF l_debug_on THEN
9780     WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail id-',p_old_delivery_detail_rec.delivery_detail_id);
9781   END IF;
9782   l_detail_tab(1) := p_old_delivery_detail_rec.delivery_detail_id;
9783   WSH_INTEGRATION.DBI_Update_Detail_Log
9784     (p_delivery_detail_id_tab => l_detail_tab,
9785      p_dml_type               => 'UPDATE',
9786      x_return_status          => l_dbi_rs);
9787 
9788   IF l_debug_on THEN
9789     WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
9790   END IF;
9791   IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
9792     x_return_status := l_dbi_rs;
9793     -- just pass this return status to caller API
9794     rollback to split_savepoint;
9795     --
9796     IF l_debug_on THEN
9797       WSH_DEBUG_SV.pop(l_module_name);
9798     END IF;
9799     --
9800     RETURN;
9801   END IF;
9802   -- End of Code for DBI Project
9803   --
9804 
9805 
9806   -- J: W/V Changes
9807   -- Decrement the DD W/V from parent if p_unassign_flag is 'Y'
9808   IF (p_unassign_flag = 'Y') THEN
9809     IF l_debug_on THEN
9810         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
9811     END IF;
9812     --
9813     WSH_WV_UTILS.DD_WV_Post_Process(
9814           p_delivery_detail_id => p_old_delivery_detail_rec.delivery_detail_id,
9815           p_diff_gross_wt      => -1 * l_total_gross_wt,
9816           p_diff_net_wt        => -1 * l_total_net_wt,
9817           p_diff_fill_volume   => -1 * l_total_vol,
9818           x_return_status      => l_return_status);
9819 
9820     IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
9821          --
9822          rollback to split_savepoint;
9823          x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9824          WSH_UTIL_CORE.Add_Message(x_return_status);
9825          IF l_debug_on THEN
9826              WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
9827              WSH_DEBUG_SV.pop(l_module_name);
9828          END IF;
9829          return;
9830     END IF;
9831   END IF;
9832 
9833   --
9834   IF l_debug_on THEN
9835     WSH_DEBUG_SV.pop(l_module_name);
9836 
9837   END IF;
9838   --
9839 
9840   EXCEPTION
9841 -- HW OPMCONV. Removed OPM excpetion
9842 
9843   WHEN old_det_wt_vol_failed THEN
9844     rollback to split_savepoint;
9845     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9846     fnd_message.set_name('WSH', 'WSH_DET_WT_VOL_FAILED');
9847     FND_MESSAGE.SET_TOKEN('DETAIL_ID',  p_old_delivery_detail_rec.delivery_detail_id);
9848     wsh_util_core.add_message(x_return_status,l_module_name);
9849     --
9850     IF l_debug_on THEN
9851       WSH_DEBUG_SV.logmsg(l_module_name,'OLD_DET_WT_VOL_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
9852       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OLD_DET_WT_VOL_FAILED');
9853     END IF;
9854     --
9855   WHEN new_det_wt_vol_failed THEN
9856     rollback to split_savepoint;
9857     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9858     fnd_message.set_name('WSH', 'WSH_DET_WT_VOL_FAILED');
9859     FND_MESSAGE.SET_TOKEN('DETAIL_ID',  l_new_DELIVERY_DETAIL_ID);
9860     wsh_util_core.add_message(x_return_status,l_module_name);
9861     --
9862     IF l_debug_on THEN
9863       WSH_DEBUG_SV.logmsg(l_module_name,'NEW_DET_WT_VOL_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
9864       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:NEW_DET_WT_VOL_FAILED');
9865     END IF;
9866     --
9867   WHEN WSH_SPLIT_ERROR THEN
9868     rollback to split_savepoint;
9869     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9870     fnd_message.set_name('WSH', 'WSH_SPLIT_ERROR');
9871     fnd_message.set_token('DETAIL_ID',  p_old_delivery_detail_rec.delivery_detail_id);
9872     wsh_util_core.add_message(x_return_status,l_module_name);
9873     --
9874     IF l_debug_on THEN
9875       WSH_DEBUG_SV.logmsg(l_module_name,'WSH_SPLIT_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
9876       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_SPLIT_ERROR');
9877     END IF;
9878   WHEN WSH_SN_SPLIT_ERR THEN
9879     rollback to split_savepoint;
9880     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9881     fnd_message.set_name('WSH', 'WSH_SN_SPLIT_ERR');
9882     wsh_util_core.add_message(x_return_status,l_module_name);
9883     --
9884     IF l_debug_on THEN
9885       WSH_DEBUG_SV.logmsg(l_module_name,'WSH_SN_SPLIT_ERR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
9886       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_SN_SPLIT_ERR');
9887     END IF;
9888 
9889   WHEN WSH_NO_DATA_FOUND THEN
9890     IF c_get_req_pick_qty%ISOPEN THEN
9891       CLOSE c_get_req_pick_qty;
9892     END IF;
9893     rollback to split_savepoint;
9894     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9895     fnd_message.set_name('WSH', 'WSH_NO_DATA_FOUND');
9896     IF l_debug_on THEN
9897       WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_DATA_FOUND exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
9898       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_DATA_FOUND');
9899     END IF;
9900     --
9901   WHEN others THEN
9902     IF c_get_req_pick_qty%ISOPEN THEN
9903       CLOSE c_get_req_pick_qty;
9904     END IF;
9905     rollback to split_savepoint;
9906     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9907     wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DETAIL_INT_BULK',l_module_name);
9908     --
9909     IF l_debug_on THEN
9910       WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
9911       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
9912     END IF;
9913     --
9914 END SPLIT_DETAIL_INT_BULK;
9915 
9916 /*************************/
9917 --
9918 --Procedure:
9919 --Parameters:    p_from_detail_id
9920 --          p_req_quantity
9921 --          p_new_detail_id
9922 --          x_return_status
9923 --Desription:
9924 --        Splits a delivery detail according the new requested
9925 --        quantity. The newly created the detail has the requested
9926 --        quantity as p_req_quantity and the old detail has the
9927 --
9928 -- fabdi start : PICK CONFIRM
9929 --added a new parameter called p_req_quantity2      requested quantity as requested_quantity - p_requested_quantity
9930 -- fabdi end : PICK CONFIRM
9931 -- HW BUG#:1636578 added a new parameter p_converted_flag
9932 
9933 /*****************************************************
9934 -----   SPLIT_DELIVERY_DETAILS api
9935 *****************************************************/
9936 PROCEDURE Split_Delivery_Details (
9937 p_from_detail_id     IN  NUMBER,
9938 p_req_quantity       IN OUT NOCOPY  NUMBER,
9939 x_new_detail_id      OUT NOCOPY  NUMBER,
9940 x_return_status     OUT NOCOPY  VARCHAR2,
9941 p_unassign_flag     IN  VARCHAR2 ,
9942 p_req_quantity2     IN  NUMBER ,
9943 p_converted_flag     IN VARCHAR2,
9944 p_manual_split   IN VARCHAR2 )
9945 IS
9946 
9947 l_new_delivery_detail_id number;
9948 
9949 -- HW OPMCONV - Removed OPM variables
9950 
9951 -- HW OPMCONV. Remove format 19,9
9952 l_qty2            NUMBER;
9953 l_split_shipped_qty2      NUMBER(19,9):= NULL;
9954 -- HW BUG#:1636578 variable to calculate new qty2
9955 l_new_req_qty2 NUMBER;
9956 l_original_shipped_qty2    NUMBER(19,9):= NULL;
9957 
9958 l_new_req_qty   NUMBER;
9959 l_new_pick_qty  NUMBER;
9960 -- HW OPMCONV. No need to use l_new_pick_qty2
9961 --l_new_pick_qty2 NUMBER;
9962 
9963 -- STOPPED HERE --
9964 
9965 l_delivery_id  number;
9966 l_parent_delivery_detail_id number;
9967 assignment number;
9968 l_delivery_assignment_id number;
9969 detail_rowid VARCHAR2(30);
9970 assignment_rowid VARCHAR2(30);
9971 total number;
9972 l_cr_dt_status varchar2(30);
9973 l_cr_assg_status varchar2(30);
9974 l_output_quantity number;
9975 l_return_status   varchar2(1);
9976 l_qty_return_status varchar2(30);
9977 
9978 chk_decimal_qty_failed exception;
9979 quantity_over EXCEPTION;
9980 negative_qty  EXCEPTION;
9981 zero_qty    EXCEPTION;
9982 fail_create_detail EXCEPTION;
9983 /*   H integration: Pricing integration csun
9984    mark reprice required flag when split_delivery_details
9985  */
9986 l_entity_ids   WSH_UTIL_CORE.id_tab_type;
9987 reprice_required_err   EXCEPTION;
9988 l_delivery_assignments_info WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_Type;
9989 l_delivery_details_info WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type;
9990 l_split_weight number;
9991 l_split_volume number;
9992 l_split_return_status varchar2(30);
9993 l_shipped_quantity     NUMBER := NULL;
9994 l_old_stage_qty      NUMBER := NULL;
9995 l_ser_qty          NUMBER := NULL;
9996 
9997 
9998   old_delivery_detail_rec SplitDetailRecType;
9999 
10000 l_inv_controls_rec   WSH_DELIVERY_DETAILS_INV.inv_control_flag_rec;
10001 
10002 
10003 --
10004 l_debug_on BOOLEAN;
10005 --
10006 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'SPLIT_DELIVERY_DETAILS';
10007 --
10008 BEGIN
10009   --
10010   --
10011   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10012   --
10013   IF l_debug_on IS NULL
10014   THEN
10015       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10016   END IF;
10017   --
10018   IF l_debug_on THEN
10019       WSH_DEBUG_SV.push(l_module_name);
10020       --
10021       WSH_DEBUG_SV.log(l_module_name,'P_FROM_DETAIL_ID',P_FROM_DETAIL_ID);
10022       WSH_DEBUG_SV.log(l_module_name,'P_REQ_QUANTITY',P_REQ_QUANTITY);
10023       WSH_DEBUG_SV.log(l_module_name,'P_UNASSIGN_FLAG',P_UNASSIGN_FLAG);
10024       WSH_DEBUG_SV.log(l_module_name,'P_REQ_QUANTITY2',P_REQ_QUANTITY2);
10025       WSH_DEBUG_SV.log(l_module_name,'P_CONVERTED_FLAG',P_CONVERTED_FLAG);
10026       WSH_DEBUG_SV.log(l_module_name,'P_MANUAL_SPLIT',P_MANUAL_SPLIT);
10027   END IF;
10028   --
10029   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10030 
10031   OPEN c_split_detail_info(p_from_detail_id);
10032   FETCH c_split_detail_info into old_delivery_detail_rec;
10033   CLOSE c_split_detail_info;
10034 
10035   -- Bug 2419301 : Set oe_interfaced_flag to MISS CHAR so that create_new_detail_from_old API
10036   --               determines the value of oe_interfaced_flag for newly created dd
10037   old_delivery_detail_rec.oe_interfaced_flag:= NULL;
10038 
10039 
10040   -- Bug 1289812
10041   -- check if this split is valid operation
10042   IF (
10043         p_req_quantity >= NVL(old_delivery_detail_rec.picked_quantity,old_delivery_detail_rec.requested_quantity)
10044       AND NVL(old_delivery_detail_rec.line_direction,'O') IN ('O','IO')  -- J-IB-NPARIKH
10045      )
10046      OR
10047      (
10048         p_req_quantity >= NVL(
10049                                 old_delivery_detail_rec.received_quantity,
10050                                 NVL(old_delivery_detail_rec.shipped_quantity,
10051                                 NVL(old_delivery_detail_rec.picked_quantity,
10052                                 old_delivery_detail_rec.requested_quantity))
10053                              )     -- J-IB-NPARIKH
10054       AND NVL(old_delivery_detail_rec.line_direction,'O') NOT IN ('O','IO')   -- J-IB-NPARIKH
10055      )
10056   THEN
10057   RAISE quantity_over;
10058   END IF;
10059   -- Bug 1299636
10060   -- check if this quantity to split is positive
10061   IF (p_req_quantity = 0) THEN
10062   RAISE zero_qty;
10063   ELSIF (p_req_quantity < 0) THEN
10064   RAISE negative_qty;
10065   END IF;
10066   l_qty2 := p_req_quantity2 ;
10067 
10068   /* need to validate the quantity passed meets the decimal quantity
10069    standard */
10070 
10071   --Check if org is a process one or not for the current record
10072   --
10073 -- HW OPMCONV - Removed checking for process org
10074 
10075          --  Patch J:  Catch Weights
10076          --  Need to split the secondary quantity in proportion to the primary quantity.
10077          --  Catch weight support currently only for non-opm lines.
10078 
10079          IF   old_delivery_detail_rec.picked_quantity2 IS NOT NULL and p_req_quantity2 IS NULL
10080             and (NVL(old_delivery_detail_rec.picked_quantity,0) <> 0)
10081             AND NVL(old_delivery_detail_rec.line_direction,'O') in ('O','IO') -- J-IB-NPARIKH
10082          THEN
10083 
10084             l_qty2 :=  old_delivery_detail_rec.picked_quantity2 * (p_req_quantity/old_delivery_detail_rec.picked_quantity);
10085             l_qty2 :=  round(l_qty2,5);
10086 
10087          ELSE
10088 
10089             l_qty2 := p_req_quantity2 ;
10090 
10091          END IF;
10092 
10093 
10094 
10095 
10096 
10097    --
10098    IF l_debug_on THEN
10099        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
10100    END IF;
10101    --
10102    WSH_DETAILS_VALIDATIONS.check_decimal_quantity(
10103         p_item_id    => old_delivery_detail_rec.inventory_item_id,
10104         p_organization_id => old_delivery_detail_rec.organization_id,
10105         p_input_quantity  => p_req_quantity,
10106         p_uom_code    => old_delivery_detail_rec.requested_quantity_UOM,
10107         x_output_quantity => l_output_quantity,
10108         x_return_status   => l_qty_return_status);
10109 
10110    IF (l_qty_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
10111     RAISE chk_decimal_qty_failed;
10112    END IF;
10113    IF (l_output_quantity IS not NULL) THEN
10114      p_req_quantity := l_output_quantity;
10115    END IF;
10116 
10117   --
10118   IF l_debug_on THEN
10119       WSH_DEBUG_SV.logmsg(l_module_name, 'BEFORE CALLING SPLIT_DETAIL_INT AND P_REQ_QUANTITY IS '||P_REQ_QUANTITY  );
10120   END IF;
10121   --
10122   --
10123   IF l_debug_on THEN
10124       WSH_DEBUG_SV.logmsg(l_module_name, 'BEFORE CALLING SPLIT_DETAIL_INT AND P_QUANTITY_TO_SPLIT2 IS '||L_QTY2  );
10125   END IF;
10126   --
10127 
10128 -- HW OPMCONV - Removed l_process_flag parameter
10129   Split_Detail_INT(
10130        p_old_delivery_detail_rec => old_delivery_detail_rec,
10131        p_quantity_to_split     => p_req_quantity,
10132        p_quantity_to_split2   => l_qty2,
10133        p_unassign_flag       => p_unassign_flag,
10134        p_converted_flag     => p_converted_flag,
10135        p_manual_split     => p_manual_split,
10136        x_split_detail_id     => x_new_detail_id,
10137        x_return_status       => x_return_status);
10138 
10139    -- Bug 3724578 : Return back to the caller if any error occurs
10140    --               while splitting the delivery detail line
10141    --- Message will be set in  Split_Detail_INT
10142   IF x_return_status IN ( WSH_UTIL_CORE.G_RET_STS_ERROR,
10143                          WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
10144     		       ) THEN
10145     return;
10146   END IF;
10147 
10148   --bug# 6689448 (replenishment project) (begin) : call WMS for whenever there is split on replenishment requested
10149   -- delivery detail lines with the new quantity for the old delivery detail line on p_primary_quantity parameter.
10150   -- Inturn WMS creates a new replenishment record for p_split_delivery_detail_id with old delivery detail line old qty - old delivery detail line
10151   --  new quantity (p_primary_quantity).
10152   IF ( old_delivery_detail_rec.replenishment_status = 'R' and old_delivery_detail_rec.released_status in ('R','B')) THEN
10153   --{
10154       IF l_debug_on THEN
10155           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WMS_REPLENISHMENT_PUB.UPDATE_DELIVERY_DETAIL' ,WSH_DEBUG_SV.C_PROC_LEVEL);
10156       END IF;
10157       WMS_REPLENISHMENT_PUB.UPDATE_DELIVERY_DETAIL(
10158           p_delivery_detail_id       => old_delivery_detail_rec.delivery_detail_id,
10159           p_primary_quantity         => old_delivery_detail_rec.requested_quantity - p_req_quantity,
10160           p_split_delivery_detail_id => x_new_detail_id,
10161           x_return_status            => x_return_status);
10162       IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
10163       --{
10164           IF l_debug_on THEN
10165               WSH_DEBUG_SV.logmsg(l_module_name,  'UNEXPECTED ERROR FROM WMS_REPLENISHMENT_PUB.UPDATE_DELIVERY_DETAIL');
10166               WSH_DEBUG_SV.pop(l_module_name);
10167           END IF;
10168           RETURN;
10169       --}
10170       END IF;
10171    --}
10172    END IF;
10173    --bug# 6689448 (replenishment project): end
10174 
10175   /*  H integration: Pricing integration csun
10176     mark repirce required flag when split delivery details
10177    */
10178    l_entity_ids(1) := old_delivery_detail_rec.delivery_detail_id;
10179    --
10180    IF l_debug_on THEN
10181        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
10182    END IF;
10183    --
10184    WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
10185        p_entity_type => 'DELIVERY_DETAIL',
10186        p_entity_ids   => l_entity_ids,
10187        x_return_status  => l_return_status);
10188    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
10189       raise reprice_required_err;
10190    END IF;
10191 
10192 --
10193 IF l_debug_on THEN
10194     WSH_DEBUG_SV.pop(l_module_name);
10195 END IF;
10196 --
10197   EXCEPTION
10198   WHEN chk_decimal_qty_failed THEN
10199     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10200     fnd_message.set_name('WSH', 'WSH_DET_DECIMAL_QTY_NOT_VALID');
10201     wsh_util_core.add_message(x_return_status,l_module_name);
10202     --
10203     IF l_debug_on THEN
10204         WSH_DEBUG_SV.logmsg(l_module_name,'CHK_DECIMAL_QTY_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
10205         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CHK_DECIMAL_QTY_FAILED');
10206     END IF;
10207     --
10208   WHEN quantity_over THEN
10209     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10210     fnd_message.set_name('WSH', 'WSH_DET_SPLIT_EXCEED');
10211     wsh_util_core.add_message(x_return_status,l_module_name);
10212     --
10213     IF l_debug_on THEN
10214         WSH_DEBUG_SV.logmsg(l_module_name,'QUANTITY_OVER exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
10215         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:QUANTITY_OVER');
10216     END IF;
10217     --
10218   WHEN zero_qty THEN
10219     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10220     fnd_message.set_name('WSH', 'WSH_NO_ZERO_NUM');
10221     wsh_util_core.add_message(x_return_status,l_module_name);
10222     --
10223     IF l_debug_on THEN
10224         WSH_DEBUG_SV.logmsg(l_module_name,'ZERO_QTY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
10225         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:ZERO_QTY');
10226     END IF;
10227     --
10228   WHEN negative_qty THEN
10229     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10230     fnd_message.set_name('WSH', 'WSH_NO_NEG_NUM');
10231     wsh_util_core.add_message(x_return_status,l_module_name);
10232     --
10233     IF l_debug_on THEN
10234         WSH_DEBUG_SV.logmsg(l_module_name,'NEGATIVE_QTY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
10235         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:NEGATIVE_QTY');
10236     END IF;
10237     --
10238   WHEN reprice_required_err THEN
10239     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10240     fnd_message.set_name('WSH', 'WSH_REPRICE_REQUIRED_ERR');
10241     wsh_util_core.add_message(x_return_status,l_module_name);
10242     --
10243     IF l_debug_on THEN
10244         WSH_DEBUG_SV.logmsg(l_module_name,'REPRICE_REQUIRED_ERR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
10245         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:REPRICE_REQUIRED_ERR');
10246     END IF;
10247     --
10248   WHEN others THEN
10249     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
10250     wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS',l_module_name);
10251     --
10252     IF l_debug_on THEN
10253         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
10254         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
10255     END IF;
10256     --
10257 END SPLIT_DELIVERY_DETAILS;
10258 
10259 /*****************************************************************
10260   Description :-
10261 
10262   Currently being used values of p_manual_split are
10263 
10264 NULL - default, normal mode of splitting backordered quantity
10265      then shipped quantity
10266 Y - split staged quantity
10267 C - split shipped quantity then backordered quantity (from packing code)
10268 B - called from update_inventory_info for OPM's use
10269 M - called from update_inventory_info for OPM's use
10270 S - called from update_inventory_info for OPM's use
10271 U - called from update_inventory_info for OPM's use
10272 
10273 *******************************************************************/
10274 
10275 /*****************************************************
10276 -----   SPLIT_DETAIL_INT api
10277 *****************************************************/
10278 -- HW OPMCONV. Removed p_process_flag
10279 PROCEDURE Split_Detail_INT(
10280          p_old_delivery_detail_rec    IN  SplitDetailRecType,
10281          p_new_source_line_id  IN  NUMBER  ,
10282          p_quantity_to_split   IN  NUMBER,
10283          p_quantity_to_split2  IN  NUMBER   ,
10284          p_unassign_flag     IN  VARCHAR2 ,
10285          p_converted_flag   IN  VARCHAR2 ,
10286          p_manual_split   IN  VARCHAR2 ,
10287          p_split_sn     IN  VARCHAR2 ,
10288          x_split_detail_id   OUT NOCOPY  NUMBER,
10289          x_return_status     OUT NOCOPY  VARCHAR2)
10290 IS
10291 l_new_delivery_detail_id number;
10292 -- HW OPMCONV. Removed OPM variables
10293 
10294 -- HW OPMCONV. Removed format of 19,9
10295 l_qty2            NUMBER;
10296 l_split_shipped_qty2      NUMBER(19,9):= NULL;
10297 -- HW BUG#:1636578 variable to calculate new qty2
10298 l_new_req_qty2 NUMBER;
10299 -- HW OPMCONV. Removed format of 19,9
10300 l_original_shipped_qty2    NUMBER := NULL;
10301 
10302 l_new_req_qty   NUMBER;
10303 l_new_pick_qty  NUMBER;
10304 -- HW OPMCONV. No need to use l_new_pick_qty2
10305 --l_new_pick_qty2 NUMBER;
10306 
10307 l_delivery_id  number;
10308 l_parent_delivery_detail_id number;
10309 assignment number;
10310 l_delivery_assignment_id number;
10311 detail_rowid VARCHAR2(30);
10312 assignment_rowid VARCHAR2(30);
10313 total number;
10314 l_cr_dt_status varchar2(30);
10315 l_cr_assg_status varchar2(30);
10316 l_output_quantity number;
10317 l_qty_return_status varchar2(30);
10318 new_det_wt_vol_failed exception;
10319 old_det_wt_vol_failed exception;
10320 l_delivery_assignments_info WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_Type;
10321 l_delivery_details_info WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type;
10322 l_split_weight number;
10323 l_split_volume number;
10324 l_split_return_status varchar2(30);
10325 l_shipped_quantity     NUMBER := NULL;
10326 l_old_stage_qty      NUMBER := NULL;
10327 l_ser_qty          NUMBER := NULL;
10328 
10329 l_original_req_qty   NUMBER := NULL;
10330 l_original_req_qty2  NUMBER := NULL;
10331 l_original_picked_qty  NUMBER := NULL;
10332 l_original_picked_qty2   NUMBER := NULL;
10333 l_original_recvd_qty   NUMBER := NULL;
10334 l_original_recvd_qty2  NUMBER := NULL;
10335 l_original_rtv_qty   NUMBER := NULL;
10336 l_original_rtv_qty2  NUMBER := NULL;
10337 l_split_req_qty  NUMBER := NULL;
10338 l_split_req_qty2   NUMBER := NULL;
10339 l_split_picked_qty   NUMBER := NULL;
10340 l_split_picked_qty2  NUMBER := NULL;
10341 l_split_recvd_qty  NUMBER := NULL;
10342 l_split_recvd_qty2   NUMBER := NULL;
10343 l_split_rtv_qty  NUMBER := NULL;
10344 l_split_rtv_qty2   NUMBER := NULL;
10345 l_original_shipped_qty   NUMBER := NULL;
10346 l_original_cc_qty     NUMBER := NULL;
10347 l_split_shipped_qty  NUMBER := NULL;
10348 l_split_cc_qty      NUMBER := NULL;
10349 -- HW OPMCONV. Removed format of 19,9
10350 l_split_cc_qty2    NUMBER := NULL;
10351 -- HW OPMCONV. Removed format of 19,9
10352 l_original_cc_qty2     NUMBER := NULL;
10353 l_return_status     VARCHAR2(30);
10354 -- J: W/V Changes
10355 l_total_gross_wt NUMBER;
10356 l_total_net_wt   NUMBER;
10357 l_total_vol      NUMBER;
10358 l_org_wv_qty     NUMBER;
10359 l_new_wv_qty     NUMBER;
10360 
10361 -- HW OPMCONV. Removed OPM excpetion
10362 
10363 
10364 l_inv_controls_rec   WSH_DELIVERY_DETAILS_INV.inv_control_flag_rec;
10365 
10366 WSH_CREATE_DET_ERR EXCEPTION;
10367 WSH_SN_SPLIT_ERR        EXCEPTION;
10368 
10369 l_updated_delivery_detail_rec          SplitDetailRecType;
10370 
10371 l_detail_tab WSH_UTIL_CORE.id_tab_type; -- DBI Project
10372 l_dbi_rs     VARCHAR2(1); -- Return Status from DBI API
10373 
10374 --
10375 l_debug_on BOOLEAN;
10376 --
10377 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'SPLIT_DETAIL_INT';
10378 --
10379 l_action VARCHAR2(100) := 'SPLIT-LINE';
10380 BEGIN
10381   --
10382   --
10383   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10384   --
10385   IF l_debug_on IS NULL
10386   THEN
10387       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10388   END IF;
10389   --
10390   IF l_debug_on THEN
10391       WSH_DEBUG_SV.push(l_module_name);
10392       --
10393       WSH_DEBUG_SV.log(l_module_name,'P_NEW_SOURCE_LINE_ID',P_NEW_SOURCE_LINE_ID);
10394       WSH_DEBUG_SV.log(l_module_name,'P_QUANTITY_TO_SPLIT',P_QUANTITY_TO_SPLIT);
10395       WSH_DEBUG_SV.log(l_module_name,'P_QUANTITY_TO_SPLIT2',P_QUANTITY_TO_SPLIT2);
10396       WSH_DEBUG_SV.log(l_module_name,'P_UNASSIGN_FLAG',P_UNASSIGN_FLAG);
10397       WSH_DEBUG_SV.log(l_module_name,'P_CONVERTED_FLAG',P_CONVERTED_FLAG);
10398       WSH_DEBUG_SV.log(l_module_name,'P_MANUAL_SPLIT',P_MANUAL_SPLIT);
10399       WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_SN',P_SPLIT_SN);
10400   END IF;
10401   --
10402   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10403 
10404   /* need to validate the quantity passed meets the decimal quantity
10405      standard */
10406 
10407 
10408 -- HW OPMCONV. Removed branching
10409   l_qty2 := p_quantity_to_split2;
10410 
10411 
10412 IF NVL(p_old_delivery_detail_rec.line_direction,'O') IN ('O','IO') -- J-IB-NPARIKH
10413 THEN
10414 --{
10415 
10416     -- For bug 1307771. If shipped quantity is NULL.  Then leave the new
10417     -- shipped quantity to be NULL
10418   IF (p_old_delivery_detail_rec.shipped_quantity IS NULL AND p_old_delivery_detail_rec.cycle_count_quantity IS NULL) THEN
10419   l_split_shipped_qty := NULL;
10420   l_split_cc_qty := NULL;
10421   l_split_shipped_qty2 :=NULL;
10422   l_split_cc_qty2 := NULL;
10423 
10424   ELSIF (p_manual_split = 'C') THEN
10425 
10426     l_split_shipped_qty := LEAST(p_old_delivery_detail_rec.shipped_quantity,
10427                    p_quantity_to_split);
10428   l_split_shipped_qty2 := LEAST(p_old_delivery_detail_rec.shipped_quantity2,
10429                   p_quantity_to_split2);
10430     l_split_cc_qty := LEAST(p_old_delivery_detail_rec.cycle_count_quantity,
10431                 (p_quantity_to_split - nvl(l_split_shipped_qty,0)));
10432   l_split_cc_qty2 := LEAST(p_old_delivery_detail_rec.cycle_count_quantity2,
10433                (p_quantity_to_split2 - NVL(l_split_shipped_qty2,0)));
10434 
10435   l_original_shipped_qty := p_old_delivery_detail_rec.shipped_quantity     -
10436  l_split_shipped_qty;
10437   l_original_cc_qty   := p_old_delivery_detail_rec.cycle_count_quantity   -
10438  l_split_cc_qty;
10439   l_original_shipped_qty2 := p_old_delivery_detail_rec.shipped_quantity2   -
10440  l_split_shipped_qty2;
10441   l_original_cc_qty2    := p_old_delivery_detail_rec.cycle_count_quantity2 -
10442  l_split_cc_qty2;
10443 
10444  ELSIF (p_manual_split = 'Y') THEN
10445 
10446   /* bug 1983460
10447   if the call is from ship confirm to split only the stage quantity
10448    the split delivery detail has null shipped and cc quantities.
10449   */
10450 
10451     l_split_shipped_qty := NULL;
10452     l_split_cc_qty := NULL;
10453       l_split_shipped_qty2 :=NULL;
10454       l_split_cc_qty2 := NULL;
10455 
10456   /* bug 1983460
10457   since the split shipped and split cc quantities are null, we should
10458   leave the original shipped and original cc quantities as they are.
10459   */
10460 
10461   l_original_shipped_qty := p_old_delivery_detail_rec.shipped_quantity;
10462   l_original_cc_qty   := p_old_delivery_detail_rec.cycle_count_quantity;
10463   l_original_shipped_qty2 := p_old_delivery_detail_rec.shipped_quantity2;
10464 
10465   l_original_cc_qty2    := p_old_delivery_detail_rec.cycle_count_quantity2;
10466 
10467 
10468   ELSE
10469   -- use cc qty to split p_quantity_to_split before we use shipped qty to complete the quantity split
10470   --  (This takes care of splitting lines to backorder/cycle-count, for example.)
10471   -- assumption: the quantities' relationships are valid
10472 
10473   l_split_cc_qty  := LEAST(p_old_delivery_detail_rec.cycle_count_quantity,   p_quantity_to_split);
10474   l_split_cc_qty2 := LEAST(p_old_delivery_detail_rec.cycle_count_quantity2,  p_quantity_to_split2);
10475 
10476   -- fail-safe: NVL to ensure that shipped qtys can still be split even if cc qtys are NULL
10477   l_split_shipped_qty  := LEAST(p_old_delivery_detail_rec.shipped_quantity,  (p_quantity_to_split  - NVL(l_split_cc_qty,0)));
10478   l_split_shipped_qty2 := LEAST(p_old_delivery_detail_rec.shipped_quantity2, (p_quantity_to_split2 - NVL(l_split_cc_qty2,0)));
10479 
10480   -- update original line's quantities accordingly
10481   l_original_shipped_qty := p_old_delivery_detail_rec.shipped_quantity     - l_split_shipped_qty;
10482   l_original_cc_qty   := p_old_delivery_detail_rec.cycle_count_quantity   - l_split_cc_qty;
10483 
10484   l_original_shipped_qty2 := p_old_delivery_detail_rec.shipped_quantity2   - l_split_shipped_qty2;
10485   l_original_cc_qty2    := p_old_delivery_detail_rec.cycle_count_quantity2 - l_split_cc_qty2;
10486   END IF;
10487 
10488   --
10489  /*
10490   IF l_debug_on THEN
10491       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.INITIALIZE_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
10492   END IF;
10493   --
10494   WSH_DELIVERY_DETAILS_PKG.initialize_detail(
10495               p_delivery_detail_rec  =>  l_delivery_details_info);
10496   */
10497 
10498   IF p_old_delivery_detail_rec.picked_quantity IS NULL THEN
10499   l_delivery_details_info.requested_quantity := p_quantity_to_split;
10500   ELSE
10501   l_delivery_details_info.requested_quantity := LEAST(p_old_delivery_detail_rec.requested_quantity, p_quantity_to_split);
10502   l_delivery_details_info.picked_quantity := p_quantity_to_split;
10503 -- HW OPM for OM changes
10504    l_delivery_details_info.requested_quantity2 := LEAST(p_old_delivery_detail_rec.requested_quantity2, p_quantity_to_split2);
10505  --  l_delivery_details_info.picked_quantity2  := nvl(NVL(l_qty2,l_new_pick_qty2),FND_API.G_MISS_NUM);
10506 -- HW OPMCONV. No need to use l_new_pick_qty2
10507   l_delivery_details_info.picked_quantity2  := nvl(l_qty2,FND_API.G_MISS_NUM);
10508   END IF;
10509 
10510   IF ( NVL(l_qty2, 0) = 0  OR l_qty2 < 0 ) THEN
10511     l_delivery_details_info.requested_quantity2 := FND_API.G_MISS_NUM;
10512   ELSE
10513     l_delivery_details_info.requested_quantity2 := l_qty2;
10514   END IF;
10515   --
10516   --
10517 -- J-IB-NPARIKH-{
10518   l_original_req_qty     := GREATEST(p_old_delivery_detail_rec.requested_quantity
10519                             - l_delivery_details_info.requested_quantity, 0);
10520   l_original_req_qty2    := GREATEST(p_old_delivery_detail_rec.requested_quantity2 - l_qty2, 0);
10521   l_original_picked_qty  := p_old_delivery_detail_rec.picked_quantity - p_quantity_to_split;
10522   --l_original_picked_qty2 := p_old_delivery_detail_rec.picked_quantity2 - nvl(l_qty2,l_new_pick_qty2);
10523   l_original_picked_qty2 := p_old_delivery_detail_rec.picked_quantity2 - l_qty2;
10524   --
10525   l_original_recvd_qty   := p_old_delivery_detail_rec.received_quantity;
10526   l_original_recvd_qty2  := p_old_delivery_detail_rec.received_quantity2;
10527   l_split_recvd_qty      := NULL;
10528   l_split_recvd_qty2     := NULL;
10529   -- J-IB-NPARIKH-}
10530 
10531 
10532 --}
10533 ELSE  --    -- J-IB-NPARIKH
10534 --{
10535 				--
10536 				-- For inbound and drop-ship lines,
10537 				-- calculate quantities for new(child) line and original line
10538 				-- For new line, quantities are
10539 				--               LEAST( qty. on original line, input quantity to be split)
10540 				-- For original line, quantities are
10541 				--               GREATEST( qty. on original line -  qty. on new line, 0 )
10542 				-- For a line with picked=12, requested=10, if we split 11 then
10543 				--    new line      : picked=11, requested=10
10544 				--    original line : picked=1, requested=0
10545 				--
10546 				--
10547     l_split_cc_qty          := NULL;
10548     l_split_cc_qty2         := NULL;
10549     l_split_rtv_qty       := least(p_old_delivery_detail_rec.returned_quantity, p_quantity_to_split);
10550     l_split_recvd_qty       := least(p_old_delivery_detail_rec.received_quantity, p_quantity_to_split);
10551     l_split_shipped_qty     := least(p_old_delivery_detail_rec.shipped_quantity,  p_quantity_to_split);
10552     l_split_picked_qty      := least(p_old_delivery_detail_rec.picked_quantity,   p_quantity_to_split);
10553     l_split_req_qty         := least(p_old_delivery_detail_rec.requested_quantity,p_quantity_to_split);
10554     --
10555     l_split_rtv_qty2      := least(p_old_delivery_detail_rec.returned_quantity2, l_qty2);
10556     l_split_recvd_qty2      := least(p_old_delivery_detail_rec.received_quantity2, l_qty2);
10557     l_split_shipped_qty2    := least(p_old_delivery_detail_rec.shipped_quantity2,  l_qty2);
10558     l_split_picked_qty2     := least(p_old_delivery_detail_rec.picked_quantity2,   l_qty2);
10559     l_split_req_qty2        := least(p_old_delivery_detail_rec.requested_quantity2,l_qty2);
10560     --
10561     --
10562     l_delivery_details_info.requested_quantity  := nvl(l_split_req_qty, FND_API.G_MISS_NUM);
10563     l_delivery_details_info.requested_quantity2 := nvl(l_split_req_qty2,FND_API.G_MISS_NUM);
10564     l_delivery_details_info.picked_quantity     := nvl(l_split_picked_qty, FND_API.G_MISS_NUM);
10565     l_delivery_details_info.picked_quantity2    := nvl(l_split_picked_qty2,FND_API.G_MISS_NUM);
10566     l_delivery_details_info.shipped_quantity  := nvl(l_split_shipped_qty, FND_API.G_MISS_NUM);
10567     l_delivery_details_info.shipped_quantity2 := nvl(l_split_shipped_qty2,FND_API.G_MISS_NUM);
10568     l_delivery_details_info.received_quantity  := nvl(l_split_recvd_qty, FND_API.G_MISS_NUM);
10569     l_delivery_details_info.received_quantity2 := nvl(l_split_recvd_qty2,FND_API.G_MISS_NUM);
10570     l_delivery_details_info.returned_quantity  := nvl(l_split_rtv_qty, FND_API.G_MISS_NUM);
10571     l_delivery_details_info.returned_quantity2 := nvl(l_split_rtv_qty2,FND_API.G_MISS_NUM);
10572     --
10573     --
10574     l_original_shipped_qty  := GREATEST(
10575                                         p_old_delivery_detail_rec.shipped_quantity
10576                                         - NVL(l_split_shipped_qty,0),
10577                                         0
10578                                         );
10579     l_original_cc_qty       := GREATEST(
10580                                         p_old_delivery_detail_rec.cycle_count_quantity
10581                                         - NVL(l_split_cc_qty,0),
10582                                         0
10583                                         );
10584     l_original_shipped_qty2 := GREATEST(
10585                                         p_old_delivery_detail_rec.shipped_quantity2
10586                                         - NVL(l_split_shipped_qty2,0),
10587                                         0
10588                                         );
10589     l_original_cc_qty2      := GREATEST(
10590                                         p_old_delivery_detail_rec.cycle_count_quantity2
10591                                         - NVL(l_split_cc_qty2,0),
10592                                         0
10593                                         );
10594     --
10595     l_original_req_qty      := GREATEST(
10596                                         p_old_delivery_detail_rec.requested_quantity
10597                                         - NVL(l_split_req_qty,0),
10598                                         0
10599                                         );
10600     l_original_req_qty2     := GREATEST(
10601                                         p_old_delivery_detail_rec.requested_quantity2
10602                                         - NVL(l_split_req_qty2,0),
10603                                         0
10604                                         );
10605     l_original_picked_qty   := GREATEST(
10606                                         p_old_delivery_detail_rec.picked_quantity
10607                                         - NVL(l_split_picked_qty,0),
10608                                         0
10609                                         );
10610     l_original_picked_qty2  := GREATEST(
10611                                         p_old_delivery_detail_rec.picked_quantity2
10612                                         - NVL(l_split_picked_qty2,0),
10613                                         0
10614                                         );
10615     l_original_recvd_qty   := GREATEST(
10616                                         p_old_delivery_detail_rec.received_quantity
10617                                         - NVL(l_split_recvd_qty,0),
10618                                         0
10619                                         );
10620     l_original_recvd_qty2  := GREATEST(
10621                                         p_old_delivery_detail_rec.received_quantity2
10622                                         - NVL(l_split_recvd_qty2,0),
10623                                         0
10624                                         );
10625 
10626     IF l_debug_on THEN
10627        WSH_DEBUG_SV.log(l_module_name,' l_delivery_details_info.requested_quantity', l_delivery_details_info.requested_quantity);
10628        WSH_DEBUG_SV.log(l_module_name,'l_delivery_details_info.requested_quantity2',l_delivery_details_info.requested_quantity2);
10629        WSH_DEBUG_SV.log(l_module_name,' l_delivery_details_info.shipped_quantity', l_delivery_details_info.shipped_quantity);
10630        WSH_DEBUG_SV.log(l_module_name,'l_delivery_details_info.shipped_quantity2',l_delivery_details_info.shipped_quantity2);
10631        WSH_DEBUG_SV.log(l_module_name,' l_delivery_details_info.received_quantity', l_delivery_details_info.received_quantity);
10632        WSH_DEBUG_SV.log(l_module_name,'l_delivery_details_info.received_quantity2',l_delivery_details_info.received_quantity2);
10633        WSH_DEBUG_SV.log(l_module_name,' l_delivery_details_info.returned_quantity', l_delivery_details_info.returned_quantity);
10634        WSH_DEBUG_SV.log(l_module_name,'l_delivery_details_info.returned_quantity2',l_delivery_details_info.returned_quantity2);
10635        WSH_DEBUG_SV.log(l_module_name,'l_delivery_details_info.picked_quantity',l_delivery_details_info.picked_quantity);
10636        WSH_DEBUG_SV.log(l_module_name,'l_delivery_details_info.picked_quantity2',l_delivery_details_info.picked_quantity2);
10637        WSH_DEBUG_SV.log(l_module_name,'l_original_shipped_qty',l_original_shipped_qty);
10638        WSH_DEBUG_SV.log(l_module_name,'l_original_shipped_qty2',l_original_shipped_qty2);
10639        WSH_DEBUG_SV.log(l_module_name,'l_original_cc_qty',l_original_cc_qty);
10640        WSH_DEBUG_SV.log(l_module_name,'l_original_cc_qty2',l_original_cc_qty2);
10641        WSH_DEBUG_SV.log(l_module_name,'l_original_req_qty',l_original_req_qty);
10642        WSH_DEBUG_SV.log(l_module_name,'l_original_req_qty2',l_original_req_qty2);
10643        WSH_DEBUG_SV.log(l_module_name,'l_original_picked_qty',l_original_picked_qty);
10644        WSH_DEBUG_SV.log(l_module_name,'l_original_picked_qty2',l_original_picked_qty2);
10645        WSH_DEBUG_SV.log(l_module_name,'l_original_recvd_qty',l_original_recvd_qty);
10646        WSH_DEBUG_SV.log(l_module_name,'l_original_recvd_qty2',l_original_recvd_qty2);
10647        WSH_DEBUG_SV.log(l_module_name,'l_original_rtv_qty',l_original_rtv_qty);
10648        WSH_DEBUG_SV.log(l_module_name,'l_original_rtv_qty2',l_original_rtv_qty2);
10649     END IF;
10650 
10651   --
10652 --}
10653 END IF;
10654 
10655 -- Bug 2181132 in current code for single line
10656 -- donot need the check for null
10657   l_delivery_details_info.source_line_set_id :=
10658           p_old_delivery_detail_rec.source_line_set_id;
10659 
10660   IF p_new_source_line_id IS NOT NULL THEN
10661   l_delivery_details_info.source_line_id := p_new_source_line_id;
10662   END IF;
10663 
10664   -- J: W/V Changes
10665   IF p_old_delivery_detail_rec.wv_frozen_flag = 'Y' THEN
10666     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)));
10667 
10668     IF l_debug_on THEN
10669       WSH_DEBUG_SV.logmsg(l_module_name, 'Frozen Y');
10670     END IF;
10671 
10672     IF (p_manual_split = 'Y') THEN
10673       -- p_manual_split is 'Y' only when splitting for staged delivery details during ship confirm
10674       -- Staged delivery details W/V should always be reset back to original W/V
10675       l_new_wv_qty := 0;
10676     ELSE
10677       SELECT NVL(decode(l_split_recvd_qty,FND_API.G_MISS_NUM,null,l_split_recvd_qty),
10678                       NVL(decode(l_split_shipped_qty,FND_API.G_MISS_NUM,null,l_split_shipped_qty),
10679                           NVL(decode(l_delivery_details_info.picked_quantity,FND_API.G_MISS_NUM,null,l_delivery_details_info.picked_quantity),
10680                               decode(l_delivery_details_info.requested_quantity,FND_API.G_MISS_NUM,null,l_delivery_details_info.requested_quantity))))
10681       INTO   l_new_wv_qty
10682       FROM   dual;
10683     END IF;
10684 
10685     IF l_org_wv_qty <> 0 THEN
10686       l_delivery_details_info.gross_weight :=  round( (l_new_wv_qty/l_org_wv_qty) * p_old_delivery_detail_rec.gross_weight, 5);
10687       l_delivery_details_info.net_weight   :=  round( (l_new_wv_qty/l_org_wv_qty) * p_old_delivery_detail_rec.net_weight, 5);
10688       l_delivery_details_info.volume       :=  round( (l_new_wv_qty/l_org_wv_qty) * p_old_delivery_detail_rec.volume, 5);
10689     ELSE
10690       l_delivery_details_info.gross_weight := 0;
10691       l_delivery_details_info.net_weight   := 0;
10692       l_delivery_details_info.volume       := 0;
10693     END IF;
10694 
10695 
10696   END IF;
10697 
10698   IF (l_split_shipped_qty is not null and l_split_shipped_qty = 0) OR (p_manual_split = 'Y') THEN
10699     l_delivery_details_info.wv_frozen_flag  := 'N';
10700   ELSE
10701     l_delivery_details_info.wv_frozen_flag  := p_old_delivery_detail_rec.wv_frozen_flag;
10702   END IF;
10703   l_delivery_details_info.weight_uom_code := p_old_delivery_detail_rec.weight_uom_code;
10704   l_delivery_details_info.volume_uom_code := p_old_delivery_detail_rec.volume_uom_code;
10705 
10706   l_delivery_details_info.shipped_quantity := nvl(l_split_shipped_qty,FND_API.G_MISS_NUM);
10707   IF ( NVL(l_split_shipped_qty2, 0) = 0 ) THEN
10708   l_delivery_details_info.shipped_quantity2 := FND_API.G_MISS_NUM;
10709   ELSE
10710   l_delivery_details_info.shipped_quantity2 := l_split_shipped_qty2;
10711   END IF;
10712   --
10713   --
10714   l_delivery_details_info.received_quantity  := nvl(l_split_recvd_qty, FND_API.G_MISS_NUM);
10715   l_delivery_details_info.received_quantity2 := nvl(l_split_recvd_qty2,FND_API.G_MISS_NUM);
10716   --
10717   IF ( NVL(l_qty2, 0) = 0 OR l_qty2 < 0  ) THEN
10718   l_delivery_details_info.cancelled_quantity2 := FND_API.G_MISS_NUM;
10719   ELSE
10720   -- Bug 2116595
10721   l_delivery_details_info.cancelled_quantity2 := FND_API.G_MISS_NUM;
10722   END IF;
10723 
10724   l_delivery_details_info.cycle_count_quantity := nvl(l_split_cc_qty,FND_API.G_MISS_NUM);
10725 -- HW OPMCONV. No need to fork code
10726 --  IF ( p_process_flag = FND_API.G_TRUE ) THEN
10727     l_delivery_details_info.cycle_count_quantity2 := nvl(l_split_cc_qty2,FND_API.G_MISS_NUM);
10728 --  END IF;
10729 
10730   -- Bug 2116595
10731   l_delivery_details_info.cancelled_quantity := FND_API.G_MISS_NUM;
10732   l_delivery_details_info.split_from_detail_id := p_old_delivery_detail_rec.delivery_detail_id;
10733 
10734   l_delivery_details_info.container_flag := p_old_delivery_detail_rec.container_flag;
10735   l_delivery_details_info.master_serial_number := FND_API.G_MISS_CHAR;
10736   l_delivery_details_info.serial_number := FND_API.G_MISS_CHAR;
10737   l_delivery_details_info.to_serial_number := FND_API.G_MISS_CHAR;
10738   l_delivery_details_info.transaction_temp_id := FND_API.G_MISS_NUM;
10739   l_delivery_details_info.last_update_date := SYSDATE;
10740   l_delivery_details_info.last_updated_by :=  FND_GLOBAL.USER_ID;
10741   l_delivery_details_info.last_update_login :=  FND_GLOBAL.LOGIN_ID;
10742   -- Bug 2419301
10743   l_delivery_details_info.oe_interfaced_flag := p_old_delivery_detail_rec.oe_interfaced_flag;
10744 
10745   l_new_delivery_detail_id := NULL;
10746 
10747 
10748   l_updated_delivery_detail_rec := p_old_delivery_detail_rec;
10749 
10750 -- HW OPMCONV - Removed branching
10751   -- are there serial numbers to split?
10752 
10753   /* bug 1983460
10754    if p_manual_split is 'Y', only stage quantity is involved.
10755    Staged quantities can't have serial numbers and hence no need to call
10756   */
10757 
10758 
10759   IF (  p_split_sn = 'Y'
10760     AND NVL(p_old_delivery_detail_rec.shipped_quantity, 0) > NVL(l_original_shipped_qty, 0)
10761     AND ( (p_old_delivery_detail_rec.transaction_temp_id IS NOT NULL)
10762        OR (p_old_delivery_detail_rec.serial_number IS NOT NULL)
10763       )
10764   AND (NVL(p_manual_split,'!') <> 'Y')
10765     ) THEN
10766 
10767     Split_Serial_Numbers_INT(
10768        x_old_detail_rec     => l_updated_delivery_detail_rec,
10769        x_new_delivery_detail_rec => l_delivery_details_info,
10770        p_old_shipped_quantity => l_original_shipped_qty,
10771        p_new_shipped_quantity => l_split_shipped_qty,
10772        x_return_status       => l_split_return_status);
10773 
10774     IF (l_split_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
10775     RAISE wsh_sn_split_err;
10776     END IF;
10777 
10778   END IF; -- are there serial numbers to split?
10779 
10780   --
10781   IF l_debug_on THEN
10782       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);
10783   END IF;
10784   --
10785   WSH_DELIVERY_DETAILS_PKG.create_new_detail_from_old(
10786               p_delivery_detail_rec  =>  l_delivery_details_info,
10787               p_delivery_detail_id    =>   p_old_delivery_detail_rec.delivery_detail_id,
10788               x_row_id          =>   detail_rowid,
10789               x_delivery_detail_id    =>   l_new_delivery_detail_id,
10790               x_return_status      =>  l_cr_dt_status);
10791 
10792               IF l_cr_dt_status in (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
10793                  RAISE WSH_CREATE_DET_ERR;
10794               END IF;
10795 
10796 
10797   /* call wv util to calculate the weight and volume of the new detail */
10798   -- J: W/V Changes
10799   IF p_old_delivery_detail_rec.wv_frozen_flag = 'N' THEN
10800     -- Bug 4416863
10801     -- During Partial Shipping with the remain qty as staged, w/v value should not be
10802     -- deducted again from the original line since during entering shipped_quantity
10803     -- w/v has been calculated for the original line.
10804     IF (p_manual_split = 'Y') THEN
10805       l_total_net_wt   := 0;
10806       l_total_gross_wt := 0;
10807       l_total_vol      := 0;
10808     ELSE
10809     -- end bug 4416863
10810       IF l_debug_on THEN
10811         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DETAIL_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
10812       END IF;
10813 
10814       WSH_WV_UTILS.Detail_Weight_Volume(
10815         p_delivery_detail_id => l_new_delivery_detail_id,
10816         p_update_flag        => 'Y',
10817         x_net_weight         => l_split_weight,
10818         x_volume             => l_split_volume,
10819         x_return_status      => l_split_return_status);
10820       IF (l_split_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
10821         RAISE new_det_wt_vol_failed;
10822       END IF;
10823       l_total_net_wt   := l_split_weight;
10824       l_total_gross_wt := l_split_weight;
10825       l_total_vol      := l_split_volume;
10826     END IF;
10827   ELSE
10828      l_total_net_wt   := l_delivery_details_info.net_weight;
10829      l_total_gross_wt := l_delivery_details_info.gross_weight;
10830      l_total_vol      := l_delivery_details_info.volume;
10831   END IF;
10832 
10833   IF (p_unassign_flag = 'N') THEN
10834     l_delivery_assignments_info.type := 'S';
10835     l_delivery_assignments_info.delivery_id := p_old_delivery_detail_rec.delivery_id;
10836     l_delivery_assignments_info.parent_delivery_detail_id := p_old_delivery_detail_rec.parent_delivery_detail_id;
10837     IF p_old_delivery_detail_rec.wda_type = 'C' THEN
10838        l_delivery_assignments_info.type := 'O';
10839        l_delivery_assignments_info.parent_delivery_detail_id := NULL;
10840     END IF;
10841   ELSE
10842     l_delivery_assignments_info.delivery_id := NULL;
10843     l_delivery_assignments_info.parent_delivery_detail_id := NULL;
10844   END IF;
10845 
10846   l_delivery_assignments_info.delivery_detail_id := l_new_delivery_detail_id;
10847   --
10848   IF l_debug_on THEN
10849       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.CREATE_DELIVERY_ASSIGNMENTS',WSH_DEBUG_SV.C_PROC_LEVEL);
10850   END IF;
10851   --
10852   wsh_delivery_details_pkg.create_delivery_assignments(
10853       l_delivery_assignments_info,
10854       assignment_rowid,
10855       l_delivery_assignment_id,
10856       l_cr_assg_status
10857       );
10858 
10859   -- Bug 3724578 : Return back to the caller if any error occurs
10860   --              while creating the delivery detail assignments
10861   --- Message will be set in  create_delivery_assignments
10862   IF l_cr_assg_status IN ( WSH_UTIL_CORE.G_RET_STS_ERROR,
10863                           WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
10864                         ) THEN
10865      x_return_status := l_cr_assg_status;
10866     return;
10867   END IF;
10868 
10869   -- K: MDC: We need to create consolidation records if necessary.
10870 
10871   IF (p_unassign_flag = 'N') AND (p_old_delivery_detail_rec.wda_type = 'C') THEN
10872 
10873       l_delivery_assignments_info.parent_delivery_id := p_old_delivery_detail_rec.parent_delivery_id;
10874       l_delivery_assignments_info.parent_delivery_detail_id := p_old_delivery_detail_rec.parent_delivery_detail_id;
10875       l_delivery_assignments_info.type := 'C';
10876 
10877       wsh_delivery_details_pkg.create_delivery_assignments(
10878       l_delivery_assignments_info,
10879       assignment_rowid,
10880       l_delivery_assignment_id,
10881       l_cr_assg_status
10882       );
10883 
10884       IF l_cr_assg_status IN ( WSH_UTIL_CORE.G_RET_STS_ERROR,
10885                           WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
10886                         ) THEN
10887          x_return_status := l_cr_assg_status;
10888          return;
10889       END IF;
10890 
10891   END IF;
10892 
10893 
10894 
10895 /*2442099*/
10896   Log_Exceptions(p_old_delivery_detail_rec.delivery_detail_id,l_new_delivery_detail_id,l_delivery_assignments_info.delivery_id,l_action);
10897 
10898   /* NC - Added the following for OPM  BUG#1675561 */
10899   /* LG BUG#:2005977 */
10900   /* LG new */
10901 
10902 /* HW OPMCONV - Removed branching
10903   /* Bug 2177410, also update net_weight and volume of original delivery detail
10904    because non item does not use WSH_WV_UTILS.Detail_Weight_Volume to
10905    adjust the net_weight and volume  */
10906 
10907   x_split_detail_id := l_new_delivery_detail_id;
10908 
10909   IF l_debug_on THEN
10910      WSH_DEBUG_SV.logmsg(l_module_name, 'Before Update wsh_delivery_details');
10911      WSH_DEBUG_SV.log(l_module_name, 'serial_number',l_updated_delivery_detail_rec.serial_number);
10912      WSH_DEBUG_SV.log(l_module_name, 'to_serial_number',l_updated_delivery_detail_rec.to_serial_number);
10913      WSH_DEBUG_SV.log(l_module_name, 'transaction_temp_id',l_updated_delivery_detail_rec.transaction_temp_id);
10914   END IF;
10915 
10916   UPDATE wsh_delivery_details
10917   SET requested_quantity    = l_original_req_qty,    -- J-IB-NPARIKH, GREATEST(requested_quantity - l_delivery_details_info.requested_quantity, 0),
10918       requested_quantity2   = l_original_req_qty2,    -- J-IB-NPARIKH, GREATEST(requested_quantity2 - l_qty2, 0),
10919       picked_quantity      = l_original_picked_qty,    -- J-IB-NPARIKH, picked_quantity - p_quantity_to_split,
10920       picked_quantity2    = l_original_picked_qty2,    -- J-IB-NPARIKH, picked_quantity2 - nvl(l_qty2,l_new_pick_qty2),
10921     shipped_quantity    = l_original_shipped_qty,
10922     shipped_quantity2  = l_original_shipped_qty2,
10923       received_quantity    = l_original_recvd_qty,   -- J-IB-NPARIKH
10924       received_quantity2  = l_original_recvd_qty2,       -- J-IB-NPARIKH
10925       --returned_quantity    = l_original_rtv_qty,   -- J-IB-NPARIKH
10926       --returned_quantity2  = l_original_rtv_qty2,       -- J-IB-NPARIKH
10927     cycle_count_quantity  = l_original_cc_qty,
10928     cycle_count_quantity2 = l_original_cc_qty2,
10929     serial_number  = decode(l_updated_delivery_detail_rec.serial_number,FND_API.G_MISS_CHAR,NULL,
10930                                           NULL,serial_number,l_updated_delivery_detail_rec.serial_number),
10931     to_serial_number  = decode(l_updated_delivery_detail_rec.to_serial_number,FND_API.G_MISS_CHAR,NULL,
10932                                           NULL,to_serial_number,l_updated_delivery_detail_rec.to_serial_number),
10933     transaction_temp_id  = decode(l_updated_delivery_detail_rec.transaction_temp_id, FND_API.G_MISS_NUM,NULL,
10934                                           NULL,transaction_temp_id,l_updated_delivery_detail_rec.transaction_temp_id),
10935 -- J: W/V Changes
10936     gross_weight          =  gross_weight - l_total_gross_wt,
10937     net_weight            =  net_weight - l_total_net_wt,
10938     volume                =  volume - l_total_vol,
10939 -- End J: W/V Changes
10940     last_update_date   = SYSDATE,
10941     last_updated_by = FND_GLOBAL.USER_ID,
10942     last_update_login  = FND_GLOBAL.LOGIN_ID
10943   WHERE delivery_detail_id = p_old_delivery_detail_rec.delivery_detail_id;
10944 
10945   -- DBI Project
10946   -- Update of wsh_delivery_details where requested_quantity/released_status
10947   -- are changed, call DBI API after the update.
10948   -- This API will also check for DBI Installed or not
10949   IF l_debug_on THEN
10950     WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail id-',p_old_delivery_detail_rec.delivery_detail_id);
10951   END IF;
10952   l_detail_tab(1) := p_old_delivery_detail_rec.delivery_detail_id;
10953   WSH_INTEGRATION.DBI_Update_Detail_Log
10954     (p_delivery_detail_id_tab => l_detail_tab,
10955      p_dml_type               => 'UPDATE',
10956      x_return_status          => l_dbi_rs);
10957 
10958   IF l_debug_on THEN
10959     WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
10960   END IF;
10961   IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
10962     x_return_status := l_dbi_rs;
10963     -- just pass this return status to caller API
10964     IF l_debug_on THEN
10965       WSH_DEBUG_SV.pop(l_module_name);
10966     END IF;
10967     return;
10968   END IF;
10969   -- End of Code for DBI Project
10970   --
10971 
10972   -- J: W/V Changes
10973   -- Decrement the DD W/V from parent if p_unassign_flag is 'Y'
10974   IF (p_unassign_flag = 'Y') THEN
10975     IF l_debug_on THEN
10976         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
10977     END IF;
10978     --
10979     WSH_WV_UTILS.DD_WV_Post_Process(
10980           p_delivery_detail_id => p_old_delivery_detail_rec.delivery_detail_id,
10981           p_diff_gross_wt      => -1 * l_total_gross_wt,
10982           p_diff_net_wt        => -1 * l_total_net_wt,
10983           p_diff_fill_volume   => -1 * l_total_vol,
10984           x_return_status      => l_return_status);
10985 
10986     IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
10987          --
10988          x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10989          WSH_UTIL_CORE.Add_Message(x_return_status);
10990          IF l_debug_on THEN
10991              WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
10992              WSH_DEBUG_SV.pop(l_module_name);
10993          END IF;
10994          return;
10995     END IF;
10996   END IF;
10997 
10998 --
10999 IF l_debug_on THEN
11000     WSH_DEBUG_SV.pop(l_module_name);
11001 END IF;
11002 --
11003   EXCEPTION
11004 -- HW OPMCONV. Removed OPM exception
11005 
11006   WHEN old_det_wt_vol_failed THEN
11007     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11008     fnd_message.set_name('WSH', 'WSH_DET_WT_VOL_FAILED');
11009     FND_MESSAGE.SET_TOKEN('DETAIL_ID',  p_old_delivery_detail_rec.delivery_detail_id);
11010     wsh_util_core.add_message(x_return_status,l_module_name);
11011     --
11012     IF l_debug_on THEN
11013         WSH_DEBUG_SV.logmsg(l_module_name,'OLD_DET_WT_VOL_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
11014         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OLD_DET_WT_VOL_FAILED');
11015     END IF;
11016     --
11017   WHEN new_det_wt_vol_failed THEN
11018     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11019     fnd_message.set_name('WSH', 'WSH_DET_WT_VOL_FAILED');
11020     FND_MESSAGE.SET_TOKEN('DETAIL_ID',  l_new_DELIVERY_DETAIL_ID);
11021     wsh_util_core.add_message(x_return_status,l_module_name);
11022     --
11023     IF l_debug_on THEN
11024         WSH_DEBUG_SV.logmsg(l_module_name,'NEW_DET_WT_VOL_FAILED exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
11025         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:NEW_DET_WT_VOL_FAILED');
11026     END IF;
11027     --
11028   WHEN WSH_SN_SPLIT_ERR THEN
11029     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11030     fnd_message.set_name('WSH', 'WSH_SN_SPLIT_ERR');
11031     wsh_util_core.add_message(x_return_status,l_module_name);
11032     --
11033     IF l_debug_on THEN
11034         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_SN_SPLIT_ERR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
11035         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_SN_SPLIT_ERR');
11036     END IF;
11037     --
11038   WHEN WSH_CREATE_DET_ERR THEN
11039     x_return_status := l_cr_dt_status;
11040     IF l_debug_on THEN
11041         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_SN_SPLIT_ERR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
11042         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_CREATE_DET_ERR');
11043     END IF;
11044 
11045         WHEN others THEN
11046                 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11047                 wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DETAIL_INT',l_module_name);
11048                 --
11049                 IF l_debug_on THEN
11050                     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11051                     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11052                 END IF;
11053                 --
11054 END SPLIT_DETAIL_INT;
11055 
11056 /*****************************************************
11057 -----   SPLIT_SERIAL_NUMBERS_INT api
11058 *****************************************************/
11059 
11060 PROCEDURE Split_Serial_Numbers_INT(
11061   x_old_detail_rec      IN OUT  NOCOPY  SplitDetailRecType,
11062     x_new_delivery_detail_rec IN OUT  NOCOPY  WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type,
11063     p_old_shipped_quantity  IN    NUMBER,
11064     p_new_shipped_quantity  IN    NUMBER,
11065     x_return_status      OUT NOCOPY      VARCHAR2) IS
11066 
11067   l_ser_qty  NUMBER;
11068 
11069   l_real_serial_prefix WSH_DELIVERY_DETAILS.SERIAL_NUMBER%TYPE;
11070   l_prefix_length   NUMBER;
11071   l_fm_numeric     NUMBER;
11072   l_to_numeric     NUMBER;
11073   l_range_count   NUMBER;
11074   l_qty_to_split     NUMBER;
11075   l_new_sn       WSH_DELIVERY_DETAILS.SERIAL_NUMBER%TYPE;
11076   l_new_to_sn     WSH_DELIVERY_DETAILS.TO_SERIAL_NUMBER%TYPE;
11077   l_old_to_sn     WSH_DELIVERY_DETAILS.TO_SERIAL_NUMBER%TYPE;
11078   l_transaction_temp_id  NUMBER := NULL;
11079   l_success             NUMBER;
11080 
11081 -- Bug 3782838
11082   CURSOR  c_sn_ranges(x_tt_id IN NUMBER) IS
11083   SELECT  msnt.rowid,
11084           msnt.transaction_temp_id,
11085           msnt.fm_serial_number,
11086           msnt.to_serial_number,
11087           msnt.attribute_category,
11088           msnt.attribute1,
11089           msnt.attribute2,
11090           msnt.attribute3,
11091           msnt.attribute4,
11092           msnt.attribute5,
11093           msnt.attribute6,
11094           msnt.attribute7,
11095           msnt.attribute8,
11096           msnt.attribute9,
11097           msnt.attribute10,
11098           msnt.attribute11,
11099           msnt.attribute12,
11100           msnt.attribute13,
11101           msnt.attribute14,
11102           msnt.attribute15,
11103           msnt.dff_updated_flag
11104   FROM  mtl_serial_numbers_temp msnt
11105   WHERE   msnt.transaction_temp_id = x_tt_id
11106   ORDER BY  msnt.fm_serial_number DESC;
11107 
11108   CURSOR c_temp_id IS
11109   select mtl_material_transactions_s.nextval
11110   from dual;
11111 
11112 --
11113 l_debug_on BOOLEAN;
11114 --
11115 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'SPLIT_SERIAL_NUMBERS_INT';
11116 --
11117 BEGIN
11118 
11119   --
11120   --
11121   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
11122   --
11123   IF l_debug_on IS NULL
11124   THEN
11125       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
11126   END IF;
11127   --
11128   IF l_debug_on THEN
11129       WSH_DEBUG_SV.push(l_module_name);
11130       --
11131       WSH_DEBUG_SV.log(l_module_name,'P_OLD_SHIPPED_QUANTITY',P_OLD_SHIPPED_QUANTITY);
11132       WSH_DEBUG_SV.log(l_module_name,'P_NEW_SHIPPED_QUANTITY',P_NEW_SHIPPED_QUANTITY);
11133       WSH_DEBUG_SV.log(l_module_name,'old serial_number',
11134                                        x_old_detail_rec.serial_number);
11135       WSH_DEBUG_SV.log(l_module_name,'old to_serial_number',
11136                                        x_old_detail_rec.to_serial_number);
11137       WSH_DEBUG_SV.log(l_module_name,'old transaction_temp_id',
11138                                        x_old_detail_rec.transaction_temp_id);
11139       WSH_DEBUG_SV.log(l_module_name,'old shipped_quantity',
11140                                        x_old_detail_rec.shipped_quantity);
11141       WSH_DEBUG_SV.log(l_module_name,'old delivery_detail_id',
11142                                        x_old_detail_rec.delivery_detail_id);
11143       WSH_DEBUG_SV.log(l_module_name,'old organization_id',
11144                                        x_old_detail_rec.organization_id);
11145       WSH_DEBUG_SV.log(l_module_name,'old inventory_item_id',
11146                                        x_old_detail_rec.inventory_item_id);
11147 
11148   END IF;
11149   --
11150   IF p_old_shipped_quantity = 0 THEN
11151   -- new delivery line has the full shipped quantity and gets all serial number info
11152 
11153   x_new_delivery_detail_rec.serial_number     := x_old_detail_rec.serial_number;
11154   x_new_delivery_detail_rec.to_serial_number  := x_old_detail_rec.to_serial_number;
11155   x_new_delivery_detail_rec.transaction_temp_id := x_old_detail_rec.transaction_temp_id;
11156 
11157   x_old_detail_rec.serial_number     := FND_API.G_MISS_CHAR;
11158   x_old_detail_rec.to_serial_number  :=  FND_API.G_MISS_CHAR;
11159   x_old_detail_rec.transaction_temp_id := FND_API.G_MISS_NUM;
11160 
11161   ELSIF p_old_shipped_quantity < x_old_detail_rec.shipped_quantity THEN
11162   -- we are reducing old shipped quantity
11163 
11164   IF x_old_detail_rec.transaction_temp_id IS NULL THEN
11165 
11166     IF x_old_detail_rec.to_serial_number IS NOT NULL THEN
11167 
11168     -- we have one range SERIAL_NUMBER - TO_SERIAL_NUMBER to split
11169     l_real_serial_prefix := RTRIM(x_old_detail_rec.serial_number,
11170                     '0123456789');
11171     l_prefix_length   := NVL(LENGTH(l_real_serial_prefix), 0);
11172     l_fm_numeric     := TO_NUMBER(SUBSTR(x_old_detail_rec.serial_number,
11173                        l_prefix_length + 1));
11174     l_to_numeric     := TO_NUMBER(SUBSTR(x_old_detail_rec.to_serial_number,
11175                          l_prefix_length + 1));
11176     l_range_count   := l_to_numeric - l_fm_numeric + 1;
11177 
11178     IF l_range_count > p_old_shipped_quantity THEN
11179       -- we need to split the serial number range.
11180       l_qty_to_split   := l_range_count - p_old_shipped_quantity;
11181 
11182       l_new_to_sn := x_old_detail_rec.to_serial_number;
11183       l_old_to_sn := l_real_serial_prefix
11184              || LPAD(TO_CHAR(l_to_numeric-l_qty_to_split),
11185                 LENGTH(x_old_detail_rec.serial_number) - l_prefix_length,
11186                 '0');
11187 
11188       l_new_sn  := l_real_serial_prefix
11189              || LPAD(TO_CHAR(l_to_numeric-l_qty_to_split+1),
11190                 LENGTH(x_old_detail_rec.serial_number) - l_prefix_length,
11191                 '0');
11192 
11193       -- compress range of same serial numbers to individual serial number
11194       IF l_old_to_sn = x_old_detail_rec.serial_number THEN
11195       l_old_to_sn :=  FND_API.G_MISS_CHAR;
11196       END IF;
11197       IF l_new_to_sn = l_new_sn THEN
11198       l_new_to_sn :=  FND_API.G_MISS_CHAR;
11199       END IF;
11200 
11201       x_old_detail_rec.to_serial_number     := l_old_to_sn;
11202       x_new_delivery_detail_rec.serial_number := l_new_sn;
11203       x_new_delivery_detail_rec.to_serial_number := l_new_to_sn;
11204 
11205     END IF;  -- l_range_count > p_old_shipped_quantity
11206                 IF l_debug_on THEN
11207                    WSH_DEBUG_SV.log(l_module_name,'serial_number',
11208                                       x_new_delivery_detail_rec.serial_number);
11209                    WSH_DEBUG_SV.log(l_module_name,'to_serial_number',
11210                                     x_new_delivery_detail_rec.to_serial_number);
11211                 END IF;
11212 
11213     END IF; -- x_old_detail_rec.to_serail_number IS NULL
11214 
11215   ELSE
11216 
11217     -- we have at least one record in MTL_SERIAL_NUMBERS_TEMP
11218     --
11219     IF l_debug_on THEN
11220         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_INV.GET_SERIAL_QTY',WSH_DEBUG_SV.C_PROC_LEVEL);
11221     END IF;
11222     --
11223     l_ser_qty := WSH_DELIVERY_DETAILS_INV.Get_Serial_Qty(
11224             p_organization_id => x_old_detail_rec.organization_id,
11225             p_delivery_detail_id => x_old_detail_rec.delivery_detail_id);
11226     l_qty_to_split := l_ser_qty - p_old_shipped_quantity;
11227     --
11228     IF l_debug_on THEN
11229       WSH_DEBUG_SV.log(l_module_name,'L_QTY_TO_SPLIT',l_qty_to_split);
11230     END IF;
11231     --
11232 
11233     IF l_qty_to_split >= 1 THEN
11234 
11235     IF p_new_shipped_quantity >= 1 THEN  -- Bug 3782838, Generate id for Single also
11236     --IF l_qty_to_split > 1 THEN
11237       -- more than one serial number, we need new transaction_temp_id
11238       OPEN  c_temp_id;
11239       FETCH c_temp_id INTO   l_transaction_temp_id;
11240       IF  c_temp_id%NOTFOUND THEN
11241       CLOSE c_temp_id;
11242       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11243       --
11244       IF l_debug_on THEN
11245           WSH_DEBUG_SV.log(l_module_name,'Return Status is error',x_return_status);
11246           WSH_DEBUG_SV.pop(l_module_name);
11247       END IF;
11248       --
11249       return;
11250       END IF;
11251       CLOSE c_temp_id;
11252                   IF l_debug_on THEN
11253                      WSH_DEBUG_SV.log(l_module_name,'l_transaction_temp_id',
11254                                                      l_transaction_temp_id);
11255                   END IF;
11256     END IF;
11257     x_new_delivery_detail_rec.transaction_temp_id := nvl(l_transaction_temp_id,FND_API.G_MISS_NUM);
11258 
11259     FOR c IN c_sn_ranges(x_old_detail_rec.transaction_temp_id) LOOP
11260 
11261       -- Bug 3782838 : Retain transaction_temp_id for single serial number
11262       IF (l_qty_to_split <= 0) THEN
11263         EXIT;  -- finished with splitting serial numbers
11264       END IF;
11265                   IF l_debug_on THEN
11266                      WSH_DEBUG_SV.log(l_module_name,'c.to_serial_number',
11267                                                          c.to_serial_number);
11268                      WSH_DEBUG_SV.log(l_module_name,'c.fm_serial_number',
11269                                                          c.fm_serial_number);
11270                   END IF;
11271 
11272       -- OR condition added for bug 4424259, making l_range_count = 1 if from and to serial numbers are same.
11273       IF c.to_serial_number IS NULL  OR ( c.fm_serial_number = c.to_serial_number ) THEN
11274       l_range_count := 1;
11275       ELSE
11276       -- serial number range
11277       l_real_serial_prefix := RTRIM(c.fm_serial_number,
11278                      '0123456789');
11279       l_prefix_length   := NVL(LENGTH(l_real_serial_prefix), 0);
11280       l_fm_numeric     := TO_NUMBER(SUBSTR(c.fm_serial_number,
11281                         l_prefix_length + 1));
11282       l_to_numeric     := TO_NUMBER(SUBSTR(c.to_serial_number,
11283                         l_prefix_length + 1));
11284       l_range_count   := l_to_numeric - l_fm_numeric + 1;
11285       END IF; -- c.to_serial_number IS NULL
11286                   IF l_debug_on THEN
11287                      WSH_DEBUG_SV.log(l_module_name,'l_range_count',
11288                                                         l_range_count);
11289                      WSH_DEBUG_SV.log(l_module_name,'l_qty_to_split',
11290                                                         l_qty_to_split);
11291                   END IF;
11292 
11293       IF l_range_count > l_qty_to_split THEN
11294 
11295       l_new_to_sn := c.to_serial_number;
11296       l_old_to_sn := l_real_serial_prefix
11297                || LPAD(TO_CHAR(l_to_numeric-l_qty_to_split),
11298                   LENGTH(c.fm_serial_number) - l_prefix_length,
11299                   '0');
11300       l_new_sn  := l_real_serial_prefix
11301                || LPAD(TO_CHAR(l_to_numeric-l_qty_to_split+1),
11302                   LENGTH(c.fm_serial_number) - l_prefix_length,
11303                   '0');
11304 
11305       IF p_old_shipped_quantity >= 1 THEN
11306         -- Bug 3782838 : Retain id for single serial number
11307         -- update record only if old delivery line still has at least 1 to ship.
11308         IF l_debug_on THEN
11309           WSH_DEBUG_SV.log(l_module_name,'l_old_to_sn',l_old_to_sn);
11310         END IF;
11311         UPDATE mtl_serial_numbers_temp
11312         SET  to_serial_number = l_old_to_sn,
11313             serial_prefix    = TO_CHAR(l_range_count - l_qty_to_split),
11314             last_update_date  = SYSDATE,
11315           last_updated_by  = FND_GLOBAL.USER_ID,
11316           last_update_login   = FND_GLOBAL.LOGIN_ID
11317         WHERE  rowid = c.rowid;
11318       END IF;
11319       IF l_debug_on THEN
11320         WSH_DEBUG_SV.log(l_module_name,
11321                          'inserting into mtl_serial_numbers_temp'
11322                         ,l_transaction_temp_id);
11323       END IF;
11324 
11325 -- Changes for 3782838
11326       IF l_transaction_temp_id IS NOT NULL THEN
11327         INSERT INTO mtl_serial_numbers_temp
11328           (TRANSACTION_TEMP_ID,
11329            LAST_UPDATE_DATE,
11330            LAST_UPDATED_BY,
11331            LAST_UPDATE_LOGIN,
11332            CREATION_DATE,
11333            CREATED_BY,
11334            FM_SERIAL_NUMBER,
11335            TO_SERIAL_NUMBER,
11336            SERIAL_PREFIX,
11337            ATTRIBUTE_CATEGORY,
11338            ATTRIBUTE1,
11339            ATTRIBUTE2,
11340            ATTRIBUTE3,
11341            ATTRIBUTE4,
11342            ATTRIBUTE5,
11343            ATTRIBUTE6,
11344            ATTRIBUTE7,
11345            ATTRIBUTE8,
11346            ATTRIBUTE9,
11347            ATTRIBUTE10,
11348            ATTRIBUTE11,
11349            ATTRIBUTE12,
11350            ATTRIBUTE13,
11351            ATTRIBUTE14,
11352            ATTRIBUTE15,
11353            DFF_UPDATED_FLAG)
11354           VALUES
11355           (l_transaction_temp_id,
11356            SYSDATE,
11357            FND_GLOBAL.USER_ID,
11358            FND_GLOBAL.LOGIN_ID,
11359            SYSDATE,
11360            FND_GLOBAL.USER_ID,
11361            l_new_sn,
11362            l_new_to_sn,
11363            TO_CHAR(l_qty_to_split),
11364            c.attribute_category,
11365            c.attribute1,
11366            c.attribute2,
11367            c.attribute3,
11368            c.attribute4,
11369            c.attribute5,
11370            c.attribute6,
11371            c.attribute7,
11372            c.attribute8,
11373            c.attribute9,
11374            c.attribute10,
11375            c.attribute11,
11376            c.attribute12,
11377            c.attribute13,
11378            c.attribute14,
11379            c.attribute15,
11380            c.dff_updated_flag
11381            );
11382 -- End of changes for 3782838
11383 
11384                         -- bug 2740681
11385                               IF l_debug_on THEN
11386                                WSH_DEBUG_SV.logmsg(l_module_name,'Before Calling  Serial_Check.Inv_Unmark_Serial');
11387                                WSH_DEBUG_SV.log(l_module_name,'l_new_sn,l_new_to_sn,inventory_item_id', l_new_sn
11388                                                               ||','||l_new_to_sn
11389                                                               ||','||x_old_detail_rec.inventory_item_id);
11390                               END IF;
11391                               Serial_Check.Inv_Unmark_Serial(
11392                                 l_new_sn,
11393                                 l_new_to_sn,
11394                                 NULL,
11395                                 NULL,
11396                                 NULL,
11397                                 NULL,
11398                                 x_old_detail_rec.inventory_item_id);
11399 
11400                               IF l_debug_on THEN
11401                                WSH_DEBUG_SV.logmsg(l_module_name,'After Calling  Serial_Check.Inv_Unmark_Serial');
11402                               END IF;
11403 
11404                               IF l_debug_on THEN
11405                                WSH_DEBUG_SV.logmsg(l_module_name,'Before Calling  Serial_Check.Inv_mark_Serial');
11406                                WSH_DEBUG_SV.log(l_module_name,'l_new_sn',l_new_sn);
11407                                WSH_DEBUG_SV.log(l_module_name,'l_new_to_sn',l_new_to_sn);
11408                                WSH_DEBUG_SV.log(l_module_name,'inventory_item_id',x_old_detail_rec.inventory_item_id);
11409                                WSH_DEBUG_SV.log(l_module_name,'organization_id',x_old_detail_rec.organization_id);
11410                                WSH_DEBUG_SV.log(l_module_name,'l_transaction_temp_id',l_transaction_temp_id);
11411                               END IF;
11412                               Serial_Check.Inv_Mark_Serial(
11413                                 l_new_sn,
11414                                 l_new_to_sn,
11415                                 x_old_detail_rec.inventory_item_id,
11416                                 x_old_detail_rec.organization_id,
11417                                 l_transaction_temp_id,
11418                                 l_transaction_temp_id,
11419                                 l_transaction_temp_id,
11420                                 l_success);
11421                               IF l_debug_on THEN
11422                                WSH_DEBUG_SV.log(l_module_name,'After Serial_Check.Inv_mark_Serial l_success',l_success);
11423                               END IF;
11424 
11425                               IF l_success < 0 THEN
11426                                  FND_MESSAGE.SET_NAME('WSH','WSH_SER_RANGE_MK_ERROR');
11427                                  FND_MESSAGE.SET_TOKEN('FM_SERIAL',l_new_sn);
11428                                  FND_MESSAGE.SET_TOKEN('TO_SERIAL',l_new_to_sn);
11429                                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11430                                  WSH_UTIL_CORE.Add_Message(x_return_status);
11431                               END IF;
11432                         -- bug 2740681
11433 
11434       ELSE
11435         x_new_delivery_detail_rec.serial_number := c.to_serial_number;
11436       END IF;
11437 
11438       l_qty_to_split := 0;
11439 
11440                         IF l_debug_on THEN
11441                            WSH_DEBUG_SV.log(l_module_name,'new serial_number',
11442                                       x_new_delivery_detail_rec.serial_number);
11443                         END IF;
11444       ELSE
11445                        IF l_debug_on THEN
11446                          WSH_DEBUG_SV.logmsg(l_module_name,'Split qty is grater than range');
11447                        END IF;
11448 
11449       IF l_transaction_temp_id IS NOT NULL THEN
11450                           IF l_debug_on THEN
11451                              WSH_DEBUG_SV.log(l_module_name,
11452                                'Updating mtl_serial_numbers_temp',
11453                                 l_transaction_temp_id);
11454                           END IF;
11455         -- we need to assign the full serial number range to the new line
11456         UPDATE mtl_serial_numbers_temp
11457         SET  transaction_temp_id = l_transaction_temp_id,
11458           last_update_date  = SYSDATE,
11459           last_updated_by  = FND_GLOBAL.USER_ID,
11460           last_update_login   = FND_GLOBAL.LOGIN_ID
11461         WHERE  rowid = c.rowid;
11462 
11463                           --Bug 2740681
11464                              IF l_debug_on THEN
11465                                WSH_DEBUG_SV.logmsg(l_module_name,'Before Calling  Serial_Check.Inv_Unmark_Serial');
11466                                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);
11467                              END IF;
11468                              Serial_Check.Inv_Unmark_Serial(
11469                                 c.fm_serial_number,
11470                                 c.to_serial_number,
11471                                 NULL,
11472                                 NULL,
11473                                 NULL,
11474                                 NULL,
11475                                 x_old_detail_rec.inventory_item_id);
11476                               IF l_debug_on THEN
11477                                WSH_DEBUG_SV.logmsg(l_module_name,'After Calling  Serial_Check.Inv_Unmark_Serial');
11478                               END IF;
11479 
11480                               IF l_debug_on THEN
11481                                WSH_DEBUG_SV.logmsg(l_module_name,'Before Calling  Serial_Check.Inv_mark_Serial');
11482                                WSH_DEBUG_SV.log(l_module_name,'fm_serial_number',c.fm_serial_number);
11483                                WSH_DEBUG_SV.log(l_module_name,'to_serial_number',c.to_serial_number);
11484                                WSH_DEBUG_SV.log(l_module_name,'inventory_item_id',x_old_detail_rec.inventory_item_id);
11485                                WSH_DEBUG_SV.log(l_module_name,'organization_id',x_old_detail_rec.organization_id);
11486                                WSH_DEBUG_SV.log(l_module_name,'l_transaction_temp_id',l_transaction_temp_id);
11487                               END IF;
11488                               Serial_Check.Inv_Mark_Serial(
11489                                 c.fm_serial_number,
11490                                 c.to_serial_number,
11491                                 x_old_detail_rec.inventory_item_id,
11492                                 x_old_detail_rec.organization_id,
11493                                 l_transaction_temp_id,
11494                                 l_transaction_temp_id,
11495                                 l_transaction_temp_id,
11496                                 l_success);
11497                               IF l_debug_on THEN
11498                                WSH_DEBUG_SV.log(l_module_name,'After Serial_Check.Inv_mark_Serial l_success',l_success);
11499                               END IF;
11500 
11501                               IF l_success < 0 THEN
11502                                  FND_MESSAGE.SET_NAME('WSH','WSH_SER_RANGE_MK_ERROR');
11503                                  FND_MESSAGE.SET_TOKEN('FM_SERIAL', c.fm_serial_number);
11504                                  FND_MESSAGE.SET_TOKEN('TO_SERIAL', c.to_serial_number);
11505                                  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11506                                  WSH_UTIL_CORE.Add_Message(x_return_status);
11507                               END IF;
11508                           --bug 2740681
11509       ELSE
11510         -- we need to remove this serial number range (which has count of 1)
11511         x_new_delivery_detail_rec.serial_number := c.fm_serial_number;
11512         DELETE mtl_serial_numbers_temp
11513         WHERE  rowid = c.rowid;
11514       END IF;
11515 
11516       l_qty_to_split := l_qty_to_split - l_range_count;
11517 
11518       END IF; -- l_range_count > l_qty_to_split
11519                   IF l_debug_on THEN
11520                      WSH_DEBUG_SV.log(l_module_name,'l_qty_to_split',
11521                                                    l_qty_to_split);
11522                   END IF;
11523 
11524       IF (l_qty_to_split <= 0) AND (p_old_shipped_quantity > 1) THEN
11525       -- finished with splitting serial numbers
11526       EXIT;
11527       END IF;
11528 
11529     END LOOP;  -- c_sn_ranges
11530 
11531     END IF; -- l_qty_to_split >= 1
11532 
11533   END IF;  -- x_old_detail_rec.transaction_temp_id IS NULL
11534 
11535   END IF;  -- p_old_shipped_quantity < x_old_detail_rec.shipped_quantity
11536 
11537 --
11538 IF l_debug_on THEN
11539     WSH_DEBUG_SV.pop(l_module_name);
11540 END IF;
11541 --
11542   EXCEPTION
11543   WHEN others THEN
11544   x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11545   wsh_util_core.default_handler('WSH_USA_ACTIONS_PVT.SPLIT_SERIAL_NUMBERS_INT',l_module_name);
11546 
11547 --
11548 IF l_debug_on THEN
11549     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11550     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11551 END IF;
11552 --
11553 END Split_Serial_Numbers_INT;
11554 
11555 -- THIS PROCEDURE IS OBSOLETE
11556 --
11557 -- Name
11558 --   Explode_Delivery_Details
11559 -- Purpose
11560 --   Takes individual lines FROM MTL_SERIAL_NUMBERS_TEMP that
11561 --   are under serial number control and explodes them into multiple
11562 --   lines based on the serial numbers entered.
11563 --
11564 --   Bug 1752809: rewritten to explode into serial number ranges.
11565 --        This improves interface performance by minimizing
11566 --        number of delivery lines needed to interface serial numbers.
11567 --
11568 -- Arguments
11569 --   P_Delivery_Detail_Id FOR which IS under Serial number
11570 --   control and hence must do the explosion
11571 --   P_Return_Status
11572 --
11573 --
11574 PROCEDURE EXPLODE_DELIVERY_DETAILS(
11575   p_delivery_detail_id number,
11576   x_return_status out NOCOPY  varchar2)
11577 IS
11578 
11579 l_debug_on BOOLEAN;
11580 --
11581 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'EXPLODE_DELIVERY_DETAILS';
11582 --
11583 BEGIN
11584   --
11585   --
11586   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11587   --
11588   --
11589 END explode_delivery_Details;
11590 
11591 
11592 /*
11593 REM This API will unassign a line ( delivery_detail or container) from the Delivery and unapck it.
11594 REM If the unpack results in the container ( holding the line/container) becoming empty
11595 REM then it would unpack the container and unassign it from Delivery too.
11596 REM the unpack/unassign is done recursively, till all empty containers resulting from the initial
11597 REM unpacked line are unassigned/unpacked.
11598 REM If there is an empty container already packed inside another container, and did not
11599 REM become empty because of the current line was unpacked, those containers are left
11600 REM packed/assigned to the Delivery.
11601 */
11602 PROCEDURE unassign_unpack_empty_cont (
11603                                 p_ids_tobe_unassigned IN wsh_util_core.id_tab_type,
11604                                 p_validate_flag   IN VARCHAR2,
11605                                 x_return_status   OUT NOCOPY  VARCHAR2
11606                               )
11607 IS
11608 
11609 CURSOR get_container(detail_id NUMBER) IS
11610 SELECT  parent_delivery_detail_id,
11611         delivery_id     -- Bug#3542095
11612 FROM    wsh_delivery_assignments_v
11613 WHERE   delivery_detail_id = detail_id;
11614 
11615 CURSOR get_lines (cont_id NUMBER, detail_id NUMBER) IS
11616 SELECT delivery_detail_id
11617 FROM   wsh_delivery_assignments_v
11618 WHERE  parent_delivery_detail_id = cont_id
11619 AND    delivery_detail_id <> detail_id;
11620 
11621 l_parent_container_id   wsh_util_core.id_tab_type ;
11622 l_delivery_id           wsh_delivery_assignments_v.delivery_id%type;
11623 l_return_status         VARCHAR2(1):=NULL ;
11624 l_line_id               NUMBER := NULL;
11625 
11626 -- K LPN CONV. rv
11627 l_lpn_in_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_in_rec_type;
11628 l_lpn_out_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_out_rec_type;
11629 l_msg_count NUMBER;
11630 l_msg_data VARCHAR2(32767);
11631 e_return_excp EXCEPTION;
11632 
11633 cursor l_get_cnt_org_csr(p_detail_id IN NUMBER) is
11634 select organization_id,
11635        nvl(line_direction,'O')
11636 from   wsh_delivery_details
11637 where  delivery_detail_id = p_detail_id;
11638 
11639 l_orgn_id NUMBER;
11640 l_line_dir VARCHAR2(10);
11641 l_wms_org VARCHAR2(10) := 'N';
11642 -- K LPN CONV. rv
11643 
11644 --
11645 l_debug_on BOOLEAN;
11646 --
11647 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'UNASSIGN_UNPACK_EMPTY_CONT';
11648 --
11649 
11650 BEGIN
11651 
11652   --
11653   --
11654   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
11655   --
11656   IF l_debug_on IS NULL
11657   THEN
11658       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
11659   END IF;
11660   --
11661   IF l_debug_on THEN
11662      WSH_DEBUG_SV.push(l_module_name);
11663      --
11664      WSH_DEBUG_SV.log(l_module_name,'P_VALIDATE_FLAG',P_VALIDATE_FLAG);
11665   END IF;
11666 
11667   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11668 
11669   IF ( p_ids_tobe_unassigned.COUNT = 0 ) THEN
11670       --
11671       IF l_debug_on THEN
11672          WSH_DEBUG_SV.pop(l_module_name);
11673       END IF;
11674       --
11675      RETURN;
11676   END IF;
11677 
11678   FOR i in 1..p_ids_tobe_unassigned.COUNT LOOP
11679      IF l_debug_on THEN
11680         WSH_DEBUG_SV.log(l_module_name,'detail to be unassigned ',p_ids_tobe_unassigned(i));
11681      END IF;
11682      -- Get the parent container, if it exists
11683      OPEN get_container(p_ids_tobe_unassigned(i));
11684      FETCH get_container
11685      INTO l_parent_container_id(1)
11686           , l_delivery_id; -- Bug#3542095
11687      IF get_container%NOTFOUND THEN
11688         l_parent_container_id(1) := NULL;
11689      END IF;
11690      CLOSE get_container;
11691 
11692      IF l_debug_on THEN
11693         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_DETAIL_FROM_DELIVERY',WSH_DEBUG_SV.C_PROC_LEVEL);
11694      END IF;
11695 
11696      -- Unassign the Line or Container
11697      -- because this
11698      wsh_delivery_details_actions.unassign_detail_from_delivery(
11699                                     p_detail_id          => p_ids_tobe_unassigned(i),
11700                                     p_validate_flag      => p_validate_flag,
11701                                     x_return_status      => l_return_status
11702                                     );
11703 
11704      --
11705      IF l_debug_on THEN
11706         WSH_DEBUG_SV.log(l_module_name, 'AFTER CALLING UNASSIGN_DETAIL_FROM_DELIVERY: ', L_RETURN_STATUS);
11707      END IF;
11708      --
11709      -- Check if the Parent Container is empty, if yes, recursivelly call this API
11710      IF ( l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS ) THEN
11711         FND_MESSAGE.SET_NAME('WSH','WSH_DEL_UNASSIGN_DET_ERROR');
11712         FND_MESSAGE.SET_TOKEN('DEL_NAME',wsh_new_deliveries_pvt.get_name(l_delivery_id)); -- Bug#3542095
11713         FND_MESSAGE.SET_TOKEN('DET_NAME',p_ids_tobe_unassigned(i));
11714         x_return_status := l_return_status;
11715         WSH_UTIL_CORE.ADD_MESSAGE(x_return_status,l_module_name);
11716         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11717            --
11718            --IF l_debug_on THEN
11719               --WSH_DEBUG_SV.pop(l_module_name);
11720            --END IF;
11721            --
11722            --RETURN; LPN CONV. rv
11723            raise e_return_excp; -- LPN CONV. rv
11724         END IF;
11725      END IF;
11726 
11727      IF l_parent_container_id(1) IS NOT NULL THEN
11728         OPEN get_lines(l_parent_container_id(1), p_ids_tobe_unassigned(i));
11729         FETCH get_lines INTO l_line_id;
11730         IF get_lines%NOTFOUND THEN
11731            l_line_id := NULL;
11732         END IF;
11733         CLOSE get_lines;
11734 
11735         IF l_debug_on THEN
11736            WSH_DEBUG_SV.log(l_module_name, 'L_LINE_ID ', L_LINE_ID);
11737         END IF;
11738 
11739         IF l_line_id IS NULL THEN
11740            IF l_debug_on THEN
11741                WSH_DEBUG_SV.log(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_UNPACK_EMPTY_CONT
11742                                                recursively for ',l_parent_container_id(1));
11743            END IF;
11744 
11745            -- lpn conv
11746            -- This needs to be done so that the WMS enabled LPNs that become empty
11747            -- need to be deleted at a later stage through Confirm_Delivery
11748            open  l_get_cnt_org_csr(l_parent_container_id(1));
11749            fetch l_get_cnt_org_csr into l_orgn_id, l_line_dir;
11750            close l_get_cnt_org_csr;
11751            l_wms_org := wsh_util_validate.check_wms_org(l_orgn_id);
11752            IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
11753            AND l_line_dir IN ('O', 'IO')
11754            AND l_wms_org = 'Y' THEN
11755            --{
11756                insert into wsh_wms_sync_tmp
11757                       (delivery_detail_id,
11758                        operation_type,
11759                        creation_date)
11760                values (l_parent_container_id(1),
11761                        'DELETE',
11762                        WSH_WMS_LPN_GRP.G_HW_TIME_STAMP);
11763            --}
11764            END IF;
11765            -- lpn conv
11766 
11767            unassign_unpack_empty_cont ( p_ids_tobe_unassigned => l_parent_container_id,
11768                                         p_validate_flag   => p_validate_flag,
11769                                         x_return_status   => l_return_status);
11770            IF l_debug_on THEN
11771               WSH_DEBUG_SV.log(l_module_name, 'After calling UNASSIGN_UNPACK_EMPTY_CONT: ', L_RETURN_STATUS);
11772            END IF;
11773            IF ( l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS ) THEN
11774               IF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11775                     x_return_status := l_return_status ;
11776               ELSIF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
11777                     x_return_status := l_return_status ;
11778               END IF;
11779            END IF;
11780            IF x_return_status IN ( WSH_UTIL_CORE.G_RET_STS_ERROR,WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ) THEN
11781               --IF l_debug_on THEN
11782                  --WSH_DEBUG_SV.pop(l_module_name);
11783               --END IF;
11784               --RETURN; LPN CONV. rv
11785               raise e_return_excp; -- LPN CONV. rv
11786            END IF;
11787         END IF; -- end of l_line_id is null
11788 
11789      END IF;
11790 
11791   END LOOP;
11792 
11793   --
11794   -- K LPN CONV. rv
11795   --
11796   IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
11797   THEN
11798   --{
11799       IF l_debug_on THEN
11800         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);
11801       END IF;
11802 
11803       WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
11804         (
11805           p_in_rec             => l_lpn_in_sync_comm_rec,
11806           x_return_status      => l_return_status,
11807           x_out_rec            => l_lpn_out_sync_comm_rec
11808         );
11809       --
11810       --
11811       IF l_debug_on THEN
11812         WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
11813       END IF;
11814       --
11815       --
11816       IF ( l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS ) THEN
11817         IF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11818           x_return_status := l_return_status ;
11819         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
11820           x_return_status := l_return_status ;
11821         END IF;
11822       END IF;
11823 
11824   --}
11825   END IF;
11826   --
11827   -- K LPN CONV. rv
11828   --
11829   -- Added a pop as it was missing.
11830   IF l_debug_on THEN
11831     WSH_DEBUG_SV.pop(l_module_name);
11832   END IF;
11833 
11834 EXCEPTION
11835   WHEN e_return_excp THEN
11836           --
11837           -- K LPN CONV. rv
11838           --
11839           IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
11840           THEN
11841           --{
11842               IF l_debug_on THEN
11843                 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);
11844               END IF;
11845 
11846               WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
11847                 (
11848                   p_in_rec             => l_lpn_in_sync_comm_rec,
11849                   x_return_status      => l_return_status,
11850                   x_out_rec            => l_lpn_out_sync_comm_rec
11851                 );
11852               --
11853               --
11854               IF l_debug_on THEN
11855                 WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
11856               END IF;
11857               --
11858               --
11859               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
11860                 x_return_status := l_return_status;
11861               END IF;
11862               --
11863           --}
11864           END IF;
11865           --
11866           -- K LPN CONV. rv
11867           --
11868           IF l_debug_on THEN
11869             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:e_return_excp');
11870           END IF;
11871 
11872   WHEN OTHERS THEN
11873        wsh_util_core.default_handler('WSH_NEW_DELIVERY_ACTIONS.unassign_unpack_empty_cont');
11874        x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11875   --
11876   IF l_debug_on THEN
11877      WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11878   END IF;
11879   --
11880       --
11881       -- K LPN CONV. rv
11882       --
11883       IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
11884       THEN
11885       --{
11886           IF l_debug_on THEN
11887             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);
11888           END IF;
11889 
11890           WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
11891             (
11892               p_in_rec             => l_lpn_in_sync_comm_rec,
11893               x_return_status      => l_return_status,
11894               x_out_rec            => l_lpn_out_sync_comm_rec
11895             );
11896           --
11897           --
11898           IF l_debug_on THEN
11899             WSH_DEBUG_SV.log(l_module_name,'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',l_return_status);
11900           END IF;
11901           --
11902           --
11903       --}
11904       END IF;
11905       --
11906       -- K LPN CONV. rv
11907       --
11908   --
11909   -- Debug Statements
11910   --
11911   IF l_debug_on THEN
11912      WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11913   END IF;
11914   --
11915 
11916 END unassign_unpack_empty_cont;
11917 
11918 /*2442099*/
11919 
11920 PROCEDURE Log_Exceptions(p_old_delivery_detail_id IN NUMBER,
11921                          p_new_delivery_detail_id IN NUMBER,
11922                          p_delivery_id            IN NUMBER,
11923                          p_action                 IN VARCHAR2 DEFAULT NULL)
11924 
11925 IS
11926 
11927 cursor parent_del_exception is
11928 --Changed for BUG#3330869
11929 --SELECT *
11930 SELECT  message,
11931 	exception_name,
11932 	trip_id,
11933 	trip_name,
11934 	trip_stop_id,
11935 	delivery_id,
11936 	delivery_name,
11937 	delivery_assignment_id,
11938 	container_name,
11939 	inventory_item_id,
11940 	lot_number,
11941 -- HW OPMCONV - No need for sublot_number
11942 --      sublot_number,
11943 	revision,
11944 	serial_number,
11945 	unit_of_measure,
11946 	unit_of_measure2,
11947 	subinventory,
11948 	locator_id,
11949 	arrival_date,
11950 	departure_date,
11951 	error_message,
11952         attribute_category,
11953         attribute1,
11954         attribute2,
11955         attribute3,
11956         attribute4,
11957         attribute5,
11958         attribute6,
11959         attribute7,
11960         attribute8,
11961         attribute9,
11962         attribute10,
11963         attribute11,
11964         attribute12,
11965 	attribute13,
11966         attribute14,
11967         attribute15,
11968 	request_id,
11969 	logged_at_location_id,
11970 	logging_entity,
11971 	logging_entity_id,
11972 	exception_location_id,
11973 	manually_logged,
11974 	batch_id,
11975         status
11976 --select *
11977 from wsh_exceptions
11978 where delivery_detail_id = p_old_delivery_detail_id;
11979 
11980 l_exception_return_status               VARCHAR2(30);
11981 l_exception_msg_count                   NUMBER;
11982 l_exception_msg_data                    VARCHAR2(4000) := NULL;
11983 l_dummy_exception_id                    NUMBER;
11984 l_exception_error_message               VARCHAR2(2000) := NULL;
11985 l_qty1                                  NUMBER;
11986 l_qty2                                  NUMBER;
11987 l_trip_id                               NUMBER;
11988 l_trip_name                             VARCHAR2(30);
11989 l_trip_stop_id                          NUMBER;
11990 l_delivery_id                           NUMBER;
11991 l_delivery_name                         VARCHAR2(30);
11992 l_departure_date                        DATE;
11993 l_arrival_date                          DATE;
11994 --
11995 l_debug_on BOOLEAN;
11996 --
11997 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'Log_Exceptions';
11998 --
11999 
12000 BEGIN
12001   --
12002   --
12003   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12004   --
12005   IF l_debug_on IS NULL THEN
12006         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12007   END IF;
12008   --
12009   IF l_debug_on THEN
12010   WSH_DEBUG_SV.push(l_module_name);
12011   --
12012   WSH_DEBUG_SV.log(l_module_name,'P_OLD_DELIVERY_DETAIL_ID',P_OLD_DELIVERY_DETAIL_ID);
12013   WSH_DEBUG_SV.log(l_module_name,'P_NEW_DELIVERY_DETAIL_ID',P_NEW_DELIVERY_DETAIL_ID);
12014   WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
12015   --
12016   END IF;
12017 
12018   select requested_quantity,requested_quantity2 into l_qty1,l_qty2
12019   from wsh_delivery_details
12020   where delivery_detail_id = p_new_delivery_detail_id;
12021 
12022   IF l_debug_on THEN
12023                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_XC_UTIL.LOG_EXCEPTION',WSH_DEBUG_SV.C_PROC_LEVEL);
12024   END IF;
12025   --
12026         FOR pexceptions in parent_del_exception
12027         LOOP
12028         IF p_delivery_id is NOT NULL THEN
12029                 l_trip_id := pexceptions.trip_id;
12030                 l_trip_name := pexceptions.trip_name;
12031                 l_trip_stop_id := pexceptions.trip_stop_id;
12032                 l_delivery_id := pexceptions.delivery_id;
12033                 l_delivery_name := pexceptions.delivery_name;
12034                 l_departure_date := pexceptions.departure_date;
12035                 l_arrival_date := pexceptions.arrival_date;
12036         ELSE
12037                 l_trip_id := NULL;
12038                 l_trip_name := NULL;
12039                 l_trip_stop_id := NULL;
12040                 l_delivery_id := NULL;
12041                 l_delivery_name := NULL;
12042                 l_departure_date := NULL;
12043                 l_arrival_date := NULL;
12044         END IF;
12045 
12046         -- Bug 4481016,During Split, Exceptions will not be updated
12047         -- To ensure exceptions are logged against split delivery detail, its required
12048         -- to pass null to l_dummy_exception_id which is used to determine, when to INSERT
12049         -- and when to UPDATE exceptions
12050         IF l_debug_on THEN
12051           WSH_DEBUG_SV.log(l_module_name,'EXCEPTION NAME-',pexceptions.exception_name);
12052           WSH_DEBUG_SV.log(l_module_name,'p_action -',p_action);
12053 
12054         END IF;
12055 
12056         l_dummy_exception_id := NULL;
12057 
12058         wsh_xc_util.log_exception(
12059                       p_api_version             => 1.0,
12060                       x_return_status           => l_exception_return_status,
12061                       x_msg_count               => l_exception_msg_count,
12062                       x_msg_data                => l_exception_msg_data,
12063                       x_exception_id            => l_dummy_exception_id ,
12064                       p_exception_location_id   => pexceptions.exception_location_id,
12065                       p_logged_at_location_id   => pexceptions.logged_at_location_id,
12066                       p_logging_entity          => pexceptions.logging_entity,
12067                       p_logging_entity_id       => pexceptions.logging_entity_id,
12068                       p_exception_name          => pexceptions.exception_name,
12069                       p_message                 => pexceptions.message,
12070 --                      p_severity                => pexceptions.severity,
12071                       p_manually_logged         => pexceptions.manually_logged,
12072 --                      p_exception_handling      => pexceptions.status,
12073                       p_trip_id                 => l_trip_id,
12074                       p_trip_name               => l_trip_name,
12075                       p_trip_stop_id            => l_trip_stop_id,
12076                       p_delivery_id             => l_delivery_id,
12077                       p_delivery_name           => l_delivery_name,
12078                       p_delivery_detail_id      => p_new_delivery_detail_id,
12079                       p_delivery_assignment_id  => pexceptions.delivery_assignment_id,
12080                       p_container_name          => pexceptions.container_name,
12081                       p_inventory_item_id       => pexceptions.inventory_item_id,
12082                       p_lot_number              => pexceptions.lot_number,
12083 -- HW OPMCONV - No need for sublot_number
12084 --                    p_sublot_number           => pexceptions.sublot_number,
12085                       p_revision                => pexceptions.revision,
12086                       p_serial_number           => pexceptions.serial_number,
12087                       p_unit_of_measure         => pexceptions.unit_of_measure,
12088                       p_quantity                => l_qty1,
12089                       p_unit_of_measure2        => pexceptions.unit_of_measure2,
12090                       p_quantity2               => l_qty2,
12091                       p_subinventory            => pexceptions.subinventory,
12092                       p_locator_id              => pexceptions.locator_id,
12093                       p_arrival_date            => l_arrival_date,
12094                       p_departure_date          => l_departure_date,
12095                       p_error_message           => pexceptions.error_message,
12096                       p_attribute_category      => pexceptions.attribute_category,
12097                       p_attribute1              => pexceptions.attribute1,
12098                       p_attribute2              => pexceptions.attribute2,
12099                       p_attribute3              => pexceptions.attribute3,
12100                       p_attribute4              => pexceptions.attribute4,
12101                       p_attribute5              => pexceptions.attribute5,
12102                       p_attribute6              => pexceptions.attribute6,
12103                       p_attribute7              => pexceptions.attribute7,
12104                       p_attribute8              => pexceptions.attribute8,
12105                       p_attribute9              => pexceptions.attribute9,
12106                       p_attribute10             => pexceptions.attribute10,
12107                       p_attribute11             => pexceptions.attribute11,
12108                       p_attribute12             => pexceptions.attribute12,
12109                       p_attribute13             => pexceptions.attribute13,
12110                       p_attribute14             => pexceptions.attribute14,
12111                       p_attribute15             => pexceptions.attribute15,
12112                       p_request_id              => pexceptions.request_id,
12113                       p_batch_id                => pexceptions.batch_id,
12114                       p_status                  => pexceptions.status,
12115                       p_action                  => p_action);
12116 
12117         END LOOP;
12118         IF (l_exception_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
12119         --
12120         -- Debug Statements
12121         --
12122         IF l_debug_on THEN
12123                 WSH_DEBUG_SV.logmsg(l_module_name,  'WSH_XC_UTIL.LOG_EXCEPTION DID NOTRETURN SUCCESS'  );
12124         END IF;
12125         --
12126         END IF;
12127 
12128   IF l_debug_on THEN
12129         WSH_DEBUG_SV.pop(l_module_name);
12130   END IF;
12131 
12132 EXCEPTION
12133   WHEN OTHERS THEN
12134   IF l_debug_on THEN
12135     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12136                 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12137   END IF;
12138 
12139 END Log_Exceptions;
12140 /*2442099*/
12141 
12142 --  Procedure:      Consolidate_Source_Line
12143 --
12144 --  Parameters: p_Cons_Source_Line_Rec_Tab  -> List of delivery details and its corresponding req qtys,
12145 --		 			       bo qtys, source line ids and delivery ids.
12146 --		x_consolidate_ids     ->  Contains the list of existing BO dd_ids, into which the dd_ids passed
12147 --					  in the parameter p_Cons_Source_Line_Rec_Tab got consolidated.
12148 --
12149 --  Description:    This is an internal API.
12150 --                  Consolidates all the unpacked and unassigned back order delivery detail lines
12151 --                  into one delivery detail Line for the given source_line_id. x_consolidate_ids(i)
12152 --                  contains final consolidated delivery detail id corresponding to the ith record
12153 --                  in p_Cons_Source_Line_Rec_Tab.
12154 --
12155 -- HW OPM BUG#:3121616 added requested_quantity2
12156 PROCEDURE Consolidate_Source_Line(
12157     p_Cons_Source_Line_Rec_Tab  IN           WSH_DELIVERY_DETAILS_ACTIONS.Cons_Source_Line_Rec_Tab,
12158     x_consolidate_ids           OUT  NOCOPY  WSH_UTIL_CORE.Id_Tab_Type,
12159     x_return_status             OUT  NOCOPY  VARCHAR2 ) IS
12160 
12161 CURSOR get_bo_dds_cur(p_delivery_detail_id IN NUMBER, p_source_line_id IN NUMBER,p_delivery_id IN NUMBER) is
12162 SELECT  wdd.delivery_detail_id, wdd.requested_quantity,wdd.requested_quantity2
12163 FROM  wsh_delivery_details wdd,
12164       wsh_delivery_assignments_v wda
12165 WHERE     wdd.source_line_id = p_source_line_id
12166 AND       wdd.delivery_detail_id <> p_delivery_detail_id
12167 AND       wdd.released_status = 'B'
12168 AND       wdd.replenishment_status IS NULL --bug# 6749200 (replenishment project)
12169 AND       wdd.delivery_detail_id = wda.delivery_detail_id
12170 AND       wdd.container_flag = 'N'
12171 AND	  wdd.source_code = 'OE'    -- Enables the Consolidation ONLY for the lines imported from Order Management.
12172 AND       (( wda.delivery_id is NULL AND wda.parent_delivery_detail_id is NULL )
12173               OR ( wda.delivery_id = nvl(p_delivery_id,-99)))
12174 FOR UPDATE NOWAIT;
12175 
12176 CURSOR get_line_info_cur(p_line_id IN NUMBER) is
12177 SELECT shipping_instructions,
12178        packing_instructions
12179 FROM oe_order_lines_all
12180 WHERE line_id = p_line_id;
12181 
12182 
12183 -- Tables to store delivery detail id's
12184 
12185 l_cons_dd_ids		       WSH_UTIL_CORE.Id_Tab_Type; -- To store the final delivery details
12186 l_cons_qtys                    WSH_UTIL_CORE.Id_Tab_Type;
12187 -- HW OPM BUG#:3121616 added qty2s
12188 l_cons_qty2s                   WSH_UTIL_CORE.Id_Tab_Type;
12189 l_partial_dd_ids               WSH_UTIL_CORE.Id_Tab_Type; -- To store partial Back Order Del Det
12190 l_partial_org_req_qtys         WSH_UTIL_CORE.Id_Tab_Type;
12191 l_partial_req_qtys             WSH_UTIL_CORE.Id_Tab_Type;
12192 -- HW OPM BUG#:3121616 added qty2s
12193 l_partial_req_qty2s            WSH_UTIL_CORE.Id_Tab_Type;
12194 l_delete_dd_ids                WSH_UTIL_CORE.Id_Tab_Type; -- To store the Del Det to be deleted
12195 -- Bug#3399109 :Changed the Data Type from Id_Tab_Type to tbl_varchar
12196 l_ship_instructions            WSH_UTIL_CORE.tbl_varchar; -- To store shipping instructions
12197 l_pack_instructions            WSH_UTIL_CORE.tbl_varchar; -- To store packing instructions
12198 
12199 
12200 
12201 l_del_det_Id                        NUMBER;
12202 l_req_qty                           NUMBER;
12203 -- HW OPM BUG#:3121616 added qty2s
12204 l_req_qty2                          NUMBER;
12205 l_total_req_qty                     NUMBER := 0;
12206 -- HW OPM BUG#:3121616 added qty2s
12207 l_total_req_qty2                    NUMBER := 0;
12208 l_temp_cnt                          NUMBER;
12209 
12210 
12211 l_user_id                   NUMBER;
12212 l_login_id                  NUMBER;
12213 l_return_status             VARCHAR2(30);
12214 -- J: W/V Changes
12215 l_tmp_weight                NUMBER;
12216 l_tmp_volume                NUMBER;
12217 l_new_gross_wt              NUMBER;
12218 l_new_net_wt                NUMBER;
12219 l_new_vol                   NUMBER;
12220 l_gross_weight              NUMBER;
12221 l_net_weight                NUMBER;
12222 l_volume                    NUMBER;
12223 l_wv_frozen_flag            VARCHAR2(1);
12224 
12225 l_dbi_rs                    VARCHAR2(1); -- Return Status from DBI API
12226 l_dd_txn_id    NUMBER;
12227 l_txn_return_status  VARCHAR2(1);
12228 
12229 --
12230 l_debug_on BOOLEAN;
12231 --
12232 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'CONSOLIDATE_SOURCE_LINE';
12233 --
12234 
12235 BEGIN
12236   --
12237   -- Debug Statements
12238   --
12239   --
12240   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12241   --
12242   IF l_debug_on IS NULL  THEN
12243 
12244      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12245   END IF;
12246   --
12247   IF l_debug_on THEN
12248 
12249   WSH_DEBUG_SV.push(l_module_name);
12250   END IF;
12251   --
12252 
12253   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12254   l_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12255   l_user_id  := FND_GLOBAL.user_id;
12256   l_login_id := FND_GLOBAL.login_id;
12257 
12258   FOR i IN 1..p_Cons_Source_Line_Rec_Tab.count  --{ Looping thru' the input params
12259   LOOP
12260     --
12261     -- Debug Statements
12262     --
12263     IF l_debug_on THEN
12264        WSH_DEBUG_SV.log(l_module_name,'********* Processing the Delivery Detail Id:',p_Cons_Source_Line_Rec_Tab(i).delivery_detail_id);
12265     END IF;
12266     --
12267     l_temp_cnt := l_delete_dd_ids.COUNT;
12268     l_total_req_qty   := 0;
12269 
12270     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);
12271 
12272     LOOP  --{  Fetch all the unassigned unpacked  Backordered  Delivery Details for the same source line id
12273 
12274    -- HW OPM BUG#:3121616 added qty2
12275       FETCH get_bo_dds_cur INTO l_del_det_Id,l_req_qty,l_req_qty2;
12276       EXIT WHEN (get_bo_dds_cur%NOTFOUND);
12277       --
12278       -- Debug Statements
12279       --
12280       IF l_debug_on THEN
12281          --
12282          WSH_DEBUG_SV.log(l_module_name,'Found Existing Back Order Del Det line: ',l_del_det_Id);
12283       END IF;
12284       --
12285       l_delete_dd_ids(l_delete_dd_ids.COUNT + 1) :=l_del_det_Id;
12286       l_total_req_qty := l_total_req_qty + l_req_qty;
12287 -- HW OPM BUG#:3121616 added qty2
12288       l_total_req_qty2 := l_total_req_qty2 + l_req_qty2;
12289 
12290     END LOOP; --} done fetching the existing unasssigned unpacked Backorder lines
12291     CLOSE get_bo_dds_cur;
12292 
12293     IF ( l_delete_dd_ids.COUNT > l_temp_cnt ) --{ Consolidation is possible or not
12294     THEN
12295        -- Use the last Deliver Detail found for the consolidation purpose, accordingly
12296        -- delete the delivery details id from l_delete_dd_ids table.
12297        l_cons_dd_ids (l_cons_dd_ids.COUNT + 1) := l_delete_dd_ids(l_delete_dd_ids.COUNT);
12298        l_delete_dd_ids.delete(l_delete_dd_ids.COUNT);
12299        l_cons_qtys(l_cons_qtys.COUNT + 1) := l_total_req_qty + p_Cons_Source_Line_Rec_Tab(i).bo_qty;
12300 -- HW OPM BUG#:3121616 added qty2s
12301        l_cons_qty2s(l_cons_qty2s.COUNT + 1) := l_total_req_qty2 + p_Cons_Source_Line_Rec_Tab(i).bo_qty2;
12302 -- end of 3121616
12303 
12304 
12305        --
12306        -- Debug Statements
12307        --
12308        IF l_debug_on THEN
12309            WSH_DEBUG_SV.log(l_module_name,'Consolidated Into Delivery Detail Id ',l_cons_dd_ids(l_cons_dd_ids.COUNT));
12310        END IF;
12311 
12312        -- Getting the shipping and packing instructions from the source line id. which are to be assigned
12313        -- to final delivery detail for the given source line id.
12314        open get_line_info_cur(p_Cons_Source_Line_Rec_Tab(i).source_line_id);
12315        fetch get_line_info_cur into l_ship_instructions(l_ship_instructions.COUNT + 1),l_pack_instructions(l_pack_instructions.COUNT + 1);
12316        close get_line_info_cur;
12317 
12318        --  Storing the final delivery detail id in the out parameter
12319        x_consolidate_ids(i):= l_cons_dd_ids(l_cons_dd_ids.COUNT);
12320 
12321        -- If it is partial back ordering then don't delete it, update the existing delivery detail
12322        -- Qty otherwise delete the delivery detail being processing.
12323        IF ( p_Cons_Source_Line_Rec_Tab(i).bo_qty < p_Cons_Source_Line_Rec_Tab(i).req_qty ) --{ Is is partial BO
12324        THEN
12325           l_partial_dd_ids (l_partial_dd_ids.COUNT + 1) := p_Cons_Source_Line_Rec_Tab(i).delivery_detail_id;
12326           l_partial_org_req_qtys(l_partial_req_qtys.COUNT + 1) := p_Cons_Source_Line_Rec_Tab(i).req_qty;
12327           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;
12328 -- HW OPM BUG#:3121616 added qty2s
12329           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;
12330 -- end of 3121616
12331           --
12332           -- Debug Statements
12333           --
12334           IF l_debug_on THEN
12335              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));
12336           END IF;
12337           --
12338        ELSE
12339           l_delete_dd_ids(l_delete_dd_ids.COUNT+1):= p_Cons_Source_Line_Rec_Tab(i).delivery_detail_id;
12340           --
12341           -- Debug Statements
12342           --
12343           IF l_debug_on THEN
12344              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));
12345           END IF;
12346           --
12347       END IF; --} Is it Partial BO
12348    ELSE -- No consolidation if possible for the delivery Detail id
12349       --
12350       -- Debug Statements
12351       --
12352       IF l_debug_on THEN
12353          WSH_DEBUG_SV.log(l_module_name,'No Existing Back Order Del Det Lines found');
12354       END IF;
12355       --
12356       x_consolidate_ids (i) := p_Cons_Source_Line_Rec_Tab(i).delivery_detail_id;
12357    END IF; --} Check for existing back order lines
12358 
12359   END LOOP;  --} End of the Delivery Detail Table
12360 
12361   IF (get_bo_dds_cur%ISOPEN) THEN
12362       CLOSE get_bo_dds_cur;
12363   END IF;
12364 
12365 
12366   -- Handling the Tables created in the above process (BULK Collect)
12367   -- Deleting all the Delivery Detail in the Delete table
12368   FOR i IN 1..l_delete_dd_ids.COUNT
12369   LOOP  -- {
12370      -- deleting the delivery detail line
12371      --
12372      -- Debug Statements
12373      --
12374      IF l_debug_on THEN
12375         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.DELETE_DELIVERY_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
12376      END IF;
12377      --
12378      WSH_DELIVERY_DETAILS_PKG.Delete_Delivery_Details(
12379                     p_delivery_detail_id  => l_delete_dd_ids(i),
12380                     x_return_status       => l_return_status );
12381 
12382      --
12383      IF l_debug_on THEN
12384         WSH_DEBUG_SV.logmsg(l_module_name, 'After calling DELETE_DELIVERY_DETAILS: ' || l_return_status );
12385      END IF;
12386      --
12387      IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
12388         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12389      ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
12390         RAISE FND_API.G_EXC_ERROR;
12391      END IF;
12392 
12393   END LOOP; -- }
12394 
12395   IF l_debug_on THEN
12396     WSH_DEBUG_SV.log(l_module_name,'Updating details for consolidation.Detail Count-',l_cons_dd_ids.count);
12397   END IF;
12398   -- Updating the selected Delivery Details for the consolidation with corresponding total Qty
12399   FOR i IN 1..l_cons_dd_ids.COUNT LOOP
12400 	-- HW OPM BUG#:3121616 added qty2s
12401 	  UPDATE wsh_delivery_details
12402 	  SET requested_quantity  =  l_cons_qtys(i),
12403 	      requested_quantity2  = l_cons_qty2s(i),
12404 	     tracking_number     = null,
12405 	     master_container_item_id = null,
12406 	     detail_container_item_id = null,
12407 	     seal_code                = null,
12408 	     shipping_instructions    = l_ship_instructions(i),
12409 	     packing_instructions     =  l_pack_instructions(i)
12410 	  WHERE delivery_detail_id     = l_cons_dd_ids (i);
12411 
12412         WSH_DD_TXNS_PVT.create_dd_txn_from_dd  (p_delivery_detail_id => l_cons_dd_ids(i),
12413  										x_dd_txn_id => l_dd_txn_id,
12414  										x_return_status =>l_txn_return_status);
12415 
12416          IF (l_txn_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
12417                   x_return_status := l_txn_return_status;
12418                   RETURN;
12419         END IF;
12420    END LOOP;
12421 
12422   --
12423   -- DBI Project
12424   -- Update of wsh_delivery_details where requested_quantity/released_status
12425   -- are changed, call DBI API after the update.
12426   -- DBI API will check if DBI is installed
12427   IF l_debug_on THEN
12428     WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail Count-',l_cons_dd_ids.count);
12429   END IF;
12430   WSH_INTEGRATION.DBI_Update_Detail_Log
12431     (p_delivery_detail_id_tab => l_cons_dd_ids,
12432      p_dml_type               => 'UPDATE',
12433      x_return_status          => l_dbi_rs);
12434 
12435   IF l_debug_on THEN
12436     WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
12437   END IF;
12438   -- Only Handle Unexpected error
12439   IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
12440     --
12441     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12442   END IF;
12443   -- End of Code for DBI Project
12444   --
12445 
12446   -- Bug#3670261
12447   -- Deleting the Freight Costs associated with the delivery details selected for Consolidation
12448   FORALL i IN 1..l_cons_dd_ids.COUNT
12449   DELETE FROM WSH_FREIGHT_COSTS
12450   WHERE  delivery_detail_id = l_cons_dd_ids(i);
12451   IF l_debug_on THEN
12452       WSH_DEBUG_SV.log(l_module_name,'Freight Cost Rows deleted',SQL%ROWCOUNT);
12453   END IF;
12454 
12455   -- J: W/V Changes
12456   IF l_debug_on THEN
12457     WSH_DEBUG_SV.logmsg(l_module_name,'l_cons_dd_ids.COUNT '||l_cons_dd_ids.COUNT);
12458   END IF;
12459 
12460   IF l_cons_dd_ids.COUNT > 0 THEN
12461 
12462     FOR l_index in l_cons_dd_ids.FIRST..l_cons_dd_ids.LAST LOOP
12463 
12464       IF l_debug_on THEN
12465         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DETAIL_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
12466       END IF;
12467       --
12468       WSH_WV_UTILS.Detail_Weight_Volume(
12469         p_delivery_detail_id => l_cons_dd_ids(l_index),
12470         p_update_flag        => 'Y',
12471         p_post_process_flag  => 'Y',
12472         p_calc_wv_if_frozen  => 'Y',
12473         x_net_weight         => l_tmp_weight,
12474         x_volume             => l_tmp_volume,
12475         x_return_status      => l_return_status);
12476       IF l_debug_on THEN
12477         WSH_DEBUG_SV.log(l_module_name,'l_return_status',l_return_status);
12478       END IF;
12479       IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
12480         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12481       ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
12482         RAISE FND_API.G_EXC_ERROR;
12483       ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12484         x_return_status := l_return_status;
12485       END IF;
12486 
12487     END LOOP;
12488   END IF;
12489 
12490   IF l_debug_on THEN
12491     WSH_DEBUG_SV.log(l_module_name,'Updating partial bkorder cases.Detail Count-',l_partial_dd_ids.count);
12492   END IF;
12493   -- Updating the partial Back order cases. Qty should be subtracted for the partial case
12494   FORALL i IN 1..l_partial_dd_ids.COUNT
12495 -- HW OPM BUG#:3121616 added qty2s
12496   UPDATE wsh_delivery_details
12497   SET requested_quantity = l_partial_req_qtys(i),
12498       requested_quantity2 = l_partial_req_qty2s(i)
12499   WHERE delivery_detail_id = l_partial_dd_ids (i);
12500 
12501   --
12502   -- DBI Project
12503   -- Update of wsh_delivery_details where requested_quantity/released_status
12504   -- are changed, call DBI API after the update.
12505   -- DBI API will check if DBI is installed
12506   IF l_debug_on THEN
12507     WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail Count-',l_partial_dd_ids.count);
12508   END IF;
12509   WSH_INTEGRATION.DBI_Update_Detail_Log
12510     (p_delivery_detail_id_tab => l_partial_dd_ids,
12511      p_dml_type               => 'UPDATE',
12512      x_return_status          => l_dbi_rs);
12513 
12514   IF l_debug_on THEN
12515     WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
12516   END IF;
12517   -- Only Handle Unexpected error
12518   IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
12519     --
12520     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12521   END IF;
12522   -- End of Code for DBI Project
12523   --
12524 
12525   -- We need to adjust the W/V if DDs W/V is frozen
12526   IF l_partial_dd_ids.COUNT > 0 THEN
12527 
12528     IF l_debug_on THEN
12529       WSH_DEBUG_SV.logmsg(l_module_name,'l_partial_dd_ids.COUNT '||l_partial_dd_ids.COUNT);
12530     END IF;
12531 
12532     FOR l_index in l_partial_dd_ids.FIRST..l_partial_dd_ids.LAST LOOP
12533 
12534       SELECT gross_weight,
12535              net_weight,
12536              volume,
12537              nvl(wv_frozen_flag,'Y')
12538       INTO   l_gross_weight,
12539              l_net_weight,
12540              l_volume,
12541              l_wv_frozen_flag
12542       FROM   wsh_delivery_details
12543       WHERE  delivery_detail_id = l_partial_dd_ids(l_index);
12544 
12545       IF l_wv_frozen_flag = 'Y' THEN
12546 
12547         IF l_debug_on THEN
12548           WSH_DEBUG_SV.logmsg(l_module_name,'W/V Frozen flag is Y for DD '||l_partial_dd_ids(l_index));
12549         END IF;
12550 
12551         l_new_gross_wt := round(l_gross_weight * (l_partial_req_qtys(l_index)/l_partial_org_req_qtys(l_index)) ,5);
12552         l_new_net_wt   := round(l_net_weight * (l_partial_req_qtys(l_index)/l_partial_org_req_qtys(l_index)) ,5);
12553         l_new_vol      := round(l_volume * (l_partial_req_qtys(l_index)/l_partial_org_req_qtys(l_index)) ,5);
12554 
12555         IF l_debug_on THEN
12556           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);
12557         END IF;
12558 
12559         UPDATE wsh_delivery_details
12560         set    gross_weight = l_new_gross_wt,
12561                net_weight   = l_new_net_wt,
12562                volume       = l_new_vol
12563         WHERE  delivery_detail_id = l_partial_dd_ids(l_index);
12564 
12565         IF l_debug_on THEN
12566           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
12567         END IF;
12568 
12569         WSH_WV_UTILS.DD_WV_Post_Process(
12570           p_delivery_detail_id => l_partial_dd_ids(l_index),
12571           p_diff_gross_wt      => -1 * (l_gross_weight - l_new_gross_wt),
12572           p_diff_net_wt        => -1 * (l_net_weight - l_new_net_wt),
12573           p_diff_fill_volume   => -1 * (l_volume - l_new_vol),
12574           x_return_status      => l_return_status);
12575 
12576         IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
12577           --
12578            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12579            WSH_UTIL_CORE.Add_Message(x_return_status);
12580            IF l_debug_on THEN
12581              WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
12582              WSH_DEBUG_SV.pop(l_module_name);
12583            END IF;
12584            return;
12585         END IF;
12586 
12587       END IF;
12588     END LOOP;
12589   END IF;
12590 
12591   --
12592   -- Debug Statements
12593   --
12594   IF l_debug_on THEN
12595      WSH_DEBUG_SV.pop(l_module_name);
12596   END IF;
12597   --
12598   EXCEPTION
12599 
12600     WHEN FND_API.G_EXC_ERROR THEN
12601             x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12602 
12603             --
12604             IF l_debug_on THEN
12605               WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
12606               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
12607             END IF;
12608             --
12609             return;
12610      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
12611             x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12612             --
12613             IF l_debug_on THEN
12614               WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_UNEXPECTED_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
12615               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
12616             END IF;
12617             --
12618             return;
12619 
12620 
12621       WHEN OTHERS THEN
12622          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12623          WSH_UTIL_CORE.default_handler('WSH_DELIVERY_DETAILS_ACTIONS.Consolidate_Source_Lines ' );
12624          --
12625          -- Debug Statements
12626          --
12627          IF l_debug_on THEN
12628             WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12629             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12630          END IF;
12631           --
12632 END Consolidate_Source_Line;
12633 
12634 
12635 --
12636 --  Procedure:   Process_Delivery_Details
12637 --  Parameters:
12638 --	p_delivery_detail_id:  delivery detail id need to be processed
12639 --	p_bo_qty	    :  backordered quantity to unreserve
12640 --	p_overpick_qty	    :  overpicked quantity to unreserve
12641 --	p_bo_mode	    :  either UNRESERVE/CYCLE_COUNT
12642 --	p_delete_flag	    :  'Y' will delete the delivery detail passed
12643 --			       'N' doesnot delete.
12644 --  Description: This procedure will do unreservation, unpack/unassign
12645 --  for the passed delivery detail id. It deletes the delivery detail
12646 --  if p_delete_flag is passed as 'Y'.
12647 --  Added this procedure as part of code changes for the Bug#3317692
12648 PROCEDURE Process_Delivery_Details (
12649  	p_delivery_detail_id	IN   NUMBER,
12650 	p_bo_qty		IN   NUMBER,
12651 	p_bo_qty2s		IN   NUMBER,
12652 	p_overpick_qty		IN   NUMBER,
12653 	p_bo_mode		IN   VARCHAR2,
12654         p_delete_flag	        IN   VARCHAR2 DEFAULT NULL,
12655  	x_return_status		OUT  NOCOPY   VARCHAR2
12656 ) IS
12657 
12658 l_delivery_detail_ids		WSH_UTIL_CORE.Id_Tab_Type;
12659 l_idx				NUMBER;
12660 
12661 l_inventory_item_id     NUMBER   := NULL;
12662 l_organization_id       NUMBER   := NULL;
12663 l_subinventory          VARCHAR2(10) := NULL;
12664 l_serial_number         VARCHAR2(30) := NULL;
12665 l_transaction_temp_id   NUMBER   := NULL;
12666 l_inv_controls_rec      WSH_DELIVERY_DETAILS_INV.inv_control_flag_rec;
12667 l_return_status         VARCHAR2(5) := NULL;
12668 
12669 --
12670 l_debug_on BOOLEAN;
12671 --
12672 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'PROCESS_DELIVERY_DETAILS';
12673 --
12674 BEGIN
12675 	--
12676 	--
12677 	l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12678 	--
12679 	IF l_debug_on IS NULL
12680 	THEN
12681 	    l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12682 	END IF;
12683 	--
12684 	IF l_debug_on THEN
12685 	    WSH_DEBUG_SV.push(l_module_name);
12686 	    --
12687 	    WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_DETAIL_ID',p_delivery_detail_id);
12688 	    WSH_DEBUG_SV.log(l_module_name,'P_BO_QTY',p_bo_qty);
12689 	    WSH_DEBUG_SV.log(l_module_name,'P_OVERPICK_QTY',p_overpick_qty);
12690 	    WSH_DEBUG_SV.log(l_module_name,'P_BO_MODE',P_BO_MODE);
12691 	    WSH_DEBUG_SV.log(l_module_name,'P_DELETE_FLAG',P_DELETE_FLAG);
12692 	END IF;
12693 	--
12694 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12695 
12696 	--
12697         -- Debug Statements
12698         --
12699         IF l_debug_on THEN
12700            WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.unassign_unpack_empty_cont',WSH_DEBUG_SV.C_PROC_LEVEL);
12701         END IF;
12702         --
12703 	l_delivery_detail_ids(1) := p_delivery_detail_id;
12704         IF (p_delete_flag = 'Y') THEN --{
12705 	        WSH_DELIVERY_DETAILS_ACTIONS.unassign_unpack_empty_cont (
12706 		               p_ids_tobe_unassigned  => l_delivery_detail_ids ,
12707                                p_validate_flag => 'N',
12708                                x_return_status   => l_return_status
12709                               );
12710 		IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
12711 			raise FND_API.G_EXC_ERROR;
12712 	        ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
12713 		        raise FND_API.G_EXC_UNEXPECTED_ERROR;
12714 	        END IF;
12715 	END IF; --}
12716 
12717 	IF (p_bo_qty > 0) THEN --{
12718 		--
12719 	        -- Debug Statements
12720 		--
12721 		IF l_debug_on THEN
12722 		      WSH_DEBUG_SV.logmsg(l_module_name,'Unreserving the Backordered quantity ',WSH_DEBUG_SV.C_PROC_LEVEL);
12723 	     	      WSH_DEBUG_SV.logmsg(l_module_name,'... delivery_detail_id '|| p_delivery_detail_id,WSH_DEBUG_SV.C_PROC_LEVEL);
12724 		      WSH_DEBUG_SV.logmsg(l_module_name,'... backordered quantity '||p_bo_qty ,WSH_DEBUG_SV.C_PROC_LEVEL);
12725 		      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNRESERVE_DELIVERY_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
12726 		END IF;
12727 		--
12728 	        wsh_delivery_details_actions.unreserve_delivery_detail(
12729 		       p_delivery_Detail_id    => p_delivery_detail_id,
12730 		       p_unreserve_mode        => p_bo_mode ,
12731 	               p_quantity_to_unreserve => p_bo_qty,
12732                        p_override_retain_ato_rsv    => 'N',
12733        		       p_quantity2_to_unreserve => p_bo_qty2s,
12734 	               x_return_status         => l_return_status
12735 	              );
12736 		IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
12737 		       raise FND_API.G_EXC_ERROR;
12738 		ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
12739 		       raise FND_API.G_EXC_UNEXPECTED_ERROR;
12740 	  	END IF;
12741 	END IF; --}
12742 
12743 	IF (p_overpick_qty > 0) THEN --{
12744 		--
12745 		-- Debug Statements
12746 		--
12747 		IF l_debug_on THEN
12748 		      WSH_DEBUG_SV.logmsg(l_module_name,'Unreserving the Backordered quantity ',WSH_DEBUG_SV.C_PROC_LEVEL);
12749 	     	      WSH_DEBUG_SV.logmsg(l_module_name,'... delivery_detail_id '|| p_delivery_detail_id,WSH_DEBUG_SV.C_PROC_LEVEL);
12750 		      WSH_DEBUG_SV.logmsg(l_module_name,'... overpicked quantity '||p_overpick_qty ,WSH_DEBUG_SV.C_PROC_LEVEL);
12751 		      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNRESERVE_DELIVERY_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
12752 		END IF;
12753 		--
12754 	       --Bug 4721577 Do not retain reservation for overpicked quantities
12755 		IF p_bo_mode = 'RETAIN_RSV' THEN
12756 	          wsh_delivery_details_actions.unreserve_delivery_detail(
12757 		       p_delivery_Detail_id    => p_delivery_detail_id,
12758 		       p_unreserve_mode        => 'UNRESERVE' ,
12759 	               p_quantity_to_unreserve => p_overpick_qty,
12760                        p_override_retain_ato_rsv    => 'Y',
12761        		       p_quantity2_to_unreserve => p_bo_qty2s,
12762 	               x_return_status         => l_return_status
12763 	              );
12764                 ELSE
12765 		wsh_delivery_details_actions.unreserve_delivery_detail(
12766 		       p_delivery_Detail_id    => p_delivery_detail_id,
12767 		       p_unreserve_mode        => p_bo_mode ,
12768 	               p_quantity_to_unreserve => p_overpick_qty,
12769                        p_override_retain_ato_rsv    => 'Y',
12770        		       p_quantity2_to_unreserve => p_bo_qty2s,
12771 	               x_return_status         => l_return_status
12772 	              );
12773 		END IF;
12774 		IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
12775 		       raise FND_API.G_EXC_ERROR;
12776 		ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
12777 		       raise FND_API.G_EXC_UNEXPECTED_ERROR;
12778 	  	END IF;
12779 	END IF;  --}
12780 
12781         IF (p_delete_flag = 'Y') THEN --{
12782 		--
12783 	        -- Debug Statements
12784 		--
12785 		IF l_debug_on THEN
12786 		      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.Delete_Delivery_Details',WSH_DEBUG_SV.C_PROC_LEVEL);
12787 		END IF;
12788 		--
12789 
12790 		WSH_DELIVERY_DETAILS_PKG.Delete_Delivery_Details(
12791 			p_delivery_detail_id => p_delivery_detail_id,
12792 			p_cancel_flag        => 'N',
12793 			x_return_status      => l_return_status);
12794 		IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
12795 			raise FND_API.G_EXC_ERROR;
12796 	        ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
12797 		        raise FND_API.G_EXC_UNEXPECTED_ERROR;
12798 	        END IF;
12799 	END IF;  --}
12800 
12801 	IF l_debug_on THEN
12802 	    WSH_DEBUG_SV.pop(l_module_name);
12803 	END IF;
12804 
12805   EXCEPTION
12806    	WHEN others THEN
12807  		x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12808 		wsh_util_core.default_handler('WSH_DELIVERY_DETAILS_PKG.Process_Delivery_Details',l_module_name);
12809 		--
12810 		IF l_debug_on THEN
12811 		    WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12812 		    WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12813 		END IF;
12814 		--
12815 END Process_Delivery_Details;
12816 
12817 --  Procedure:      Consolidate_Delivery_Details
12818 --
12819 --  Parameters: p_delivery_details_tab  -> list of delivery details and its corresponding req qtys, bo qtys,
12820 --		 			   source line ids and delivery ids
12821 --              p_bo_mode		-> Either  'UNRESERVE'  or 'CYCLE_COUNT' or 'RETAIN_RSV'
12822 --                                         'RETAIN_RSV' added for bug 4721577, however this API is not affected
12823 --                                         beacuse of this change.
12824 --		x_cons_delivery_details_tab -> This is a filtered table of p_delivery_details_tab.
12825 --					   This contains the list of dd_ids into which the dd_ids passed
12826 --		                           in the parameter p_delivery_details_tab get consolidated.
12827 --					   This also contains the corresponding req qtys, bo qyts and
12828 --					   source line ids. Corresponding delivery_id field will be NULL.
12829 --		x_remain_bo_qtys	-> Contains the sum of backorder quantities of delivery details(except
12830 --					   for the dd_id in x_cons_delivery_details_tab) for each source line.
12831 --					   x_remain_bo_qtys has a quantity for each dd_id in
12832 --					   x_cons_delivery_details_tab.
12833 --  Description:    This API is Internally used by ShipConfirm to
12834 --                  consolidate the delivery details going to be BackOrdered.
12835 --                  This Procedure takes the list of delivery details
12836 --                  under a Delivery and consolidates them into one
12837 --                  delivery detail for each source line id.
12838 --
12839 -- HW OPM BUG#:3121616 Added x_remain_bo_qty2s
12840 PROCEDURE Consolidate_Delivery_Details(
12841 	 	p_delivery_details_tab  IN     WSH_DELIVERY_DETAILS_ACTIONS.Cons_Source_Line_Rec_Tab,
12842 		p_bo_mode	        IN     VARCHAR2,
12843 	 	x_cons_delivery_details_tab  OUT NOCOPY  WSH_DELIVERY_DETAILS_ACTIONS.Cons_Source_Line_Rec_Tab,
12844 		x_remain_bo_qtys	OUT NOCOPY   WSH_UTIL_CORE.Id_Tab_Type,
12845                 x_remain_bo_qty2s	OUT NOCOPY   WSH_UTIL_CORE.Id_Tab_Type,
12846 		x_return_status		OUT NOCOPY   VARCHAR2
12847     ) IS
12848 l_line_ids		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the source line ids passed as parameter
12849 l_detail_ids		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the delivery detail ids passed as parameter
12850 l_delivery_details_tab  WSH_DELIVERY_DETAILS_ACTIONS.Cons_Source_Line_Rec_Tab;   -- Stores the delivery detail records with req-qty >0
12851 l_freight_detail_ids	WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the delivery details for which the freight costs need to be deleted.
12852 l_req_qtys		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the requested quantities passed as parameter
12853 l_bo_qtys		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the BO quantities passed as parameter
12854 l_overpick_qtys         WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the Overpicked quantities passed as parameter
12855 -- HW OPM BUG#:3121616 added qty2s
12856 l_bo_qty2s		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the BO quantities2 passed as parameter
12857 l_cons_dd_ids		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores consolidate dd_id for line_id at l_cons_dd_ids(line_id)
12858 l_cons_dd_flags		WSH_UTIL_CORE.Column_Tab_Type;
12859 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)
12860 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)
12861 -- HW OPM BUG#:3121616 added qty2s
12862 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)
12863 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)
12864 l_delete_dd_ids		WSH_UTIL_CORE.Id_Tab_Type;  -- Stores the all delivery details need to be deleted(that are getting
12865  					               -- completely BackOrdered), except one delivery detail for each source line.
12866 
12867 l_curr_line_id		NUMBER;  -- This temporary variable stores the current line_id in a loop.
12868 l_cons_dd_id		NUMBER;	 -- This contains the delivery_detail_id that gets consolidation into
12869 l_found_complete_bo	VARCHAR2(1);
12870 l_total_bo_qty		NUMBER;
12871 -- HW OPM BUG#:3121616 added qty2s
12872 l_total_bo_qty2         NUMBER;
12873 l_return_status		VARCHAR2(1);
12874 
12875 l_idx			NUMBER := 1;
12876 l_cmp_idx		NUMBER := 1;
12877 l_next_idx		NUMBER := 1;
12878 
12879 l_detail_tab            WSH_UTIL_CORE.id_tab_type; -- DBI Project
12880 l_dbi_rs                VARCHAR2(1); -- Return Status from DBI API
12881 
12882 --
12883 l_debug_on BOOLEAN;
12884 --
12885 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'CONSOLIDATE_DELIVERY_DETAILS';
12886 --
12887 BEGIN
12888   --
12889   --
12890   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12891   --
12892   IF l_debug_on IS NULL
12893   THEN
12894       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12895   END IF;
12896   --
12897   IF l_debug_on THEN
12898       WSH_DEBUG_SV.push(l_module_name);
12899 
12900       WSH_DEBUG_SV.log(l_module_name,'P_BO_MODE',p_bo_mode);
12901   END IF;
12902   --
12903 
12904   l_return_status := FND_API.G_RET_STS_SUCCESS;
12905   x_return_status := FND_API.G_RET_STS_SUCCESS;
12906 
12907   -- Store the passed parameter values into local pl/sql tables
12908   FOR i IN p_delivery_details_tab.FIRST .. p_delivery_details_tab.LAST LOOP --{
12909 	l_detail_ids(i) := p_delivery_details_tab(i).delivery_detail_id;
12910 	l_line_ids(i)   := p_delivery_details_tab(i).source_line_id;
12911 	l_req_qtys(i)   := p_delivery_details_tab(i).req_qty;
12912 	l_bo_qtys(i)    := p_delivery_details_tab(i).bo_qty;
12913         l_overpick_qtys(i)    := p_delivery_details_tab(i).overpick_qty;    -- Bug#3263952
12914 -- HW OPM BUG#:3121616 added qty2s
12915 	l_bo_qty2s(i)   := p_delivery_details_tab(i).bo_qty2;
12916 
12917         IF p_delivery_details_tab(i).req_qty = 0 THEN
12918 	        l_cons_dd_flags(i) := 'Y';
12919         ELSE
12920 	        l_cons_dd_flags(i) := 'N';
12921         END IF;
12922 
12923   END LOOP; --}
12924 
12925   -- Following Code gets the dd_id for each source_line, that will be used for consolidation
12926   -- from the passed list of delivery details.
12927   l_idx := p_delivery_details_tab.FIRST;
12928   WHILE l_idx IS NOT NULL
12929   LOOP  -- {
12930 
12931      -- Do not consider dd's with requested_quantity = 0 , for consolidation now . These are already
12932      -- marked earlier.
12933       IF p_delivery_details_tab(l_idx).req_qty > 0 THEN
12934 	       l_delivery_details_tab(l_idx) := p_delivery_details_tab(l_idx);
12935       END IF;
12936       l_idx := p_delivery_details_tab.NEXT(l_idx);
12937   END LOOP; --}
12938 
12939   IF l_debug_on THEN
12940     WSH_DEBUG_SV.logmsg(l_module_name,'Finding the delivery detail to Consolidate into, from the input list',WSH_DEBUG_SV.C_PROC_LEVEL);
12941   END IF;
12942 
12943   -- Mark the corresponding entry in l_cons_dd_flags(i) to 'Y', if l_detail_ids(i) is
12944   -- the consolidated delivery detail. Mark l_cons_dd_flags(i) to 'N' otherwise.
12945   -- Logic: Parse thru the entire list for a source line and set the first found completely backordered
12946   --        delivery detail as the consolidate delivery detail.
12947   --	    If we don't find the completely backordered delivery detail under the source line,
12948   --	    then set the first delivery detail in the list for the source line as the consolidate delivery detail.
12949   --
12950   l_idx := l_delivery_details_tab.FIRST;
12951   WHILE l_idx IS NOT NULL
12952   LOOP  -- {
12953 	l_found_complete_bo := 'N';
12954 	IF (l_delivery_details_tab(l_idx).bo_qty = l_delivery_details_tab(l_idx).req_qty ) THEN --{
12955 		l_found_complete_bo  := 'Y';
12956 		l_cons_dd_flags(l_idx) := 'Y';
12957  	END IF; --}
12958 
12959 	l_next_idx := l_delivery_details_tab.NEXT(l_idx);
12960 	WHILE l_next_idx IS NOT NULL
12961 	LOOP  --{
12962 		IF l_delivery_details_tab(l_next_idx).source_line_id = l_delivery_details_tab(l_idx).source_line_id THEN
12963 		    IF l_found_complete_bo = 'N' AND
12964 			      (l_delivery_details_tab(l_next_idx).bo_qty = l_delivery_details_tab(l_next_idx).req_qty) THEN
12965 			 l_found_complete_bo  := 'Y';
12966 			 l_cons_dd_flags(l_next_idx) := 'Y';
12967 		    END IF;
12968 	            l_delivery_details_tab.DELETE(l_next_idx);
12969 		END IF;
12970   	        l_next_idx := l_delivery_details_tab.NEXT(l_next_idx);
12971 	END LOOP; --}
12972 
12973 	IF l_found_complete_bo = 'N' THEN
12974         	l_cons_dd_flags(l_idx) := 'Y';
12975 	END IF;
12976 	l_delivery_details_tab.DELETE(l_idx);
12977 
12978 	l_idx := l_delivery_details_tab.NEXT(l_idx);
12979   END LOOP;  --}
12980   --
12981 
12982   -- Keep the delivery_detail_ids used for consolidation and the corresponding quantities
12983   -- to pass them back to the Caller.
12984   l_idx := p_delivery_details_tab.FIRST;
12985   WHILE l_idx IS NOT NULL
12986   LOOP  --{
12987 	IF l_cons_dd_flags(l_idx) = 'Y' THEN --{
12988   	     x_cons_delivery_details_tab(x_cons_delivery_details_tab.COUNT+1).delivery_detail_id :=  p_delivery_details_tab(l_idx).delivery_detail_id;
12989   	     x_cons_delivery_details_tab(x_cons_delivery_details_tab.COUNT).req_qty  :=  p_delivery_details_tab(l_idx).req_qty;
12990   	     x_cons_delivery_details_tab(x_cons_delivery_details_tab.COUNT).bo_qty   :=  p_delivery_details_tab(l_idx).bo_qty;
12991 -- HW OPM BUG#:3121616 added qty2s
12992   	     x_cons_delivery_details_tab(x_cons_delivery_details_tab.COUNT).bo_qty2         :=  p_delivery_details_tab(l_idx).bo_qty2;
12993   	     x_cons_delivery_details_tab(x_cons_delivery_details_tab.COUNT).source_line_id  :=  p_delivery_details_tab(l_idx).source_line_id;
12994 	     x_cons_delivery_details_tab(x_cons_delivery_details_tab.COUNT).overpick_qty := p_delivery_details_tab(l_idx).overpick_qty;
12995 								     -- Bug#3263952
12996 	     IF l_debug_on THEN
12997                IF p_delivery_details_tab(l_idx).req_qty > 0 THEN
12998 		     WSH_DEBUG_SV.logmsg(l_module_name,'Delivery details of the Source Line '||p_delivery_details_tab(l_idx).source_line_id ||
12999 			' are getting consolidated into dd_id :'||p_delivery_details_tab(l_idx).delivery_detail_id,WSH_DEBUG_SV.C_PROC_LEVEL);
13000   	       END IF;
13001 	     END IF;
13002 	END IF;  --}
13003   	l_idx := p_delivery_details_tab.NEXT(l_idx);
13004   END LOOP; --}
13005 
13006   --  loop thru' input delivery details using the index variable l_idx.
13007   --  add the backordered quantities of the all the delivery details under the same line_id
13008   --  and delete those delivery details from the pl/sql table l_detail_ids.
13009   l_idx := l_detail_ids.FIRST;
13010   WHILE l_idx IS NOT NULL
13011   LOOP  --{ loop thru' l_detail_ids
13012         l_curr_line_id := l_line_ids(l_idx);
13013 
13014   	-- Calculating the consolidate backorder quantity for l_curr_line_id.
13015   	-- Loop thru' the list and sum up the backorder quantities of the delivery details for l_curr_line_id.
13016 	-- Delete the delivery_details of l_curr_line_id from the pl/sql table l_detail_ids,
13017 	-- after getting the corresponding backorder quantity.
13018 	l_total_bo_qty := 0;  -- Used to store the Consolidated BO qty.
13019 -- HW OPM BUG#:3121616 added qty2s
13020 	l_total_bo_qty2 := 0;  -- Used to store the Consolidated BO qty2
13021   	l_cmp_idx := l_idx;  -- Starting from l_idx, find all dds from l_detail_ids which belong to the
13022 		 	     -- current line id
13023 	WHILE l_cmp_idx IS NOT NULL
13024 	LOOP --{
13025 	    IF ( (l_curr_line_id = l_line_ids(l_cmp_idx)) AND (l_cons_dd_flags(l_cmp_idx) <> 'Y') ) THEN
13026 	 --{
13027      	        l_total_bo_qty := l_total_bo_qty + l_bo_qtys(l_cmp_idx);
13028 -- HW OPM BUG#:3121616 added qty2s
13029                 l_total_bo_qty2 := l_total_bo_qty2 + l_bo_qty2s(l_cmp_idx);
13030 
13031                 -- If a delivery detail is completely backorderd, delete it physically(pass p_delete_flag as 'Y'
13032 		-- to process_delivery_details).
13033 		IF l_bo_qtys(l_cmp_idx) = l_req_qtys(l_cmp_idx) THEN
13034 	     --{
13035 	           --
13036 		   IF l_debug_on THEN
13037 		      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Process_Delivery_Details',WSH_DEBUG_SV.C_PROC_LEVEL);
13038 	  	      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);
13039 		   END IF;
13040 		   --
13041 		   Process_Delivery_Details (
13042 		 	p_delivery_detail_id	=> l_detail_ids(l_cmp_idx),
13043 			p_bo_qty		=> l_bo_qtys(l_cmp_idx),
13044 			p_overpick_qty		=> l_overpick_qtys(l_cmp_idx),
13045 			p_bo_mode		=> p_bo_mode,
13046 		        p_delete_flag	        => 'Y',
13047 			p_bo_qty2s		=> l_bo_qty2s(l_cmp_idx),
13048 		 	x_return_status		=> l_return_status
13049 			);
13050 	  	   IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
13051 			raise FND_API.G_EXC_ERROR;
13052 		   ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
13053 		        raise FND_API.G_EXC_UNEXPECTED_ERROR;
13054 		   END IF;
13055 
13056    	        -- If a delivery detail is partially backordered , unreserve the backordered
13057 		-- quantity and later update its requested quantity. This delivery detail should not be
13058 		-- deleted ( pass p_delete_flag as 'N' to process_delivery_details).
13059 		ELSIF ((l_bo_qtys(l_cmp_idx) > 0 OR l_overpick_qtys(l_cmp_idx) > 0)) THEN
13060 		   --
13061 		   IF l_debug_on THEN
13062 		      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Process_Delivery_Details',WSH_DEBUG_SV.C_PROC_LEVEL);
13063       	  	      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);
13064 		   END IF;
13065 		   --
13066 	  	   Process_Delivery_Details (
13067 		 	p_delivery_detail_id	=> l_detail_ids(l_cmp_idx),
13068 			p_bo_qty		=> l_bo_qtys(l_cmp_idx),
13069 			p_overpick_qty		=> l_overpick_qtys(l_cmp_idx),
13070 			p_bo_mode		=> p_bo_mode,
13071 		        p_delete_flag	        => 'N',
13072 			p_bo_qty2s		=> l_bo_qty2s(l_cmp_idx),
13073 		 	x_return_status		=> l_return_status
13074 			);
13075 	  	   IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
13076 			raise FND_API.G_EXC_ERROR;
13077 		   ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
13078 		        raise FND_API.G_EXC_UNEXPECTED_ERROR;
13079 		   END IF;
13080 
13081 -- HW OPM BUG#:3121616 added qty2s
13082  	           update wsh_delivery_details
13083 		   set requested_quantity = requested_quantity - l_bo_qtys(l_cmp_idx),
13084                        requested_quantity2 = requested_quantity2 - l_bo_qty2s(l_cmp_idx),
13085                        picked_quantity = picked_quantity - l_bo_qtys(l_cmp_idx) - l_overpick_qtys(l_cmp_idx),
13086                        picked_quantity2 = picked_quantity2 - l_bo_qty2s(l_cmp_idx),
13087 	               cycle_count_quantity = 0,
13088                        cycle_count_quantity2 = 0
13089 	           where delivery_detail_id = l_detail_ids(l_cmp_idx);
13090                    -- DBI needs to track the delivery details whose requested_qty or released_status changes
13091                    -- Populate the delivery details involved here and then make a single call after the
13092                    -- loop ends
13093                    l_detail_tab(l_detail_tab.count + 1) := l_detail_ids(l_cmp_idx);
13094 		END IF;  --}
13095   	      --}
13096   	        l_detail_ids.DELETE(l_cmp_idx);
13097 
13098 	    -- delivery detail with l_cons_dd_flags(l_cmp_idx)='Y' should be deleted from l_detail_ids.
13099 	    ELSIF ( l_line_ids(l_cmp_idx) = l_curr_line_id ) THEN
13100 	        l_detail_ids.DELETE(l_cmp_idx);
13101             END IF;
13102 	 --}
13103             l_cmp_idx := l_detail_ids.NEXT(l_cmp_idx);
13104         END LOOP; --} inner Loop(l_cmp_idx)
13105 
13106         -- DBI Project
13107         -- Update of wsh_delivery_details where requested_quantity/released_status
13108         -- are changed, call DBI API after the update.
13109         -- This API will also check for DBI Installed or not
13110         IF l_debug_on THEN
13111           WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail count-',l_detail_tab.count);
13112         END IF;
13113         WSH_INTEGRATION.DBI_Update_Detail_Log
13114           (p_delivery_detail_id_tab => l_detail_tab,
13115            p_dml_type               => 'UPDATE',
13116            x_return_status          => l_dbi_rs);
13117 
13118         IF l_debug_on THEN
13119           WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
13120         END IF;
13121         IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
13122           -- just pass this return status to caller API
13123           raise FND_API.G_EXC_UNEXPECTED_ERROR;
13124         END IF;
13125         -- End of Code for DBI Project
13126         --
13127 
13128 	-- Assign the Consolidate BO qtys to the OUT parameter
13129 --Bug 7257451 now storing the remain bo qty's in x_remain_bo_qtys/x_remain_bo_qty2s at same index(l_next_idx)
13130 --as in x_cons_delivery_details_tab so that both table are in sync
13131 	l_next_idx := x_cons_delivery_details_tab.FIRST;
13132 	WHILE l_next_idx IS NOT NULL
13133 	LOOP --{
13134 	    IF x_cons_delivery_details_tab(l_next_idx).source_line_id = l_curr_line_id THEN
13135 		IF x_cons_delivery_details_tab(l_next_idx).req_qty = 0 THEN
13136 			x_remain_bo_qtys(l_next_idx) := 0;
13137 		  	x_remain_bo_qty2s(l_next_idx) := 0;
13138 	        ELSE
13139 		  	x_remain_bo_qtys(l_next_idx) := l_total_bo_qty;
13140 		-- Bug#3670261
13141 		-- Delete the Freight Costs only if Consolidation happens and
13142 		-- if delivery detail is going to be completely backordered.
13143 		IF (l_total_bo_qty > 0 AND
13144 		  x_cons_delivery_details_tab(l_next_idx).req_qty = x_cons_delivery_details_tab(l_next_idx).bo_qty) THEN
13145 		      l_freight_detail_ids(l_freight_detail_ids.COUNT+1) := x_cons_delivery_details_tab(l_next_idx).delivery_detail_id;
13146 		END IF;
13147 		--
13148 	-- HW OPM BUG#:3121616 added qty2s. Added NVL since x_remain_bo_qtys2 is
13149         -- an OUT parameter and for discrete and OPM single UOM lines returning NULL
13150         -- will cause a problem
13151 		  	x_remain_bo_qty2s(l_next_idx) := nvl(l_total_bo_qty2,0);
13152 		END IF;
13153 	    END IF;
13154        	    l_next_idx := x_cons_delivery_details_tab.NEXT(l_next_idx);
13155 	END LOOP;  --}
13156 	--
13157 	IF l_debug_on THEN
13158 	   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);
13159 -- HW OPM BUG#:3121616 added qty2s
13160 	   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);
13161         END IF;
13162   	l_idx := l_detail_ids.NEXT(l_idx);
13163   END LOOP;   -- } Outer Loop(l_idx)
13164 
13165   -- Bug#3670261
13166   -- Deleting the Freight Costs associated with the delivery details selected for Consolidation
13167   FORALL i IN 1..l_freight_detail_ids.COUNT
13168   DELETE FROM WSH_FREIGHT_COSTS
13169   WHERE  delivery_detail_id = l_freight_detail_ids(i);
13170   IF l_debug_on THEN
13171       WSH_DEBUG_SV.log(l_module_name,'Freight Cost Rows deleted',SQL%ROWCOUNT);
13172   END IF;
13173 
13174   l_req_qtys.DELETE;
13175   l_bo_qtys.DELETE;
13176 -- HW OPM BUG#:3121616 added qty2s
13177   l_bo_qty2s.DELETE;
13178 
13179   --
13180   -- Debug Statements
13181   --
13182   IF l_debug_on THEN
13183      WSH_DEBUG_SV.pop(l_module_name);
13184   END IF;
13185   --
13186 
13187  EXCEPTION
13188    WHEN FND_API.G_EXC_ERROR THEN
13189       x_return_status := FND_API.G_RET_STS_ERROR;
13190       --
13191       IF l_debug_on THEN
13192          wsh_debug_sv.logmsg(l_module_name, 'FND_API.G_EXC_ERROR exception has occired.',wsh_debug_sv.c_excep_level);
13193          wsh_debug_sv.pop(l_module_name, 'EXCEPTION:FND_API.G_EXC_ERROR');
13194       END IF;
13195       --
13196 
13197    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
13198       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13199       --
13200       IF l_debug_on THEN
13201          wsh_debug_sv.logmsg(l_module_name, 'FND_API.G_EXC_UNEXPECTED_ERROR exception has occured.', wsh_debug_sv.c_excep_level);
13202          wsh_debug_sv.pop(l_module_name, 'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
13203       END IF;
13204       --
13205 
13206    WHEN OTHERS THEN
13207       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13208       WSH_UTIL_CORE.Default_Handler('WSH_DELIVERY_DETAILS_ACTIONS.Consolidate_Delivery_Details',l_module_name);
13209       --
13210       -- Debug Statements
13211       --
13212       IF l_debug_on THEN
13213          WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13214          WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13215       END IF;
13216       --
13217 
13218 END Consolidate_Delivery_Details;
13219 
13220 
13221 -- K: MDC
13222 PROCEDURE Delete_Consol_Record(
13223                        p_detail_id_tab IN wsh_util_core.id_tab_type,
13224                        x_return_status OUT NOCOPY VARCHAR2) IS
13225 
13226 l_debug_on BOOLEAN;
13227 --
13228 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'delete_consol_record';
13229 BEGIN
13230   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13231   --
13232   IF l_debug_on IS NULL
13233   THEN
13234       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13235   END IF;
13236   IF l_debug_on THEN
13237       WSH_DEBUG_SV.push(l_module_name);
13238   END IF;
13239 
13240    x_return_status := FND_API.G_RET_STS_SUCCESS;
13241 
13242    FORALL i in p_detail_id_tab.first..p_detail_id_tab.LAST
13243    update wsh_delivery_assignments
13244    set type = 'S'
13245    where type = 'O'
13246    and delivery_detail_id = p_detail_id_tab(i);
13247 
13248    IF sql%found THEN
13249 
13250      FORALL i in p_detail_id_tab.first..p_detail_id_tab.LAST
13251      delete from wsh_delivery_assignments
13252      where delivery_detail_id = p_detail_id_tab(i)
13253      and type = 'C';
13254 
13255    END IF;
13256   IF l_debug_on THEN
13257      WSH_DEBUG_SV.pop(l_module_name);
13258   END IF;
13259 EXCEPTION
13260    WHEN OTHERS THEN
13261       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13262       WSH_UTIL_CORE.Default_Handler('WSH_DELIVERY_DETAILS_ACTIONS.Unassign_Top_Detail_from_Delivery',l_module_name);
13263       --
13264       -- Debug Statements
13265       --
13266       IF l_debug_on THEN
13267          WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13268          WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13269       END IF;
13270       --
13271 END Delete_Consol_Record;
13272 
13273 PROCEDURE Create_Consol_Record(
13274                     p_detail_id_tab IN wsh_util_core.id_tab_type,
13275                     x_return_status OUT NOCOPY VARCHAR2) IS
13276 
13277  cursor c_get_consolidation_delivery (p_det_id IN NUMBER) is
13278  select l1.delivery_id, l2.delivery_id
13279  from wsh_delivery_legs l1, wsh_delivery_legs l2, wsh_delivery_assignments a
13280  where a.delivery_detail_id = p_det_id
13281  and l1.delivery_id = a.delivery_id
13282  and l1.parent_delivery_leg_id = l2.delivery_leg_id
13283  and a.parent_delivery_detail_id is NULL
13284  and NVL(a.type, 'S') = 'S';
13285 
13286  l_consol_delivery_id_tab wsh_util_core.id_tab_type;
13287  l_delivery_id_tab wsh_util_core.id_tab_type;
13288  l_detail_id_tab wsh_util_core.id_tab_type;
13289  l_delivery_id NUMBER;
13290  l_consol_delivery_id NUMBER;
13291  i NUMBER;
13292  j NUMBER := 0;
13293 
13294 l_debug_on BOOLEAN;
13295 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PACKAGE_NAME || '.' || 'create_consol_record';
13296 
13297 BEGIN
13298 --
13299   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13300   --
13301   IF l_debug_on IS NULL
13302   THEN
13303       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13304   END IF;
13305   IF l_debug_on THEN
13306       WSH_DEBUG_SV.push(l_module_name);
13307       WSH_DEBUG_SV.log(l_module_name, 'p_detail_id_tab.count',p_detail_id_tab.count );
13308   END IF;
13309 
13310   x_return_status := FND_API.G_RET_STS_SUCCESS;
13311 
13312   i := p_detail_id_tab.FIRST;
13313 
13314   WHILE i is NOT NULL LOOP
13315 
13316     IF l_debug_on THEN
13317       WSH_DEBUG_SV.log(l_module_name, 'p_detail_id_tab(i)',  p_detail_id_tab(i) );
13318     END IF;
13319     OPEN c_get_consolidation_delivery(p_detail_id_tab(i));
13320     FETCH c_get_consolidation_delivery
13321     INTO l_delivery_id, l_consol_delivery_id;
13322     IF c_get_consolidation_delivery%FOUND THEN
13323        j := j + 1;
13324        l_consol_delivery_id_tab(j) := l_consol_delivery_id;
13325        l_delivery_id_tab(j) := l_delivery_id;
13326        l_detail_id_tab(j) := p_detail_id_tab(i);
13327     END IF;
13328     CLOSE c_get_consolidation_delivery;
13329     i := p_detail_id_tab.next(i);
13330 
13331   END LOOP;
13332 
13333   IF l_detail_id_tab.count > 0 THEN
13334 
13335      IF l_debug_on THEN
13336         WSH_DEBUG_SV.logmsg(l_module_name, 'updating tabcount', l_detail_id_tab.count);
13337      END IF;
13338      FORALL i in l_detail_id_tab.first..l_detail_id_tab.count
13339      update wsh_delivery_assignments
13340      set type = 'O',
13341          parent_delivery_detail_id = NULL
13342      where NVL(type, 'S') = 'S'
13343      and delivery_detail_id = l_detail_id_tab(i);
13344 
13345      FORALL i in l_detail_id_tab.first..l_detail_id_tab.count
13346      INSERT INTO wsh_delivery_assignments (
13347      delivery_id,
13348      parent_delivery_id,
13349      delivery_detail_id,
13350      parent_delivery_detail_id,
13351      creation_date,
13352      created_by,
13353      last_update_date,
13354      last_updated_by,
13355      last_update_login,
13356      program_application_id,
13357      program_id,
13358      program_update_date,
13359      request_id,
13360      active_flag,
13361      delivery_assignment_id,
13362      type
13363      ) VALUES (
13364      l_delivery_id_tab(i),
13365      l_consol_delivery_id_tab(i),
13366      l_detail_id_tab(i),
13367      NULL,
13368      SYSDATE,
13369      FND_GLOBAL.USER_ID,
13370      SYSDATE,
13371      FND_GLOBAL.USER_ID,
13372      FND_GLOBAL.USER_ID,
13373      NULL,
13374      NULL,
13375      NULL,
13376      NULL,
13377      NULL,
13378      wsh_delivery_assignments_s.nextval,
13379      'C'
13380      );
13381 
13382 
13383   END IF;
13384 
13385 
13386   IF l_debug_on THEN
13387      WSH_DEBUG_SV.pop(l_module_name);
13388   END IF;
13389 
13390 EXCEPTION
13391 
13392    WHEN OTHERS THEN
13393       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13394       WSH_UTIL_CORE.Default_Handler('WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record',l_module_name);
13395       --
13396       -- Debug Statements
13397       --
13398       IF l_debug_on THEN
13399          WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13400          WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13401       END IF;
13402       --
13403 END Create_Consol_Record;
13404 
13405 END WSH_DELIVERY_DETAILS_ACTIONS;