DBA Data[Home] [Help]

PACKAGE BODY: APPS.WSH_CONTAINER_ACTIONS

Source


1 PACKAGE BODY wsh_container_actions as
2 /* $Header: WSHCMACB.pls 120.27.12020000.3 2013/03/01 00:41:40 adagur ship $ */
3 
4   LIMITED_PRECISION NUMBER := 5;
5   c_wms_code_present varchar2(2) := 'Y';
6 -- HW OPMCONV - Removed OPM variable
7 
8   G_CALLED_FROM_INBOUND BOOLEAN := FALSE;
9 
10   TYPE empty_container_info IS RECORD (
11         container_index   NUMBER,
12         container_item_id WSH_DELIVERY_DETAILS.inventory_item_id%TYPE,
13         mast_cont_item_id WSH_DELIVERY_DETAILS.master_container_item_id%TYPE,
14         organization_id   WSH_DELIVERY_DETAILS.organization_id%TYPE,
15         group_id          NUMBER,
16         numerator         NUMBER,
17         denominator       NUMBER,
18         empty             NUMBER);
19   TYPE empty_container_info_tab IS TABLE OF empty_container_info INDEX BY BINARY_INTEGER;
20   g_empty_cont_tab empty_container_info_tab;
21   g_new_cont_index NUMBER := 0;
22   g_num_cont_index NUMBER := 0;
23 
24   TYPE assign_detail_info IS RECORD (
25         container_index    NUMBER,
26         gross_weight       WSH_DELIVERY_DETAILS.net_weight%TYPE,
27         net_weight         WSH_DELIVERY_DETAILS.net_weight%TYPE,
28         volume             WSH_DELIVERY_DETAILS.volume%TYPE,
29         delivery_id        wsh_delivery_assignments_v.delivery_id%TYPE,
30         delivery_detail_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE,
31         -- J: W/V Changes
32         inventory_item_id  WSH_DELIVERY_DETAILS.inventory_item_id%TYPE,
33         weight_uom         WSH_DELIVERY_DETAILS.weight_uom_code%TYPE,
34         volume_uom         WSH_DELIVERY_DETAILS.volume_uom_code%TYPE,
35         -- K LPN CONV
36         organization_id    WSH_DELIVERY_DETAILS.organization_id%TYPE);
37   TYPE assign_detail_info_tab IS TABLE OF assign_detail_info INDEX BY BINARY_INTEGER;
38   g_assign_detail_tab assign_detail_info_tab;
39   g_assign_detail_index NUMBER := 0;
40 
41 -- added number_of_containers to the record structure
42   TYPE new_container_info IS RECORD (
43         organization_id   WSH_DELIVERY_DETAILS.organization_id%TYPE,
44         container_item_id WSH_DELIVERY_DETAILS.inventory_item_id%TYPE,
45         mast_cont_item_id WSH_DELIVERY_DETAILS.master_container_item_id%TYPE,
46         cont_instance_id  WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE,
47         number_of_containers NUMBER
48        );
49   TYPE new_container_info_tab IS TABLE OF new_container_info INDEX BY BINARY_INTEGER;
50   g_new_container_tab new_container_info_tab;
51 
52  -- another temp table to store id
53  -- Store container instance id after Bulk Insert
54   TYPE new_contid_rec IS RECORD (
55        match_id  NUMBER,
56        cont_instance_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE,
57        -- J: W/V Changes
58        unit_weight NUMBER,
59        unit_volume NUMBER,
60        weight_uom  VARCHAR2(3),
61        volume_uom  VARCHAR2(3),
62        item_id     NUMBER,
63        -- K LPN CONV
64        organization_id NUMBER
65       );
66   TYPE new_contid_info_tab IS TABLE OF new_contid_rec INDEX BY BINARY_INTEGER;
67   g_new_contid_tab new_contid_info_tab;
68 
69   -- Cache Tables
70   TYPE organization_info IS RECORD (
71         process_flag      VARCHAR2(1),
72         fill_pc_basis     WSH_SHIPPING_PARAMETERS.percent_fill_basis_flag%TYPE);
73   TYPE organization_info_tab IS TABLE OF organization_info INDEX BY BINARY_INTEGER;
74   g_cache_organization_info_tab organization_info_tab;
75 
76   /* Organization specific Cache Table */
77   TYPE container_load_info IS RECORD (
78         cont_item_id      WSH_CONTAINER_ITEMS.container_item_id%TYPE,
79         max_load_qty      WSH_CONTAINER_ITEMS.max_load_quantity%TYPE);
80   TYPE container_load_info_tab IS TABLE OF container_load_info INDEX BY BINARY_INTEGER;
81   g_cache_cont_load_info_tab container_load_info_tab;
82 
83   /* Organization specific Cache Table */
84 
85 -- valid_flag indicates if this container can be used for packing or not
86 -- inactive containers cannot be used
87   TYPE cont_msi_info IS RECORD (
88         mtl_max_load     MTL_SYSTEM_ITEMS.maximum_load_weight%TYPE,
89         mtl_max_vol      MTL_SYSTEM_ITEMS.internal_volume%TYPE,
90         mtl_wt_uom       MTL_SYSTEM_ITEMS.weight_uom_code%TYPE,
91         mtl_vol_uom      MTL_SYSTEM_ITEMS.volume_uom_code%TYPE,
92         valid_flag       VARCHAR2(1)
93        );
94   TYPE cont_msi_tab IS TABLE OF cont_msi_info INDEX BY BINARY_INTEGER;
95   g_cont_msi_tab cont_msi_tab;
96 
97   C_ERROR_STATUS       CONSTANT VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_ERROR;
98   C_WARNING_STATUS     CONSTANT VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_WARNING;
99   C_SUCCESS_STATUS     CONSTANT VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
100   C_UNEXP_ERROR_STATUS CONSTANT VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
101 
102 --
103 G_PKG_NAME CONSTANT VARCHAR2(50) := 'WSH_CONTAINER_ACTIONS';
104 --
105 
106 --Bug #3005780 : Added the local function Get_Gcd
107 /*
108 -----------------------------------------------------------------------------
109    FUNCTION   : Get_Gcd
110    PARAMETERS : num1 - First Number
111                 num2 - Second Number
112   DESCRIPTION : This function finds greatest common devisor for the given
113                 Two numbers num1 and num2. If one number is zero then it
114                 returns other number as  GCD value
115 ------------------------------------------------------------------------------
116 */
117 
118 FUNCTION Get_Gcd (num1 IN NUMBER,
119   num2 IN NUMBER) RETURN NUMBER IS
120   temp_int  NUMBER;
121   num1_int  NUMBER := num1;
122   num2_int  NUMBER := num2;
123 BEGIN
124     IF num1_int = 0 THEN return num2_int; END IF;
125     WHILE num2_int <> 0 LOOP
126       temp_int := mod(num1_int,num2_int);
127       num1_int := num2_int;
128       num2_int := temp_int;
129     END LOOP;
130     return num1_int;
131 END Get_Gcd;
132 
133 -- bug 3440811
134 /*
135 -----------------------------------------------------------------------------
136    PROCEDURE  : Validate_Container
137    PARAMETERS : p_organization_id  - Organization Id
138                 p_cont_item_id          - Container Item Id
139 
140   DESCRIPTION : This procedure takes the organization_id and the container's item_id
141                 to check if the container is a valid container for packing or not.
142 ------------------------------------------------------------------------------
143 */
144 
145 PROCEDURE Validate_Container(
146   p_organization_id   IN  NUMBER,
147   p_cont_item_id      IN  NUMBER,
148   x_return_status     OUT NOCOPY  VARCHAR2)
149 IS
150   CURSOR l_valid_cont_csr (p_cont_item_id NUMBER, p_org_id NUMBER) IS
151   SELECT 'X'
152   FROM MTL_SYSTEM_ITEMS
153   WHERE inventory_item_id = p_cont_item_id
154   AND container_item_flag = 'Y'
155   AND organization_id = p_org_id
156   AND    nvl(vehicle_item_flag,'N') = 'N'
157   AND    shippable_item_flag = 'Y';
158 
159   l_valid_container VARCHAR2(1);
160   l_item_name  VARCHAR2(32767);
161 --
162 l_debug_on BOOLEAN;
163 --
164 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'VALIDATE_CONTAINER';
165 --
166 
167 BEGIN
168     --
169     --
170     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
171     --
172     IF l_debug_on IS NULL
173     THEN
174         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
175     END IF;
176     --
177     IF l_debug_on THEN
178         WSH_DEBUG_SV.push(l_module_name);
179         WSH_DEBUG_SV.log(l_module_name, 'p_cont_item_id', p_cont_item_id);
180         WSH_DEBUG_SV.log(l_module_name, 'p_organization_id', p_organization_id);
181     END IF;
182 
183     x_return_status := wsh_util_core.g_ret_sts_success;
184     IF p_cont_item_id IS NOT NULL THEN
185     --{
186       OPEN  l_valid_cont_csr (p_cont_item_id, p_organization_id);
187       FETCH l_valid_cont_csr INTO l_valid_container;
188       IF l_valid_cont_csr%NOTFOUND THEN
189       --{
190         IF l_debug_on THEN
191           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
192         END IF;
193         --
194         l_item_name := WSH_UTIL_CORE.Get_Item_Name(p_cont_item_id,p_organization_id);
195         FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_INV_ITEM');
196         FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
197         CLOSE l_valid_cont_csr;
198         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
199 
200        WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
201       --}
202       ELSE
203       --{
204         CLOSE l_valid_cont_csr;
205       --}
206       END IF;
207     --}
208     END IF;
209 
210     IF l_debug_on THEN
211       WSH_DEBUG_SV.pop(l_module_name);
212     END IF;
213 EXCEPTION
214   WHEN Others THEN
215 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Validate_Container',l_module_name);
216 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
217 --
218 IF l_debug_on THEN
219     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
220     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
221 END IF;
222 --
223 END Validate_Container;
224 -- bug 3440811
225 
226 /* lpn conv
227 -----------------------------------------------------------------------------
228    PROCEDURE  : default_container_attr
229 ------------------------------------------------------------------------------
230 */
231 
232 PROCEDURE default_container_attr (
233      P_container_rec  IN  OUT NOCOPY
234                            wsh_glbl_var_strct_grp.Delivery_Details_Rec_Type,
235      p_additional_cont_attr IN wsh_glbl_var_strct_grp.LPNRecordType,
236      p_caller               IN VARCHAR2,
237      x_return_status OUT NOCOPY  VARCHAR2
238 
239   ) IS
240 
241   l_wms_org    VARCHAR2(5) := 'N';
242 
243   CURSOR Get_Cont_Item_Info (v_cont_item_id NUMBER,
244                              v_org_id NUMBER,
245                              v_wms_org VARCHAR2 ) IS
246   SELECT Description, Container_Type_Code, weight_uom_code, volume_uom_code,
247   minimum_fill_percent, maximum_load_weight, internal_volume, primary_uom_code,
248 -- J: W/V Changes
249   unit_weight, unit_volume
250   FROM MTL_SYSTEM_ITEMS
251   WHERE inventory_item_id = v_cont_item_id
252   AND container_item_flag = 'Y'
253   AND organization_id = v_org_id
254   AND    nvl(vehicle_item_flag,'N') = 'N'
255   AND    ((shippable_item_flag = 'Y' AND v_wms_org = 'N')
256           OR v_wms_org = 'Y') ;
257 
258 -- bug 2828591 - remove the condition since it will prevent user to create container with other status
259 --  AND inventory_item_status_code='Active';
260 
261   l_cont_name VARCHAR2(50);
262   i NUMBER;
263   l_description VARCHAR2(240);
264   l_container_type_code VARCHAR2(30);
265   l_wt_uom VARCHAR2(3);
266   l_vol_uom VARCHAR2(3);
267   l_wt_uom_org VARCHAR2(3); --bug 7615765
268   l_vol_uom_org VARCHAR2(3);--bug 7615765
269   l_min_fill_pc NUMBER;
270   l_max_load_wt NUMBER;
271   l_max_vol NUMBER;
272   l_user_id NUMBER;
273   l_last_update_by NUMBER;
274   l_primary_uom VARCHAR2(3);
275 -- J: W/V Changes
276   l_unit_weight NUMBER;
277   l_unit_volume NUMBER;
278   l_row_id	VARCHAR2(30);
279   l_org_name VARCHAR2(240);
280   l_item_name VARCHAR2(2000);
281   l_additional_cont_attr wsh_glbl_var_strct_grp.LPNRecordType;
282 
283   i NUMBER;
284   j NUMBER;
285   l_return_status  VARCHAR2(2);
286   l_num_warnings   NUMBER := 0;
287   l_num_errors     NUMBER := 0;
288 
289   --
290   l_debug_on BOOLEAN;
291   --
292   l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'DEFAULT_CONTAINER_ATTR';
293   --
294 BEGIN
295 
296     --
297     --
298     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
299     --
300     IF l_debug_on IS NULL
301     THEN
302         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
303     END IF;
304     --
305     IF l_debug_on THEN
306         WSH_DEBUG_SV.push(l_module_name);
307         --
308         WSH_DEBUG_SV.log(l_module_name,'organization_id',P_container_rec.organization_id);
309         WSH_DEBUG_SV.log(l_module_name,'item_id',P_container_rec.inventory_item_id);
310     END IF;
311     --
312 
313     -- If one of the wt/vol fields are negative, or if any wt/vol is give
314     -- without their uom, or if any wt/vol's uom is given without value then
315     -- error out.
316 
317     l_additional_cont_attr := p_additional_cont_attr;
318 
319     IF P_container_rec.volume < 0 OR P_container_rec.filled_volume < 0
320      OR P_container_rec.net_weight < 0 OR P_container_rec.gross_weight < 0
321      OR l_additional_cont_attr.tare_weight < 0
322     THEN --{
323 
324        IF l_debug_on THEN --{
325 
326           WSH_DEBUG_SV.log(l_module_name,'1 gross_weight',P_container_rec.gross_weight);
327           WSH_DEBUG_SV.log(l_module_name,'net_weight',P_container_rec.net_weight);
328           WSH_DEBUG_SV.log(l_module_name,'tare_weight',l_additional_cont_attr.tare_weight);
329           WSH_DEBUG_SV.log(l_module_name,'volume',P_container_rec.volume);
330           WSH_DEBUG_SV.log(l_module_name,'filled_volume',P_container_rec.filled_volume);
331        END IF; --}
332 
333        RAISE FND_API.G_EXC_ERROR;
334 
335     ELSIF (nvl(P_container_rec.volume,0) > 0
336            AND P_container_rec.volume_uom_code IS NULL)
337        --OR (P_container_rec.volume IS NULL
338            --AND P_container_rec.volume_uom_code IS NOT NULL )
339        OR (NVL(P_container_rec.filled_volume,0)> 0
340            AND l_additional_cont_attr.filled_volume_uom_code IS NULL )
341        --OR (P_container_rec.filled_volume IS NULL
342            --AND l_additional_cont_attr.filled_volume_uom_code IS NOT NULL )
343        OR (nvl(P_container_rec.gross_weight,0) > 0
344            AND P_container_rec.weight_uom_code IS NULL )
345        --OR (P_container_rec.gross_weight IS NULL
346            --AND P_container_rec.weight_uom_code IS NOT NULL )
347        OR (nvl(P_container_rec.net_weight,0) > 0
348            AND P_container_rec.weight_uom_code IS NULL )
349        --OR (P_container_rec.net_weight IS NULL
350            --AND P_container_rec.weight_uom_code IS NOT NULL )
351        OR (nvl(l_additional_cont_attr.tare_weight,0) > 0
352            AND l_additional_cont_attr.tare_weight_uom_code IS NULL )
353        --OR (l_additional_cont_attr.tare_weight IS NULL
354            --AND l_additional_cont_attr.tare_weight_uom_code IS NOT NULL )
355     THEN --}{
356        IF l_debug_on THEN --{
357 
358           WSH_DEBUG_SV.log(l_module_name,'2 gross_weight',P_container_rec.gross_weight);
359           WSH_DEBUG_SV.log(l_module_name,'net_weight',P_container_rec.net_weight);
360           WSH_DEBUG_SV.log(l_module_name,'weight_uom_code',P_container_rec.weight_uom_code);
361           WSH_DEBUG_SV.log(l_module_name,'tare_weight',l_additional_cont_attr.tare_weight);
362           WSH_DEBUG_SV.log(l_module_name,'tare_weight_uom_code',l_additional_cont_attr.tare_weight_uom_code);
363           WSH_DEBUG_SV.log(l_module_name,'volume',P_container_rec.volume);
364           WSH_DEBUG_SV.log(l_module_name,'filled_volume',P_container_rec.filled_volume);
365           WSH_DEBUG_SV.log(l_module_name,'volume_uom_code',P_container_rec.volume_uom_code);
366           WSH_DEBUG_SV.log(l_module_name,'filled_volume_uom',l_additional_cont_attr.filled_volume_uom_code);
367        END IF; --}
368 
369        RAISE FND_API.G_EXC_ERROR;
370 
371     END IF; --}
372 
373     l_wms_org := wsh_util_validate.check_wms_org(P_container_rec.organization_id);
374     IF l_debug_on THEN
375       WSH_DEBUG_SV.log(l_module_name,'l_wms_org',l_wms_org);
376     END IF;
377 
378     OPEN Get_Cont_Item_Info (P_container_rec.inventory_item_id,
379                              P_container_rec.organization_id,
380                              l_wms_org);
381 
382      --
383      IF l_debug_on THEN
384          WSH_DEBUG_SV.logmsg(l_module_name, 'GETTING CONTAINER ITEM INFO'  );
385      END IF;
386      --
387 	FETCH Get_Cont_Item_Info INTO
388 	  l_description,
389 	  l_container_type_code,
390 	  l_wt_uom,
391 	  l_vol_uom,
392 	  l_min_fill_pc,
393 	  l_max_load_wt,
394 	  l_max_vol,
395 	  l_primary_uom,
396           l_unit_weight,
397           l_unit_volume;
398 
399 	IF Get_Cont_Item_Info%NOTFOUND THEN --{
400 	  --
401           IF NVL(p_caller,'WSH') NOT IN ( 'WSH_PICK_RELEASE', 'WSH_IB_PACK')
402             AND NVL(p_caller,'WSH') NOT LIKE 'WMS%'
403           THEN
404 
405 	     IF l_debug_on THEN
406 	         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
407 	     END IF;
408 	     --
409 	     l_item_name := WSH_UTIL_CORE.Get_Item_Name(P_container_rec.inventory_item_id,P_container_rec.organization_id);
410 	     FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_INV_ITEM');
411 	     FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
412 	     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
413    	     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
414           END IF;
415 
416 	  CLOSE Get_Cont_Item_Info;
417   	  --  Bug#: 3362895
418 	  IF P_container_rec.inventory_item_id IS NOT NULL THEN
419             IF l_debug_on THEN
420 	      WSH_DEBUG_SV.pop(l_module_name);
421 	    END IF;
422 	    --
423 	    return;
424 	  END IF;
425 
426 	  -- return;  Containers need not have an inventory item
427 	  -- 		 associated with them. Cross-Docking requirements
428 	ELSE --}{
429 	    CLOSE Get_Cont_Item_Info;
430 	END IF; --}
431 
432         --
433         IF l_debug_on THEN
434            WSH_DEBUG_SV.log(l_module_name, 'l_vol_uom',l_vol_uom  );
435            WSH_DEBUG_SV.log(l_module_name, 'l_wt_uom',l_wt_uom  );
436         END IF;
437         IF l_vol_uom IS NULL OR l_wt_uom IS NULL THEN --{
438            IF l_debug_on THEN
439 	          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.GET_DEFAULT_UOMS',WSH_DEBUG_SV.C_PROC_LEVEL);
440 	   END IF;
441 	   --
442 	   WSH_WV_UTILS.Get_Default_Uoms (
443 			   P_container_rec.organization_id,
444                            -- bug 761576
445                            --l_wt_uom,
446                            --l_vol_uom,
447                            l_wt_uom_org,
448                            l_vol_uom_org,
449 			   l_return_status);
450 
451 	   IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN --{
452               --
453               IF l_debug_on THEN
454                 WSH_DEBUG_SV.logmsg(l_module_name, 'ERROR GETTING DEFFAULT UOMS'  );
455  	        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ORG_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
456  	      END IF;
457  	      --
458  	      l_org_name := WSH_UTIL_CORE.Get_Org_Name(P_container_rec.organization_id);
459 	      FND_MESSAGE.SET_NAME('WSH','WSH_DEFAULT_UOM_ERROR');
460 	      FND_MESSAGE.SET_TOKEN('ORG_NAME',l_org_name);
461 	      WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
462 	      --
463 	      IF l_debug_on THEN
464 	         WSH_DEBUG_SV.log(l_module_name,'Org Name is ',l_org_name);
465 	       END IF;
466 	       --
467                wsh_util_core.api_post_call
468                  (
469                    p_return_status => l_return_status,
470                    x_num_warnings  => l_num_warnings,
471                    x_num_errors    => l_num_errors
472                );
473 	   END IF; --}
474            --
475            IF l_debug_on THEN
476                WSH_DEBUG_SV.logmsg(l_module_name, 'NO ERRORS AFTER GETTING DEFAULT UOMS'  );
477                WSH_DEBUG_SV.logmsg(l_module_name, 'CLOSED GET_CONT_ITEM_INFO'  );
478            END IF;
479            --
480 
481            --Changes for bug 	7615765 Give preference to Container Item attributes
482            IF l_wt_uom IS NULL THEN
483            --{
484                 l_wt_uom := l_wt_uom_ORG;
485                 IF l_debug_on THEN
486                    WSH_DEBUG_SV.logmsg(l_module_name, 'l_wt_uom updated to org dafault value' );
487                    WSH_DEBUG_SV.log(l_module_name, 'l_wt_uom',l_wt_uom );
488                 END IF;
489            --}
490            END IF;
491 
492            IF l_vol_uom IS NULL THEN
493            --{
494                 l_vol_uom := l_vol_uom_ORG;
495                 IF l_debug_on THEN
496                    WSH_DEBUG_SV.logmsg(l_module_name, 'l_vol_uom updated to org dafault value' );
497                    WSH_DEBUG_SV.log(l_module_name, 'l_vol_uom',l_vol_uom);
498                 END IF;
499            --}
500            END IF;
501 
502         END IF; --}
503 
504         --converting the uoms
505         p_container_rec.volume_uom_code := NVL(p_container_rec.volume_uom_code,l_vol_uom);
506         l_additional_cont_attr.filled_volume_uom_code := NVL(l_additional_cont_attr.filled_volume_uom_code, l_vol_uom);
507 
508         IF p_container_rec.volume_uom_code <> l_vol_uom THEN
509            p_container_rec.volume :=
510                   WSH_WV_UTILS.Convert_Uom_core (
511                                    from_uom => p_container_rec.volume_uom_code,
512                                    to_uom => l_vol_uom,
513                                    quantity => p_container_rec.volume,
514                                    item_id => P_container_rec.inventory_item_id,
515                                    x_return_status => l_return_status
516                                );
517            wsh_util_core.api_post_call
518              (
519                p_return_status => l_return_status,
520                x_num_warnings  => l_num_warnings,
521                x_num_errors    => l_num_errors
522              );
523         END IF;
524         p_container_rec.volume := NVL(p_container_rec.volume,l_unit_volume);
525         p_container_rec.volume_uom_code := l_vol_uom;
526 
527         IF l_additional_cont_attr.filled_volume_uom_code <> l_vol_uom THEN
528            p_container_rec.filled_volume :=
529                WSH_WV_UTILS.Convert_Uom_core (
530                        from_uom =>l_additional_cont_attr.filled_volume_uom_code,
531                        to_uom =>l_vol_uom,
532                        quantity =>p_container_rec.filled_volume,
533                        item_id =>P_container_rec.inventory_item_id,
534                        x_return_status => l_return_status );
535            wsh_util_core.api_post_call
536              (
537                p_return_status => l_return_status,
538                x_num_warnings  => l_num_warnings,
539                x_num_errors    => l_num_errors
540              );
541         END IF;
542         p_container_rec.unit_volume := l_unit_volume;
543         --p_container_rec.filled_volume := NVL(p_container_rec.filled_volume,l_unit_volume);
544 
545         p_container_rec.weight_uom_code := NVL(p_container_rec.weight_uom_code,l_wt_uom);
546         IF p_container_rec.weight_uom_code <> l_wt_uom THEN
547            p_container_rec.gross_weight :=
548                WSH_WV_UTILS.Convert_Uom_core (
549                                   from_uom => p_container_rec.weight_uom_code,
550                                   to_uom => l_wt_uom,
551                                   quantity => p_container_rec.gross_weight,
552                                   item_id => P_container_rec.inventory_item_id,
553                                   x_return_status => l_return_status
554                                );
555            wsh_util_core.api_post_call
556              (
557                p_return_status => l_return_status,
558                x_num_warnings  => l_num_warnings,
559                x_num_errors    => l_num_errors
560              );
561            IF  p_container_rec.net_weight is not NULL THEN
562                p_container_rec.net_weight :=
563                      WSH_WV_UTILS.Convert_Uom_core (
564                                   from_uom => p_container_rec.weight_uom_code,
565                                   to_uom => l_wt_uom,
566                                   quantity => p_container_rec.net_weight,
567                                   item_id =>P_container_rec.inventory_item_id,
568                                   x_return_status => l_return_status);
569                wsh_util_core.api_post_call
570                  (
571                    p_return_status => l_return_status,
572                    x_num_warnings  => l_num_warnings,
573                    x_num_errors    => l_num_errors
574                  );
575             END IF;
576         END IF;
577         p_container_rec.weight_uom_code := l_wt_uom;
578 
579         IF l_additional_cont_attr.tare_weight_uom_code <> l_wt_uom THEN
580               l_additional_cont_attr.tare_weight :=
581                   WSH_WV_UTILS.Convert_Uom_core (
582                           from_uom=>l_additional_cont_attr.tare_weight_uom_code,
583                           to_uom => l_wt_uom,
584                           quantity => l_additional_cont_attr.tare_weight,
585                           item_id => P_container_rec.inventory_item_id,
586                           x_return_status => l_return_status
587                   );
588                wsh_util_core.api_post_call
589                  (
590                    p_return_status => l_return_status,
591                    x_num_warnings  => l_num_warnings,
592                    x_num_errors    => l_num_errors
593                  );
594         END IF;
595 
596         p_container_rec.gross_weight := NVL(p_container_rec.gross_weight,l_unit_weight);
597         IF p_container_rec.net_weight IS NULL AND l_additional_cont_attr.tare_weight IS NOT NULL THEN
598            p_container_rec.net_weight := p_container_rec.gross_weight
599                                    - l_additional_cont_attr.tare_weight;
600         END IF;
601 
602         --
603         IF l_debug_on THEN
604             WSH_DEBUG_SV.log(l_module_name, 'gross weight', p_container_rec.gross_weight  );
605             WSH_DEBUG_SV.log(l_module_name, 'volume', p_container_rec.volume );
606             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.ORG_TO_LOCATION',WSH_DEBUG_SV.C_PROC_LEVEL);
607         END IF;
608         --
609         p_container_rec.ship_from_location_id := WSH_UTIL_CORE.Org_To_Location(p_container_rec.organization_id,TRUE);
610         p_container_rec.container_type_code := NVL(p_container_rec.container_type_code,l_container_type_code);
611         p_container_rec.item_description := l_description;
612         p_container_rec.requested_quantity := 1;
613         p_container_rec.shipped_quantity := null;
614         --
615         IF l_debug_on THEN
616             WSH_DEBUG_SV.logmsg(l_module_name, 'ASSIGNING RQ_UOM'  );
617         END IF;
618         --
619         p_container_rec.requested_quantity_uom := l_primary_uom;
620         p_container_rec.wv_frozen_flag := 'N';
621         p_container_rec.unit_weight := l_unit_weight;
622         p_container_rec.maximum_volume := l_max_vol;
623         p_container_rec.maximum_load_weight := l_max_load_wt;
624                   --NVL(p_container_rec.maximum_load_weight, l_max_load_wt);
625         p_container_rec.minimum_fill_percent := l_min_fill_pc;
626                    --NVL(p_container_rec.minimum_fill_percent,l_min_fill_pc);
627         p_container_rec.source_code := 'WSH';
628         p_container_rec.container_flag := 'Y';
629 
630         -- Fix for Bug 1820376 : Containers should have release status as 'X'
631         p_container_rec.released_status := 'X';
632 
633 
634         x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
635 
636 	--
637 	IF l_debug_on THEN
638 	    WSH_DEBUG_SV.pop(l_module_name);
639 	END IF;
640 	--
641 EXCEPTION
642     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
643       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
644       IF l_debug_on THEN
645         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle
646 error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
647         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
648       END IF;
649       --
650     WHEN WSH_UTIL_CORE.G_EXC_WARNING THEN
651       x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
652       --
653       IF l_debug_on THEN
654         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_UTIL_CORE.G_EXC_WARNING exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
655         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_UTIL_CORE.G_EXC_WARNING');      END IF;
656 
657     WHEN FND_API.G_EXC_ERROR THEN
658 
659       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
660       --
661       IF l_debug_on THEN
662         WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
663         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
664       END IF;
665       --
666 
667   WHEN Others THEN
668 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.default_container_attr',l_module_name);
669 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
670 
671         --
672         IF l_debug_on THEN
673             WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
674             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
675         END IF;
676         --
677 END default_container_attr;
678 
679 
680 /*
681 -----------------------------------------------------------------------------
682    PROCEDURE  : Create_Cont_Instance_Multi
683 -- This API has been created to Create Multiple Containers
684 -- while Auto Packing, p_num_of_containers specifies how
685 -- many containers need to be created
686 ------------------------------------------------------------------------------
687 */
688 
689 PROCEDURE Create_Cont_Instance_Multi (
690   x_cont_name IN OUT NOCOPY  VARCHAR2,
691   p_cont_item_id IN NUMBER,
692   x_cont_instance_id IN OUT NOCOPY  NUMBER,
693   p_par_detail_id IN NUMBER,
694   p_organization_id IN NUMBER,
695   p_container_type_code IN VARCHAR2,
696   p_num_of_containers IN NUMBER,
697   x_row_id OUT NOCOPY  VARCHAR2,
698   --x_row_id will containe the rowid of the first container created.
699   x_return_status OUT NOCOPY  VARCHAR2,
700   x_cont_tab OUT NOCOPY  WSH_UTIL_CORE.id_tab_type,
701   -- J: W/V Changes
702   x_unit_weight OUT NOCOPY NUMBER,
703   x_unit_volume OUT NOCOPY NUMBER,
704   x_weight_uom_code OUT NOCOPY VARCHAR2,
705   x_volume_uom_code OUT NOCOPY VARCHAR2,
706   p_lpn_id          IN NUMBER DEFAULT NULL,
707   p_ignore_for_planning IN VARCHAR2 DEFAULT 'N',
708   p_caller            IN VARCHAR2 DEFAULT 'WSH'
709   ) IS
710 
711   CURSOR Get_Cont_Item_Info (v_cont_item_id NUMBER, v_org_id NUMBER) IS
712   SELECT Description, Container_Type_Code, weight_uom_code, volume_uom_code,
713   minimum_fill_percent, maximum_load_weight, internal_volume, primary_uom_code,
714 -- J: W/V Changes
715   unit_weight, unit_volume
716   FROM MTL_SYSTEM_ITEMS
717   WHERE inventory_item_id = v_cont_item_id
718   AND container_item_flag = 'Y'
719   AND organization_id = v_org_id
720   AND    nvl(vehicle_item_flag,'N') = 'N'
721   AND    shippable_item_flag = 'Y';
722 -- bug 2828591 - remove the condition since it will prevent user to create container with other status
723 --  AND inventory_item_status_code='Active';
724 
725   CURSOR Get_Cont_Name (v_cont_inst_id NUMBER) IS
726   SELECT container_name
727   FROM WSH_DELIVERY_DETAILS
728   WHERE delivery_detail_id = v_cont_inst_id
729   AND container_flag = 'Y';
730 
731 --added cursors
732   CURSOR Get_Wdd_Nextval IS
733   SELECT wsh_delivery_details_s.nextval
734     FROM sys.dual;
735 
736   CURSOR Get_Wda_Nextval IS
737   SELECT wsh_delivery_assignments_s.nextval
738     FROM sys.dual;
739 
740   l_cont_instance_id NUMBER;
741   l_cont_name VARCHAR2(50);
742   l_description VARCHAR2(240);
743   l_container_type_code VARCHAR2(30);
744   l_min_fill_pc NUMBER;
745   l_max_load_wt NUMBER;
746   l_max_vol NUMBER;
747   l_user_id NUMBER;
748   l_last_update_by NUMBER;
749   l_primary_uom VARCHAR2(3);
750 -- J: W/V Changes
751 
752   l_container_rec       WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type;
753   l_del_assg_rec	WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_Type;
754 
755   l_row_id	VARCHAR2(30);
756   l_del_assg_id	NUMBER;
757 
758   l_cont_name VARCHAR2(30);
759   l_org_name VARCHAR2(240);
760 
761   l_item_name VARCHAR2(2000);
762   l_cont_rec wsh_container_actions.cont_inst_rec;
763   l_cont_tab wsh_container_actions.cont_inst_tab;
764   i NUMBER;
765   j NUMBER;
766   cnt NUMBER;
767   l_cont_dummy_tab  WSH_UTIL_CORE.id_tab_type;
768   l_assignment_dummy_tab  WSH_UTIL_CORE.id_tab_type;
769   l_delivery_detail_id NUMBER;
770 --lpn conv
771   l_orig_value   VARCHAR2(2);
772   l_orig_update_cont_value   VARCHAR2(2);
773   l_net_weight   number;
774 
775   l_LPN_PREFIX   mtl_parameters.LPN_PREFIX%TYPE;
776   l_LPN_SUFFIX   mtl_parameters.LPN_SUFFIX%TYPE;
777   l_LPN_STARTING_NUMBER  mtl_parameters.LPN_STARTING_NUMBER%TYPE;
778   l_TOTAL_LPN_LENGTH     mtl_parameters.TOTAL_LPN_LENGTH%TYPE;
779   --l_cont_names WSH_GLBL_VAR_STRCT_GRP.v50_Tbl_Type;
780   --l_lpn_ids              WSH_UTIL_CORE.id_tab_type;
781   l_cont_name_dig          number;
782   l_tare_wt   NUMBER;
783   l_tare_wt_uom VARCHAR2(10);
784   l_msg_count                 NUMBER;
785   l_msg_data                  VARCHAR2(32767);
786   l_container_info_rec        WSH_GLBL_VAR_STRCT_GRP.ContInfoRectype;
787   l_gen_lpn_rec           WMS_Data_Type_Definitions_pub.AutoCreateLPNRecordType;
788   l_lpn_tbl               WMS_Data_Type_Definitions_pub.LPNTableType;
789   l_num_warnings  NUMBER := 0;
790   l_num_errors    NUMBER := 0;
791   l_return_status VARCHAR2(10);
792   l_additional_cont_attr    wsh_glbl_var_strct_grp.LPNRecordType;
793   l_organization_id         NUMBER;
794   l_inventory_item_id       NUMBER;
795   l_first                   number;
796   CURSOR c_get_default_parameters (v_organization_id NUMBER) IS
797   SELECT LPN_PREFIX,
798          LPN_SUFFIX,
799          LPN_STARTING_NUMBER ,
800          TOTAL_LPN_LENGTH
801   FROM mtl_parameters
802   WHERE ORGANIZATION_ID = v_organization_id;
803 
804   CURSOR c_get_lpn_info(v_lpn_id NUMBER) IS
805   SELECT gross_weight ,
806          GROSS_WEIGHT_UOM_CODE,
807          TARE_WEIGHT_UOM_CODE,
808          TARE_WEIGHT,
809          --container_volume,
810          --CONTAINER_VOLUME_UOM,
811          content_volume,  --filled volume
812          CONTENT_VOLUME_UOM_CODE ,
813          locator_id,
814          subinventory_code,
815          license_plate_number ,
816          organization_id,
817          inventory_item_id
818    FROM wms_license_plate_numbers
819    WHERE lpn_id = v_lpn_id;
820 
821    CURSOR c_get_lpn_from_history (v_lpn_id number)IS
822    SELECT wlh.LICENSE_PLATE_NUMBER,
823           wlh.organization_id,
824           wlh.inventory_item_id
825   FROM wms_lpn_histories wlh
826   WHERE wlh.lpn_id = v_lpn_id
827   --AND wlh.OPERATION_MODE = 1
828   AND wlh.lpn_context = 7
829   AND wlh.SOURCE_TYPE_ID = 1;
830 
831   CURSOR c_get_rowid (v_delivery_detail number) IS
832   SELECT rowid , container_name
833   from wsh_delivery_details
834   WHERE delivery_detail_id = v_delivery_detail;
835 
836 
837 
838 
839 
840 --
841 l_debug_on BOOLEAN;
842 --
843 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CREATE_CONT_INSTANCE_MULTI';
844 --
845 BEGIN
846 
847     --
848     --
849     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
850     --
851     IF l_debug_on IS NULL
852     THEN
853         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
854     END IF;
855     --
856     IF l_debug_on THEN
857         WSH_DEBUG_SV.push(l_module_name);
858         --
859         WSH_DEBUG_SV.log(l_module_name,'X_CONT_NAME',X_CONT_NAME);
860         WSH_DEBUG_SV.log(l_module_name,'P_CONT_ITEM_ID',P_CONT_ITEM_ID);
861         WSH_DEBUG_SV.log(l_module_name,'X_CONT_INSTANCE_ID',X_CONT_INSTANCE_ID);
862         WSH_DEBUG_SV.log(l_module_name,'P_PAR_DETAIL_ID',P_PAR_DETAIL_ID);
863         WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
864         WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_TYPE_CODE',P_CONTAINER_TYPE_CODE);
865     END IF;
866     --
867     --
868     IF l_debug_on THEN
869         WSH_DEBUG_SV.logmsg(l_module_name, 'IN CREATE_CONT_INSTANCE_MULTI '  );
870     END IF;
871     --
872 
873     l_orig_value := WSH_WMS_LPN_GRP.g_call_group_api;
874     l_orig_update_cont_value := WSH_WMS_LPN_GRP.g_update_to_container;
875     l_inventory_item_id := p_cont_item_id;
876 
877     IF p_organization_id IS NULL AND p_lpn_id IS NULL THEN
878 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ORG_NULL');
879 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
880 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
881 	--
882 	IF l_debug_on THEN
883 	    WSH_DEBUG_SV.pop(l_module_name);
884 	END IF;
885 	--
886 	return;
887     END IF;
888 
889 --lpn conv
890     IF p_lpn_id IS NULL THEN --{
891 
892        WSH_WMS_LPN_GRP.g_call_group_api := 'N';
893        WSH_WMS_LPN_GRP.g_update_to_container := 'N';
894 
895        IF c_wms_code_present = 'Y' THEN --{
896 
897        IF l_debug_on THEN
898          WSH_DEBUG_SV.logmsg(l_module_name,
899                           'calling wms_container_grp.Auto_Create_LPNs'  );
900        END IF;
901 
902        l_gen_lpn_rec.container_item_id := l_inventory_item_id;
903        l_gen_lpn_rec.organization_id :=  p_organization_id;
904        --l_gen_lpn_rec.lpn_prefix:=  l_LPN_PREFIX;
905        --l_gen_lpn_rec.lpn_suffix := l_LPN_SUFFIX;
906        --l_gen_lpn_rec.starting_num :=  l_LPN_STARTING_NUMBER;
907        --l_gen_lpn_rec.total_length :=  l_TOTAL_LPN_LENGTH;
908        l_gen_lpn_rec.quantity:= p_num_of_containers;
909 
910        wms_container_grp.Auto_Create_LPNs (
911                p_api_version         => 1.0
912              , p_init_msg_list      => fnd_api.g_false
913              , p_commit             => fnd_api.g_false
914              , x_return_status      => l_return_status
915              , x_msg_count          => l_msg_count
916              , x_msg_data           => l_msg_data
917              , p_caller             => 'WSH_GENERATE'
918              , p_gen_lpn_rec        => l_gen_lpn_rec
919              , p_lpn_table          => l_lpn_tbl
920        );
921        wsh_util_core.api_post_call
922          (
923            p_return_status => l_return_status,
924            x_num_warnings  => l_num_warnings,
925            x_num_errors    => l_num_errors,
926            p_msg_data      => l_msg_data
927        );
928        WSH_WMS_LPN_GRP.g_call_group_api := l_orig_value;
929        WSH_WMS_LPN_GRP.g_update_to_container := l_orig_update_cont_value;
930 
931        j := 1;
932        i := l_lpn_tbl.first;
933        WHILE i IS NOT NULL LOOP
934           IF l_debug_on THEN
935 	     WSH_DEBUG_SV.log(l_module_name,'container_name',
936                                    l_lpn_tbl(i).license_plate_number);
937 	     WSH_DEBUG_SV.log(l_module_name,'lpn_id',
938                                    l_lpn_tbl(i).lpn_id);
939           END IF;
940           l_container_info_rec.container_names(j)
941                                    := l_lpn_tbl(i).license_plate_number;
942           l_container_info_rec.lpn_ids(j) := l_lpn_tbl(i).lpn_id;
943 
944           IF (l_container_info_rec.container_names(j) IS NULL)  OR (l_container_info_rec.lpn_ids(j) IS NULL )THEN
945              RAISE FND_API.G_EXC_ERROR;
946           END IF;
947 
948           i := l_lpn_tbl.NEXT(i);
949           j := J + 1;
950        END LOOP;
951 
952        l_container_rec.weight_uom_code :=
953                                      l_lpn_tbl(1).GROSS_WEIGHT_UOM_CODE;
954        l_container_rec.gross_weight :=
955                                        l_lpn_tbl(1).GROSS_WEIGHT;
956        l_additional_cont_attr.tare_weight :=
957                                        l_lpn_tbl(1).TARE_WEIGHT;
958        l_additional_cont_attr.tare_weight_uom_code :=
959                                        l_lpn_tbl(1).TARE_WEIGHT_UOM_CODE;
960        l_container_rec.volume_uom_code :=
961                        l_lpn_tbl(1).CONTAINER_VOLUME_UOM;
962        l_container_rec.volume := l_lpn_tbl(1).CONTAINER_VOLUME;
963        l_additional_cont_attr.filled_volume_uom_code :=
964                        l_lpn_tbl(1).CONTENT_VOLUME_UOM_CODE;
965        l_container_rec.filled_volume := l_lpn_tbl(1).CONTENT_VOLUME;
966        l_container_rec.locator_id := l_lpn_tbl(1).locator_id;
967        l_container_rec.subinventory := l_lpn_tbl(1).SUBINVENTORY_CODE;
968 
969        ELSE --}{
970        /* commment out this part once the wms code is ready*/
971        OPEN c_get_default_parameters(p_organization_id);
972        FETCH c_get_default_parameters INTO
973           l_LPN_PREFIX,
974           l_LPN_SUFFIX,
975           l_LPN_STARTING_NUMBER ,
976           l_TOTAL_LPN_LENGTH;
977        CLOSE c_get_default_parameters;
978        IF l_TOTAL_LPN_LENGTH IS NOT NULL THEN
979           l_cont_name_dig := length(l_TOTAL_LPN_LENGTH) -
980              nvl(length(l_LPN_SUFFIX),0) -
981              NVL(length(l_LPN_PREFIX),0);
982           IF l_cont_name_dig < 0 THEN
983              l_cont_name_dig := NULL;
984           END IF;
985        END IF;
986        Create_Multiple_Cont_name (
987           p_cont_name     => NULL,
988           p_cont_name_pre => l_LPN_PREFIX,
989           p_cont_name_suf => l_LPN_SUFFIX,
990           p_cont_name_num => l_LPN_STARTING_NUMBER,
991           p_cont_name_dig => l_cont_name_dig,
992           p_quantity      => p_num_of_containers,
993           x_cont_names    => l_container_info_rec.container_names,
994           x_return_status => l_return_status
995        );
996        wsh_util_core.api_post_call
997          (
998            p_return_status => l_return_status,
999            x_num_warnings  => l_num_warnings,
1000            x_num_errors    => l_num_errors
1001        );
1002        i := l_container_info_rec.container_names.FIRST;
1003        WHILE i IS NOT NULL LOOP
1004          IF l_debug_on THEN
1005 	    WSH_DEBUG_SV.log(l_module_name,'container_name', l_container_info_rec.container_names(i));
1006          END IF;
1007          l_container_info_rec.lpn_ids(i) := NULL;
1008          i := l_container_info_rec.container_names.NEXT(i);
1009        END LOOP;
1010        END IF ; --} bmso
1011     ELSE --}{
1012        IF p_caller LIKE 'WSH_IB%' THEN --{
1013           l_container_rec.container_name := x_cont_name;
1014           l_organization_id := p_organization_id;
1015           l_inventory_item_id := NULL;
1016           l_container_info_rec.container_names(1) := l_container_rec.container_name;
1017           l_container_info_rec.lpn_ids(1) := p_lpn_id;
1018        ELSE --}{
1019           OPEN  c_get_lpn_info(p_lpn_id);
1020           FETCH c_get_lpn_info INTO
1021              l_container_rec.gross_weight,
1022              l_container_rec.weight_uom_code,
1023              l_additional_cont_attr.tare_weight_uom_code,
1024              l_additional_cont_attr.tare_weight,
1025              --l_container_rec.volume,
1026              --l_container_rec.volume_uom_code,
1027              l_container_rec.filled_volume,
1028              l_additional_cont_attr.filled_volume_uom_code,
1029              l_container_rec.locator_id,
1030              l_container_rec.subinventory,
1031              l_container_rec.container_name,
1032              l_organization_id,
1033              l_inventory_item_id;
1034 
1035              IF  c_get_lpn_info%NOTFOUND THEN
1036 	        IF l_debug_on THEN
1037 	           WSH_DEBUG_SV.log(l_module_name,'Error invalid Lpn_id ',
1038                                                                      p_lpn_id);
1039                 END IF;
1040                 RAISE FND_API.G_EXC_ERROR;
1041              END IF;
1042 
1043 /*
1044                 --compute the net weight
1045              IF (l_inventory_item_id IS NOT NULL)
1046                AND (l_tare_wt IS NOT NULL)
1047                AND (l_tare_wt_uom IS NOT NULL)
1048                AND (l_container_rec.weight_uom_code IS NOT NULL)
1049                AND (l_container_rec.gross_weight IS NOT NULL)
1050             THEN
1051                 l_net_weight := l_container_rec.gross_weight
1052                            -       WSH_WV_UTILS.Convert_Uom (l_tare_wt_uom,
1053                                            l_container_rec.weight_uom_code,
1054                                            l_tare_wt,
1055                                            l_inventory_item_id);
1056              END IF;
1057              IF l_debug_on THEN
1058 	         WSH_DEBUG_SV.log(l_module_name,'l_net_weight ',l_net_weight);
1059              END IF;
1060              l_container_rec.net_weight:= l_net_weight;
1061 */
1062              l_container_info_rec.container_names(1) := l_container_rec.container_name;
1063              l_container_info_rec.lpn_ids(1) := p_lpn_id;
1064 
1065           CLOSE c_get_lpn_info;
1066        END IF; --}
1067 
1068        IF p_organization_id IS NULL AND  l_organization_id IS NULL THEN
1069            FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ORG_NULL');
1070            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1071            WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1072            --
1073            IF l_debug_on THEN
1074                WSH_DEBUG_SV.pop(l_module_name);
1075            END IF;
1076            --
1077            return;
1078        END IF;
1079 
1080     END IF; --}
1081 
1082     l_container_rec.organization_id := NVL(p_organization_id,l_organization_id);
1083     l_container_rec.inventory_item_id := l_inventory_item_id;
1084     l_container_rec.container_type_code := p_container_type_code;
1085     l_container_rec.ignore_for_planning := p_ignore_for_planning;
1086 
1087     default_container_attr(l_container_rec,
1088                            l_additional_cont_attr ,
1089                            p_caller,
1090                            l_return_status);
1091 
1092     wsh_util_core.api_post_call
1093          (
1094            p_return_status => l_return_status,
1095            x_num_warnings  => l_num_warnings,
1096            x_num_errors    => l_num_errors
1097     );
1098    --lpn conv
1099 
1100 
1101 
1102     -- Populate Delivery Detail id and Delivery Assignment id
1103     -- within the Loop
1104 
1105     IF l_debug_on THEN
1106        WSH_DEBUG_SV.logmsg(l_module_name, 'CREATING DELIVERY DETAIL'||p_num_of_containers  );
1107        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.CREATE_DELIVERY_DETAILS_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
1108     END IF;
1109     --
1110 
1111 
1112     WSH_DELIVERY_DETAILS_PKG.create_delivery_details_bulk
1113        ( p_delivery_details_info => l_container_rec,
1114          p_num_of_rec            => p_num_of_containers,
1115          p_container_info_rec    => l_container_info_rec,
1116          x_return_status         => x_return_status,
1117          x_dd_id_tab             => l_cont_dummy_tab
1118        );
1119 
1120     --
1121     IF l_debug_on THEN
1122        WSH_DEBUG_SV.logmsg(l_module_name, 'Return status ' || x_return_status);
1123        WSH_DEBUG_SV.logmsg(l_module_name, 'CREATED DELIVERY DETAIL ' || l_cont_dummy_tab.count);
1124    END IF;
1125    --
1126 
1127    IF x_return_status IN
1128       (WSH_UTIL_CORE.G_RET_STS_ERROR,
1129        WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR  ) THEN
1130       --
1131       IF l_debug_on THEN
1132          WSH_DEBUG_SV.logmsg(l_module_name, 'ERROR CREATING CONTAINER' || TO_CHAR ( L_CONT_INSTANCE_ID )  );
1133       END IF;
1134       --
1135       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
1136       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1137       --
1138       IF l_debug_on THEN
1139 	        WSH_DEBUG_SV.pop(l_module_name);
1140       END IF;
1141       --
1142       return;
1143    END IF;
1144 
1145    l_first := l_cont_dummy_tab.FIRST;
1146    OPEN c_get_rowid(l_cont_dummy_tab(l_first));
1147    FETCH c_get_rowid INTO x_row_id, x_cont_name;
1148    CLOSE c_get_rowid;
1149    --
1150    IF l_debug_on THEN
1151        WSH_DEBUG_SV.log(l_module_name, 'x_row_id',x_row_id);
1152        WSH_DEBUG_SV.log(l_module_name, 'x_cont_name',x_cont_name);
1153        WSH_DEBUG_SV.logmsg(l_module_name, 'CREATED CONTAINER DELIVERY DETAIL ');
1154    END IF;
1155    --
1156 
1157    l_del_assg_rec.delivery_id := null;
1158    l_del_assg_rec.delivery_detail_id := l_cont_instance_id;
1159    l_del_assg_rec.parent_delivery_detail_id := null;
1160 
1161    --
1162    IF l_debug_on THEN
1163        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.CREATE_DELIV_ASSIGNMENT_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
1164        --WSH_DEBUG_SV.logmsg(l_module_name,'NUMBER OF CONTS'||p_num_of_containers);
1165        WSH_DEBUG_SV.logmsg(l_module_name,'NUMBER OF RECORDS IN WDD '||l_cont_dummy_tab.count);
1166    END IF;
1167    --
1168 
1169    WSH_DELIVERY_DETAILS_PKG.create_deliv_assignment_bulk
1170        ( p_delivery_assignments_info => l_del_assg_rec,
1171          p_num_of_rec => p_num_of_containers,
1172          p_dd_id_tab  =>  l_cont_dummy_tab,
1173          x_da_id_tab => l_assignment_dummy_tab,
1174          x_return_status => x_return_status
1175    );
1176 
1177    IF l_debug_on THEN
1178       WSH_DEBUG_SV.logmsg(l_module_name,'COUNT OF WDA RECORDS'||l_assignment_dummy_tab.count);
1179       WSH_DEBUG_SV.logmsg(l_module_name,'Create Delivery Assignment, Return Status'||x_return_status);
1180    END IF;
1181 
1182    IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
1183                              WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
1184 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
1185 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1186 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1187         --
1188         IF l_debug_on THEN
1189             WSH_DEBUG_SV.pop(l_module_name);
1190         END IF;
1191         --
1192         return;
1193    END IF;
1194 
1195    --x_cont_instance_id := l_cont_instance_id; lpn conv
1196    l_first := l_cont_dummy_tab.FIRST;
1197    IF l_first IS NOT NULL THEN
1198       x_cont_instance_id := l_cont_dummy_tab(l_first);
1199    END IF;
1200    x_cont_tab := l_cont_dummy_tab;
1201    -- J: W/V Changes
1202    x_unit_weight := l_container_rec.unit_weight;
1203    x_unit_volume := l_container_rec.unit_volume;
1204    x_weight_uom_code := l_container_rec.weight_uom_code;
1205    x_volume_uom_code := l_container_rec.volume_uom_code;
1206 
1207    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1208 
1209    --
1210    IF l_debug_on THEN
1211      WSH_DEBUG_SV.pop(l_module_name);
1212    END IF;
1213    --
1214 EXCEPTION
1215     WHEN FND_API.G_EXC_ERROR THEN
1216       WSH_WMS_LPN_GRP.g_call_group_api := l_orig_value;
1217       WSH_WMS_LPN_GRP.g_update_to_container := l_orig_update_cont_value;
1218       IF c_get_lpn_info%ISOPEN THEN
1219          CLOSE c_get_lpn_info;
1220       END IF;
1221       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1222 
1223       IF l_debug_on THEN
1224         WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1225         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
1226       END IF;
1227 
1228   WHEN Others THEN
1229         WSH_WMS_LPN_GRP.g_call_group_api := l_orig_value;
1230         WSH_WMS_LPN_GRP.g_update_to_container := l_orig_update_cont_value;
1231 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Create_Cont_Instance_Multi',l_module_name);
1232 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1233 
1234 --
1235 IF l_debug_on THEN
1236     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
1237     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
1238 END IF;
1239 --
1240 END Create_Cont_Instance_Multi;
1241 
1242 --
1243 /*
1244 -----------------------------------------------------------------------------
1245    PROCEDURE  : Create_Container_Instance
1246    PARAMETERS : p_cont_name - name for the container
1247 		p_cont_item_id - container item id (containers inv item id)
1248 		x_cont_instance_id - delivery_detail_id for new container - if
1249 		null then it will return a new id
1250 		p_par_detail_id - the parent detail id (parent container)
1251 		p_organization_id - organization id
1252 		p_container_type_code - the container type code of container
1253 		x_row_id - rowid of the new container record
1254 		x_return_status - return status of API
1255   DESCRIPTION : This procedure creates a new container and defaults some of the
1256 		container item attributes. The container item id of the
1257 		container that is being created is required. If	the container
1258 		name is not specified it defaults the name to be equal to the
1259 		delivery detail id.
1260 
1261                  PLEASE DO NOT USE THIS PROCEDURE ANYMORE
1262 
1263 ------------------------------------------------------------------------------
1264 */
1265 --
1266 --THIS PROCEDURE IS OBSOLETE
1267 PROCEDURE Create_Container_Instance (
1268   x_cont_name IN OUT NOCOPY  VARCHAR2,
1269   p_cont_item_id IN NUMBER,
1270   x_cont_instance_id IN OUT NOCOPY  NUMBER,
1271   p_par_detail_id IN NUMBER,
1272   p_organization_id IN NUMBER,
1273   p_container_type_code IN VARCHAR2,
1274   x_row_id OUT NOCOPY  VARCHAR2,
1275   x_return_status OUT NOCOPY  VARCHAR2) IS
1276 
1277 BEGIN
1278 
1279  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1280 
1281 END Create_Container_Instance;
1282 
1283 
1284 /*
1285 -----------------------------------------------------------------------------
1286    PROCEDURE  : Create_Multiple_Containers
1287    PARAMETERS : p_cont_item_id - container item id (containers inv item id)
1288 		p_organization_id - organization id
1289 		p_container_type_code - the container type code of container
1290 		p_cont_name - name for the container if qty is 1 (mainly used
1291 				by public APIs)
1292 		p_cont_name_pre - prefix for container name
1293 		p_cont_name_suf - suffix for container name
1294 		p_cont_name_num - starting number for number part of container
1295 				  name
1296 		p_cont_name_dig - number of digits to use for the number part
1297 				  of the container name
1298 		p_quantity - number of containers to create
1299 		x_cont_instance_tab - table of delivery_detail_ids for new
1300 				  containers - if null then it will return a
1301 				  table with new ids
1302 		x_return_status - return status of API
1303   DESCRIPTION : This procedure creates a new container and defaults some of the
1304 		container item attributes. The container item id of the
1305 		container that is being created is required. If	the container
1306 		name is not specified it defaults the name to be equal to the
1307 		delivery detail id.
1308 ------------------------------------------------------------------------------
1309 */
1310 
1311 -- THIS PROCEDURE IS OBSOLETE
1312 
1313 PROCEDURE Create_Multiple_Containers (
1314   p_cont_item_id IN NUMBER,
1315   p_organization_id IN NUMBER,
1316   p_container_type_code IN VARCHAR2,
1317   p_cont_name IN VARCHAR2,
1318   p_cont_name_pre IN VARCHAR2,
1319   p_cont_name_suf IN VARCHAR2,
1320   p_cont_name_num IN NUMBER,
1321   p_cont_name_dig IN NUMBER,
1322   p_quantity IN NUMBER,
1323   x_cont_instance_tab IN OUT NOCOPY  WSH_UTIL_CORE.id_tab_type,
1324   x_return_status OUT NOCOPY  VARCHAR2) IS
1325 
1326 --
1327 BEGIN
1328 
1329   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1330 
1331 END Create_Multiple_Containers;
1332 
1333 
1334 /*
1335 -----------------------------------------------------------------------------
1336    PROCEDURE  : Delete_Containers
1337    PARAMETERS : p_cont_tab - table of container instances to be deleted.
1338                 x_return_status - return status of API
1339   DESCRIPTION : This procedure in a  container instance and
1340                 deletes the container.  If the containers are not empty or
1341                 they are assigned to deliveries that are not open, they will
1342                 not be deleted. Also, if the containers are either assigned to
1343                 or container other containers packed into it, they will not be
1344                 deleted.
1345 ------------------------------------------------------------------------------
1346 */
1347 
1348 
1349 PROCEDURE Delete_Containers (
1350   p_container_id IN number,
1351   x_return_status OUT NOCOPY  VARCHAR2) IS
1352 
1353 CURSOR Check_Hierarchy (v_detail_id NUMBER) IS
1354 SELECT 'NOT EMPTY' FROM DUAL
1355 WHERE EXISTS (
1356 SELECT delivery_detail_id
1357 FROM wsh_delivery_assignments
1358 WHERE parent_delivery_detail_id = v_detail_id
1359 AND NVL(type, 'S') in ('C', 'S')
1360 AND rownum < 2
1361 UNION
1362 SELECT delivery_detail_id
1363 FROM wsh_delivery_assignments
1364 WHERE delivery_detail_id = v_detail_id
1365 AND parent_delivery_detail_id IS NOT NULL
1366 AND NVL(type, 'S') in ('C', 'S')
1367 AND rownum < 2);
1368 
1369 CURSOR Check_Container (v_detail_id NUMBER) IS
1370 SELECT container_flag
1371 FROM WSH_DELIVERY_DETAILS
1372 WHERE delivery_detail_id = v_detail_id;
1373 
1374 
1375 
1376 l_cont_status   VARCHAR2(30) := 'EMPTY';
1377 l_container_flag VARCHAR2(1);
1378 
1379 l_del_id        NUMBER;
1380 l_del_sts       VARCHAR2(10);
1381 
1382 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1383 
1384 
1385 Invalid_Container  EXCEPTION;
1386 Invalid_Delivery   EXCEPTION;
1387 Invalid_Detail     EXCEPTION;
1388 Delete_Det_Error   EXCEPTION;
1389 Cont_Not_Empty     EXCEPTION;
1390 Container_Error    EXCEPTION;
1391 Unassign_Del_Error EXCEPTION;
1392 
1393 --
1394 l_debug_on BOOLEAN;
1395 --
1396 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'DELETE_CONTAINERS';
1397 --
1398 BEGIN
1399         --
1400         --
1401         l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
1402         --
1403         IF l_debug_on IS NULL
1404         THEN
1405             l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
1406         END IF;
1407         --
1408         IF l_debug_on THEN
1409             WSH_DEBUG_SV.push(l_module_name);
1410             --
1411             WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_ID',P_CONTAINER_ID);
1412         END IF;
1413         --
1414         x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1415         SAVEPOINT Delete_Cont;
1416         IF (NVL(p_container_id,0) = 0) THEN
1417                 raise Invalid_Container;
1418         ELSE
1419          OPEN Check_Container (p_container_id);
1420          IF Check_Container%NOTFOUND THEN
1421                 raise Invalid_Detail;
1422          ELSE
1423            FETCH Check_Container INTO l_container_flag;
1424            IF l_container_flag = 'N' THEN
1425                 raise Invalid_Detail;
1426            END IF;
1427          END IF;
1428          IF Check_Container%ISOPEN THEN
1429            CLOSE Check_Container;
1430          END IF;
1431         END IF;
1432         -- get the delivery status of the container and check if it is assigned
1433         -- to a closed or in-transit delivery (only open deliveries allowed)
1434 
1435         --
1436         IF l_debug_on THEN
1437             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
1438         END IF;
1439         --
1440         WSH_CONTAINER_UTILITIES.Get_Delivery_Status (
1441                                                 p_container_id,
1442                                                 l_del_id,
1443                                                 l_del_sts,
1444                                                 x_return_status);
1445 
1446         IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
1447           raise Container_Error;
1448         END IF;
1449         IF ((nvl(l_del_id,-99) <> -99) AND (nvl(l_del_sts,'N/A') <> 'OP')) THEN
1450                     raise Invalid_Delivery;
1451         END IF;
1452         l_cont_status := 'EMPTY';
1453 
1454         OPEN Check_Hierarchy (p_container_id);
1455 
1456         FETCH Check_Hierarchy INTO l_cont_status;
1457 
1458         IF Check_Hierarchy%NOTFOUND THEN
1459 
1460 
1461                 --
1462                 IF l_debug_on THEN
1463                     WSH_DEBUG_SV.log(l_module_name,'Delivery Status',l_del_sts);
1464                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.DELETE_DELIVERY_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
1465                 END IF;
1466                 --
1467                 WSH_DELIVERY_DETAILS_PKG.Delete_Delivery_Details (
1468                                  p_rowid              => null,
1469                                  p_delivery_detail_id => p_container_id,
1470                                  x_return_status      => x_return_status);
1471 
1472                 --
1473                 IF l_debug_on THEN
1474                     WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
1475                 END IF;
1476                 --
1477 
1478                 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1479                     raise Container_Error;
1480                 END IF;
1481 
1482         ELSE
1483 
1484                 IF (nvl(l_cont_status,'EMPTY') <> 'EMPTY') THEN
1485                    raise Cont_Not_Empty;
1486                 ELSE
1487                     raise Container_Error;
1488                 END IF;
1489         END IF;
1490 
1491         IF Check_Hierarchy%ISOPEN THEN
1492                      CLOSE Check_Hierarchy;
1493         END IF;
1494 
1495 
1496 --
1497 IF l_debug_on THEN
1498     WSH_DEBUG_SV.pop(l_module_name);
1499 END IF;
1500 --
1501 EXCEPTION
1502 
1503   WHEN Invalid_Container  THEN
1504         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NULL_DELETE');
1505         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1506         WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1507         --
1508         IF l_debug_on THEN
1509             WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_CONTAINER exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1510             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_CONTAINER');
1511         END IF;
1512         --
1513   WHEN Invalid_Delivery   THEN
1514         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
1515         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1516         WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1517         --
1518         IF l_debug_on THEN
1519             WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DELIVERY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1520             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_DELIVERY');
1521         END IF;
1522         --
1523   WHEN Invalid_Detail     THEN
1524         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DELETE_NOT_CONT');
1525         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1526         WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1527         --
1528         IF l_debug_on THEN
1529             WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DETAIL exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1530             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_DETAIL');
1531         END IF;
1532         --
1533   WHEN Cont_Not_Empty     THEN
1534         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DELETE_NOT_EMPTY');
1535         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1536         WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1537         --
1538         IF l_debug_on THEN
1539             WSH_DEBUG_SV.logmsg(l_module_name,'CONT_NOT_EMPTY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1540             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CONT_NOT_EMPTY');
1541         END IF;
1542         --
1543   WHEN Container_Error    THEN
1544         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1545         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DELETE_ERROR');
1546         WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1547         --
1548         IF l_debug_on THEN
1549             WSH_DEBUG_SV.logmsg(l_module_name,'CONTAINER_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1550             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CONTAINER_ERROR');
1551         END IF;
1552         --
1553   WHEN Unassign_Del_Error THEN
1554         ROLLBACK to Delete_Cont;
1555         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1556         FND_MESSAGE.SET_NAME('WSH','WSH_UNASSIGN_DEL_ERROR');
1557         WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1558 
1559 --
1560 IF l_debug_on THEN
1561     WSH_DEBUG_SV.logmsg(l_module_name,'UNASSIGN_DEL_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1562     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:UNASSIGN_DEL_ERROR');
1563 END IF;
1564 --
1565   WHEN Others THEN
1566         WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Delete_Containers',l_module_name);
1567         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1568 
1569 --
1570 IF l_debug_on THEN
1571     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
1572     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
1573 END IF;
1574 --
1575 END Delete_Containers;
1576 
1577 -- THIS PROCEDURE IS OBSOLETE
1578 /*
1579 -----------------------------------------------------------------------------
1580    PROCEDURE  : Update_Container
1581    PARAMETERS : p_container_name - new container name that needs to be assigned
1582 		to the existing container.
1583 		p_container_instance_id - the delivery detail id for the
1584 		container that needs to be updated.
1585 		p_old_cont_name - exisiting container name for the container,
1586 		to be used only if container instance id in the input parameter
1587 		is null.
1588 		x_return_status - return status of API
1589   DESCRIPTION : This procedure takes in a new container name and existing
1590 		container information like the delivery detail id and existing
1591 		container name that needs to be updated. The API checks to see
1592 		if the container that is being updated is assigned to a closed,
1593 		confirmed or in-transit delivery. If it is, no update is
1594 		allowed - if not, only the container name can be updated.
1595 ------------------------------------------------------------------------------
1596 */
1597 
1598 
1599 --THIS PROCEDURE IS OBSOLETE
1600 PROCEDURE Update_Container (
1601   p_container_name IN VARCHAR2,
1602   p_container_instance_id IN NUMBER,
1603   p_old_cont_name IN VARCHAR2,
1604   x_return_status OUT NOCOPY  VARCHAR2) IS
1605 
1606 BEGIN
1607 
1608  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1609 
1610 END Update_Container;
1611 
1612 
1613 
1614 /*
1615 -----------------------------------------------------------------------------
1616    PROCEDURE  : Assign_Detail
1617    PARAMETERS : p_container_instance_id - container instance id of container
1618 		p_del_detail_tab - table of delivery detail ids
1619 		x_pack_status - status of container after packing the lines
1620 			into it : underpacked or overpacked
1621 		x_return_status - return status of API
1622   DESCRIPTION : This procedure assigns a number of lines to the specified
1623 		container instance and returns a pack status of underpacked
1624 		or overpacked or success.
1625 ------------------------------------------------------------------------------
1626 */
1627 
1628 
1629 PROCEDURE Assign_Detail(
1630   p_container_instance_id IN NUMBER,
1631   p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
1632   x_pack_status OUT NOCOPY  VARCHAR2,
1633   x_return_status OUT NOCOPY  VARCHAR2,
1634   p_check_credit_holds IN BOOLEAN) IS
1635 
1636   CURSOR Get_First_Line (v_cont_instance_id NUMBER) IS
1637   SELECT delivery_detail_id
1638   FROM wsh_delivery_assignments_v
1639   WHERE parent_delivery_detail_id = v_cont_instance_id
1640   AND rownum < 2;
1641 
1642   CURSOR Get_Cont_Item IS
1643   SELECT inventory_item_id, master_serial_number
1644   FROM WSH_DELIVERY_DETAILS
1645   WHERE delivery_detail_id = p_container_instance_id
1646   AND container_flag = 'Y';
1647 
1648   CURSOR Get_Det_Cont_Item (v_detail_id NUMBER) IS
1649   SELECT nvl(detail_container_item_id, master_container_item_id),
1650 	 source_line_id, source_header_id,source_code
1651   FROM WSH_DELIVERY_DETAILS
1652   WHERE delivery_detail_id = v_detail_id
1653   AND container_flag = 'N';
1654 
1655   l_del_detail_id	WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
1656 
1657   l_group_id_tab 	WSH_UTIL_CORE.id_tab_type;
1658 --  l_temp_detail_tab	WSH_UTIL_CORE.id_tab_type;
1659 
1660   l_src_line_id		NUMBER;
1661   l_src_hdr_id		NUMBER;
1662   l_source_code         VARCHAR2(30);
1663 
1664   cnt			NUMBER;
1665   i			NUMBER;
1666   l_group_id		NUMBER;
1667 
1668   l_del_rows		WSH_UTIL_CORE.id_tab_type;
1669   l_ret_sts		VARCHAR2(1);
1670 
1671   l_cont_name VARCHAR2(30);
1672   l_delivery_id NUMBER;
1673   l_del_status VARCHAR2(10);
1674 
1675   l_det_cont_item_id NUMBER;
1676   l_cont_item_id NUMBER;
1677 
1678   l_tmp_status VARCHAR2(30) := 'OK';
1679 
1680   l_attr_flag VARCHAR2(1) := 'N';
1681 
1682   l_upd_flag BOOLEAN := FALSE;
1683 
1684   l_master_serial_number VARCHAR2(30);
1685   l_master_cont_id	NUMBER;
1686   l_master_cont_name    VARCHAR2(30);
1687 
1688   l_attr_tab  wsh_delivery_autocreate.grp_attr_tab_type;
1689   l_group_tab  wsh_delivery_autocreate.grp_attr_tab_type;
1690   l_action_rec wsh_delivery_autocreate.action_rec_type;
1691   l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
1692   l_matched_entities wsh_util_core.id_tab_type;
1693   l_out_rec wsh_delivery_autocreate.out_rec_type;
1694 
1695 
1696 
1697 --
1698 l_debug_on BOOLEAN;
1699 --
1700 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'ASSIGN_DETAIL';
1701 --
1702 BEGIN
1703 
1704   --
1705   --
1706   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
1707   --
1708   IF l_debug_on IS NULL
1709   THEN
1710       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
1711   END IF;
1712   --
1713   IF l_debug_on THEN
1714       WSH_DEBUG_SV.push(l_module_name);
1715       --
1716       WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
1717       WSH_DEBUG_SV.log(l_module_name,'P_CHECK_CREDIT_HOLDS',P_CHECK_CREDIT_HOLDS);
1718   END IF;
1719   --
1720   IF p_del_detail_tab.COUNT = 0 THEN
1721      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1722      FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_DET_ASSG_NULL');
1723      WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1724      --
1725      IF l_debug_on THEN
1726          WSH_DEBUG_SV.pop(l_module_name);
1727      END IF;
1728      --
1729      return;
1730   END IF;
1731 
1732   -- get the delivery status of the container and check if it is assigned
1733   -- to a closed or in-transit delivery (only open deliveries allowed)
1734 
1735   --
1736   IF l_debug_on THEN
1737       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
1738   END IF;
1739   --
1740   WSH_CONTAINER_UTILITIES.Get_Delivery_Status ( p_container_instance_id,
1741 						l_delivery_id,
1742 						l_del_status,
1743 						x_return_status);
1744 
1745   IF l_debug_on THEN
1746     WSH_DEBUG_SV.log(l_module_name,'Delivery Status',l_del_status);
1747     WSH_DEBUG_SV.log(l_module_name,'x_return_status',x_return_status);
1748   END IF;
1749   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1750 	--
1751 	IF l_debug_on THEN
1752 	    WSH_DEBUG_SV.pop(l_module_name);
1753 	END IF;
1754 	--
1755 	return;
1756   END IF;
1757 
1758   IF (nvl(l_delivery_id,-99) <> -99) THEN
1759 
1760 	IF (nvl(l_del_status,'N/A') NOT IN  ('OP','SA')) THEN
1761 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
1762 		x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1763 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1764 		x_pack_status := 'Error';
1765 		--
1766 		IF l_debug_on THEN
1767 		    WSH_DEBUG_SV.pop(l_module_name);
1768 		END IF;
1769 		--
1770 		return;
1771 	END IF;
1772   END IF;
1773 
1774 
1775   -- check container attributes to see if the attr columns have been populated
1776   -- if they are not null - it implies that lines are already assigned to the
1777   -- container in the hierarchy. so call the autocreate deliveries API with the
1778   -- container as the first line..
1779 
1780   --
1781   IF l_debug_on THEN
1782       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
1783   END IF;
1784   --
1785   wsh_container_actions.Check_Cont_Attributes (
1786 					p_container_instance_id,
1787 					l_attr_flag,
1788 					x_return_status);
1789 
1790   --
1791   IF l_debug_on THEN
1792       WSH_DEBUG_SV.log(l_module_name,' after CHECK_CONT_ATTRIBUTES, return status is',x_return_status);
1793   END IF;
1794 
1795   --dbms_output.put_line('after check attr for ' || p_container_instance_id || ' attr flag is ' || l_attr_flag || ' and ret sts is  ' || x_return_status);
1796 
1797   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1798 	--
1799 	-- Debug Statements
1800 	--
1801 	IF l_debug_on THEN
1802 	    WSH_DEBUG_SV.pop(l_module_name);
1803 	END IF;
1804 	--
1805 	return;
1806   END IF;
1807 
1808   IF l_attr_flag = 'N' THEN
1809 	i := 1;
1810   ELSE
1811 	l_attr_tab(1).entity_id := p_container_instance_id;
1812 	l_attr_tab(1).entity_type := 'DELIVERY_DETAIL';
1813 	i := 2;
1814   END IF;
1815 
1816 
1817   FOR j IN 1.. p_del_detail_tab.COUNT LOOP
1818      l_attr_tab(i).entity_id := p_del_detail_tab(j);
1819      l_attr_tab(i).entity_type := 'DELIVERY_DETAIL';
1820      i := i + 1;
1821   END LOOP;
1822 
1823   IF Get_First_Line%ISOPEN THEN
1824   	CLOSE Get_First_Line;
1825   END IF;
1826 
1827   -- call auto_create del grouping API with l_temp_detail_tab returning
1828   -- l_group_id_tab of type WSH_UTIL_CORE.id_tab_type;
1829 
1830   --
1831   IF l_debug_on THEN
1832       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
1833   END IF;
1834   --
1835    l_action_rec.action := 'MATCH_GROUPS';
1836 
1837 
1838 
1839    WSH_Delivery_AutoCreate.Find_Matching_Groups(p_attr_tab => l_attr_tab,
1840                                                    p_action_rec => l_action_rec,
1841                                                    p_target_rec => l_target_rec,
1842                                                    p_group_tab => l_group_tab,
1843                                                    x_matched_entities => l_matched_entities,
1844                                                    x_out_rec => l_out_rec,
1845                                                    x_return_status => x_return_status);
1846 
1847   --
1848   IF (x_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
1849 	--dbms_output.put_line('error in autocreate');
1850 	FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
1851         WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1852 	--
1853   END IF;
1854 
1855   i := l_attr_tab.FIRST;
1856 
1857   l_group_id := l_attr_tab(i).group_id;
1858 
1859   -- if l_attr_flag = Y then it means that the first record in the PL/SQL table
1860   -- is the container itself and it should be ignored. so increment counters.
1861 
1862   IF l_attr_flag = 'Y' THEN
1863 	i := i + 1;
1864   END IF;
1865 
1866   l_del_detail_id := l_attr_tab(i).entity_id;
1867   l_ret_sts := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1868 
1869   OPEN Get_Cont_Item;
1870 
1871   FETCH Get_Cont_Item INTO l_cont_item_id,l_master_serial_number;
1872 
1873   IF Get_Cont_Item%NOTFOUND THEN
1874 	CLOSE Get_Cont_Item;
1875 	l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
1876 	--
1877 	IF l_debug_on THEN
1878 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
1879 	END IF;
1880 	--
1881 	l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
1882 	FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
1883 	FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
1884 	WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
1885 	x_return_status := l_ret_sts;
1886 	x_pack_status := 'Error';
1887 	--
1888 	IF l_debug_on THEN
1889 	    WSH_DEBUG_SV.pop(l_module_name);
1890 	END IF;
1891 	--
1892 	return;
1893   END IF;
1894 
1895   IF Get_Cont_Item%ISOPEN THEN
1896 	CLOSE Get_Cont_Item;
1897   END IF;
1898 
1899 
1900   WHILE  i <= l_attr_tab.COUNT LOOP
1901 
1902      IF l_group_id = l_attr_tab(i).group_id THEN
1903 
1904 
1905 	l_del_detail_id := l_attr_tab(i).entity_id;
1906 	l_src_line_id := NULL;
1907  	l_src_hdr_id := NULL;
1908 
1909 	-- check if the detail container item id on the line matches the
1910 	-- container item id of the container that it is being assigned to
1911 
1912         OPEN Get_Det_Cont_Item (l_del_detail_id);
1913 
1914 	FETCH Get_Det_Cont_Item INTO
1915 	      l_det_cont_item_id,
1916 	      l_src_line_id,
1917 	      l_src_hdr_id,l_source_code;
1918 
1919 	IF Get_Det_Cont_Item%NOTFOUND THEN
1920 	   CLOSE Get_Det_Cont_Item;
1921 	   l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
1922            l_tmp_status := 'Error';
1923 	   GOTO next_line;
1924 	 END IF;
1925 
1926 	 IF Get_Det_Cont_Item%ISOPEN THEN
1927 	    CLOSE Get_Det_Cont_Item;
1928 	 END IF;
1929 
1930 	 IF l_cont_item_id <> nvl(l_det_cont_item_id,l_cont_item_id) THEN
1931 		FND_MESSAGE.SET_NAME('WSH','WSH_DET_CONT_ITEM_DIFF');
1932 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
1933 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
1934 		IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
1935 		   l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
1936 		END IF;
1937 	 END IF;
1938 
1939 	  -- check if the line has any holds on it. IF yes ignore the line
1940 	  -- and set a warning and proceed to the next line.
1941 
1942 	--
1943 	--
1944 	-- added to fix bug 1818233.
1945 	-- Auto-pack performs 90% of time doing this check, especially
1946 	-- when a single delivery line is being split into multiple due to
1947 	-- container-load relationship.
1948 	-- This check will be made only once for a delivery line in place of
1949 	-- doing it every time we assign a split delivery line to a container.
1950 	-- Thus, auto-pack lines will always call assign_detail procedure
1951 	-- with parameter p_check_credit_holds = FALSE.
1952 	-- Auto-pack lines will explicitly call the procedure
1953 	-- WSH_DETAILS_VALIDATIONS.Check_Credit_Holds only once for a delivery
1954 	-- line
1955 	--
1956         IF p_check_credit_holds
1957 	THEN
1958 	    --
1959 	    IF l_debug_on THEN
1960 	        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_CREDIT_HOLDS',WSH_DEBUG_SV.C_PROC_LEVEL);
1961 	    END IF;
1962 	    --
1963 	    WSH_DETAILS_VALIDATIONS.Check_Credit_Holds (
1964 					l_del_detail_id,
1965 					'PACK',
1966 					l_src_line_id,
1967 					l_src_hdr_id,
1968                                         l_source_code,
1969 					'Y',
1970 					x_return_status);
1971 
1972             --
1973             IF l_debug_on THEN
1974               WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
1975             END IF;
1976             --
1977 	    IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1978 		IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
1979 		   l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
1980 		END IF;
1981 		l_tmp_status := 'Error';
1982 		GOTO next_line;
1983 	    END IF;
1984 	END IF;
1985 
1986 	-- check if line has any invalid hazmat codes - either by itself
1987 	-- or if there is any incompatability with any existing lines in
1988 	-- the container.
1989 
1990 	-- currently there is no code for this and so the API returns a
1991 	-- success always..
1992 
1993 	--
1994 	IF l_debug_on THEN
1995 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.VALIDATE_HAZARD_CLASS',WSH_DEBUG_SV.C_PROC_LEVEL);
1996 	END IF;
1997 	--
1998 	WSH_CONTAINER_UTILITIES.Validate_Hazard_Class (
1999 		l_del_detail_id,
2000 		p_container_instance_id,
2001 		x_return_status);
2002 
2003 	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2004 		IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2005 		   l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
2006 		END IF;
2007 		l_tmp_status := 'Error';
2008 		GOTO next_line;
2009 	END IF;
2010 
2011 	-- create assignment with l_del_detail_id and p_container_instance_id;
2012 
2013         --
2014         IF l_debug_on THEN
2015                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_DETAIL_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
2016         END IF;
2017         --
2018         WSH_DELIVERY_DETAILS_ACTIONS.Assign_Detail_To_Cont (
2019 		l_del_detail_id,
2020 		p_container_instance_id,
2021 		x_return_status);
2022 
2023             --
2024         IF l_debug_on THEN
2025           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2026         END IF;
2027         --
2028 	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2029            IF x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
2030               l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
2031            ELSE
2032 		-- l_ret_sts := x_return_status;
2033 		--dbms_output.put_line('error assigning ' || l_del_detail_id);
2034 		l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
2035 	     	FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_DETAIL_NOT_ASSIGNED');
2036 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
2037  	    	WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
2038 	    END IF;
2039 	 END IF;
2040 
2041 	 -- store group id to check for group id of next line
2042 	 -- l_group_id := l_group_id_tab(cnt);
2043 
2044 	    -- now update the container grouping attribute columns with the
2045 	    -- attributes from the delivery details (only for first line).
2046             -- we need to do this regardless of the fact the the line may have
2047             -- grouping attributes populated as in the case of updating line direction
2048             -- of a container already assigned to a delivery.
2049 
2050             IF NOT l_upd_flag THEN
2051 
2052 		--dbms_output.put_line('calling update cont hierarchy with ' || p_container_instance_id);
2053 	    	--
2054 	    	IF l_debug_on THEN
2055 	    	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
2056 	    	END IF;
2057 	    	--
2058 	    	wsh_container_actions.Update_Cont_Hierarchy (
2059 						l_del_detail_id,
2060 						NULL,
2061 						p_container_instance_id,
2062 						x_return_status);
2063                 --
2064                 IF l_debug_on THEN
2065                   WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2066                 END IF;
2067                 --
2068 
2069 	    	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2070 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
2071 			--
2072 			IF l_debug_on THEN
2073 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2074 			END IF;
2075 			--
2076 			l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
2077 			FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2078 			WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2079 	    	 END IF;
2080 
2081 		 l_upd_flag := TRUE;
2082 
2083 
2084 
2085 	    END IF;
2086 
2087 	    UPDATE WSH_DELIVERY_DETAILS
2088 	    SET master_serial_number = l_master_serial_number
2089 	    WHERE delivery_detail_id = l_del_detail_id;
2090 
2091 	    IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2092   --dbms_output.put_line('error updating master serial number for detail ' || l_del_detail_id);
2093 
2094 		FND_MESSAGE.SET_NAME('WSH','WSH_DET_UPD_SER_ERROR');
2095 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
2096 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2097 	 	IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2098 			l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
2099 	    	END IF;
2100 	     END IF;
2101         ELSE
2102 
2103           l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
2104           l_tmp_status := 'Error';
2105           GOTO next_line;
2106 
2107         END IF;
2108 
2109 	<<next_line>>
2110 		IF l_tmp_status = 'Error' THEN
2111 			FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_DETAIL_NOT_ASSIGNED');
2112 			FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
2113 			WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2114 	 	END IF;
2115 
2116 	i := i + 1;
2117 	l_tmp_status := 'OK';
2118 
2119    END LOOP;
2120 
2121    x_return_status := l_ret_sts;
2122 
2123 	--
2124 	IF l_debug_on THEN
2125            WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
2126 	   WSH_DEBUG_SV.pop(l_module_name);
2127 	END IF;
2128 	--
2129 EXCEPTION
2130 
2131   WHEN Others THEN
2132 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Assign_Detail',l_module_name);
2133 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
2134 
2135 --
2136 IF l_debug_on THEN
2137     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
2138     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
2139 END IF;
2140 --
2141 END Assign_Detail;
2142 
2143 
2144 /*
2145 -----------------------------------------------------------------------------
2146    PROCEDURE  : Unassign_Detail
2147    PARAMETERS : p_container_instance_id - container instance id of container
2148 		p_delivery_id - delivery id from which detail needs to be
2149 		unassigned
2150 		p_del_detail_tab - table of delivery detail ids
2151 		p_cont_unassign - flag to determine whether to unassign from
2152 		container or not.
2153 		p_del_unassign - flag to determine whether to unassign from
2154 		delivery or not
2155 		x_pack_status - status of container after packing the lines
2156 			into it : underpacked or overpacked
2157 		x_return_status - return status of API
2158   DESCRIPTION : This procedure unassigns a number of lines from the specified
2159 		container instance or delivery and returns a pack status of
2160 		underpacked or overpacked or success. The unassigning is
2161 		determined using the two unassign flags or by specific ids.
2162 ------------------------------------------------------------------------------
2163 */
2164 
2165 
2166 
2167 PROCEDURE Unassign_Detail(
2168   p_container_instance_id IN NUMBER,
2169   p_delivery_id IN NUMBER,
2170   p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
2171   p_cont_unassign IN VARCHAR2,
2172   p_del_unassign IN VARCHAR2,
2173   x_pack_status OUT NOCOPY  VARCHAR2,
2174   x_return_status OUT NOCOPY  VARCHAR2,
2175   p_action_prms IN wsh_glbl_var_strct_grp.dd_action_parameters_rec_type
2176   ) IS
2177 
2178   l_del_detail_rec 	WSH_UTIL_CORE.ID_TAB_TYPE;
2179 
2180   l_gross 	NUMBER;
2181   l_net		NUMBER;
2182   l_volume	NUMBER;
2183 -- J: W/V Changes
2184   l_fill_status  VARCHAR2(1);
2185 
2186   l_rows	NUMBER;
2187 
2188   cnt		NUMBER;
2189 
2190   CURSOR Get_Min_Fill IS
2191   SELECT minimum_fill_percent
2192   FROM WSH_DELIVERY_DETAILS
2193   WHERE delivery_detail_id = p_container_instance_id
2194   AND container_flag = 'Y';
2195 
2196   /* wms -change : Added inentory_item_id to later check (ignore) fill pc when LPN */
2197   CURSOR Is_Container (v_detail_id NUMBER) IS
2198   SELECT container_flag, serial_number, master_serial_number, inventory_item_id
2199   FROM WSH_DELIVERY_DETAILS
2200   WHERE delivery_detail_id = v_detail_id;
2201 
2202   CURSOR Get_Cont (v_detail_id NUMBER) IS
2203   SELECT wda.parent_delivery_detail_id container_instance_id, wda.delivery_id,
2204          wddp.organization_id, nvl(wddp.line_direction,'O'),    -- K LPN CONV. rv
2205          wddp.container_flag -- K: MDC
2206   FROM wsh_delivery_assignments wda,
2207        wsh_delivery_details wddp        -- K LPN CONV. rv
2208   WHERE wda.delivery_detail_id = v_detail_id
2209   AND   wda.parent_delivery_detail_id = wddp.delivery_detail_id(+)
2210   AND   NVL(wda.type, 'S') in ('S', 'C');
2211 
2212 
2213   l_cont_flag	VARCHAR2(1);
2214   l_serial_number VARCHAR2(30);
2215   l_master_serial_number VARCHAR2(30);
2216 
2217   l_master_cont_id NUMBER;
2218   l_master_cont_name VARCHAR2(30);
2219 
2220   l_cont_name VARCHAR2(30);
2221 
2222   l_cont_instance_id NUMBER;
2223   l_cont_org_id NUMBER;  -- K LPN CONV. rv
2224   l_cont_line_dir VARCHAR2(10);  -- K LPN CONV. rv
2225   l_cnt_org_id NUMBER;  -- K LPN CONV. rv
2226   l_delivery_id NUMBER;
2227   l_last_line_flag VARCHAR2(1);
2228   l_attr_flag VARCHAR2(1) := 'N';
2229 
2230   l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
2231 
2232   l_del_status VARCHAR2(10);
2233 
2234   l_cont_tab          WSH_UTIL_CORE.id_tab_type;
2235   l_cont_org_tab      WSH_UTIL_CORE.id_tab_type; -- K LPN CONV. rv
2236   l_cont_line_dir_tab WSH_UTIL_CORE.Column_Tab_Type; -- K LPN CONV. rv
2237 
2238   -- K: MDC
2239   l_mdc_index        NUMBER := 0;
2240   l_mdc_details      WSH_UTIL_CORE.id_tab_type;
2241 
2242 
2243   l_cont_item_id NUMBER;  -- wms change:
2244 
2245 l_num_warnings          number := 0;
2246 
2247 -- K LPN CONV. rv
2248 l_wms_org    VARCHAR2(10) := 'N';
2249 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
2250 
2251 cursor l_get_cnt_org_csr (p_cnt_inst_id IN NUMBER) is
2252 select organization_id
2253 from   wsh_delivery_details
2254 where  delivery_detail_id = p_cnt_inst_id;
2255 
2256 -- K LPN CONV. rv
2257 
2258 --BUG#12904248
2259 l_deliver_to_location_id NUMBER;
2260 
2261 --
2262 l_debug_on BOOLEAN;
2263 --
2264 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UNASSIGN_DETAIL';
2265 --
2266 BEGIN
2267 
2268   --
2269   --
2270   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
2271   --
2272   IF l_debug_on IS NULL
2273   THEN
2274       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
2275   END IF;
2276   --
2277   IF l_debug_on THEN
2278       WSH_DEBUG_SV.push(l_module_name);
2279       --
2280       WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
2281       WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
2282       WSH_DEBUG_SV.log(l_module_name,'P_CONT_UNASSIGN',P_CONT_UNASSIGN);
2283       WSH_DEBUG_SV.log(l_module_name,'P_DEL_UNASSIGN',P_DEL_UNASSIGN);
2284   END IF;
2285   --
2286   IF p_del_detail_tab.count = 0 THEN
2287 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_ASSG_NULL');
2288 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2289 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2290 	--
2291 	IF l_debug_on THEN
2292 	    WSH_DEBUG_SV.pop(l_module_name);
2293 	END IF;
2294 	--
2295 	return;
2296   END IF;
2297 
2298   cnt := 0;
2299 
2300   FOR i IN 1..p_del_detail_tab.count LOOP
2301 
2302  	-- get the delivery status of the container and check if it is assigned
2303   	-- to a closed or in-transit delivery (only open deliveries allowed)
2304 	OPEN Get_Cont (p_del_detail_tab(i));
2305 	FETCH Get_Cont INTO l_cont_instance_id, l_delivery_id,
2306                             l_cont_org_id, l_cont_line_dir, -- K LPN CONV. rv
2307                             l_cont_flag; -- K: MDC
2308 
2309 	IF Get_Cont%NOTFOUND THEN
2310 		CLOSE Get_Cont;
2311 		GOTO next_detail;
2312 	END IF;
2313 	IF Get_Cont%ISOPEN THEN
2314 		CLOSE Get_Cont;
2315 	END IF;
2316 
2317   	--
2318   	IF l_debug_on THEN
2319   	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
2320   	END IF;
2321   	--
2322   	WSH_CONTAINER_UTILITIES.Get_Delivery_Status (
2323 					l_cont_instance_id,
2324 					l_delivery_id,
2325 					l_del_status,
2326 					x_return_status);
2327 
2328         --
2329         IF l_debug_on THEN
2330           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2331         END IF;
2332         --
2333   	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2334 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2335 			l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2336 		END IF;
2337 		GOTO next_detail;
2338   	END IF;
2339 
2340   	IF (nvl(l_delivery_id,-99) <> -99) THEN
2341 
2342 		IF (nvl(l_del_status,'N/A') <> 'OP')
2343         AND NVL(p_action_prms.caller,'!!!!') NOT LIKE '%' || WSH_UTIL_CORE.C_SPLIT_DLVY_SUFFIX   -- J-IB-NPARIKH
2344         THEN
2345 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
2346 			x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2347 			WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2348 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2349 				l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2350 			END IF;
2351 			x_pack_status := 'Error';
2352 			GOTO next_detail;
2353 		END IF;
2354   	END IF;
2355         IF l_cont_instance_id IS NOT NULL AND l_cont_flag = 'C' THEN
2356              l_mdc_index       := l_mdc_index + 1;
2357              l_mdc_details(l_mdc_index) := p_del_detail_tab(i);
2358         ELSE
2359 	   cnt := cnt + 1;
2360   	   l_del_detail_rec(cnt)    := p_del_detail_tab(i);
2361 	   l_cont_tab(cnt)          := l_cont_instance_id; -- K LPN CONV. rv
2362 	   l_cont_org_tab(cnt)      := l_cont_org_id;       -- K LPN CONV. rv
2363 	   l_cont_line_dir_tab(cnt) := l_cont_line_dir;     -- K LPN CONV. rv
2364         END IF;
2365         <<next_detail>>
2366 		null;
2367 
2368   END LOOP;
2369 
2370   IF l_mdc_index > 0 THEN
2371      IF l_debug_on THEN
2372          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Unpack_Details_from_Consol',WSH_DEBUG_SV.C_PROC_LEVEL);
2373      END IF;
2374      Unpack_Details_from_Consol
2375                (p_delivery_details_tab  => l_mdc_details,
2376                 p_caller                => 'WMS_UNASSIGN_CONSOL',
2377                 x_return_status         => x_return_status);
2378 
2379      IF l_debug_on THEN
2380         WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2381      END IF;
2382      --
2383      IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2384         IF x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
2385            l_num_warnings := l_num_warnings + 1;
2386         ELSE
2387 	  --
2388           IF l_debug_on THEN
2389 	    WSH_DEBUG_SV.pop(l_module_name);
2390 	  END IF;
2391 	  --
2392 	  return;
2393         END IF;
2394      END IF;
2395 
2396      IF cnt = 0 THEN
2397         return;
2398      END IF;
2399 
2400   END IF;
2401   --
2402   IF l_debug_on THEN
2403       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_MULTIPLE_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
2404   END IF;
2405   --
2406   WSH_DELIVERY_DETAILS_ACTIONS.Unassign_Multiple_Details (
2407 						l_del_detail_rec,
2408 						p_del_unassign,
2409 						p_cont_unassign,
2410 						x_return_status,
2411 						null,
2412                     p_action_prms);
2413 
2414    --
2415    IF l_debug_on THEN
2416      WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2417    END IF;
2418    --
2419   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2420      IF x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
2421         l_num_warnings := l_num_warnings + 1;
2422      ELSE
2423 --	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_UNASSG_ERROR');
2424 --	WSH_UTIL_CORE.Add_Message(x_return_status);
2425 	--
2426 	IF l_debug_on THEN
2427 	    WSH_DEBUG_SV.pop(l_module_name);
2428 	END IF;
2429 	--
2430 	return;
2431      END IF;
2432   END IF;
2433 
2434   -- fetch the container for each line and update the attr columns if it is
2435   -- the last line in the container hierarchy..
2436 
2437   FOR i IN 1..l_del_detail_rec.count LOOP
2438 
2439     IF l_cont_tab(i) IS NULL THEN
2440       -- not assigned to a container.
2441       GOTO next_line;
2442     END IF;
2443 
2444     -- K LPN CONV. rv
2445     l_wms_org := wsh_util_validate.check_wms_org(l_cont_org_tab(i));
2446     -- K LPN CONV. rv
2447 
2448     IF l_debug_on THEN
2449       WSH_DEBUG_SV.log(l_module_name,'l_wms_org',l_wms_org);
2450     END IF;
2451 	--dbms_output.put_line('calling last assigned line for ' || l_del_detail_rec(i));
2452 
2453 	--
2454 	IF l_debug_on THEN
2455 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.LAST_ASSIGNED_LINE',WSH_DEBUG_SV.C_PROC_LEVEL);
2456 	END IF;
2457 	--
2458 	wsh_container_actions.Last_Assigned_Line (
2459 					l_del_detail_rec(i),
2460 					l_cont_tab(i),
2461 					l_last_line_flag,
2462 					x_return_status);
2463 
2464         --
2465         IF l_debug_on THEN
2466           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2467         END IF;
2468         --
2469 	IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
2470                                WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
2471           ) THEN
2472 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_LAST_LINE_ERROR');
2473 		--
2474 		IF l_debug_on THEN
2475 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2476 		END IF;
2477 		--
2478 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i));
2479 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2480 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2481 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2482 			l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2483 		END IF;
2484 		GOTO next_line;
2485 	END IF;
2486 
2487 	--dbms_output.put_line('calling check cont attr with ' || l_cont_tab(i));
2488 
2489 	--
2490 	IF l_debug_on THEN
2491 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
2492 	END IF;
2493 	--
2494 	wsh_container_actions.Check_Cont_Attributes (
2495 					l_cont_tab(i),
2496 					l_attr_flag,
2497 					x_return_status);
2498         --
2499         IF l_debug_on THEN
2500           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2501         END IF;
2502         --
2503 
2504 	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2505 	--dbms_output.put_line('after check cont attr status is ' || x_return_status);
2506 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
2507 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2508 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2509 			l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2510 		END IF;
2511 		GOTO next_line;
2512 	END IF;
2513 
2514 --dbms_output.put_line(' last line flag is ' || l_last_line_flag || ' attr flag ' || l_attr_flag || ' and delivery_id ' || l_delivery_id || ' before updating cont ' || l_cont_tab(i));
2515 
2516 
2517 	IF (nvl(l_last_line_flag,'N') = 'Y') AND (nvl(l_attr_flag,'N') = 'Y') AND (nvl(l_delivery_id,-99) = -99) THEN
2518 
2519 --dbms_output.put_line('updating attr to null for ' || l_cont_tab(i));
2520 
2521 
2522                 --
2523                 -- K LPN CONV. rv
2524                 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
2525                 AND l_cont_line_dir_tab(i) IN ('O','IO')
2526                 AND
2527                 (
2528                   (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
2529                   OR
2530                   (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
2531                 )
2532                 THEN
2533                 --{
2534                     l_sync_tmp_rec.delivery_detail_id := l_cont_tab(i);
2535                     l_sync_tmp_rec.operation_type := 'UPDATE';
2536                     WSH_WMS_SYNC_TMP_PKG.MERGE
2537                     (
2538                       p_sync_tmp_rec      => l_sync_tmp_rec,
2539                       x_return_status     => l_return_status
2540                     );
2541 
2542                     IF l_debug_on THEN
2543                       WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
2544                     END IF;
2545                     --
2546                     --
2547                     IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
2548                       --
2549                       GOTO next_line;
2550                       --
2551                     ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
2552                       --
2553                       l_num_warnings := l_num_warnings + 1;
2554                       --
2555                     END IF;
2556                     --
2557                 --}
2558                 END IF;
2559                 -- K LPN CONV. rv
2560 
2561 		UPDATE WSH_DELIVERY_DETAILS
2562 		SET 	customer_id = NULL,
2563 			ship_to_location_id = NULL,
2564 			intmed_ship_to_location_id = NULL,
2565 			fob_code = NULL,
2566 		  	freight_terms_code = NULL,
2567 			ship_method_code = NULL,
2568 			carrier_id = NULL,
2569 			mode_of_transport = NULL,
2570 			service_level = NULL,
2571 			deliver_to_location_id = NULL,
2572                         line_direction = DECODE(line_direction,'IO','O',line_direction),    -- J-IB-NPARIKH
2573                         client_id = NULL  -- LSP PROJECT :
2574 		WHERE delivery_detail_id = l_cont_tab(i);
2575 
2576 		IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2577 			FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
2578 			WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
2579 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2580 				l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2581 			END IF;
2582 			GOTO next_line;
2583 		END IF;
2584 
2585 		--
2586 		IF l_debug_on THEN
2587 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
2588 		END IF;
2589 		--
2590 		wsh_container_actions.Update_Cont_Hierarchy (
2591 						l_cont_tab(i),
2592 						NULL,
2593 						l_cont_tab(i),
2594 						x_return_status);
2595                 --
2596                 IF l_debug_on THEN
2597                   WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2598                 END IF;
2599                 --
2600 
2601 	    	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2602 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
2603 			--
2604 			IF l_debug_on THEN
2605 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2606 			END IF;
2607 			--
2608 			l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i));
2609 			FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2610 			WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2611 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2612 				l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2613 			END IF;
2614 			GOTO next_line;
2615 		END IF;
2616 
2617 	END IF;
2618 
2619 	OPEN Is_Container (l_del_detail_rec(i));
2620 
2621 	FETCH Is_Container INTO
2622 		l_cont_flag,
2623 		l_serial_number,
2624 		l_master_serial_number,
2625 		l_cont_item_id;
2626 
2627 	IF Is_Container%NOTFOUND THEN
2628 		CLOSE Is_Container;
2629 		FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
2630 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_rec(i));
2631 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
2632 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2633 			l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2634 		END IF;
2635 		GOTO next_line;
2636 	END IF;
2637 
2638 	IF Is_Container%ISOPEN THEN
2639 		CLOSE Is_Container;
2640 	END IF;
2641 
2642          IF l_cont_flag = 'N' THEN --{
2643            --
2644            IF l_debug_on THEN
2645               WSH_DEBUG_SV.log(l_module_name,'l_cont_flag',l_cont_flag);
2646               WSH_DEBUG_SV.log(l_module_name,'delivery_detail_id',l_del_detail_rec(i));
2647            END IF;
2648            --
2649            UPDATE wsh_delivery_details --bug 5165197
2650            SET master_serial_number = NULL
2651            WHERE delivery_detail_id = l_del_detail_rec(i);
2652            --
2653          ELSIF l_cont_flag = 'Y' THEN --}{
2654 
2655 	  	--
2656 	  	IF l_debug_on THEN
2657 	  	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
2658 	  	END IF;
2659 	  	--
2660 	  	WSH_CONTAINER_UTILITIES.Get_Delivery_Status (
2661 					l_del_detail_rec(i),
2662 					l_delivery_id,
2663 					l_del_status,
2664 					x_return_status);
2665                 --
2666                 IF l_debug_on THEN
2667                   WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2668                 END IF;
2669                 --
2670 
2671   		IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2672 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2673 				l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2674 			END IF;
2675 			GOTO next_line;
2676   		END IF;
2677 
2678   		IF (nvl(l_delivery_id,-99) <> -99) THEN --{
2679 
2680 			IF (nvl(l_del_status,'N/A') <> 'OP') THEN
2681 				FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
2682 				x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2683 				WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2684 				IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2685 					l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2686 				END IF;
2687 				x_pack_status := 'Error';
2688 				GOTO next_line;
2689 			END IF;
2690   		END IF; --}
2691 
2692             -- Bug 8925387 .. Removed the goto next_line statement,since master serial number has to be updated irrespect of delivery exist or not.
2693             -- Last_Assigned_Line and Check_Cont_Attributes will be called only if the container belongs to a delivery.
2694             IF (nvl(l_delivery_id,-99) = -99) THEN  --{ Delivery Check
2695                  --
2696                  IF l_debug_on THEN
2697                       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.LAST_ASSIGNED_LINE',WSH_DEBUG_SV.C_PROC_LEVEL);
2698                  END IF;
2699                  --
2700                  wsh_container_actions.Last_Assigned_Line (
2701                                                             NULL,
2702                                                             l_del_detail_rec(i),
2703                                                             l_last_line_flag,
2704                                                             x_return_status);
2705                  --
2706                  IF l_debug_on THEN
2707                       WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2708                  END IF;
2709                  --
2710 
2711                  IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN --{
2712                       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_LAST_LINE_ERROR');
2713                       --
2714                       IF l_debug_on THEN
2715                            WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2716                       END IF;
2717                       --
2718                       l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2719                       FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2720                       WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2721 
2722                       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2723                            l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2724                       END IF;
2725                       GOTO next_line;
2726                  END IF;	--}
2727 
2728                  --dbms_output.put_line('calling check cont attr with ' || l_del_detail_rec(i));
2729 
2730                  --
2731                  IF l_debug_on THEN
2732                       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
2733                  END IF;
2734                  --
2735                  wsh_container_actions.Check_Cont_Attributes (
2736                                                              l_del_detail_rec(i),
2737                                                              l_attr_flag,
2738                                                              x_return_status);
2739                  --
2740                  IF l_debug_on THEN
2741                       WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2742                  END IF;
2743                  --
2744 
2745                  IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN --{
2746                       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
2747                       WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2748 
2749                       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2750                            l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2751                       END IF;
2752                       GOTO next_line;
2753                  END IF; --}
2754             END IF; --} Delivery Check
2755 
2756 
2757 		IF (nvl(l_last_line_flag,'N') = 'Y') AND (nvl(l_attr_flag,'N') = 'Y') AND (nvl(l_delivery_id,-99) = -99) THEN --{
2758                         --
2759                         -- K LPN CONV. rv
2760                         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
2761                         AND l_cont_line_dir_tab(i) IN ('O','IO')
2762                         AND
2763                         (
2764                           (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
2765                           OR
2766                           (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
2767                         )
2768                         THEN
2769                         --{
2770                             l_sync_tmp_rec.delivery_detail_id := l_del_detail_rec(i);
2771                             l_sync_tmp_rec.operation_type := 'UPDATE';
2772                             WSH_WMS_SYNC_TMP_PKG.MERGE
2773                             (
2774                               p_sync_tmp_rec      => l_sync_tmp_rec,
2775                               x_return_status     => l_return_status
2776                             );
2777 
2778                             IF l_debug_on THEN
2779                               WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
2780                             END IF;
2781                             --
2782                             --
2783                             --
2784                             IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
2785                               --
2786                               GOTO next_line;
2787                               --
2788                             ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
2789                               --
2790                               l_num_warnings := l_num_warnings + 1;
2791                               --
2792                             END IF;
2793                             --
2794                         --}
2795                         END IF;
2796                         -- K LPN CONV. rv
2797 
2798 			UPDATE WSH_DELIVERY_DETAILS
2799 			SET 	customer_id = NULL,
2800 				ship_to_location_id = NULL,
2801 				intmed_ship_to_location_id = NULL,
2802 				fob_code = NULL,
2803 			  	freight_terms_code = NULL,
2804 				ship_method_code = NULL,
2805 				service_level = NULL,
2806 				carrier_id = NULL,
2807 				mode_of_transport = NULL,
2808 				deliver_to_location_id = NULL,
2809                                 line_direction = DECODE(line_direction,'IO','O',line_direction),    -- J-IB-NPARIKH
2810                                 client_id = NULL  -- LSP PROJECT
2811 			WHERE delivery_detail_id = l_del_detail_rec(i);
2812 
2813 			IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2814 				FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
2815 				WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
2816 				IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2817 					l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2818 				END IF;
2819 				GOTO next_line;
2820 			END IF;
2821 
2822 			--
2823 			IF l_debug_on THEN
2824 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
2825 			END IF;
2826 			--
2827 			wsh_container_actions.Update_Cont_Hierarchy (
2828 						l_del_detail_rec(i),
2829 						NULL,
2830 						l_del_detail_rec(i),
2831 						x_return_status);
2832                         --
2833                         IF l_debug_on THEN
2834                           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2835                         END IF;
2836                         --
2837 
2838 		    	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN --{
2839 				FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
2840 				--
2841 				IF l_debug_on THEN
2842 				    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2843 				END IF;
2844 				--
2845 				l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2846 				FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2847 				WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2848 				IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2849 					l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2850 				END IF;
2851 				GOTO next_line;
2852 			END IF;	--}
2853 
2854 		END IF;--}
2855 
2856 		-- update child containers of the current hierarchy that was
2857 		-- unassigned with the serial number of the current top most
2858 		-- container..
2859                 --
2860                 -- K LPN CONV. rv
2861                 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
2862                 AND l_cont_line_dir_tab(i) IN ('O','IO')
2863                 AND
2864                 (
2865                   (WSH_WMS_LPN_GRP.GK_WMS_UPD_MISC and l_wms_org = 'Y')
2866                   OR
2867                   (WSH_WMS_LPN_GRP.GK_INV_UPD_MISC and l_wms_org = 'N')
2868                 )
2869                 THEN
2870                 --{
2871                     l_sync_tmp_rec.delivery_detail_id := l_del_detail_rec(i);
2872                     l_sync_tmp_rec.operation_type := 'UPDATE';
2873                     WSH_WMS_SYNC_TMP_PKG.MERGE
2874                     (
2875                       p_sync_tmp_rec      => l_sync_tmp_rec,
2876                       x_return_status     => l_return_status
2877                     );
2878 
2879                     IF l_debug_on THEN
2880                       WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
2881                     END IF;
2882                     --
2883                     --
2884                     --
2885                     IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
2886                       --
2887                       GOTO next_line;
2888                       --
2889                     ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
2890                       --
2891                       l_num_warnings := l_num_warnings + 1;
2892                       --
2893                     END IF;
2894                     --
2895                 --}
2896                 END IF;
2897                 -- K LPN CONV. rv
2898 
2899 		UPDATE WSH_DELIVERY_DETAILS
2900 		SET master_serial_number = serial_number
2901 		WHERE delivery_detail_id = l_del_detail_rec(i);
2902 
2903 		IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2904 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CHILD_UPD_ERROR');
2905 			--
2906 			IF l_debug_on THEN
2907 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2908 			END IF;
2909 			--
2910 			l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2911 			FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2912 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2913 				l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2914 			END IF;
2915 			GOTO next_line;
2916 		END IF;
2917 
2918 		--
2919 		IF l_debug_on THEN
2920 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_SERIAL_NUMBER',WSH_DEBUG_SV.C_PROC_LEVEL);
2921 		END IF;
2922 		--
2923 		WSH_CONTAINER_UTILITIES.Get_Master_Serial_Number (
2924 					l_del_detail_rec(i),
2925 					l_master_serial_number,
2926 					x_return_status);
2927                  --
2928                  IF l_debug_on THEN
2929                    WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2930                  END IF;
2931                  --
2932 
2933 		IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2934 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GET_SRL_ERROR');
2935 			--
2936 			IF l_debug_on THEN
2937 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2938 			END IF;
2939 			--
2940 			l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2941 			FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2942 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2943 				l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2944 			END IF;
2945 			GOTO next_line;
2946 		END IF;
2947 
2948 		--
2949 		IF l_debug_on THEN
2950 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
2951 		END IF;
2952 		--
2953 		WSH_CONTAINER_UTILITIES.Update_Child_Containers (
2954 					l_del_detail_rec(i),
2955 					l_master_cont_name,
2956 					l_master_serial_number,
2957 					x_return_status);
2958                  --
2959                  IF l_debug_on THEN
2960                    WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2961                  END IF;
2962                  --
2963 
2964 	    	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2965 			--
2966 			IF l_debug_on THEN
2967 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2968 			END IF;
2969 			--
2970 			l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2971      			FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
2972 			FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2973 			x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2974 			WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2975 			--
2976 			IF l_debug_on THEN
2977 			    WSH_DEBUG_SV.pop(l_module_name);
2978 			END IF;
2979 			--
2980 			return;
2981     		END IF;
2982 
2983 	END IF; --}
2984 
2985   	<<next_line>>
2986 		null;
2987 
2988   END LOOP;
2989 
2990 -- J: W/V Changes
2991         IF (p_container_instance_id is not null and l_cont_item_id IS NOT NULL) THEN
2992 
2993             -- LPN CONV. rv
2994             open  l_get_cnt_org_csr(p_container_instance_id);
2995             fetch l_get_cnt_org_csr into l_cnt_org_id;
2996 
2997             l_wms_org := 'N';
2998 
2999             IF l_cnt_org_id is NOT NULL THEN
3000               l_wms_org := wsh_util_validate.check_wms_org(l_cnt_org_id);
3001             END IF;
3002             close l_get_cnt_org_csr;
3003 
3004             -- LPN CONV. rv
3005             IF NOT(
3006                    l_wms_org = 'Y' AND nvl(wsh_wms_lpn_grp.g_caller,'WSH') like 'WMS%'
3007                   )
3008             THEN
3009             --{
3010                 WSH_WV_UTILS.Check_Fill_Pc (
3011                   p_container_instance_id => p_container_instance_id,
3012                   x_fill_status           => l_fill_status,
3013                   x_return_status         => l_return_status);
3014 
3015                 IF l_fill_status = 'O' THEN
3016 
3017                     IF l_debug_on THEN
3018                         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3019                     END IF;
3020                     --
3021                     l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
3022                     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_OVERPACKED');
3023                     FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3024                     l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
3025                     WSH_UTIL_CORE.Add_Message(l_return_status);
3026                     x_pack_status := 'Overpacked';
3027 
3028                  ELSIF l_fill_status = 'U' THEN
3029                     IF l_debug_on THEN
3030                         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3031                     END IF;
3032                     --
3033                     l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
3034                     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UNDERPACKED');
3035                     FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3036                     l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
3037                     WSH_UTIL_CORE.Add_Message(l_return_status);
3038                     x_pack_status := 'Underpacked';
3039                   ELSE
3040                     x_pack_status := 'Success';
3041                   END IF;
3042             --}
3043             END IF;
3044         END IF;
3045 
3046 		--BUG#12904248
3047 		FOR i IN 1..l_cont_tab.count LOOP
3048 		    IF l_debug_on THEN
3049                WSH_DEBUG_SV.log(l_module_name,'l_cont_tab.count',l_cont_tab(i));
3050             END IF;
3051 
3052      		Get_Deliver_To_Location(
3053 		    p_container_id => l_cont_tab(i),
3054 	    	x_deliver_to_location_id => l_deliver_to_location_id,
3055 	    	x_return_status => l_return_status);
3056 
3057                 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3058 
3059 			UPDATE wsh_delivery_details
3060 	        SET    deliver_to_location_id = l_deliver_to_location_id
3061 	        WHERE  delivery_detail_id = l_cont_tab(i);
3062                 END IF;
3063 
3064 		END LOOP;
3065 
3066         IF l_num_warnings > 0 THEN
3067            x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
3068         ELSE
3069            x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3070         END IF;
3071 
3072 	--
3073 	IF l_debug_on THEN
3074            WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3075 	    WSH_DEBUG_SV.pop(l_module_name);
3076 	END IF;
3077 	--
3078 EXCEPTION
3079 
3080   WHEN Others THEN
3081 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Unassign_Detail',l_module_name);
3082 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3083 
3084 --
3085 IF l_debug_on THEN
3086     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
3087     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3088 END IF;
3089 --
3090 END Unassign_Detail;
3091 
3092 -------------------------------------------------------------------
3093 -- This procedure is only for backward compatibility. No one should call
3094 -- this procedure.
3095 -------------------------------------------------------------------
3096 
3097 PROCEDURE Unassign_Detail(
3098   p_container_instance_id IN NUMBER,
3099   p_delivery_id IN NUMBER,
3100   p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
3101   p_cont_unassign IN VARCHAR2,
3102   p_del_unassign IN VARCHAR2,
3103   x_pack_status OUT NOCOPY  VARCHAR2,
3104   x_return_status OUT NOCOPY  VARCHAR2) IS
3105 
3106 
3107 --
3108 l_debug_on BOOLEAN;
3109 --
3110 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UNASSIGN_DETAIL';
3111 --
3112   l_action_prms   wsh_glbl_var_strct_grp.dd_action_parameters_rec_type;
3113 BEGIN
3114 
3115   --
3116   --
3117   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3118   --
3119   IF l_debug_on IS NULL
3120   THEN
3121       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3122   END IF;
3123   --
3124   IF l_debug_on THEN
3125       WSH_DEBUG_SV.push(l_module_name);
3126       --
3127       WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3128       WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3129       WSH_DEBUG_SV.log(l_module_name,'P_CONT_UNASSIGN',P_CONT_UNASSIGN);
3130       WSH_DEBUG_SV.log(l_module_name,'P_DEL_UNASSIGN',P_DEL_UNASSIGN);
3131   END IF;
3132   --
3133   --
3134   IF l_debug_on THEN
3135       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.Unassign_Detail',WSH_DEBUG_SV.C_PROC_LEVEL);
3136   END IF;
3137   --
3138   Unassign_Detail
3139     (
3140         p_container_instance_id,
3141         p_delivery_id,
3142         p_del_detail_tab,
3143         p_cont_unassign,
3144         p_del_unassign,
3145         x_pack_status,
3146         x_return_status,
3147         l_action_prms
3148      );
3149     --
3150     IF l_debug_on THEN
3151         WSH_DEBUG_SV.pop(l_module_name);
3152     END IF;
3153     --
3154 EXCEPTION
3155 
3156   WHEN Others THEN
3157     WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Unassign_Detail',l_module_name);
3158     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3159     --
3160     IF l_debug_on THEN
3161         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3162     END IF;
3163     --
3164 END Unassign_Detail;
3165 /*
3166 -----------------------------------------------------------------------------
3167    PROCEDURE  : Assign_To_Delivery
3168    PARAMETERS : p_container_instance_id - container instance id of container
3169 		p_delivery_id - delivery id
3170 		x_return_status - return status of API
3171 --           x_dlvy_has_lines : 'Y' :delivery has non-container lines.
3172 --                              'N' : delivery does not have non-container lines
3173 --           x_dlvy_freight_Terms_code : Delivery's freight term code
3174   DESCRIPTION : This procedure checks to see if a container can be assigned to
3175 		the specified delivery and returns a success or failure.
3176 ------------------------------------------------------------------------------
3177 */
3178 
3179 
3180 PROCEDURE Assign_To_Delivery(
3181   p_container_instance_id IN NUMBER,
3182   p_delivery_id IN NUMBER,
3183   x_return_status OUT NOCOPY  VARCHAR2,
3184  x_dlvy_has_lines          IN OUT NOCOPY VARCHAR2,    -- J-IB-NPARIKH
3185  x_dlvy_freight_terms_code IN OUT NOCOPY VARCHAR2     -- J-IB-NPARIKH
3186   ) IS
3187 
3188 -- remove this cursor for Bug
3189   CURSOR Get_First_Line (v_cont_instance_id NUMBER) IS
3190   SELECT delivery_detail_id
3191   FROM wsh_delivery_assignments_v
3192   WHERE parent_delivery_detail_id = v_cont_instance_id
3193   AND rownum < 2;
3194 -- remove this cursor for Bug
3195 
3196   CURSOR Get_Cont_Org (v_cont_instance_id NUMBER) IS
3197   SELECT organization_id
3198   FROM WSH_DELIVERY_DETAILS
3199   WHERE delivery_detail_id = v_cont_instance_id
3200   AND container_flag = 'Y';
3201 
3202   CURSOR Get_Del_Org (v_del_id NUMBER) IS
3203   SELECT organization_id, freight_terms_code
3204   FROM WSH_NEW_DELIVERIES
3205   WHERE delivery_id = v_del_id;
3206 
3207   l_del_detail_id	WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
3208 
3209   l_cont_org 	NUMBER;
3210   l_del_org	NUMBER;
3211 
3212   l_cont_name VARCHAR2(30);
3213   l_del_name VARCHAR2(30);
3214   --
3215   --
3216   l_has_lines               VARCHAR2(1);
3217   l_dlvy_freight_terms_code VARCHAR2(30);
3218   --
3219   --
3220 l_debug_on BOOLEAN;
3221   --
3222   l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'ASSIGN_TO_DELIVERY';
3223   --
3224 BEGIN
3225 
3226   --
3227   --
3228   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3229   --
3230   IF l_debug_on IS NULL
3231   THEN
3232       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3233   END IF;
3234   --
3235   IF l_debug_on THEN
3236       WSH_DEBUG_SV.push(l_module_name);
3237       --
3238       WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3239       WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3240   END IF;
3241   --
3242   OPEN Get_Cont_Org (p_container_instance_id);
3243 
3244   FETCH Get_Cont_Org INTO l_cont_org;
3245 
3246   IF Get_Cont_Org%NOTFOUND THEN
3247      CLOSE Get_Cont_Org;
3248      --
3249      IF l_debug_on THEN
3250          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3251      END IF;
3252      --
3253      l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
3254      FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
3255      FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3256      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3257      WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3258      --
3259      IF l_debug_on THEN
3260          WSH_DEBUG_SV.pop(l_module_name);
3261      END IF;
3262      --
3263      return;
3264   END IF;
3265 
3266   CLOSE Get_Cont_Org;
3267 
3268 
3269   OPEN Get_Del_Org (p_delivery_id);
3270 
3271   FETCH Get_Del_Org INTO l_del_org, l_dlvy_freight_terms_code;
3272 
3273   IF Get_Del_Org%NOTFOUND THEN
3274      CLOSE Get_Del_Org;
3275      --
3276      IF l_debug_on THEN
3277          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.GET_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3278      END IF;
3279      --
3280      l_del_name := WSH_NEW_DELIVERIES_PVT.Get_Name(p_delivery_id);
3281      FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DEL');
3282      FND_MESSAGE.SET_TOKEN('DEL_NAME',l_del_name);
3283      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3284      WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3285      --
3286      IF l_debug_on THEN
3287          WSH_DEBUG_SV.pop(l_module_name);
3288      END IF;
3289      --
3290      return;
3291   END IF;
3292 
3293   CLOSE Get_Del_Org;
3294 
3295 
3296   -- just check for organization id match and create assignment
3297   IF l_cont_org = l_del_org THEN
3298 
3299 	--
3300 	IF l_debug_on THEN
3301 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CREATE_DELIVERY_ASSIGNMENT',WSH_DEBUG_SV.C_PROC_LEVEL);
3302 	END IF;
3303 	--
3304 	wsh_container_actions.Create_Delivery_Assignment(
3305 		p_container_instance_id,
3306 		p_delivery_id,
3307 		x_return_status,
3308 		x_dlvy_has_lines,
3309 		x_dlvy_freight_terms_code
3310 		);
3311 
3312        --
3313         IF l_debug_on THEN
3314           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3315         END IF;
3316         --
3317 
3318 	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3319 	   --
3320 	   IF l_debug_on THEN
3321 	       WSH_DEBUG_SV.pop(l_module_name);
3322 	   END IF;
3323 	   --
3324 	   return;
3325   	END IF;
3326     ELSE
3327      	--
3328      	IF l_debug_on THEN
3329      	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3330      	END IF;
3331      	--
3332      	l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
3333         --
3334         IF l_debug_on THEN
3335             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.GET_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3336         END IF;
3337         --
3338         l_del_name := WSH_NEW_DELIVERIES_PVT.Get_Name(p_delivery_id);
3339 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_ORG_DIFF');
3340 	FND_MESSAGE.SET_TOKEN('ENTITY1',l_cont_name);
3341 	FND_MESSAGE.SET_TOKEN('ENTITY2',l_del_name);
3342 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3343    	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3344 	--
3345 	IF l_debug_on THEN
3346 	    WSH_DEBUG_SV.pop(l_module_name);
3347 	END IF;
3348 	--
3349 	return;
3350     END IF;
3351 
3352 
3353   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3354 
3355 	--
3356 	IF l_debug_on THEN
3357 	    WSH_DEBUG_SV.pop(l_module_name);
3358 	END IF;
3359 	--
3360 EXCEPTION
3361 
3362   WHEN Others THEN
3363 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Assign_To_Delivery',l_module_name);
3364 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3365 
3366 --
3367 IF l_debug_on THEN
3368     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
3369     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3370 END IF;
3371 --
3372 END Assign_To_Delivery;
3373 
3374 -------------------------------------------------------------------
3375 -- This procedure is only for backward compatibility. No one should call
3376 -- this procedure.
3377 -------------------------------------------------------------------
3378 
3379 PROCEDURE Assign_To_Delivery(
3380  p_container_instance_id IN NUMBER,
3381  p_delivery_id IN NUMBER,
3382  x_return_status OUT NOCOPY  VARCHAR2
3383     ) IS
3384 
3385 --
3386 l_debug_on BOOLEAN;
3387 --
3388 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'Assign_To_Delivery';
3389 --
3390 l_has_lines               VARCHAR2(1);
3391 l_dlvy_freight_terms_code VARCHAR2(30);
3392 --
3393 BEGIN
3394     --
3395     --
3396     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3397     --
3398     IF l_debug_on IS NULL
3399     THEN
3400         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3401     END IF;
3402     --
3403     IF l_debug_on THEN
3404         WSH_DEBUG_SV.push(l_module_name);
3405          --
3406          WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3407          WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3408     END IF;
3409     --
3410     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3411     --
3412     l_has_lines := WSH_DELIVERY_VALIDATIONS.has_lines
3413                         (
3414                             p_delivery_id => p_delivery_id
3415                         );
3416     --
3417     Assign_To_Delivery
3418         (
3419             P_CONTAINER_INSTANCE_ID               => P_CONTAINER_INSTANCE_ID,
3420             p_delivery_id             => p_delivery_id,
3421             x_dlvy_has_lines               => l_has_lines,
3422             x_dlvy_freight_Terms_code => l_dlvy_freight_Terms_code,
3423 	    x_return_status => x_return_status
3424         );
3425     --
3426     IF l_debug_on THEN
3427         WSH_DEBUG_SV.pop(l_module_name);
3428     END IF;
3429     --
3430 EXCEPTION
3431     WHEN others THEN
3432         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3433         wsh_util_core.default_handler('WSH_CONTAINER_ACTIONS.Assign_To_Delivery',l_module_name);
3434         --
3435         IF l_debug_on THEN
3436             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3437         END IF;
3438 END Assign_To_Delivery;
3439 
3440 
3441 /*
3442 -----------------------------------------------------------------------------
3443    PROCEDURE  : Create_Delivery_Assignment
3444    PARAMETERS : p_container_instance_id - container instance id of container
3445 		p_delivery_id - delivery id
3446 		x_return_status - return status of API.
3447 --           x_dlvy_has_lines : 'Y' :delivery has non-container lines.
3448 --                              'N' : delivery does not have non-container lines
3449 --           x_dlvy_freight_Terms_code : Delivery's freight term code
3450   DESCRIPTION : This procedure assigns a container to the specified delivery.
3451 ------------------------------------------------------------------------------
3452 */
3453 
3454 
3455 PROCEDURE Create_Delivery_Assignment (
3456  p_container_instance_id IN NUMBER,
3457  p_delivery_id IN NUMBER,
3458  x_return_status OUT NOCOPY  VARCHAR2,
3459  x_dlvy_has_lines          IN OUT NOCOPY VARCHAR2,    -- J-IB-NPARIKH
3460  x_dlvy_freight_terms_code IN OUT NOCOPY VARCHAR2     -- J-IB-NPARIKH
3461  ) IS
3462 
3463 --
3464 l_debug_on BOOLEAN;
3465 --
3466 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CREATE_DELIVERY_ASSIGNMENT';
3467 --
3468 BEGIN
3469 
3470 /* instead of this entire stuff just call assign_detail_to_delivery in whcih call to check container attributes, all validations can be done*/
3471 
3472  --
3473  --
3474  l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3475  --
3476  IF l_debug_on IS NULL
3477  THEN
3478      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3479  END IF;
3480  --
3481  IF l_debug_on THEN
3482      WSH_DEBUG_SV.push(l_module_name);
3483      --
3484      WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3485      WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3486  END IF;
3487  --
3488  --
3489  IF l_debug_on THEN
3490      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_DETAIL_TO_DELIVERY',WSH_DEBUG_SV.C_PROC_LEVEL);
3491  END IF;
3492  --
3493  WSH_DELIVERY_DETAILS_ACTIONS.Assign_Detail_to_Delivery(
3494    P_DETAIL_ID =>p_container_instance_id ,
3495    P_DELIVERY_ID => p_delivery_id,
3496    X_RETURN_STATUS =>x_return_status,
3497    x_dlvy_has_lines               => x_dlvy_has_lines,
3498    x_dlvy_freight_Terms_code => x_dlvy_freight_Terms_code
3499  );
3500 
3501    IF l_debug_on THEN
3502      WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3503    END IF;
3504  IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3505 	--set proper error message
3506 	--
3507 	IF l_debug_on THEN
3508 	    WSH_DEBUG_SV.pop(l_module_name);
3509 	END IF;
3510 	--
3511 	return;
3512  END IF;
3513  x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3514 
3515 	--
3516 	IF l_debug_on THEN
3517 	    WSH_DEBUG_SV.pop(l_module_name);
3518 	END IF;
3519 	--
3520 EXCEPTION
3521   WHEN Others THEN
3522 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Create_Delivery_Assignment',l_module_name);
3523 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3524 	--
3525 	IF l_debug_on THEN
3526 	    WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
3527 	    WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3528 	END IF;
3529 	--
3530 END Create_Delivery_Assignment;
3531 
3532 -------------------------------------------------------------------
3533 -- This procedure is only for backward compatibility. No one should call
3534 -- this procedure.
3535 -------------------------------------------------------------------
3536 
3537 PROCEDURE Create_Delivery_Assignment(
3538  p_container_instance_id IN NUMBER,
3539  p_delivery_id IN NUMBER,
3540  x_return_status OUT NOCOPY  VARCHAR2
3541     ) IS
3542 
3543 --
3544 l_debug_on BOOLEAN;
3545 --
3546 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'Create_Delivery_Assignment';
3547 --
3548 l_has_lines               VARCHAR2(1);
3549 l_dlvy_freight_terms_code VARCHAR2(30);
3550 --
3551 BEGIN
3552     --
3553     --
3554     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3555     --
3556     IF l_debug_on IS NULL
3557     THEN
3558         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3559     END IF;
3560     --
3561     IF l_debug_on THEN
3562         WSH_DEBUG_SV.push(l_module_name);
3563          --
3564          WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3565          WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3566     END IF;
3567     --
3568     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3569     --
3570     l_has_lines := WSH_DELIVERY_VALIDATIONS.has_lines
3571                         (
3572                             p_delivery_id => p_delivery_id
3573                         );
3574     --
3575     Create_Delivery_Assignment
3576         (
3577             P_CONTAINER_INSTANCE_ID               => P_CONTAINER_INSTANCE_ID,
3578             p_delivery_id             => p_delivery_id,
3579             X_RETURN_STATUS           => X_RETURN_STATUS,
3580             x_dlvy_has_lines               => l_has_lines,
3581             x_dlvy_freight_Terms_code => l_dlvy_freight_Terms_code
3582         );
3583     --
3584     IF l_debug_on THEN
3585         WSH_DEBUG_SV.pop(l_module_name);
3586     END IF;
3587     --
3588 EXCEPTION
3589     WHEN others THEN
3590         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3591         wsh_util_core.default_handler('WSH_CONTAINER_ACTIONS.Create_Delivery_Assignment',l_module_name);
3592         --
3593         IF l_debug_on THEN
3594             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3595         END IF;
3596 END Create_Delivery_Assignment;
3597 
3598 
3599 -- THIS IS OBSOLETED
3600 /*
3601 -----------------------------------------------------------------------------
3602    PROCEDURE  : Unassign_Delivery
3603    PARAMETERS : p_container_instance_id - container instance id of container
3604 		p_delivery_id - delivery id
3605 		x_return_status - return status of API
3606   DESCRIPTION : This procedure checks unassigns a container from the specified
3607 		delivery and returns a success or failure.
3608 ------------------------------------------------------------------------------
3609 */
3610 --THIS PROCEDURE IS OBSOLETE
3611 PROCEDURE Unassign_Delivery(
3612   p_container_instance_id IN NUMBER,
3613   p_delivery_id IN NUMBER,
3614   x_return_status OUT NOCOPY  VARCHAR2) IS
3615 
3616 BEGIN
3617 
3618   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3619 
3620 END Unassign_Delivery;
3621 
3622 
3623 /*
3624 -----------------------------------------------------------------------------
3625    PROCEDURE  : Assign_To_Container
3626    PARAMETERS : p_det_cont_inst_id - container instance id of child container
3627 		p_par_cont_inst_id - container instance id of parent container
3628 		x_return_status - return status of API
3629   DESCRIPTION : This procedure checks to see if a container can be assigned to
3630 		a specified parent container and returns a success or failure.
3631 ------------------------------------------------------------------------------
3632 */
3633 
3634 
3635 PROCEDURE Assign_To_Container(
3636   p_det_cont_inst_id IN NUMBER,
3637   p_par_cont_inst_id IN NUMBER,
3638   x_return_status OUT NOCOPY  VARCHAR2) IS
3639 
3640 -- remove this cursor
3641   CURSOR Get_First_Line (v_cont_instance_id NUMBER) IS
3642   SELECT delivery_detail_id
3643   FROM wsh_delivery_assignments_v
3644   WHERE parent_delivery_detail_id = v_cont_instance_id
3645   AND rownum < 2;
3646 -- remove this cursor
3647 
3648   CURSOR Get_Cont_Org (v_cont_instance_id NUMBER) IS
3649   SELECT organization_id
3650   FROM WSH_DELIVERY_DETAILS
3651   WHERE delivery_detail_id = v_cont_instance_id
3652   AND container_flag in ('Y', 'C');
3653 
3654   l_det_detail_id	WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
3655   l_par_detail_id	WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
3656 
3657   l_det_cont_org 	NUMBER;
3658   l_par_cont_org	NUMBER;
3659 
3660   l_temp_detail_tab WSH_UTIL_CORE.id_tab_type;
3661 
3662   cnt 			NUMBER;
3663   l_del_rows		WSH_UTIL_CORE.id_tab_type;
3664   l_group_id_tab	WSH_UTIL_CORE.id_tab_type;
3665   l_ret_sts 		VARCHAR2(1);
3666 
3667   l_cont_name VARCHAR2(30);
3668 
3669   l_master_serial_number VARCHAR2(30);
3670   l_master_cont_id	NUMBER;
3671   l_master_cont_name    VARCHAR2(30);
3672 
3673   l_det_attr_flag VARCHAR2(1);
3674   l_par_attr_flag VARCHAR2(1);
3675 
3676   l_det_del_id NUMBER;
3677   l_par_del_id NUMBER;
3678   l_del_status VARCHAR2(10);
3679 
3680   l_attr_tab  wsh_delivery_autocreate.grp_attr_tab_type;
3681   l_group_tab  wsh_delivery_autocreate.grp_attr_tab_type;
3682   l_action_rec wsh_delivery_autocreate.action_rec_type;
3683   l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
3684   l_matched_entities wsh_util_core.id_tab_type;
3685   l_out_rec wsh_delivery_autocreate.out_rec_type;
3686 
3687 --BUG#12904248
3688   l_deliver_to_location_id NUMBER;
3689   l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3690 
3691 --
3692 l_debug_on BOOLEAN;
3693 --
3694 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'ASSIGN_TO_CONTAINER';
3695 --
3696 BEGIN
3697 
3698 
3699   --
3700   --
3701   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3702   --
3703   IF l_debug_on IS NULL
3704   THEN
3705       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3706   END IF;
3707   --
3708   IF l_debug_on THEN
3709       WSH_DEBUG_SV.push(l_module_name);
3710       --
3711       WSH_DEBUG_SV.log(l_module_name,'P_DET_CONT_INST_ID',P_DET_CONT_INST_ID);
3712       WSH_DEBUG_SV.log(l_module_name,'P_PAR_CONT_INST_ID',P_PAR_CONT_INST_ID);
3713   END IF;
3714   --
3715   OPEN Get_Cont_Org (p_det_cont_inst_id);
3716 
3717   FETCH Get_Cont_Org INTO l_det_cont_org;
3718 
3719   IF Get_Cont_Org%NOTFOUND THEN
3720      CLOSE Get_Cont_Org;
3721      --
3722      IF l_debug_on THEN
3723          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3724      END IF;
3725      --
3726      l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
3727      FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
3728      FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3729      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3730      WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3731      --
3732      IF l_debug_on THEN
3733          WSH_DEBUG_SV.pop(l_module_name);
3734      END IF;
3735      --
3736      return;
3737   END IF;
3738 
3739   IF Get_Cont_Org%ISOPEN THEN
3740   	CLOSE Get_Cont_Org;
3741   END IF;
3742 
3743   OPEN Get_Cont_Org (p_par_cont_inst_id);
3744 
3745   FETCH Get_Cont_Org INTO l_par_cont_org;
3746 
3747   IF Get_Cont_Org%NOTFOUND THEN
3748      CLOSE Get_Cont_Org;
3749      --
3750      IF l_debug_on THEN
3751          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3752      END IF;
3753      --
3754      l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3755      FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
3756      FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3757      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3758      WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3759      --
3760      IF l_debug_on THEN
3761          WSH_DEBUG_SV.pop(l_module_name);
3762      END IF;
3763      --
3764      return;
3765   END IF;
3766 
3767   IF Get_Cont_Org%ISOPEN THEN
3768   	CLOSE Get_Cont_Org;
3769   END IF;
3770 
3771   IF l_det_cont_org <> l_par_cont_org THEN
3772 	--
3773 	IF l_debug_on THEN
3774 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3775 	END IF;
3776 	--
3777 	l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
3778 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_ORG_DIFF');
3779 	FND_MESSAGE.SET_TOKEN('ENTITY1',l_cont_name);
3780 	--
3781 	IF l_debug_on THEN
3782 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3783 	END IF;
3784 	--
3785 	l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3786 	FND_MESSAGE.SET_TOKEN('ENTITY2',l_cont_name);
3787 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3788    	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3789 	--
3790 	IF l_debug_on THEN
3791 	    WSH_DEBUG_SV.pop(l_module_name);
3792 	END IF;
3793 	--
3794 	return;
3795   END IF;
3796 
3797   -- get the delivery status of the container and check if it is assigned
3798   -- to a closed or in-transit delivery (only open deliveries allowed)
3799 
3800   --
3801   IF l_debug_on THEN
3802       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
3803   END IF;
3804   --
3805   WSH_CONTAINER_UTILITIES.Get_Delivery_Status ( p_par_cont_inst_id,
3806 						l_par_del_id,
3807 						l_del_status,
3808 						x_return_status);
3809 
3810   IF l_debug_on THEN
3811     WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3812   END IF;
3813   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3814 	--
3815 	IF l_debug_on THEN
3816 	    WSH_DEBUG_SV.pop(l_module_name);
3817 	END IF;
3818 	--
3819 	return;
3820   END IF;
3821 
3822   IF (nvl(l_par_del_id,-99) <> -99) THEN
3823 
3824 	-- TPW - Distributed Organization Changes
3825         IF (nvl(l_del_status,'N/A') NOT IN  ('OP','SA')) THEN
3826 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
3827 		x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3828 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3829 		--
3830 		IF l_debug_on THEN
3831 		    WSH_DEBUG_SV.pop(l_module_name);
3832 		END IF;
3833 		--
3834 		return;
3835 	END IF;
3836   END IF;
3837 
3838   -- get the delivery status of the container and check if it is assigned
3839   -- to a closed or in-transit delivery (only open deliveries allowed)
3840 
3841   --
3842   IF l_debug_on THEN
3843       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
3844   END IF;
3845   --
3846   WSH_CONTAINER_UTILITIES.Get_Delivery_Status ( p_det_cont_inst_id,
3847 						l_det_del_id,
3848 						l_del_status,
3849 						x_return_status);
3850 
3851   IF l_debug_on THEN
3852     WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3853   END IF;
3854   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3855 	--
3856 	IF l_debug_on THEN
3857 	    WSH_DEBUG_SV.pop(l_module_name);
3858 	END IF;
3859 	--
3860 	return;
3861   END IF;
3862 
3863   IF (nvl(l_det_del_id,-99) <> -99) THEN
3864 
3865 	IF (nvl(l_del_status,'N/A') <> 'OP') THEN
3866 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
3867 		x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3868 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3869 		--
3870 		IF l_debug_on THEN
3871 		    WSH_DEBUG_SV.pop(l_module_name);
3872 		END IF;
3873 		--
3874 		return;
3875 	END IF;
3876   END IF;
3877 
3878   IF l_debug_on THEN
3879     WSH_DEBUG_SV.log(l_module_name,'l_det_del_id',l_det_del_id);
3880     WSH_DEBUG_SV.log(l_module_name,'l_par_del_id',l_par_del_id);
3881   END IF;
3882 
3883   IF ((nvl(l_det_del_id,-99) <> -99) AND (nvl(l_par_del_id,-99) <> -99)) THEN
3884 
3885   	IF l_det_del_id <> l_par_del_id THEN
3886 
3887 
3888             -- R12: MDC: For WMS we can assign containers to parent containers on different deliveries.
3889             IF wsh_util_validate.check_wms_org(l_par_cont_org) = 'Y' THEN
3890 
3891 	       IF l_debug_on THEN
3892 	         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Assign_Container_to_Consol',WSH_DEBUG_SV.C_PROC_LEVEL);
3893 	       END IF;
3894                Assign_Container_to_Consol(
3895                  p_child_container_id   => p_det_cont_inst_id,
3896                  p_parent_container_id  => p_par_cont_inst_id,
3897                  p_caller               => 'WMS_PACK_CONSOL',
3898                  x_return_status        => x_return_status);
3899 
3900                IF l_debug_on THEN
3901                   WSH_DEBUG_SV.log(l_module_name,'return status -',x_return_status);
3902                END IF;
3903 
3904 	       return;
3905             ELSE
3906 
3907 
3908 		--
3909 		IF l_debug_on THEN
3910 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3911 		END IF;
3912 		--
3913 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
3914 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_DEL_DIFF');
3915 		FND_MESSAGE.SET_TOKEN('ENTITY1',l_cont_name);
3916 		--
3917 		IF l_debug_on THEN
3918 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3919 		END IF;
3920 		--
3921 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3922 		FND_MESSAGE.SET_TOKEN('ENTITY2',l_cont_name);
3923 		x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3924    		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3925 		--
3926 		IF l_debug_on THEN
3927 		    WSH_DEBUG_SV.pop(l_module_name);
3928 		END IF;
3929 		--
3930 		return;
3931 
3932             END IF;
3933 
3934   	END IF;
3935    END IF;
3936 
3937   --
3938   IF l_debug_on THEN
3939       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_CONT_SERIAL',WSH_DEBUG_SV.C_PROC_LEVEL);
3940   END IF;
3941   --
3942   WSH_CONTAINER_UTILITIES.Get_Master_Cont_Serial (
3943 				p_par_cont_inst_id,
3944 				l_master_cont_id,
3945 				l_master_cont_name,
3946 				l_master_serial_number,
3947 				x_return_status);
3948   IF l_debug_on THEN
3949     WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3950   END IF;
3951 
3952   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3953 	--dbms_output.put_line('error while getting master serial for parent ' || p_par_cont_inst_id);
3954 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GET_MASTER_ERROR');
3955 	--
3956 	IF l_debug_on THEN
3957 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3958 	END IF;
3959 	--
3960 	l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3961 	FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3962 	WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
3963 	IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
3964 	   l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
3965 	END IF;
3966 	l_master_cont_id := NULL;
3967 	l_master_serial_number := NULL;
3968   END IF;
3969 
3970   --
3971   IF l_debug_on THEN
3972       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
3973   END IF;
3974   --
3975   wsh_container_actions.Check_Cont_Attributes (
3976 				p_det_cont_inst_id,
3977 				l_det_attr_flag,
3978 				x_return_status);
3979 
3980   IF l_debug_on THEN
3981     WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3982   END IF;
3983 
3984   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3985 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
3986 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3987 	--
3988 	IF l_debug_on THEN
3989 	    WSH_DEBUG_SV.pop(l_module_name);
3990 	END IF;
3991 	--
3992 	return;
3993   END IF;
3994 
3995 
3996   --
3997   IF l_debug_on THEN
3998       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
3999   END IF;
4000   --
4001   wsh_container_actions.Check_Cont_Attributes (
4002 				p_par_cont_inst_id,
4003 				l_par_attr_flag,
4004 				x_return_status);
4005 
4006   IF l_debug_on THEN
4007     WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4008   END IF;
4009 
4010   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4011 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
4012 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4013 	--
4014 	IF l_debug_on THEN
4015 	    WSH_DEBUG_SV.pop(l_module_name);
4016 	END IF;
4017 	--
4018 	return;
4019   END IF;
4020 
4021   IF l_det_attr_flag = 'N' AND l_par_attr_flag = 'N' THEN
4022 
4023 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4024     	-- just create assignment of child container to parent.
4025 	--
4026 	IF l_debug_on THEN
4027 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
4028 	END IF;
4029 	--
4030 	WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
4031 			p_det_cont_inst_id,
4032 			p_par_cont_inst_id,
4033 			x_return_status);
4034 
4035         IF l_debug_on THEN
4036           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4037         END IF;
4038 
4039     	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4040 		--
4041 		IF l_debug_on THEN
4042 		    WSH_DEBUG_SV.pop(l_module_name);
4043 		END IF;
4044 		--
4045 		return;
4046     	END IF;
4047 
4048 --	l_master_cont_id := WSH_CONTAINER_UTILITIES.Get_Master_Cont_Id (p_det_cont_inst_id);
4049 
4050 
4051 	--
4052 	IF l_debug_on THEN
4053 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
4054 	END IF;
4055 	--
4056 	WSH_CONTAINER_UTILITIES.Update_Child_Containers (
4057 					p_det_cont_inst_id,
4058 					l_master_cont_id,
4059 					l_master_serial_number,
4060 					x_return_status);
4061 
4062         IF l_debug_on THEN
4063           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4064         END IF;
4065 
4066     	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4067 		--
4068 		IF l_debug_on THEN
4069 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4070 		END IF;
4071 		--
4072 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4073      		FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4074 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4075 		x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4076 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4077 		--
4078 		IF l_debug_on THEN
4079 		    WSH_DEBUG_SV.pop(l_module_name);
4080 		END IF;
4081 		--
4082 		return;
4083     	END IF;
4084 
4085    ELSIF l_det_attr_flag = 'N' AND l_par_attr_flag = 'Y' THEN
4086 
4087 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4088 
4089     	-- just create assignment of child container to parent.
4090 	--
4091 	IF l_debug_on THEN
4092 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
4093 	END IF;
4094 	--
4095 	WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
4096 			p_det_cont_inst_id,
4097 			p_par_cont_inst_id,
4098 			x_return_status);
4099 
4100         IF l_debug_on THEN
4101           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4102         END IF;
4103     	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4104 		--
4105 		IF l_debug_on THEN
4106 		    WSH_DEBUG_SV.pop(l_module_name);
4107 		END IF;
4108 		--
4109 		return;
4110     	END IF;
4111 
4112         --
4113         -- Debug Statements
4114         --
4115         IF l_debug_on THEN
4116             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
4117         END IF;
4118         --
4119         wsh_container_actions.Update_Cont_Hierarchy (
4120 					p_par_cont_inst_id,
4121 					l_det_del_id,
4122 					p_det_cont_inst_id,
4123 					x_return_status );
4124         IF l_debug_on THEN
4125           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4126         END IF;
4127 
4128 	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4129 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GRP_ATTR_WARN');
4130 		--
4131 		IF l_debug_on THEN
4132 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4133 		END IF;
4134 		--
4135 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4136 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4137 		l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
4138 		WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
4139 	END IF;
4140 
4141 	--
4142 	IF l_debug_on THEN
4143 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
4144 	END IF;
4145 	--
4146 	WSH_CONTAINER_UTILITIES.Update_Child_Containers (
4147 					p_det_cont_inst_id,
4148 					l_master_cont_id,
4149 					l_master_serial_number,
4150 					x_return_status);
4151         IF l_debug_on THEN
4152           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4153         END IF;
4154 
4155     	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4156 		--
4157 		IF l_debug_on THEN
4158 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4159 		END IF;
4160 		--
4161 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4162      		FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4163 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4164 		x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4165 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4166 		--
4167 		IF l_debug_on THEN
4168 		    WSH_DEBUG_SV.pop(l_module_name);
4169 		END IF;
4170 		--
4171 		return;
4172     	END IF;
4173 
4174    ELSIF l_det_attr_flag = 'Y' and l_par_attr_flag = 'N' THEN
4175 
4176 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4177 
4178     	-- just create assignment of child container to parent.
4179 	--
4180 	IF l_debug_on THEN
4181 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
4182 	END IF;
4183 	--
4184 	WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
4185 			p_det_cont_inst_id,
4186 			p_par_cont_inst_id,
4187 			x_return_status);
4188 
4189         IF l_debug_on THEN
4190           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4191         END IF;
4192     	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4193 		--dbms_output.put_line('cont not assigned');
4194 		--
4195 		IF l_debug_on THEN
4196 		    WSH_DEBUG_SV.pop(l_module_name);
4197 		END IF;
4198 		--
4199 		return;
4200     	END IF;
4201 
4202         --
4203         IF l_debug_on THEN
4204             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
4205         END IF;
4206         --
4207         wsh_container_actions.Update_Cont_Hierarchy (
4208 				p_det_cont_inst_id,
4209 				l_par_del_id,
4210 				p_par_cont_inst_id,
4211 				x_return_status );
4212 
4213         IF l_debug_on THEN
4214           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4215         END IF;
4216 	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4217 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GRP_ATTR_WARN');
4218 		--
4219 		IF l_debug_on THEN
4220 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4221 		END IF;
4222 		--
4223 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4224 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4225 		l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
4226 		WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
4227 	END IF;
4228 
4229 	--
4230 	IF l_debug_on THEN
4231 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
4232 	END IF;
4233 	--
4234 	WSH_CONTAINER_UTILITIES.Update_Child_Containers (
4235 					p_det_cont_inst_id,
4236 					l_master_cont_id,
4237 					l_master_serial_number,
4238 					x_return_status);
4239         IF l_debug_on THEN
4240           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4241         END IF;
4242 
4243     	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4244 		--
4245 		IF l_debug_on THEN
4246 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4247 		END IF;
4248 		--
4249 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4250      		FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4251 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4252 		x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4253 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4254 		--
4255 		IF l_debug_on THEN
4256 		    WSH_DEBUG_SV.pop(l_module_name);
4257 		END IF;
4258 		--
4259 		return;
4260     	END IF;
4261 
4262    ELSIF l_det_attr_flag = 'Y' and l_par_attr_flag = 'Y' THEN
4263 
4264 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4265 
4266 	-- check on using the container instance ids for grouping
4267 	-- attribute comparisons instead of using the lines.
4268 
4269 	l_attr_tab(1).entity_id := p_det_cont_inst_id;
4270 	l_attr_tab(1).entity_type := 'DELIVERY_DETAIL';
4271 	l_attr_tab(2).entity_id := p_par_cont_inst_id;
4272 	l_attr_tab(2).entity_type := 'DELIVERY_DETAIL';
4273 
4274 	--
4275 	IF l_debug_on THEN
4276 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
4277 	END IF;
4278 
4279       l_action_rec.action := 'MATCH_GROUPS';
4280       l_action_rec.check_single_grp := 'Y';
4281 
4282 
4283       WSH_DELIVERY_AUTOCREATE.Find_Matching_Groups(p_attr_tab => l_attr_tab,
4284                         p_action_rec => l_action_rec,
4285                         p_target_rec => l_target_rec,
4286                         p_group_tab => l_group_tab,
4287                         x_matched_entities => l_matched_entities,
4288                         x_out_rec => l_out_rec,
4289                         x_return_status => x_return_status);
4290 
4291         IF l_debug_on THEN
4292           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4293         END IF;
4294 	IF (x_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
4295         OR  NVL(l_out_rec.single_group, 'N') = 'N') THEN
4296 		FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
4297        		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4298 		--
4299 		IF l_debug_on THEN
4300 		    WSH_DEBUG_SV.pop(l_module_name);
4301 		END IF;
4302 		--
4303 		return;
4304 	END IF;
4305 
4306 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4307 
4308 	    -- create assignment between child and parent container
4309             --
4310             IF l_debug_on THEN
4311                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
4312             END IF;
4313             --
4314             WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
4315 		p_det_cont_inst_id,
4316 		p_par_cont_inst_id,
4317 		x_return_status);
4318 
4319             IF l_debug_on THEN
4320               WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4321             END IF;
4322 	    IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4323 		l_ret_sts := x_return_status;
4324 		--
4325 		IF l_debug_on THEN
4326 		    WSH_DEBUG_SV.pop(l_module_name);
4327 		END IF;
4328 		--
4329 		return;
4330 	    END IF;
4331 
4332 	    -- call update cont attributes to update grouping attr.
4333 	    --
4334 	    IF l_debug_on THEN
4335 	        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
4336 	    END IF;
4337 	    --
4338 	    WSH_CONTAINER_UTILITIES.Update_Child_Containers (
4339 					p_det_cont_inst_id,
4340 					l_master_cont_id,
4341 					l_master_serial_number,
4342 					x_return_status);
4343             IF l_debug_on THEN
4344               WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4345             END IF;
4346 
4347     	    IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4348 		--
4349 		IF l_debug_on THEN
4350 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4351 		END IF;
4352 		--
4353 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4354      		FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4355 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4356 		x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4357 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4358 		--
4359 		IF l_debug_on THEN
4360 		    WSH_DEBUG_SV.pop(l_module_name);
4361 		END IF;
4362 		--
4363 		return;
4364     	    END IF;
4365 
4366 
4367    END IF;
4368 
4369       --BUG#12904248
4370    Get_Deliver_To_Location(
4371    p_container_id => p_par_cont_inst_id,
4372    x_deliver_to_location_id => l_deliver_to_location_id,
4373    x_return_status => l_return_status);
4374 
4375   IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4376 
4377    UPDATE wsh_delivery_details
4378    SET    deliver_to_location_id = l_deliver_to_location_id
4379    WHERE  delivery_detail_id = p_par_cont_inst_id;
4380 
4381   END IF;
4382 
4383   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4384 
4385 	--
4386 	IF l_debug_on THEN
4387 	    WSH_DEBUG_SV.pop(l_module_name);
4388 	END IF;
4389 	--
4390 EXCEPTION
4391 
4392   WHEN Others THEN
4393 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Assign_To_Container',l_module_name);
4394 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4395 
4396 --
4397 IF l_debug_on THEN
4398     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4399     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4400 END IF;
4401 --
4402 END Assign_To_Container;
4403 
4404 /*
4405 -----------------------------------------------------------------------------
4406    PROCEDURE  : Get_Cont_Load_Vol_info
4407    PARAMETERS : p_container_item_id - Item Id of the Container
4408                 p_organization_id - Organization Id of the item
4409                 p_w_v_both - W (Find Weight), V (Find Volume),
4410                              B (Find Weight and Volume)
4411                 x_return_status - Return Status of the API
4412                 x_error_cnt     - Count of errors encountered
4413                 x_max_load      - Max Load Weight of the container
4414                 x_max_vol       - Internal Volume of the container
4415                 x_wt_uom        - Weight UOM of the container
4416                 x_vol_uom       - Volume UOM of the container
4417   DESCRIPTION : This procedure finds Container Weight/Volume attributes
4418                 either from database or from cached PL/SQL table and caches
4419                 the info if fetched from database.
4420 ------------------------------------------------------------------------------
4421 */
4422 
4423 PROCEDURE  Get_Cont_Load_Vol_info(
4424              p_container_item_id IN  NUMBER,
4425              p_organization_id   IN  NUMBER,
4426              p_w_v_both          IN  VARCHAR2,
4427              x_max_load          OUT NOCOPY  NUMBER,
4428              x_max_vol           OUT NOCOPY  NUMBER,
4429              x_wt_uom            OUT NOCOPY  VARCHAR2,
4430              x_vol_uom           OUT NOCOPY  VARCHAR2,
4431           --   x_inventory_item_status_code OUT VARCHAR2,
4432              x_return_status     OUT NOCOPY  VARCHAR2,
4433              x_error_cnt         OUT NOCOPY  NUMBER) IS
4434 -- in this cursor we can add filters as required in 2428050
4435   CURSOR Get_Cont_Msi (v_cont_item_id NUMBER, v_org_id NUMBER) IS
4436   SELECT maximum_load_weight, internal_volume,
4437          weight_uom_code, volume_uom_code
4438   FROM   MTL_SYSTEM_ITEMS
4439   WHERE  inventory_item_id = v_cont_item_id
4440   AND    organization_id   = v_org_id
4441 -- bug 2828591 - remove the condition since it will prevent user to create container with other status
4442 --  AND    inventory_item_status_code = 'Active'
4443   AND    container_item_flag = 'Y'
4444   AND    nvl(vehicle_item_flag,'N') = 'N'
4445   AND    shippable_item_flag = 'Y' ;
4446 
4447   l_mtl_max_load NUMBER;
4448   l_mtl_max_vol  NUMBER;
4449   l_mtl_wt_uom   VARCHAR2(3);
4450   l_mtl_vol_uom  VARCHAR2(3);
4451   l_inv_item_status_code VARCHAR2(10);
4452   l_flag VARCHAR2(1);
4453   l_item_name    VARCHAR2(2000);
4454 
4455 --
4456 l_debug_on BOOLEAN;
4457 --
4458 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'GET_CONT_LOAD_VOL_INFO';
4459 --
4460 BEGIN
4461   --
4462   --
4463   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4464   --
4465   IF l_debug_on IS NULL
4466   THEN
4467       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4468   END IF;
4469   --
4470   IF l_debug_on THEN
4471       WSH_DEBUG_SV.push(l_module_name);
4472       --
4473       WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_ITEM_ID',P_CONTAINER_ITEM_ID);
4474       WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
4475       WSH_DEBUG_SV.log(l_module_name,'P_W_V_BOTH',P_W_V_BOTH);
4476   END IF;
4477   --
4478   x_error_cnt := 0;
4479   x_return_status := C_SUCCESS_STATUS;
4480   --dbms_output.put_line('Get_Cont_Load_Vol_info: p_container_item_id '||p_container_item_id||' p_w_v_both '||p_w_v_both);
4481   IF ((g_cont_msi_tab.COUNT > 0) AND (g_cont_msi_tab.EXISTS(p_container_item_id))) THEN
4482 
4483 -- added for valid flag in PL SQL table
4484     IF g_cont_msi_tab(p_container_item_id).valid_flag = 'Y' THEN
4485       NULL;
4486     ELSE
4487       --
4488       IF l_debug_on THEN
4489           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4490       END IF;
4491       --
4492       l_item_name := WSH_UTIL_CORE.Get_Item_Name(p_container_item_id, p_organization_id);
4493       --dbms_output.put_line('Container '||p_container_item_id||' not found in Org '||p_organization_id);
4494       FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_INV_ITEM');
4495       FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
4496       CLOSE Get_Cont_Msi;
4497       WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4498       x_return_status := C_ERROR_STATUS;
4499       x_error_cnt := x_error_cnt + 1;
4500 
4501     END IF;
4502 -- end of for valid flag
4503 
4504      --dbms_output.put_line('Using Cached Cont/Msi Info');
4505   ELSE
4506     l_mtl_max_load := NULL;
4507     l_mtl_max_vol  := NULL;
4508     l_mtl_wt_uom   := NULL;
4509     l_mtl_vol_uom  := NULL;
4510 
4511     l_flag := 'Y';
4512 
4513     OPEN Get_Cont_Msi(p_container_item_id, p_organization_id);
4514     FETCH Get_Cont_Msi
4515     INTO  l_mtl_max_load,
4516           l_mtl_max_vol,
4517           l_mtl_wt_uom,
4518           l_mtl_vol_uom;
4519 
4520     IF Get_Cont_Msi%NOTFOUND THEN
4521       --
4522       IF l_debug_on THEN
4523           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4524       END IF;
4525       --
4526       l_item_name := WSH_UTIL_CORE.Get_Item_Name(p_container_item_id, p_organization_id);
4527       --dbms_output.put_line('Container '||p_container_item_id||' not found in Org '||p_organization_id);
4528       FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_INV_ITEM');
4529       FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
4530       CLOSE Get_Cont_Msi;
4531       WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4532       x_return_status := C_ERROR_STATUS;
4533       x_error_cnt := x_error_cnt + 1;
4534     ELSE
4535 
4536     --dbms_output.put_line('IN ELSE CLAUSE'||l_flag);
4537       CLOSE Get_Cont_Msi;
4538 
4539 
4540       IF ((NVL(l_mtl_max_load,0) <= 0) AND (p_w_v_both in ('W','B'))) THEN
4541         --dbms_output.put_line('Preferred Container Weight is <= 0');
4542         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_LOAD_ERROR');
4543         WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4544         x_return_status := C_ERROR_STATUS;
4545         x_error_cnt := x_error_cnt + 1;
4546         l_flag := 'N';
4547       END IF;
4548 
4549       IF ((NVL(l_mtl_max_vol,0) <= 0) AND (p_w_v_both in ('V','B'))) THEN
4550         --dbms_output.put_line('Preferred Container Volume is <= 0');
4551         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_VOL_ERROR');
4552         WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4553         x_return_status := C_ERROR_STATUS;
4554         x_error_cnt := x_error_cnt + 1;
4555         l_flag := 'N';
4556       END IF;
4557 
4558       IF (l_flag IS NULL OR l_flag <> 'N') THEN
4559         l_flag := 'Y';
4560       END IF;
4561 
4562     END IF;
4563 
4564     --dbms_output.put_line('Caching Cont/Msi Info'||l_flag);
4565     g_cont_msi_tab(p_container_item_id).mtl_max_load := l_mtl_max_load;
4566     g_cont_msi_tab(p_container_item_id).mtl_max_vol  := l_mtl_max_vol;
4567     g_cont_msi_tab(p_container_item_id).mtl_wt_uom   := l_mtl_wt_uom;
4568     g_cont_msi_tab(p_container_item_id).mtl_vol_uom  := l_mtl_vol_uom;
4569     g_cont_msi_tab(p_container_item_id).valid_flag  := l_flag;
4570   END IF;
4571 
4572   x_max_load := g_cont_msi_tab(p_container_item_id).mtl_max_load;
4573   x_max_vol  := g_cont_msi_tab(p_container_item_id).mtl_max_vol;
4574   x_wt_uom   := g_cont_msi_tab(p_container_item_id).mtl_wt_uom;
4575   x_vol_uom  := g_cont_msi_tab(p_container_item_id).mtl_vol_uom;
4576   --x_inventory_item_status_code  := g_cont_msi_tab(p_container_item_id).inventory_item_status_code;
4577   --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Get_Cont_Load_Vol_info returned '||x_return_status||' with error count '||x_error_cnt);
4578 
4579   --
4580   IF l_debug_on THEN
4581       WSH_DEBUG_SV.log(l_module_name,'MAX LOAD',x_max_load);
4582       WSH_DEBUG_SV.log(l_module_name,'MAX VOLUME',x_max_vol);
4583       WSH_DEBUG_SV.pop(l_module_name);
4584   END IF;
4585   --
4586   RETURN;
4587 
4588 EXCEPTION
4589   WHEN Others THEN
4590     IF (Get_Cont_Msi%ISOPEN) THEN
4591       CLOSE Get_Cont_Msi;
4592     END IF;
4593     WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Get_Cont_Load_Vol_info',l_module_name);
4594         x_return_status := C_UNEXP_ERROR_STATUS;
4595 
4596 --
4597 IF l_debug_on THEN
4598     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4599     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4600 END IF;
4601 --
4602 END  Get_Cont_Load_Vol_info;
4603 
4604 /*
4605 -----------------------------------------------------------------------------
4606    PROCEDURE  : Calc_Fill_Basis_and_Proc_Flag
4607    PARAMETERS : p_organization_id - Organization Id for which Fill Basis and
4608                                     Process Flag is to be determined
4609                 x_return_status - Return Status of the API
4610                 x_error_cnt     - Count of errors encountered
4611                 x_fill_basis    - Fill Basis for the organization
4612                 x_process_flag  - Discrete/Process Organization
4613   DESCRIPTION : This procedure finds Fill Basis for organization and determines
4614                 whether organization uses Process or Discrete Manufacturing
4615                 either from database or from cached PL/SQL table and caches
4616                 the info if fetched from database.
4617 ------------------------------------------------------------------------------
4618 */
4619 
4620 PROCEDURE Calc_Fill_Basis_and_Proc_Flag(
4621             p_organization_id IN  NUMBER,
4622             x_return_status   OUT NOCOPY  VARCHAR2,
4623             x_fill_basis      OUT NOCOPY  VARCHAR2,
4624             x_process_flag    OUT NOCOPY  VARCHAR2) IS
4625 
4626   l_param_info  WSH_SHIPPING_PARAMS_PVT.Parameter_Rec_Typ;
4627 
4628 --
4629 l_debug_on BOOLEAN;
4630 --
4631 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CALC_FILL_BASIS_AND_PROC_FLAG';
4632 --
4633 BEGIN
4634 
4635   --
4636   --
4637   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4638   --
4639   IF l_debug_on IS NULL
4640   THEN
4641       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4642   END IF;
4643   --
4644   IF l_debug_on THEN
4645       WSH_DEBUG_SV.push(l_module_name);
4646       --
4647       WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
4648   END IF;
4649   --
4650   --
4651   IF l_debug_on THEN
4652       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_SHIPPING_PARAMS_PVT.GET',WSH_DEBUG_SV.C_PROC_LEVEL);
4653   END IF;
4654   --
4655   WSH_SHIPPING_PARAMS_PVT.Get(
4656     p_organization_id => p_organization_id,
4657     x_param_info      => l_param_info,
4658     x_return_status   => x_return_status);
4659 
4660   IF l_debug_on THEN
4661     WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4662   END IF;
4663   IF (x_return_status = C_SUCCESS_STATUS) THEN
4664     x_fill_basis   := l_param_info.percent_fill_basis_flag;
4665 -- HW OPMCONV - No need to populate this value
4666 --  x_process_flag := l_param_info.process_flag;
4667   END IF;
4668 
4669   --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Calc_Fill_Basis_and_proc_flag returned '||x_return_status);
4670 
4671   --
4672   IF l_debug_on THEN
4673       WSH_DEBUG_SV.pop(l_module_name);
4674   END IF;
4675   --
4676   RETURN;
4677 
4678 --
4679 IF l_debug_on THEN
4680     WSH_DEBUG_SV.pop(l_module_name);
4681 END IF;
4682 --
4683 EXCEPTION
4684   WHEN Others THEN
4685     WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Calc_Fill_Basis_and_proc_flag',l_module_name);
4686     x_return_status := C_UNEXP_ERROR_STATUS;
4687     --
4688     IF l_debug_on THEN
4689         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4690         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4691     END IF;
4692     --
4693 END  Calc_Fill_Basis_and_proc_flag;
4694 
4695 /*
4696 -----------------------------------------------------------------------------
4697    PROCEDURE  : Calc_Pref_Container
4698    PARAMETERS : p_organization_id - Organization Id of the Item for which
4699                                     Preferred Container is to be determined
4700                 p_inventory_item_id - Item for which Preferred Container is to
4701                                       be determined
4702                 p_fill_pc_basis - Fill Basis for the organization
4703                 x_return_status - Return Status of the API
4704                 x_error_cnt     - Count of errors encountered
4705                 x_cont_item_id  - Preferred Container Item Id
4706                 x_max_load_qty  - Max Load Qty of the Preferred Container
4707   DESCRIPTION : This procedure finds preferred container for item-organization
4708                 combination either from database or from cached PL/SQL table
4709                 and caches the info if fetched from database.
4710                 This procedure also finds and caches the Max Load qty a
4711                 preferred container can hold if fill basis is Quantity.
4712 ------------------------------------------------------------------------------
4713 */
4714 
4715 PROCEDURE Calc_Pref_Container(
4716             p_organization_id   IN  NUMBER,
4717             p_inventory_item_id IN  NUMBER,
4718             p_fill_pc_basis     IN  VARCHAR2,
4719             x_return_status     OUT NOCOPY  VARCHAR2,
4720             x_error_cnt         OUT NOCOPY  NUMBER,
4721             x_cont_item_id      OUT NOCOPY  NUMBER,
4722             x_max_load_qty      OUT NOCOPY  NUMBER) IS
4723 
4724   CURSOR Get_Cont_Load (v_inv_item_id NUMBER, v_organization_id NUMBER) IS
4725   SELECT container_item_id,
4726          max_load_quantity
4727   FROM   WSH_CONTAINER_ITEMS
4728   WHERE  load_item_id           = v_inv_item_id
4729   AND    master_organization_id = v_organization_id
4730   AND    preferred_flag         = 'Y';
4731 
4732   l_wcl_cont_item_id NUMBER;
4733   l_max_load_qty     NUMBER;
4734   l_item_name VARCHAR2(2000);
4735   l_org_name VARCHAR2(240);
4736 
4737 
4738 --
4739 l_debug_on BOOLEAN;
4740 --
4741 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CALC_PREF_CONTAINER';
4742 --
4743 BEGIN
4744   --
4745   --
4746   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4747   --
4748   IF l_debug_on IS NULL
4749   THEN
4750       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4751   END IF;
4752   --
4753   IF l_debug_on THEN
4754       WSH_DEBUG_SV.push(l_module_name);
4755       --
4756       WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
4757       WSH_DEBUG_SV.log(l_module_name,'P_INVENTORY_ITEM_ID',P_INVENTORY_ITEM_ID);
4758       WSH_DEBUG_SV.log(l_module_name,'P_FILL_PC_BASIS',P_FILL_PC_BASIS);
4759   END IF;
4760   --
4761   x_error_cnt := 0;
4762   x_return_status := C_SUCCESS_STATUS;
4763 
4764   IF ((g_cache_cont_load_info_tab.COUNT > 0) AND (g_cache_cont_load_info_tab.EXISTS(p_inventory_item_id))) THEN
4765     NULL;
4766     --dbms_output.put_line('Using Cached Cont/Load info');
4767   ELSE
4768     l_wcl_cont_item_id := NULL;
4769     l_max_load_qty     := NULL;
4770 
4771     OPEN Get_Cont_Load (p_inventory_item_id, p_organization_id);
4772 
4773     FETCH Get_Cont_Load
4774     INTO  l_wcl_cont_item_id,
4775           l_max_load_qty;
4776 
4777     IF Get_Cont_Load%NOTFOUND THEN
4778       CLOSE Get_Cont_Load;
4779       --
4780       IF l_debug_on THEN
4781           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4782       END IF;
4783       --
4784       l_item_name := WSH_UTIL_CORE.Get_Item_Name(p_inventory_item_id, p_organization_id);
4785       --
4786       IF l_debug_on THEN
4787           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ORG_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4788       END IF;
4789       --
4790       l_org_name := WSH_UTIL_CORE.Get_Org_Name(p_organization_id);
4791       --dbms_output.put_line('Error: Cont/Load Relationship does not exist for Item '||l_item_name||' Org '||l_org_name);
4792       --dbms_output.put_line('p_inventory_item_id '||p_inventory_item_id||' p_organization_id '||p_organization_id);
4793       FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONT_LOAD');
4794       FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
4795       FND_MESSAGE.SET_TOKEN('ORG_NAME',l_org_name);
4796       WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4797       x_return_status := C_ERROR_STATUS;
4798       x_error_cnt := x_error_cnt + 1;
4799     ELSE
4800       CLOSE Get_Cont_Load;
4801       IF ((l_max_load_qty = 0) AND (p_fill_pc_basis = 'Q')) THEN
4802         --dbms_output.put_line('Error: Max Load qty for Preferred Container is 0');
4803         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_LOAD_QTY_ERROR');
4804         WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4805         x_error_cnt := x_error_cnt + 1;
4806         x_return_status := C_ERROR_STATUS;
4807         l_wcl_cont_item_id := NULL;
4808       END IF;
4809     END IF;
4810 
4811     g_cache_cont_load_info_tab(p_inventory_item_id).cont_item_id := l_wcl_cont_item_id;
4812     g_cache_cont_load_info_tab(p_inventory_item_id).max_load_qty := l_max_load_qty;
4813     --dbms_output.put_line('Caching Cont/Load info');
4814   END IF;
4815   x_cont_item_id :=  g_cache_cont_load_info_tab(p_inventory_item_id).cont_item_id;
4816   x_max_load_qty :=  g_cache_cont_load_info_tab(p_inventory_item_id).max_load_qty;
4817   --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Calc_Pref_Container returned '||x_return_status||' with error count '||x_error_cnt);
4818 
4819   --
4820   IF l_debug_on THEN
4821       WSH_DEBUG_SV.pop(l_module_name);
4822   END IF;
4823   --
4824   RETURN;
4825 
4826 --
4827 IF l_debug_on THEN
4828     WSH_DEBUG_SV.pop(l_module_name);
4829 END IF;
4830 --
4831 EXCEPTION
4832   WHEN Others THEN
4833     IF (Get_Cont_Load%ISOPEN) THEN
4834       CLOSE Get_Cont_Load;
4835     END IF;
4836     WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Calc_Pref_Container',l_module_name);
4837     x_return_status := C_UNEXP_ERROR_STATUS;
4838 
4839 --
4840 IF l_debug_on THEN
4841     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4842     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4843 END IF;
4844 --
4845 END Calc_Pref_Container;
4846 
4847 /*
4848 -----------------------------------------------------------------------------
4849    PROCEDURE  : Pack_Delivery_Detail
4850    PARAMETERS : p_line_cont_rec - Dd info which needs to be autopacked
4851                 x_return_status - Return Status of the API
4852   DESCRIPTION : This procedure packs a delivery detail into Container either
4853                 by creating a new one or by packing it into one created for
4854                 previous delivery details (created in the same run)
4855 ------------------------------------------------------------------------------
4856 */
4857 
4858 PROCEDURE Pack_Delivery_Detail(
4859   p_line_cont_rec IN  wsh_container_actions.line_cont_info,
4860   x_return_status OUT NOCOPY  VARCHAR2) IS
4861 
4862   l_mtl_max_load          NUMBER;
4863   l_mtl_max_vol           NUMBER;
4864   l_item_name             VARCHAR2(2000);
4865   l_weight_per_pc         NUMBER;
4866   l_volume_per_pc         NUMBER;
4867   l_volume_per_pc2        NUMBER;
4868   l_equal_distribution    BOOLEAN;
4869   l_wt_left               NUMBER;
4870   l_vol_left              NUMBER;
4871   l_original_qty          NUMBER;
4872   l_quantity_left              NUMBER;
4873   l_tmp_split_qty         NUMBER;
4874   l_tmp_split_qty2        NUMBER;
4875   l_split_qty             NUMBER;
4876   l_split_qty2            NUMBER;
4877   l_split_del_detail_id   NUMBER;
4878   l_return_status VARCHAR2(1) := C_SUCCESS_STATUS;
4879   l_output_qty            NUMBER;
4880   l_discard_message     VARCHAR2(2000);
4881   l_max_load_qty        NUMBER;
4882   l_tot_gross_wt NUMBER;
4883   l_tot_net_wt NUMBER;
4884   l_tot_vol NUMBER;
4885   l_dd_wt_per_pc  NUMBER;
4886   l_dd_gross_wt_left    NUMBER;
4887   l_dd_net_wt_left    NUMBER;
4888   l_dd_vol_per_pc NUMBER;
4889   l_dd_vol_left   NUMBER;
4890 
4891   i NUMBER;
4892   j NUMBER;
4893   gcdvalue NUMBER;
4894 
4895   l_count_container NUMBER;
4896   l_container_item_id NUMBER;
4897   l_container_org_id NUMBER;
4898   l_num_of_split     NUMBER;
4899   l_dd_id_tab        WSH_UTIL_CORE.id_tab_type;
4900 
4901 --
4902 l_debug_on BOOLEAN;
4903 --
4904 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'PACK_DELIVERY_DETAIL';
4905 --
4906 BEGIN
4907   --
4908   --
4909   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4910   --
4911   IF l_debug_on IS NULL
4912   THEN
4913       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4914   END IF;
4915   --
4916   IF l_debug_on THEN
4917     WSH_DEBUG_SV.push(l_module_name);
4918     WSH_DEBUG_SV.log(l_module_name,'In Pack_Delivery_Detail API, Packing wdd '||p_line_cont_rec.delivery_detail_id||' div flag '||p_line_cont_rec.indivisible_flag||' Process Flag '||p_line_cont_rec.process_flag);
4919     WSH_DEBUG_SV.log(l_module_name,'Fill Pc Basis '||p_line_cont_rec.fill_pc_basis||' G Wt '||p_line_cont_rec.gross_weight||' N Wt '||p_line_cont_rec.net_weight||' Vol '||p_line_cont_rec.volume );
4920   END IF;
4921   --
4922   l_dd_gross_wt_left := ROUND(p_line_cont_rec.gross_weight,LIMITED_PRECISION);
4923   l_dd_net_wt_left   := ROUND(p_line_cont_rec.net_weight,LIMITED_PRECISION);
4924   l_dd_vol_left      := ROUND(p_line_cont_rec.volume,LIMITED_PRECISION);
4925 
4926   IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
4927      l_max_load_qty := p_line_cont_rec.max_load_qty;
4928      --dbms_output.put_line('Max Load qty is '||p_line_cont_rec.max_load_qty);
4929   ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
4930 
4931     l_mtl_max_load := p_line_cont_rec.cont_wt;
4932 
4933     -- Calculate Wt per Piece. We pack based on converted Container UOM weight
4934     l_weight_per_pc  := TRUNC(p_line_cont_rec.converted_wt/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
4935     l_wt_left       := p_line_cont_rec.converted_wt;
4936 -- Bug 2786021
4937     IF (nvl(l_mtl_max_load,0) = 0 OR nvl(l_weight_per_pc,0) = 0)THEN
4938       x_return_status := C_ERROR_STATUS;
4939       IF nvl(l_mtl_max_load,0) = 0 THEN
4940         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_LOAD_ERROR');
4941       ELSIF nvl(l_weight_per_pc,0) = 0 THEN
4942         FND_MESSAGE.SET_NAME('WSH','WSH_NULL_WEIGHT_VOLUME');
4943         FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL',p_line_cont_rec.delivery_detail_id);
4944       END IF;
4945       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4946       IF l_debug_on THEN
4947         WSH_DEBUG_SV.pop(l_module_name);
4948       END IF;
4949       RETURN;
4950     END IF;
4951 -- Bug 2786021
4952 
4953   ELSE
4954     l_mtl_max_vol := p_line_cont_rec.cont_vol;
4955 
4956     -- Calculate Vol per Piece. We pack based on converted Container UOM volume
4957     l_volume_per_pc  := TRUNC(p_line_cont_rec.converted_vol/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
4958     l_vol_left       := p_line_cont_rec.converted_vol;
4959 -- Bug 2786021
4960     IF (nvl(l_mtl_max_vol,0) = 0 OR nvl(l_volume_per_pc,0) = 0) THEN
4961       x_return_status := C_ERROR_STATUS;
4962       IF nvl(l_mtl_max_vol,0) = 0 THEN
4963         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_VOL_ERROR');
4964       ELSIF nvl(l_volume_per_pc,0) = 0 THEN
4965         FND_MESSAGE.SET_NAME('WSH','WSH_NULL_WEIGHT_VOLUME');
4966         FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL',p_line_cont_rec.delivery_detail_id);
4967       END IF;
4968       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4969       IF l_debug_on THEN
4970         WSH_DEBUG_SV.pop(l_module_name);
4971       END IF;
4972       RETURN;
4973     END IF;
4974 -- Bug 2786021
4975   END IF;
4976 
4977   IF l_debug_on THEN
4978     WSH_DEBUG_SV.log(l_module_name,'Wt per pc-',l_weight_per_pc);
4979     WSH_DEBUG_SV.log(l_module_name,'Vol per pc-',l_volume_per_pc);
4980     WSH_DEBUG_SV.log(l_module_name,'Cont max load-',l_mtl_max_load);
4981     WSH_DEBUG_SV.log(l_module_name,'Cont max vol-',l_mtl_max_vol);
4982   END IF;
4983 
4984   l_original_qty  := p_line_cont_rec.shp_qty;
4985   l_quantity_left := p_line_cont_rec.shp_qty;
4986 
4987   -- Check Empty Containers first
4988   IF (g_empty_cont_tab.COUNT > 0 ) THEN
4989 --dbms_output.put_line('There are containers with empty space'||to_char(sysdate,'HH24:MI:SS'));
4990 
4991     i := g_empty_cont_tab.FIRST;
4992     WHILE i <= g_empty_cont_tab.LAST LOOP
4993       IF p_line_cont_rec.preferred_container <> g_empty_cont_tab(i).container_item_Id OR
4994          p_line_cont_rec.organization_id <> g_empty_cont_tab(i).organization_id OR
4995          p_line_cont_rec.group_id <> g_empty_cont_tab(i).group_id  OR
4996          (NVL(p_line_cont_rec.master_cont_item_id,NVL(g_empty_cont_tab(i).mast_cont_item_id,-99)) <> NVL(g_empty_cont_tab(i).mast_cont_item_id,-99)) OR
4997          g_empty_cont_tab(i).empty <= 0 THEN
4998         GOTO next_cont;
4999       END IF;
5000 
5001       -- Got a Match in empty container table
5002 
5003       IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
5004         --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty numerator '||g_empty_cont_tab(i).numerator||' denominator '||g_empty_cont_tab(i).denominator);
5005         -- Calculate qty than can fit in 'empty' space
5006         -- Bug 2733274
5007         l_tmp_split_qty  := TRUNC((p_line_cont_rec.max_load_qty*g_empty_cont_tab(i).numerator)/g_empty_cont_tab(i).denominator,LIMITED_PRECISION);
5008 
5009       ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
5010         --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty weight '||g_empty_cont_tab(i).empty);
5011         -- Calculate qty than can fit in 'empty' space
5012         l_tmp_split_qty := TRUNC(g_empty_cont_tab(i).empty/l_weight_per_pc,LIMITED_PRECISION);
5013       ELSE
5014         --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty volume '||g_empty_cont_tab(i).empty);
5015         -- Calculate qty than can fit in 'empty' space
5016         l_tmp_split_qty := TRUNC(g_empty_cont_tab(i).empty/l_volume_per_pc,LIMITED_PRECISION);
5017       END IF;
5018       -- l_tmp_split_qty is qty, in fraction, that can fit into empty container
5019       --dbms_output.put_line('l_tmp_split_qty '||l_tmp_split_qty||' l_tmp_split_qty2 '||l_tmp_split_qty2);
5020 
5021       -- Per Pushkar,OPM: Call Check_Decimal_Quantity for both OPM and Discrete for primary quantity
5022       --
5023       IF l_debug_on THEN
5024           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
5025       END IF;
5026       --
5027       WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
5028            p_line_cont_rec.inventory_item_id,
5029            p_line_cont_rec.organization_id,
5030            l_tmp_split_qty,
5031            p_line_cont_rec.req_qty_uom,
5032            l_output_qty,
5033            l_return_status);
5034 
5035       IF l_debug_on THEN
5036         WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5037       END IF;
5038       IF (l_return_status <> C_SUCCESS_STATUS OR
5039           p_line_cont_rec.indivisible_flag = 'Y')THEN
5040         -- Fractional qtys not allowed
5041         --dbms_output.put_line('WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity returned '||l_return_status);
5042         l_discard_message := FND_MESSAGE.GET;
5043         l_tmp_split_qty  := FLOOR(l_tmp_split_qty);
5044       END IF;
5045 -- HW OPMCONV - 1) No need to check for process
5046 --            - 2) Changed code to handle qty2
5047 --            - 3) Remove OPM specific precision to 9
5048 
5049       IF ( p_line_cont_rec.shp_qty2 IS NOT NULL ) THEN
5050         l_tmp_split_qty2 := (l_tmp_split_qty * p_line_cont_rec.shp_qty2)/p_line_cont_rec.shp_qty;
5051       ELSE
5052         l_tmp_split_qty2 := NULL;
5053       END IF;
5054       --dbms_output.put_line('l_tmp_split_qty '||l_tmp_split_qty||' l_tmp_split_qty2 '||l_tmp_split_qty2||' l_quantity_left '||l_quantity_left);
5055 
5056       IF (l_tmp_split_qty <= 0) THEN
5057         -- Container insufficient, skip this
5058         --dbms_output.put_line('Container Insufficient. Skipping this');
5059         GOTO next_cont;
5060       ELSE
5061         IF (l_tmp_split_qty >= l_quantity_left) THEN
5062           -- all left can be packed into the empty container
5063           l_tmp_split_qty := l_quantity_left;
5064           l_quantity_left := 0;
5065 
5066           -- Assign the dd to container
5067           g_assign_detail_index := g_assign_detail_index + 1;
5068           g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := p_line_cont_rec.delivery_detail_id;
5069           g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5070           g_assign_detail_tab(g_assign_detail_index).container_index := g_empty_cont_tab(i).container_index;
5071           g_assign_detail_tab(g_assign_detail_index).gross_weight := l_dd_gross_wt_left;
5072           g_assign_detail_tab(g_assign_detail_index).net_weight := l_dd_net_wt_left;
5073           g_assign_detail_tab(g_assign_detail_index).volume := l_dd_vol_left;
5074           -- J: W/V Changes
5075           g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5076           g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5077           g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5078           -- K LPN CONV. rv
5079           g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5080           g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5081 
5082           --dbms_output.put_line('Assigning '||g_assign_detail_tab(g_assign_detail_index).delivery_detail_id||' to Cont index '||g_assign_detail_tab(g_assign_detail_index).container_index);
5083 
5084         ELSIF (l_tmp_split_qty < l_quantity_left) THEN
5085           -- Some qty will be left out
5086 --- HW OPM BUG#3011758
5087 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
5088 --            - 2) Changed check condition for lot divisible from 1 to 'N'
5089           IF( p_line_cont_rec.lot_divisible_flag = 'N')    THEN
5090              goto next_cont;
5091           END IF;
5092 
5093           l_quantity_left := l_quantity_left - l_tmp_split_qty;
5094 
5095           --dbms_output.put_line('Splitting dd '||p_line_cont_rec.delivery_detail_id||' with qty '||l_tmp_split_qty);
5096           --
5097           IF l_debug_on THEN
5098               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
5099               WSH_DEBUG_SV.logmsg(l_module_name,'SPLIT QTY IS'||l_tmp_split_qty);
5100           END IF;
5101           --
5102 
5103 -- added l_dd_id_tab for Bulk call
5104 -- empty container logic, need to test and modify this
5105 -- the value for p_num_of_split is passed as 1
5106 -- so that split occurs once
5107 
5108           WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details_bulk (
5109                p_from_detail_id => p_line_cont_rec.delivery_detail_id,
5110                p_req_quantity   => l_tmp_split_qty,
5111                p_req_quantity2  => l_tmp_split_qty2,
5112                p_manual_split   => 'C',
5113                p_num_of_split  => 1,
5114                x_new_detail_id  => l_split_del_detail_id,
5115                x_dd_id_tab     => l_dd_id_tab,
5116                x_return_status  => l_return_status
5117               );
5118 
5119           IF l_debug_on THEN
5120             WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5121           END IF;
5122 --dbms_output.put_line('STATUS after SPLITDD in empty'||l_return_status||l_dd_id_tab.count);
5123 
5124           IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
5125                                  WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
5126             --dbms_output.put_line('WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details returned '|| l_return_status);
5127             x_return_status := C_ERROR_STATUS;
5128             --dbms_output.put_line('WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details returned '||x_return_status);
5129             FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
5130             FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_line_cont_rec.delivery_detail_id);
5131             WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5132             --
5133             IF l_debug_on THEN
5134                 WSH_DEBUG_SV.pop(l_module_name);
5135             END IF;
5136             --
5137             return;
5138           END IF;
5139 
5140           IF l_debug_on THEN
5141             WSH_DEBUG_SV.logmsg(l_module_name,'COUNT OF WDD RECORDS IS'||l_dd_id_tab.count);
5142           END IF;
5143 
5144           --dbms_output.put_line('Created new dd '||l_split_del_detail_id);
5145 
5146           -- Calculate distributed wt/vol for the new dd
5147           l_tot_gross_wt := ROUND((l_tmp_split_qty * p_line_cont_rec.gross_weight)/p_line_cont_rec.shp_qty, LIMITED_PRECISION);
5148           l_tot_net_wt   := ROUND((l_tmp_split_qty * p_line_cont_rec.net_weight)/p_line_cont_rec.shp_qty, LIMITED_PRECISION);
5149           l_tot_vol      := ROUND((l_tmp_split_qty * p_line_cont_rec.volume)/p_line_cont_rec.shp_qty, LIMITED_PRECISION);
5150           l_dd_gross_wt_left := l_dd_gross_wt_left - l_tot_gross_wt;
5151           l_dd_net_wt_left   := l_dd_net_wt_left - l_tot_net_wt;
5152           l_dd_vol_left      := l_dd_vol_left - l_tot_vol;
5153 
5154 -- Use Bulk assignment into this PL SQL table
5155 -- from the returned PL SQL table
5156 -- weight volume will be same
5157 -- Look for empty container population in record, is this correct???
5158 
5159         FOR j in 1..l_dd_id_tab.count
5160         LOOP
5161           -- Assign the newly created dd
5162 --dbms_output.put_line('Value of j is'||j);
5163           g_assign_detail_index := g_assign_detail_index + 1;
5164           --g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_split_del_detail_id;
5165           g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_dd_id_tab(j);
5166           g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5167           g_assign_detail_tab(g_assign_detail_index).container_index := g_empty_cont_tab(i).container_index;
5168           g_assign_detail_tab(g_assign_detail_index).gross_weight := l_tot_gross_wt;
5169           g_assign_detail_tab(g_assign_detail_index).net_weight := l_tot_net_wt;
5170           g_assign_detail_tab(g_assign_detail_index).volume := l_tot_vol;
5171           -- J: W/V Changes
5172           g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5173           g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5174           g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5175           -- K LPN CONV. rv
5176           g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5177           g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5178           --dbms_output.put_line('Assigning '||g_assign_detail_tab(g_assign_detail_index).delivery_detail_id||' to Cont index '||g_assign_detail_tab(g_assign_detail_index).container_index);
5179 
5180          -- j := j + 1;
5181 
5182          END LOOP;
5183          l_dd_id_tab.DELETE;
5184         END IF;
5185 
5186         -- Calcualte space left and see if container needs to be deleted from empty cont PL/SQL table
5187         IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
5188           g_empty_cont_tab(i).numerator := (g_empty_cont_tab(i).numerator * l_max_load_qty) - (g_empty_cont_tab(i).denominator * l_tmp_split_qty);
5189           g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator * l_max_load_qty;
5190 
5191 	  /* Bug # 3005780 : Added GCD just to reduce the numerator and denominator values
5192 	   Example : When packing 100 LPNs into a master container (Where Max load QTY is 100) ,  after some iterations the numerator and denominator values exceeding the maximum
5193 	   allowable value in NUMBER data type. to overcome that problem using the Get_Gcd function which limit the both numerator and denominator                   */
5194           IF (g_empty_cont_tab(i).numerator <> 0 ) AND (g_empty_cont_tab(i).denominator <> 0 ) THEN
5195               gcdvalue := Get_Gcd(g_empty_cont_tab(i).numerator , g_empty_cont_tab(i).denominator);
5196               --dbms_output.put_line('Get_Gcd return value is  '||gcdvalue');
5197               IF (gcdvalue > 1) THEN
5198                   g_empty_cont_tab(i).numerator := g_empty_cont_tab(i).numerator / gcdvalue;
5199                   g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator / gcdvalue ;
5200               END IF;
5201           END IF;
5202           IF ((g_empty_cont_tab(i).numerator <= 0) OR
5203               (g_empty_cont_tab(i).numerator >= g_empty_cont_tab(i).denominator)) THEN
5204             --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
5205             g_empty_cont_tab.DELETE(i);
5206           END IF;
5207         ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
5208           l_wt_left       := l_wt_left - ROUND(l_tmp_split_qty*l_weight_per_pc,LIMITED_PRECISION);
5209           g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - (l_tmp_split_qty * l_weight_per_pc);
5210           IF (g_empty_cont_tab(i).empty <= 0) THEN
5211             --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
5212             g_empty_cont_tab.DELETE(i);
5213           END IF;
5214         ELSE
5215           l_vol_left       := l_vol_left - ROUND(l_tmp_split_qty*l_volume_per_pc,LIMITED_PRECISION);
5216           g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - (l_tmp_split_qty * l_volume_per_pc);
5217           IF (g_empty_cont_tab(i).empty <= 0) THEN
5218             --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
5219             g_empty_cont_tab.DELETE(i);
5220           END IF;
5221         END IF;
5222 
5223       END IF; -- l_tmp_split_qty <= 0
5224 
5225       -- If the whole qty is packed then exit the loop
5226       IF (l_quantity_left <= 0) THEN
5227         EXIT;
5228       END IF;
5229 
5230       <<next_cont>>
5231         i := g_empty_cont_tab.NEXT(i);
5232     END LOOP;
5233   END IF; -- g_empty_cont_tab > 0
5234 
5235 --dbms_output.put_line('AFter EMPTY containers with empty space'||to_char(sysdate,'HH24:MI:SS'));
5236 
5237   --dbms_output.put_line(' *** Looping empty cont tab is Over and Quantity Left is '||l_quantity_left||' ***');
5238   IF (l_quantity_left > 0) THEN
5239     -- Some qty is left out
5240 
5241     IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
5242 
5243       l_tmp_split_qty  := l_max_load_qty;
5244       l_split_qty      := l_tmp_split_qty;
5245 
5246     ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
5247 
5248       -- Need to do TRUNC instead of ROUND because of following case
5249       -- Ex: If we try to pack qty 4(wt per 3Lbs) into Cont with wt 2LB the value of l_tmp_split_qty(after ROUND) is 0.66667
5250       --     Total wt of split dd will be 0.66667 * 3 = 2.00001 which is > Cont capacity
5251       l_tmp_split_qty := TRUNC((l_quantity_left*l_mtl_max_load)/l_wt_left,LIMITED_PRECISION);
5252       l_split_qty := l_tmp_split_qty;
5253       --dbms_output.put_line('l_quantity_left '||l_quantity_left||' l_wt_left '||l_wt_left||' l_mtl_max_load '||l_mtl_max_load);
5254 
5255     ELSE
5256 
5257       l_tmp_split_qty := TRUNC((l_quantity_left*l_mtl_max_vol)/l_vol_left,LIMITED_PRECISION);
5258       l_split_qty := l_tmp_split_qty;
5259       --dbms_output.put_line('l_quantity_left '||l_quantity_left||' l_vol_left '||l_vol_left||' l_mtl_max_vol '||l_mtl_max_vol);
5260 
5261     END IF;
5262     -- l_tmp_split_qty holds max that can be packed into a new container
5263     --dbms_output.put_line(' l_tmp_split_qty '||l_tmp_split_qty);
5264 
5265     -- Per Pushkar,OPM: Call Check_Decimal_Quantity for both OPM and Discrete for primary quantity
5266     --
5267     IF l_debug_on THEN
5268         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
5269     END IF;
5270     --
5271     WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
5272        p_line_cont_rec.inventory_item_id,
5273        p_line_cont_rec.organization_id,
5274        l_tmp_split_qty,
5275        p_line_cont_rec.req_qty_uom,
5276        l_output_qty,
5277        l_return_status);
5278 
5279     IF l_debug_on THEN
5280       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5281     END IF;
5282     IF (l_return_status <> C_SUCCESS_STATUS OR
5283         p_line_cont_rec.indivisible_flag = 'Y')THEN
5284       -- Fractional qtys not allowed
5285       --dbms_output.put_line('WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity returned '||l_return_status);
5286       l_discard_message := FND_MESSAGE.GET;
5287       l_split_qty  := FLOOR(l_tmp_split_qty);
5288     END IF;
5289 
5290 -- HW OPMCONV - 1) No need to check for process
5291 --            - 2) Changed code to handle qty2
5292 
5293     IF ( p_line_cont_rec.shp_qty2 IS NOT NULL ) THEN
5294       l_split_qty2 := (l_split_qty * p_line_cont_rec.shp_qty2)/p_line_cont_rec.shp_qty;
5295     ELSE
5296       l_split_qty2 := NULL;
5297     END IF;
5298     -- Split Qty holds quantity that can be packed into a container
5299 
5300     --dbms_output.put_line('l_split_qty '||l_split_qty||' l_split_qty2 '||l_split_qty2);
5301 -- initialize the variables
5302     l_count_container := 0;
5303     l_container_item_id := -99;
5304     l_container_org_id := -99;
5305 
5306 --dbms_output.put_line('Before LOOP in pack DD'||to_char(sysdate,'HH24:MI:SS'));
5307     WHILE (l_quantity_left > 0) LOOP
5308 
5309       -- Create new container index
5310       --g_new_cont_index := g_new_cont_index + 1;
5311 
5312 -- added code here
5313       IF (p_line_cont_rec.preferred_container = l_container_item_id
5314           AND p_line_cont_rec.organization_id = l_container_org_id)
5315       THEN
5316 -- keep appending this logic is moved to the end
5317         null;
5318       ELSE
5319 -- reset counter
5320         l_count_container := 0;
5321       END IF;
5322 
5323       l_container_item_id := p_line_cont_rec.preferred_container;
5324       l_container_org_id := p_line_cont_rec.organization_id;
5325 
5326       --dbms_output.put_line('Created Container index '||g_new_cont_index);
5327       --dbms_output.put_line('l_tmp_split_qty '||l_tmp_split_qty||' l_split_qty '||l_split_qty);
5328 
5329       IF (l_split_qty < l_quantity_left
5330           AND l_split_qty > 0
5331          ) THEN
5332         -- Quantity left is > Split qty
5333         l_num_of_split := CEIL(l_quantity_left/l_split_qty) -1;
5334 
5335         -- Start BugFix#3475352
5336 	IF (l_num_of_split + 1) > 100000 THEN
5337             x_return_status := C_ERROR_STATUS;
5338             FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONT_COUNT');
5339             FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_line_cont_rec.delivery_detail_id);
5340             WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5341 	    return;
5342         END IF;
5343         -- End BugFix#3475352
5344 
5345         --dbms_output.put_line('Splitting dd '||p_line_cont_rec.delivery_detail_id||' with qty '||l_split_qty);
5346         IF l_debug_on THEN
5347             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
5348             WSH_DEBUG_SV.logmsg(l_module_name,'Split Qty is'||l_split_qty);
5349             WSH_DEBUG_SV.logmsg(l_module_name,'Number of split is'||l_num_of_split);
5350         END IF;
5351 
5352 --this is in Main Loop
5353 -- Call BULK Split API
5354 
5355 --dbms_output.put_line('======BEFORE SPLIT'||l_dd_id_tab.count||'<'||l_num_of_split);
5356 
5357         WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details_bulk (
5358              p_from_detail_id => p_line_cont_rec.delivery_detail_id,
5359              p_req_quantity   => l_split_qty,
5360              p_req_quantity2  => l_split_qty2,
5361              p_manual_split   => 'C',
5362              p_num_of_split   => l_num_of_split,
5363              x_new_detail_id  => l_split_del_detail_id,
5364              x_dd_id_tab      => l_dd_id_tab,
5365              x_return_status  => l_return_status
5366         );
5367 
5368     IF l_debug_on THEN
5369       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5370     END IF;
5371 
5372         IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
5373                                  WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
5374           --dbms_output.put_line('WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details returned '|| l_return_status);
5375           x_return_status := C_ERROR_STATUS;
5376           FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
5377           FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_line_cont_rec.delivery_detail_id);
5378           WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5379 
5380           IF l_debug_on THEN
5381               WSH_DEBUG_SV.pop(l_module_name);
5382           END IF;
5383 
5384           return;
5385         END IF;
5386 --dbms_output.put_line('======AFTER SPLIT'||l_dd_id_tab.count);
5387 
5388       ELSE -- (l_split_qty < l_quantity_left)
5389       -- l_quantity_left <= l_split_qty which means there is no more qty left
5390 
5391         l_split_qty := l_quantity_left;
5392         l_split_del_detail_id := p_line_cont_rec.delivery_detail_id;
5393         l_dd_id_tab(l_dd_id_tab.count + 1) := p_line_cont_rec.delivery_detail_id;
5394       END IF;
5395       --dbms_output.put_line('l_tmp_split_qty '||l_tmp_split_qty||' l_split_qty '||l_split_qty);
5396 
5397       -- Insert the new container into empty PL/SQL cont table only if l_tmp_split_qty > l_split_qty
5398       -- Otherwise Container is full
5399       IF ((l_tmp_split_qty - l_split_qty) > 0) THEN
5400         -- l_tmp_split_qty > l_split_qty means container is not full and
5401         -- we need to calculate how much empty space is left
5402         IF (g_empty_cont_tab.COUNT = 0) THEN
5403           j := 1;
5404         ELSE
5405           j:= g_empty_cont_tab.LAST + 1;
5406         END IF;
5407         --g_empty_cont_tab(j).container_index   := g_new_cont_index;
5408 -- changed this part
5409         g_empty_cont_tab(j).container_index   := g_new_cont_index + 1;
5410         g_empty_cont_tab(j).container_item_id := p_line_cont_rec.preferred_container;
5411         g_empty_cont_tab(j).organization_id   := p_line_cont_rec.organization_id;
5412         g_empty_cont_tab(j).group_id          := p_line_cont_rec.group_id;
5413         g_empty_cont_tab(j).mast_cont_item_id := p_line_cont_rec.master_cont_item_id;
5414 
5415         -- Calculate Empty Space
5416         IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
5417           g_empty_cont_tab(j).numerator   := l_max_load_qty - l_split_qty;
5418           g_empty_cont_tab(j).denominator := l_max_load_qty;
5419           --dbms_output.put_line('Inserted Container '||j||' with numerator '||g_empty_cont_tab(j).numerator||' and denominator '||g_empty_cont_tab(j).denominator);
5420         ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
5421           g_empty_cont_tab(j).empty             := l_mtl_max_load - (l_split_qty * l_weight_per_pc);
5422           --dbms_output.put_line('Inserted Container '||j||' with empty weight '||g_empty_cont_tab(j).empty||' into empty cont');
5423         ELSE
5424           g_empty_cont_tab(j).empty             := l_mtl_max_vol - ROUND(l_split_qty * l_volume_per_pc,LIMITED_PRECISION);
5425           --dbms_output.put_line('Inserted Container '||j||' with empty volume '||g_empty_cont_tab(j).empty||' into empty cont');
5426         END IF;
5427       END IF;
5428 
5429       -- Calculate distributed wt/vol for the new dd
5430       l_tot_gross_wt  := ROUND((l_split_qty * p_line_cont_rec.gross_weight)/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
5431       l_tot_net_wt    := ROUND((l_split_qty * p_line_cont_rec.net_weight)/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
5432       l_tot_vol       := ROUND((l_split_qty * p_line_cont_rec.volume)/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
5433 --dbms_output.put_line('l_tot_vol '||l_tot_vol||' l_dd_vol_left '||l_dd_vol_left);
5434 
5435       -- Assign the split dd/existing dd
5436 -- changed the call to populate the PL SQL table
5437 
5438       IF l_dd_id_tab.count > 0 THEN
5439         FOR j in 1..l_dd_id_tab.count
5440         LOOP
5441           IF l_count_container > 0 THEN
5442             l_count_container := l_count_container + 1;
5443             g_new_container_tab(g_num_cont_index).number_of_containers := l_count_container;
5444             g_new_cont_index := g_new_cont_index + 1;
5445           ELSE
5446             l_count_container := 1;
5447             g_num_cont_index := g_num_cont_index + 1;
5448             g_new_cont_index := g_new_cont_index + 1;
5449             g_new_container_tab(g_num_cont_index).container_item_id := p_line_cont_rec.preferred_container;
5450             g_new_container_tab(g_num_cont_index).organization_id   := p_line_cont_rec.organization_id;
5451             g_new_container_tab(g_num_cont_index).mast_cont_item_id := p_line_cont_rec.master_cont_item_id;
5452             g_new_container_tab(g_num_cont_index).number_of_containers := l_count_container;
5453 
5454           END IF;
5455 
5456           g_assign_detail_index := g_assign_detail_index + 1;
5457           g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_dd_id_tab(j);
5458           g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5459           g_assign_detail_tab(g_assign_detail_index).container_index    := g_new_cont_index;
5460           g_assign_detail_tab(g_assign_detail_index).gross_weight := l_tot_gross_wt;
5461           g_assign_detail_tab(g_assign_detail_index).net_weight := l_tot_net_wt;
5462           g_assign_detail_tab(g_assign_detail_index).volume := l_tot_vol;
5463           -- J: W/V Changes
5464           g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5465           g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5466           g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5467           -- K LPN CONV. rv
5468           g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5469           g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5470           -- K LPN CONV. rv
5471 
5472           l_quantity_left := l_quantity_left - l_split_qty;
5473           l_dd_gross_wt_left  := l_dd_gross_wt_left - l_tot_gross_wt;
5474           l_dd_net_wt_left  := l_dd_net_wt_left - l_tot_net_wt;
5475           l_dd_vol_left := l_dd_vol_left - l_tot_vol;
5476 
5477         END LOOP;
5478 
5479         l_dd_id_tab.DELETE;
5480 
5481 -- so that this table is not read later,
5482 -- we continue in the LOOP even if qty_left = 1, so in that case
5483 -- should not reach here
5484 
5485 --  commented this and put it in the LOOP above
5486 --         l_quantity_left := GREATEST(l_quantity_left - (FLOOR(l_quantity_left/l_split_qty) *l_split_qty),0);
5487       ELSE
5488         g_assign_detail_index := g_assign_detail_index + 1;
5489         g_new_cont_index := g_new_cont_index + 1;
5490         g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_split_del_detail_id;
5491         g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5492         g_assign_detail_tab(g_assign_detail_index).container_index    := g_new_cont_index;
5493         g_assign_detail_tab(g_assign_detail_index).gross_weight := l_tot_gross_wt;
5494         g_assign_detail_tab(g_assign_detail_index).net_weight := l_tot_net_wt;
5495         g_assign_detail_tab(g_assign_detail_index).volume := l_tot_vol;
5496         -- J: W/V Changes
5497         g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5498         g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5499         g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5500         -- K LPN CONV. rv
5501         g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5502         g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5503         -- K LPN CONV. rv
5504       --dbms_output.put_line('Assigning '||g_assign_detail_tab(g_assign_detail_index).delivery_detail_id||' to Cont index '||g_assign_detail_tab(g_assign_detail_index).container_index);
5505 
5506         l_quantity_left := l_quantity_left - l_split_qty;
5507 
5508       END IF;
5509 
5510 
5511       -- If there is no more qty left, then adjust any wt/vol left on last dd
5512       IF (l_quantity_left <= 0) THEN
5513         --dbms_output.put_line('Assigning the left over Weight');
5514         g_assign_detail_tab(g_assign_detail_index).gross_weight := g_assign_detail_tab(g_assign_detail_index).gross_weight + l_dd_gross_wt_left;
5515         g_assign_detail_tab(g_assign_detail_index).net_weight := g_assign_detail_tab(g_assign_detail_index).net_weight + l_dd_net_wt_left;
5516         g_assign_detail_tab(g_assign_detail_index).volume := g_assign_detail_tab(g_assign_detail_index).volume + l_dd_vol_left;
5517       END IF;
5518       --dbms_output.put_line('l_quantity_left '||l_quantity_left);
5519 
5520     END LOOP;
5521 
5522 --dbms_output.put_line('End of Pack DD, Count is '||l_count_container||to_char(sysdate,'HH24:MI:SS'));
5523 
5524   END IF;
5525   x_return_status := C_SUCCESS_STATUS;
5526   --
5527   IF l_debug_on THEN
5528       WSH_DEBUG_SV.pop(l_module_name);
5529   END IF;
5530   --
5531   RETURN;
5532 
5533 EXCEPTION
5534   WHEN Others THEN
5535         WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Pack_Delivery_Detail',l_module_name);
5536         x_return_status := C_UNEXP_ERROR_STATUS;
5537 
5538 --
5539 IF l_debug_on THEN
5540     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
5541     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
5542 END IF;
5543 --
5544 END Pack_Delivery_Detail;
5545 
5546 /*
5547 -----------------------------------------------------------------------------
5548    PROCEDURE  : Validate_Dd_for_Pack
5549    PARAMETERS : p_group_id_tab_id - table of group ids for lines that need to
5550 			            be autopacked.
5551 		p_del_detail_tab  - table of delivery detail ids
5552 		x_line_cont_tab   - Delivery Details along with other info
5553 			            which passed validations
5554 		x_error_cnt       - Count of errors encountered during validation
5555 		x_warn_cnt        - Count of warnings encountered during validation
5556                 x_fill_pc_warn_cnt - Count of Fill Percent Basis 'None' dds.
5557                 x_fill_pc_warn_cnt - Count of details with Fill Percent Basis 'None'.
5558                 x_release_warn_cnt - Count of 'Released to Warehouse' dds.
5559   DESCRIPTION : This procedure takes a list of delivery details and does all
5560                 validations and returns a list of delivery details which passed
5561                 validations
5562 ------------------------------------------------------------------------------
5563 */
5564 
5565 PROCEDURE Validate_Dd_for_Pack(
5566   p_group_id_tab      IN  WSH_UTIL_CORE.id_tab_type,
5567   p_del_detail_tab    IN  WSH_UTIL_CORE.id_tab_type,
5568   x_line_cont_tab     OUT NOCOPY  wsh_container_actions.line_cont_info_tab,
5569   x_error_cnt         OUT NOCOPY  NUMBER,
5570   x_warn_cnt          OUT NOCOPY  NUMBER,
5571   x_fill_pc_warn_cnt  OUT NOCOPY  NUMBER, -- bug 3562797 jckwok
5572   x_release_warn_cnt  OUT NOCOPY  NUMBER) IS
5573 
5574   CURSOR Get_dd_Detail IS
5575   SELECT wdd.inventory_item_id inventory_item_id,
5576          NVL(wdd.shipped_quantity, NVL(wdd.picked_quantity, wdd.requested_quantity)) packed_quantity,
5577          NVL(wdd.shipped_quantity2, NVL(wdd.picked_quantity2, wdd.requested_quantity2)) packed_quantity2,
5578          NVL(wdd.picked_quantity, wdd.requested_quantity) picked_quantity,
5579          NVL(wdd.picked_quantity2, wdd.requested_quantity2) picked_quantity2,
5580          wdd.requested_quantity_uom requested_quantity_uom,
5581          nvl(wdd.wv_frozen_flag,'Y') wv_frozen_flag,
5582          wdd.gross_weight gross_weight,
5583          wdd.net_weight net_weight,
5584          wdd.weight_uom_code weight_uom_code,
5585          wdd.volume volume,
5586          wdd.volume_uom_code volume_uom_code,
5587          wdd.detail_container_item_id detail_container_item_id,
5588          wdd.master_container_item_id master_container_item_id,
5589          wdd.organization_id organization_id,
5590          wdd.source_line_id source_line_id,
5591          wdd.delivery_detail_id delivery_detail_id,
5592          wdd.released_status,
5593          wdd.source_code,
5594          wda.parent_delivery_detail_id parent_delivery_detail_id,
5595          wda.delivery_id delivery_id, --  added delivery id
5596          msi.indivisible_flag indivisible_flag
5597   FROM   WSH_DELIVERY_DETAILS wdd,
5598          wsh_delivery_assignments_v wda,
5599          MTL_SYSTEM_ITEMS msi,
5600          WSH_TMP wt
5601   WHERE  wdd.delivery_detail_id =  wt.id
5602   AND    wdd.delivery_detail_id = wda.delivery_detail_id
5603   AND    wdd.container_flag     = 'N'
5604   AND    wdd.inventory_item_id  = msi.inventory_item_id
5605   AND    wdd.organization_id    = msi.organization_id
5606   ORDER BY wdd.organization_id,wdd.inventory_item_id,source_line_id;
5607 
5608   CURSOR Get_Cont_Item_Load (v_inv_item_id NUMBER, v_cont_item_id NUMBER, v_organization_id NUMBER) IS
5609   SELECT max_load_quantity
5610   FROM   WSH_CONTAINER_ITEMS
5611   WHERE  load_item_id           = v_inv_item_id
5612   AND    container_item_id      = v_cont_item_id
5613   AND    master_organization_id = v_organization_id;
5614 
5615   line_cont_rec line_cont_info;
5616   line_cont_tab line_cont_info_tab;
5617 
5618   l_dd_count        NUMBER;
5619   l_group_id        NUMBER;
5620   l_wcl_cont_item_id NUMBER;
5621   l_fill_pc_basis   VARCHAR2(1);
5622   l_max_load_qty    NUMBER;
5623   l_item_load_found BOOLEAN;
5624 
5625   l_return_status   VARCHAR2(1);
5626 
5627   l_dd_gross_wt     NUMBER;
5628   l_dd_net_wt       NUMBER;
5629   l_dd_volume       NUMBER;
5630   l_mtl_max_load    NUMBER;
5631   l_mtl_max_vol     NUMBER;
5632   l_mtl_wt_uom      VARCHAR2(3);
5633   l_mtl_vol_uom     VARCHAR2(3);
5634   l_tmp_num_cont    NUMBER;
5635   l_discard_message VARCHAR2(2000);
5636   l_output_qty      NUMBER;
5637   l_process_flag    VARCHAR2(1);
5638   l_last_organization_id NUMBER;
5639   l_error_cnt       NUMBER := 0;
5640 
5641   warn_cnt          NUMBER := 0;
5642   error_cnt         NUMBER := 0;
5643   release_warn_cnt  NUMBER := 0;
5644   fill_pc_warn_cnt  NUMBER := 0; -- bug 3562797 jckwok
5645 --
5646 l_debug_on BOOLEAN;
5647 --
5648 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'VALIDATE_DD_FOR_PACK';
5649 --
5650 
5651 -- HW OPMCONV - New variable to hold item info
5652 l_item_info                   WSH_DELIVERY_DETAILS_INV.mtl_system_items_rec;
5653 -- HW OPM BUG# 3011758
5654 -- HW OPMCONV - Removed opm variables
5655 
5656 -- HW OPMCONV - Renamed variable from lot_indivisible to l_lot_divisible_flag
5657 l_lot_divisible_flag                        VARCHAR2(1);
5658 
5659 -- HW OPMCONV - New variables to hold warnings and errors
5660 l_num_warnings                NUMBER :=0;
5661 l_num_errors                  NUMBER := 0;
5662 x_return_status VARCHAR2(5);
5663 BEGIN
5664 
5665   --dbms_output.put_line('---------------------------');
5666   --dbms_output.put_line('In Validate_Dd_for_Pack ...');
5667   --dbms_output.put_line('---------------------------');
5668 
5669   -- 10. Delete and Bulk Insert into the wsh_tmp table
5670   --
5671   --
5672   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
5673   --
5674   IF l_debug_on IS NULL
5675   THEN
5676       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
5677   END IF;
5678   --
5679   IF l_debug_on THEN
5680       WSH_DEBUG_SV.push(l_module_name);
5681   END IF;
5682   --
5683   DELETE FROM wsh_tmp;
5684 
5685   FORALL i IN 1..p_del_detail_tab.count
5686     INSERT INTO wsh_tmp (id) VALUES(p_del_detail_tab(i));
5687 
5688   -- 20. Populate  detail dd info into line_cont_tab PL/SQL table
5689   l_last_organization_id := NULL;
5690   l_dd_count := 0;
5691 
5692   FOR rec in get_dd_detail
5693   LOOP
5694     --dbms_output.put_line('Processing dd '||rec.delivery_detail_id||' Org '||rec.organization_id);
5695 
5696     -- 20.10 Delete Organization Specfic Cached Tables if organization_id changes
5697     IF ((l_last_organization_id IS NULL) OR (rec.organization_id <> l_last_organization_id)) THEN
5698       g_cache_cont_load_info_tab.DELETE;
5699       g_cont_msi_tab.DELETE;
5700 
5701       l_last_organization_id := rec.organization_id;
5702     END IF;
5703 
5704 
5705     /* grouping API will return a number = negative delivery_id if the line is
5706        already assigned to a delivery. So, check for negative numbers and if number
5707        < 0, then convert it to a postive number = delivery_id.
5708     */
5709     l_group_id := ABS(p_group_id_tab(rec.delivery_detail_id));
5710     --dbms_output.put_line('l_group_id '||l_group_id);
5711 
5712     -- 20.12 Populate line_cont_tab PL/SQL table now
5713     IF ((rec.packed_quantity <> 0) AND (rec.released_status NOT IN ('C','D'))) THEN
5714       line_cont_rec.group_id            := l_group_id;
5715       line_cont_rec.delivery_detail_id  := rec.delivery_detail_id;
5716       line_cont_rec.inventory_item_id   := rec.inventory_item_id;
5717       line_cont_rec.shp_qty             := rec.packed_quantity;
5718       line_cont_rec.shp_qty2            := rec.packed_quantity2;
5719       line_cont_rec.req_qty             := rec.picked_quantity;
5720       line_cont_rec.req_qty2            := rec.picked_quantity2;
5721       line_cont_rec.req_qty_uom         := rec.requested_quantity_uom;
5722       line_cont_rec.detail_cont_item_id := rec.detail_container_item_id;
5723       line_cont_rec.master_cont_item_id := rec.master_container_item_id;
5724       line_cont_rec.gross_weight        := rec.gross_weight;
5725       line_cont_rec.net_weight          := rec.net_weight;
5726       line_cont_rec.weight_uom          := rec.weight_uom_code;
5727       line_cont_rec.volume              := rec.volume;
5728       line_cont_rec.volume_uom          := rec.volume_uom_code;
5729       line_cont_rec.organization_id     := rec.organization_id;
5730       line_cont_rec.source_line_id      := rec.source_line_id;
5731       line_cont_rec.indivisible_flag    := rec.indivisible_flag;
5732       line_cont_rec.delivery_id         := rec.delivery_id;
5733     ELSE
5734       goto next_detail;
5735     END IF;
5736 
5737     -- 20.20 Check if the detail is already packed
5738     IF (rec.parent_delivery_detail_id IS NOT NULL) THEN
5739       --dbms_output.put_line('Warning: dd already packed');
5740       warn_cnt := warn_cnt + 1;
5741       goto next_detail;
5742     END IF;
5743 
5744     -- 20.30 Ignore dds with status 'Released to Warehouse'
5745     IF (rec.released_status = 'S') THEN
5746       release_warn_cnt := release_warn_cnt + 1;
5747       goto next_detail;
5748     END IF;
5749 
5750      --dbms_output.put_line('Before calc_fill_basis');
5751 
5752     -- 20.40 Determine Fill PC Basis from shipping parameters and Process Flag
5753     Calc_Fill_Basis_and_Proc_Flag(
5754       p_organization_id => rec.organization_id,
5755       x_return_status   => l_return_status,
5756       x_fill_basis      => l_fill_pc_basis,
5757       x_process_flag    => l_process_flag);
5758 
5759 
5760     IF (l_return_status <> C_SUCCESS_STATUS) THEN
5761       error_cnt := error_cnt + 1;
5762       goto next_detail;
5763     END IF;
5764     --
5765     -- bug 3562797 jckwok  - Ignore dds with 'Shipping Parameter' percent fill basis as None.
5766     -- Increment fill_pc_warn_cnt so that the caller know how many had fill basis of None.
5767     --
5768     IF (l_fill_pc_basis = 'N') THEN
5769       fill_pc_warn_cnt := fill_pc_warn_cnt + 1;
5770       goto next_detail;
5771     END IF;
5772     -- end bug
5773 
5774     line_cont_rec.fill_pc_basis := l_fill_pc_basis;
5775 -- HW OPMCONV - No need to populate this value
5776 --  line_cont_rec.process_flag  := l_process_flag;
5777 
5778 -- HW OPM BUG#:3011758 Retrieve OPM item information
5779 -- HW OPMCONV - 1)Change the call from OPM API to get item info
5780 --                to a new WSH API
5781 --            - 2) Remove checking for process
5782 
5783     WSH_DELIVERY_DETAILS_INV.Get_item_information
5784           (
5785                p_organization_id       => rec.organization_id
5786               , p_inventory_item_id    => rec.inventory_item_id
5787               , x_mtl_system_items_rec => l_item_info
5788               , x_return_status        => l_return_status
5789             );
5790 
5791 
5792      IF l_debug_on THEN
5793       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5794     END IF;
5795 
5796      wsh_util_core.api_post_call
5797       (
5798         p_return_status => l_return_status,
5799         x_num_warnings  => l_num_warnings,
5800         x_num_errors    => l_num_errors
5801       );
5802 
5803      IF (  l_item_info.lot_divisible_flag = 'N' AND
5804            l_item_info.lot_control_code= 2) THEN
5805          line_cont_rec.lot_divisible_flag := 'N';
5806      ELSE
5807          line_cont_rec.lot_divisible_flag := 'Y';
5808      END IF;
5809 
5810 
5811 -- HW OPMCONV - No need to check for process_flag. Removed OR condition
5812     IF (line_cont_rec.fill_pc_basis IS NULL) THEN
5813       --dbms_output.put_line('Skipping dd');
5814 
5815       goto next_detail;
5816     END IF;
5817 
5818     -- 20.50 Determine Preferred Container
5819     line_cont_rec.preferred_container := nvl(rec.detail_container_item_id,rec.master_container_item_id);
5820     line_cont_rec.max_load_qty := NULL;
5821 
5822      --dbms_output.put_line('Before calc_pref_cont');
5823 
5824     IF (line_cont_rec.preferred_container IS NULL) THEN
5825 
5826       Calc_Pref_Container(
5827         p_organization_id   => rec.organization_id,
5828         p_inventory_item_id => rec.inventory_item_id,
5829         p_fill_pc_basis     => line_cont_rec.fill_pc_basis,
5830         x_return_status     => l_return_status,
5831         x_error_cnt         => l_error_cnt,
5832         x_cont_item_id      => l_wcl_cont_item_id,
5833         x_max_load_qty      => l_max_load_qty);
5834 
5835       IF l_debug_on THEN
5836         WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5837       END IF;
5838 
5839       IF (l_return_status = C_ERROR_STATUS) THEN
5840         error_cnt := error_cnt + l_error_cnt;
5841       END IF;
5842 
5843       line_cont_rec.preferred_container := l_wcl_cont_item_id;
5844       line_cont_rec.max_load_qty        := l_max_load_qty;
5845     END IF;
5846 
5847     -- bug 3440811
5848     validate_container(
5849       p_organization_id  => rec.organization_id,
5850       p_cont_item_id     => line_cont_rec.preferred_container,
5851       x_return_status    => l_return_status);
5852 
5853     IF (l_return_status IN (C_UNEXP_ERROR_STATUS,C_ERROR_STATUS)) THEN
5854         line_cont_rec.preferred_container := null;
5855         line_cont_rec.max_load_qty := null;
5856         l_error_cnt := l_error_cnt + 1;
5857         error_cnt := error_cnt + l_error_cnt;
5858     END IF;
5859     -- bug 3440811
5860 
5861 
5862     IF (line_cont_rec.preferred_container is NULL) THEN
5863       --dbms_output.put_line('Skipping dd');
5864       goto next_detail;
5865     END IF;
5866 
5867 
5868     -- 20.60 Calculate Max Load/Converted wt/Converted Vol depending on fill basis
5869     line_cont_rec.converted_wt := NULL;
5870     line_cont_rec.converted_vol := NULL;
5871 
5872      --dbms_output.put_line('FILL BASIS'||line_cont_rec.fill_pc_basis||line_cont_rec.max_load_qty);
5873     IF (line_cont_rec.fill_pc_basis = 'Q') THEN
5874       IF (line_cont_rec.max_load_qty IS NULL) THEN
5875         OPEN Get_Cont_Item_Load (rec.inventory_item_id,line_cont_rec.preferred_container, rec.organization_id);
5876 
5877         FETCH Get_Cont_Item_Load
5878         INTO  l_max_load_qty;
5879 
5880         l_item_load_found := FALSE;
5881         IF Get_Cont_Item_Load%NOTFOUND THEN
5882           l_item_load_found := TRUE;
5883         END IF;
5884         CLOSE Get_Cont_Item_Load;
5885 
5886         IF (l_item_load_found) THEN
5887           --dbms_output.put_line('Could not find max load qty for Item '||rec.inventory_item_id||' Cont '||line_cont_rec.preferred_container||' Org '||rec.organization_id);
5888 
5889           -- Calculate max load qty depending on Weight/Volume
5890           IF (rec.net_weight IS NULL OR rec.volume IS NULL) THEN
5891             --
5892             IF rec.wv_frozen_flag = 'N' THEN
5893 
5894               IF l_debug_on THEN
5895                   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DETAIL_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
5896               END IF;
5897               --
5898               WSH_WV_UTILS.Detail_Weight_Volume(
5899                    p_delivery_detail_id => rec.delivery_detail_id,
5900                    -- J: W/V Changes
5901                    p_update_flag        => 'Y',
5902                    p_post_process_flag  => 'Y',
5903                    p_calc_wv_if_frozen  => 'N',
5904                    x_net_weight         => l_dd_net_wt,
5905                    x_volume             => l_dd_volume ,
5906                    x_return_status      => l_return_status);
5907               IF l_debug_on THEN
5908                 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5909               END IF;
5910 
5911               IF (l_return_status <> C_SUCCESS_STATUS) THEN
5912                 --dbms_output.put_line('WSH_WV_UTILS.Detail_Weight_Volume did not return success');
5913                 FND_MESSAGE.SET_NAME('WSH','WSH_DET_WT_VOL_FAILED');
5914                 FND_MESSAGE.SET_TOKEN('DETAIL_ID',rec.delivery_detail_id);
5915                 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
5916                 error_cnt := error_cnt + 1;
5917                 --dbms_output.put_line('Skipping this dd');
5918                 goto next_detail;
5919               END IF;
5920 
5921               rec.gross_weight := NVL(rec.gross_weight,l_dd_net_wt);
5922               rec.net_weight   := NVL(rec.net_weight,l_dd_net_wt);
5923               rec.volume       := NVL(rec.volume,l_dd_volume);
5924 
5925             END IF;
5926 
5927             IF ((NVL(rec.net_weight,0) = 0) OR
5928                 (NVL(rec.volume,0) = 0)) THEN
5929               --dbms_output.put_line('Weight or Volume is NULL or 0');
5930               FND_MESSAGE.SET_NAME('WSH', 'WSH_NULL_WEIGHT_VOLUME');
5931               FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL', rec.delivery_detail_id);
5932               WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5933               error_cnt := error_cnt + 1;
5934               --dbms_output.put_line('Skipping this dd');
5935               goto next_detail;
5936             END IF;
5937           END IF;
5938 
5939 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 4');
5940           Get_Cont_Load_Vol_info(
5941              p_container_item_id => line_cont_rec.preferred_container,
5942              p_organization_id   => line_cont_rec.organization_id,
5943              p_w_v_both          => 'B',
5944              x_max_load          => l_mtl_max_load,
5945              x_max_vol           => l_mtl_max_vol,
5946              x_wt_uom            => l_mtl_wt_uom,
5947              x_vol_uom           => l_mtl_vol_uom,
5948              x_return_status     => l_return_status,
5949              x_error_cnt         => l_error_cnt);
5950 
5951           IF l_debug_on THEN
5952             WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5953           END IF;
5954           IF (l_return_status IN (C_ERROR_STATUS,C_UNEXP_ERROR_STATUS)
5955               ) THEN
5956             error_cnt := error_cnt + l_error_cnt;
5957           END IF;
5958 
5959 -- Bug 2786021
5960           IF (nvl(l_mtl_max_load,0) = 0) OR
5961              (nvl(l_mtl_max_vol,0) = 0) THEN
5962             IF l_debug_on THEN
5963               WSH_DEBUG_SV.log(l_module_name,'fill pc is Q,but use Wt or Vol');
5964               WSH_DEBUG_SV.log(l_module_name,'Wt-'||l_mtl_max_load);
5965               WSH_DEBUG_SV.log(l_module_name,'Vol-'||l_mtl_max_vol);
5966             END IF;
5967             FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_MAX_WT_ERROR');
5968             WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5969             error_cnt := error_cnt + l_error_cnt;
5970             goto next_detail;
5971           END IF;
5972 -- Bug 2786021
5973 
5974           IF ((NVL(l_mtl_max_load,0) <= 0) OR (NVL(l_mtl_max_vol,0) <= 0)) THEN
5975             --dbms_output.put_line('Skipping this dd');
5976             goto next_detail;
5977           END IF;
5978 
5979           IF (l_mtl_wt_uom <> rec.weight_uom_code) THEN
5980             --
5981             IF l_debug_on THEN
5982                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
5983             END IF;
5984             --
5985             l_dd_gross_wt := WSH_WV_UTILS.Convert_Uom (
5986                                   from_uom => rec.weight_uom_code,
5987                                   to_uom   => l_mtl_wt_uom,
5988                                   quantity => rec.gross_weight,
5989                                   item_id  => rec.inventory_item_id);
5990           ELSE
5991             l_dd_gross_wt := rec.gross_weight;
5992           END IF;
5993 
5994           IF (l_mtl_vol_uom <> rec.volume_uom_code) THEN
5995             --
5996             IF l_debug_on THEN
5997                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
5998             END IF;
5999             --
6000             l_dd_volume :=  WSH_WV_UTILS.Convert_Uom (
6001                                   from_uom => rec.volume_uom_code,
6002                                   to_uom   => l_mtl_vol_uom,
6003                                   quantity => rec.volume,
6004                                   item_id  => rec.inventory_item_id);
6005           ELSE
6006             l_dd_volume:= rec.volume;
6007           END IF;
6008 
6009           IF ((l_dd_gross_wt/l_mtl_max_load) >= (l_dd_volume/l_mtl_max_vol)) THEN
6010             l_max_load_qty := (l_dd_gross_wt/l_mtl_max_load);
6011           ELSE
6012             l_max_load_qty := (l_dd_volume/l_mtl_max_vol);
6013           END IF;
6014           --dbms_output.put_line('l_dd_gross_wt '||l_dd_gross_wt||' l_dd_volume '||l_dd_volume ||' l_mtl_max_load '||l_mtl_max_load||' l_mtl_max_vol '||l_mtl_max_vol || ' l_max_load_qty '||l_max_load_qty);
6015 
6016           --
6017           IF l_debug_on THEN
6018               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
6019           END IF;
6020           --
6021           WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
6022                       p_item_id         => rec.inventory_item_id,
6023                       p_organization_id => rec.organization_id,
6024                       p_input_quantity  => ROUND((rec.packed_quantity/l_max_load_qty),LIMITED_PRECISION),
6025                       p_uom_code        => rec.requested_quantity_uom,
6026                       x_output_quantity => l_output_qty,
6027                       x_return_status   => l_return_status);
6028 
6029           IF l_debug_on THEN
6030             WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6031           END IF;
6032           IF l_return_status <> C_SUCCESS_STATUS THEN
6033             --dbms_output.put_line('WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity returned '||l_return_status);
6034             l_discard_message := FND_MESSAGE.GET;
6035             l_tmp_num_cont := FLOOR(rec.packed_quantity/l_max_load_qty);
6036 
6037             IF (l_tmp_num_cont = 0) THEN
6038               FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
6039               WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6040               error_cnt := error_cnt + 1;
6041               goto next_detail;
6042             ELSE
6043               --l_max_load_qty := (rec.packed_quantity/l_tmp_num_cont);
6044               l_max_load_qty := l_tmp_num_cont;
6045             END IF;
6046           ELSE
6047             l_max_load_qty := ROUND((rec.packed_quantity/l_max_load_qty),LIMITED_PRECISION);
6048           END IF;
6049         END IF; -- l_item_load_found
6050         line_cont_rec.max_load_qty := l_max_load_qty;
6051 
6052         IF (NVL(line_cont_rec.max_load_qty,0) <= 0) THEN
6053           --dbms_output.put_line('Max Load Qty is NULL or <= 0. Skipping this dd');
6054           FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
6055           WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6056           error_cnt := error_cnt + 1;
6057           goto next_detail;
6058         END IF;
6059 
6060       END IF; -- line_cont_rec.max_load_qty IS NULL
6061       --dbms_output.put_line('line_cont_rec.max_load_qty '||line_cont_rec.max_load_qty);
6062 
6063     ELSIF (line_cont_rec.fill_pc_basis in ('W','V')) THEN
6064       -- Calculate max load qty depending on Weight/Volume
6065       IF ((rec.gross_weight IS NULL AND line_cont_rec.fill_pc_basis = 'W') OR
6066           (rec.volume IS NULL) AND (line_cont_rec.fill_pc_basis = 'V')) THEN
6067         --
6068         IF rec.wv_frozen_flag = 'N' THEN
6069 
6070           IF l_debug_on THEN
6071               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DETAIL_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
6072           END IF;
6073           --
6074           WSH_WV_UTILS.Detail_Weight_Volume(
6075                p_delivery_detail_id => rec.delivery_detail_id,
6076                -- J: W/V Changes
6077                p_update_flag        => 'Y',
6078                p_post_process_flag  => 'Y',
6079                p_calc_wv_if_frozen  => 'N',
6080                x_net_weight         => l_dd_net_wt,
6081                x_volume             => l_dd_volume ,
6082                x_return_status      => l_return_status);
6083 
6084           IF l_debug_on THEN
6085             WSH_DEBUG_SV.log(l_module_name,'return status -,wt,vol',l_return_status||l_dd_net_wt||','||l_dd_volume);
6086           END IF;
6087 
6088           IF (l_return_status <> C_SUCCESS_STATUS) THEN
6089             --dbms_output.put_line('WSH_WV_UTILS.Detail_Weight_Volume did not return success');
6090             FND_MESSAGE.SET_NAME('WSH','WSH_DET_WT_VOL_FAILED');
6091             FND_MESSAGE.SET_TOKEN('DETAIL_ID',rec.delivery_detail_id);
6092             WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6093             error_cnt := error_cnt + 1;
6094             --dbms_output.put_line('Skipping this dd');
6095             goto next_detail;
6096           END IF;
6097 
6098           IF (line_cont_rec.fill_pc_basis = 'W') THEN
6099             rec.gross_weight := NVL(rec.gross_weight,l_dd_net_wt);
6100             rec.net_weight   := NVL(rec.net_weight,l_dd_net_wt);
6101           ELSE
6102             rec.volume := NVL(rec.volume,l_dd_volume);
6103           END IF;
6104 
6105         END IF;
6106 
6107         IF (line_cont_rec.fill_pc_basis = 'W') THEN
6108 
6109           IF (NVL(rec.gross_weight,0) = 0) THEN
6110             --dbms_output.put_line('Weight is NULL or 0');
6111             FND_MESSAGE.SET_NAME('WSH', 'WSH_NULL_WEIGHT_VOLUME');
6112             FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL', rec.delivery_detail_id);
6113             WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6114             error_cnt := error_cnt + 1;
6115             --dbms_output.put_line('Skipping this dd');
6116             goto next_detail;
6117           END IF;
6118         ELSE
6119 
6120           IF (NVL(rec.volume,0) = 0) THEN
6121             --dbms_output.put_line('Volume is NULL or 0');
6122             FND_MESSAGE.SET_NAME('WSH', 'WSH_NULL_WEIGHT_VOLUME');
6123             FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL', rec.delivery_detail_id);
6124             WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6125             error_cnt := error_cnt + 1;
6126             --dbms_output.put_line('Skipping this dd');
6127             goto next_detail;
6128           END IF;
6129         END IF;
6130 
6131       END IF;
6132 
6133 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 3');
6134       Get_Cont_Load_Vol_info(
6135          p_container_item_id => line_cont_rec.preferred_container,
6136          p_organization_id   => line_cont_rec.organization_id,
6137          p_w_v_both          => line_cont_rec.fill_pc_basis,
6138          x_max_load          => l_mtl_max_load,
6139          x_max_vol           => l_mtl_max_vol,
6140          x_wt_uom            => l_mtl_wt_uom,
6141          x_vol_uom           => l_mtl_vol_uom,
6142          x_return_status     => l_return_status,
6143          x_error_cnt         => l_error_cnt);
6144 
6145       IF l_debug_on THEN
6146         WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6147       END IF;
6148       IF (l_return_status = C_ERROR_STATUS) THEN
6149         error_cnt := error_cnt + l_error_cnt;
6150       END IF;
6151 
6152       IF (line_cont_rec.fill_pc_basis = 'W') THEN
6153         IF (NVL(l_mtl_max_load,0) <= 0) THEN
6154           --dbms_output.put_line('Skipping this dd');
6155           goto next_detail;
6156          END IF;
6157 
6158         line_cont_rec.cont_wt := l_mtl_max_load;
6159 
6160         IF (l_mtl_wt_uom <> rec.weight_uom_code) THEN
6161           --
6162           IF l_debug_on THEN
6163               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
6164           END IF;
6165           --
6166           l_dd_gross_wt :=  WSH_WV_UTILS.Convert_Uom (
6167                                 from_uom => rec.weight_uom_code,
6168                                 to_uom   => l_mtl_wt_uom,
6169                                 quantity => rec.gross_weight,
6170                                 item_id  => rec.inventory_item_id);
6171         ELSE
6172           l_dd_gross_wt := rec.gross_weight;
6173         END IF;
6174         line_cont_rec.converted_wt := l_dd_gross_wt;
6175         --dbms_output.put_line('line_cont_rec.converted_wt '||line_cont_rec.converted_wt);
6176       ELSE
6177         IF (NVL(l_mtl_max_vol,0) <= 0) THEN
6178           --dbms_output.put_line('Skipping this dd');
6179           goto next_detail;
6180          END IF;
6181 
6182         line_cont_rec.cont_vol := l_mtl_max_vol;
6183 
6184         IF (l_mtl_vol_uom <> rec.volume_uom_code) THEN
6185           --
6186           IF l_debug_on THEN
6187               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
6188           END IF;
6189           --
6190           l_dd_volume :=  WSH_WV_UTILS.Convert_Uom (
6191                                 from_uom => rec.volume_uom_code,
6192                                 to_uom   => l_mtl_vol_uom,
6193                                 quantity => rec.volume,
6194                                 item_id  => rec.inventory_item_id);
6195         ELSE
6196           l_dd_volume := rec.volume;
6197         END IF;
6198         line_cont_rec.converted_vol := l_dd_volume;
6199         --dbms_output.put_line('line_cont_rec.converted_vol '||line_cont_rec.converted_vol);
6200       END IF;
6201 
6202       -- Check if the container can hold atleast 1 piece if the item is indivisible
6203       IF (line_cont_rec.indivisible_flag = 'Y' AND
6204           ((line_cont_rec.fill_pc_basis = 'W' AND ((line_cont_rec.converted_wt/line_cont_rec.shp_qty) > l_mtl_max_load)) OR
6205            (line_cont_rec.fill_pc_basis = 'V' AND ((line_cont_rec.converted_vol/line_cont_rec.shp_qty) > l_mtl_max_vol)))) THEN
6206         --dbms_output.put_line('Indivisible flag is Y and Preferred Cont cannot hold atleast 1 piece');
6207 	-- Bug#: 2503937 - New Error Message
6208         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_VOL_ERROR');
6209         WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6210         error_cnt := error_cnt + 1;
6211         --dbms_output.put_line('Skipping this dd');
6212         goto next_detail;
6213       END IF;
6214 
6215     END IF;
6216 
6217 
6218 
6219 -- HW OPM BUG#: 3011758 For debugging purposes.
6220 -- HW OPMCONV - 1) Removed all GMI print msgs
6221 
6222 -- HW OPM BUG#:3011758 Check if OPM lot indivisible and check percent fill basis
6223 -- If 'Q', compare the delivery line qty shipped against the max_load
6224 -- If 'W, compare the delivery line net weight against the container's net weight
6225 -- If 'V', compare the delivery line volume against the container's volume
6226 -- If any of the above exceeds the max allowed, an error is raised
6227 -- because it will not fit into the container without splitting
6228 -- OPM item that are lot indivisible should not split
6229 
6230 -- HW OPMCONV - 1) Renamed lot_divisible_flag
6231 --            - 2) Changed checking value of visible flag from 1 to 'N'
6232    IF ( line_cont_rec.lot_divisible_flag = 'N' AND
6233         ((line_cont_rec.fill_pc_basis = 'Q' AND (line_cont_rec.shp_qty  > line_cont_rec.max_load_qty ))
6234       OR (line_cont_rec.fill_pc_basis = 'W' AND (l_dd_gross_wt > line_cont_rec.cont_wt) )
6235       OR (line_cont_rec.fill_pc_basis = 'V' AND (l_dd_volume> line_cont_rec.cont_vol) ) ) ) THEN
6236 
6237         FND_MESSAGE.SET_NAME('WSH','WSH_OPM_IND_SPLIT_PACK');
6238         FND_MESSAGE.SET_TOKEN('DETAIL_ID',rec.delivery_detail_id);
6239         l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6240         WSH_UTIL_CORE.Add_Message(l_return_status);
6241         error_cnt := error_cnt + 1;
6242         goto next_detail;
6243     END IF;-- end of 3011758
6244 
6245     -- 20.70 Do Credit Check
6246     --dbms_output.put_line('Doing Credit Check');
6247     --
6248     IF l_debug_on THEN
6249         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_CREDIT_HOLDS',WSH_DEBUG_SV.C_PROC_LEVEL);
6250     END IF;
6251     --
6252     WSH_DETAILS_VALIDATIONS.Check_Credit_Holds (
6253              p_detail_id        => rec.delivery_detail_id,
6254              p_activity_type    => 'PACK',
6255              p_source_line_id   => NULL,
6256              p_source_header_id => NULL,
6257              p_source_code      => rec.source_code,
6258              p_init_flag        => 'Y',
6259              x_return_status    => l_return_status);
6260 
6261     IF l_debug_on THEN
6262       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6263     END IF;
6264 -- Bug 2847515
6265 -- Error was being treated as warning
6266     IF l_return_status <> C_SUCCESS_STATUS THEN
6267       IF l_return_status IN (C_ERROR_STATUS,C_UNEXP_ERROR_STATUS) THEN
6268         error_cnt := error_cnt + 1;
6269       ELSIF l_return_status = C_WARNING_STATUS THEN
6270       --dbms_output.put_line('Credit Check Failed. Warning: Skipping dd');
6271         warn_cnt := warn_cnt + 1;
6272       END IF;
6273       goto next_detail;
6274     END IF;
6275 
6276     l_dd_count := l_dd_count + 1;
6277     line_cont_tab(l_dd_count) := line_cont_rec;
6278 
6279     <<next_detail>>
6280       null;
6281 
6282   END LOOP;
6283 
6284   DELETE FROM wsh_tmp;
6285 
6286   x_error_cnt        := error_cnt;
6287   x_warn_cnt         := warn_cnt;
6288   x_fill_pc_warn_cnt := fill_pc_warn_cnt; -- bug 3562797 jckwok
6289   x_release_warn_cnt := release_warn_cnt;
6290   x_line_cont_tab    := line_cont_tab;
6291 
6292   --dbms_output.put_line('Exiting Validate_Dd_for_Pack');
6293 
6294   --
6295   IF l_debug_on THEN
6296     WSH_DEBUG_SV.log(l_module_name,'p_del_detail_tab count->'||p_del_detail_tab.count||' x_line_cont_tab count->'||x_line_cont_tab.count);
6297     WSH_DEBUG_SV.log(l_module_name,'Error Count '|| x_error_cnt||' Warning Count '|| x_warn_cnt||' Release Warn Count '|| x_release_warn_cnt);
6298     WSH_DEBUG_SV.pop(l_module_name);
6299   END IF;
6300   --
6301   RETURN;
6302 
6303 --
6304 IF l_debug_on THEN
6305     WSH_DEBUG_SV.pop(l_module_name);
6306 END IF;
6307 --
6308 EXCEPTION
6309   WHEN Others THEN
6310     IF (Get_dd_Detail%ISOPEN) THEN
6311       CLOSE Get_dd_Detail;
6312     END IF;
6313     IF (Get_Cont_Item_Load%ISOPEN) THEN
6314       CLOSE Get_Cont_Item_Load;
6315     END IF;
6316     WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Validate_Dd_For_Pack',l_module_name);
6317     --
6318     IF l_debug_on THEN
6319         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
6320         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
6321     END IF;
6322     --
6323     raise;
6324 
6325 --
6326 IF l_debug_on THEN
6327     WSH_DEBUG_SV.pop(l_module_name);
6328 END IF;
6329 --
6330 END Validate_Dd_For_Pack;
6331 
6332 
6333 /*
6334 -----------------------------------------------------------------------------
6335    PROCEDURE  : Auto_Pack_Lines
6336    PARAMETERS : p_group_id_tab_id - table of group ids for lines that need to
6337 			be autopacked.
6338 		p_del_detail_tab - table of delivery detail ids
6339 		p_pack_cont_flag - 'Y' or 'N' to determine whether to try and
6340 			autopack the detail containers into master containers.
6341 		x_cont_instance_id - table of container instance ids that were
6342 			created during the autopacking.
6343 		x_pack_status - indicates whether containers overpacked or not
6344 		x_return_status - return status of API.
6345   DESCRIPTION : This procedure takes the number of lines and groups them by
6346 		common grouping attributes - similar to grouping attributes of
6347 		delivery.  If a group id table is specified it uses the
6348 		group ids in the table to decided which lines can be grouped
6349 		into the same container. If a group id table is not specified,
6350 		it creates the group id table before autopacking. It creates
6351 		the required number and type of containers per line and keeps
6352 		track of all partially filled containers in the empty
6353 		containers table. Before creating new container instances, it
6354 		searches for available space using the empty container table
6355 		and after filling up a container, it creates a new one if
6356 		there are no empty containers of the same type.
6357 ------------------------------------------------------------------------------
6358 */
6359 
6360 PROCEDURE Auto_Pack_Lines (
6361   p_group_id_tab      IN     WSH_UTIL_CORE.id_tab_type,
6362   p_del_detail_tab    IN     WSH_UTIL_CORE.id_tab_type,
6363   p_pack_cont_flag    IN     VARCHAR2,
6364   x_cont_instance_tab IN OUT NOCOPY  WSH_UTIL_CORE.id_tab_type,
6365   x_return_status     OUT NOCOPY     VARCHAR2) IS
6366 
6367    CURSOR c_get_attributes(v_delivery_detail_id IN NUMBER) IS
6368     SELECT customer_id,ship_to_location_id,
6369            intmed_ship_to_location_id,
6370            fob_code,freight_terms_code,ship_method_code,
6371            mode_of_transport, carrier_id, service_level,
6372            deliver_to_location_id,
6373            NVL(line_direction,'O') line_direction,   -- J-IB-NPARIKH
6374            shipping_control,    -- J-IB-NPARIKH
6375            NVL(ignore_for_planning,'N') ignore_for_planning,
6376            client_id  -- LSP PROJECT
6377       FROM wsh_delivery_details
6378      WHERE delivery_detail_id = v_delivery_detail_id;
6379 
6380    -- OTM R12 : assign delivery detail
6381    CURSOR c_get_tare_weight(v_detail_id NUMBER) IS
6382    SELECT nvl(unit_weight, 0)
6383      FROM wsh_delivery_details
6384     WHERE delivery_detail_id = v_detail_id;
6385 
6386    CURSOR c_get_plan_and_tms_flag(v_delivery_id NUMBER) IS
6387    SELECT nvl(ignore_for_planning, 'N'),
6388           nvl(tms_interface_flag, WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT)
6389      FROM wsh_new_deliveries
6390     WHERE delivery_id = v_delivery_id;
6391 
6392    TYPE Boolean_Tab_Type IS TABLE OF BOOLEAN INDEX BY BINARY_INTEGER;
6393 
6394    -- OTM R12 : assign delivery detail
6395 
6396    TYPE tab_varchar IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
6397 
6398    l_tab_cust_id wsh_util_core.id_tab_type;
6399    l_tab_ship_location_id wsh_util_core.id_tab_type;
6400    l_tab_intmed_location_id wsh_util_core.id_tab_type;
6401    l_tab_deliver_location_id wsh_util_core.id_tab_type;
6402    l_tab_carrier_id wsh_util_core.id_tab_type;
6403    l_tab_fob_code tab_varchar;
6404    l_tab_freight_terms_code tab_varchar;
6405    l_tab_ship_method_code tab_varchar;
6406    l_tab_mode_of_transport tab_varchar;
6407    l_tab_service_level tab_varchar;
6408    l_tab_line_direction tab_varchar;
6409    l_tab_shipping_control tab_varchar;
6410    l_tab_ignore_for_planning tab_varchar;
6411    --
6412    l_tab_client_id           wsh_util_core.id_tab_type; -- LSP PROJECT :
6413    --
6414 
6415   line_cont_tab line_cont_info_tab;
6416 
6417   l_group_id_temp_tab    WSH_UTIL_CORE.id_tab_type;
6418   l_group_id_tab    WSH_UTIL_CORE.id_tab_type;
6419   l_del_row_tab     WSH_UTIL_CORE.id_tab_type;
6420   l_mast_cont_tab   WSH_UTIL_CORE.id_tab_type;
6421   l_tmp_detail_tab  WSH_UTIL_CORE.id_tab_type;
6422   l_detail_cont_rec empty_cont_info;
6423   l_detail_cont_tab empty_cont_info_tab;
6424 
6425   l_return_status   VARCHAR2(1);
6426   l_cont_instance_id NUMBER;
6427   l_cont_name       VARCHAR2(30);
6428   l_row_id          VARCHAR2(30);
6429   l_pack_status     VARCHAR2(30);
6430 
6431   l_net_weight      NUMBER;
6432   l_cont_fill_pc    NUMBER;
6433   l_err_cont_name   VARCHAR2(30);
6434   l_last_organization_id NUMBER;
6435 
6436   i                 NUMBER;
6437   j                 NUMBER;
6438   cnt               NUMBER;
6439   l_cont_instance_cnt NUMBER;
6440 
6441   warn_cnt          NUMBER := 0;
6442   error_cnt         NUMBER := 0;
6443   succ_cnt          NUMBER := 0;
6444   cont_warn         NUMBER := 0;
6445   l_release_warn_count NUMBER := 0;
6446   l_fill_pc_warn_count NUMBER := 0; -- bug 3562797 jckwok
6447   l_error_cnt       NUMBER := 0;
6448 
6449   l_new_contid_count  NUMBER := 0;
6450   --l_cont_tab          wsh_container_actions.cont_inst_tab;
6451   l_cont_tab          WSH_UTIL_CORE.id_tab_type;
6452 
6453   TYPE NumList IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
6454   TYPE CharList IS TABLE OF VARCHAR2(3) INDEX BY BINARY_INTEGER;
6455   l_GrossWtlist     NumList;
6456   l_NetWtlist       NumList;
6457   l_Vollist         NumList;
6458   l_ddlist          NumList;
6459   l_dellist         NumList; -- for delivery id
6460   l_contlist        NumList; -- containers for delivery detail id
6461   l_contlist1       NumList; -- containers and delivery id
6462   --l_dellist1         NumList; -- containers and delivery id Commented by adagur for bug 16397445
6463   m                 NUMBER;
6464   l_del_tab         WSH_UTIL_CORE.id_tab_type;
6465   l_exists_flag     VARCHAR2(1);
6466   l_duplicate_flag     VARCHAR2(1);   -- for checking record
6467 
6468   -- J: W/V Changes
6469   l_prev_del_id   NUMBER;
6470   l_prev_dd_id    NUMBER;
6471   l_prev_cont_id  NUMBER;
6472   l_unit_weight   NUMBER;
6473   l_unit_volume   NUMBER;
6474   l_weight_uom_code VARCHAR2(3);
6475   l_volume_uom_code VARCHAR2(3);
6476   l_cont_Wtlist   NumList;
6477   l_cont_Vollist  NumList;
6478   l_WtUOMlist   CharList;
6479   l_VolUOMlist  CharList;
6480   l_InvItemlist  NumList;
6481   l_cont_InvItemlist  NumList;
6482   l_cont_WtUOMlist   CharList;
6483   l_cont_VolUOMlist  CharList;
6484   l_tot_dd_gross_wt NUMBER;
6485   l_tot_dd_net_wt NUMBER;
6486   l_tot_dd_vol    NUMBER;
6487 /*
6488   l_tot_cont_gross_wt NUMBER;
6489   l_tot_cont_vol  NUMBER;
6490 */
6491   l_tot_del_vol   NUMBER;
6492   TYPE del_wv_adjust_info IS RECORD (
6493         dd_id   NUMBER,
6494         gross_wt       NUMBER,
6495         net_wt         NUMBER,
6496         vol            NUMBER);
6497   TYPE del_wv_adjust_tab IS TABLE OF del_wv_adjust_info INDEX BY BINARY_INTEGER;
6498   l_tmp_dd1list del_wv_adjust_tab;
6499   l_tmp_dd2list del_wv_adjust_tab;
6500   del_index       NUMBER;
6501   i1 NUMBER := 0;
6502   j1 NUMBER := 0;
6503   k1 NUMBER := 0;
6504   l_prev_wt_uom VARCHAR2(3);
6505   l_prev_vol_uom VARCHAR2(3);
6506   l_item_changed BOOLEAN;
6507   l_cont_item_changed BOOLEAN;
6508   l_prev_item NUMBER;
6509 
6510   l_attr_tab  wsh_delivery_autocreate.grp_attr_tab_type;
6511   l_group_tab  wsh_delivery_autocreate.grp_attr_tab_type;
6512   l_action_rec wsh_delivery_autocreate.action_rec_type;
6513   l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
6514   l_matched_entities wsh_util_core.id_tab_type;
6515   l_out_rec wsh_delivery_autocreate.out_rec_type;
6516 
6517   mark_reprice_error EXCEPTION;
6518 
6519   -- OTM R12 : assign delivery detail
6520   l_gc3_is_installed         VARCHAR2(1);
6521   l_is_delivery_empty        VARCHAR2(1);
6522   l_index                    NUMBER;
6523   l_index_update             NUMBER;
6524   l_tare_weight              WSH_DELIVERY_DETAILS.UNIT_WEIGHT%TYPE;
6525   l_ignore_for_planning_tab  WSH_UTIL_CORE.COLUMN_TAB_TYPE;
6526   l_tms_interface_flag_tab   WSH_UTIL_CORE.COLUMN_TAB_TYPE;
6527   l_delivery_was_empty_tab   BOOLEAN_TAB_TYPE;
6528   l_delivery_id_tab          WSH_UTIL_CORE.ID_TAB_TYPE;
6529   l_interface_flag_tab       WSH_UTIL_CORE.COLUMN_TAB_TYPE;
6530   -- End of OTM R12 : assign delivery detail
6531 
6532 -- K LPN CONV. rv
6533 l_wms_org    VARCHAR2(10) := 'N';
6534 l_sync_tmp_wms_ddlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6535 l_sync_tmp_inv_ddlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6536 l_wms_ddtlist_cnt NUMBER;
6537 l_inv_ddtlist_cnt NUMBER;
6538 l_sync_tmp_wms_contlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6539 l_sync_tmp_inv_contlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6540 l_wms_contlist_cnt NUMBER;
6541 l_inv_contlist_cnt NUMBER;
6542 l_sync_tmp_wms_contlist1 wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6543 l_sync_tmp_inv_contlist1 wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6544 l_wms_contlist1_cnt NUMBER;
6545 l_inv_contlist1_cnt NUMBER;
6546 -- K LPN CONV. rv
6547 l_mdc_id_tab wsh_util_core.id_tab_type;
6548 l_mdc_index_i NUMBER;
6549 l_mdc_index_j NUMBER;
6550 
6551 --BUG#12904248
6552 l_deliver_to_location_id1 NUMBER;
6553 l_deliver_to_location_id  NUMBER;
6554 l_container_id NUMBER;
6555 
6556 CURSOR c_get_deliver_to_location_id(v_delivery_detail_id number) IS
6557 SELECT deliver_to_location_id
6558 FROM   wsh_delivery_details
6559 WHERE  delivery_detail_id = v_delivery_detail_id;
6560 
6561 --
6562 l_debug_on BOOLEAN;
6563 --
6564 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'AUTO_PACK_LINES';
6565 --
6566 BEGIN
6567 
6568   --dbms_output.put_line('==================================================');
6569   --dbms_output.put_line('   AUTO  PACK  LINES                              ');
6570   --dbms_output.put_line('==================================================');
6571 
6572   --dbms_output.put_line('Start of WSH_CONTAINER_ACTIONS.Auto_Pack_Lines...');
6573   -- Delete all Global PL/SQL tables to start with
6574   --
6575   --
6576 
6577   -- OTM R12 : assign delivery detail
6578   l_gc3_is_installed := WSH_UTIL_CORE.G_GC3_IS_INSTALLED;
6579 
6580   IF (l_gc3_is_installed IS NULL) THEN
6581     l_gc3_is_installed := WSH_UTIL_CORE.GC3_IS_INSTALLED;
6582   END IF;
6583 
6584   -- End of OTM R12 : assign delivery detail
6585 
6586   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
6587   --
6588   IF l_debug_on IS NULL
6589   THEN
6590       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
6591   END IF;
6592   --
6593   IF l_debug_on THEN
6594       WSH_DEBUG_SV.push(l_module_name);
6595       --
6596       WSH_DEBUG_SV.log(l_module_name,'P_PACK_CONT_FLAG',P_PACK_CONT_FLAG);
6597       WSH_DEBUG_SV.log(l_module_name,'l_gc3_is_installed', l_gc3_is_installed);                        -- OTM R12 : assign delivery detail
6598   END IF;
6599   --
6600   g_empty_cont_tab.DELETE;
6601   g_assign_detail_tab.DELETE;
6602   g_new_container_tab.DELETE;
6603   g_cache_organization_info_tab.DELETE;
6604   g_cont_msi_tab.DELETE;
6605   g_new_contid_tab.DELETE;
6606   g_new_cont_index := 0;
6607   g_num_cont_index := 0;
6608   g_assign_detail_index := 0;
6609 
6610   -- 10. Check if Count of p_del_detail_tab table is 0
6611   IF p_del_detail_tab.count = 0 THEN
6612     --dbms_output.put_line('p_del_detail_tab count is 0');
6613     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_ASSG_NULL');
6614     x_return_status := C_ERROR_STATUS;
6615     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6616     --
6617     IF l_debug_on THEN
6618         WSH_DEBUG_SV.pop(l_module_name);
6619     END IF;
6620     --
6621     return;
6622   END IF;
6623 --dbms_output.put_line('Before Autocreate Del'||to_char(sysdate,'HH24:MI:SS'));
6624   -- 20. Generate Grouping Ids
6625   IF p_group_id_tab.COUNT = 0 THEN
6626 
6627     -- call autocreate delivery API with a check flag set to 'Y' and
6628     -- container flag set to 'Y' to fetch group id table for delivery lines
6629 
6630     --dbms_output.put_line('Calling WSH_DELIVERY_AUTOCREATE.autocreate_deliveries to generate group_ids');
6631     --
6632     IF l_debug_on THEN
6633         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
6634     END IF;
6635     --
6636 
6637    l_attr_tab.delete;
6638 
6639    FOR i in 1..p_del_detail_tab.count LOOP
6640 
6641        l_attr_tab(i).entity_id := p_del_detail_tab(i);
6642        l_attr_tab(i).entity_type := 'DELIVERY_DETAIL';
6643 
6644    END LOOP;
6645 
6646    l_action_rec.action := 'MATCH_GROUPS';
6647 
6648 
6649 
6650    WSH_Delivery_AutoCreate.Find_Matching_Groups(p_attr_tab => l_attr_tab,
6651                                                    p_action_rec => l_action_rec,
6652                                                    p_target_rec => l_target_rec,
6653                                                    p_group_tab => l_group_tab,
6654                                                    x_matched_entities => l_matched_entities,
6655                                                    x_out_rec => l_out_rec,
6656                                                    x_return_status => l_return_status);
6657 
6658     IF l_debug_on THEN
6659       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6660     END IF;
6661     IF (l_return_status = C_ERROR_STATUS) OR
6662        (l_return_status = C_UNEXP_ERROR_STATUS) THEN
6663       --dbms_output.put_line('***WSH_DELIVERY_AUTOCREATE.autocreate_deliveries returned '||l_return_status);
6664       FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
6665       WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
6666       x_return_status := l_return_status;
6667       --
6668       IF l_debug_on THEN
6669           WSH_DEBUG_SV.pop(l_module_name);
6670       END IF;
6671       --
6672       return;
6673     END IF;
6674     FOR i in 1..l_attr_tab.COUNT LOOP
6675       l_group_id_tab(l_attr_tab(i).entity_id) := l_attr_tab(i).group_id;
6676     END LOOP;
6677   ELSE
6678     cnt := p_group_id_tab.FIRST;
6679 
6680     IF ((cnt IS NULL) OR (p_group_id_tab.COUNT <> p_del_detail_tab.count)) THEN
6681       x_return_status := C_ERROR_STATUS;
6682       FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
6683       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6684       --
6685       IF l_debug_on THEN
6686           WSH_DEBUG_SV.pop(l_module_name);
6687       END IF;
6688       --
6689       return;
6690     ELSE
6691 
6692       FOR i in 1..p_group_id_tab.COUNT LOOP
6693         l_group_id_tab(p_del_detail_tab(i)) := p_group_id_tab(i);
6694       END LOOP;
6695 
6696     END IF;
6697   END IF;
6698 
6699 
6700 --dbms_output.put_line('Before Validate DD for Pack'||to_char(sysdate,'HH24:MI:SS'));
6701   Validate_Dd_for_Pack(
6702     p_group_id_tab     => l_group_id_tab,
6703     p_del_detail_tab   => p_del_detail_tab,
6704     x_line_cont_tab    => line_cont_tab,
6705     x_error_cnt        => error_cnt,
6706     x_warn_cnt         => warn_cnt,
6707     x_fill_pc_warn_cnt => l_fill_pc_warn_count, -- bug 3562797 jckwok
6708     x_release_warn_cnt => l_release_warn_count);
6709 
6710     IF l_debug_on THEN
6711       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6712       WSH_DEBUG_SV.log(l_module_name,'line cont tab count -',line_cont_tab.count);
6713     END IF;
6714   --dbms_output.put_line(p_del_detail_tab.count||'<CALL TO VALIDATE DD FOR PACK>'||l_release_warn_count||'>'||line_cont_tab.count);
6715 
6716   -- Raise warning if we found some delivery details with status 'S'
6717   -- Raise Error if all lines are with status 'S'
6718   IF (l_release_warn_count = p_del_detail_tab.count) THEN
6719     x_return_status := C_ERROR_STATUS;
6720     FND_MESSAGE.SET_NAME('WSH','WSH_DEL_RELEASED_STATUS');
6721     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6722     -- Bug 3337629 : Added the following return statement.
6723     IF l_debug_on THEN
6724       WSH_DEBUG_SV.pop(l_module_name);
6725     END IF;
6726     RETURN;
6727   ELSIF (l_release_warn_count > 0) THEN
6728     -- Bug 3337629 - x_return_status does not hold any value.
6729     -- Compare it with l_return_status.
6730     -- Also increment the warn_cnt.
6731 
6732     --IF (x_return_status <> C_ERROR_STATUS) THEN
6733     IF (l_return_status <> C_ERROR_STATUS) THEN
6734       x_return_status := C_WARNING_STATUS;
6735       warn_cnt := warn_cnt + 1;
6736       FND_MESSAGE.SET_NAME('WSH','WSH_DEL_REL_STATUS_WARN');
6737       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6738     END IF;
6739   END IF;
6740   --
6741   -- bug 3562797 jckwok
6742   -- Raise Error if all dds have 'Shipping Parameter' percent fill basis as None
6743   -- Raise warning if only some of the dds have 'Shipping Parameter' percent fill basis as None
6744   --
6745   IF (l_fill_pc_warn_count = p_del_detail_tab.count) THEN
6746     x_return_status := C_ERROR_STATUS;
6747     FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
6748     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6749     IF l_debug_on THEN
6750       WSH_DEBUG_SV.pop(l_module_name);
6751     END IF;
6752     RETURN;
6753   ELSIF (l_fill_pc_warn_count > 0) THEN
6754     IF (l_return_status <> C_ERROR_STATUS) THEN
6755       x_return_status := C_WARNING_STATUS;
6756       warn_cnt := warn_cnt + 1;
6757       FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
6758       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6759     END IF;
6760   END IF;
6761   -- end of bug 3562797 jckwok
6762 
6763 --dbms_output.put_line('Before 50'||to_char(sysdate,'HH24:MI:SS'));
6764   IF (line_cont_tab.COUNT > 0) THEN
6765     -- 50. Loop through all lines that need to be Auto-Packed
6766     cnt := 1;
6767     l_last_organization_id := NULL;
6768     WHILE (cnt <= line_cont_tab.COUNT) LOOP
6769 
6770       IF l_debug_on THEN
6771         WSH_DEBUG_SV.log(l_module_name,'======================================================');
6772         WSH_DEBUG_SV.log(l_module_name,'auto-packing line ' || line_cont_tab(cnt).delivery_detail_id||'Org id'||line_cont_tab(cnt).organization_id);
6773       END IF;
6774 
6775       IF (l_last_organization_id is NULL) THEN
6776         l_last_organization_id := line_cont_tab(cnt).organization_id;
6777       ELSIF (l_last_organization_id <> line_cont_tab(cnt).organization_id) THEN
6778         l_last_organization_id := line_cont_tab(cnt).organization_id;
6779 
6780         -- Delete the empty PL/SQL cont table if organization_id changes
6781         g_empty_cont_tab.DELETE;
6782       END IF;
6783 
6784       Pack_Delivery_Detail(
6785          p_line_cont_rec => line_cont_tab(cnt),
6786          x_return_status => l_return_status);
6787  -- Bug  2786021 handle unexpected error
6788       IF (l_return_status = C_ERROR_STATUS OR
6789           l_return_status = C_UNEXP_ERROR_STATUS
6790          ) THEN
6791        error_cnt := error_cnt + 1;
6792       ELSE
6793        succ_cnt := succ_cnt + 1;
6794       END IF;
6795       cnt := cnt + 1;
6796 
6797     END LOOP;
6798 --dbms_output.put_line('Error Count '|| error_cnt||' Success Count '||succ_cnt);
6799 --dbms_output.put_line('Before Create'||to_char(sysdate,'HH24:MI:SS')||'g_new_container_tab.count'||g_new_container_tab.COUNT);
6800 
6801     -- 60.1 Create Containers from g_new_container_tab PL/SQL table
6802     --dbms_output.put_line('*** Creating Actual Containers ***');
6803     cnt := 1;
6804     l_cont_instance_cnt := 1;
6805     WHILE (cnt <= g_new_container_tab.COUNT) LOOP
6806       l_cont_name := null;
6807 
6808       --
6809       IF l_debug_on THEN
6810           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CREATE_CONT_INSTANCE_MULTI',WSH_DEBUG_SV.C_PROC_LEVEL);
6811           WSH_DEBUG_SV.logmsg(l_module_name,'Number of Containers'||g_new_container_tab(cnt).number_of_containers);
6812           WSH_DEBUG_SV.log(l_module_name,'Create Container'||g_new_container_tab(cnt).container_item_id||'<'||g_new_container_tab(cnt).organization_id||'>'||g_new_container_tab(cnt).number_of_containers);
6813       END IF;
6814       --
6815       wsh_container_actions.Create_Cont_Instance_Multi (
6816                x_cont_name           => l_cont_name,
6817                p_cont_item_id        => g_new_container_tab(cnt).container_item_id,
6818                x_cont_instance_id    => l_cont_instance_id,
6819                p_par_detail_id       => NULL,
6820                p_organization_id     => g_new_container_tab(cnt).organization_id,
6821                p_container_type_code => NULL,
6822                p_num_of_containers   => g_new_container_tab(cnt).number_of_containers,
6823                x_row_id              => l_row_id,
6824                x_return_status       => l_return_status,
6825                x_cont_tab            => l_cont_tab,
6826                -- J: W/V Changes
6827                x_unit_weight         => l_unit_weight,
6828                x_unit_volume         => l_unit_volume,
6829                x_weight_uom_code     => l_weight_uom_code,
6830                x_volume_uom_code     => l_volume_uom_code,
6831                p_lpn_id              => NULL,
6832                p_ignore_for_planning => NULL,
6833                p_caller              => 'WSH'
6834                );
6835       IF l_debug_on THEN
6836           WSH_DEBUG_SV.log(l_module_name,'return status ,cont tab count -',l_return_status||l_cont_tab.count);
6837       END IF;
6838 
6839       IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
6840         ) THEN
6841         --dbms_output.put_line('Container Creation failed for index '|| cnt);
6842         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
6843         WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6844         error_cnt := error_cnt + 1;
6845       ELSE
6846 
6847         IF l_debug_on THEN
6848           WSH_DEBUG_SV.logmsg(l_module_name,'Created Containers'||l_cont_tab.count);
6849         END IF;
6850 -- do not use this container instance id
6851         g_new_container_tab(cnt).cont_instance_id := l_cont_instance_id;
6852 
6853 -- This new PL SQL table will have mapping records to g_new_container_tab
6854 -- where count of g_new_container_tab will have records here
6855 -- Example if l_new_contid_count is 1 and in g_new_container_tab, the
6856 -- number of containers is 10, then those 10 container instance id can be
6857 -- extracted from this new PL SQL table
6858         IF l_new_contid_count IS NULL THEN
6859           l_new_contid_count := 0;
6860         ELSE
6861           l_new_contid_count := g_new_contid_tab.count;
6862         END IF;
6863 
6864 -- can replace l_new_contid_count with g_new_contid_tab.count
6865         FOR j in 1..l_cont_tab.count
6866         LOOP
6867           l_new_contid_count := l_new_contid_count + 1;
6868           g_new_contid_tab(l_new_contid_count).match_id := cnt;
6869           g_new_contid_tab(l_new_contid_count).cont_instance_id := l_cont_tab(j);
6870           -- J: W/V Changes
6871           g_new_contid_tab(l_new_contid_count).unit_weight := l_unit_weight;
6872           g_new_contid_tab(l_new_contid_count).unit_volume := l_unit_volume;
6873           g_new_contid_tab(l_new_contid_count).weight_uom := l_weight_uom_code;
6874           g_new_contid_tab(l_new_contid_count).volume_uom := l_volume_uom_code;
6875           g_new_contid_tab(l_new_contid_count).item_id := g_new_container_tab(cnt).container_item_id;
6876 
6877           -- K LPN CONV. rv
6878           g_new_contid_tab(l_new_contid_count).organization_id := g_new_container_tab(cnt).organization_id;
6879 
6880           x_cont_instance_tab(l_new_contid_count) := l_cont_tab(j);
6881           -- Bug 3570364 : Adding the Master container item id of the line to all it's
6882 	  --               container LPN's. This information is passed to Auto_pack_conts.
6883 	  l_detail_cont_rec.container_instance_id := l_cont_tab(j);
6884           l_detail_cont_rec.container_item_id     := g_new_container_tab(cnt).mast_cont_item_id;
6885           l_detail_cont_tab(l_new_contid_count)  := l_detail_cont_rec;
6886 
6887           --g_new_contid_tab(l_new_contid_count).cont_instance_id := l_cont_tab(j).cont_instance_id;
6888           --x_cont_instance_tab(l_new_contid_count) := l_cont_tab(j).cont_instance_id;
6889         END LOOP;
6890 
6891 --dbms_output.put_line('COUNT in new tab'||g_new_contid_tab.count||'<'||x_cont_instance_tab.count);
6892 
6893 -- End of PL SQL table usage
6894  -- move this call of x_cont_instance_tab to within the above LOOP
6895         --x_cont_instance_tab(l_cont_instance_cnt)    := l_cont_instance_id;
6896 
6897         -- Bug  3570364 : Move following stmt's to within the above LOOP
6898 	--                which stores the master container item id for each LPN
6899        /*{ l_detail_cont_rec.container_instance_id := l_cont_instance_id;
6900         l_detail_cont_rec.container_item_id     := g_new_container_tab(cnt).mast_cont_item_id;
6901         l_detail_cont_tab(l_cont_instance_cnt)  := l_detail_cont_rec;
6902         l_cont_instance_cnt := l_cont_instance_cnt + 1; } */
6903 
6904         --dbms_output.put_line('Container dd id '||l_cont_instance_id||' for index '|| cnt);
6905       END IF;
6906       cnt := cnt + 1;
6907     END LOOP;
6908     --dbms_output.put_line('Error Count after CREATE CONTAINER'|| error_cnt);
6909 
6910 
6911     -- 70.1 Assign Details to Actual Containers created
6912     IF l_debug_on THEN
6913 
6914      WSH_DEBUG_SV.log(l_module_name,'*** Assigning Details to Containers Created ***'||g_assign_detail_tab.count);
6915      WSH_DEBUG_SV.log(l_module_name,'*** COUNT ***'||g_new_contid_tab.count||'<'||g_new_container_tab.count||to_char(sysdate,'HH24:MI:SS'));
6916     END IF;
6917 
6918 -- doing BULK UPDATE here
6919 -- First Update WDA for each delivey detail to have parent_delivery_detail populated
6920 -- correctly
6921 
6922     m := 0;
6923     l_wms_ddtlist_cnt :=1;
6924     l_inv_ddtlist_cnt :=1;
6925     FOR cnt in 1..g_assign_detail_tab.COUNT
6926     LOOP
6927       l_GrossWtlist(cnt) := g_assign_detail_tab(cnt).gross_weight;
6928       l_NetWtlist(cnt) := g_assign_detail_tab(cnt).net_weight;
6929       l_WtUOMlist(cnt) := g_assign_detail_tab(cnt).weight_uom;
6930       l_Vollist(cnt) := g_assign_detail_tab(cnt).volume;
6931       l_VolUOMlist(cnt) := g_assign_detail_tab(cnt).volume_uom;
6932       l_InvItemlist(cnt) :=  g_assign_detail_tab(cnt).inventory_item_id;
6933       l_ddlist(cnt) := g_assign_detail_tab(cnt).delivery_detail_id;
6934       l_dellist(cnt) := g_assign_detail_tab(cnt).delivery_id;
6935       l_wms_org := 'N';
6936       -- K LPN CONV. rv
6937       IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
6938       --{
6939           l_wms_org := wsh_util_validate.check_wms_org(g_assign_detail_tab(cnt).organization_id);
6940           IF (l_wms_org = 'Y') THEN
6941             l_sync_tmp_wms_ddlist.delivery_detail_id_tbl(l_wms_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_detail_id;
6942             l_sync_tmp_wms_ddlist.delivery_id_tbl(l_wms_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_id;
6943             l_sync_tmp_wms_ddlist.parent_detail_id_tbl(l_wms_ddtlist_cnt) := NULL;
6944             l_sync_tmp_wms_ddlist.operation_type_tbl(l_wms_ddtlist_cnt) := 'PRIOR';
6945             l_wms_ddtlist_cnt := l_wms_ddtlist_cnt + 1;
6946           ELSE
6947             l_sync_tmp_inv_ddlist.delivery_detail_id_tbl(l_inv_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_detail_id;
6948             l_sync_tmp_inv_ddlist.delivery_id_tbl(l_inv_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_id;
6949             l_sync_tmp_inv_ddlist.parent_detail_id_tbl(l_inv_ddtlist_cnt) := NULL;
6950             l_sync_tmp_inv_ddlist.operation_type_tbl(l_inv_ddtlist_cnt) := 'PRIOR';
6951             l_inv_ddtlist_cnt := l_inv_ddtlist_cnt + 1;
6952           END IF;
6953       --}
6954       END IF;
6955       -- K LPN CONV. rv
6956     IF l_dellist(cnt) IS NOT NULL THEN
6957 -- no check for distinct was there earlier, added the check
6958       IF l_del_tab.count > 0 THEN
6959         FOR j in 1..l_del_tab.COUNT
6960         LOOP
6961           IF (l_dellist(cnt) IS NOT NULL
6962              AND l_dellist(cnt) = l_del_tab(j)
6963             ) THEN
6964 
6965             l_exists_flag := 'Y';
6966             EXIT;
6967           ELSE
6968             l_exists_flag := 'N';
6969 
6970           END IF;
6971         END LOOP;
6972       ELSE
6973         l_exists_flag := 'N';
6974       END IF;
6975 
6976       IF l_exists_flag = 'N' THEN
6977          m := m + 1;
6978          l_del_tab(m) := l_dellist(cnt);
6979       END IF;
6980     END IF;
6981     END LOOP;
6982 -- the number of records should be same
6983 -- when Empty Container logic is used, then there can be a record in
6984 -- assign table with no one to one mapping in new container table
6985 -- so use container index to find that container
6986 
6987     m := 0;
6988     -- K LPN CONV. rv
6989     l_wms_contlist_cnt := 1;
6990     l_inv_contlist_cnt := 1;
6991 
6992     l_wms_contlist1_cnt := 1;
6993     l_inv_contlist1_cnt := 1;
6994     -- K LPN CONV. rv
6995     FOR cnt in 1..g_assign_detail_tab.COUNT
6996     LOOP
6997 
6998       l_contlist(cnt) :=
6999         g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id;
7000       -- K LPN CONV. rv
7001       IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
7002       --{
7003           l_wms_org := 'N';
7004           l_wms_org := wsh_util_validate.check_wms_org(g_new_contid_tab(g_assign_detail_tab(cnt).container_index).organization_id);
7005           IF (l_wms_org = 'Y') THEN
7006             l_sync_tmp_wms_contlist.delivery_detail_id_tbl(l_wms_contlist_cnt) := l_contlist(cnt);
7007             l_sync_tmp_wms_contlist.operation_type_tbl(l_wms_contlist_cnt) := 'UPDATE';
7008             l_wms_contlist_cnt :=  l_wms_contlist_cnt + 1;
7009           ELSE
7010             l_sync_tmp_inv_contlist.delivery_detail_id_tbl(l_inv_contlist_cnt) := l_contlist(cnt);
7011             l_sync_tmp_inv_contlist.operation_type_tbl(l_inv_contlist_cnt) := 'UPDATE';
7012             l_inv_contlist_cnt :=  l_inv_contlist_cnt + 1;
7013           END IF;
7014       --}
7015       END IF;
7016       -- K LPN CONV. rv
7017 
7018       IF ((cnt = 1)
7019           OR
7020           (cnt > 1
7021              AND l_contlist1(m) <>
7022                  g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id)
7023          )THEN
7024 
7025          IF l_contlist1.count > 0 THEN
7026            FOR j in l_contlist1.FIRST..l_contlist1.LAST
7027            LOOP
7028              IF l_contlist1(j) =
7029                   g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id
7030              THEN
7031                l_duplicate_flag := 'Y';
7032                EXIT;  -- out of the loop
7033              ELSE
7034                l_duplicate_flag := 'N';
7035              END IF;
7036            END LOOP;
7037          ELSE
7038            l_duplicate_flag := 'N';
7039          END IF;
7040          IF l_duplicate_flag = 'N' THEN
7041            m := m + 1;
7042            l_contlist1(m) :=
7043              g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id;
7044            -- J: W/V Changes
7045            l_cont_Wtlist(m) :=
7046              g_new_contid_tab(g_assign_detail_tab(cnt).container_index).unit_weight;
7047            l_cont_Vollist(m) :=
7048              g_new_contid_tab(g_assign_detail_tab(cnt).container_index).unit_volume;
7049            --l_dellist1(m) := g_assign_detail_tab(cnt).delivery_id;   Commented by adagur for bug 16397445
7050            -- K LPN CONV. rv
7051            IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
7052            --{
7053                IF (l_wms_org = 'Y') THEN
7054                  l_sync_tmp_wms_contlist1.delivery_detail_id_tbl(l_wms_contlist1_cnt) := l_contlist1(m);
7055                  l_sync_tmp_wms_contlist1.delivery_id_tbl(l_wms_contlist1_cnt) := NULL;
7056                  l_sync_tmp_wms_contlist1.parent_detail_id_tbl(l_wms_contlist1_cnt) := NULL;
7057                  l_sync_tmp_wms_contlist1.operation_type_tbl(l_wms_contlist1_cnt) := 'PRIOR';
7058                  l_wms_contlist1_cnt := l_wms_contlist1_cnt + 1;
7059                ELSE
7060                  l_sync_tmp_inv_contlist1.delivery_detail_id_tbl(l_inv_contlist1_cnt) := l_contlist1(m);
7061                  l_sync_tmp_inv_contlist1.delivery_id_tbl(l_inv_contlist1_cnt) := NULL;
7062                  l_sync_tmp_inv_contlist1.parent_detail_id_tbl(l_inv_contlist1_cnt) := NULL;
7063                  l_sync_tmp_inv_contlist1.operation_type_tbl(l_inv_contlist1_cnt) := 'PRIOR';
7064                  l_inv_contlist1_cnt := l_inv_contlist1_cnt + 1;
7065                END IF;
7066            --}
7067            END IF;
7068            -- K LPN CONV. rv
7069          END IF;
7070       END IF;
7071     END LOOP; -- g_assign_detail_tab Loop
7072 
7073     IF l_debug_on THEN
7074       WSH_DEBUG_SV.logmsg(l_module_name,'Count-g_assign_detail_tab'||g_assign_detail_tab.COUNT);
7075       WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_contlist'||l_contlist.COUNT);
7076       WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_dellist>'||l_dellist.COUNT);
7077       WSH_DEBUG_SV.logmsg(l_module_name,'Count-g_new_contid>'||g_new_contid_tab.COUNT);
7078       WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_contlist1>'||l_contlist1.COUNT);
7079       --WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_dellist1>'||l_dellist1.COUNT); Commented by adagur for bug 16397445
7080     END IF;
7081 
7082 -- J: W/V Changes
7083     -- 70.2 Accumulate the W/V to be adjusted by delivery and container for perf reasons. After the following loop
7084     --      l_tmp_dd1list will have W/V that needs to be reduced from deliveries (if the lines are already assigned to a delivery)
7085     --      l_tmp_dd2list will have W/V that needs to be propogated to container only.
7086     -- The W/V is accumulated and stored in the above tables whenever item,W/V uom change in container and delivery
7087     -- For Ex: Say a dd with Wt 10 Lbs and Vol 20 Cu. Ft is assigned to a delivery (which has Wt 10 Lbs and Vol 20 Cu. Ft)
7088     --         and say the line got auto-packed into a container with tare wt. 2 Lbs and Vol. 100 Cu. Ft
7089     --         Then after the following loop, l_tmp_dd1list will have dd with vol -20. l_tmp_dd2list will have
7090     --         gross wt. 10 Lbs and Vol 20 Cu. Ft.
7091 
7092     IF l_debug_on THEN
7093      WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7094     END IF;
7095     l_prev_del_id := NULL;
7096     l_prev_dd_id := NULL;
7097     l_prev_cont_id := NULL;
7098     l_tot_dd_gross_wt := 0;
7099     l_tot_dd_net_wt := 0;
7100     l_tot_dd_vol    := 0;
7101     l_tot_del_vol   := 0;
7102     i := 0;
7103     l_item_changed := FALSE;
7104 
7105     LOOP
7106       i := i + 1;
7107 
7108       IF l_debug_on THEN
7109         IF i <= l_dellist.COUNT THEN
7110           WSH_DEBUG_SV.logmsg(l_module_name,'Del '||l_dellist(i)||' Cont '||l_contlist(i)||' DD '||l_ddlist(i)||' l_prev_dd_id '||l_prev_dd_id||' l_prev_cont_id '||l_prev_cont_id||' l_prev_del_id '||l_prev_del_id);
7111         END IF;
7112       END IF;
7113 
7114       IF (i > l_dellist.COUNT OR l_contlist(i) is NOT NULL) THEN
7115 
7116         IF (i > 1) AND (i <= l_dellist.COUNT) THEN
7117           IF (l_prev_item <> l_InvItemlist(i)) OR
7118              (NVL(l_prev_wt_uom,'-99') <> NVL(l_WtUOMlist(i),'-99')) OR
7119              (NVL(l_prev_vol_uom,'-99') <> NVL(l_VolUOMlist(i),'-99')) THEN
7120              l_item_changed := TRUE;
7121           END IF;
7122 
7123         END IF;
7124 
7125         IF (i > l_dellist.COUNT) OR
7126            (l_prev_del_id is NOT NULL AND (NVL(l_dellist(i),-99) <> l_prev_del_id)) OR
7127            l_item_changed THEN
7128           i1 := i1 + 1;
7129           l_tmp_dd1list(i1).dd_id := l_prev_dd_id;
7130           l_tmp_dd1list(i1).vol   := -1 * l_tot_del_vol;
7131           l_tot_del_vol := 0;
7132         END IF;
7133 
7134         IF i > l_dellist.COUNT OR
7135            (l_prev_cont_id is NOT NULL AND (l_contlist(i) <> l_prev_cont_id)) OR
7136            l_item_changed THEN
7137 
7138           k1 := k1 + 1;
7139           l_tmp_dd2list(k1).dd_id    := l_prev_dd_id;
7140           l_tmp_dd2list(k1).gross_wt := l_tot_dd_gross_wt;
7141           l_tmp_dd2list(k1).net_wt   := l_tot_dd_net_wt;
7142           l_tmp_dd2list(k1).vol      := l_tot_dd_vol;
7143 
7144           l_tot_dd_gross_wt := 0;
7145           l_tot_dd_net_wt   := 0;
7146           l_tot_dd_vol      := 0;
7147         END IF;
7148 
7149         IF i > l_dellist.COUNT THEN
7150           EXIT;
7151         END IF;
7152 
7153         l_tot_dd_gross_wt := l_tot_dd_gross_wt + NVL(l_GrossWtlist(i),0);
7154         l_tot_dd_net_wt := l_tot_dd_net_wt + NVL(l_NetWtlist(i),0);
7155         l_tot_dd_vol    := l_tot_dd_vol    + NVL(l_Vollist(i),0);
7156         IF l_dellist(i) is not null THEN
7157           l_tot_del_vol   := l_tot_del_vol   + NVL(l_Vollist(i),0);
7158         END IF;
7159         l_prev_dd_id := l_ddlist(i);
7160         l_prev_cont_id := l_contlist(i);
7161         l_prev_wt_uom := l_WtUOMlist(i);
7162         l_prev_vol_uom := l_VolUOMlist(i);
7163         l_prev_item := l_InvItemlist(i);
7164         l_prev_del_id := l_dellist(i);
7165 
7166       END IF;
7167     END LOOP;
7168     IF l_debug_on THEN
7169      WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7170      --WSH_DEBUG_SV.log(l_module_name,'l_tmp_dd1list.COUNT '||l_tmp_dd1list.COUNT||' l_tmp_dd2list.COUNT '||l_tmp_dd2list.COUNT||' l_tmp_contlist.COUNT '||l_tmp_contlist.COUNT);
7171      WSH_DEBUG_SV.log(l_module_name,'l_tmp_dd1list.COUNT '||l_tmp_dd1list.COUNT||' l_tmp_dd2list.COUNT '||l_tmp_dd2list.COUNT);
7172      WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment 1 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7173     END IF;
7174 
7175 -- J: W/V Changes
7176    FOR i in 1..l_tmp_dd1list.COUNT LOOP
7177      IF l_debug_on THEN
7178        WSH_DEBUG_SV.logmsg(l_module_name,'Del1:Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
7179      END IF;
7180 
7181      WSH_WV_UTILS.DD_WV_Post_Process(
7182        p_delivery_detail_id => l_tmp_dd1list(i).dd_id,
7183        p_diff_gross_wt      => l_tmp_dd1list(i).gross_wt,
7184        p_diff_net_wt        => NULL,
7185        p_diff_volume        => l_tmp_dd1list(i).vol,
7186        p_diff_fill_volume   => l_tmp_dd1list(i).vol,
7187        x_return_status      => l_return_status);
7188 
7189      IF (l_return_status <> C_SUCCESS_STATUS) THEN
7190        --
7191        IF (l_return_status = C_ERROR_STATUS OR
7192            l_return_status = C_UNEXP_ERROR_STATUS) THEN
7193          error_cnt := error_cnt + 1;
7194        ELSE
7195          cont_warn := cont_warn + 1;
7196        END IF;
7197 
7198      END IF;
7199    END LOOP;
7200    IF l_debug_on THEN
7201      WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment 1 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7202    END IF;
7203 
7204 -- changes to add l_dellist1 and add new messages
7205     --
7206     -- K LPN CONV. rv
7207     IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7208     THEN
7209     --{
7210         IF (WSH_WMS_LPN_GRP.GK_WMS_PACK and l_sync_tmp_wms_ddlist.delivery_detail_id_tbl.count > 0)
7211         THEN
7212         --{
7213             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7214               (
7215                 p_sync_tmp_recTbl   => l_sync_tmp_wms_ddlist,
7216                 x_return_status     => l_return_status
7217               );
7218 
7219             IF l_debug_on THEN
7220               WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7221             END IF;
7222             --
7223             IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7224               x_return_status := l_return_status;
7225               --
7226               IF l_debug_on THEN
7227                   WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7228                   WSH_DEBUG_SV.pop(l_module_name);
7229               END IF;
7230               --
7231               RETURN;
7232             ELSE
7233               IF l_return_status <> C_SUCCESS_STATUS THEN
7234                 x_return_status := C_WARNING_STATUS;
7235               END IF;
7236             END IF;
7237         --}
7238         ELSIF (WSH_WMS_LPN_GRP.GK_INV_PACK and l_sync_tmp_inv_ddlist.delivery_detail_id_tbl.count > 0)
7239         THEN
7240         --{
7241             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7242               (
7243                 p_sync_tmp_recTbl   => l_sync_tmp_inv_ddlist,
7244                 x_return_status     => l_return_status
7245               );
7246 
7247             IF l_debug_on THEN
7248               WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7249             END IF;
7250             --
7251             IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7252               x_return_status := l_return_status;
7253               --
7254               IF l_debug_on THEN
7255                   WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7256                   WSH_DEBUG_SV.pop(l_module_name);
7257               END IF;
7258               --
7259               RETURN;
7260             ELSE
7261               IF l_return_status <> C_SUCCESS_STATUS THEN
7262                 x_return_status := C_WARNING_STATUS;
7263               END IF;
7264             END IF;
7265         --}
7266         END IF;
7267     --}
7268     END IF;
7269     -- K LPN CONV. rv
7270 
7271     FORALL cnt IN 1..g_assign_detail_tab.COUNT
7272       UPDATE wsh_delivery_assignments_v
7273       SET    PARENT_DELIVERY_DETAIL_ID = l_contlist(cnt),
7274              last_update_date = SYSDATE,
7275              last_updated_by = FND_GLOBAL.USER_ID,
7276              last_update_login = FND_GLOBAL.LOGIN_ID
7277       WHERE  DELIVERY_DETAIL_ID = l_ddlist(cnt);
7278     l_mdc_id_tab.delete;
7279     l_mdc_index_i := l_ddlist.FIRST;
7280     l_mdc_index_j := 0;
7281     WHILE l_mdc_index_i IS NOT NULL LOOP
7282        l_mdc_index_j := l_mdc_index_j + 1;
7283        l_mdc_id_tab(l_mdc_index_j) := l_ddlist(l_mdc_index_i);
7284        l_mdc_index_i := l_ddlist.next(l_mdc_index_i);
7285 
7286     END LOOP;
7287     WSH_DELIVERY_DETAILS_ACTIONS.Delete_Consol_Record(
7288                    p_detail_id_tab     => l_mdc_id_tab,
7289                    x_return_status     => x_return_status);
7290 
7291     IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7292          IF l_debug_on THEN
7293             WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
7294             WSH_DEBUG_SV.pop(l_module_name);
7295          END IF;
7296          RETURN;
7297    END IF;
7298 
7299 
7300 -- J: W/V Changes
7301    IF l_debug_on THEN
7302      WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment 2 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7303    END IF;
7304    FOR i in 1..l_tmp_dd2list.COUNT LOOP
7305      IF l_debug_on THEN
7306        WSH_DEBUG_SV.logmsg(l_module_name,'Del2:Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
7307      END IF;
7308 
7309      WSH_WV_UTILS.DD_WV_Post_Process(
7310        p_delivery_detail_id => l_tmp_dd2list(i).dd_id,
7311        p_diff_gross_wt      => l_tmp_dd2list(i).gross_wt,
7312        p_diff_net_wt        => l_tmp_dd2list(i).net_wt,
7313        p_diff_volume        => l_tmp_dd2list(i).vol,
7314        p_diff_fill_volume   => l_tmp_dd2list(i).vol,
7315        x_return_status      => l_return_status);
7316 
7317      IF (l_return_status <> C_SUCCESS_STATUS) THEN
7318        --
7319        IF (l_return_status = C_ERROR_STATUS OR
7320            l_return_status = C_UNEXP_ERROR_STATUS) THEN
7321          error_cnt := error_cnt + 1;
7322        ELSE
7323          cont_warn := cont_warn + 1;
7324        END IF;
7325 
7326      END IF;
7327    END LOOP;
7328    IF l_debug_on THEN
7329      WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment 2 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7330    END IF;
7331 
7332 -- fetch all the attributes for the delivery line
7333     cnt := 0;
7334     FOR i in 1..l_ddlist.count
7335     LOOP
7336 -- the inner loop will process one record at a time
7337       FOR rec in c_get_attributes(l_ddlist(i))
7338       LOOP
7339       cnt := cnt + 1;
7340       l_tab_cust_id(cnt) := rec.customer_id;
7341       l_tab_ship_location_id(cnt) := rec.ship_to_location_id;
7342       l_tab_intmed_location_id(cnt) := rec.intmed_ship_to_location_id;
7343       l_tab_fob_code(cnt) := rec.fob_code;
7344       l_tab_freight_terms_code(cnt) := rec.freight_terms_code;
7345       l_tab_ship_method_code(cnt) := rec.ship_method_code;
7346       l_tab_carrier_id(cnt) := rec.carrier_id;
7347       l_tab_mode_of_transport(cnt) := rec.mode_of_transport;
7348       l_tab_service_level(cnt) := rec.service_level;
7349       l_tab_deliver_location_id(cnt) := rec.deliver_to_location_id;
7350       l_tab_line_direction(cnt)     := rec.line_direction;   -- J-IB-NPARIKH
7351       l_tab_shipping_control(cnt)   := rec.shipping_control;   -- J-IB-NPARIKH
7352       l_tab_ignore_for_planning(cnt)   := rec.ignore_for_planning;
7353       l_tab_client_id(cnt)               := rec.client_id;  -- LSP PROJECT
7354       END LOOP;
7355 
7356     END LOOP;
7357 
7358     --
7359     -- K LPN CONV. rv
7360     IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7361     THEN
7362     --{
7363         IF (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_sync_tmp_wms_contlist.delivery_detail_id_tbl.count > 0)
7364         THEN
7365         --{
7366             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7367               (
7368                 p_sync_tmp_recTbl   => l_sync_tmp_wms_contlist,
7369                 x_return_status     => l_return_status
7370               );
7371 
7372             IF l_debug_on THEN
7373               WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7374             END IF;
7375             --
7376             IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7377               x_return_status := l_return_status;
7378               --
7379               IF l_debug_on THEN
7380                   WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7381                   WSH_DEBUG_SV.pop(l_module_name);
7382               END IF;
7383               --
7384               RETURN;
7385             ELSE
7386               IF l_return_status <> C_SUCCESS_STATUS THEN
7387                 x_return_status := C_WARNING_STATUS;
7388               END IF;
7389             END IF;
7390         --}
7391         ELSIF (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_sync_tmp_inv_contlist.delivery_detail_id_tbl.count > 0)
7392         THEN
7393         --{
7394             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7395               (
7396                 p_sync_tmp_recTbl   => l_sync_tmp_inv_contlist,
7397                 x_return_status     => l_return_status
7398               );
7399 
7400             IF l_debug_on THEN
7401               WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7402             END IF;
7403             --
7404             IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7405               x_return_status := l_return_status;
7406               --
7407               IF l_debug_on THEN
7408                   WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7409                   WSH_DEBUG_SV.pop(l_module_name);
7410               END IF;
7411               --
7412               RETURN;
7413             ELSE
7414               IF l_return_status <> C_SUCCESS_STATUS THEN
7415                 x_return_status := C_WARNING_STATUS;
7416               END IF;
7417             END IF;
7418         --}
7419         END IF;
7420     --}
7421     END IF;
7422     -- K LPN CONV. rv
7423 -- update container with all the attributes
7424     --BUG#12904248
7425     FOR cnt IN 1..g_assign_detail_tab.COUNT
7426 	LOOP
7427 
7428        OPEN c_get_deliver_to_location_id(l_contlist(cnt));
7429           FETCH c_get_deliver_to_location_id into l_deliver_to_location_id;
7430        IF c_get_deliver_to_location_id%notfound THEN
7431           l_deliver_to_location_id:=null;
7432        END IF;
7433 
7434        CLOSE c_get_deliver_to_location_id;
7435 
7436 	   IF l_debug_on THEN
7437                   WSH_DEBUG_SV.log(l_module_name,'cnt ',cnt);
7438 				  WSH_DEBUG_SV.log(l_module_name,'l_deliver_to_location_id ',l_deliver_to_location_id);
7439                   WSH_DEBUG_SV.log(l_module_name,'l_tab_deliver_location_id(cnt) ',l_tab_deliver_location_id(cnt));
7440        END IF;
7441 
7442        -- If conatiner deliver to location id is null
7443        IF l_deliver_to_location_id is null THEN
7444        -- if this is first record and conatiner in last record is different from current record container then assign delivery detail
7445        -- deliver to location to conatiner else make conatiner deliver to location as NULL
7446           IF cnt =1 or l_container_id <>l_contlist(cnt) THEN
7447              l_deliver_to_location_id1 :=l_tab_deliver_location_id(cnt);
7448           ELSE
7449              l_deliver_to_location_id1 := null;
7450           END IF;
7451        ELSE
7452           IF l_deliver_to_location_id = l_tab_deliver_location_id(cnt) THEN
7453              l_deliver_to_location_id1 := l_tab_deliver_location_id(cnt);
7454           ELSE
7455              l_deliver_to_location_id1 := null;
7456           END IF;
7457 
7458        END IF;
7459 
7460        l_container_id := l_contlist(cnt);
7461 
7462        IF l_debug_on THEN
7463           WSH_DEBUG_SV.log(l_module_name,'l_deliver_to_location_id1 ', l_deliver_to_location_id1);
7464        END IF;
7465 
7466       UPDATE WSH_DELIVERY_DETAILS
7467          SET customer_id = l_tab_cust_id(cnt),
7468              ship_to_location_id = l_tab_ship_location_id(cnt),
7469              intmed_ship_to_location_id = l_tab_intmed_location_id(cnt),
7470              fob_code = l_tab_fob_code(cnt),
7471              freight_terms_code = l_tab_freight_terms_code(cnt),
7472              ship_method_code = l_tab_ship_method_code(cnt),
7473              carrier_id = l_tab_carrier_id(cnt),
7474              service_level = l_tab_service_level(cnt),
7475              mode_of_transport = l_tab_mode_of_transport(cnt),
7476              deliver_to_location_id = l_deliver_to_location_id1,
7477              line_direction = l_tab_line_direction(cnt),
7478              shipping_control = l_tab_shipping_control(cnt),
7479              ignore_for_planning = l_tab_ignore_for_planning(cnt),
7480 	     client_id           = l_tab_client_id(cnt) -- LSP PROJECT
7481        WHERE DELIVERY_DETAIL_ID = l_contlist(cnt);
7482      END LOOP;
7483 
7484 
7485 -- then if the delivery detail has a delivery assigned, update the container records
7486 -- in WDA to indicate delivery id
7487     --
7488     -- K LPN CONV. rv
7489     IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7490     THEN
7491     --{
7492         IF (WSH_WMS_LPN_GRP.GK_WMS_ASSIGN_DLVY and l_sync_tmp_wms_contlist1.delivery_detail_id_tbl.count > 0)
7493         THEN
7494         --{
7495             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7496               (
7497                 p_sync_tmp_recTbl   => l_sync_tmp_wms_contlist1,
7498                 x_return_status     => l_return_status
7499               );
7500 
7501             IF l_debug_on THEN
7502               WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7503             END IF;
7504             --
7505             IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7506               x_return_status := l_return_status;
7507               --
7508               IF l_debug_on THEN
7509                   WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7510                   WSH_DEBUG_SV.pop(l_module_name);
7511               END IF;
7512               --
7513               RETURN;
7514             ELSE
7515               IF l_return_status <> C_SUCCESS_STATUS THEN
7516                 x_return_status := C_WARNING_STATUS;
7517               END IF;
7518             END IF;
7519         --}
7520         ELSIF (WSH_WMS_LPN_GRP.GK_INV_ASSIGN_DLVY and l_sync_tmp_inv_contlist1.delivery_detail_id_tbl.count > 0)
7521         THEN
7522         --{
7523             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7524               (
7525                 p_sync_tmp_recTbl   => l_sync_tmp_inv_contlist1,
7526                 x_return_status     => l_return_status
7527               );
7528 
7529             IF l_debug_on THEN
7530               WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7531             END IF;
7532             --
7533             IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7534               x_return_status := l_return_status;
7535               --
7536               IF l_debug_on THEN
7537                   WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7538                   WSH_DEBUG_SV.pop(l_module_name);
7539               END IF;
7540               --
7541               RETURN;
7542             ELSE
7543               IF l_return_status <> C_SUCCESS_STATUS THEN
7544                 x_return_status := C_WARNING_STATUS;
7545               END IF;
7546             END IF;
7547         --}
7548         END IF;
7549     --}
7550     END IF;
7551     -- K LPN CONV. rv
7552 
7553     -- OTM R12 : assign delivery detail
7554    /*Commented by adagur for bug 16397445
7555     IF (l_gc3_is_installed = 'Y') THEN
7556       -- loop through the deliveries in l_dellist1,
7557       -- and get ignore_for_planning and tms_interface_flag tab,
7558       -- for ignore_for_planning delivery, check whether it's empty
7559       l_index := l_dellist1.FIRST;
7560       WHILE (l_index IS NOT NULL) LOOP
7561         -- l_dellist1(l_index) might be null if the container is not assigned
7562         -- to a delivery
7563         IF (l_dellist1(l_index) IS NOT NULL) THEN
7564           OPEN c_get_plan_and_tms_flag(l_dellist1(l_index));
7565           FETCH c_get_plan_and_tms_flag INTO l_ignore_for_planning_tab(l_index),
7566                                              l_tms_interface_flag_tab(l_index);
7567           IF c_get_plan_and_tms_flag%NOTFOUND THEN
7568           --{
7569             IF l_debug_on THEN
7570               WSH_DEBUG_SV.log(l_module_name,'No data for c_get_plan_and_tms_flag', l_dellist1(l_index));
7571             END IF;
7572             CLOSE c_get_plan_and_tms_flag;
7573             raise FND_API.G_EXC_ERROR;
7574           END IF;
7575 
7576           CLOSE c_get_plan_and_tms_flag;
7577 
7578           l_delivery_was_empty_tab(l_index) := FALSE;
7579           IF (l_ignore_for_planning_tab(l_index) = 'N') THEN
7580             l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(l_dellist1(l_index));
7581             IF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
7582               IF l_debug_on THEN
7583                 WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
7584               END IF;
7585               raise FND_API.G_EXC_ERROR;
7586             ELSIF (l_is_delivery_empty = 'Y') THEN
7587               l_delivery_was_empty_tab(l_index) := TRUE;
7588             END IF;
7589           END IF;
7590           IF l_debug_on THEN
7591             WSH_DEBUG_SV.log(l_module_name,'l_dellist1('||l_index||')', l_dellist1(l_index));
7592             WSH_DEBUG_SV.log(l_module_name,'l_contlist1('||l_index||')', l_contlist1(l_index));
7593             WSH_DEBUG_SV.log(l_module_name,'l_ignore_for_planning_tab('||l_index||')', l_ignore_for_planning_tab(l_index));
7594             WSH_DEBUG_SV.log(l_module_name,'l_tms_interface_flag_tab('||l_index||')', l_tms_interface_flag_tab(l_index));
7595           END IF;
7596         ELSE
7597           l_ignore_for_planning_tab(l_index) := NULL;
7598           l_tms_interface_flag_tab(l_index) := NULL;
7599           l_delivery_was_empty_tab(l_index) := NULL;
7600           IF l_debug_on THEN
7601             WSH_DEBUG_SV.log(l_module_name, 'l_dellist1 is null for ', l_contlist1(l_index));
7602           END IF;
7603         END IF;
7604 
7605         l_index := l_dellist1.NEXT(l_index);
7606       END LOOP;
7607     END IF;
7608     -- End of OTM R12 : assign delivery detail
7609 
7610     FORALL cnt IN 1..g_new_contid_tab.COUNT
7611       UPDATE wsh_delivery_assignments_v
7612        SET delivery_id = l_dellist1(cnt),
7613              last_update_date = SYSDATE,
7614              last_updated_by = FND_GLOBAL.USER_ID,
7615              last_update_login = FND_GLOBAL.LOGIN_ID
7616       WHERE  DELIVERY_DETAIL_ID = l_contlist1(cnt);
7617 
7618 
7619     --
7620     -- OTM R12 : assign delivery detail
7621     IF (l_gc3_is_installed = 'Y') THEN
7622 
7623       l_index := l_dellist1.FIRST;
7624       l_index_update := 0;
7625       WHILE (l_index IS NOT NULL) LOOP
7626         IF (l_dellist1(l_index) IS NOT NULL AND
7627             l_ignore_for_planning_tab(l_index) = 'N') THEN
7628 
7629           IF (l_delivery_was_empty_tab(l_index)) THEN
7630             l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(l_dellist1(l_index));
7631 
7632             IF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
7633               --handle the error approriately to the procedure this code is in
7634               IF l_debug_on THEN
7635                 WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
7636               END IF;
7637               raise FND_API.G_EXC_ERROR;
7638             ELSIF (l_is_delivery_empty = 'N') THEN
7639               IF (l_tms_interface_flag_tab(l_index) = WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT) THEN
7640                 l_index_update := l_index_update + 1;
7641                 l_delivery_id_tab(l_index_update) := l_dellist1(l_index);
7642                 l_interface_flag_tab(l_index_update) := WSH_NEW_DELIVERIES_PVT.C_TMS_CREATE_REQUIRED;
7643 
7644                 IF (l_debug_on) THEN
7645                   WSH_DEBUG_SV.logmsg(l_module_name, 'Delivery is not empty');
7646                   WSH_DEBUG_SV.log(l_module_name,'l_dellist1', l_dellist1(l_index));
7647                   WSH_DEBUG_SV.log(l_module_name,'l_interface_flag_tab', l_interface_flag_tab(l_index_update));
7648                 END IF;
7649               ELSIF (l_tms_interface_flag_tab(l_index) in
7650                      (WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_REQUIRED,
7651                       WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_IN_PROCESS)) THEN
7652                 l_index_update := l_index_update + 1;
7653                 l_delivery_id_tab(l_index_update) := l_dellist1(l_index);
7654                 l_interface_flag_tab(l_index_update) := WSH_NEW_DELIVERIES_PVT.C_TMS_UPDATE_REQUIRED;
7655                 IF (l_debug_on) THEN
7656                   WSH_DEBUG_SV.logmsg(l_module_name, 'Delivery is not empty');
7657                   WSH_DEBUG_SV.log(l_module_name,'l_dellist1', l_dellist1(l_index));
7658                   WSH_DEBUG_SV.log(l_module_name,'l_interface_flag_tab', l_interface_flag_tab(l_index_update));
7659                 END IF;
7660               END IF;
7661             END IF;
7662           ELSE -- (NOT l_delivery_was_empty)
7663 
7664             OPEN c_get_tare_weight(l_contlist1(l_index));
7665             FETCH c_get_tare_weight INTO l_tare_weight;
7666 
7667             IF c_get_tare_weight%NOTFOUND THEN
7668             --{
7669               IF l_debug_on THEN
7670                 WSH_DEBUG_SV.log(l_module_name,'No data for c_get_tare_weight', l_contlist1(l_index));
7671               END IF;
7672               CLOSE c_get_tare_weight;
7673               raise FND_API.G_EXC_ERROR;
7674             END IF;
7675             CLOSE c_get_tare_weight;
7676 
7677             IF (l_debug_on) THEN
7678               WSH_DEBUG_SV.logmsg(l_module_name, 'Delivery was not empty');
7679               WSH_DEBUG_SV.log(l_module_name,'l_dellist1', l_dellist1(l_index));
7680               WSH_DEBUG_SV.log(l_module_name,'l_contlist1', l_contlist1(l_index));
7681               WSH_DEBUG_SV.log(l_module_name,'l_tare_weight', l_tare_weight);
7682             END IF;
7683               l_index_update := l_index_update + 1;
7684               l_delivery_id_tab(l_index_update) := l_dellist1(l_index);
7685               l_interface_flag_tab(l_index_update) := NULL;
7686               --Bug7608629
7687               --removed code which checked for gross weight
7688               --now irrespective of tare weight UPDATE_TMS_INTERFACE_FLAG will be called
7689           END IF;
7690         END IF;
7691         l_index := l_dellist1.NEXT(l_index);
7692       END LOOP;
7693 
7694       IF (l_index_update > 0) THEN
7695         WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG(
7696                        p_delivery_id_tab        => l_delivery_id_tab,
7697                        p_tms_interface_flag_tab => l_interface_flag_tab,
7698                        x_return_status          => l_return_status);
7699 
7700         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
7701           IF l_debug_on THEN
7702             WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG '||l_return_status);
7703           END IF;
7704           raise FND_API.G_EXC_ERROR;
7705         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
7706           IF l_debug_on THEN
7707             WSH_DEBUG_SV.logmsg(l_module_name,'Warning in WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG '||l_return_status);
7708           END IF;
7709           cont_warn := cont_warn + 1;
7710         END IF;
7711 
7712       END IF;
7713     END IF;
7714     -- End of OTM R12 : assign delivery detail
7715     End of Comment by adagur for bug 16397445 */
7716 
7717    l_mdc_id_tab.delete;
7718    l_mdc_index_i := l_contlist1.FIRST;
7719    l_mdc_index_j := 0;
7720    WHILE l_mdc_index_i IS NOT NULL LOOP
7721        l_mdc_index_j := l_mdc_index_j + 1;
7722        l_mdc_id_tab(l_mdc_index_j) := l_contlist1(l_mdc_index_i);
7723        l_mdc_index_i := l_contlist1.next(l_mdc_index_i);
7724 
7725    END LOOP;
7726 
7727    WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
7728                   p_detail_id_tab     => l_mdc_id_tab,
7729                   x_return_status     => x_return_status);
7730 
7731    IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7732        IF l_debug_on THEN
7733           WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
7734           WSH_DEBUG_SV.pop(l_module_name);
7735        END IF;
7736        RETURN;
7737    END IF;
7738 
7739 -- J: W/V Changes
7740    IF l_debug_on THEN
7741      WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment 3 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7742    END IF;
7743    FOR i in 1..l_contlist1.COUNT LOOP
7744      IF l_debug_on THEN
7745        WSH_DEBUG_SV.logmsg(l_module_name,'Cont:Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
7746      END IF;
7747 
7748      WSH_WV_UTILS.DD_WV_Post_Process(
7749        p_delivery_detail_id => l_contlist1(i),
7750        p_diff_gross_wt      => l_cont_Wtlist(i),
7751        p_diff_net_wt        => NULL,
7752        p_diff_volume        => l_cont_Vollist(i),
7753        p_diff_fill_volume   => l_cont_Vollist(i),
7754        x_return_status      => l_return_status);
7755 
7756      IF (l_return_status <> C_SUCCESS_STATUS) THEN
7757        --
7758        IF (l_return_status = C_ERROR_STATUS OR
7759            l_return_status = C_UNEXP_ERROR_STATUS) THEN
7760          error_cnt := error_cnt + 1;
7761        ELSE
7762          cont_warn := cont_warn + 1;
7763        END IF;
7764 
7765      END IF;
7766    END LOOP;
7767    IF l_debug_on THEN
7768      WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment 3 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7769    END IF;
7770 
7771     -- 75.1 Bulk Update Weight/Volume on packed delivery details
7772  -- added the WHO columns in the UPDATE
7773  -- in WSHWVUTB.pls , update_container_wt there are no WHO columns
7774     FORALL cnt IN 1..g_assign_detail_tab.COUNT
7775       UPDATE WSH_DELIVERY_DETAILS
7776       SET    NET_WEIGHT   = l_NetWtlist(cnt),
7777              GROSS_WEIGHT = l_GrossWtlist(cnt),
7778              VOLUME       = l_Vollist(cnt),
7779              last_update_date = SYSDATE,
7780              last_updated_by = FND_GLOBAL.USER_ID,
7781              last_update_login = FND_GLOBAL.LOGIN_ID
7782       WHERE  DELIVERY_DETAIL_ID = l_ddlist(cnt);
7783 
7784   END IF; -- line_cont_tab.COUNT > 0
7785 
7786   --H integration : Pricing Integration
7787   IF l_del_tab.count > 0 THEN
7788     IF l_debug_on THEN
7789       WSH_DEBUG_SV.logmsg(l_module_name,'Calling Program Unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
7790     END IF;
7791     WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required
7792       (p_entity_type => 'DELIVERY',
7793        p_entity_ids  => l_del_tab,
7794        x_return_status => l_return_status
7795       );
7796     IF l_debug_on THEN
7797       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
7798     END IF;
7799     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
7800       RAISE mark_reprice_error;
7801     END IF;
7802   END IF;
7803   -- End of H integration : Pricing Integration
7804 
7805 --dbms_output.put_line('AFTER CONT WT'||to_char(sysdate,'HH24:MI:SS'));
7806   -- 90.1 Summarize errors/warnings
7807 
7808   IF l_debug_on THEN
7809     WSH_DEBUG_SV.logmsg(l_module_name,'Error, warn,success Count -'||error_cnt||','||warn_cnt||','||succ_cnt);
7810   END IF;
7811   IF (warn_cnt > 0 OR cont_warn > 0) THEN
7812     x_return_status := C_WARNING_STATUS;
7813     IF cont_warn > 0 THEN
7814       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_PACK_WARN');
7815       FND_MESSAGE.SET_TOKEN('CONT_WARN',cont_warn);
7816       FND_MESSAGE.SET_TOKEN('CONT_ERR',0);
7817       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7818     END IF;
7819   ELSIF (error_cnt > 0) THEN
7820     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_PACK_ERROR');
7821     FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
7822     FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
7823     FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
7824     IF succ_cnt > 0 THEN
7825       x_return_status := C_WARNING_STATUS;
7826     ELSE
7827       x_return_status := C_ERROR_STATUS;
7828     END IF;
7829     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7830   ELSE
7831     x_return_status := C_SUCCESS_STATUS;
7832   END IF;
7833 
7834   IF l_debug_on THEN
7835     WSH_DEBUG_SV.logmsg(l_module_name,'L ret status -'||l_return_status);
7836     WSH_DEBUG_SV.logmsg(l_module_name,'X ret status -'||x_return_status);
7837   END IF;
7838   IF x_return_status = C_ERROR_STATUS THEN
7839     IF p_pack_cont_flag = 'Y' THEN
7840       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MASTER_NOT_PACK');
7841       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7842     END IF;
7843     --
7844     IF l_debug_on THEN
7845         WSH_DEBUG_SV.pop(l_module_name);
7846     END IF;
7847     --
7848     return;
7849   ELSE
7850     l_return_status := x_return_status;
7851   END IF;
7852 
7853   IF l_debug_on THEN
7854     WSH_DEBUG_SV.logmsg(l_module_name,'2L ret status -'||l_return_status);
7855     WSH_DEBUG_SV.logmsg(l_module_name,'2X ret status -'||x_return_status);
7856   END IF;
7857   -- 100.1 Call WSH_CONTAINER_ACTIONS.Auto_Pack_Conts depending on
7858   --       p_pack_cont_flag and if new detail containers are created
7859   IF l_detail_cont_tab.count > 0 AND p_pack_cont_flag = 'Y' THEN
7860 
7861     l_group_id_tab.delete;
7862 
7863     --dbms_output.put_line('Calling AUTO PACK CONTS With x_cont_instance count of ' || x_cont_instance_tab.count);
7864     --
7865     IF l_debug_on THEN
7866         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.AUTO_PACK_CONTS',WSH_DEBUG_SV.C_PROC_LEVEL);
7867     END IF;
7868     --
7869     wsh_container_actions.Auto_Pack_Conts (
7870       l_group_id_tab,
7871       l_detail_cont_tab,
7872       x_cont_instance_tab,
7873       l_mast_cont_tab,
7874       l_return_status);
7875 
7876     IF l_debug_on THEN
7877       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
7878     END IF;
7879     IF l_return_status = C_UNEXP_ERROR_STATUS THEN
7880       --dbms_output.put_line('Returned from autopack conts with unexpected error');
7881       /* No message WSH_CONT_CONT_AUTOPACK_ERR
7882       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CONT_AUTOPACK_ERR');
7883       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7884       IF l_return_status <> C_ERROR_STATUS THEN
7885         l_return_status := C_WARNING_STATUS;
7886       END IF;
7887       */
7888       x_return_status := l_return_status;
7889       --
7890       IF l_debug_on THEN
7891           WSH_DEBUG_SV.pop(l_module_name);
7892       END IF;
7893       --
7894       RETURN;
7895     ELSE
7896       IF l_return_status <> C_SUCCESS_STATUS THEN
7897         x_return_status := C_WARNING_STATUS;
7898       END IF;
7899     END IF;
7900 
7901     --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Auto_Pack_Conts created '||l_mast_cont_tab.COUNT||' Master Containers');
7902     IF l_mast_cont_tab.COUNT > 0 THEN
7903       i := 1;
7904       cnt := x_cont_instance_tab.COUNT;
7905       WHILE i  <= l_mast_cont_tab.COUNT LOOP
7906         cnt := cnt + 1;
7907         x_cont_instance_tab(cnt) := l_mast_cont_tab(i);
7908         i := i + 1;
7909       END LOOP;
7910     END IF;
7911 
7912   END IF;
7913 
7914   IF l_debug_on THEN
7915     WSH_DEBUG_SV.logmsg(l_module_name,'3L ret status -'||l_return_status);
7916     WSH_DEBUG_SV.logmsg(l_module_name,'3X ret status -'||x_return_status);
7917   END IF;
7918 IF l_debug_on THEN
7919     WSH_DEBUG_SV.pop(l_module_name);
7920 END IF;
7921 --
7922 EXCEPTION
7923 
7924   WHEN mark_reprice_error THEN
7925     FND_MESSAGE.Set_Name('WSH','WSH_REPRICE_REQD_ERR');
7926     x_return_status := l_return_status;
7927     WSH_UTIL_CORE.add_message(x_return_status,l_module_name);
7928     IF l_debug_on THEN
7929       WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7930       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
7931     END IF;
7932 
7933   -- OTM R12 : assign delivery detail
7934   WHEN FND_API.G_EXC_ERROR THEN
7935     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7936     IF c_get_plan_and_tms_flag%ISOPEN THEN
7937       CLOSE c_get_plan_and_tms_flag;
7938     END IF;
7939     IF c_get_tare_weight%ISOPEN THEN
7940       CLOSE c_get_tare_weight;
7941     END IF;
7942 
7943     --
7944     IF l_debug_on THEN
7945       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
7946       WSH_DEBUG_SV.pop(l_module_name);
7947     END IF;
7948     --
7949     RETURN;
7950   -- End of OTM R12 : assign delivery detail
7951 
7952   WHEN Others THEN
7953     -- OTM R12 : assign delivery detail
7954     IF c_get_plan_and_tms_flag%ISOPEN THEN
7955       CLOSE c_get_plan_and_tms_flag;
7956     END IF;
7957     IF c_get_tare_weight%ISOPEN THEN
7958       CLOSE c_get_tare_weight;
7959     END IF;
7960     -- End of OTM R12 : assign delivery detail
7961 
7962         WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Auto_Pack_Lines',l_module_name);
7963         x_return_status := C_UNEXP_ERROR_STATUS;
7964 
7965 --
7966 IF l_debug_on THEN
7967     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
7968     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
7969 END IF;
7970 --
7971 END Auto_Pack_Lines;
7972 
7973 /*
7974 -----------------------------------------------------------------------------
7975    PROCEDURE  : Auto_Pack_Delivery
7976    PARAMETERS : p_delivery_tab - table of delivery ids that need to be
7977 			autopacked.
7978 		x_cont_instance_tab - table of container instance ids that were
7979 			created during the autopacking.
7980 		x_return_status - return status of API.
7981   DESCRIPTION : This procedure takes a table of deliveries that need to be
7982 		autopacked and checks for all unpacked lines in each of the
7983 		deliveries. After fetching all unpacked lines in each delivery,
7984 		it calls the Auto_Pack_Lines with the table of unpacked lines.
7985 		After autopacking the lines, it recalculates the weight and
7986 		volume of the delivery.
7987 ------------------------------------------------------------------------------
7988 */
7989 
7990 
7991 PROCEDURE Auto_Pack_Delivery (
7992   p_delivery_tab IN WSH_UTIL_CORE.id_tab_type,
7993   p_pack_cont_flag IN VARCHAR2,
7994   x_cont_instance_tab OUT NOCOPY  WSH_UTIL_CORE.id_tab_type,
7995   x_return_status OUT NOCOPY  VARCHAR2) IS
7996 
7997   CURSOR get_delivery_wms(x_delivery_id NUMBER) IS
7998   SELECT mp.wms_enabled_flag
7999   FROM   wsh_new_deliveries wnd,
8000          mtl_parameters     mp
8001   WHERE  wnd.delivery_id = x_delivery_id
8002   AND    mp.organization_id = wnd.organization_id;
8003 
8004 
8005   CURSOR Get_Delivery_Lines (v_delivery_id NUMBER) IS
8006   SELECT wda.delivery_detail_id
8007   FROM wsh_delivery_assignments_v wda,
8008        WSH_DELIVERY_DETAILS wdd
8009   WHERE wda.delivery_id = v_delivery_id
8010   AND wda.delivery_id IS NOT NULL
8011   AND wda.parent_delivery_detail_id IS NULL
8012   AND wda.delivery_detail_id = wdd.delivery_detail_id
8013   AND wdd.container_flag = 'N';
8014 
8015   l_del_detail_tab WSH_UTIL_CORE.id_tab_type;
8016   l_group_id_tab WSH_UTIL_CORE.id_tab_type;
8017 
8018   l_gross_weight NUMBER;
8019   l_volume NUMBER;
8020 
8021   l_cont_instance_tab WSH_UTIL_CORE.id_tab_type;
8022 
8023   l_ret_sts VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8024   l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8025 
8026   error_cnt NUMBER := 0;
8027   warn_cnt  NUMBER := 0;
8028   succ_cnt NUMBER := 0;
8029 
8030   i NUMBER;
8031   m NUMBER := 0;
8032   l_del_rows WSH_UTIL_CORE.id_tab_type;
8033 
8034   l_del_name VARCHAR2(30);
8035   l_wms_count NUMBER := 0;
8036   l_wms_enabled_flag VARCHAR2(1);
8037 
8038   -- LPN CONV. rv
8039   l_lpn_in_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_in_rec_type;
8040   l_lpn_out_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_out_rec_type;
8041   l_msg_count NUMBER;
8042   l_msg_data VARCHAR2(32767);
8043   e_return_excp EXCEPTION;
8044   -- LPN CONV. rv
8045 
8046 
8047 --
8048 l_debug_on BOOLEAN;
8049 --
8050 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'AUTO_PACK_DELIVERY';
8051 --
8052 BEGIN
8053   --
8054   --
8055   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
8056   --
8057   IF l_debug_on IS NULL
8058   THEN
8059       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
8060   END IF;
8061   --
8062   IF l_debug_on THEN
8063       WSH_DEBUG_SV.push(l_module_name);
8064       --
8065       WSH_DEBUG_SV.log(l_module_name,'P_PACK_CONT_FLAG',P_PACK_CONT_FLAG);
8066   END IF;
8067   --
8068   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8069 
8070   l_del_rows.delete;
8071 
8072   FOR j IN 1..p_delivery_tab.count LOOP
8073 
8074     i := 1;
8075     l_ret_sts := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8076     l_del_detail_tab.delete;
8077 
8078     IF l_debug_on THEN
8079       WSH_DEBUG_SV.log(l_module_name,'Auto pack delivery ', p_delivery_tab(j));
8080     END IF;
8081     -- bug 1578527: disallow packing actions in WMS
8082 
8083     OPEN  get_delivery_wms(p_delivery_tab(j));
8084     FETCH get_delivery_wms INTO l_wms_enabled_flag;
8085     IF get_delivery_wms%NOTFOUND THEN
8086       CLOSE get_delivery_wms;
8087       FND_MESSAGE.SET_NAME('WSH', 'WSH_NO_DATA_FOUND');
8088       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8089       --
8090       --IF l_debug_on THEN
8091           --WSH_DEBUG_SV.pop(l_module_name);
8092       --END IF;
8093       --
8094       --RETURN; LPN CONV. rv
8095       raise e_return_excp; -- LPN CONV. rv
8096     END IF;
8097     CLOSE get_delivery_wms;
8098 
8099     IF l_wms_enabled_flag = 'Y' THEN
8100       l_wms_count := l_wms_count + 1;
8101       l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
8102       goto next_delivery_to_autopack;
8103     END IF;
8104 
8105     FOR d IN Get_Delivery_Lines (p_delivery_tab(j)) LOOP
8106 
8107 	l_del_detail_tab(i) := d.delivery_detail_id;
8108         IF l_debug_on THEN
8109            WSH_DEBUG_SV.log(l_module_name,'pupulate delivery detail id  ', d.delivery_detail_id );
8110         END IF;
8111 	i := i + 1;
8112 
8113     END LOOP;
8114 
8115     IF Get_Delivery_Lines%ISOPEN THEN
8116 	CLOSE Get_Delivery_Lines;
8117     END IF;
8118     IF l_debug_on THEN
8119        WSH_DEBUG_SV.log(l_module_name,'l_del_detail_tab.count: ', l_del_detail_tab.count );
8120     END IF;
8121     IF l_del_detail_tab.count = 0 THEN
8122 
8123 	l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
8124 
8125 	FND_MESSAGE.SET_NAME('WSH','WSH_DEL_AUTOPACK_NULL');
8126 	--
8127 	IF l_debug_on THEN
8128 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.GET_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
8129 	END IF;
8130 	--
8131 	l_del_name := WSH_NEW_DELIVERIES_PVT.Get_Name(p_delivery_tab(j));
8132 	FND_MESSAGE.SET_TOKEN('DEL_NAME',l_del_name);
8133 	WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
8134     ELSE
8135 
8136     	--
8137     	IF l_debug_on THEN
8138     	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.AUTO_PACK_LINES',WSH_DEBUG_SV.C_PROC_LEVEL);
8139     	END IF;
8140     	--
8141 
8142     	wsh_container_actions.Auto_Pack_Lines (
8143 		l_group_id_tab,
8144 		l_del_detail_tab,
8145 		p_pack_cont_flag,
8146 		l_cont_instance_tab,
8147 		l_return_status);
8148 
8149         IF l_debug_on THEN
8150           WSH_DEBUG_SV.log(l_module_name,'Return status from wsh_container_actions.Auto_Pack_Lines -',l_return_status);
8151         END IF;
8152     	IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR OR l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
8153 		--dbms_output.put_line('autopack lines failed');
8154 		l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
8155     	ELSE
8156           IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
8157 	    l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
8158 	  ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN  -- Bug#2903864 - Start
8159 	     IF (x_cont_instance_tab IS NULL) THEN
8160 	         x_cont_instance_tab := l_cont_instance_tab;
8161 	     ELSE
8162 		 FOR i in 1..l_cont_instance_tab.count LOOP
8163 			x_cont_instance_tab(x_cont_instance_tab.count + 1) := l_cont_instance_tab(i);
8164 		 END LOOP;
8165 	     END IF; -- Bug#2903864 - End
8166 
8167           END IF;
8168 
8169     	END IF;
8170 
8171     END IF;
8172     <<next_delivery_to_autopack>>
8173     IF l_debug_on THEN
8174       WSH_DEBUG_SV.log(l_module_name,'return status for delivery '|| p_delivery_tab(j), l_ret_sts );
8175     END IF;
8176     IF l_ret_sts = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8177        succ_cnt := succ_cnt + 1;
8178     ELSIF l_ret_sts = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
8179        warn_cnt := warn_cnt + 1;
8180     ELSE
8181        error_cnt := error_cnt + 1;
8182     END IF;
8183   END LOOP;
8184 
8185    -- bug 1578527: disallow packing actions in WMS
8186    IF l_wms_count > 0 THEN
8187       IF l_wms_count = p_delivery_tab.count THEN
8188           FND_MESSAGE.SET_NAME('WSH', 'WSH_WMS_PACK_NOT_ALLOWED');
8189           WSH_UTIL_CORE.Add_message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
8190       ELSE
8191           FND_MESSAGE.SET_NAME('WSH', 'WSH_WMS_RECORDS_NOT_PACKED');
8192           FND_MESSAGE.SET_TOKEN('COUNT', l_wms_count);
8193           WSH_UTIL_CORE.Add_message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
8194       END IF;
8195    END IF;
8196 
8197    /*  H integration: Pricing integration csun
8198        when plan a delivery
8199    */
8200    IF l_del_rows.count > 0 THEN
8201 	--
8202 	IF l_debug_on THEN
8203 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
8204 	END IF;
8205 	--
8206 	WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
8207 	   p_entity_type => 'DELIVERY',
8208 	   p_entity_ids   => l_del_rows,
8209 	   x_return_status => l_return_status);
8210 
8211         IF l_debug_on THEN
8212           WSH_DEBUG_SV.log(l_module_name,'Return status from WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required -',l_return_status);
8213         END IF;
8214         IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR
8215 	      l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
8216 	      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8217 	      FND_MESSAGE.SET_NAME('WSH', 'WSH_REPRICE_REQUIRED_ERR');
8218 	      WSH_UTIL_CORE.add_message(x_return_status,l_module_name);
8219               --IF l_debug_on THEN
8220               --  WSH_DEBUG_SV.pop(l_module_name);
8221               --END IF;
8222 	      --return; LPN CONV. rv
8223               raise e_return_excp; -- LPN CONV. rv
8224 	END IF;
8225    END IF;
8226 
8227    -- LPN CONV. rv
8228    --
8229    IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8230    THEN
8231    --{
8232 
8233        IF l_debug_on THEN
8234          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);
8235        END IF;
8236        --
8237        WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8238          (
8239            p_in_rec             => l_lpn_in_sync_comm_rec,
8240            x_return_status      => l_return_status,
8241            x_out_rec            => l_lpn_out_sync_comm_rec
8242          );
8243        --
8244        IF l_debug_on THEN
8245            WSH_DEBUG_SV.log(l_module_name,  'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
8246        END IF;
8247        --
8248        WSH_UTIL_CORE.API_POST_CALL
8249          (
8250            p_return_status    => l_return_status,
8251            x_num_warnings     => warn_cnt,
8252            x_num_errors       => error_cnt,
8253            p_raise_error_flag => false
8254          );
8255    --}
8256    END IF;
8257    -- LPN CONV. rv
8258    --
8259 
8260   IF warn_cnt > 0 THEN
8261   	x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8262   	FND_MESSAGE.SET_NAME('WSH','WSH_DEL_PACK_WARN');
8263  	FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
8264 	FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
8265 	FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
8266   	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8267 
8268   ELSIF error_cnt > 0 THEN
8269      IF succ_cnt > 0 THEN
8270   	x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8271   	FND_MESSAGE.SET_NAME('WSH','WSH_DEL_PACK_WARN');
8272  	FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
8273 	FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
8274 	FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
8275   	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8276      ELSE
8277         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8278 	FND_MESSAGE.SET_NAME('WSH','WSH_DEL_PACK_ERROR');
8279 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8280      END IF;
8281   ELSIF succ_cnt > 0 THEN
8282      x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8283   ELSE
8284      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8285   END IF;
8286 
8287   IF l_debug_on THEN
8288       WSH_DEBUG_SV.pop(l_module_name);
8289   END IF;
8290 
8291 EXCEPTION
8292     -- LPN CONV. rv
8293     WHEN e_return_excp THEN
8294         --
8295         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8296         THEN
8297         --{
8298              --
8299              IF l_debug_on THEN
8300                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);
8301              END IF;
8302              --
8303              WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8304                (
8305                  p_in_rec             => l_lpn_in_sync_comm_rec,
8306                  x_return_status      => l_return_status,
8307                  x_out_rec            => l_lpn_out_sync_comm_rec
8308                );
8309              --
8310              IF l_debug_on THEN
8311                WSH_DEBUG_SV.log(l_module_name,  'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
8312              END IF;
8313              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
8314                x_return_status := l_return_status;
8315              END IF;
8316         --}
8317         END IF;
8318         --
8319         -- LPN CONV. rv
8320         --
8321         IF l_debug_on THEN
8322           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:E_RETURN_EXCP');
8323         END IF;
8324 
8325   WHEN Others THEN
8326         --
8327         WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Auto_Pack_Delivery',l_module_name);
8328         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8329 
8330         IF l_debug_on THEN
8331           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS FROM WHEN OTHERS',WSH_DEBUG_SV.C_PROC_LEVEL);
8332         END IF;
8333         --
8334         IF l_debug_on THEN
8335           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS FROM WHEN OTHERS',WSH_DEBUG_SV.C_PROC_LEVEL);
8336         END IF;
8337         --
8338         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8339         THEN
8340         --{
8341              --
8342              IF l_debug_on THEN
8343                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);
8344              END IF;
8345              --
8346             WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8347               (
8348                 p_in_rec             => l_lpn_in_sync_comm_rec,
8349                 x_return_status      => l_return_status,
8350                 x_out_rec            => l_lpn_out_sync_comm_rec
8351               );
8352             --
8353             IF l_debug_on THEN
8354               WSH_DEBUG_SV.log(l_module_name,  'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
8355             END IF;
8356         --}
8357         END IF;
8358         --
8359         -- LPN CONV. rv
8360         --
8361         IF l_debug_on THEN
8362           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
8363         END IF;
8364 END Auto_Pack_Delivery;
8365 
8366 
8367 /*
8368 -----------------------------------------------------------------------------
8369    PROCEDURE  : Pack_Multi
8370    PARAMETERS : p_cont_tab - table of container instance ids that are being
8371 		packed.
8372 		p_del_detail_tab - table of unpacked delivery detail ids.
8373 		p_pack_mode  - indicates whether containers are packed in
8374 		equal/proportional mode ('E') or in full/sequential mode ('F')
8375 		p_split_pc - the percentage by which each line is going to be
8376 		split in the case of equal packing mode.
8377 		x_pack_status - the packed status of containers after the multi
8378 		pack is performed - indicates whether any underpacked or
8379 		overpacked containers.
8380 		x_return_status - return status of API.
8381   DESCRIPTION : This procedure takes the specified delivery detail ids and
8382 		packs them into the selected containers in either the full mode
8383 		or equal mode. In the full mode, it packs the first container
8384 		fully before packing the next. In the equal mode, all lines
8385 		are split equally between all the containers and packed
8386 		equally between them.
8387 ------------------------------------------------------------------------------
8388 */
8389 
8390 
8391 PROCEDURE Pack_Multi (
8392  p_cont_tab IN WSH_UTIL_CORE.id_tab_type,
8393  p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
8394  p_pack_mode IN VARCHAR2,
8395  p_split_pc IN NUMBER,
8396  x_pack_status OUT NOCOPY  VARCHAR2,
8397  x_return_status OUT NOCOPY  VARCHAR2) IS
8398 
8399 
8400  CURSOR Get_Cont_Info (v_cont_instance_id NUMBER) IS
8401  SELECT inventory_item_id, organization_id, gross_weight, net_weight,
8402 	volume, weight_uom_code, volume_uom_code, fill_percent,
8403 	minimum_fill_percent, maximum_load_weight, maximum_volume
8404  FROM wsh_delivery_details
8405  WHERE delivery_detail_id = v_cont_instance_id
8406  AND container_flag = 'Y';
8407 
8408  CURSOR Get_Detail_Info (v_del_detail_id NUMBER) IS
8409  SELECT inventory_item_id, nvl(shipped_quantity, NVL(picked_quantity, requested_quantity)) pack_qty,
8410 	requested_quantity_uom, net_weight, volume,
8411 	weight_uom_code, volume_uom_code, organization_id,
8412 	nvl(detail_container_item_id, master_container_item_id) cont_item_id,
8413         nvl(shipped_quantity2, NVL(picked_quantity2, requested_quantity2)) pack_qty2
8414  FROM wsh_delivery_details
8415  WHERE delivery_detail_id = v_del_detail_id
8416  AND container_flag = 'N';
8417 
8418  TYPE Cont_Rec IS RECORD (container_instance_id NUMBER, pack_status VARCHAR2(30));
8419 
8420  TYPE Detail_Rec IS RECORD (delivery_detail_id NUMBER, pack_status VARCHAR2(30));
8421 
8422  TYPE Cont_Rec_Table IS TABLE OF Cont_Rec INDEX BY BINARY_INTEGER;
8423  TYPE Detail_Rec_Table IS TABLE OF Detail_Rec INDEX BY BINARY_INTEGER;
8424 
8425  l_cont_item_id		NUMBER;
8426  l_cont_org_id		NUMBER;
8427  l_cont_gross		NUMBER;
8428  l_cont_net		NUMBER;
8429  l_cont_volume		NUMBER;
8430  l_cont_wt_uom		VARCHAR2(3);
8431  l_cont_vol_uom		VARCHAR2(3);
8432  l_cont_fill_pc		NUMBER;
8433  l_cont_min_fill_pc	NUMBER;
8434  l_cont_max_load_wt	NUMBER;
8435  l_cont_max_vol		NUMBER;
8436 
8437  l_det_inv_item_id	NUMBER;
8438  l_det_pack_qty		NUMBER;
8439  l_det_pack_qty2	NUMBER;
8440  l_det_qty_uom		VARCHAR2(3);
8441  l_det_net		NUMBER;
8442  l_det_volume		NUMBER;
8443  l_det_wt_uom		VARCHAR2(3);
8444  l_det_vol_uom		VARCHAR2(3);
8445  l_det_org_id		NUMBER;
8446  l_det_cont_item_id	NUMBER;
8447 
8448  l_split_det_id		NUMBER;
8449  i			NUMBER;
8450  j			NUMBER;
8451  cont_count		NUMBER;
8452  det_count		NUMBER;
8453  l_req_cont_num		NUMBER;
8454  l_cont_avail_pc	NUMBER;
8455  l_cont_self_tare	NUMBER;
8456  l_split_qty		NUMBER;
8457  l_split_qty2           NUMBER;
8458  l_return_status	VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8459 
8460  l_tmp_cont_gr		NUMBER;
8461  l_tmp_cont_net		NUMBER;
8462  l_tmp_cont_vol		NUMBER;
8463  l_tmp_fill_pc		NUMBER;
8464  l_pack_status		VARCHAR2(30);
8465 
8466  l_tmp_split_qty 	NUMBER;
8467 
8468  l_tmp_det_net		NUMBER;
8469  l_tmp_det_vol		NUMBER;
8470 
8471  l_det_pack_sts		VARCHAR2(30);
8472 
8473  l_tmp_det_tab		WSH_UTIL_CORE.id_tab_type;
8474 
8475  l_cont_tab		Cont_Rec_Table;
8476  l_det_tab		Detail_Rec_Table;
8477 
8478  l_split_pc		NUMBER;
8479 
8480  l_tmp_det_qty 		NUMBER;
8481  l_tmp_det_count	NUMBER;
8482 
8483  l_tmp_delta            NUMBER;
8484 
8485  l_cont_name VARCHAR2(30);
8486 
8487  warn_cnt NUMBER := 0;
8488  succ_cnt NUMBER := 0;
8489  error_cnt NUMBER := 0;
8490 
8491  cont_warn NUMBER := 0;
8492  cont_err NUMBER := 0;
8493  cont_succ NUMBER := 0;
8494  l_tmp_return_status   varchar2(1);
8495 
8496  l_tmp_status VARCHAR2(30)  := 'OK';
8497  l_discard_status          VARCHAR2(1);
8498  l_discard_message VARCHAR2(2000);
8499  -- J: W/V Changes
8500  l_fill_status VARCHAR2(1);
8501 
8502   /* H projects: pricing integration csun */
8503   m NUMBER := 0;
8504   l_detail_rows   WSH_UTIL_CORE.id_tab_type;
8505 
8506 -- for Load Tender
8507   l_trip_id_tab wsh_util_core.id_tab_type;
8508 
8509 -- bug 3562797 jckwok
8510   l_process_flag         VARCHAR2(1);
8511   l_fill_pc_basis        VARCHAR2(1);
8512 -- end bug 3562797 jckwok
8513 
8514 --
8515 l_debug_on BOOLEAN;
8516 --
8517 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'PACK_MULTI';
8518 --Bugfix 4070732
8519 l_api_session_name CONSTANT VARCHAR2(150) := G_PKG_NAME ||'.' || l_module_name;
8520 l_reset_flags BOOLEAN;
8521 l_num_errors  NUMBER;
8522 --
8523 --
8524   l_num_warnings NUMBER;
8525 --
8526 
8527 -- HW OPM BUG# 3011758
8528 --HW OPMCONV - Removed OPM local variables
8529 
8530 -- HW OPMCONV - Renamed variable to l_lot_divisible_flag
8531 l_lot_divisible_flag                        VARCHAR2(1);
8532 -- HW OPMCONV - New variable to hold item info
8533 l_item_info                   WSH_DELIVERY_DETAILS_INV.mtl_system_items_rec;
8534 
8535 -- LPN CONV. rv
8536 l_lpn_in_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_in_rec_type;
8537 l_lpn_out_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_out_rec_type;
8538 l_msg_count NUMBER;
8539 l_msg_data VARCHAR2(32767);
8540 e_return_excp EXCEPTION;
8541 -- LPN CONV. rv
8542 
8543 BEGIN
8544  IF WSH_UTIL_CORE.G_START_OF_SESSION_API is null THEN  --Bugfix 4070732
8545    WSH_UTIL_CORE.G_START_OF_SESSION_API     := l_api_session_name;
8546    WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API := FALSE;
8547  END IF;
8548  --
8549  --
8550  l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
8551  --
8552  IF l_debug_on IS NULL
8553  THEN
8554      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
8555  END IF;
8556  --
8557  IF l_debug_on THEN
8558      WSH_DEBUG_SV.push(l_module_name);
8559      --
8560      WSH_DEBUG_SV.log(l_module_name,'P_PACK_MODE',P_PACK_MODE);
8561      WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_PC',P_SPLIT_PC);
8562  END IF;
8563  --
8564  IF p_cont_tab.count = 0 OR p_del_detail_tab.count = 0 THEN
8565     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_ASSG_NULL');
8566     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8567     x_pack_status := 'Error';
8568     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8569     --
8570     --Bugfix 4070732 {
8571     IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API)  = upper(l_api_session_name) THEN
8572        IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
8573           IF l_debug_on THEN
8574                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
8575           END IF;
8576 
8577           WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags   => TRUE,
8578                                                     x_return_status => l_tmp_return_status);
8579 
8580 
8581           IF l_debug_on THEN
8582                WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
8583           END IF;
8584           /*wsh_util_core.api_post_call
8585                (
8586                  p_return_status => l_return_status,
8587                  x_num_warnings  => l_num_warnings,
8588                  x_num_errors    => l_num_errors
8589                 );
8590           */
8591           IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
8592             X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8593           END IF;
8594        END IF;
8595     END IF;
8596     --}
8597     --IF l_debug_on THEN
8598     --    WSH_DEBUG_SV.pop(l_module_name);
8599     --END IF;
8600     --
8601     --return; LPN CONV. rv
8602     raise e_return_excp; -- LPN CONV. rv
8603  END IF;
8604 
8605  cont_count := p_cont_tab.count;
8606  det_count := p_del_detail_tab.count;
8607 
8608  --dbms_output.put_line('in pack multi conts are ' || cont_count || ' details are ' || det_count);
8609 
8610  FOR i IN 1..cont_count LOOP
8611 
8612    l_cont_tab(i).container_instance_id := p_cont_tab(i);
8613    l_cont_tab(i).pack_status := 'Unpacked';
8614 
8615  END LOOP;
8616 
8617 	--
8618 	--
8619 	-- added to fix bug 1818233.
8620 	-- pack_multi performs most of time doing this check, especially
8621 	-- when a single delivery line is being split into multiple due to
8622 	-- container-load relationship.
8623 	-- This check will be made only once for a delivery line in place of
8624 	-- doing it every time we assign a split delivery line to a container.
8625 	-- Thus, auto-pack lines will always call assign_detail procedure
8626 	-- with parameter p_check_credit_holds = FALSE.
8627 	-- pack_multi lines will explicitly call the procedure (as follows)
8628 	-- WSH_DETAILS_VALIDATIONS.Check_Credit_Holds only once for a delivery
8629 	-- line . If any of the delivery lines fails this check, API will
8630 	-- return with error.
8631 	--
8632 
8633  FOR j IN 1..det_count LOOP
8634 
8635    l_det_tab(j).delivery_detail_id := p_del_detail_tab(j);
8636    l_det_tab(j).pack_status := 'Unpacked';
8637 
8638             --
8639             IF l_debug_on THEN
8640                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_CREDIT_HOLDS',WSH_DEBUG_SV.C_PROC_LEVEL);
8641             END IF;
8642             --
8643             WSH_DETAILS_VALIDATIONS.Check_Credit_Holds (
8644                                         l_det_tab(j).delivery_detail_id,
8645                                         'PACK',
8646                                         NULL,
8647                                         NULL,
8648                                         NULL,
8649                                         'Y',
8650                                         x_return_status);
8651             IF l_debug_on THEN
8652               WSH_DEBUG_SV.log(l_module_name,'return status-', x_return_status);
8653             END IF;
8654 
8655             IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8656                 l_return_status :=  WSH_UTIL_CORE.G_RET_STS_ERROR;
8657 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DETAIL_NOT_ASSIGNED');
8658 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
8659 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
8660                 x_pack_status := 'Error';
8661             END IF;
8662 
8663  END LOOP;
8664 
8665  IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR
8666  THEN
8667      --Bugfix 4070732 {
8668     IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API)  = upper(l_api_session_name) THEN
8669        IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
8670           IF l_debug_on THEN
8671                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
8672           END IF;
8673 
8674           WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags   => TRUE,
8675                                                     x_return_status => l_tmp_return_status);
8676 
8677           IF l_debug_on THEN
8678                WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
8679           END IF;
8680 
8681           /* wsh_util_core.api_post_call
8682                (
8683                  p_return_status => l_return_status,
8684                  x_num_warnings  => l_num_warnings,
8685                  x_num_errors    => l_num_errors
8686                 );
8687           */
8688 
8689           IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
8690             X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8691           END IF;
8692        END IF;
8693     END IF;
8694     --}
8695     --
8696     --IF l_debug_on THEN
8697     --    WSH_DEBUG_SV.pop(l_module_name);
8698     --END IF;
8699     --
8700     --RETURN; LPN CONV. rv
8701     raise e_return_excp; -- LPN CONV. rv
8702  END IF;
8703 
8704  i := 1;
8705  j := 1;
8706 
8707  IF p_pack_mode = 'F' THEN
8708    -- packing mode is full - each container is filled before packing the next
8709 
8710    WHILE j <= det_count LOOP
8711 
8712 	--dbms_output.put_line('j = ' || j);
8713 	l_det_pack_sts := 'Unpacked';
8714 	i := 1;
8715 
8716         IF l_debug_on THEN
8717 	  WSH_DEBUG_SV.log(l_module_name,'processing line ' || j || ' detail is ' || l_det_tab(j).delivery_detail_id);
8718         END IF;
8719 
8720 	WHILE i <= cont_count LOOP
8721 	    	IF l_cont_tab(i).pack_status = 'Skipped' THEN
8722 			l_cont_tab(i).pack_status := 'Unpacked';
8723 		END IF;
8724 		i := i + 1;
8725 	END LOOP;
8726 
8727 	i := 1;
8728 
8729         WHILE (i <= cont_count AND l_det_pack_sts = 'Unpacked') LOOP
8730 
8731 /*
8732 	   if i <= 0 or i > 10 then
8733 		exit;
8734 	   end if;
8735 */
8736 
8737  	   OPEN Get_Detail_Info (l_det_tab(j).delivery_detail_id);
8738 
8739 	   FETCH Get_Detail_Info INTO
8740 	  	l_det_inv_item_id,
8741 	  	l_det_pack_qty,
8742 	  	l_det_qty_uom,
8743 	  	l_det_net,
8744 	  	l_det_volume,
8745 	  	l_det_wt_uom,
8746 	  	l_det_vol_uom,
8747 	  	l_det_org_id,
8748 	  	l_det_cont_item_id,
8749                 l_det_pack_qty2;
8750 
8751 	   IF Get_Detail_Info%NOTFOUND THEN
8752 	   	FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
8753 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
8754 	   	x_pack_status := 'Error';
8755 	   	l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8756 	   	CLOSE Get_Detail_Info;
8757 		WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
8758 		error_cnt := error_cnt + 1;
8759 		l_det_tab(j).pack_status := 'Error';
8760 		exit;
8761  	   END IF;
8762 
8763 	   IF Get_Detail_Info%ISOPEN THEN
8764 	   	CLOSE Get_Detail_Info;
8765 	   END IF;
8766 
8767            -- bug 3562797 jckwok
8768            -- when percent fill basis flag is None and packing mode as Full,
8769            -- packing workbench raises error.
8770            Calc_Fill_Basis_and_Proc_Flag(
8771                     p_organization_id => l_det_org_id,
8772                     x_return_status   => x_return_status,
8773                     x_fill_basis      => l_fill_pc_basis,
8774                     x_process_flag    => l_process_flag);
8775 
8776            IF l_debug_on THEN
8777              WSH_DEBUG_SV.log(l_module_name,'return status -',x_return_status);
8778            END IF;
8779 
8780            IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
8781                --Bugfix 4070732 {
8782              IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API)  = upper(l_api_session_name) THEN
8783                   IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
8784                      IF l_debug_on THEN
8785                            WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
8786                      END IF;
8787 
8788                      WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags   => TRUE,
8789                                                                x_return_status => l_tmp_return_status);
8790 
8791 
8792                      IF l_debug_on THEN
8793                           WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
8794                      END IF;
8795 
8796                      /*wsh_util_core.api_post_call
8797                           (
8798                             p_return_status => l_return_status,
8799                             x_num_warnings  => l_num_warnings,
8800                             x_num_errors    => l_num_errors
8801                            );
8802                      */
8803 
8804                      IF
8805                      (l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
8806                      OR
8807                      (x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
8808                      THEN --{
8809                         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8810                      ELSIF x_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR
8811                      THEN
8812                         IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR
8813                         THEN
8814                            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8815                         ELSIF l_tmp_return_status =
8816                            WSH_UTIL_CORE.G_RET_STS_WARNING THEN
8817                            x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8818                         END IF;
8819                      END IF; --}
8820 
8821                   END IF;
8822              END IF;
8823              --}
8824              --IF l_debug_on THEN
8825              --  WSH_DEBUG_SV.pop(l_module_name);
8826              --END IF;
8827              --RETURN;
8828              raise e_return_excp; -- LPN CONV. rv
8829            END IF;
8830            IF (l_fill_pc_basis = 'N') THEN
8831               FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
8832               l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8833               WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
8834               x_pack_status := 'Error';
8835               error_cnt := error_cnt + 1;
8836               l_det_tab(j).pack_status := 'Error';
8837               exit;
8838            END IF;
8839            -- end bug 3562797 jckwok
8840 --- HW OPM BUG# 3011758
8841 -- HW OPMCONV - 1) Removed branching code
8842 --            - 2) Removed call to OPM API to get item info
8843 --            - 3) New WSH API call to get item info
8844 
8845            WSH_DELIVERY_DETAILS_INV.Get_item_information
8846              (
8847                 p_organization_id       =>l_det_org_id
8848               , p_inventory_item_id    => l_det_inv_item_id
8849               , x_mtl_system_items_rec => l_item_info
8850               , x_return_status        => l_return_status
8851              );
8852 
8853             wsh_util_core.api_post_call
8854              (
8855                 p_return_status => l_return_status,
8856                 x_num_warnings  => l_num_warnings,
8857                 x_num_errors    => l_num_errors
8858              );
8859 
8860 -- HW OPMCONV - Get flag from correct record
8861              IF ( l_item_info.lot_divisible_flag = 'N' AND
8862                   l_item_info.lot_control_code = 2 ) THEN
8863                l_lot_divisible_flag := 'N';
8864              ELSE
8865                l_lot_divisible_flag := 'Y';
8866              END IF;
8867 
8868 	   --dbms_output.put_line('before checking for unpacked conts ' || i || l_cont_tab(i).pack_status);
8869 
8870 
8871 	   WHILE (i <= cont_count and l_cont_tab(i).pack_status <> 'Unpacked') LOOP
8872 	 	i := i + 1;
8873 
8874 	   END LOOP;
8875 
8876 	   --dbms_output.put_line('after looping for unpacked conts i = ' || i);
8877 
8878 	   IF i > cont_count THEN
8879 		exit;
8880 	   END IF;
8881 
8882 	   OPEN Get_Cont_Info (l_cont_tab(i).container_instance_id);
8883 
8884 	   FETCH Get_Cont_Info INTO
8885 		l_cont_item_id,
8886 		l_cont_org_id,
8887 		l_cont_gross,
8888 	  	l_cont_net,
8889 	  	l_cont_volume,
8890 	  	l_cont_wt_uom,
8891 	  	l_cont_vol_uom,
8892 	  	l_cont_fill_pc,
8893 	  	l_cont_min_fill_pc,
8894 	  	l_cont_max_load_wt,
8895 	  	l_cont_max_vol;
8896 
8897 	   IF Get_Cont_Info%NOTFOUND THEN
8898 		--
8899 		IF l_debug_on THEN
8900 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
8901 		END IF;
8902 		--
8903 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
8904 	   	FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
8905 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
8906 	   	x_pack_status := 'Error';
8907 	   	l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8908 	   	CLOSE Get_Cont_Info;
8909 		WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
8910 		cont_err := cont_err + 1;
8911 		l_cont_tab(i).pack_status := 'Error';
8912 		l_tmp_status := 'Error';
8913 		GOTO new_container;
8914  	   END IF;
8915 
8916 	   CLOSE Get_Cont_Info;
8917 
8918 	   --dbms_output.put_line('processing container ' || i || ' id is ' || l_cont_tab(i).container_instance_id);
8919 
8920 /*
8921 --           WSH_WV_UTILS.Container_Weight_Volume (
8922 --	     replacing with TPA enabled API..
8923 
8924 	     --
8925 	     IF l_debug_on THEN
8926 	         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
8927 	     END IF;
8928 	     --
8929 	     WSH_TPA_CONTAINER_PKG.Container_Weight_Volume (
8930 				l_cont_tab(i).container_instance_id,
8931 				'Y',
8932 				l_tmp_cont_gr,
8933 				l_tmp_cont_net,
8934 				l_tmp_cont_vol,
8935 				'Y',
8936 				l_tmp_fill_pc,
8937 				x_return_status);
8938            IF l_debug_on THEN
8939 	     WSH_DEBUG_SV.log(l_module_name,'return status ' ,x_return_status);
8940            END IF;
8941 
8942 	   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8943 		--dbms_output.put_line('container wt vol error');
8944 
8945 		l_cont_tab(i).pack_status := 'Warning';
8946 		--
8947 		IF l_debug_on THEN
8948 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
8949 		END IF;
8950 		--
8951 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
8952 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
8953 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
8954 
8955 
8956 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
8957 		cont_warn := cont_warn + 1;
8958 		l_tmp_status := 'Error';
8959 		GOTO new_container;
8960 	   END IF;
8961 
8962 	   IF (l_tmp_fill_pc > 100) THEN
8963 */
8964            IF (l_cont_fill_pc > 100) THEN
8965 
8966 		--dbms_output.put_line('cont overpacked');
8967 
8968 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
8969 			l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8970 		END IF;
8971 
8972 		l_cont_tab(i).pack_status := 'Overpacked';
8973 		cont_warn := cont_warn + 1;
8974 		l_tmp_status := 'Error';
8975 		GOTO new_container;
8976            END IF;
8977 
8978            -- bug 4642837 l_tmp_fill_pc --> l_cont_fill_pc
8979 
8980 	   l_cont_avail_pc := 1 - (nvl(l_cont_fill_pc,0)/100);
8981 
8982 	   IF (l_cont_org_id = l_det_org_id) THEN
8983 
8984 --	  	WSH_CONTAINER_UTILITIES.Estimate_Detail_Containers (
8985 --		replacing with TPA enabled API..
8986 
8987 		--
8988 		IF l_debug_on THEN
8989 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.ESTIMATE_DETAIL_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
8990 		END IF;
8991 		--
8992 		WSH_TPA_CONTAINER_PKG.Estimate_Detail_Containers (
8993 			l_cont_tab(i).container_instance_id,
8994 			l_cont_item_id,
8995 			l_det_tab(j).delivery_detail_id,
8996 			l_det_org_id,
8997 			l_req_cont_num,
8998 			x_return_status);
8999 
9000                 IF l_debug_on THEN
9001 	          WSH_DEBUG_SV.log(l_module_name,'return status ' ,x_return_status);
9002                 END IF;
9003 	    	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9004 			l_cont_tab(i).pack_status := 'Skipped';
9005 			l_det_tab(j).pack_status := 'Error';
9006 			error_cnt := error_cnt + 1;
9007 			l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9008 			l_tmp_status := 'Error';
9009 			GOTO new_container;
9010 	    	END IF;
9011 
9012 		--dbms_output.put_line('req cont is ' || l_req_cont_num);
9013 		--dbms_output.put_line(' cont avail pc is ' || l_cont_avail_pc);
9014 
9015 		IF l_req_cont_num <= l_cont_avail_pc THEN
9016 
9017 		    l_tmp_det_tab(1) := l_det_tab(j).delivery_detail_id;
9018 
9019                 IF l_debug_on THEN
9020 	          WSH_DEBUG_SV.log(l_module_name,'assigning detail ' || l_tmp_det_tab(1) || ' to container ' || l_cont_tab(i).container_instance_id);
9021 		  WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
9022                 END IF;
9023 
9024 		    --
9025 		    wsh_container_actions.Assign_Detail (
9026 					l_cont_tab(i).container_instance_id,
9027 					l_tmp_det_tab,
9028 					l_pack_status,
9029 					x_return_status,FALSE);
9030                     IF l_debug_on THEN
9031 	              WSH_DEBUG_SV.log(l_module_name,'return status ' ,x_return_status);
9032                     END IF;
9033 		    IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9034 			--dbms_output.put_line('could not assign');
9035 			l_cont_tab(i).pack_status := 'Skipped';
9036 			l_det_tab(j).pack_status := 'Error';
9037 			error_cnt := error_cnt + 1;
9038 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9039 				l_return_status := x_return_status;
9040 			END IF;
9041 
9042 		    ELSIF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9043 			l_det_tab(j).pack_status := 'Packed';
9044 			l_det_pack_sts := 'Packed';
9045 -- J: W/V Changes
9046                        WSH_WV_UTILS.Check_Fill_Pc (
9047                          p_container_instance_id => l_cont_tab(i).container_instance_id,
9048                          x_fill_status           => l_fill_status,
9049                          x_return_status         => l_return_status);
9050 
9051                        IF l_fill_status = 'O' THEN
9052                            --
9053                            IF l_debug_on THEN
9054                                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9055                            END IF;
9056                            --
9057                            l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9058 
9059                            --dbms_output.put_line('container ' || l_cont_name || ' overpacked ');
9060 
9061 
9062                            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9063                                 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9064                            END IF;
9065 
9066                            l_cont_tab(i).pack_status := 'Overpacked';
9067                            cont_warn := cont_warn + 1;
9068                            l_tmp_status := 'Error';
9069                        END IF;
9070 
9071 		       l_det_pack_sts := 'Packed';
9072 
9073  		       IF l_req_cont_num = l_cont_avail_pc THEN
9074 	 	          l_cont_tab(i).pack_status := 'Packed';
9075 			  i := i + 1;
9076 		       END IF;
9077 
9078 
9079  		     END IF;
9080 
9081 		ELSE -- if line needs to be split
9082 
9083 		    l_tmp_split_qty := ROUND(((l_det_pack_qty*l_cont_avail_pc)/l_req_cont_num),LIMITED_PRECISION);
9084 
9085 		    --
9086 		    IF l_debug_on THEN
9087 		        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
9088 		    END IF;
9089 		    --
9090 		    WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
9091 					l_det_inv_item_id,
9092 					l_det_org_id,
9093 					l_tmp_split_qty,
9094 					l_det_qty_uom,
9095 					l_split_qty,
9096 					l_discard_status);
9097                        IF l_debug_on THEN
9098 	                 WSH_DEBUG_SV.log(l_module_name,'return status ' ,l_discard_status);
9099                        END IF;
9100 
9101 		    -- bug 1716136: errors likely mean integers are safe values.
9102 		    IF l_discard_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9103                         l_discard_message := FND_MESSAGE.GET;
9104                         l_split_qty := FLOOR(l_tmp_split_qty);
9105 		    END IF;
9106 
9107 		    IF l_split_qty IS NULL THEN
9108 			l_split_qty := l_tmp_split_qty;
9109 		    END IF;
9110 
9111 		    IF (l_split_qty < 0 OR l_split_qty > l_det_pack_qty) THEN
9112 			FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
9113 			FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9114 			l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9115 			WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9116 			l_det_tab(j).pack_status := 'Error';
9117 			error_cnt := error_cnt + 1;
9118 			exit;
9119 		    END IF;
9120 
9121 		    IF l_split_qty >= 1 THEN
9122 
9123                       IF l_det_pack_qty = l_split_qty THEN
9124                         IF l_debug_on THEN
9125                           WSH_DEBUG_SV.log(l_module_name,'In IF of equal-');
9126                         END IF;
9127                         l_split_det_id := l_det_tab(j).delivery_detail_id;
9128                         IF l_debug_on THEN
9129                           WSH_DEBUG_SV.log(l_module_name,'DELIVERY DETAIL id'||l_split_det_id);
9130                         END IF;
9131                         l_tmp_det_tab(1) := l_split_det_id;
9132                         l_tmp_det_count := j;
9133                         l_det_pack_sts := 'Packed';
9134 
9135                       ELSIF l_det_pack_qty > l_split_qty THEN
9136 
9137 --- HW OPM BUG# 3011758
9138 -- if lot indivisbile and last container, raise an error
9139 -- else go to the next container
9140 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9141 --            - 2) Changed check condition for lot divisible from 1 to 'N'
9142                          IF  ( l_lot_divisible_flag = 'N' AND i = cont_count AND l_det_pack_sts = 'Unpacked') THEN
9143                            FND_MESSAGE.SET_NAME('WSH','WSH_OPM_IND_SPLIT_PACK');
9144                            FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9145                            l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9146                            WSH_UTIL_CORE.Add_Message(l_return_status);
9147                            l_det_tab(j).pack_status := 'Error';
9148                            error_cnt := error_cnt + 1;
9149                            exit;
9150 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9151 --            - 2) Changed check condition for lot divisible from 1 to 'N'
9152                          ELSIF  ( l_lot_divisible_flag = 'N' AND i < cont_count AND l_det_pack_sts = 'Unpacked') THEN
9153                            goto new_container;
9154 			--dbms_output.put_line('calling split details');
9155 
9156 		    	--
9157 		    	ELSE -- non divisible
9158 
9159                           l_split_qty2 := (l_split_qty * l_det_pack_qty2)/l_det_pack_qty;
9160 		    	  IF l_debug_on THEN
9161                             WSH_DEBUG_SV.log(l_module_name,'l_split_qty',l_split_qty);
9162                             WSH_DEBUG_SV.log(l_module_name,'l_split_qty2',l_split_qty2);
9163                             WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty2',l_det_pack_qty2);
9164                             WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty',l_det_pack_qty);
9165 		    	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
9166 		    	  END IF;
9167 		    	--
9168 
9169 		    	  WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details (
9170 				p_from_detail_id => l_det_tab(j).delivery_detail_id,
9171 				p_req_quantity => l_split_qty,
9172 				p_req_quantity2 => l_split_qty2,
9173 				x_new_detail_id => l_split_det_id,
9174 				x_return_status =>x_return_status,
9175                                 p_manual_split => 'C'
9176                                 );
9177 			--dbms_output.put_line('...split detail id ' || l_split_det_id);
9178 		    	  IF l_debug_on THEN
9179 		    	    WSH_DEBUG_SV.log(l_module_name,'return status,split det id -',x_return_status||l_split_det_id);
9180 		    	  END IF;
9181 
9182 		    	  IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9183 				--dbms_output.put_line('error in splitting');
9184 				FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
9185 				FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9186 				l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9187 				WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9188 				l_det_tab(j).pack_status := 'Error';
9189 				error_cnt := error_cnt + 1;
9190 				exit;
9191 		    	  END IF;
9192 
9193 			--dbms_output.put_line('after splitting lines');
9194 
9195 			-- update detail attributes by decrementing shipped quantity
9196 			-- (if not null) by the split quantity and updating the shipped
9197 			-- quantity of the new line to be eqaul to the split quantity
9198 
9199 		   	l_tmp_det_tab(1) := l_split_det_id;
9200 		        l_tmp_det_count := l_det_tab.count + 1;
9201 			l_det_tab(l_tmp_det_count).delivery_detail_id := l_split_det_id;
9202 
9203 		      END IF;
9204 		    	--
9205 		    	IF l_debug_on THEN
9206 		    	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
9207 		    	END IF;
9208 		    	--
9209 		    	wsh_container_actions.Assign_Detail (
9210 					l_cont_tab(i).container_instance_id,
9211 				        l_tmp_det_tab,
9212 					l_pack_status,
9213 					x_return_status,FALSE);
9214 
9215 		    	IF l_debug_on THEN
9216 		    	    WSH_DEBUG_SV.log(l_module_name,'return status -',x_return_status);
9217 		    	END IF;
9218 
9219 		    	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9220 			     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9221 				l_return_status := x_return_status;
9222 			     END IF;
9223 
9224 			     l_det_tab(l_tmp_det_count).pack_status := 'Error';
9225 			     l_cont_tab(i).pack_status := 'Skipped';
9226 			     error_cnt := error_cnt + 1;
9227 
9228 		        END IF;
9229 
9230 		        IF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9231 			   l_det_tab(l_tmp_det_count).pack_status := 'Packed';
9232 			   l_cont_tab(i).pack_status := 'Packed';
9233 -- J: W/V Changes
9234 
9235                            WSH_WV_UTILS.Check_Fill_Pc (
9236                              p_container_instance_id => l_cont_tab(i).container_instance_id,
9237                              x_fill_status           => l_fill_status,
9238                              x_return_status         => l_return_status);
9239 
9240                            IF l_fill_status = 'O' THEN
9241                                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9242                                    l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9243                                 END IF;
9244 
9245                                 l_cont_tab(i).pack_status := 'Overpacked';
9246                                 cont_warn := cont_warn + 1;
9247                                 l_tmp_status := 'Error';
9248                                 GOTO new_container;
9249                            END IF;
9250 
9251 			   l_cont_tab(i).pack_status := 'Packed';
9252 
9253 		    	END IF; -- if packing successful
9254                       END IF; --- of of 3011758
9255 		    ELSE -- split qty < 1 means cannot split - so try next cont
9256 
9257 			i := i + 1;
9258 
9259 		    END IF; -- if split qty >= 1
9260 
9261 		END IF; -- if l_req_cont_num < = l_cont_avail_pc
9262 
9263 	     ELSE -- means org ids don't match and so try next container.
9264 
9265 		i := i + 1;
9266 
9267 	     END IF; -- if l_cont_org_id = l_det_org_id
9268 
9269 	     <<new_container>>
9270 		  	i := i + 1;
9271 			l_tmp_status := 'OK';
9272 
9273 	     END LOOP;  -- inner loop of containers
9274 
9275 	     j := j + 1;
9276 
9277 	 END LOOP;    -- outer loop of lines
9278 
9279    -- at end of loop, if all containers had been used, cont_count should be 0
9280    -- and if all lines had been used, j should be > det_count.
9281    -- if j <= det_count, then it implies that some lines were unpacked so
9282    -- issue a warning.
9283 
9284  ELSIF p_pack_mode = 'E' THEN
9285    -- packing mode is equal - each line is split equally between all containers
9286    -- and each split line is packed into each container. Packs even if
9287    -- container is overpacked/underpacked and returns with a warning.
9288 
9289     IF (p_split_pc IS NULL OR p_split_pc = 0) THEN
9290 	l_split_pc := 100/(p_cont_tab.count);
9291     ELSE
9292 	l_split_pc := p_split_pc;
9293     END IF;
9294 
9295     FOR j IN 1..det_count LOOP
9296 
9297    	IF l_debug_on THEN
9298    	  WSH_DEBUG_SV.log(l_module_name,'===========================================');
9299           WSH_DEBUG_SV.log(l_module_name,'pack mode E: processing detail ' || l_det_tab(j).delivery_detail_id);
9300    	END IF;
9301 
9302 	OPEN Get_Detail_Info (l_det_tab(j).delivery_detail_id);
9303 
9304 	FETCH Get_Detail_Info INTO
9305 	    l_det_inv_item_id,
9306 	    l_det_pack_qty,
9307 	    l_det_qty_uom,
9308 	    l_det_net,
9309 	    l_det_volume,
9310 	    l_det_wt_uom,
9311 	    l_det_vol_uom,
9312 	    l_det_org_id,
9313 	    l_det_cont_item_id,
9314             l_det_pack_qty2;
9315 
9316 	IF Get_Detail_Info%NOTFOUND THEN
9317 	    FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
9318 	    FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9319 	    l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9320 	    CLOSE Get_Detail_Info;
9321 	    --dbms_output.put_line('error in fetching details for ' || l_det_tab(j).delivery_detail_id);
9322 	    l_det_tab(j).pack_status := 'Error';
9323 	    WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9324 	    l_tmp_status := 'Error';
9325 	    GOTO next_detail;
9326  	END IF;
9327 
9328 	CLOSE Get_Detail_Info;
9329 
9330 
9331 -- HW OPM BUG#:3011758. get OPM item information
9332 -- HW OPMCONV - 1)Change the call from OPM API to get item info
9333 --                to a new WSH API
9334 --            - 2) Remove checking for process
9335 
9336           WSH_DELIVERY_DETAILS_INV.Get_item_information
9337           (
9338                p_organization_id       => l_det_org_id
9339               , p_inventory_item_id    => l_det_inv_item_id
9340               , x_mtl_system_items_rec => l_item_info
9341               , x_return_status        => l_return_status
9342             );
9343 
9344      wsh_util_core.api_post_call
9345       (
9346         p_return_status => l_return_status,
9347         x_num_warnings  => l_num_warnings,
9348         x_num_errors    => l_num_errors
9349       );
9350 
9351 
9352            IF ( l_item_info.lot_divisible_flag = 'N' AND
9353                   l_item_info.lot_control_code = 2 ) THEN
9354              l_lot_divisible_flag := 'N';
9355            ELSE
9356              l_lot_divisible_flag := 'Y';
9357            END IF;
9358 
9359         l_tmp_split_qty := ROUND((l_split_pc*l_det_pack_qty/100),LIMITED_PRECISION);
9360 
9361 	--
9362 	IF l_debug_on THEN
9363 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
9364 	END IF;
9365 	--
9366 	WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
9367 			l_det_inv_item_id,
9368 			l_det_org_id,
9369 			l_tmp_split_qty,
9370 			l_det_qty_uom,
9371 			l_split_qty,
9372 			l_discard_status);
9373 
9374 	IF l_debug_on THEN
9375 	  WSH_DEBUG_SV.log(l_module_name,'return status-',l_discard_status);
9376 	END IF;
9377 
9378         -- bug 1716136: errors likely mean integers are safe values.
9379 	IF l_discard_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9380                 l_discard_message := FND_MESSAGE.GET;
9381                 l_split_qty := FLOOR(l_tmp_split_qty);
9382 	END IF;
9383 	/* Bug 2173615 - added l_split_qty = 0,in case of fractional split example = 0.3 */
9384 	IF (l_split_qty IS NULL OR l_split_qty = 0) THEN
9385 		l_split_qty := l_tmp_split_qty;
9386 	END IF;
9387 
9388 	--dbms_output.put_line('l_split_qty = ' || l_split_qty);
9389         /* Bug 2173615 ,changed 1 to zero */
9390         IF l_split_qty < 0 THEN
9391 	   l_split_qty := 1;
9392 	   --dbms_output.put_line('because < 1, l_split_qty now = ' || l_split_qty);
9393         END IF;
9394 
9395 	l_tmp_det_qty := 0;
9396 
9397  	FOR i IN 1..cont_count LOOP
9398 
9399 	IF l_debug_on THEN
9400 	  WSH_DEBUG_SV.log(l_module_name,'----- packing into container ' || l_cont_tab(i).container_instance_id);
9401           WSH_DEBUG_SV.log(l_module_name,'Tmp Det Qty,Det Pack Qty,split qty',l_tmp_det_qty||l_det_pack_qty||l_split_qty);
9402 	END IF;
9403 	   --dbms_output.put_line('l_tmp_det_qty = ' || l_tmp_det_qty);
9404 	   --dbms_output.put_line('l_det_pack_qty = ' || l_det_pack_qty);
9405 	   --dbms_output.put_line('l_split_qty = ' || l_split_qty);
9406 
9407 	   IF l_tmp_det_qty <= l_det_pack_qty THEN
9408 
9409 		OPEN Get_Cont_Info (l_cont_tab(i).container_instance_id);
9410 
9411 		FETCH Get_Cont_Info INTO
9412 			l_cont_item_id,
9413 			l_cont_org_id,
9414 			l_cont_gross,
9415 		  	l_cont_net,
9416 		  	l_cont_volume,
9417 		  	l_cont_wt_uom,
9418 		  	l_cont_vol_uom,
9419 	  		l_cont_fill_pc,
9420 		  	l_cont_min_fill_pc,
9421 		  	l_cont_max_load_wt,
9422 	  		l_cont_max_vol;
9423 
9424 		IF Get_Cont_Info%NOTFOUND THEN
9425 			--
9426 			IF l_debug_on THEN
9427 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9428 			END IF;
9429 			--
9430 			l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9431 	   		FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
9432 			FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9433 		   	-- x_pack_status := 'Error';
9434 		   	l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9435 			l_cont_tab(i).pack_status := 'Error';
9436 	   		CLOSE Get_Cont_Info;
9437 			WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9438 			cont_err := cont_err + 1;
9439 			l_tmp_status := 'Error';
9440 			GOTO next_container;
9441  	   	END IF;
9442 
9443 	   	CLOSE Get_Cont_Info;
9444 
9445 		IF l_cont_org_id = l_det_org_id THEN
9446 
9447 		   --dbms_output.put_line('Decision point: compare ' || (l_tmp_det_qty + l_split_qty) || ' with ' || l_det_pack_qty);
9448 
9449 		   -- bug 1367540:
9450 		   -- due to round-off errors in calculating floating-point values (e.g., 1/3 = 0.33333...)
9451 		   -- avoid exact comparisons
9452 
9453 		   l_tmp_delta := l_det_pack_qty - (l_tmp_det_qty + l_split_qty);
9454 
9455 		   IF l_tmp_delta > 0.00001 THEN  -- if (l_tmp_det_qty + l_split_qty) < l_det_pack_qty) then
9456 
9457 			--dbms_output.put_line('SPLITTING line ' || l_det_tab(j).delivery_detail_id || ' by ' || l_split_qty);
9458  	    	   	--
9459 
9460 --- HW OPM BUG# 3011758
9461 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9462 --            - 2) Changed check condition for lot divisible from 1 to 'N'
9463                       IF  ( l_lot_divisible_flag = 'N' AND i = cont_count AND l_det_pack_sts = 'Unpacked') THEN
9464                          FND_MESSAGE.SET_NAME('WSH','WSH_OPM_IND_SPLIT_PACK');
9465                          FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9466                          l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9467                          WSH_UTIL_CORE.Add_Message(l_return_status);
9468                          l_det_tab(j).pack_status := 'Error';
9469                          error_cnt := error_cnt + 1;
9470                          exit;
9471 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9472 --            - 2) Changed check condition for lot divisible from 1 to 'N'
9473                       ELSIF  ( l_lot_divisible_flag = 'N' AND i < cont_count AND l_det_pack_sts = 'Unpacked') THEN
9474                         goto next_container;
9475 
9476                       ELSE -- non divisible
9477                         l_split_qty2 := (l_split_qty * l_det_pack_qty2)/l_det_pack_qty;
9478 
9479  	    	   	IF l_debug_on THEN
9480                           WSH_DEBUG_SV.log(l_module_name,'l_split_qty',l_split_qty);
9481                           WSH_DEBUG_SV.log(l_module_name,'l_split_qty2',l_split_qty2);
9482                           WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty2',l_det_pack_qty2);
9483                           WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty',l_det_pack_qty);
9484  	    	   	  WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
9485  	    	   	END IF;
9486 
9487   	    	        WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details (
9488 			  p_from_detail_id => l_det_tab(j).delivery_detail_id,
9489 			  p_req_quantity => l_split_qty,
9490 			  p_req_quantity2 => l_split_qty2,
9491 			  x_new_detail_id => l_split_det_id,
9492 			  x_return_status => x_return_status,
9493                           p_manual_split => 'C'
9494                                 );
9495  	    	   	IF l_debug_on THEN
9496  	    	   	   WSH_DEBUG_SV.log(l_module_name,'return status',x_return_status);
9497  	    	   	END IF;
9498 			--dbms_output.put_line('...split detail id ' || l_split_det_id);
9499 
9500 	    	   	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9501 			  FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
9502 			  FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9503                           l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9504 			  WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9505 	    		--dbms_output.put_line('error in splitting details for ' || l_det_tab(j).delivery_detail_id);
9506                           error_cnt := error_cnt + 1;
9507                           l_det_tab(j).pack_status := 'Error';
9508                           exit;
9509 	    	   	END IF;
9510 	    	      END IF; -- end of 3011758
9511 
9512 			-- update detail attributes by decrementing shipped quantity
9513 			-- (if not null) by the split quantity and updating the shipped
9514 			-- quantity of the new line to be eqaul to the split quantity
9515 
9516 	   	   	l_tmp_det_tab(1) := l_split_det_id;
9517    	           	l_tmp_det_count := l_det_tab.count + 1;
9518 		   	l_det_tab(l_tmp_det_count).delivery_detail_id := l_split_det_id;
9519   		    	--dbms_output.put_line('split line is  ' || l_split_det_id);
9520 
9521 		   ELSIF l_tmp_delta >= -0.00001 THEN -- elsif (l_tmp_det_qty + l_split_qty) = l_det_pack_qty then
9522 			-- Here, l_tmp_delta is between -0.00001 and 0.00001 (see the first IF condition).
9523 
9524 			l_split_det_id := l_det_tab(j).delivery_detail_id;
9525 			l_tmp_det_tab(1) := l_det_tab(j).delivery_detail_id;
9526 			l_tmp_det_count := j;
9527 		    	--dbms_output.put_line('NO SPLIT and line is  ' || l_split_det_id);
9528 		   ELSE
9529 			-- bug 1367540: this case had not been handled before,
9530 			-- so when neither condition above was met, the last split detail was reassigned.
9531 			-- The API will return a warning if the container turns out to be overpacked.
9532 			l_split_det_id := l_det_tab(j).delivery_detail_id;
9533 			l_tmp_det_tab(1) := l_det_tab(j).delivery_detail_id;
9534 			l_tmp_det_count := j;
9535 		    	--dbms_output.put_line('NO SPLIT, POSSIBLE OVERPACK and line ' || l_split_det_id || ' will be assigned.');
9536 		   END IF;
9537 
9538 		   --dbms_output.put_line('* * * ASSIGNING detail ' || l_tmp_det_tab(1) || ' to container ' || l_cont_tab(i).container_instance_id);
9539 
9540 	    	   --
9541 	    	   IF l_debug_on THEN
9542 	    	       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
9543 	    	   END IF;
9544 	    	   --
9545 	    	   wsh_container_actions.Assign_Detail (
9546 			l_cont_tab(i).container_instance_id,
9547 		        l_tmp_det_tab,
9548 			l_pack_status,
9549 			x_return_status,FALSE);
9550 
9551  	    	  IF l_debug_on THEN
9552  	    	    WSH_DEBUG_SV.log(l_module_name,'return status',x_return_status);
9553  	    	  END IF;
9554 
9555 	    	   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9556 		        --dbms_output.put_line('error in assigning details for ' || l_tmp_det_tab(1));
9557 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9558 				l_return_status := x_return_status;
9559 			END IF;
9560 		 	error_cnt := error_cnt + 1;
9561 		       	l_det_tab(l_tmp_det_count).pack_status := 'Error';
9562 
9563 	           ELSIF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9564 		       --dbms_output.put_line('assigned line ' || l_tmp_det_tab(1));
9565 		       l_det_tab(l_tmp_det_count).pack_status := 'Packed';
9566 		       l_cont_tab(i).pack_status := 'Packed';
9567 
9568 -- J: W/V Changes
9569                        WSH_WV_UTILS.Check_Fill_Pc (
9570                          p_container_instance_id => l_cont_tab(i).container_instance_id,
9571                          x_fill_status           => l_fill_status,
9572                          x_return_status         => l_return_status);
9573 
9574                        IF (l_fill_status = 'O'  AND l_cont_item_id IS NOT NULL) THEN
9575 
9576                           IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9577                             l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9578                           END IF;
9579 
9580                           cont_warn := cont_warn + 1;
9581                           l_cont_tab(i).pack_status := 'Overpacked';
9582                        ELSIF (l_fill_status = 'U'
9583                                           AND l_cont_item_id IS NOT NULL ) THEN
9584 
9585                           IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9586                             l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9587                           END IF;
9588 
9589                           cont_warn := cont_warn + 1;
9590                           l_cont_tab(i).pack_status := 'Underpacked';
9591                        ELSE
9592                           l_cont_tab(i).pack_status := 'Packed';
9593                        END IF;
9594 
9595 		   END IF; -- if assign was successful
9596 
9597 		   l_tmp_det_qty := l_tmp_det_qty + l_split_qty;
9598 		ELSE
9599 		   --dbms_output.put_line('orgs dont match for detail ' || l_det_tab(j).delivery_detail_id || ' and container ' || l_cont_tab(i).container_instance_id);
9600 		   FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NO_MATCH');
9601 		   FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9602 		   --
9603 		   IF l_debug_on THEN
9604 		       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9605 		   END IF;
9606 		   --
9607 		   l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9608 		   FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9609 
9610 		END IF; -- cont org and det org id check
9611 
9612 	   END IF; -- if l_tmp_det_qty < l_det_pack_qty
9613 
9614            <<next_container>>
9615 		null;
9616 
9617         END LOOP; -- looping though containers - inner loop
9618 
9619         IF (l_tmp_det_qty = l_det_pack_qty) AND (l_det_tab(j).pack_status <> 'Error' ) THEN
9620 	   l_det_tab(j).pack_status := 'Packed';
9621         END IF;
9622 
9623         l_tmp_det_qty := 0;
9624 
9625 	<<next_detail>>
9626 	  	null;
9627 
9628     END LOOP; -- looping through lines - outer loop
9629 
9630  ELSE
9631    -- packing mode is invalid - did not pack
9632 
9633    FND_MESSAGE.SET_NAME('WSH','WSH_CONT_INVALID_PACK_MODE');
9634    x_pack_status := 'Error';
9635    x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9636    WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
9637    --Bugfix 4070732 {
9638    IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API)  = upper(l_api_session_name) THEN
9639       IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9640          IF l_debug_on THEN
9641                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9642          END IF;
9643 
9644          WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags   => TRUE,
9645                                                    x_return_status => l_tmp_return_status);
9646 
9647 
9648          IF l_debug_on THEN
9649               WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9650          END IF;
9651 
9652          /*wsh_util_core.api_post_call
9653               (
9654                 p_return_status => l_return_status,
9655                 x_num_warnings  => l_num_warnings,
9656                 x_num_errors    => l_num_errors
9657                );
9658         */
9659         IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
9660             X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9661         END IF;
9662       END IF;
9663    END IF;
9664    --}
9665    --
9666    --IF l_debug_on THEN
9667    --    WSH_DEBUG_SV.pop(l_module_name);
9668    --END IF;
9669    --
9670    --return;
9671    raise e_return_excp; -- LPN CONV. rv
9672  END IF;
9673 
9674 
9675  error_cnt := 0;
9676  warn_cnt := 0;
9677  succ_cnt := 0;
9678 
9679  cont_warn := 0;
9680  cont_err := 0;
9681  x_pack_status := NULL;
9682 
9683  --dbms_output.put_line('l_return_status = ' || l_return_status);
9684 
9685  FOR i IN 1..l_det_tab.count LOOP
9686 	--dbms_output.put_line('detail ' || l_det_tab(i).delivery_detail_id || ' status is ' || l_det_tab(i).pack_status);
9687 	IF l_det_tab(i).pack_status <> 'Packed' THEN
9688 	   IF l_det_tab(i).pack_status = 'Error' THEN
9689 		error_cnt := error_cnt + 1;
9690 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DETAIL_NOT_ASSIGNED');
9691 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(i).delivery_detail_id);
9692 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
9693            ELSE
9694 		IF l_det_tab(i).pack_status = 'Unpacked' THEN
9695 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_IGNORED');
9696 			FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(i).delivery_detail_id);
9697 			WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9698 		END IF;
9699 	        warn_cnt := warn_cnt + 1;
9700 	   END IF;
9701 	ELSE
9702 	   succ_cnt := succ_cnt + 1;
9703 	   /* H projects: pricing integration csun */
9704 	   m := m+1;
9705 	   l_detail_rows(m) := l_det_tab(i).delivery_detail_id;
9706 	END IF;
9707 
9708  END LOOP;
9709 
9710  IF error_cnt > 0 or warn_cnt > 0 THEN
9711     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_PACK_ERROR');
9712     FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
9713     FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
9714     FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
9715     IF error_cnt > 0 THEN
9716       l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9717     ELSIF warn_cnt > 0 THEN
9718       l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9719     END IF;
9720 
9721     WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9722 
9723     IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9724    	x_return_status := l_return_status;
9725     	x_pack_status := 'Error';
9726         --Bugfix 4070732 {
9727         IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API)  = upper(l_api_session_name) THEN
9728            IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9729               IF l_debug_on THEN
9730                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9731               END IF;
9732 
9733               WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags   => TRUE,
9734                                                         x_return_status => l_tmp_return_status);
9735 
9736 
9737               IF l_debug_on THEN
9738                    WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9739               END IF;
9740 
9741               /*wsh_util_core.api_post_call
9742                    (
9743                      p_return_status => l_return_status,
9744                      x_num_warnings  => l_num_warnings,
9745                      x_num_errors    => l_num_errors
9746                     );
9747               */
9748               IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
9749                    X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9750               END IF;
9751            END IF;
9752         END IF;
9753         --}
9754         --
9755         --IF l_debug_on THEN
9756         --    WSH_DEBUG_SV.pop(l_module_name);
9757         --END IF;
9758         --
9759         --return;
9760         raise e_return_excp; -- LPN CONV. rv
9761     END IF;
9762 
9763  END IF;
9764 
9765  /*  H integration: Pricing integration csun
9766  */
9767  IF l_detail_rows.count > 0 THEN
9768 	 --
9769 	 IF l_debug_on THEN
9770 	     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
9771 	 END IF;
9772 	 --
9773 	 WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
9774 	    p_entity_type => 'DELIVERY_DETAIL',
9775 	    p_entity_ids   => l_detail_rows,
9776 	    x_return_status => l_return_status);
9777 
9778        IF l_debug_on THEN
9779          WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
9780        END IF;
9781 	 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9782 	      x_return_status := l_return_status;
9783 	      FND_MESSAGE.SET_NAME('WSH', 'WSH_REPRICE_REQUIRED_ERR');
9784 	      WSH_UTIL_CORE.add_message(x_return_status,l_module_name);
9785 	      --
9786               --Bugfix 4070732 {
9787               IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API)  = upper(l_api_session_name) THEN
9788                  IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9789                     IF l_debug_on THEN
9790                           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9791                     END IF;
9792 
9793                     WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags   => TRUE,
9794                                                               x_return_status => l_tmp_return_status);
9795 
9796 
9797                     IF l_debug_on THEN
9798                          WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9799                     END IF;
9800 
9801                     /*wsh_util_core.api_post_call
9802                          (
9803                            p_return_status => l_return_status,
9804                            x_num_warnings  => l_num_warnings,
9805                            x_num_errors    => l_num_errors
9806                           );
9807                     */
9808                     IF
9809                      (l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9810                        OR
9811                      (x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9812                     THEN --{
9813                        x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9814                     ELSIF x_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR
9815                     THEN
9816                        IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR
9817                        THEN
9818                           x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9819                        ELSIF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING
9820                        THEN
9821                           x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9822                        END IF;
9823                     END IF; --}
9824                  END IF;
9825               END IF;
9826               --}
9827 	      --IF l_debug_on THEN
9828 	      --    WSH_DEBUG_SV.pop(l_module_name);
9829 	      --END IF;
9830 	      --
9831 	      --return;
9832               raise e_return_excp; -- LPN CONV. rv
9833 	 END IF;
9834  END IF;
9835 
9836 
9837 
9838  FOR i IN 1..l_cont_tab.count LOOP
9839 	   --dbms_output.put_line('container ' || l_cont_tab(i).container_instance_id || ' is ' || l_cont_tab(i).pack_status);
9840 	IF l_cont_tab(i).pack_status <> 'Packed' THEN
9841 	   IF l_cont_tab(i).pack_status = 'Error' THEN
9842 		l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9843 		cont_err := cont_err + 1;
9844 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NOT_PACKED');
9845 		--
9846 		IF l_debug_on THEN
9847 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9848 		END IF;
9849 		--
9850 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9851 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9852 		WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9853 	   ELSIF l_cont_tab(i).pack_status = 'Overpacked' THEN
9854 		cont_warn := cont_warn + 1;
9855 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_OVERPACKED');
9856 		--
9857 		IF l_debug_on THEN
9858 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9859 		END IF;
9860 		--
9861 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9862 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9863 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9864 	        IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9865 		        l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9866 		END IF;
9867 	   ELSIF l_cont_tab(i).pack_status = 'Underpacked' THEN
9868 		cont_warn := cont_warn + 1;
9869 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UNDERPACKED');
9870 		--
9871 		IF l_debug_on THEN
9872 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9873 		END IF;
9874 		--
9875 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9876 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9877 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9878 	        IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9879 		        l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9880 		END IF;
9881 	   ELSIF l_cont_tab(i).pack_status = 'Warning' THEN
9882 		cont_warn := cont_warn + 1;
9883 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
9884 		--
9885 		IF l_debug_on THEN
9886 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9887 		END IF;
9888 		--
9889 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9890 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9891 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9892 
9893 	        IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9894 		        l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9895 		END IF;
9896 	   END IF;
9897 	END IF;
9898 
9899  END LOOP;
9900 
9901 
9902  -- LPN CONV. rv
9903  --
9904  IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
9905  THEN
9906  --{
9907 
9908      IF l_debug_on THEN
9909        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);
9910      END IF;
9911      --
9912      WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
9913        (
9914          p_in_rec             => l_lpn_in_sync_comm_rec,
9915          x_return_status      => l_return_status,
9916          x_out_rec            => l_lpn_out_sync_comm_rec
9917        );
9918      --
9919      IF l_debug_on THEN
9920          WSH_DEBUG_SV.log(l_module_name,  'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
9921      END IF;
9922      --
9923      WSH_UTIL_CORE.API_POST_CALL
9924        (
9925          p_return_status    => l_return_status,
9926          x_num_warnings     => cont_warn,
9927          x_num_errors       => cont_err,
9928          p_raise_error_flag => false
9929        );
9930  --}
9931  END IF;
9932  -- LPN CONV. rv
9933  --
9934 
9935  IF cont_err > 0 OR cont_warn > 0 THEN
9936 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_PACK_WARN');
9937  	FND_MESSAGE.SET_TOKEN('CONT_WARN',cont_warn);
9938 	FND_MESSAGE.SET_TOKEN('CONT_ERR',cont_err);
9939 	IF cont_err > 0 THEN
9940 		l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9941 	ELSE
9942 		l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9943 	END IF;
9944 	WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9945  END IF;
9946 
9947  IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9948  	x_return_status := l_return_status;
9949  ELSE
9950 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
9951  END IF;
9952 
9953  IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9954     x_pack_status := 'Success';
9955  ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9956     x_pack_status := 'Error';
9957  ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9958     x_pack_status := 'Warning';
9959     l_num_warnings := nvl(l_num_warnings,0 ) + 1;
9960  END IF;
9961 
9962 
9963  IF x_pack_status IS NULL THEN
9964 	x_pack_status := 'Success';
9965  END IF;
9966 
9967 --Bugfix 4070732 {
9968 IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
9969    IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9970       IF l_debug_on THEN
9971           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Process_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9972       END IF;
9973 
9974       WSH_UTIL_CORE.Process_stops_for_load_tender(p_reset_flags   => TRUE,
9975                                                   x_return_status => l_tmp_return_status);
9976       IF l_debug_on THEN
9977           WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9978       END IF;
9979 
9980       /*wsh_util_core.api_post_call
9981          (
9982             p_return_status => l_return_status,
9983             x_num_warnings  => l_num_warnings,
9984             x_num_errors    => l_num_errors
9985          );
9986       */
9987       IF (l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9988          OR (x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9989       THEN --{
9990          x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9991          x_pack_status := 'Error';
9992       ELSIF x_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR
9993       THEN
9994          IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9995             x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9996             x_pack_status := 'Error';
9997          ELSIF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING
9998          THEN
9999             x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
10000             x_pack_status := 'Warning';
10001          END IF;
10002       END IF; --}
10003 
10004    END IF;
10005 END IF;
10006 --}
10007 
10008  	--
10009  	IF l_debug_on THEN
10010  	    WSH_DEBUG_SV.pop(l_module_name);
10011  	END IF;
10012  	--
10013 EXCEPTION
10014   -- LPN CONV. rv
10015   WHEN e_return_excp THEN
10016         --
10017         --
10018         IF l_debug_on THEN
10019           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);
10020         END IF;
10021         --
10022         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
10023         THEN
10024         --{
10025              --
10026              IF l_debug_on THEN
10027                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);
10028              END IF;
10029              --
10030             WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
10031               (
10032                 p_in_rec             => l_lpn_in_sync_comm_rec,
10033                 x_return_status      => l_return_status,
10034                 x_out_rec            => l_lpn_out_sync_comm_rec
10035               );
10036             --
10037             IF l_debug_on THEN
10038               WSH_DEBUG_SV.log(l_module_name,  'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
10039             END IF;
10040             --
10041             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
10042               x_return_status := l_return_status;
10043             END IF;
10044         --}
10045         END IF;
10046         --
10047         -- LPN CONV. rv
10048         --
10049         --
10050         IF l_debug_on THEN
10051           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:E_RETURN_EXCP');
10052         END IF;
10053   WHEN Others THEN
10054         --
10055 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Pack_Multi',l_module_name);
10056 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
10057         --
10058 IF l_debug_on THEN
10059     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
10060 END IF;
10061         --
10062         -- LPN CONV. rv
10063         IF l_debug_on THEN
10064           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);
10065         END IF;
10066         --
10067         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
10068         THEN
10069         --{
10070              --
10071              IF l_debug_on THEN
10072                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);
10073              END IF;
10074              --
10075             WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
10076               (
10077                 p_in_rec             => l_lpn_in_sync_comm_rec,
10078                 x_return_status      => l_return_status,
10079                 x_out_rec            => l_lpn_out_sync_comm_rec
10080               );
10081             --
10082             IF l_debug_on THEN
10083               WSH_DEBUG_SV.log(l_module_name,  'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
10084             END IF;
10085         --}
10086         END IF;
10087         --
10088         -- LPN CONV. rv
10089         --
10090 
10091         --Bugfix 4070732 {
10092         IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API)  = upper(l_api_session_name) THEN
10093            IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
10094               IF l_debug_on THEN
10095                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
10096               END IF;
10097 
10098               WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags   => TRUE,
10099                                                         x_return_status => l_return_status);
10100 
10101 
10102               IF l_debug_on THEN
10103                    WSH_DEBUG_SV.log(l_module_name,'l_return_status',l_return_status);
10104               END IF;
10105 
10106               /*wsh_util_core.api_post_call
10107                    (
10108                      p_return_status => l_return_status,
10109                      x_num_warnings  => l_num_warnings,
10110                      x_num_errors    => l_num_errors
10111                     );
10112               */
10113            END IF;
10114         END IF;
10115         --}
10116 --
10117 IF l_debug_on THEN
10118     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
10119 END IF;
10120 --
10121 END Pack_Multi;
10122 
10123 
10124 /*
10125 -----------------------------------------------------------------------------
10126    PROCEDURE  : Update_Shipped_Qty
10127    PARAMETERS : p_delivery_detail_id - delivery detail id of the original line
10128 		that was split
10129 		p_split_detail_id - delivery detail id of the newly created
10130 		split line
10131 		p_split_qty - quantity used to split original delivery line
10132 		x_return_status - return status of API
10133   DESCRIPTION : This procedure updates the shipped quantities of the original
10134 		delivery line that was split and the new line that was created
10135 		due to the split.  The shipped quantity of the original line is
10136 		decremented by split qty and that of the new line is increased
10137 		to be equal to the split qty.  The updating is done only if the
10138 		original shipped quantity is not null.
10139 ------------------------------------------------------------------------------
10140 */
10141 
10142 
10143 
10144 PROCEDURE Update_Shipped_Qty(
10145   p_delivery_detail_id IN NUMBER,
10146   p_split_detail_id IN NUMBER,
10147   p_split_qty IN NUMBER,
10148   x_return_status OUT NOCOPY  VARCHAR2) IS
10149 
10150  CURSOR Get_Ship_Qty (v_det_id NUMBER) IS
10151  SELECT nvl(shipped_quantity,-99)
10152  FROM WSH_DELIVERY_DETAILS
10153  WHERE delivery_detail_id = v_det_id
10154  AND   nvl(line_direction,'O') IN ('O','IO')
10155  AND container_flag = 'N';
10156 
10157  l_shp_qty          NUMBER;
10158  l_db_split_shp_qty NUMBER;
10159 
10160 --
10161 l_debug_on BOOLEAN;
10162 --
10163 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_SHIPPED_QTY';
10164 --
10165 BEGIN
10166 
10167  --
10168  l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10169  --
10170  IF l_debug_on IS NULL
10171  THEN
10172      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10173  END IF;
10174  --
10175  IF l_debug_on THEN
10176      WSH_DEBUG_SV.push(l_module_name);
10177      --
10178      WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_DETAIL_ID',P_DELIVERY_DETAIL_ID);
10179      WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_DETAIL_ID',P_SPLIT_DETAIL_ID);
10180      WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_QTY',P_SPLIT_QTY);
10181  END IF;
10182  --
10183  IF p_split_detail_id IS NULL THEN
10184    -- nothing split, ergo nothing to update...
10185    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10186    --
10187    IF l_debug_on THEN
10188        WSH_DEBUG_SV.pop(l_module_name);
10189    END IF;
10190    --
10191    return;
10192  END IF;
10193 
10194  OPEN Get_Ship_Qty (p_delivery_detail_id);
10195 
10196  FETCH Get_Ship_Qty INTO l_shp_qty;
10197 
10198  IF Get_Ship_Qty%NOTFOUND THEN
10199 	CLOSE Get_Ship_Qty;
10200    	FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10201 	FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_detail_id);
10202 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10203 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10204 	--
10205 	IF l_debug_on THEN
10206 	    WSH_DEBUG_SV.pop(l_module_name);
10207 	END IF;
10208 	--
10209 	return;
10210  END IF;
10211 
10212  IF Get_Ship_Qty%ISOPEN THEN
10213 	CLOSE Get_Ship_Qty;
10214  END IF;
10215 
10216  IF l_shp_qty = -99 THEN
10217 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10218 	--
10219 	IF l_debug_on THEN
10220 	    WSH_DEBUG_SV.pop(l_module_name);
10221 	END IF;
10222 	--
10223 	return;
10224  END IF;
10225 
10226 
10227  -- need to look up the split detail's shipped quantity
10228  -- so that we can correctly adjust the original detail's shipped quantity
10229 
10230  OPEN Get_Ship_Qty(p_split_detail_id);
10231  FETCH Get_Ship_Qty into l_db_split_shp_qty;
10232 
10233  IF Get_Ship_Qty%NOTFOUND THEN
10234 	CLOSE Get_Ship_Qty;
10235    	FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10236 	FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_split_detail_id);
10237 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10238 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10239 	--
10240 	IF l_debug_on THEN
10241 	    WSH_DEBUG_SV.pop(l_module_name);
10242 	END IF;
10243 	--
10244 	return;
10245  END IF;
10246 
10247  CLOSE Get_Ship_Qty;
10248 
10249  IF l_db_split_shp_qty = -99 THEN
10250 	l_db_split_shp_qty := 0;
10251  END IF;
10252  --dbms_output.put_line('l_db_split_shp_qty = ' || l_db_split_shp_qty);
10253 
10254  l_shp_qty := l_shp_qty - nvl(p_split_qty,0) + l_db_split_shp_qty;
10255  --dbms_output.put_line('new l_shp_qty = ' || l_shp_qty);
10256 
10257  UPDATE WSH_DELIVERY_DETAILS
10258  SET shipped_quantity = l_shp_qty
10259  WHERE delivery_detail_id = p_delivery_detail_id;
10260 
10261  IF SQL%NOTFOUND THEN
10262 	FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10263 	FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_detail_id);
10264 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10265 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10266 	--
10267 	IF l_debug_on THEN
10268 	    WSH_DEBUG_SV.pop(l_module_name);
10269 	END IF;
10270 	--
10271 	return;
10272  END IF;
10273 
10274  UPDATE WSH_DELIVERY_DETAILS
10275  SET shipped_quantity = p_split_qty
10276  WHERE delivery_detail_id = p_split_detail_id;
10277 
10278  IF SQL%NOTFOUND THEN
10279 	FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10280 	FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_split_detail_id);
10281 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10282 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10283 	--
10284 	IF l_debug_on THEN
10285 	    WSH_DEBUG_SV.pop(l_module_name);
10286 	END IF;
10287 	--
10288 	return;
10289  END IF;
10290 
10291  x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10292 
10293 
10294  	--
10295  	IF l_debug_on THEN
10296  	    WSH_DEBUG_SV.pop(l_module_name);
10297  	END IF;
10298  	--
10299 EXCEPTION
10300 
10301   WHEN Others THEN
10302 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_Shipped_Qty',l_module_name);
10303 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
10304 
10305 --
10306 IF l_debug_on THEN
10307     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
10308     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
10309 END IF;
10310 --
10311 END Update_Shipped_Qty;
10312 
10313 /*
10314 -----------------------------------------------------------------------------
10315    PROCEDURE  : Pack_Container
10316    PARAMETERS : p_line_cont_rec - Container info which needs to be autopacked
10317                 x_return_status - Return Status of the API
10318   DESCRIPTION : This procedure packs a container into Master Container either
10319                 by creating a new one or by packing it into one created for
10320                 previous containers (created in the same run)
10321 ------------------------------------------------------------------------------
10322 */
10323 
10324 PROCEDURE Pack_Container(
10325            p_line_cont_rec IN  cont_info,
10326            x_return_status OUT NOCOPY  VARCHAR2) IS
10327 
10328   l_quantity_left              NUMBER;
10329   l_tmp_split_qty         NUMBER;
10330 
10331   i NUMBER;
10332   j NUMBER;
10333   gcdvalue NUMBER;
10334 
10335 --
10336 l_debug_on BOOLEAN;
10337 --
10338 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'PACK_CONTAINER';
10339 --
10340 BEGIN
10341 
10342   --
10343   --
10344   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10345   --
10346   IF l_debug_on IS NULL
10347   THEN
10348       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10349   END IF;
10350   --
10351   IF l_debug_on THEN
10352       WSH_DEBUG_SV.push(l_module_name);
10353       WSH_DEBUG_SV.log(l_module_name,'shp_qty',p_line_cont_rec.shp_qty);
10354       WSH_DEBUG_SV.log(l_module_name,'preferred_container',p_line_cont_rec.preferred_container);
10355       WSH_DEBUG_SV.log(l_module_name,'organization_id',p_line_cont_rec.organization_id);
10356       WSH_DEBUG_SV.log(l_module_name,'group_id',p_line_cont_rec.group_id);
10357   END IF;
10358   --
10359   l_quantity_left := p_line_cont_rec.shp_qty;
10360 
10361   -- Check Empty Containers first
10362   IF (g_empty_cont_tab.COUNT > 0 ) THEN
10363     --dbms_output.put_line('There are containers with empty space');
10364 
10365     i := g_empty_cont_tab.FIRST;
10366     WHILE i <= g_empty_cont_tab.LAST LOOP
10367       IF p_line_cont_rec.preferred_container <> g_empty_cont_tab(i).container_item_Id OR
10368          p_line_cont_rec.organization_id <> g_empty_cont_tab(i).organization_id OR
10369          p_line_cont_rec.group_id <> g_empty_cont_tab(i).group_id  OR
10370          g_empty_cont_tab(i).empty <= 0 THEN
10371         GOTO next_cont;
10372       END IF;
10373 
10374       -- Got a Match in empty container table
10375       IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
10376         --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty numerator '||g_empty_cont_tab(i).numerator||' denominator '||g_empty_cont_tab(i).denominator);
10377         -- Calculate qty than can fit in 'empty' space
10378         l_tmp_split_qty := TRUNC((p_line_cont_rec.max_load_qty*g_empty_cont_tab(i).numerator)/g_empty_cont_tab(i).denominator,LIMITED_PRECISION);
10379         IF (l_tmp_split_qty < 1) THEN
10380           GOTO next_cont;
10381         END IF;
10382 
10383       ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
10384         --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty weight '||g_empty_cont_tab(i).empty);
10385         -- Calculate qty than can fit in 'empty' space
10386         IF (p_line_cont_rec.converted_wt > g_empty_cont_tab(i).empty) THEN
10387           GOTO next_cont;
10388         END IF;
10389       ELSE
10390         --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty volume '||g_empty_cont_tab(i).empty);
10391         -- Calculate qty than can fit in 'empty' space
10392         IF (p_line_cont_rec.converted_vol > g_empty_cont_tab(i).empty) THEN
10393           GOTO next_cont;
10394         END IF;
10395       END IF;
10396 
10397       -- Assign the dd to container
10398       g_assign_detail_index := g_assign_detail_index + 1;
10399       g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := p_line_cont_rec.delivery_detail_id;
10400       g_assign_detail_tab(g_assign_detail_index).container_index := g_empty_cont_tab(i).container_index;
10401       l_quantity_left := l_quantity_left - p_line_cont_rec.shp_qty;
10402 
10403       --dbms_output.put_line('Assigning '||g_assign_detail_tab(g_assign_detail_index).delivery_detail_id||' to Cont index '||g_assign_detail_tab(g_assign_detail_index).container_index);
10404 
10405       -- Calcualte space left and see if container needs to be deleted from empty cont PL/SQL table
10406       IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
10407         g_empty_cont_tab(i).numerator := (g_empty_cont_tab(i).numerator * p_line_cont_rec.max_load_qty) - (g_empty_cont_tab(i).denominator * p_line_cont_rec.shp_qty);
10408         g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator * p_line_cont_rec.max_load_qty;
10409 
10410 	-- Bug # 3005780 : Added GCD just to reduce the numerator and denominator values
10411         IF (g_empty_cont_tab(i).numerator <> 0 ) AND (g_empty_cont_tab(i).denominator <> 0 ) THEN
10412             gcdvalue := Get_Gcd(g_empty_cont_tab(i).numerator , g_empty_cont_tab(i).denominator);
10413             --dbms_output.put_line('Get_Gcd return value is  '||gcdvalue');
10414             IF (gcdvalue > 1) THEN
10415                 g_empty_cont_tab(i).numerator := g_empty_cont_tab(i).numerator / gcdvalue;
10416                 g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator / gcdvalue ;
10417             END IF;
10418         END IF;
10419         IF ((g_empty_cont_tab(i).numerator <= 0) OR
10420             (g_empty_cont_tab(i).numerator >= g_empty_cont_tab(i).denominator)) THEN
10421           --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
10422           g_empty_cont_tab.DELETE(i);
10423         END IF;
10424       ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
10425         g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - p_line_cont_rec.gross_weight;
10426         IF (g_empty_cont_tab(i).empty <= 0) THEN
10427           --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
10428           g_empty_cont_tab.DELETE(i);
10429         END IF;
10430       ELSE
10431         g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - p_line_cont_rec.volume;
10432         IF (g_empty_cont_tab(i).empty <= 0) THEN
10433           --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
10434           g_empty_cont_tab.DELETE(i);
10435         END IF;
10436       END IF;
10437 
10438       -- If the whole qty is packed then exit the loop
10439       IF (l_quantity_left <= 0) THEN
10440         EXIT;
10441       END IF;
10442 
10443       <<next_cont>>
10444         i := g_empty_cont_tab.NEXT(i);
10445     END LOOP;
10446   END IF; -- g_empty_cont_tab > 0
10447 
10448   --dbms_output.put_line(' *** Looping empty cont tab is Over and Quantity Left is '||l_quantity_left||' ***');
10449   IF (l_quantity_left > 0) THEN
10450 
10451     -- Create new container index
10452     g_new_cont_index := g_new_cont_index + 1;
10453     g_new_container_tab(g_new_cont_index).container_item_id := p_line_cont_rec.preferred_container;
10454     g_new_container_tab(g_new_cont_index).organization_id   := p_line_cont_rec.organization_id;
10455     --dbms_output.put_line('Created Container index '||g_new_cont_index);
10456 
10457     -- Assign the split dd/existing dd
10458     g_assign_detail_index := g_assign_detail_index + 1;
10459     g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := p_line_cont_rec.delivery_detail_id;
10460     g_assign_detail_tab(g_assign_detail_index).container_index    := g_new_cont_index;
10461     --dbms_output.put_line('Assigning '||g_assign_detail_tab(g_assign_detail_index).delivery_detail_id||' to Cont index '||g_assign_detail_tab(g_assign_detail_index).container_index);
10462 
10463 
10464     IF (g_empty_cont_tab.COUNT = 0) THEN
10465       j := 1;
10466     ELSE
10467       j:= g_empty_cont_tab.LAST + 1;
10468     END IF;
10469 
10470     -- Calculate Empty Space
10471     IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
10472       IF (l_quantity_left < p_line_cont_rec.max_load_qty) THEN
10473         g_empty_cont_tab(j).container_index   := g_new_cont_index;
10474         g_empty_cont_tab(j).container_item_id := p_line_cont_rec.preferred_container;
10475         g_empty_cont_tab(j).organization_id   := p_line_cont_rec.organization_id;
10476         g_empty_cont_tab(j).group_id          := p_line_cont_rec.group_id;
10477         g_empty_cont_tab(j).numerator         := p_line_cont_rec.max_load_qty - l_quantity_left;
10478         g_empty_cont_tab(j).denominator       := p_line_cont_rec.max_load_qty;
10479         --dbms_output.put_line('Inserted Container '||j||' with numerator '||g_empty_cont_tab(j).numerator||' and denominator '||g_empty_cont_tab(j).denominator);
10480       END IF;
10481     ELSIF (p_line_cont_rec.fill_pc_basis in ('W','V')) THEN
10482       IF ((p_line_cont_rec.converted_wt < p_line_cont_rec.cont_wt AND p_line_cont_rec.fill_pc_basis = 'W') OR
10483           (p_line_cont_rec.converted_vol < p_line_cont_rec.cont_vol AND p_line_cont_rec.fill_pc_basis = 'V')) THEN
10484         g_empty_cont_tab(j).container_index   := g_new_cont_index;
10485         g_empty_cont_tab(j).container_item_id := p_line_cont_rec.preferred_container;
10486         g_empty_cont_tab(j).organization_id   := p_line_cont_rec.organization_id;
10487         g_empty_cont_tab(j).group_id          := p_line_cont_rec.group_id;
10488 
10489         IF (p_line_cont_rec.fill_pc_basis = 'W') THEN
10490           g_empty_cont_tab(j).empty             := p_line_cont_rec.cont_wt - p_line_cont_rec.converted_wt;
10491           --dbms_output.put_line('Inserted Container '||j||' with empty weight '||g_empty_cont_tab(j).empty||' into empty cont');
10492         ELSE
10493           g_empty_cont_tab(j).empty             := p_line_cont_rec.cont_vol - p_line_cont_rec.converted_vol;
10494           --dbms_output.put_line('Inserted Container '||j||' with empty volume '||g_empty_cont_tab(j).empty||' into empty cont');
10495         END IF;
10496 
10497       END IF;
10498     END IF;
10499 
10500   END IF;
10501   x_return_status := C_SUCCESS_STATUS;
10502   --
10503   IF l_debug_on THEN
10504       WSH_DEBUG_SV.pop(l_module_name);
10505   END IF;
10506   --
10507   RETURN;
10508 
10509 --
10510 IF l_debug_on THEN
10511     WSH_DEBUG_SV.pop(l_module_name);
10512 END IF;
10513 --
10514 EXCEPTION
10515   WHEN Others THEN
10516         WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Pack_Container',l_module_name);
10517         x_return_status := C_UNEXP_ERROR_STATUS;
10518 
10519 --
10520 IF l_debug_on THEN
10521     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
10522     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
10523 END IF;
10524 --
10525 END Pack_Container;
10526 
10527 /*
10528 -----------------------------------------------------------------------------
10529    PROCEDURE  : Validate_Container_For_Pack
10530    PARAMETERS : p_group_id_tab_id - table of group ids for lines that need to
10531                                     be autopacked.
10532                 p_cont_info_tab  - table of Container ids
10533                 x_line_cont_tab   - Delivery Detail(Cont)s along with other info
10534                                     which passed validations
10535                 x_error_cnt       - Count of errors encountered during validation
10536                 x_warn_cnt        - Count of warnings encountered during validation
10537   DESCRIPTION : This procedure takes a list of containers and does all
10538                 validations and returns a list of containers which passed
10539                 validations
10540 ------------------------------------------------------------------------------
10541 */
10542 -- Bug 3570364 : Added new parameter p_mast_cont_info_tab which contains the
10543 --               Master container informations which is used when Auto_pack Master
10544 --               action performed on delivery detail lines
10545 
10546 PROCEDURE Validate_Container_For_Pack(
10547   p_group_id_tab       IN  WSH_UTIL_CORE.id_tab_type,
10548   p_cont_info_tab      IN  wsh_util_core.id_tab_type,
10549   p_mast_cont_info_tab IN wsh_container_actions.empty_cont_info_tab,
10550   x_line_cont_tab      OUT NOCOPY  wsh_container_actions.cont_info_tab,
10551   x_error_cnt          OUT NOCOPY  NUMBER,
10552   x_warn_cnt           OUT NOCOPY  NUMBER,
10553   x_fill_pc_warn_cnt   OUT NOCOPY  NUMBER -- bug 3421823
10554   ) IS
10555 
10556 --Bug 3405853 : Added detail_container_item_id in the select clause
10557   CURSOR Get_dd_Detail(c_dd_id NUMBER) IS
10558   SELECT wdd.inventory_item_id inventory_item_id,
10559          wdd.gross_weight gross_weight,
10560          wdd.weight_uom_code weight_uom,
10561          wdd.volume volume,
10562          wdd.volume_uom_code volume_uom,
10563          wdd.organization_id organization_id,
10564          wdd.delivery_detail_id,
10565          wda.parent_delivery_detail_id parent_delivery_detail_id,
10566 	 nvl(wdd.detail_container_item_id,wdd.master_container_item_id) detail_container_item_id
10567   FROM   wsh_delivery_details wdd,
10568          wsh_delivery_assignments_v wda
10569   WHERE  wdd.delivery_detail_id = c_dd_id
10570   AND    wdd.delivery_detail_id = wda.delivery_detail_id
10571   AND    source_code = 'WSH';
10572 
10573   CURSOR Get_Cont_Item_Load (v_inv_item_id NUMBER, v_cont_item_id NUMBER, v_organization_id NUMBER) IS
10574   SELECT max_load_quantity
10575   FROM   WSH_CONTAINER_ITEMS
10576   WHERE  load_item_id           = v_inv_item_id
10577   AND    container_item_id      = v_cont_item_id
10578   AND    master_organization_id = v_organization_id;
10579 
10580   line_cont_rec wsh_container_actions.cont_info;
10581   line_cont_tab wsh_container_actions.cont_info_tab;
10582 
10583   l_return_status        VARCHAR2(1);
10584   l_last_organization_id NUMBER;
10585   l_dd_count             NUMBER;
10586   l_group_id_cnt         NUMBER;
10587   l_group_id             NUMBER;
10588   l_parent_delivery_detail_id NUMBER;
10589   l_error_cnt            NUMBER;
10590   l_process_flag         VARCHAR2(1);
10591   l_fill_pc_basis        VARCHAR2(1);
10592   l_wcl_cont_item_id     NUMBER;
10593   l_max_load_qty         NUMBER;
10594   l_dd_gross_wt          NUMBER;
10595   l_dd_net_wt            NUMBER;
10596   l_dd_volume            NUMBER;
10597   l_cont_fill_pc         NUMBER;
10598   l_cont_name            VARCHAR2(30);
10599   l_mtl_max_load         NUMBER;
10600   l_mtl_max_vol          NUMBER;
10601   l_mtl_wt_uom           VARCHAR2(3);
10602   l_mtl_vol_uom          VARCHAR2(3);
10603   l_item_name		VARCHAR2(2000); -- <-- for Bug 3577115
10604   --Bug #3405853
10605   l_detail_container_item_id  NUMBER;
10606 
10607 
10608   error_cnt              NUMBER := 0;
10609   warn_cnt               NUMBER := 0;
10610 
10611   fill_pc_warn_cnt       NUMBER := 0; -- 3562797 jckwok
10612 --
10613 l_debug_on BOOLEAN;
10614 --
10615 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'VALIDATE_CONTAINER_FOR_PACK';
10616 --
10617 BEGIN
10618 
10619 
10620   -- 10. Populate  detail dd info into line_cont_tab PL/SQL table
10621   --
10622   --
10623   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10624   --
10625   IF l_debug_on IS NULL
10626   THEN
10627       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10628   END IF;
10629   --
10630   IF l_debug_on THEN
10631       WSH_DEBUG_SV.push(l_module_name);
10632       WSH_DEBUG_SV.log(l_module_name,'---------------------------------');
10633       WSH_DEBUG_SV.log(l_module_name,'In Validate_Container_For_Pack...');
10634       WSH_DEBUG_SV.log(l_module_name,'---------------------------------');
10635   END IF;
10636   --
10637   l_last_organization_id := NULL;
10638   l_dd_count := 0;
10639   l_group_id_cnt := 1;
10640 
10641   WHILE ( l_group_id_cnt <= p_cont_info_tab.COUNT )
10642   LOOP
10643     --dbms_output.put_line('Processing dd '||p_cont_info_tab(l_group_id_cnt));
10644 
10645      OPEN get_dd_detail(p_cont_info_tab(l_group_id_cnt));
10646 
10647      FETCH get_dd_detail
10648      INTO  line_cont_rec.inventory_item_id,
10649            line_cont_rec.gross_weight,
10650            line_cont_rec.weight_uom,
10651            line_cont_rec.volume,
10652            line_cont_rec.volume_uom,
10653            line_cont_rec.organization_id,
10654            line_cont_rec.delivery_detail_id,
10655            l_parent_delivery_detail_id,
10656 	   l_detail_container_item_id;
10657      IF (get_dd_detail%NOTFOUND) THEN
10658        CLOSE get_dd_detail;
10659        goto next_cont;
10660      END IF;
10661 
10662      CLOSE get_dd_detail;
10663 
10664     -- 10.10 Delete Organization Specfic Cached Tables if organization_id changes
10665     IF ((l_last_organization_id IS NULL) OR (line_cont_rec.organization_id <> l_last_organization_id)) THEN
10666       g_cache_cont_load_info_tab.DELETE;
10667       g_cont_msi_tab.DELETE;
10668 
10669       l_last_organization_id := line_cont_rec.organization_id;
10670     END IF;
10671 
10672     /* grouping API will return a number = negative delivery_id if the line is
10673        already assigned to a delivery. So, check for negative numbers and if number
10674        < 0, then convert it to a postive number = delivery_id.
10675     */
10676     l_group_id := ABS(p_group_id_tab(p_cont_info_tab(l_group_id_cnt)));
10677     --dbms_output.put_line('l_group_id '||l_group_id);
10678 
10679     -- 10.20 Check if the detail is already packed
10680     IF (l_parent_delivery_detail_id IS NOT NULL) THEN
10681       --dbms_output.put_line('Warning: cont already packed');
10682       warn_cnt := warn_cnt + 1;
10683       goto next_cont;
10684     END IF;
10685 
10686     -- 10.30 Determine Fill PC Basis from shipping parameters
10687     Calc_Fill_Basis_and_Proc_Flag(
10688       p_organization_id => line_cont_rec.organization_id,
10689       x_return_status   => l_return_status,
10690       x_fill_basis      => l_fill_pc_basis,
10691       x_process_flag    => l_process_flag);
10692     IF l_debug_on THEN
10693       WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10694     END IF;
10695     IF (l_return_status <> C_SUCCESS_STATUS) THEN
10696       error_cnt := error_cnt + 1;
10697       goto next_cont;
10698     END IF;
10699 
10700     line_cont_rec.fill_pc_basis := l_fill_pc_basis;
10701     IF (line_cont_rec.fill_pc_basis IS NULL) THEN
10702       --dbms_output.put_line('Skipping cont');
10703       goto next_cont;
10704     --
10705     -- bug 3562797 jckwok
10706     -- check Shipping Parameter Fill Percent Basis.
10707     --
10708     ELSIF line_cont_rec.fill_pc_basis='N' THEN
10709       fill_pc_warn_cnt := fill_pc_warn_cnt + 1;
10710       goto next_cont;
10711     END IF;
10712     -- end of bug 3562797
10713     -- 10.40 Determine Preferred Container
10714     -- Bug 3405853 : First check the detail lpn entered if it is null
10715     --               then consider the preferred container.
10716     -- Bug 3570364 : First check the master container item for the line ( Auto Pack Master action on Lines)
10717     --               If it is NULL then check for the Detail container item for the
10718     --               LPN ( Auto Pack Action on LPN's)
10719     IF p_mast_cont_info_tab.exists(l_group_id_cnt) THEN
10720       line_cont_rec.preferred_container := nvl(p_mast_cont_info_tab(l_group_id_cnt).container_item_id,l_detail_container_item_id);
10721     ELSE
10722       line_cont_rec.preferred_container := l_detail_container_item_id;
10723     END IF;
10724     line_cont_rec.max_load_qty := NULL;
10725 
10726     IF (line_cont_rec.preferred_container IS NULL) THEN
10727       Calc_Pref_Container(
10728         p_organization_id   => line_cont_rec.organization_id,
10729         p_inventory_item_id => line_cont_rec.inventory_item_id,
10730         p_fill_pc_basis     => line_cont_rec.fill_pc_basis,
10731         x_return_status     => l_return_status,
10732         x_error_cnt         => l_error_cnt,
10733         x_cont_item_id      => l_wcl_cont_item_id,
10734         x_max_load_qty      => l_max_load_qty);
10735     IF l_debug_on THEN
10736       WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10737     END IF;
10738       IF (l_return_status = C_ERROR_STATUS) THEN
10739         error_cnt := error_cnt + l_error_cnt;
10740       END IF;
10741 
10742       line_cont_rec.preferred_container := l_wcl_cont_item_id;
10743       line_cont_rec.max_load_qty        := l_max_load_qty;
10744     END IF;
10745 
10746     -- bug 3440811
10747     validate_container(
10748       p_organization_id  => line_cont_rec.organization_id,
10749       p_cont_item_id     => line_cont_rec.preferred_container,
10750       x_return_status    => l_return_status);
10751 
10752     IF (l_return_status IN (C_UNEXP_ERROR_STATUS,C_ERROR_STATUS)) THEN
10753         line_cont_rec.preferred_container := null;
10754         line_cont_rec.max_load_qty := null;
10755         l_error_cnt := l_error_cnt + 1;
10756         error_cnt := error_cnt + l_error_cnt;
10757     END IF;
10758     -- bug 3440811
10759 
10760     IF (line_cont_rec.preferred_container is NULL) THEN
10761       --dbms_output.put_line('Skipping cont');
10762       goto next_cont;
10763     END IF;
10764 
10765     -- 10.50 Calculate Max Load/Converted wt/Converted Vol depending on fill basis
10766     line_cont_rec.converted_wt := NULL;
10767     line_cont_rec.converted_vol := NULL;
10768 
10769     IF (line_cont_rec.fill_pc_basis = 'Q') THEN
10770       IF (line_cont_rec.max_load_qty IS NULL) THEN
10771         OPEN Get_Cont_Item_Load (line_cont_rec.inventory_item_id,line_cont_rec.preferred_container, line_cont_rec.organization_id);
10772 
10773         FETCH Get_Cont_Item_Load
10774         INTO  l_max_load_qty;
10775 
10776         IF Get_Cont_Item_Load%NOTFOUND THEN
10777           --dbms_output.put_line('Could not find max load qty for Item'||line_cont_rec.inventory_item_id||' Cont '||line_cont_rec.preferred_container||' Org '||line_cont_rec.organization_id);
10778           CLOSE Get_Cont_Item_Load;
10779 
10780           -- Calculate max load qty depending on Weight/Volume
10781           IF (line_cont_rec.gross_weight IS NULL OR line_cont_rec.volume IS NULL) THEN
10782             --
10783             IF l_debug_on THEN
10784                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
10785             END IF;
10786             --
10787 -- J: W/V Changes
10788             WSH_WV_UTILS.Container_Weight_Volume(
10789                  p_container_instance_id => line_cont_rec.delivery_detail_id,
10790                  p_override_flag      => 'Y',
10791                  p_post_process_flag  => 'Y',
10792                  p_calc_wv_if_frozen  => 'N',
10793                  x_gross_weight       => l_dd_gross_wt,
10794                  x_net_weight         => l_dd_net_wt,
10795                  x_volume             => l_dd_volume ,
10796                  p_fill_pc_flag       => 'N',
10797                  x_cont_fill_pc       => l_cont_fill_pc,
10798                  x_return_status      => l_return_status);
10799 
10800             IF l_debug_on THEN
10801               WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10802             END IF;
10803             IF (l_return_status <> C_SUCCESS_STATUS) THEN
10804               --dbms_output.put_line('WSH_TPA_CONTAINER_PKG.Container_Weight_Volume did not return success');
10805               --
10806               IF l_debug_on THEN
10807                   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
10808               END IF;
10809               --
10810               l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(line_cont_rec.delivery_detail_id);
10811               FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
10812               FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
10813               IF l_return_status = C_WARNING_STATUS THEN
10814                 warn_cnt := warn_cnt + 1;
10815               ELSE
10816                 error_cnt := error_cnt + 1;
10817               END IF;
10818               --dbms_output.put_line('Skipping this cont');
10819               goto next_cont;
10820             END IF;
10821 
10822             line_cont_rec.gross_weight := NVL(line_cont_rec.gross_weight,l_dd_gross_wt);
10823             line_cont_rec.volume     := NVL(line_cont_rec.volume,l_dd_volume);
10824 
10825             IF ((NVL(line_cont_rec.gross_weight,0) = 0) OR
10826                 (NVL(line_cont_rec.volume,0) = 0)) THEN
10827               --dbms_output.put_line('Weight or Volume is NULL or 0');
10828               FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
10829               WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10830               error_cnt := error_cnt + 1;
10831               --dbms_output.put_line('Skipping this cont');
10832               goto next_cont;
10833             END IF;
10834           END IF;
10835 
10836 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 2');
10837           Get_Cont_Load_Vol_info(
10838              p_container_item_id => line_cont_rec.preferred_container,
10839              p_organization_id   => line_cont_rec.organization_id,
10840              p_w_v_both          => 'B',
10841              x_max_load          => l_mtl_max_load,
10842              x_max_vol           => l_mtl_max_vol,
10843              x_wt_uom            => l_mtl_wt_uom,
10844              x_vol_uom           => l_mtl_vol_uom,
10845              x_return_status     => l_return_status,
10846              x_error_cnt         => l_error_cnt);
10847             IF l_debug_on THEN
10848               WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10849             END IF;
10850           IF (l_return_status = C_ERROR_STATUS) THEN
10851             error_cnt := error_cnt + l_error_cnt;
10852           END IF;
10853 
10854           IF ((NVL(l_mtl_max_load,0) <= 0) OR (NVL(l_mtl_max_vol,0) <= 0)) THEN
10855             --dbms_output.put_line('Skipping this Cont');
10856             goto next_cont;
10857           END IF;
10858 
10859           IF (l_mtl_wt_uom <> line_cont_rec.weight_uom) THEN
10860             --
10861             IF l_debug_on THEN
10862                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
10863             END IF;
10864             --
10865             l_dd_gross_wt := WSH_WV_UTILS.Convert_Uom (
10866                                   from_uom => line_cont_rec.weight_uom,
10867                                   to_uom   => l_mtl_wt_uom,
10868                                   quantity => line_cont_rec.gross_weight,
10869                                   item_id  => line_cont_rec.inventory_item_id);
10870           ELSE
10871             l_dd_gross_wt := line_cont_rec.gross_weight;
10872           END IF;
10873 
10874           IF (l_mtl_vol_uom <> line_cont_rec.volume_uom) THEN
10875             --
10876             IF l_debug_on THEN
10877                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
10878             END IF;
10879             --
10880             l_dd_volume :=  WSH_WV_UTILS.Convert_Uom (
10881                                   from_uom => line_cont_rec.volume_uom,
10882                                   to_uom   => l_mtl_vol_uom,
10883                                   quantity => line_cont_rec.volume,
10884                                   item_id  => line_cont_rec.inventory_item_id);
10885           ELSE
10886             l_dd_volume:= line_cont_rec.volume;
10887           END IF;
10888 
10889           IF ((l_mtl_max_load/l_dd_gross_wt) >= (l_mtl_max_vol/l_dd_volume)) THEN
10890             l_max_load_qty := l_mtl_max_load/l_dd_gross_wt;
10891           ELSE
10892             l_max_load_qty := l_mtl_max_vol/l_dd_volume;
10893           END IF;
10894           --dbms_output.put_line('l_dd_gross_wt '||l_dd_gross_wt||' l_dd_volume '||l_dd_volume ||' l_mtl_max_load '||l_mtl_max_load||' l_mtl_max_vol '||l_mtl_max_vol || ' l_max_load_qty '||l_max_load_qty);
10895 
10896           -- Containers cannot be split. So take FLOOR of l_max_load_qty
10897           l_max_load_qty := FLOOR(l_max_load_qty);
10898 
10899         ELSE -- Get_Cont_Item_Load%NOTFOUND
10900           CLOSE Get_Cont_Item_Load;
10901         END IF;
10902         line_cont_rec.max_load_qty := l_max_load_qty;
10903 
10904         IF (NVL(line_cont_rec.max_load_qty,0) <= 0) THEN
10905           --dbms_output.put_line('Max Load Qty is null or <= 0. Skipping this container');
10906           FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
10907           WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10908           error_cnt := error_cnt + 1;
10909           goto next_cont;
10910         END IF;
10911 
10912       END IF; -- line_cont_rec.max_load_qty IS NULL
10913       --dbms_output.put_line('line_cont_rec.max_load_qty '||line_cont_rec.max_load_qty);
10914     ELSIF (line_cont_rec.fill_pc_basis in ('W','V')) THEN
10915       -- Calculate max load qty depending on Weight
10916       IF ((line_cont_rec.gross_weight IS NULL AND line_cont_rec.fill_pc_basis = 'W') OR
10917           (line_cont_rec.volume IS NULL AND line_cont_rec.fill_pc_basis = 'V')) THEN
10918         --
10919         IF l_debug_on THEN
10920             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
10921         END IF;
10922         --
10923 -- J: W/V Changes
10924         WSH_WV_UTILS.Container_Weight_Volume(
10925              p_container_instance_id => line_cont_rec.delivery_detail_id,
10926              p_override_flag      => 'Y',
10927              p_post_process_flag  => 'Y',
10928              p_calc_wv_if_frozen  => 'N',
10929              x_gross_weight       => l_dd_gross_wt,
10930              x_net_weight         => l_dd_net_wt,
10931              x_volume             => l_dd_volume ,
10932              p_fill_pc_flag       => 'N',
10933              x_cont_fill_pc       => l_cont_fill_pc,
10934              x_return_status      => l_return_status);
10935 
10936         IF l_debug_on THEN
10937           WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10938         END IF;
10939         IF (l_return_status <> C_SUCCESS_STATUS) THEN
10940           --dbms_output.put_line('WSH_TPA_CONTAINER_PKG.Container_Weight_Volume did not return success');
10941           --
10942           IF l_debug_on THEN
10943               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
10944           END IF;
10945           --
10946           l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(line_cont_rec.delivery_detail_id);
10947           FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
10948           FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
10949           IF l_return_status = C_WARNING_STATUS THEN
10950             warn_cnt := warn_cnt + 1;
10951           ELSE
10952             error_cnt := error_cnt + 1;
10953           END IF;
10954           error_cnt := error_cnt + 1;
10955           --dbms_output.put_line('Skipping this cont');
10956           goto next_cont;
10957         END IF;
10958 
10959         IF (line_cont_rec.fill_pc_basis = 'W') THEN
10960           line_cont_rec.gross_weight := NVL(line_cont_rec.gross_weight,l_dd_gross_wt);
10961 
10962           IF (NVL(line_cont_rec.gross_weight,0) = 0) THEN
10963             --dbms_output.put_line('Weight is NULL or 0');
10964                 --BUG 3577115
10965 		   --FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
10966 		    l_item_name := WSH_UTIL_CORE.Get_Item_Name(line_cont_rec.inventory_item_id, line_cont_rec.organization_id);
10967 		    FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NULL_WEIGHT_VOLUME');
10968 		    FND_MESSAGE.SET_TOKEN('CONT_NAME',l_item_name);
10969 		--BUG 3577115
10970             WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10971             error_cnt := error_cnt + 1;
10972             --dbms_output.put_line('Skipping this Cont');
10973             goto next_cont;
10974           END IF;
10975         ELSE
10976           line_cont_rec.volume := NVL(line_cont_rec.volume,l_dd_volume);
10977 
10978           IF (NVL(line_cont_rec.volume,0) = 0) THEN
10979             --dbms_output.put_line('Volume is NULL or 0');
10980                --BUG 3577115
10981 		   --FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_VOL_ERROR');
10982 		    l_item_name := WSH_UTIL_CORE.Get_Item_Name(line_cont_rec.inventory_item_id, line_cont_rec.organization_id);
10983 		    FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NULL_WEIGHT_VOLUME');
10984 		    FND_MESSAGE.SET_TOKEN('CONT_NAME',l_item_name);
10985 		--BUG 3577115
10986              WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10987              error_cnt := error_cnt + 1;
10988             --dbms_output.put_line('Skipping this Cont');
10989             goto next_cont;
10990           END IF;
10991         END IF;
10992       END IF;
10993 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 1');
10994       Get_Cont_Load_Vol_info(
10995          p_container_item_id => line_cont_rec.preferred_container,
10996          p_organization_id   => line_cont_rec.organization_id,
10997          p_w_v_both          => line_cont_rec.fill_pc_basis,
10998          x_max_load          => l_mtl_max_load,
10999          x_max_vol           => l_mtl_max_vol,
11000          x_wt_uom            => l_mtl_wt_uom,
11001          x_vol_uom           => l_mtl_vol_uom,
11002          x_return_status     => l_return_status,
11003          x_error_cnt         => l_error_cnt);
11004       IF l_debug_on THEN
11005         WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
11006       END IF;
11007       IF (l_return_status = C_ERROR_STATUS) THEN
11008         error_cnt := error_cnt + l_error_cnt;
11009       END IF;
11010 
11011       IF (line_cont_rec.fill_pc_basis = 'W') THEN
11012         IF (NVL(l_mtl_max_load,0) <= 0) THEN
11013           --dbms_output.put_line('Skipping this Cont');
11014           goto next_cont;
11015          END IF;
11016 
11017         line_cont_rec.cont_wt := l_mtl_max_load;
11018 
11019         IF (l_mtl_wt_uom <> line_cont_rec.weight_uom) THEN
11020           --
11021           IF l_debug_on THEN
11022               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
11023           END IF;
11024           --
11025           l_dd_net_wt :=  WSH_WV_UTILS.Convert_Uom (
11026                                 from_uom => line_cont_rec.weight_uom,
11027                                 to_uom   => l_mtl_wt_uom,
11028                                 quantity => line_cont_rec.gross_weight,
11029                                 item_id  => line_cont_rec.inventory_item_id);
11030         ELSE
11031           l_dd_net_wt := line_cont_rec.gross_weight;
11032         END IF;
11033 
11034 
11035         line_cont_rec.converted_wt := l_dd_net_wt;
11036         --dbms_output.put_line('line_cont_rec.converted_wt '||line_cont_rec.converted_wt);
11037       ELSE
11038         IF (NVL(l_mtl_max_vol,0) <= 0) THEN
11039           --dbms_output.put_line('Skipping this Cont');
11040           goto next_cont;
11041          END IF;
11042 
11043         line_cont_rec.cont_vol := l_mtl_max_vol;
11044 
11045         IF (l_mtl_vol_uom <> line_cont_rec.volume_uom) THEN
11046           --
11047           IF l_debug_on THEN
11048               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
11049           END IF;
11050           --
11051           l_dd_volume :=  WSH_WV_UTILS.Convert_Uom (
11052                                 from_uom => line_cont_rec.volume_uom,
11053                                 to_uom   => l_mtl_vol_uom,
11054                                 quantity => line_cont_rec.volume,
11055                                 item_id  => line_cont_rec.inventory_item_id);
11056         ELSE
11057           l_dd_volume := line_cont_rec.volume;
11058         END IF;
11059         line_cont_rec.converted_vol := l_dd_volume;
11060         --dbms_output.put_line('line_cont_rec.converted_vol '||line_cont_rec.converted_vol);
11061       END IF;
11062 
11063       -- Check if the Master container can hold atleast 1 piece of the Detail Container
11064       IF  ((line_cont_rec.fill_pc_basis = 'W' AND (line_cont_rec.converted_wt > l_mtl_max_load)) OR
11065            (line_cont_rec.fill_pc_basis = 'V' AND (line_cont_rec.converted_vol > l_mtl_max_vol))) THEN
11066         --dbms_output.put_line('Indivisible flag is Y and Preferred Mast Cont cannot hold atleast 1 piece');
11067 	-- Bug#: 2503937 - New Error Message
11068         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_VOL_ERROR');
11069         WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
11070         error_cnt := error_cnt + 1;
11071         --dbms_output.put_line('Skipping this Cont');
11072         goto next_cont;
11073       END IF;
11074     END IF;
11075 
11076     -- 10.60 Populate line_cont_tab PL/SQL table now
11077     line_cont_rec.group_id  := l_group_id;
11078     line_cont_rec.shp_qty   := 1;
11079     line_cont_rec.req_qty   := 1;
11080 
11081     l_dd_count := l_dd_count + 1;
11082     line_cont_tab(l_dd_count) := line_cont_rec;
11083 
11084     <<next_cont>>
11085       l_group_id_cnt := l_group_id_cnt + 1;
11086 
11087   END LOOP;
11088 
11089   x_error_cnt     := error_cnt;
11090   x_warn_cnt      := warn_cnt;
11091   x_line_cont_tab := line_cont_tab;
11092   x_fill_pc_warn_cnt := fill_pc_warn_cnt; -- bug 3562797 jckwok
11093 
11094   IF l_debug_on THEN
11095     WSH_DEBUG_SV.log(l_module_name,'p_cont_info_tab count->'||p_cont_info_tab.count||' x_line_cont_tab count->'||x_line_cont_tab.count);
11096     WSH_DEBUG_SV.log(l_module_name,'Error Count '|| error_cnt||' Warning Count '|| warn_cnt);
11097     WSH_DEBUG_SV.pop(l_module_name);
11098   END IF;
11099 
11100   RETURN;
11101 
11102 EXCEPTION
11103   WHEN Others THEN
11104     IF (Get_dd_Detail%ISOPEN) THEN
11105       CLOSE Get_dd_Detail;
11106     END IF;
11107     IF (Get_Cont_Item_Load%ISOPEN) THEN
11108       CLOSE Get_Cont_Item_Load;
11109     END IF;
11110     WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Validate_Container_For_Pack',l_module_name);
11111     --
11112     IF l_debug_on THEN
11113         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11114         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11115     END IF;
11116     --
11117     raise;
11118 
11119 END Validate_Container_For_Pack;
11120 
11121 
11122 /*
11123 -----------------------------------------------------------------------------
11124    PROCEDURE  : Auto_Pack_Conts
11125    PARAMETERS : p_group_id_tab_id - table of group ids for containers that need
11126 		to be autopacked.
11127   		p_det_cont_info - table of detail containers created during the
11128 		autopack process consisting of container instances, master
11129 		container item ids and percentage empty.
11130 		p_cont_detail_tab - table of container delivery detail ids that
11131 		were created during the autopacking of lines.
11132 		x_cont_instance_id - table of container instance ids that were
11133 			created during the autopacking.
11134 		x_return_status - return status of API.
11135   DESCRIPTION : This procedure takes the number of containers and groups them
11136 		by common grouping attributes - similar to grouping attributes
11137 		of delivery.  If a group id table is specified it uses the
11138 		group ids in the table to decided which container can be
11139 		grouped	into the same parent container. If a group id table is
11140 		not specified, it creates the group id table before autopacking
11141 		It creates the required number and type of parent containers
11142 		per detail container and keeps track of all partially filled
11143 		containers in the empty containers table. Before creating new
11144 		container instances, it	searches for available space using the
11145 		empty container table and after filling up a container, it
11146 		creates a new one if there are no empty containers of the same
11147 		type. The difference between this API and the autopack lines is
11148 		that this API does not split containers if they don't fit
11149 		entirely into a parent container.
11150 ------------------------------------------------------------------------------
11151 */
11152 
11153 PROCEDURE Auto_Pack_Conts (
11154   p_group_id_tab      IN     WSH_UTIL_CORE.id_tab_type,
11155   p_cont_info_tab     IN     wsh_container_actions.empty_cont_info_tab,
11156   p_cont_detail_tab   IN     WSH_UTIL_CORE.id_tab_type,
11157   x_cont_instance_tab IN OUT NOCOPY  WSH_UTIL_CORE.id_tab_type,
11158   x_return_status OUT NOCOPY  VARCHAR2) IS
11159 
11160   line_cont_rec wsh_container_actions.cont_info;
11161   line_cont_tab wsh_container_actions.cont_info_tab;
11162 
11163   l_group_id_temp_tab         WSH_UTIL_CORE.id_tab_type;
11164   l_group_id_tab         WSH_UTIL_CORE.id_tab_type;
11165   l_del_row_tab          WSH_UTIL_CORE.id_tab_type;
11166   l_return_status        VARCHAR2(1);
11167   l_cont_instance_id     NUMBER;
11168   l_row_id               VARCHAR2(30);
11169   l_gross_weight         NUMBER;
11170   l_net_weight           NUMBER;
11171   l_volume               NUMBER;
11172   l_err_cont_name        VARCHAR2(30);
11173   l_cont_instance_cnt    NUMBER;
11174   l_last_organization_id NUMBER;
11175   l_cont_fill_pc         NUMBER;
11176   l_cont_name            VARCHAR2(30);
11177 
11178 
11179   l_attr_tab  wsh_delivery_autocreate.grp_attr_tab_type;
11180   l_group_tab  wsh_delivery_autocreate.grp_attr_tab_type;
11181   l_action_rec wsh_delivery_autocreate.action_rec_type;
11182   l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
11183   l_matched_entities wsh_util_core.id_tab_type;
11184   l_out_rec wsh_delivery_autocreate.out_rec_type;
11185 
11186 
11187   i   NUMBER;
11188   cnt NUMBER;
11189 
11190   error_cnt NUMBER := 0;
11191   succ_cnt  NUMBER  := 0;
11192   warn_cnt  NUMBER  := 0;
11193   cont_warn NUMBER := 0;
11194 
11195   l_fill_pc_warn_count NUMBER := 0; -- bug 3562797 jckwok
11196 
11197   CURSOR c_get_detail(p_del_det_id NUMBER) IS
11198   SELECT nvl(ignore_for_planning, 'N') ignore_for_planning,
11199          organization_id,                        -- K LPN CON. rv
11200          nvl(line_direction,'O') line_direction  -- K LPN CONV. rv
11201   FROM wsh_delivery_details
11202   WHERE delivery_detail_id=p_del_det_id;
11203 
11204 -- K LPN CONV. rv
11205 l_wms_org    VARCHAR2(10) := 'N';
11206 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
11207 l_cont_tab wsh_util_core.id_tab_type;
11208 l_lpn_unit_weight NUMBER;
11209 l_lpn_unit_volume NUMBER;
11210 l_lpn_weight_uom_code VARCHAR2(100);
11211 l_lpn_volume_uom_code VARCHAR2(100);
11212 l_cnt_orgn_id NUMBER;
11213 l_cnt_line_dir VARCHAR2(10);
11214 l_cnt_ignore_plan_flag VARCHAR2(10);
11215 -- K LPN CONV. rv
11216 --
11217 l_debug_on BOOLEAN;
11218 --
11219 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'AUTO_PACK_CONTS';
11220 --
11221 BEGIN
11222 
11223   --dbms_output.put_line('==================================================');
11224   --dbms_output.put_line('Start of WSH_CONTAINER_ACTIONS.Auto_Pack_Conts...');
11225   --dbms_output.put_line('==================================================');
11226 
11227   -- Delete all Global PL/SQL tables to start with
11228   --
11229   --
11230   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
11231   --
11232   IF l_debug_on IS NULL
11233   THEN
11234       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
11235   END IF;
11236   --
11237   IF l_debug_on THEN
11238       WSH_DEBUG_SV.push(l_module_name);
11239   END IF;
11240   --
11241   g_empty_cont_tab.DELETE;
11242   g_assign_detail_tab.DELETE;
11243   g_new_container_tab.DELETE;
11244   g_cache_organization_info_tab.DELETE;
11245   g_cont_msi_tab.DELETE;
11246   g_new_cont_index := 0;
11247   g_assign_detail_index := 0;
11248 
11249   -- 10. Check if Count of p_del_detail_tab table is 0
11250   --IF (p_cont_detail_tab.COUNT = 0 OR p_cont_info_tab.COUNT = 0) THEN
11251   IF (p_cont_detail_tab.COUNT = 0) THEN
11252     --dbms_output.put_line('p_cont_detail_tab count is 0');
11253     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CONT_ASSG_NULL');
11254     x_return_status := C_ERROR_STATUS;
11255     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11256     --
11257     IF l_debug_on THEN
11258         WSH_DEBUG_SV.pop(l_module_name);
11259     END IF;
11260     --
11261     return;
11262   END IF;
11263 
11264   -- 20. Generate Grouping Ids
11265   IF p_group_id_tab.COUNT = 0 THEN
11266 
11267     -- call autocreate delivery API with a check flag set to 'Y' and
11268     -- container flag set to 'Y' to fetch group id table for delivery lines
11269 
11270     --dbms_output.put_line('Calling WSH_DELIVERY_AUTOCREATE.autocreate_deliveries to generate group_ids');
11271     --
11272     IF l_debug_on THEN
11273         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
11274     END IF;
11275     --
11276    l_attr_tab.delete;
11277    FOR i in 1..p_cont_detail_tab.count LOOP
11278 
11279        l_attr_tab(i).entity_id := p_cont_detail_tab(i);
11280        l_attr_tab(i).entity_type := 'DELIVERY_DETAIL';
11281 
11282    END LOOP;
11283 
11284    l_action_rec.action := 'MATCH_GROUPS';
11285 
11286 
11287 
11288    WSH_Delivery_AutoCreate.Find_Matching_Groups(p_attr_tab => l_attr_tab,
11289                                                    p_action_rec => l_action_rec,
11290                                                    p_target_rec => l_target_rec,
11291                                                    p_group_tab => l_group_tab,
11292                                                    x_matched_entities => l_matched_entities,
11293                                                    x_out_rec => l_out_rec,
11294                                                    x_return_status => l_return_status);
11295 
11296 
11297 
11298       IF l_debug_on THEN
11299           WSH_DEBUG_SV.log(l_module_name,'return status', l_return_status);
11300       END IF;
11301     IF (l_return_status = C_ERROR_STATUS) OR
11302        (l_return_status = C_UNEXP_ERROR_STATUS) THEN
11303       --dbms_output.put_line('WSH_DELIVERY_AUTOCREATE.autocreate_deliveries returned '||l_return_status);
11304       FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
11305       WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
11306       x_return_status := l_return_status;
11307       --
11308       IF l_debug_on THEN
11309           WSH_DEBUG_SV.pop(l_module_name);
11310       END IF;
11311       --
11312       return;
11313     END IF;
11314     FOR i in 1..l_attr_tab.COUNT LOOP
11315         l_group_id_tab(l_attr_tab(i).entity_id) := l_attr_tab(i).group_id;
11316     END LOOP;
11317   ELSE
11318     cnt := p_group_id_tab.FIRST;
11319     IF ((cnt IS NULL) OR (p_group_id_tab.COUNT <> p_cont_detail_tab.count)) THEN
11320         x_return_status := C_ERROR_STATUS;
11321         FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
11322         WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11323         --
11324         IF l_debug_on THEN
11325             WSH_DEBUG_SV.pop(l_module_name);
11326         END IF;
11327         --
11328         return;
11329     ELSE
11330         FOR i in 1..l_group_id_tab.COUNT LOOP
11331           l_group_id_tab(p_cont_detail_tab(i)) := p_group_id_tab(i);
11332         END LOOP;
11333     END IF;
11334   END IF;
11335 
11336   --dbms_output.put_line('Checking group_ids is over');
11337 
11338   -- 40. Call Validate_Container_For_Pack to validate detail info in p_cont_detail_tab
11339   -- Bug 3570364 : Passing the parameter p_cont_info_tab which contains the
11340   --               master container item id's for all LPN's( For Auto_pack Master Action on Lines).
11341   Validate_Container_For_Pack(
11342     p_group_id_tab    => l_group_id_tab,
11343     p_cont_info_tab   => p_cont_detail_tab,
11344     p_mast_cont_info_tab => p_cont_info_tab,
11345     x_line_cont_tab   => line_cont_tab,
11346     x_error_cnt       => error_cnt,
11347     x_warn_cnt        => warn_cnt,
11348     x_fill_pc_warn_cnt => l_fill_pc_warn_count -- bug 3562797 jckwok
11349   );
11350 
11351       IF l_debug_on THEN
11352           WSH_DEBUG_SV.log(l_module_name,'after validate container for pack-error,warning', error_cnt||','||warn_cnt);
11353       END IF;
11354   --
11355   -- bug 3562797 jckwok
11356   -- Raise Error if all containers have 'Shipping Parameter' percent fill basis as None
11357   -- Raise warning if found some of the containers with 'Shipping Parameter'
11358   -- percent fill basis as None.
11359   --
11360   IF (l_fill_pc_warn_count = p_cont_detail_tab.count) THEN
11361     x_return_status := C_ERROR_STATUS;
11362     FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
11363     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11364     IF l_debug_on THEN
11365       WSH_DEBUG_SV.pop(l_module_name);
11366     END IF;
11367     RETURN;
11368   ELSIF (l_fill_pc_warn_count > 0) THEN
11369     IF (l_return_status <> C_ERROR_STATUS) THEN
11370       x_return_status := C_WARNING_STATUS;
11371       warn_cnt := warn_cnt + 1;
11372       FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
11373       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11374     END IF;
11375   END IF;
11376   -- end of bug 3562797 jckwok
11377 
11378   IF (line_cont_tab.COUNT > 0) THEN
11379     -- 50. Loop through all Containers that need to be Auto-Packed
11380     cnt := 1;
11381     succ_cnt := 0;
11382     l_last_organization_id := NULL;
11383     WHILE (cnt <= line_cont_tab.COUNT) LOOP
11384 
11385       --dbms_output.put_line('======================================================');
11386       IF l_debug_on THEN
11387           WSH_DEBUG_SV.log(l_module_name,'auto-packing Container ' || line_cont_tab(cnt).delivery_detail_id||' Organization id '||line_cont_tab(cnt).organization_id);
11388       END IF;
11389 
11390       IF (l_last_organization_id is NULL) THEN
11391         l_last_organization_id := line_cont_tab(cnt).organization_id;
11392       ELSIF (l_last_organization_id <> line_cont_tab(cnt).organization_id) THEN
11393         l_last_organization_id := line_cont_tab(cnt).organization_id;
11394 
11395         -- Delete the empty PL/SQL cont table if organization_id changes
11396         g_empty_cont_tab.DELETE;
11397       END IF;
11398 
11399       Pack_Container(
11400          p_line_cont_rec => line_cont_tab(cnt),
11401          x_return_status => l_return_status);
11402 
11403       IF l_return_status = C_ERROR_STATUS THEN
11404         error_cnt := error_cnt + 1;
11405       ELSE
11406         succ_cnt := succ_cnt + 1;
11407       END IF;
11408       cnt := cnt + 1;
11409 
11410     END LOOP;
11411 
11412     -- 60.1 Create Containers from g_new_container_tab PL/SQL table
11413     --dbms_output.put_line('*** Creating Actual Containers ***');
11414     cnt := 1;
11415     l_cont_instance_cnt := 1;
11416     WHILE (cnt <= g_new_container_tab.COUNT) LOOP
11417       l_cont_name := null;
11418 
11419       --
11420       -- K LPN CONV. rv
11421       IF l_debug_on THEN
11422           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CREATE_CONT_INSTANCE_MULTI',WSH_DEBUG_SV.C_PROC_LEVEL);
11423       END IF;
11424       --
11425       WSH_CONTAINER_ACTIONS.Create_Cont_Instance_Multi(
11426         x_cont_name           => l_cont_name,
11427         p_cont_item_id        => g_new_container_tab(cnt).container_item_id,
11428         x_cont_instance_id    => l_cont_instance_id,
11429         p_par_detail_id       => NULL,
11430         p_organization_id     => g_new_container_tab(cnt).organization_id,
11431         p_container_type_code => NULL,
11432         p_num_of_containers   => 1,
11433         x_row_id              => l_row_id,
11434         x_return_status       => l_return_status,
11435         x_cont_tab            => l_cont_tab,
11436         x_unit_weight         => l_lpn_unit_weight,
11437         x_unit_volume         => l_lpn_unit_volume,
11438         x_weight_uom_code     => l_lpn_weight_uom_code,
11439         x_volume_uom_code     => l_lpn_volume_uom_code,
11440         p_lpn_id              => NULL,
11441         p_ignore_for_planning => NULL,
11442         p_caller              => 'WSH_AUTO_PACK_CONTS');
11443       IF l_debug_on THEN
11444           WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
11445           WSH_DEBUG_SV.log(l_module_name,'count of l_cont_tab',l_cont_tab.count);
11446       END IF;
11447       -- K LPN CONV. rv
11448 
11449       IF l_return_status <> C_SUCCESS_STATUS THEN
11450         --dbms_output.put_line('Container Creation failed for index '|| cnt);
11451         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
11452         WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
11453         error_cnt := error_cnt + 1;
11454       ELSE
11455         l_cont_instance_id := l_cont_tab(1);
11456         g_new_container_tab(cnt).cont_instance_id := l_cont_instance_id;
11457         x_cont_instance_tab(l_cont_instance_cnt) := l_cont_instance_id;
11458         l_cont_instance_cnt := l_cont_instance_cnt + 1;
11459         --dbms_output.put_line('Container dd id '||l_cont_instance_id||' for index '|| cnt);
11460       END IF;
11461       cnt := cnt + 1;
11462     END LOOP;
11463 
11464 
11465     -- 70.1 Assign Details to Actual Containers created
11466     --dbms_output.put_line('*** Assigning Containers to Containers Created ***');
11467     cnt := 1;
11468     WHILE (cnt <= g_assign_detail_tab.COUNT) LOOP
11469       l_cont_instance_id := g_new_container_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id;
11470       IF l_debug_on THEN
11471           WSH_DEBUG_SV.log(l_module_name,'DD '||g_assign_detail_tab(cnt).delivery_detail_id||' Index '||g_assign_detail_tab(cnt).container_index||' Cont '||l_cont_instance_id);
11472       END IF;
11473 
11474        --
11475        -- K LPN CONV. rv
11476        IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
11477        --{
11478            open  c_get_detail(l_cont_instance_id);
11479            fetch c_get_detail into l_cnt_ignore_plan_flag, l_cnt_orgn_id, l_cnt_line_dir;
11480            close c_get_detail;
11481 
11482            l_wms_org := wsh_util_validate.check_wms_org(l_cnt_orgn_id);
11483        --}
11484        END IF;
11485        -- K LPN CONV. rv
11486        --
11487        -- J TP Release
11488        --update the container's ignore value with the first line's ignore
11489        --since grouping will have already sorted out lines with diff ignore, this shud be okay
11490        FOR cur IN c_get_detail(g_assign_detail_tab(cnt).delivery_detail_id) LOOP
11491           IF l_debug_on THEN
11492              WSH_DEBUG_SV.log(l_module_name,'ignore_for_planning',cur.ignore_for_planning);
11493           END IF;
11494           --
11495           -- K LPN CONV. rv
11496           IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
11497           AND l_cnt_line_dir IN ('O','IO')
11498           AND
11499           (
11500             (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
11501             OR
11502             (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
11503           )
11504           THEN
11505           --{
11506               l_sync_tmp_rec.delivery_detail_id := l_cont_instance_id;
11507               l_sync_tmp_rec.operation_type := 'UPDATE';
11508               WSH_WMS_SYNC_TMP_PKG.MERGE
11509               (
11510                 p_sync_tmp_rec      => l_sync_tmp_rec,
11511                 x_return_status     => l_return_status
11512               );
11513 
11514               IF l_debug_on THEN
11515                 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
11516               END IF;
11517               --
11518               IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11519                 --
11520                 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11521                   warn_cnt := warn_cnt + 1;
11522                 ELSE
11523                   --
11524                   error_cnt := error_cnt + 1;
11525                   IF l_debug_on THEN
11526                     WSH_DEBUG_SV.logmsg(l_module_name,'WSH_WMS_SYNC_TMP_PKG.MERGE completed with an error');
11527                   END IF;
11528                   --
11529                 END IF;
11530                 --
11531               END IF;
11532           --}
11533           END IF;
11534           -- K LPN CONV. rv
11535           UPDATE wsh_delivery_details
11536           SET ignore_for_planning=cur.ignore_for_planning
11537           WHERE delivery_detail_id=l_cont_instance_id;
11538 
11539           IF SQL%NOTFOUND THEN
11540              FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
11541              IF l_debug_on THEN
11542 	        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
11543              END IF;
11544             l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_instance_id);
11545 	    FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
11546 	    x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11547 	    WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11548             IF l_debug_on THEN
11549 	       WSH_DEBUG_SV.pop(l_module_name);
11550 	    END IF;
11551             return;
11552           END IF;
11553        END LOOP;
11554 
11555       IF (l_cont_instance_id is NOT NULL) THEN
11556         --
11557         IF l_debug_on THEN
11558             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_TO_CONTAINER',WSH_DEBUG_SV.C_PROC_LEVEL);
11559         END IF;
11560         --
11561         wsh_container_actions.Assign_To_Container (
11562               p_det_cont_inst_id => g_assign_detail_tab(cnt).delivery_detail_id,
11563               p_par_cont_inst_id => l_cont_instance_id,
11564               x_return_status    => l_return_status);
11565       IF l_debug_on THEN
11566           WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
11567       END IF;
11568 
11569         --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Assign_To_Container returned '||l_return_status);
11570         IF l_return_status = C_ERROR_STATUS THEN
11571            error_cnt := error_cnt + 1;
11572         ELSIF l_return_status = C_WARNING_STATUS THEN
11573            warn_cnt := warn_cnt + 1;
11574         ELSE
11575            NULL;
11576            --dbms_output.put_line('Assigned dd '||g_assign_detail_tab(cnt).delivery_detail_id||' to Cont '||l_cont_instance_id);
11577         END IF;
11578       END IF;
11579 
11580       cnt := cnt + 1;
11581     END LOOP;
11582 
11583   END IF; -- line_cont_tab.COUNT > 0
11584 
11585         IF l_debug_on THEN
11586           WSH_DEBUG_SV.log(l_module_name,'error cnt is ' || error_cnt || ' warn cnt is ' || warn_cnt|| ' succ cnt is ' || succ_cnt);
11587         END IF;
11588 
11589   -- 90.1 Summarize errors/warnings
11590   IF (error_cnt > 0) THEN
11591     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CONT_PACK_ERROR');
11592     FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
11593     FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
11594     FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
11595     IF succ_cnt > 0 THEN
11596       x_return_status := C_WARNING_STATUS;
11597     ELSE
11598       x_return_status := C_ERROR_STATUS;
11599     END IF;
11600     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11601   ELSIF (warn_cnt > 0 OR cont_warn > 0) THEN
11602     x_return_status := C_WARNING_STATUS;
11603     IF cont_warn > 0 THEN
11604       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_PACK_WARN');
11605       FND_MESSAGE.SET_TOKEN('CONT_WARN',cont_warn);
11606       FND_MESSAGE.SET_TOKEN('CONT_ERR',0);
11607       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11608     END IF;
11609   ELSE
11610     x_return_status := C_SUCCESS_STATUS;
11611   END IF;
11612 
11613   --
11614   IF l_debug_on THEN
11615       WSH_DEBUG_SV.pop(l_module_name);
11616   END IF;
11617   --
11618   RETURN;
11619 
11620 --
11621 IF l_debug_on THEN
11622     WSH_DEBUG_SV.pop(l_module_name);
11623 END IF;
11624 --
11625 EXCEPTION
11626   WHEN Others THEN
11627     WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Auto_Pack_conts',l_module_name);
11628     x_return_status := C_UNEXP_ERROR_STATUS;
11629 
11630 --
11631 IF l_debug_on THEN
11632     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11633     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11634 END IF;
11635 --
11636 END Auto_Pack_conts;
11637 
11638 /*
11639 -----------------------------------------------------------------------------
11640    PROCEDURE  : Update_Cont_Attributes
11641    PARAMETERS : p_delivery_detail_id - delivery detail id
11642 		p_delivery_id - delivery id if container assigned to delivery
11643 		p_container_instance_id - delivery detail id for the container
11644 		x_return_status - return status of API
11645   DESCRIPTION : This procedure updates the grouping attribute columns of the
11646 		container with the grouping attribute values derived from the
11647 		delivery line that is input.
11648 ------------------------------------------------------------------------------
11649 */
11650 
11651 PROCEDURE Update_Cont_Attributes (
11652  p_delivery_detail_id IN NUMBER,
11653  p_delivery_id IN NUMBER,
11654  p_container_instance_id IN NUMBER,
11655  x_return_status OUT NOCOPY  VARCHAR2) IS
11656 
11657 
11658  CURSOR Get_Detail_Attr (v_detail_id NUMBER) IS
11659  SELECT organization_id, customer_id, ship_to_location_id,
11660 	intmed_ship_to_location_id,
11661 	fob_code, freight_terms_code, ship_method_code,
11662         mode_of_transport, service_level, carrier_id,
11663 	deliver_to_location_id,
11664         NVL(line_direction,'O') line_direction,   -- J-IB-NPARIKH
11665         shipping_control,   -- J-IB-NPARIKH
11666         vendor_id,   -- J-IB-NPARIKH
11667         party_id,   -- J-IB-NPARIKH
11668         nvl(ignore_for_planning, 'N')  ignore_for_planning, --J TP Release
11669         client_id -- LSP PROJECT : ClientID needs to be updated on LPN
11670  FROM WSH_DELIVERY_DETAILS
11671  WHERE delivery_detail_id = v_detail_id;
11672 
11673  CURSOR Get_Del_Attr (v_del_id NUMBER) IS
11674  SELECT organization_id, customer_id, ultimate_dropoff_location_id,
11675 	intmed_ship_to_location_id,
11676 	fob_code, freight_terms_code, ship_method_code,
11677         mode_of_transport, service_level, carrier_id,
11678 	ultimate_dropoff_location_id deliver_to_location_id,
11679         NVL(shipment_direction,'O') line_direction,   -- J-IB-NPARIKH
11680         shipping_control,   -- J-IB-NPARIKH
11681         vendor_id,   -- J-IB-NPARIKH
11682         party_id,   -- J-IB-NPARIKH
11683         nvl(ignore_for_planning,'N') ignore_for_planning, --J TP Release
11684         client_id -- LSP PROJECT : ClientID needs to be updated on LPN
11685  FROM WSH_NEW_DELIVERIES
11686  WHERE delivery_id = v_del_id;
11687 
11688  l_cont_name VARCHAR2(30);
11689 
11690  l_org_id NUMBER;
11691  l_cust_id NUMBER;
11692  l_intmed_loc_id NUMBER;
11693  l_fob_code VARCHAR2(30);
11694  l_freight_terms_code VARCHAR2(30);
11695  l_ship_method_code VARCHAR2(30);
11696  l_carrier_id NUMBER;
11697  l_service_level VARCHAR2(30);
11698  l_mode_of_transport VARCHAR2(30);
11699  l_deliver_to_loc_id NUMBER;
11700  l_ship_to_loc_id NUMBER;
11701  l_line_direction VARCHAR2(30);
11702  l_shipping_control VARCHAR2(30);
11703  l_vendor_id NUMBER;
11704  l_party_id  NUMBER;
11705  l_ignore_for_planning VARCHAR2(1);
11706  --
11707  l_client_id           NUMBER; -- LSP PROJECT :
11708 
11709 -- K LPN CONV. rv
11710 l_wms_org    VARCHAR2(10) := 'N';
11711 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
11712 l_return_status VARCHAR2(1);
11713 l_num_warnings  NUMBER := 0;
11714 l_cnt_line_dir VARCHAR2(10);
11715 -- K LPN CONV. rv
11716 
11717 --BUG#12904248
11718 l_deliver_to_location_id NUMBER;
11719 
11720 --
11721 l_debug_on BOOLEAN;
11722 --
11723 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_CONT_ATTRIBUTES';
11724 --
11725 BEGIN
11726 
11727  --
11728  --
11729  l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
11730  --
11731  IF l_debug_on IS NULL
11732  THEN
11733      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
11734  END IF;
11735  --
11736  IF l_debug_on THEN
11737      WSH_DEBUG_SV.push(l_module_name);
11738      --
11739      WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_DETAIL_ID',P_DELIVERY_DETAIL_ID);
11740      WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
11741      WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
11742  END IF;
11743  --
11744  IF p_delivery_detail_id IS NOT NULL THEN
11745 
11746 	 OPEN Get_Detail_Attr (p_delivery_detail_id);
11747 
11748 	 FETCH Get_Detail_Attr INTO
11749 		l_org_id,
11750 		l_cust_id,
11751 		l_ship_to_loc_id,
11752 		l_intmed_loc_id,
11753 		l_fob_code,
11754 		l_freight_terms_code,
11755 		l_ship_method_code,
11756 		l_mode_of_transport,
11757 		l_service_level,
11758 		l_carrier_id,
11759 		l_deliver_to_loc_id,
11760         l_line_direction,
11761         l_shipping_control,
11762         l_vendor_id,
11763         l_partY_id,
11764         l_ignore_for_planning,
11765         l_client_id -- LSP PROJECT
11766         ;
11767 
11768 	 IF Get_Detail_Attr%NOTFOUND THEN
11769 --dbms_output.put_line('invalid detail id ' || p_delivery_detail_id);
11770 		CLOSE Get_Detail_Attr;
11771 		FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
11772 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_detail_id);
11773 		x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11774 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11775 		--
11776 		IF l_debug_on THEN
11777 		    WSH_DEBUG_SV.pop(l_module_name);
11778 		END IF;
11779 		--
11780 		return;
11781 	 END IF;
11782 
11783 	 IF Get_Detail_Attr%ISOPEN THEN
11784 		CLOSE Get_Detail_Attr;
11785 	 END IF;
11786 
11787  ELSIF p_delivery_id IS NOT NULL THEN
11788 
11789 	 OPEN Get_Del_Attr (p_delivery_id);
11790 
11791 	 FETCH Get_Del_Attr INTO
11792 		l_org_id,
11793 		l_cust_id,
11794 		l_ship_to_loc_id,
11795 		l_intmed_loc_id,
11796 		l_fob_code,
11797 		l_freight_terms_code,
11798 		l_ship_method_code,
11799                 l_mode_of_transport,
11800                 l_service_level,
11801                 l_carrier_id,
11802 		l_deliver_to_loc_id,
11803                 l_line_direction,
11804                 l_shipping_control,
11805                 l_vendor_id,
11806                 l_partY_id,
11807                 l_ignore_for_planning,
11808                 l_client_id -- LSP PROJECT
11809         ;
11810 
11811 	 IF Get_Del_Attr%NOTFOUND THEN
11812 		CLOSE Get_Del_Attr;
11813 		FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DELIVERY');
11814 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_id);
11815 		x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11816 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11817 		--
11818 		IF l_debug_on THEN
11819 		    WSH_DEBUG_SV.pop(l_module_name);
11820 		END IF;
11821 		--
11822 		return;
11823 	 END IF;
11824 
11825 	 IF Get_Del_Attr%ISOPEN THEN
11826 		CLOSE Get_Del_Attr;
11827 	 END IF;
11828 
11829  ELSE
11830 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NO_ATTR_ERROR');
11831 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11832 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11833 	--
11834 	IF l_debug_on THEN
11835 	    WSH_DEBUG_SV.pop(l_module_name);
11836 	END IF;
11837 	--
11838 	return;
11839 
11840  END IF;
11841 
11842 
11843  --dbms_output.put_line('calling update with customer id ' || l_cust_id || ' and ship to ' || l_ship_to_loc_id);
11844 
11845  -- K LPN CONV. rv
11846  IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
11847    FOR cnt_inst_rec in Get_Detail_Attr(p_container_instance_id) LOOP
11848      l_wms_org := wsh_util_validate.check_wms_org(cnt_inst_rec.organization_id);
11849      l_cnt_line_dir := cnt_inst_rec.line_direction;
11850    END LOOP;
11851  END IF;
11852  --
11853  IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
11854  AND l_cnt_line_dir IN ('O','IO')
11855  AND
11856  (
11857    (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
11858    OR
11859    (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
11860  )
11861  THEN
11862  --{
11863      l_sync_tmp_rec.delivery_detail_id := p_container_instance_id;
11864      l_sync_tmp_rec.operation_type := 'UPDATE';
11865      WSH_WMS_SYNC_TMP_PKG.MERGE
11866      (
11867        p_sync_tmp_rec      => l_sync_tmp_rec,
11868        x_return_status     => l_return_status
11869      );
11870 
11871      IF l_debug_on THEN
11872        WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
11873      END IF;
11874      --
11875      IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
11876        --
11877        x_return_status := l_return_status;
11878        --
11879        IF l_debug_on THEN
11880          WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
11881          WSH_DEBUG_SV.pop(l_module_name);
11882        END IF;
11883        --
11884        return;
11885        --
11886      ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
11887        --
11888        l_num_warnings := l_num_warnings + 1;
11889        --
11890      END IF;
11891      --
11892  --}
11893  END IF;
11894  -- K LPN CONV. rv
11895 
11896     --BUG#12904248
11897  Get_Deliver_To_Location(
11898  p_container_id => p_container_instance_id,
11899  x_deliver_to_location_id => l_deliver_to_location_id,
11900  x_return_status => l_return_status);
11901 
11902  IF NVL(l_deliver_to_location_id,-99) <> l_deliver_to_loc_id then
11903      l_deliver_to_loc_id:=NULL;
11904  END IF;
11905 
11906  UPDATE WSH_DELIVERY_DETAILS SET
11907 	customer_id = l_cust_id,
11908 	ship_to_location_id = l_ship_to_loc_id,
11909 	intmed_ship_to_location_id = l_intmed_loc_id,
11910 	fob_code = l_fob_code,
11911   	freight_terms_code = l_freight_terms_code,
11912 	ship_method_code = l_ship_method_code,
11913 	mode_of_transport = l_mode_of_transport,
11914 	carrier_id = l_carrier_id,
11915 	service_level = l_service_level,
11916 	deliver_to_location_id = l_deliver_to_loc_id,
11917         line_direction      = l_line_direction ,   -- J-IB-NPARIKH
11918         shipping_control    = l_shipping_control,   -- J-IB-NPARIKH
11919         --vendor_id           = l_vendor_id,   -- J-IB-NPARIKH
11920         --party_id            = l_party_id   -- J-IB-NPARIKH
11921         ignore_for_planning   = l_ignore_for_planning,
11922         client_id             = l_client_id -- LSP PROJECT : update clientId info on LPN Rec.
11923  WHERE delivery_detail_id = p_container_instance_id;
11924 
11925  IF SQL%NOTFOUND THEN
11926 --dbms_output.put_line('could not update container ' || p_container_instance_id);
11927 	FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
11928 	--
11929 	IF l_debug_on THEN
11930 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
11931 	END IF;
11932 	--
11933 	l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
11934 	FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
11935 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11936 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11937 	--
11938 	IF l_debug_on THEN
11939 	    WSH_DEBUG_SV.pop(l_module_name);
11940 	END IF;
11941 	--
11942 	return;
11943  END IF;
11944 
11945  x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11946 
11947  IF l_num_warnings > 0 THEN
11948     x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
11949  END IF;
11950 
11951 
11952 --
11953 IF l_debug_on THEN
11954     WSH_DEBUG_SV.pop(l_module_name);
11955 END IF;
11956 --
11957 EXCEPTION
11958 
11959   WHEN Others THEN
11960 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_Cont_Attributes',l_module_name);
11961 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11962 
11963 --
11964 IF l_debug_on THEN
11965     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11966     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11967 END IF;
11968 --
11969 END Update_Cont_Attributes;
11970 
11971 
11972 
11973 /*
11974 -----------------------------------------------------------------------------
11975    PROCEDURE  : Check_Cont_Attributes
11976    PARAMETERS : p_container_instance_id - delivery detail id for the container
11977 		x_attr_flag - 'Y' or 'N' to determine if any of the grouping
11978 		attributes other than org id and ship from has been populated.
11979 		x_return_status - return status of API
11980   DESCRIPTION : This procedure fetched the grouping attribute columns of the
11981 		container and checks to see if the columns are null or if they
11982 		are populated. If any of the values are not null, then the API
11983 		returns a x_attr_flag of 'Y' else it returns a 'N'.
11984 ------------------------------------------------------------------------------
11985 */
11986 
11987 PROCEDURE Check_Cont_Attributes (
11988  p_container_instance_id IN NUMBER,
11989  x_attr_flag OUT NOCOPY  VARCHAR2,
11990  x_return_status OUT NOCOPY  VARCHAR2) IS
11991 
11992  CURSOR Get_Detail_Attr (v_detail_id NUMBER) IS
11993  SELECT customer_id, intmed_ship_to_location_id,
11994 	fob_code, freight_terms_code, ship_method_code,
11995         mode_of_transport, service_level, carrier_id,
11996 	deliver_to_location_id
11997  FROM WSH_DELIVERY_DETAILS
11998  WHERE delivery_detail_id = v_detail_id;
11999 
12000  l_cont_name VARCHAR2(30);
12001 
12002  l_org_id NUMBER;
12003  l_cust_id NUMBER;
12004  l_intmed_loc_id NUMBER;
12005  l_fob_code VARCHAR2(30);
12006  l_freight_terms_code VARCHAR2(30);
12007  l_ship_method_code VARCHAR2(30);
12008  l_carrier_id NUMBER;
12009  l_mode_of_transport VARCHAR2(30);
12010  l_service_level VARCHAR2(30);
12011  l_deliver_to_loc_id NUMBER;
12012 
12013  l_attr_flag VARCHAR2(1) := 'N';
12014 
12015 --
12016 l_debug_on BOOLEAN;
12017 --
12018 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CHECK_CONT_ATTRIBUTES';
12019 --
12020 BEGIN
12021 
12022 --dbms_output.put_line('in check cont attr with ' || p_container_instance_id);
12023 
12024  --
12025  --
12026  l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12027  --
12028  IF l_debug_on IS NULL
12029  THEN
12030      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12031  END IF;
12032  --
12033  IF l_debug_on THEN
12034      WSH_DEBUG_SV.push(l_module_name);
12035      --
12036      WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
12037  END IF;
12038  --
12039  OPEN Get_Detail_Attr (p_container_instance_id);
12040 
12041  FETCH Get_Detail_Attr INTO
12042 	l_cust_id,
12043 	l_intmed_loc_id,
12044 	l_fob_code,
12045 	l_freight_terms_code,
12046 	l_ship_method_code,
12047         l_mode_of_transport,
12048         l_service_level,
12049         l_carrier_id,
12050 	l_deliver_to_loc_id;
12051 
12052  IF Get_Detail_Attr%NOTFOUND THEN
12053 	CLOSE Get_Detail_Attr;
12054 --dbms_output.put_line('no detail found for ' || p_container_instance_id);
12055 	FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
12056 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12057 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
12058  	x_attr_flag := 'N';
12059 	--
12060 	IF l_debug_on THEN
12061 	    WSH_DEBUG_SV.pop(l_module_name);
12062 	END IF;
12063 	--
12064 	return;
12065  END IF;
12066 
12067  IF Get_Detail_Attr%ISOPEN THEN
12068 	CLOSE Get_Detail_Attr;
12069  END IF;
12070 
12071  IF l_cust_id IS NOT NULL THEN
12072 	l_attr_flag := 'Y';
12073  END IF;
12074 
12075  IF l_intmed_loc_id IS NOT NULL THEN
12076 	l_attr_flag := 'Y';
12077  END IF;
12078 
12079  IF l_fob_code IS NOT NULL THEN
12080 	l_attr_flag := 'Y';
12081  END IF;
12082 
12083  IF l_freight_terms_code IS NOT NULL THEN
12084 	l_attr_flag := 'Y';
12085  END IF;
12086 
12087  IF l_service_level IS NOT NULL THEN
12088 	l_attr_flag := 'Y';
12089  END IF;
12090  IF l_mode_of_transport IS NOT NULL THEN
12091 	l_attr_flag := 'Y';
12092  END IF;
12093  IF l_carrier_id IS NOT NULL THEN
12094 	l_attr_flag := 'Y';
12095  END IF;
12096  IF l_ship_method_code IS NOT NULL THEN
12097 	l_attr_flag := 'Y';
12098  END IF;
12099 
12100  IF l_deliver_to_loc_id IS NOT NULL THEN
12101 	l_attr_flag := 'Y';
12102  END IF;
12103 
12104  x_attr_flag := l_attr_flag;
12105 
12106  x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12107 
12108 --
12109 IF l_debug_on THEN
12110     WSH_DEBUG_SV.pop(l_module_name);
12111 END IF;
12112 --
12113 EXCEPTION
12114 
12115   WHEN Others THEN
12116 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Check_Cont_Attributes',l_module_name);
12117 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12118 
12119 --
12120 IF l_debug_on THEN
12121     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12122     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12123 END IF;
12124 --
12125 END Check_Cont_Attributes;
12126 
12127 
12128 /*
12129 -----------------------------------------------------------------------------
12130    PROCEDURE  : Update_Cont_Hierarchy
12131    PARAMETERS : p_delivery_detail_id - delivery detail id
12132 		p_delivery_id - delivery id if container assigned to delivery
12133 		p_container_instance_id - delivery detail id for the container
12134 		x_return_status - return status of API
12135   DESCRIPTION : This procedure updates the grouping attribute columns of the
12136 		the entire container hierarchy for the specified container
12137 		with the grouping attribute values derived from the
12138 		delivery line that is input.
12139 ------------------------------------------------------------------------------
12140 */
12141 
12142 PROCEDURE Update_Cont_Hierarchy (
12143  p_del_detail_id IN NUMBER,
12144  p_delivery_id IN NUMBER,
12145  p_container_instance_id IN NUMBER,
12146  x_return_status OUT NOCOPY  VARCHAR2) IS
12147 
12148 
12149  CURSOR Get_Child_Containers(v_cont_instance_id NUMBER) IS
12150  SELECT delivery_detail_id
12151  FROM wsh_delivery_assignments_v
12152  START WITH delivery_detail_id = v_cont_instance_id
12153  CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id;
12154 
12155  CURSOR Get_Cont_Flag (v_detail_id NUMBER) IS
12156  SELECT container_flag
12157  FROM WSH_DELIVERY_DETAILS
12158  WHERE delivery_detail_id = v_detail_id;
12159 
12160  l_master_cont_inst_id NUMBER;
12161  l_master_cont_name VARCHAR2(30);
12162 
12163  l_cont_name VARCHAR2(30);
12164  l_cont_flag VARCHAR2(1);
12165 
12166  l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12167 
12168 --
12169 l_debug_on BOOLEAN;
12170 --
12171 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_CONT_HIERARCHY';
12172 --
12173 BEGIN
12174 
12175  --
12176  --
12177  l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12178  --
12179  IF l_debug_on IS NULL
12180  THEN
12181      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12182  END IF;
12183  --
12184  IF l_debug_on THEN
12185      WSH_DEBUG_SV.push(l_module_name);
12186      --
12187      WSH_DEBUG_SV.log(l_module_name,'P_DEL_DETAIL_ID',P_DEL_DETAIL_ID);
12188      WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
12189      WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
12190  END IF;
12191  --
12192  --
12193  IF l_debug_on THEN
12194      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_CONT_ID',WSH_DEBUG_SV.C_PROC_LEVEL);
12195  END IF;
12196  --
12197  l_master_cont_inst_id := WSH_CONTAINER_UTILITIES.Get_Master_Cont_Id(p_container_instance_id);
12198 
12199  IF l_master_cont_inst_id IS NULL THEN
12200 	l_master_cont_inst_id := p_container_instance_id;
12201  END IF;
12202 
12203  --dbms_output.put_line('calling get child containers with ' || l_master_cont_inst_id);
12204 
12205  FOR cont IN Get_Child_Containers(l_master_cont_inst_id) LOOP
12206 
12207 	EXIT WHEN Get_Child_Containers%NOTFOUND;
12208 
12209  --dbms_output.put_line('in loop with ' || cont.delivery_detail_id);
12210 
12211 	OPEN Get_Cont_Flag (cont.delivery_detail_id);
12212 
12213 	FETCH Get_Cont_Flag INTO l_cont_flag;
12214 
12215  	IF Get_Cont_Flag%NOTFOUND THEN
12216 --dbms_output.put_line('cont flag not found for ' || cont.delivery_detail_id);
12217 		CLOSE Get_Cont_Flag;
12218 		GOTO next_cont;
12219 	END IF;
12220 
12221 	IF Get_Cont_Flag%ISOPEN THEN
12222 		CLOSE Get_Cont_Flag;
12223 	END IF;
12224 
12225 --dbms_output.put_line('called get child containers with ' || cont.delivery_detail_id || ' and cont flag is ' || l_cont_flag);
12226 
12227 	IF (nvl(l_cont_flag,'N') = 'Y') THEN
12228 
12229 	--dbms_output.put_line('calling update cont attr with ' || cont.delivery_detail_id);
12230 
12231 		--
12232 		IF l_debug_on THEN
12233 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
12234 		END IF;
12235 		--
12236 		wsh_container_actions.Update_Cont_Attributes (
12237 						p_del_detail_id,
12238 						p_delivery_id,
12239 						cont.delivery_detail_id,
12240 						l_return_status);
12241                 IF l_debug_on THEN
12242                   WSH_DEBUG_SV.log(l_module_name,'return status-',l_return_status);
12243                 END IF;
12244 
12245 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12246 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
12247 			--
12248 			IF l_debug_on THEN
12249 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
12250 			END IF;
12251 			--
12252 			l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(cont.delivery_detail_id);
12253 			FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
12254 			x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12255 			WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
12256 		END IF;
12257 
12258 	END IF;
12259 
12260 	<<next_cont>>
12261 	     null;
12262 
12263 	l_cont_flag := NULL;
12264 
12265   END LOOP;
12266 
12267   IF nvl(x_return_status,WSH_UTIL_CORE.G_RET_STS_SUCCESS) <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12268 	--
12269 	IF l_debug_on THEN
12270 	    WSH_DEBUG_SV.pop(l_module_name);
12271 	END IF;
12272 	--
12273 	return;
12274   ELSE
12275 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12276   END IF;
12277 
12278 --
12279 IF l_debug_on THEN
12280     WSH_DEBUG_SV.pop(l_module_name);
12281 END IF;
12282 --
12283 EXCEPTION
12284 
12285   WHEN Others THEN
12286 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_Cont_Hierarchy',l_module_name);
12287 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12288 
12289 --
12290 IF l_debug_on THEN
12291     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12292     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12293 END IF;
12294 --
12295 END Update_Cont_Hierarchy;
12296 
12297 
12298 /*
12299 -----------------------------------------------------------------------------
12300    PROCEDURE  : Last_Assigned_Line
12301    PARAMETERS : p_delivery_detail_id - delivery detail id
12302 		p_container_instance_id - delivery detail id for the container
12303 		x_last_line_flag - 'Y' or 'N' depending on whether it is the
12304 		last line in the container hierarchy or not.
12305 		x_return_status - return status of API
12306   DESCRIPTION : This procedure checks to see if the delivery detail id is the
12307 		last assigned line in the container hierarchy for the input
12308 		container. If it is, x_last_line_flag is set to 'Y' else it is
12309 		set to 'N'.
12310 ------------------------------------------------------------------------------
12311 */
12312 
12313 PROCEDURE Last_Assigned_Line (
12314  p_del_detail_id IN NUMBER,
12315  p_container_instance_id IN NUMBER,
12316  x_last_line_flag OUT NOCOPY  VARCHAR2,
12317  x_return_status OUT NOCOPY  VARCHAR2) IS
12318 
12319  CURSOR Get_Contents (v_detail_id NUMBER) IS
12320  SELECT count(*)
12321  FROM wsh_delivery_assignments_v
12322  START WITH delivery_detail_id = v_detail_id
12323  CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id;
12324 
12325  CURSOR Get_Cont_Count (v_cont_id NUMBER) IS
12326  SELECT count(*)
12327  FROM wsh_delivery_assignments_v
12328  WHERE delivery_detail_id IN
12329 	(SELECT delivery_detail_id
12330 	 FROM WSH_DELIVERY_DETAILS
12331   	 WHERE container_flag = 'Y')
12332  START WITH delivery_detail_id = v_cont_id
12333  CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id;
12334 
12335  l_content_cnt NUMBER;
12336  l_cont_cnt NUMBER;
12337 
12338  l_mast_cont_inst_id NUMBER;
12339 
12340 --
12341 l_debug_on BOOLEAN;
12342 --
12343 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'LAST_ASSIGNED_LINE';
12344 --
12345 BEGIN
12346 
12347  --
12348  --
12349  l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12350  --
12351  IF l_debug_on IS NULL
12352  THEN
12353      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12354  END IF;
12355  --
12356  IF l_debug_on THEN
12357      WSH_DEBUG_SV.push(l_module_name);
12358      --
12359      WSH_DEBUG_SV.log(l_module_name,'P_DEL_DETAIL_ID',P_DEL_DETAIL_ID);
12360      WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
12361  END IF;
12362  --
12363  --
12364  IF l_debug_on THEN
12365      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_CONT_ID',WSH_DEBUG_SV.C_PROC_LEVEL);
12366  END IF;
12367  --
12368  l_mast_cont_inst_id := WSH_CONTAINER_UTILITIES.Get_Master_Cont_Id (p_container_instance_id);
12369 
12370  IF l_mast_cont_inst_id IS NULL THEN
12371 	l_mast_cont_inst_id := p_container_instance_id;
12372  END IF;
12373 
12374  OPEN Get_Contents (l_mast_cont_inst_id);
12375 
12376  FETCH Get_Contents INTO l_content_cnt;
12377 
12378  IF Get_Contents%NOTFOUND THEN
12379 	CLOSE Get_Contents;
12380 	x_last_line_flag := 'N';
12381 	FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
12382 	x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12383 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
12384 	--
12385 	IF l_debug_on THEN
12386 	    WSH_DEBUG_SV.pop(l_module_name);
12387 	END IF;
12388 	--
12389 	return;
12390  END IF;
12391 
12392  IF Get_Contents%ISOPEN THEN
12393 	CLOSE Get_Contents;
12394  END IF;
12395 
12396  OPEN Get_Cont_Count (l_mast_cont_inst_id);
12397 
12398  FETCH Get_Cont_Count INTO l_cont_cnt;
12399 
12400  IF Get_Cont_Count%NOTFOUND THEN
12401 	CLOSE Get_Cont_Count;
12402 	x_last_line_flag := 'N';
12403 	FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
12404 	x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12405 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
12406 	--
12407 	IF l_debug_on THEN
12408 	    WSH_DEBUG_SV.pop(l_module_name);
12409 	END IF;
12410 	--
12411 	return;
12412  END IF;
12413 
12414  IF Get_Cont_Count%ISOPEN THEN
12415 	CLOSE Get_Cont_Count;
12416  END IF;
12417 
12418  IF (l_content_cnt - l_cont_cnt) > 0 THEN
12419 	x_last_line_flag := 'N';
12420  ELSE
12421 	x_last_line_flag := 'Y';
12422  END IF;
12423 
12424  x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12425 
12426 --
12427 IF l_debug_on THEN
12428     WSH_DEBUG_SV.pop(l_module_name);
12429 END IF;
12430 --
12431 EXCEPTION
12432 
12433   WHEN Others THEN
12434 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Last_Assigned_Line',l_module_name);
12435 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12436 
12437 --
12438 IF l_debug_on THEN
12439     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12440     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12441 END IF;
12442 --
12443 END Last_Assigned_Line;
12444 
12445 
12446 
12447 -- J-IB-NPARIKH-{
12448 --
12449 --========================================================================
12450 -- PROCEDURE : pack_inbound_lines
12451 --
12452 -- PARAMETERS: p_lines_tbl       Table of delivery lines to be packed
12453 --             p_lpn_id          LPN ID
12454 --             p_lpn_name        Container name as entered on ASN
12455 --             p_delivery_id     Delivery ID for delivery, input lines belong to
12456 --             p_transactionType ASN/RECEIPT
12457 --             x_return_status   Return status of the API
12458 --
12459 -- ASSUMPTION: All input lines belong to only one delivery, specified by p_delivery_id
12460 --
12461 -- COMMENT   : This procedure is called only from the Inbound ASN/Receipt
12462 --             integration to pack delivery lines as per the ASN LPN
12463 --             Configuration.
12464 --             It performs the following steps:
12465 --             01. Validate that input delivery id is not null and is a valid delivery.
12466 --             02. Validate that input table of lines contain at least one record.
12467 --             03. If input delivery is outbound, return with error.
12468 --             04. Append LPN name with delivery name.
12469 --             05. Create container instance
12470 --             06. Update container delivery detail record with grouping attributes from delivery.
12471 --             07. Assign container to delivery
12472 --             08. Assign input lines to container
12473 --             09. Calculate container dates
12474 --             10. Calculate container weight/volume
12475 --
12476 --========================================================================
12477 --
12478 PROCEDURE pack_inbound_lines
12479             (
12480                p_lines_tbl          IN          WSH_UTIL_CORE.id_tab_type,
12481                p_lpn_id             IN          NUMBER,
12482                p_lpn_name           IN        VARCHAR2,
12483                p_delivery_id        IN          NUMBER,
12484                p_transactionType    IN          VARCHAR2 DEFAULT 'ASN',
12485                x_return_status      OUT NOCOPY  VARCHAR2,
12486 	       p_waybill_number     IN          VARCHAR2,
12487                p_caller             IN          VARCHAR2
12488             )
12489 IS
12490 --{
12491     --
12492     -- Get delivery information
12493     --
12494     CURSOR dlvy_csr (p_delivery_id IN NUMBER)
12495     IS
12496         SELECT organization_id,
12497                nvl(shipment_direction,'O') shipment_direction,
12498                initial_pickup_location_id,
12499                ultimate_dropoff_location_id,
12500                customer_id,
12501                intmed_ship_to_location_id,
12502                fob_code,
12503                freight_terms_code,
12504                ship_method_code,
12505                shipping_control,
12506                vendor_id,
12507                party_id,
12508                name,
12509                nvl(ignore_for_planning,'N') ignore_for_planning
12510         FROM   wsh_new_deliveries wnd
12511         WHERE  delivery_id             = p_delivery_id;
12512     --
12513     --
12514     l_dlvy_rec dlvy_csr%ROWTYPE;
12515     --
12516     l_num_warnings                NUMBER := 0;
12517     l_num_errors                  NUMBER := 0;
12518     l_return_status               VARCHAR2(10);
12519     --
12520     l_cont_name                   VARCHAR2(100);
12521     l_container_instance_id       NUMBER;
12522     l_rowid                       VARCHAR2(32767);
12523     l_cont_tbl                    WSH_UTIL_CORE.id_tab_type;
12524 				--
12525     l_gross_weight                NUMBER;
12526     l_net_weight                  NUMBER;
12527     l_volume                      NUMBER;
12528     l_cont_fill_pc                NUMBER;
12529 
12530     l_detail_tab                  WSH_UTIL_CORE.id_tab_type;  -- DBI Project
12531     l_dbi_rs                      VARCHAR2(1); -- Return Status from DBI API
12532 
12533     cursor l_dup_del_csr(p_lpn_name IN VARCHAR2)
12534     is
12535     select wnd.delivery_id,
12536            wnd.name,
12537            wnd.status_code,
12538            wda.delivery_detail_id
12539     from   wsh_delivery_details wdd,
12540            wsh_delivery_assignments_v wda,
12541            wsh_new_deliveries wnd
12542     where  wdd.container_name = p_lpn_name
12543     and    wdd.container_flag = 'Y'
12544     and    wda.delivery_detail_id = wdd.delivery_detail_id
12545     and    wda.delivery_id = wnd.delivery_id(+);
12546 
12547     l_dup_del_id     NUMBER;
12548     l_dup_del_name   VARCHAR2(32767);
12549     l_dup_del_status VARCHAR2(2);
12550     l_dup_cnt_id     NUMBER;
12551     --
12552 
12553 -- K LPN CONV. rv
12554 l_cont_tab wsh_util_core.id_tab_type;
12555 l_lpn_unit_weight NUMBER;
12556 l_lpn_unit_volume NUMBER;
12557 l_lpn_weight_uom_code VARCHAR2(100);
12558 l_lpn_volume_uom_code VARCHAR2(100);
12559 -- K LPN CONV. rv
12560     l_debug_on                    BOOLEAN;
12561     --
12562     l_module_name        CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'pack_inbound_lines';
12563     --
12564 --}
12565 BEGIN
12566 --{
12567     SAVEPOINT pack_inbound_lines_sp;
12568     --
12569     l_debug_on := wsh_debug_interface.g_debug;
12570     --
12571     IF l_debug_on IS NULL THEN
12572       l_debug_on := wsh_debug_sv.is_debug_enabled;
12573     END IF;
12574     --
12575     IF l_debug_on THEN
12576       wsh_debug_sv.push(l_module_name);
12577       --
12578       wsh_debug_sv.LOG(l_module_name, 'p_lpn_id', p_lpn_id);
12579       wsh_debug_sv.LOG(l_module_name, 'p_delivery_id', p_delivery_id);
12580       wsh_debug_sv.LOG(l_module_name, 'p_transactionTYpe', p_transactionTYpe);
12581     END IF;
12582     --
12583     x_return_status := wsh_util_core.g_ret_sts_success;
12584     --
12585     --
12586     IF p_delivery_id IS NULL
12587     THEN
12588     --{
12589         --
12590         -- p_delivery_id is mandatory
12591         --
12592         FND_MESSAGE.SET_NAME('WSH', 'WSH_REQUIRED_FIELD_NULL');
12593         FND_MESSAGE.SET_TOKEN('FIELD_NAME', 'p_delivery_id');
12594         WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12595         --
12596         RAISE FND_API.G_EXC_ERROR;
12597     --}
12598     END IF;
12599     --
12600     IF p_lines_tbl.count = 0
12601     THEN
12602     --{
12603         --
12604         -- p_lines_tbl should have at least one record
12605         --
12606         FND_MESSAGE.SET_NAME('WSH', 'WSH_EMPTY_TABLE_ERROR');
12607         FND_MESSAGE.SET_TOKEN('TABLE_NAME', 'p_lines_tbl');
12608         WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12609         --
12610         RAISE FND_API.G_EXC_ERROR;
12611     --}
12612     END IF;
12613     --
12614     --
12615     OPEN dlvy_csr(p_delivery_id);
12616     FETCH dlvy_csr INTO l_dlvy_rec;
12617     CLOSE dlvy_csr;
12618     --
12619     IF l_dlvy_rec.initial_pickup_location_id IS NULL
12620     THEN
12621     --{
12622         FND_MESSAGE.SET_NAME('WSH','WSH_DLVY_NOT_EXIST');
12623         FND_MESSAGE.SET_TOKEN('DELIVERY_ID', p_delivery_id);
12624         WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12625         --
12626         RAISE FND_API.G_EXC_ERROR;
12627     --}
12628     END IF;
12629     --
12630     --
12631     IF l_dlvy_rec.shipment_direction IN ('O','IO')
12632     THEN
12633     --{
12634         --
12635         -- Invalid operation for outbound delivery
12636         --
12637         FND_MESSAGE.SET_NAME('WSH','WSH_NOT_IB_DLVY_ERROR');
12638         FND_MESSAGE.SET_TOKEN('DELIVERY_NAME', l_dlvy_rec.name);
12639         WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12640         --
12641         RAISE FND_API.G_EXC_ERROR;
12642     --}
12643     END IF;
12644     --
12645     --
12646     --l_cont_name := SUBSTRB(p_lpn_id || '.' || l_dlvy_rec.name,1,30);
12647     l_cont_name := p_lpn_name;
12648     --
12649     -- commented out the following code because this is not applicable anymore
12650     -- as container name is not unique in WSH.  This check is not required.
12651     /*
12652     open  l_dup_del_csr(p_lpn_name);
12653     fetch l_dup_del_csr into l_dup_del_id,l_dup_del_name, l_dup_del_status, l_dup_cnt_id;
12654     close l_dup_del_csr;
12655 
12656     IF l_debug_on THEN
12657         WSH_DEBUG_SV.log(l_module_name,'l_dup_del_id', l_dup_del_id);
12658         WSH_DEBUG_SV.log(l_module_name,'l_dup_del_name', l_dup_del_name);
12659         WSH_DEBUG_SV.log(l_module_name,'l_dup_del_status', l_dup_del_status);
12660         WSH_DEBUG_SV.log(l_module_name,'l_dup_cnt_id', l_dup_cnt_id);
12661     END IF;
12662 
12663     IF(l_dup_del_id is not null AND nvl(l_dup_del_status,'OP') = 'CL') THEN
12664     --{
12665         update wsh_delivery_details
12666         set    container_name = SUBSTRB(p_lpn_name || '.' ||l_dup_del_name,1,50)
12667         where  delivery_detail_id = l_dup_cnt_id;
12668     --}
12669     ELSIF(l_dup_cnt_id IS NOT NULL) THEN
12670     --{
12671         l_cont_name := SUBSTRB(p_lpn_name || '.' || l_dlvy_rec.name,1,50);
12672     --}
12673     END IF;
12674     */
12675     --l_cont_name := SUBSTRB(p_lpn_name || '.' || l_dlvy_rec.name,1,50);
12676     --
12677     --
12678     IF l_debug_on THEN
12679         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Create_Cont_Instance_Multi',WSH_DEBUG_SV.C_PROC_LEVEL);
12680     END IF;
12681     --
12682     G_CALLED_FROM_INBOUND := TRUE;
12683     --
12684       --
12685       -- K LPN CONV. rv
12686       --
12687       WSH_CONTAINER_ACTIONS.Create_Cont_Instance_Multi(
12688         x_cont_name           => l_cont_name,
12689         p_cont_item_id        => NULL,
12690         x_cont_instance_id    => l_container_instance_id,
12691         p_par_detail_id       => NULL,
12692         p_organization_id     => l_dlvy_rec.organization_id,
12693         p_container_type_code => NULL,
12694         p_num_of_containers   => 1,
12695         x_row_id              => l_rowid,
12696         x_return_status       => l_return_status,
12697         x_cont_tab            => l_cont_tab,
12698         x_unit_weight         => l_lpn_unit_weight,
12699         x_unit_volume         => l_lpn_unit_volume,
12700         x_weight_uom_code     => l_lpn_weight_uom_code,
12701         x_volume_uom_code     => l_lpn_volume_uom_code,
12702         p_lpn_id              => p_lpn_id,
12703         p_ignore_for_planning => l_dlvy_rec.ignore_for_planning,
12704         p_caller              => 'WSH_IB_PACK');
12705       --
12706       IF l_debug_on THEN
12707           WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
12708           WSH_DEBUG_SV.log(l_module_name,'count of l_cont_tab',l_cont_tab.count);
12709       END IF;
12710       l_container_instance_id := l_cont_tab(1);
12711       -- K LPN CONV. rv
12712     --
12713     --
12714     G_CALLED_FROM_INBOUND := FALSE;
12715     --
12716     wsh_util_core.api_post_call
12717       (
12718         p_return_status => l_return_status,
12719         x_num_warnings  => l_num_warnings,
12720         x_num_errors    => l_num_errors
12721       );
12722     --
12723     --
12724     -- Update Container record with delivery grouping attributes
12725     --
12726     UPDATE WSH_DELIVERY_DETAILS
12727     SET    lpn_id                       = p_lpn_id,
12728            shipped_quantity             = DECODE(p_transactionType,'ASN',1,shipped_quantity),
12729            received_quantity            = DECODE(p_transactionType,'RECEIPT',1,received_quantity),
12730            released_status              = DECODE(p_transactionType,'ASN','C','RECEIPT','L','C'),
12731            src_requested_quantity       = requested_quantity,
12732            src_requested_quantity_uom   = 'Ea'  ,
12733            requested_quantity_uom       = 'Ea'  ,
12734            line_direction               = l_dlvy_rec.shipment_direction,
12735            ship_from_location_id        = l_dlvy_rec.initial_pickup_location_id,
12736            ship_to_location_id          = l_dlvy_rec.ultimate_dropoff_location_id,
12737            customer_id                  = l_dlvy_rec.customer_id,
12738            intmed_ship_to_location_id   = l_dlvy_rec.intmed_ship_to_location_id,
12739            fob_code                     = l_dlvy_rec.fob_code,
12740            freight_terms_code           = l_dlvy_rec.freight_terms_code,
12741            ship_method_code             = l_dlvy_rec.ship_method_code,
12742            shipping_control             = l_dlvy_rec.shipping_control,
12743            vendor_id                    = l_dlvy_rec.vendor_id,
12744            party_id                     = l_dlvy_rec.party_id,
12745            ignore_for_planning          = l_dlvy_rec.ignore_for_planning,
12746            tracking_number              = NVL(p_waybill_number,tracking_number),
12747            last_update_date             = SYSDATE,
12748            last_updated_by              = FND_GLOBAL.USER_ID,
12749            last_update_login            = FND_GLOBAL.LOGIN_ID
12750    WHERE   rowid                        = l_rowid;
12751    --
12752    -- l_container_instance_id is the delivery_detail_id, use for DBI call
12753    -- DBI Project
12754    -- Update of wsh_delivery_details where requested_quantity/released_status
12755    -- are changed, call DBI API after the update.
12756    -- This API will also check for DBI Installed or not
12757    IF l_debug_on THEN
12758      WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail id-',l_container_instance_id);
12759    END IF;
12760    l_detail_tab(1) := l_container_instance_id;
12761    WSH_INTEGRATION.DBI_Update_Detail_Log
12762      (p_delivery_detail_id_tab => l_detail_tab,
12763       p_dml_type               => 'UPDATE',
12764       x_return_status          => l_dbi_rs);
12765 
12766    IF l_debug_on THEN
12767      WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
12768    END IF;
12769 
12770    IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
12771      x_return_status := l_dbi_rs;
12772      -- just pass this return status to caller API
12773      IF l_debug_on THEN
12774        WSH_DEBUG_SV.pop(l_module_name,'DBI API Returned Unexpected error '||x_return_status);
12775        WSH_DEBUG_SV.pop(l_module_name);
12776      END IF;
12777      return;
12778    END IF;
12779    -- treat all other return status as Success
12780    -- End of Code for DBI Project
12781    --
12782    -- Assign container to delivery
12783    --
12784    UPDATE wsh_delivery_assignments_v
12785    SET      delivery_id        = p_delivery_id,
12786             last_update_date   = SYSDATE,
12787             last_updated_by    = FND_GLOBAL.USER_ID,
12788             last_update_login  = FND_GLOBAL.LOGIN_ID
12789    WHERE    delivery_detail_id = l_container_instance_id;
12790    --
12791    --
12792    -- Assign lines to container
12793    --
12794    FORALL i IN p_lines_tbl.FIRST..p_lines_tbl.LAST
12795    UPDATE wsh_delivery_assignments_v
12796    SET      parent_delivery_detail_id   = l_container_instance_id,
12797             last_update_date   = SYSDATE,
12798             last_updated_by    = FND_GLOBAL.USER_ID,
12799             last_update_login  = FND_GLOBAL.LOGIN_ID
12800    WHERE    delivery_detail_id = p_lines_tbl(i);
12801    --
12802    --
12803    l_cont_tbl(1) := l_container_instance_id;
12804    --
12805    --
12806     --
12807     IF l_debug_on THEN
12808         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit wsh_tp_release.calculate_cont_del_tpdates',WSH_DEBUG_SV.C_PROC_LEVEL);
12809     END IF;
12810     --
12811    --
12812    -- Calculate container dates
12813    --
12814    wsh_tp_release.calculate_cont_del_tpdates
12815     (
12816         p_entity        => 'LPN',
12817         p_entity_ids    => l_cont_tbl,
12818         x_return_status => l_return_status
12819     );
12820    --
12821    wsh_util_core.api_post_call
12822       (
12823         p_return_status => l_return_status,
12824         x_num_warnings  => l_num_warnings,
12825         x_num_errors    => l_num_errors
12826       );
12827     --
12828         IF nvl(p_caller, '!!!!') <> 'WSH_VENDOR_MERGE' THEN
12829         --{
12830 
12831             IF l_debug_on THEN
12832                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
12833             END IF;
12834             --
12835             --
12836             -- Calculate container weight and volume
12837             --
12838             WSH_TPA_CONTAINER_PKG.Container_Weight_Volume(
12839                  p_container_instance_id => l_container_instance_id,
12840                  p_override_flag         => 'Y',
12841                  p_calc_wv_if_frozen     => 'N',
12842                  x_gross_weight          => l_gross_weight,
12843                  x_net_weight            => l_net_weight,
12844                  x_volume                => l_volume ,
12845                  p_fill_pc_flag          => 'Y',
12846                  x_cont_fill_pc          => l_cont_fill_pc,
12847                  x_return_status         => l_return_status);
12848             --
12849             IF l_debug_on THEN
12850               WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
12851             END IF;
12852         --}
12853         END IF;
12854 
12855 			--
12856 			--
12857    IF l_num_errors > 0
12858    THEN
12859         x_return_status         := WSH_UTIL_CORE.G_RET_STS_ERROR;
12860    ELSIF l_num_warnings > 0
12861    THEN
12862         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12863    ELSE
12864         x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12865    END IF;
12866    --
12867    IF l_debug_on THEN
12868       wsh_debug_sv.pop(l_module_name);
12869    END IF;
12870     --
12871 --}
12872 EXCEPTION
12873 --{
12874       --
12875     WHEN FND_API.G_EXC_ERROR THEN
12876 
12877       G_CALLED_FROM_INBOUND := FALSE;
12878       ROLLBACK TO  pack_inbound_lines_sp;
12879       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12880       --
12881       IF l_debug_on THEN
12882         WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
12883         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
12884       END IF;
12885       --
12886     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
12887 
12888       G_CALLED_FROM_INBOUND := FALSE;
12889       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
12890       ROLLBACK TO  pack_inbound_lines_sp;
12891       --
12892       IF l_debug_on THEN
12893         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12894         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
12895       END IF;
12896       --
12897     WHEN WSH_UTIL_CORE.G_EXC_WARNING THEN
12898 
12899       G_CALLED_FROM_INBOUND := FALSE;
12900       x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12901       --
12902       IF l_debug_on THEN
12903         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_UTIL_CORE.G_EXC_WARNING exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
12904         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_UTIL_CORE.G_EXC_WARNING');
12905       END IF;
12906       --
12907     WHEN OTHERS THEN
12908 
12909         G_CALLED_FROM_INBOUND := FALSE;
12910         ROLLBACK TO  pack_inbound_lines_sp;
12911         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
12912         wsh_util_core.default_handler('wsh_container_actions.pack_inbound_lines', l_module_name);
12913         IF l_debug_on THEN
12914            WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12915         END IF;
12916         --
12917 --}
12918 END pack_inbound_lines;
12919 --
12920 --
12921 --
12922 --========================================================================
12923 -- PROCEDURE : unpack_inbound_delivery
12924 --
12925 -- PARAMETERS: p_delivery_id     Delivery ID for delivery, input lines belong to
12926 --             x_return_status   Return status of the API
12927 --
12928 --
12929 -- COMMENT   : This procedure is called only from the cancel ASN/Revert ASN events
12930 --             It performs the following steps:
12931 --             01. Validate that input delivery id is not null and is a valid delivery.
12932 --             02. If input delivery is outbound, return with error.
12933 --             03. Delete all containers within the delivery (WDD and WDA)
12934 --             04. Unassign all lines (within delivery) from container.
12935 --
12936 --========================================================================
12937 --
12938 --
12939 PROCEDURE unpack_inbound_delivery
12940             (
12941                p_delivery_id        IN          NUMBER,
12942                x_return_status      OUT NOCOPY  VARCHAR2
12943             )
12944 IS
12945 --{
12946     CURSOR dlvy_csr (p_delivery_id IN NUMBER)
12947     IS
12948         SELECT nvl(shipment_direction,'O') shipment_direction,
12949                initial_pickup_location_id,
12950                name
12951         FROM   wsh_new_deliveries wnd
12952         WHERE  delivery_id             = p_delivery_id;
12953     --
12954     l_dlvy_rec dlvy_csr%ROWTYPE;
12955     --
12956     --
12957     l_num_warnings                NUMBER := 0;
12958     l_num_errors                  NUMBER := 0;
12959     l_return_status               VARCHAR2(10);
12960     --
12961     l_lines_tbl                   WSH_UTIL_CORE.id_tab_type;
12962     --
12963     l_debug_on                    BOOLEAN;
12964     --
12965     l_module_name        CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'unpack_inbound_delivery';
12966     --
12967 --}
12968 BEGIN
12969 --{
12970     SAVEPOINT unpack_inbound_delivery_sp;
12971     --
12972     l_debug_on := wsh_debug_interface.g_debug;
12973     --
12974     IF l_debug_on IS NULL THEN
12975       l_debug_on := wsh_debug_sv.is_debug_enabled;
12976     END IF;
12977     --
12978     IF l_debug_on THEN
12979       wsh_debug_sv.push(l_module_name);
12980       --
12981       wsh_debug_sv.LOG(l_module_name, 'p_delivery_id', p_delivery_id);
12982     END IF;
12983     --
12984     x_return_status := wsh_util_core.g_ret_sts_success;
12985     --
12986     --
12987     IF p_delivery_id IS NULL
12988     THEN
12989     --{
12990         --
12991         -- p_delivery_id is mandatory
12992         --
12993         FND_MESSAGE.SET_NAME('WSH', 'WSH_REQUIRED_FIELD_NULL');
12994         FND_MESSAGE.SET_TOKEN('FIELD_NAME', 'p_delivery_id');
12995         WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12996         --
12997         RAISE FND_API.G_EXC_ERROR;
12998     --}
12999     END IF;
13000     --
13001     --
13002     OPEN dlvy_csr(p_delivery_id);
13003     FETCH dlvy_csr INTO l_dlvy_rec;
13004     CLOSE dlvy_csr;
13005     --
13006     IF l_dlvy_rec.initial_pickup_location_id IS NULL
13007     THEN
13008     --{
13009         FND_MESSAGE.SET_NAME('WSH','WSH_DLVY_NOT_EXIST');
13010         FND_MESSAGE.SET_TOKEN('DELIVERY_ID', p_delivery_id);
13011         WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
13012         --
13013         RAISE FND_API.G_EXC_ERROR;
13014     --}
13015     END IF;
13016     --
13017     --
13018     IF l_dlvy_rec.shipment_direction IN ('O','IO')
13019     THEN
13020     --{
13021         --
13022         -- Invalid operation for outbound delivery
13023         --
13024         FND_MESSAGE.SET_NAME('WSH','WSH_NOT_IB_DLVY_ERROR');
13025         FND_MESSAGE.SET_TOKEN('DELIVERY_NAME', l_dlvy_rec.name);
13026         WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
13027         --
13028         RAISE FND_API.G_EXC_ERROR;
13029     --}
13030     END IF;
13031     --
13032     --
13033     -- Delete all containers within the delivery
13034     --
13035     DELETE WSH_DELIVERY_DETAILS
13036     WHERE  DELIVERY_DETAIL_ID IN (
13037                                     SELECT wdd.delivery_detail_id
13038                                     FROM   wsh_delivery_details wdd,
13039                                            wsh_delivery_assignments_v wda
13040                                     WHERE  wda.delivery_id = p_delivery_id
13041                                     AND    wda.delivery_detail_id = wdd.delivery_detail_id
13042                                     AND    NVL(wdd.container_flag,'N') = 'Y'
13043                                  )
13044     RETURNING delivery_detail_id BULK COLLECT INTO l_lines_tbl;
13045     --
13046     --
13047     IF l_lines_tbl.COUNT > 0
13048     THEN
13049     --{
13050         FORALL i IN l_lines_tbl.FIRST..l_lines_tbl.LAST
13051         DELETE wsh_delivery_assignments_v
13052         WHERE  delivery_detail_id = l_lines_tbl(i);
13053     --}
13054     END IF;
13055     --
13056     --
13057     --
13058     -- Unassign all lines from containers.
13059     --
13060    UPDATE wsh_delivery_assignments_v
13061    SET      parent_delivery_detail_id = NULL,
13062             last_update_date   = SYSDATE,
13063             last_updated_by    = FND_GLOBAL.USER_ID,
13064             last_update_login  = FND_GLOBAL.LOGIN_ID
13065    WHERE    delivery_id        = p_delivery_id;
13066    --
13067    --
13068    IF l_num_errors > 0
13069    THEN
13070         x_return_status         := WSH_UTIL_CORE.G_RET_STS_ERROR;
13071    ELSIF l_num_warnings > 0
13072    THEN
13073         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
13074    ELSE
13075         x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13076    END IF;
13077    --
13078    IF l_debug_on THEN
13079       wsh_debug_sv.pop(l_module_name);
13080    END IF;
13081     --
13082 --}
13083 EXCEPTION
13084 --{
13085       --
13086     WHEN FND_API.G_EXC_ERROR THEN
13087 
13088       ROLLBACK TO  unpack_inbound_delivery_sp;
13089       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13090       --
13091       IF l_debug_on THEN
13092         WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13093         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
13094       END IF;
13095       --
13096     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
13097 
13098       ROLLBACK TO  unpack_inbound_delivery_sp;
13099       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
13100       --
13101       IF l_debug_on THEN
13102         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13103         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
13104       END IF;
13105       --
13106     WHEN WSH_UTIL_CORE.G_EXC_WARNING THEN
13107       x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
13108       --
13109       IF l_debug_on THEN
13110         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_UTIL_CORE.G_EXC_WARNING exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13111         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_UTIL_CORE.G_EXC_WARNING');
13112       END IF;
13113       --
13114     WHEN OTHERS THEN
13115 
13116         ROLLBACK TO  unpack_inbound_delivery_sp;
13117         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
13118         wsh_util_core.default_handler('wsh_container_actions.unpack_inbound_delivery', l_module_name);
13119         IF l_debug_on THEN
13120            WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13121         END IF;
13122         --
13123 --}
13124 END unpack_inbound_delivery;
13125 --
13126 --
13127 -- J-IB-NPARIKH-}
13128 /* This procedure is a temporarily procedure that will create
13129    container names and will be deleted once WMS provides the functionality.
13130    lpn conv
13131 */
13132 
13133 PROCEDURE Create_Multiple_Cont_name (
13134   p_cont_name IN VARCHAR2,
13135   p_cont_name_pre IN VARCHAR2,
13136   p_cont_name_suf IN VARCHAR2,
13137   p_cont_name_num IN NUMBER,
13138   p_cont_name_dig IN NUMBER,
13139   p_quantity IN NUMBER,
13140   x_cont_names OUT NOCOPY  WSH_GLBL_VAR_STRCT_GRP.v50_Tbl_Type,
13141   x_return_status OUT NOCOPY  VARCHAR2) IS
13142 
13143   CURSOR Get_Exist_Cont(v_cont_name VARCHAR2) IS
13144   SELECT NVL(MAX(1),0) FROM DUAL
13145   WHERE EXISTS ( SELECT 1 FROM WSH_DELIVERY_DETAILS
13146                  WHERE container_name = v_cont_name
13147                  AND container_flag = 'Y');
13148 
13149   l_cont_name VARCHAR2(30);
13150   l_cont_name_num NUMBER;
13151   l_cont_inst_id NUMBER;
13152   l_row_id VARCHAR2(30);
13153   l_cont_cnt NUMBER;
13154   l_all_null_flag VARCHAR2(1) := 'Y';
13155   l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13156 
13157 --
13158 l_debug_on BOOLEAN;
13159 --
13160 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CREATE_MULTIPLE_CONT_NAME';
13161 --
13162 BEGIN
13163 
13164   --
13165   --
13166   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13167   --
13168   IF l_debug_on IS NULL
13169   THEN
13170       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13171   END IF;
13172   --
13173   IF l_debug_on THEN
13174       WSH_DEBUG_SV.push(l_module_name);
13175       --
13176       WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME',P_CONT_NAME);
13177       WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_PRE',P_CONT_NAME_PRE);
13178       WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_SUF',P_CONT_NAME_SUF);
13179       WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_NUM',P_CONT_NAME_NUM);
13180       WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_DIG',P_CONT_NAME_DIG);
13181       WSH_DEBUG_SV.log(l_module_name,'P_QUANTITY',P_QUANTITY);
13182   END IF;
13183   --
13184   IF ( NVL(p_quantity,0) <=  0 )  THEN
13185 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
13186 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13187 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
13188 	--
13189 	IF l_debug_on THEN
13190 	    WSH_DEBUG_SV.pop(l_module_name);
13191 	END IF;
13192 	--
13193 	return;
13194   END IF;
13195 
13196   IF p_cont_name_pre IS NULL AND p_cont_name_num IS NULL AND p_cont_name_dig IS NULL AND p_cont_name_suf IS NULL THEN
13197 	l_all_null_flag := 'Y';
13198   ELSE
13199 	l_all_null_flag := 'N';
13200   END IF;
13201 
13202   l_cont_name_num := NVL(p_cont_name_num,0);
13203   FOR i IN 1..p_quantity LOOP
13204      IF p_quantity = 1 AND p_cont_name IS NOT NULL THEN
13205         l_cont_name := p_cont_name;
13206      ELSIF l_all_null_flag = 'Y' THEN
13207         l_cont_name := NULL;
13208      ELSE
13209         -- if p..dig is null don't do padding
13210 	   IF (p_cont_name_dig IS NOT NULL) THEN
13211   	      l_cont_name := p_cont_name_pre || LPAD(to_char(l_cont_name_num),p_cont_name_dig,'0') || p_cont_name_suf;
13212 	   ELSE
13213   	      l_cont_name := p_cont_name_pre || to_char(l_cont_name_num)|| p_cont_name_suf;
13214         END IF;
13215      END IF;
13216 	l_cont_name_num := l_cont_name_num + 1;
13217 
13218 	OPEN Get_Exist_Cont(l_cont_name);
13219      FETCH Get_Exist_Cont INTO l_cont_cnt;
13220      CLOSE Get_Exist_Cont;
13221 
13222 	IF l_cont_cnt = 0 THEN
13223 		--
13224                 x_cont_names(x_cont_names.count+1) := l_cont_name;
13225 	ELSE
13226 		l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13227   		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NAME_DUPLICATE');
13228 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
13229 		WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
13230 	END IF;
13231   END LOOP;
13232 
13233   IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
13234 	x_return_status := l_return_status;
13235 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
13236 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
13237 	--
13238 	IF l_debug_on THEN
13239 	    WSH_DEBUG_SV.pop(l_module_name);
13240 	END IF;
13241 	--
13242 	return;
13243   END IF;
13244 
13245   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13246 
13247 --
13248 IF l_debug_on THEN
13249     WSH_DEBUG_SV.pop(l_module_name);
13250 END IF;
13251 --
13252 EXCEPTION
13253 
13254   WHEN Others THEN
13255 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Create_Multiple_Cont_names',l_module_name);
13256 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13257 
13258 
13259          IF l_debug_on THEN
13260 	    WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13261 	    WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13262 	END IF;
13263         --
13264 END Create_Multiple_Cont_name;
13265 
13266 
13267 /* ----------------------------------------------------------------------
13268 
13269 PROCEDURE Update_child_inv_info
13270    This procedure updates all the containers included in p_container_id
13271    with p_locator_id and p_subinventory (downward in hirearchy)
13272 
13273 Prameters
13274    p_container_id
13275    p_locator_id
13276    p_subinventory
13277    x_return_status
13278 
13279 ------------------------------------------------------------------------*/
13280 
13281 --lpn conv
13282 PROCEDURE Update_child_inv_info(p_container_id  IN NUMBER,
13283                         P_locator_id IN NUMBER,
13284                         P_subinventory IN VARCHAR2,
13285                         X_return_status OUT NOCOPY VARCHAR2)
13286 IS
13287 
13288 
13289    --
13290    l_debug_on BOOLEAN;
13291    --
13292    l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_CHILD_INV_INFO';
13293    --
13294    l_container_id      NUMBER;
13295 
13296    child_cont_locked     EXCEPTION;
13297    PRAGMA EXCEPTION_INIT(child_cont_locked, -00054);
13298 
13299    CURSOR lock_containers(v_container_id NUMBER) IS
13300    SELECT delivery_detail_id
13301    FROM wsh_delivery_details
13302    --WHERE container_flag = 'Y'
13303    WHERE delivery_detail_id IN
13304    (SELECT delivery_detail_id
13305     FROM wsh_delivery_assignments
13306     START WITH parent_delivery_detail_id = v_container_id
13307    CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id
13308    )
13309    FOR UPDATE NOWAIT;
13310 
13311 BEGIN
13312 
13313   --
13314   --
13315   SAVEPOINT s_Update_child_inv_info;
13316   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13317   --
13318   IF l_debug_on IS NULL
13319   THEN
13320       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13321   END IF;
13322   --
13323   IF l_debug_on THEN
13324       WSH_DEBUG_SV.push(l_module_name);
13325       --
13326       WSH_DEBUG_SV.log(l_module_name,'p_container_id',p_container_id);
13327       WSH_DEBUG_SV.log(l_module_name,'P_locator_id',P_locator_id);
13328       WSH_DEBUG_SV.log(l_module_name,'P_subinventory',P_subinventory);
13329   END IF;
13330   --
13331 
13332 
13333   OPEN lock_containers(p_container_id);
13334   LOOP --{
13335      FETCH lock_containers INTO l_container_id;
13336      EXIT WHEN lock_containers%NOTFOUND;
13337 
13338      UPDATE wsh_delivery_details
13339      SET locator_id = p_locator_id,
13340          subinventory = p_subinventory
13341      WHERE delivery_detail_id = l_container_id;
13342 
13343   END LOOP ; --}
13344 
13345   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13346 
13347   --
13348   IF l_debug_on THEN
13349       WSH_DEBUG_SV.pop(l_module_name);
13350   END IF;
13351   --
13352 EXCEPTION
13353 
13354   WHEN  child_cont_locked THEN
13355       rollback to s_Update_child_inv_info;
13356       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13357       --
13358       IF l_debug_on THEN
13359         WSH_DEBUG_SV.logmsg(l_module_name,'Could not lock record for the containers ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13360         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:child_cont_locked');
13361       END IF;
13362       --
13363   WHEN Others THEN
13364       rollback to s_Update_child_inv_info;
13365 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_child_inv_info',l_module_name);
13366 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13367 
13368 
13369          IF l_debug_on THEN
13370 	    WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13371 	    WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13372 	END IF;
13373         --
13374 END Update_child_inv_info;
13375 
13376 -----------------------------------------------------------------------------------------------------------------------
13377 --
13378 -- Name:
13379 -- Assign_Container_to_Consol
13380 --
13381 -- Purpose:
13382 -- This API will assign a content LPN to a consol LPN.
13383 -- If the parent LPN is not a consol LPN, we will convert it
13384 -- to a consol LPN and create the corresponding consol deliveries
13385 -- and trips.
13386 --
13387 -- Parameters:
13388 -- p_child_container_id: LPN that needs to be assigned.
13389 -- p_parent_container_id: LPN that will be assigned to
13390 -- p_caller: Calling entity/action
13391 -- x_return_status: status
13392 
13393 PROCEDURE Assign_Container_to_Consol(
13394              p_child_container_id   IN NUMBER,
13395              p_parent_container_id  IN NUMBER,
13396              p_caller               IN VARCHAR2,
13397              x_return_status        OUT NOCOPY VARCHAR2) IS
13398 
13399 cursor c_get_container_info(p_delivery_detail_id in number) is
13400 select d.container_flag, a.delivery_id, a.parent_delivery_id, d.inventory_item_id, d.organization_id
13401 from wsh_delivery_details d, wsh_delivery_assignments a
13402 where d.delivery_detail_id = p_delivery_detail_id
13403 and d.container_flag in ('Y', 'C')
13404 and a.type in ('C', 'S')
13405 and a.delivery_detail_id = d.delivery_detail_id
13406 and a.parent_delivery_detail_id is null
13407 and a.delivery_id is not null;
13408 
13409 
13410 
13411 l_parent_container_info c_get_container_info%rowtype;
13412 l_child_container_info c_get_container_info%rowtype;
13413 l_new_parent_delivery_id NUMBER := NULL;
13414 l_del_tab wsh_util_core.id_tab_type;
13415 
13416 
13417 -- This cursor accepts a given delivery, p_del_id,
13418 -- and looks for consol deliveries that share the
13419 -- same trip as this delivery from the initial pickup location.
13420 
13421 cursor c_get_trip_info(p_del_id in number) is
13422 select s.trip_id, d2.delivery_id
13423 from  wsh_delivery_legs l1, wsh_delivery_legs l2,
13424       wsh_new_deliveries d1, wsh_new_deliveries d2,
13425       wsh_trip_stops s
13426 where l1.delivery_id = p_del_id
13427 and l1.delivery_id = d1.delivery_id   -- bug 4891897
13428 and s.stop_id = l1.pick_up_stop_id
13429 and s.stop_location_id = d1.initial_pickup_location_id
13430 and l1.pick_up_stop_id = l2.pick_up_stop_id
13431 and l2.delivery_id = d2.delivery_id
13432 and d2.delivery_type = 'CONSOLIDATION';
13433 
13434 cursor c_get_child_details(p_parent_detail_id in number) IS
13435 SELECT delivery_detail_id
13436 FROM wsh_delivery_assignments_v
13437 WHERE parent_delivery_detail_id = p_parent_detail_id;
13438 
13439 /*CURSOR Get_Cont_Item_Info (v_cont_item_id NUMBER, v_org_id NUMBER) IS
13440   SELECT  Container_Type_Code, weight_uom_code, volume_uom_code,
13441   minimum_fill_percent, maximum_load_weight, internal_volume, primary_uom_code,
13442   unit_weight, unit_volume
13443   FROM MTL_SYSTEM_ITEMS
13444   WHERE inventory_item_id = v_cont_item_id
13445   AND container_item_flag = 'Y'
13446   AND organization_id = v_org_id
13447   AND    nvl(vehicle_item_flag,'N') = 'N'
13448   AND    shippable_item_flag = 'Y';
13449 
13450 */
13451 
13452 CURSOR c_get_trip_id(p_delivery_id in number) IS
13453 SELECT trip_id
13454 FROM wsh_trip_stops s, wsh_delivery_legs l
13455 WHERE s.stop_id = l.pick_up_stop_id
13456 AND l.delivery_id = p_delivery_id;
13457 
13458 l_assign_flag VARCHAR2(1);
13459 l_del_info_tab WSH_NEW_DELIVERIES_PVT.Delivery_Attr_Tbl_Type;
13460 l_parent_del_info_rec WSH_NEW_DELIVERIES_PVT.Delivery_Rec_Type;
13461 l_del_asg_info_rec WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_TYPE;
13462 l_child_details_tab wsh_util_core.id_tab_type;
13463 l_dummy_asg_tab wsh_util_core.id_tab_type;
13464 l_wv_delivery_tab wsh_util_core.id_tab_type;
13465 l_child_delivery_id NUMBER;
13466 l_trip_id NUMBER;
13467 l_parent_trip_id NUMBER;
13468 l_parent_consol_del_id NUMBER;
13469 l_child_trip_id NUMBER;
13470 l_child_consol_del_id NUMBER;
13471 l_unassign_dels wsh_util_core.id_tab_type;
13472 l_trip_id_tab wsh_util_core.id_tab_type;
13473 
13474 l_cont_gross_weight NUMBER;
13475 l_cont_net_weight NUMBER;
13476 l_cont_volume NUMBER;
13477 l_cont_fill_pc NUMBER;
13478 
13479 l_gross_wt NUMBER;
13480 l_net_wt NUMBER;
13481 l_volume NUMBER;
13482 
13483 l_num_warnings              NUMBER  := 0;
13484 l_num_errors                NUMBER  := 0;
13485 l_return_status             VARCHAR2(30);
13486 
13487 CURSOR c_get_filled_vol(p_container_id NUMBER) IS
13488 SELECT filled_volume
13489 FROM WSH_DELIVERY_DETAILS
13490 WHERE delivery_detail_id = p_container_id;
13491 
13492 l_filled_volume  NUMBER;
13493 
13494 
13495 WSH_INVALID_CHILD EXCEPTION;
13496 WSH_INVALID_PARENT EXCEPTION;
13497 WSH_INVALID_CONSOL_ASSIGN EXCEPTION;
13498 WSH_ASSIGN_CONSOL_LPN_ERROR EXCEPTION;
13499 WSH_CONSOL_DEL_NO_MATCH EXCEPTION;
13500 WSH_NO_CHILD_LPNS EXCEPTION;
13501 WSH_INVALID_TRIPS EXCEPTION;
13502 
13503 l_debug_on                    BOOLEAN;
13504 l_module_name        CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'Assign_Container_to_Consol';
13505 
13506 BEGIN
13507 
13508    l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13509    --
13510    IF l_debug_on IS NULL
13511    THEN
13512       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13513    END IF;
13514    --
13515    IF l_debug_on THEN
13516       WSH_DEBUG_SV.push(l_module_name);
13517       --
13518       WSH_DEBUG_SV.log(l_module_name,'p_caller',p_caller);
13519       WSH_DEBUG_SV.log(l_module_name,'p_child_container_id',p_child_container_id);
13520       WSH_DEBUG_SV.log(l_module_name,'p_parent_container_id',p_parent_container_id);
13521    END IF;
13522     -- Check if the parent lpn is a consol LPN
13523 
13524     OPEN c_get_container_info(p_parent_container_id);
13525     FETCH c_get_container_info INTO l_parent_container_info;
13526     IF c_get_container_info%NOTFOUND THEN
13527        CLOSE c_get_container_info;
13528        RAISE WSH_INVALID_PARENT;
13529 
13530     END IF;
13531     CLOSE c_get_container_info;
13532 
13533     -- validate child LPN
13534 
13535     OPEN c_get_container_info(p_child_container_id);
13536     FETCH c_get_container_info INTO l_child_container_info;
13537     IF c_get_container_info%NOTFOUND OR l_child_container_info.container_flag = 'C' THEN
13538        CLOSE c_get_container_info;
13539        RAISE WSH_INVALID_CHILD;
13540     END IF;
13541     CLOSE c_get_container_info;
13542 
13543     IF l_child_container_info.delivery_id = l_parent_container_info.delivery_id THEN
13544 
13545        -- Don't use this API!!!, use API's to pack into content LPNs.
13546        RAISE WSH_INVALID_CONSOL_ASSIGN;
13547 
13548 
13549     END IF;
13550 
13551     IF l_debug_on THEN
13552       WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13553       WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13554       WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.container_flag',l_parent_container_info.container_flag);
13555     END IF;
13556     IF l_parent_container_info.container_flag = 'Y' THEN
13557 
13558     -- This is not a consol LPN, so we need to convert this to a consol before assignment.
13559     -- We consider the following cases:
13560     -- case 1. Neither the parent LPN nor the child LPN is attached to a consol delivery.
13561     --         We need to create a consolidation delivery for both.
13562     -- case 2. The parent LPN, even though not a consol LPN, is attached to
13563     --         a consol delivery, but the child is not.
13564     --         We need to assign the child container's delivery to the parent container's
13565     --         consol delivery.
13566     -- case 3. The child LPN is attached to a consol delivery, but the parent is not.
13567     --         We need to assign the parent container's delivery to the child
13568     --         container's consol delivery.
13569     -- case 4. Both the child and the parent containers have consolidation deliveries,
13570     --         but they do not match.
13571     --         Raise an exception since this is not a valid assignment.
13572     -- case 5. Both the child and the parent container have the same consol delivery.
13573     --         We do not need to do anything (this case is ignored) apart from converting the LPN.
13574 
13575 
13576 
13577        IF l_parent_container_info.parent_delivery_id IS NULL
13578        AND l_child_container_info.parent_delivery_id IS NULL THEN
13579 
13580        -- case 1. Neither the parent LPN nor the child LPN are attached to any consol deliveries.
13581        --         Check if the deliveries are assigned to trips. If they are assigned to
13582        --         the same trip, or if only one of the deliveries has a trip. Check if
13583        --         this trip has a consol delivery. If yes, we can use this consol delivery, else
13584        --         We need to create a consolidation delivery for both.
13585            IF l_debug_on THEN
13586              WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13587              WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13588            END IF;
13589 
13590            -- Check if the trips have consolidation deliveries.
13591            -- Check trip for the parent lpn.
13592            OPEN c_get_trip_info(l_parent_container_info.delivery_id);
13593            FETCH c_get_trip_info INTO l_parent_trip_id, l_parent_consol_del_id;
13594            CLOSE c_get_trip_info;
13595 
13596 
13597            -- Check trip for the child lpn.
13598            OPEN c_get_trip_info(l_child_container_info.delivery_id);
13599            FETCH c_get_trip_info INTO l_child_trip_id, l_child_consol_del_id;
13600            CLOSE c_get_trip_info;
13601 
13602            IF (l_child_trip_id <> l_parent_trip_id) THEN
13603 
13604               RAISE WSH_INVALID_TRIPS;
13605 
13606            END IF;
13607 
13608            IF (l_child_trip_id IS NOT NULL) OR (l_parent_trip_id IS NOT NULL) THEN
13609 
13610                -- Unassign the deliveries from the trip.
13611 
13612                IF l_child_trip_id IS NOT NULL THEN
13613 
13614                   l_unassign_dels(1) := l_child_container_info.delivery_id;
13615 
13616                END IF;
13617                IF l_parent_trip_id IS NOT NULL THEN
13618 
13619                   l_unassign_dels(l_unassign_dels.count + 1) := l_parent_container_info.delivery_id;
13620 
13621                END IF;
13622 
13623                l_child_trip_id := NVL(l_child_trip_id, l_parent_trip_id);
13624 
13625 
13626               IF l_debug_on THEN
13627                  WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TRIPS_ACTIONS.Unassign_Trip',WSH_DEBUG_SV.C_PROC_LEVEL);
13628               END IF;
13629 
13630               WSH_TRIPS_ACTIONS.Unassign_Trip(p_del_rows => l_unassign_dels,
13631                             p_trip_id  => l_child_trip_id,
13632                             x_return_status => l_return_status);
13633 
13634               wsh_util_core.api_post_call
13635                       (
13636                         p_return_status => l_return_status,
13637                         x_num_warnings  => l_num_warnings,
13638                         x_num_errors    => l_num_errors
13639                       );
13640 
13641               l_assign_flag := 'Y';
13642               l_new_parent_delivery_id := NVL(l_parent_consol_del_id, l_child_consol_del_id);
13643               l_del_tab(1) := l_parent_container_info.delivery_id;
13644               l_del_tab(2) := l_child_container_info.delivery_id;
13645            END IF;
13646            IF l_new_parent_delivery_id IS NULL THEN
13647            -- Create a new consolidation delivery.
13648               IF l_debug_on THEN
13649                 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13650                 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13651               END IF;
13652 
13653               FOR i in 1..2 LOOP
13654 
13655                  IF i = 1 THEN
13656                     l_child_delivery_id :=  l_parent_container_info.delivery_id;
13657                  ELSE
13658                     l_child_delivery_id := l_child_container_info.delivery_id;
13659                  END IF;
13660 
13661                  IF l_debug_on THEN
13662                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.Populate_Record',WSH_DEBUG_SV.C_PROC_LEVEL);
13663                  END IF;
13664                  WSH_NEW_DELIVERIES_PVT.Populate_Record(
13665                               p_delivery_id => l_child_delivery_id,
13666                               x_delivery_info => l_del_info_tab(i),
13667                               x_return_status => l_return_status);
13668 
13669                  wsh_util_core.api_post_call
13670                       (
13671                         p_return_status => l_return_status,
13672                         x_num_warnings  => l_num_warnings,
13673                         x_num_errors    => l_num_errors
13674                       );
13675                  -- Handle return status
13676 
13677               END LOOP;
13678 
13679 
13680               IF l_debug_on THEN
13681                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_Delivery_Autocreate.Autocreate_Consol_Delivery',WSH_DEBUG_SV.C_PROC_LEVEL);
13682               END IF;
13683               WSH_Delivery_Autocreate.Autocreate_Consol_Delivery(
13684                            p_del_attributes_tab => l_del_info_tab,
13685                            p_caller => p_caller,
13686                            x_parent_del_id => l_new_parent_delivery_id,
13687                            x_parent_trip_id => l_trip_id,
13688                            x_return_status => l_return_status);
13689 
13690               wsh_util_core.api_post_call
13691                       (
13692                         p_return_status => l_return_status,
13693                         x_num_warnings  => l_num_warnings,
13694                         x_num_errors    => l_num_errors
13695                       );
13696            END IF;
13697 
13698        ELSIF  (l_parent_container_info.parent_delivery_id <> l_child_container_info.parent_delivery_id) OR
13699               (l_parent_container_info.parent_delivery_id IS NULL) OR
13700               (l_child_container_info.parent_delivery_id IS NULL) THEN
13701           IF l_debug_on THEN
13702              WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13703              WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13704           END IF;
13705 
13706           IF l_parent_container_info.parent_delivery_id IS NOT NULL
13707           AND  l_child_container_info.parent_delivery_id IS NULL THEN
13708           -- case 2. The parent LPN, even though not a consol LPN, is attached to
13709           --         a consol delivery, but the child is not.
13710           --         We need to assign the child containers delivery to the parent containers
13711           --         consol delivery.
13712              IF l_debug_on THEN
13713                 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13714                 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13715              END IF;
13716 
13717              l_assign_flag := 'Y';
13718              l_new_parent_delivery_id := l_parent_container_info.parent_delivery_id;
13719              l_del_tab(1) := l_child_container_info.delivery_id;
13720 
13721 
13722           ELSIF l_parent_container_info.parent_delivery_id IS NULL
13723           AND  l_child_container_info.parent_delivery_id IS NOT NULL THEN
13724           -- case 3. The child LPN is attached to a consol delivery, but the parent is not.
13725           --         We need to assign the parent container's delivery to the child
13726           --         containers consol delivery.
13727              IF l_debug_on THEN
13728                 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13729                 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13730              END IF;
13731 
13732 		     l_assign_flag := 'Y';
13733 		     l_new_parent_delivery_id := l_child_container_info.parent_delivery_id;
13734 		     l_del_tab(1) := l_parent_container_info.delivery_id;
13735 
13736 
13737 	  ELSIF l_parent_container_info.parent_delivery_id <> l_child_container_info.parent_delivery_id THEN
13738 	  -- case 4. Both the child and the parent containers have consolidation deliveries
13739 	  --         but they do not match.
13740 	  --         Raise an exception since this is not a valid assignment.
13741 
13742 	     IF l_debug_on THEN
13743 		WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13744 		WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13745 	     END IF;
13746 	     RAISE WSH_CONSOL_DEL_NO_MATCH;
13747 
13748 	  END IF;
13749        ELSIF l_child_container_info.parent_delivery_id = l_parent_container_info.parent_delivery_id THEN
13750           IF l_debug_on THEN
13751              WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13752              WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13753           END IF;
13754 
13755           l_new_parent_delivery_id := l_parent_container_info.parent_delivery_id;
13756 
13757        END IF;
13758 
13759        -- Convert the parent LPN to be a consol LPN.
13760 
13761        -- Get the attributes of the parent delivery
13762        IF l_debug_on THEN
13763 	 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.Populate_Record',WSH_DEBUG_SV.C_PROC_LEVEL);
13764        END IF;
13765 
13766        WSH_NEW_DELIVERIES_PVT.Populate_Record(
13767 			      p_delivery_id => l_new_parent_delivery_id,
13768 			      x_delivery_info => l_parent_del_info_rec,
13769 			      x_return_status => l_return_status);
13770 
13771        wsh_util_core.api_post_call
13772 		      (
13773 			p_return_status => l_return_status,
13774 			x_num_warnings  => l_num_warnings,
13775 			x_num_errors    => l_num_errors
13776 		      );
13777        -- update the LPN with the parents' attributes and set the container_flag to 'C'
13778 
13779        -- Lock the delivery details and assignments.
13780 
13781        BEGIN
13782 	  wsh_delivery_details_pkg.lock_detail_no_compare(p_delivery_detail_id => p_parent_container_id);
13783 	  wsh_delivery_details_pkg.lock_wda_no_compare(p_delivery_detail_id => p_parent_container_id);
13784 	  wsh_delivery_details_pkg.lock_wda_no_compare(p_delivery_detail_id => p_child_container_id);
13785        EXCEPTION
13786 	  WHEN OTHERS THEN
13787 	    x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13788 	    FND_MESSAGE.SET_NAME('WSH','WSH_NO_LOCK');
13789 	    WSH_UTIL_CORE.Add_Message(x_return_status);
13790 	    --
13791 	    -- Debug Statements
13792 	    --
13793 	    IF l_debug_on THEN
13794 	       WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_LOCK exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13795 	       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_LOCK');
13796 	    END IF;
13797 	    RETURN;
13798 	   --
13799        END;
13800 
13801 
13802        update wsh_delivery_details
13803        set container_flag = 'C',
13804 	   ship_to_location_id = l_parent_del_info_rec.ultimate_dropoff_location_id,
13805 	   intmed_ship_to_location_id = l_parent_del_info_rec.intmed_ship_to_location_id,
13806 	   customer_id = l_parent_del_info_rec.customer_id,
13807 	   fob_code = l_parent_del_info_rec.fob_code,
13808 	   freight_terms_code = l_parent_del_info_rec.freight_terms_code,
13809 	   ship_method_code = l_parent_del_info_rec.ship_method_code,
13810 	   carrier_id = l_parent_del_info_rec.carrier_id,
13811 	   mode_of_transport = l_parent_del_info_rec.mode_of_transport,
13812 	   service_level = l_parent_del_info_rec.service_level,
13813 	   deliver_to_location_id = l_parent_del_info_rec.ultimate_dropoff_location_id,
13814 	   line_direction = 'O'
13815        where delivery_detail_id = p_parent_container_id;
13816 
13817 
13818        -- Perform wda conversion.
13819        -- wda picture before conversion
13820 
13821        -----------------------------------------------------------------------
13822        -- | del asg id| del det id| parent det id| del id| parent del id| type
13823        -----------------------------------------------------------------------
13824        -- | 1         | dd1       | lpn1         | d1    | NULL         | S
13825        -----------------------------------------------------------------------
13826        -- | 2         | lpn1      | NULL         | d1    | NULL         | S
13827        -----------------------------------------------------------------------
13828 
13829        -- wda picture after conversion
13830 
13831        -----------------------------------------------------------------------
13832        -- | del asg id| del det id| parent det id| del id| parent del id| type
13833        -----------------------------------------------------------------------
13834        -- | 1         | dd1       | NULL         | d1    | NULL         | O
13835        -----------------------------------------------------------------------
13836        -- | 2         | lpn1      | NULL         | pd1   | NULL         | S
13837        -----------------------------------------------------------------------
13838        -- | 3         | dd1       | lpn1         | d1    | pd1          | C
13839        -----------------------------------------------------------------------
13840 
13841        -- Here we are only converting the parent LPN into a consol LPN, we are not
13842        -- assigning any new children to the parent yet.
13843 
13844        -- Parent container has a consolidation record. Since the parent
13845        -- is now a consol LPN, the consolidation record should be on the
13846        -- topmost children currently assigned to the parent, so we need
13847        -- to delete the parent's consolidation record.
13848 
13849        delete from wsh_delivery_assignments
13850        where delivery_detail_id = p_parent_container_id
13851        and type = 'C';
13852 
13853 
13854        -- Get the current topmost children of the parent LPN.
13855        IF l_debug_on THEN
13856 	  WSH_DEBUG_SV.log(l_module_name,'p_parent_container_id',p_parent_container_id);
13857        END IF;
13858 
13859        OPEN c_get_child_details(p_parent_container_id);
13860        FETCH c_get_child_details BULK COLLECT
13861        INTO l_child_details_tab;
13862        IF l_debug_on THEN
13863 	  WSH_DEBUG_SV.log(l_module_name,'l_child_details_tab.count',l_child_details_tab.count);
13864        END IF;
13865        CLOSE c_get_child_details;
13866 
13867        -- lock the children.
13868 
13869        BEGIN
13870 	  FOR i in 1..l_child_details_tab.count LOOP
13871 	      wsh_delivery_details_pkg.lock_wda_no_compare(p_delivery_detail_id => l_child_details_tab(i));
13872 	  END LOOP;
13873 
13874        EXCEPTION
13875 	  WHEN OTHERS THEN
13876 	    x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13877 	    FND_MESSAGE.SET_NAME('WSH','WSH_NO_LOCK');
13878 	    WSH_UTIL_CORE.Add_Message(x_return_status);
13879 	    --
13880 	    -- Debug Statements
13881 	    --
13882 	    IF l_debug_on THEN
13883 	       WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_LOCK exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13884 	       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_LOCK');
13885 	    END IF;
13886 	    RETURN;
13887 	   --
13888        END;
13889 
13890        -- Step 1.
13891        -- Update the outer assignment to be 'O', and null out
13892        -- its parent delivery detail id which is now a consolidation LPN.
13893 
13894        FORALL i in 1..l_child_details_tab.count
13895        update wsh_delivery_assignments
13896        set parent_delivery_detail_id = NULL,
13897        type = 'O'
13898        where delivery_detail_id = l_child_details_tab(i)
13899        and NVL(type, 'S') = 'S';
13900 
13901 
13902 
13903        -- Step 2.
13904        -- Now update the consol LPN's delivery assignment to be the consol delivery,
13905        -- and set its parent delivery id to be NULL.
13906 
13907        update wsh_delivery_assignments
13908        set delivery_id = l_new_parent_delivery_id,
13909 	   parent_delivery_id = NULL,
13910 	   type = 'S'
13911        where delivery_detail_id = p_parent_container_id;
13912 
13913        -- Step 3.
13914        -- Create new delivery assignments with type 'C' for all the topmost
13915        -- children of the parent.
13916 
13917        l_del_asg_info_rec.parent_delivery_detail_id := p_parent_container_id;
13918        l_del_asg_info_rec.delivery_id := l_parent_container_info.delivery_id;
13919        l_del_asg_info_rec.parent_delivery_id := l_new_parent_delivery_id;
13920        l_del_asg_info_rec.type := 'C';
13921 
13922        IF l_debug_on THEN
13923          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_Delivery_Details_PKG.Create_Deliv_Assignment_bulk',WSH_DEBUG_SV.C_PROC_LEVEL);
13924        END IF;
13925        WSH_Delivery_Details_PKG.Create_Deliv_Assignment_bulk(
13926                      p_delivery_assignments_info => l_del_asg_info_rec,
13927                      p_num_of_rec => l_child_details_tab.count,
13928                      p_dd_id_tab => l_child_details_tab,
13929                      x_da_id_tab => l_dummy_asg_tab,
13930                      x_return_status => l_return_status);
13931 
13932        wsh_util_core.api_post_call
13933                       (
13934                         p_return_status => l_return_status,
13935                         x_num_warnings  => l_num_warnings,
13936                         x_num_errors    => l_num_errors
13937                       );
13938        -- Handle return status
13939 
13940     ELSE -- if l_parent_container_info.container_flag = 'C'
13941 
13942     -- The parent is already a consol LPN.
13943     -- this implies that the delivery id of the parent in wda
13944     -- is the consol delivery.
13945 
13946        IF l_child_container_info.parent_delivery_id IS NULL THEN
13947 
13948          -- Assign child delivery to parent's delivery.
13949          -- this will validate the constraints and the deconsol point.
13950 
13951          l_assign_flag := 'Y';
13952          l_del_tab(1) := l_child_container_info.delivery_id;
13953          l_new_parent_delivery_id := l_parent_container_info.delivery_id;
13954 
13955 
13956        ELSIF l_child_container_info.parent_delivery_id <> l_parent_container_info.delivery_id THEN
13957 
13958           -- Error! The child's parent delivery has to be the same as the consol delivery of the parent.
13959 
13960           -- RAISE EXCEPTION;
13961           RAISE WSH_CONSOL_DEL_NO_MATCH;
13962        ELSE
13963 
13964          l_new_parent_delivery_id := l_parent_container_info.delivery_id;
13965 
13966        END IF;
13967 
13968     END IF; -- if l_parent_container_info.container_flag = 'Y'
13969 
13970     -- We now need to make the assignment of deliveries to consol deliveries where
13971     -- one delivery had a consol delivery and the other did not.
13972 
13973     IF l_assign_flag = 'Y' THEN
13974 
13975        -- Assign the unassigned delivery to the consol delivery.
13976        -- This will also validate constraints/deconsol point.
13977 
13978 
13979         FOR i in 1..l_del_tab.count LOOP
13980 
13981             IF l_debug_on THEN
13982                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.Populate_Record',WSH_DEBUG_SV.C_PROC_LEVEL);
13983             END IF;
13984             WSH_NEW_DELIVERIES_PVT.Populate_Record(
13985                               p_delivery_id => l_del_tab(i),
13986                               x_delivery_info => l_del_info_tab(i),
13987                               x_return_status => l_return_status);
13988 
13989             wsh_util_core.api_post_call
13990                       (
13991                         p_return_status => l_return_status,
13992                         x_num_warnings  => l_num_warnings,
13993                         x_num_errors    => l_num_errors
13994                       );
13995                  -- Handle return status
13996 
13997        END LOOP;
13998 
13999 
14000 
14001 
14002        IF l_debug_on THEN
14003          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_New_Delivery_Actions.Assign_Del_to_Consol_Del',WSH_DEBUG_SV.C_PROC_LEVEL);
14004        END IF;
14005        WSH_New_Delivery_Actions.Assign_Del_to_Consol_Del(
14006             p_del_tab         => l_del_info_tab,
14007             p_parent_del_id   => l_new_parent_delivery_id,
14008             p_caller          => p_caller,
14009             x_return_status   => l_return_status);
14010 
14011           -- Handle return status.
14012 
14013         wsh_util_core.api_post_call
14014                       (
14015                         p_return_status => l_return_status,
14016                         x_num_warnings  => l_num_warnings,
14017                         x_num_errors    => l_num_errors
14018                       );
14019 
14020     END IF;
14021 
14022 
14023     -- At this point the parent LPN is a consol LPN and is assigned to a
14024     -- consol delivery. The child LPN is also assigned to the same consol delivery.
14025     -- All we need to do now is to update the child's consolidation record to
14026     -- create the assignment.
14027 
14028     update wsh_delivery_assignments
14029     set parent_delivery_detail_id = p_parent_container_id
14030     where delivery_detail_id = p_child_container_id
14031     and type = 'C';
14032 
14033     -- Handle wt/vol for consol deliveries/LPNs.
14034 /***
14035     IF l_debug_on THEN
14036       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.Container_Weight_Volume',WSH_DEBUG_SV.C_PROC_LEVEL);
14037     END IF;
14038     WSH_WV_UTILS.Container_Weight_Volume (
14039          p_container_instance_id => p_parent_container_id,
14040          p_override_flag         => 'Y',
14041          p_fill_pc_flag          => 'Y',
14042          p_post_process_flag     => 'N',
14043          p_calc_wv_if_frozen     => 'N',
14044          x_gross_weight          => l_cont_gross_weight,
14045          x_net_weight            => l_cont_net_weight,
14046          x_volume                => l_cont_volume,
14047          x_cont_fill_pc          => l_cont_fill_pc,
14048          x_return_status         => l_return_status);
14049 
14050     wsh_util_core.api_post_call
14051                       (
14052                         p_return_status => l_return_status,
14053                         x_num_warnings  => l_num_warnings,
14054                         x_num_errors    => l_num_errors
14055                       );
14056 ***/
14057     -- Need to recalculate the wt/vol for the releated entities.
14058     -- Calculating for the trips would drive all the way to the deliveries and lpns.
14059     IF l_debug_on THEN
14060         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TRIPS_ACTIONS.trip_weight_volume',WSH_DEBUG_SV.C_PROC_LEVEL);
14061     END IF;
14062     OPEN c_get_filled_vol(p_parent_container_id);
14063     FETCH c_get_filled_vol INTO l_filled_volume;
14064     CLOSE c_get_filled_vol;
14065 
14066     OPEN c_get_trip_id(l_new_parent_delivery_id);
14067     FETCH c_get_trip_id INTO l_trip_id_tab(1);
14068     CLOSE c_get_trip_id;
14069     WSH_TRIPS_ACTIONS.trip_weight_volume(
14070           p_trip_rows            => l_trip_id_tab,
14071           p_override_flag        => 'Y',
14072           p_calc_wv_if_frozen    => 'N',
14073           p_start_departure_date => to_date(NULL),
14074           p_calc_del_wv          => 'Y',
14075           x_return_status        => l_return_status,
14076           p_suppress_errors      => 'N');
14077 
14078     UPDATE wsh_delivery_details
14079     SET filled_volume = l_filled_volume
14080     WHERE delivery_detail_id =  p_parent_container_id;
14081 
14082     IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
14083       IF l_debug_on THEN
14084         WSH_DEBUG_SV.logmsg(l_module_name,'Error calculating trip wt/vol');
14085       END IF;
14086     END IF;
14087 /*
14088 
14089     IF l_debug_on THEN
14090       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.Delivery_Weight_Volume',WSH_DEBUG_SV.C_PROC_LEVEL);
14091     END IF;
14092 
14093     WSH_WV_UTILS.Delivery_Weight_Volume
14094                 ( p_delivery_id    => l_new_parent_delivery_id,
14095                   p_update_flag    => 'Y',
14096                   p_calc_wv_if_frozen => 'N',
14097                   x_gross_weight   => l_gross_wt,
14098                   x_net_weight     => l_net_wt,
14099                   x_volume         => l_volume,
14100                   x_return_status  => l_return_status);
14101 */
14102     wsh_util_core.api_post_call
14103                       (
14104                         p_return_status => l_return_status,
14105                         x_num_warnings  => l_num_warnings,
14106                         x_num_errors    => l_num_errors);
14107 
14108     IF l_num_errors > 0
14109     THEN
14110         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14111     ELSIF l_num_warnings > 0
14112     THEN
14113         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
14114     ELSE
14115         x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
14116     END IF;
14117 --
14118 -- Debug Statements
14119 --
14120 IF l_debug_on THEN
14121     WSH_DEBUG_SV.pop(l_module_name);
14122 END IF;
14123 --
14124 
14125 EXCEPTION
14126     WHEN FND_API.G_EXC_ERROR THEN
14127       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14128       --
14129       -- Debug Statements
14130       --
14131       IF l_debug_on THEN
14132           WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14133           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
14134       END IF;
14135 
14136     WHEN WSH_INVALID_TRIPS THEN
14137       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14138       FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_TRIPS');
14139       WSH_UTIL_CORE.Add_Message(x_return_status);
14140       --
14141       -- Debug Statements
14142       --
14143       IF l_debug_on THEN
14144         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_TRIPS exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14145 
14146         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_TRIPS');
14147       END IF;
14148 
14149     WHEN WSH_NO_CHILD_LPNS THEN
14150       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14151       FND_MESSAGE.SET_NAME('WSH','WSH_NO_CHILD_LPNS');
14152       WSH_UTIL_CORE.Add_Message(x_return_status);
14153       --
14154       -- Debug Statements
14155       --
14156       IF l_debug_on THEN
14157         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_CHILD_LPNS exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14158 
14159         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_CHILD_LPNS');
14160       END IF;
14161 
14162     WHEN WSH_CONSOL_DEL_NO_MATCH THEN
14163       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14164       FND_MESSAGE.SET_NAME('WSH','WSH_CONSOL_DEL_NO_MATCH');
14165       WSH_UTIL_CORE.Add_Message(x_return_status);
14166       --
14167       -- Debug Statements
14168       --
14169       IF l_debug_on THEN
14170         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_CONSOL_DEL_NO_MATCH exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14171 
14172         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_CONSOL_DEL_NO_MATCH');
14173       END IF;
14174 
14175     WHEN WSH_ASSIGN_CONSOL_LPN_ERROR THEN
14176       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14177       FND_MESSAGE.SET_NAME('WSH','WSH_ASSIGN_CONSOL_LPN_ERROR');
14178       WSH_UTIL_CORE.Add_Message(x_return_status);
14179       --
14180       -- Debug Statements
14181       --
14182       IF l_debug_on THEN
14183         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_ASSIGN_CONSOL_LPN_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14184 
14185         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_ASSIGN_CONSOL_LPN_ERROR');
14186       END IF;
14187 
14188     WHEN WSH_INVALID_CONSOL_ASSIGN THEN
14189       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14190       FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONSOL_ASSIGN');
14191       WSH_UTIL_CORE.Add_Message(x_return_status);
14192       --
14193       -- Debug Statements
14194       --
14195       IF l_debug_on THEN
14196         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_CONSOL_ASSIGN exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14197 
14198         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_CONSOL_ASSIGN');
14199       END IF;
14200 
14201     WHEN WSH_INVALID_PARENT THEN
14202       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14203       FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_PARENT');
14204       WSH_UTIL_CORE.Add_Message(x_return_status);
14205       --
14206       -- Debug Statements
14207       --
14208       IF l_debug_on THEN
14209         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_PARENT exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14210 
14211         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_PARENT');
14212       END IF;
14213 
14214     WHEN WSH_INVALID_CHILD THEN
14215       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14216       FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CHILD');
14217       WSH_UTIL_CORE.Add_Message(x_return_status);
14218       --
14219       -- Debug Statements
14220       --
14221       IF l_debug_on THEN
14222         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_CHILD exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14223 
14224         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_CHILD');
14225       END IF;
14226        --
14227 
14228     WHEN OTHERS THEN
14229 
14230       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
14231       wsh_util_core.default_handler('wsh_container_actions.Assign_Container_to_Consol', l_module_name);
14232       IF l_debug_on THEN
14233          WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
14234       END IF;
14235 
14236 END Assign_Container_to_Consol;
14237 
14238 PROCEDURE Unpack_Details_from_Consol
14239                (p_delivery_details_tab IN WSH_UTIL_CORE.ID_TAB_TYPE,
14240                 p_caller               IN VARCHAR2,
14241                 x_return_status       OUT NOCOPY VARCHAR2) IS
14242 
14243 cursor c_check_valid_combination(p_dd_id IN NUMBER) IS
14244 select wdd1.delivery_detail_id,
14245        wdd2.delivery_detail_id,
14246        wdd1.gross_weight,
14247        wdd1.net_weight,
14248        wdd1.volume,
14249        wdd1.weight_uom_code,
14250        wdd1.volume_uom_code,
14251        wdd1.inventory_item_id,
14252        wdd2.weight_uom_code,
14253        wdd2.volume_uom_code
14254 from wsh_delivery_details wdd1,
14255      wsh_delivery_details wdd2,
14256      wsh_delivery_assignments wda,
14257      wsh_new_deliveries wnd
14258 where wdd1.delivery_detail_id = p_dd_id
14259 and wda.delivery_detail_id = wdd1.delivery_detail_id
14260 and wda.type = 'C'
14261 and wda.delivery_id = wnd.delivery_id
14262 and wnd.status_code = 'OP'
14263 and wdd1.container_flag in ('Y', 'N')
14264 and wda.parent_delivery_detail_id = wdd2.delivery_detail_id
14265 and wdd2.container_flag = 'C'
14266 order by wdd2.delivery_detail_id;
14267 
14268 cursor c_check_empty_consol(p_consol_lpn_id in number) is
14269 select delivery_detail_id
14270 from wsh_delivery_assignments
14271 where parent_delivery_detail_id = p_consol_lpn_id
14272 and type = 'C'
14273 and rownum = 1;
14274 
14275 
14276 l_consol_lpn_tab wsh_util_core.id_tab_type;
14277 l_empty_lpn_tab wsh_util_core.id_tab_type;
14278 l_rem_lpn_tab  wsh_util_core.id_tab_type;
14279 
14280 l_cont_gross_weight    NUMBER;
14281 l_cont_net_weight      NUMBER;
14282 l_cont_volume          NUMBER;
14283 l_child_gross_weight    NUMBER;
14284 l_child_net_weight      NUMBER;
14285 l_child_volume          NUMBER;
14286 l_child_inv_item_id     NUMBER;
14287 l_child_weight_UOM      VARCHAR2(30);
14288 l_child_volume_UOM      VARCHAR2(30);
14289 l_parent_weight_UOM      VARCHAR2(30);
14290 l_parent_volume_UOM      VARCHAR2(30);
14291 l_cont_fill_pc         NUMBER;
14292 l_child_dd_id          NUMBER;
14293 l_parent_dd_id          NUMBER;
14294 l_dummy_dd_id          NUMBER;
14295 j                      NUMBER := 0;
14296 k                      NUMBER := 0;
14297 l                      NUMBER := 0;
14298 
14299 l_num_warnings              NUMBER  := 0;
14300 l_num_errors                NUMBER  := 0;
14301 l_return_status             VARCHAR2(30);
14302 
14303 WSH_INVALID_COMBINATION EXCEPTION;
14304 
14305 l_debug_on                    BOOLEAN;
14306 l_module_name        CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'Unpack_Details_from_Consol';
14307 
14308 BEGIN
14309 
14310    l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
14311    --
14312    IF l_debug_on IS NULL
14313    THEN
14314       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
14315    END IF;
14316    --
14317    IF l_debug_on THEN
14318       WSH_DEBUG_SV.push(l_module_name);
14319       --
14320       WSH_DEBUG_SV.log(l_module_name,'p_caller',p_caller);
14321    END IF;
14322    --
14323 
14324 
14325    FOR i in 1..p_delivery_details_tab.count LOOP
14326 
14327        OPEN c_check_valid_combination(p_delivery_details_tab(i));
14328        FETCH c_check_valid_combination
14329        INTO l_child_dd_id,
14330             l_parent_dd_id,
14331             l_cont_gross_weight,
14332             l_cont_net_weight,
14333             l_cont_volume,
14334             l_child_weight_UOM,
14335             l_child_volume_UOM,
14336             l_child_inv_item_id,
14337             l_parent_weight_UOM,
14338             l_parent_volume_UOM;
14339        IF c_check_valid_combination%NOTFOUND THEN
14340           CLOSE c_check_valid_combination;
14341           RAISE WSH_INVALID_COMBINATION;
14342        END IF;
14343        CLOSE c_check_valid_combination;
14344 
14345        IF i = 1 THEN
14346           j := 1;
14347           l_consol_lpn_tab(j) := l_parent_dd_id;
14348        ELSIF l_parent_dd_id <> l_consol_lpn_tab(j) THEN
14349           j := j +1;
14350           l_consol_lpn_tab(j) := l_parent_dd_id;
14351        END IF;
14352 
14353        -- Lock the delivery assignments.
14354 
14355        BEGIN
14356 
14357           WSH_DELIVERY_DETAILS_PKG.lock_wda_no_compare(p_delivery_detail_id => p_delivery_details_tab(i));
14358 
14359        EXCEPTION
14360          WHEN OTHERS THEN
14361            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14362            FND_MESSAGE.SET_NAME('WSH','WSH_NO_LOCK');
14363            WSH_UTIL_CORE.Add_Message(x_return_status);
14364            --
14365            -- Debug Statements
14366            --
14367            IF l_debug_on THEN
14368               WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_LOCK exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14369               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_LOCK');
14370            END IF;
14371            RETURN;
14372            --
14373        END;
14374 
14375 
14376 
14377        -- WMS will update the consol LPN with the decremented wt/vol (LPN convergence).
14378        -- This will also decrement the consol delivery wt/vol. However since the child
14379        -- LPN is still attached to the consol delivery, the consol delivery wt/vol should
14380        -- not change. So here we put back the child wt/vol onto the consol delivery in
14381        -- anticipation of it being decremented during the WMS call.
14382 
14383 
14384        IF l_debug_on THEN
14385           WSH_DEBUG_SV.log(l_module_name,'l_cont_gross_weight',l_cont_gross_weight);
14386           WSH_DEBUG_SV.log(l_module_name,'l_cont_net_weight',l_cont_net_weight);
14387           WSH_DEBUG_SV.log(l_module_name,'l_cont_volume',l_cont_volume);
14388           WSH_DEBUG_SV.log(l_module_name,'l_child_weight_UOM',l_child_weight_UOM);
14389           WSH_DEBUG_SV.log(l_module_name,'l_parent_weight_UOM',l_parent_weight_UOM);
14390           WSH_DEBUG_SV.log(l_module_name,'l_child_volume_UOM',l_child_volume_UOM);
14391           WSH_DEBUG_SV.log(l_module_name,'l_parent_volume_UOM',l_parent_volume_UOM);
14392        END IF;
14393 
14394        -- convert the child UOM to the parent UOMs.
14395 
14396        IF l_child_weight_UOM = l_parent_weight_UOM THEN
14397           l_child_gross_weight := l_cont_gross_weight;
14398           l_child_net_weight   := l_cont_net_weight;
14399        ELSE
14400 
14401           IF NVL(l_cont_gross_weight, 0) = 0 THEN
14402              l_child_gross_weight := 0;
14403           ELSE
14404              IF l_debug_on THEN
14405                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.convert_uom',WSH_DEBUG_SV.C_PROC_LEVEL);
14406                 WSH_DEBUG_SV.log(l_module_name,'l_cont_gross_weight',l_cont_gross_weight);
14407              END IF;
14408              l_child_gross_weight :=
14409              WSH_WV_UTILS.convert_uom(l_child_weight_UOM, l_parent_weight_UOM, l_cont_gross_weight, l_child_inv_item_id);
14410           END IF;
14411           IF NVL(l_cont_net_weight, 0) = 0 THEN
14412              l_child_net_weight := 0;
14413           ELSE
14414              IF l_debug_on THEN
14415                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.convert_uom',WSH_DEBUG_SV.C_PROC_LEVEL);
14416                 WSH_DEBUG_SV.log(l_module_name,'l_cont_net_weight',l_cont_net_weight);
14417              END IF;
14418              l_child_net_weight :=
14419              WSH_WV_UTILS.convert_uom(l_child_weight_UOM, l_parent_weight_UOM, l_cont_net_weight, l_child_inv_item_id);
14420           END IF;
14421 
14422        END IF;
14423        IF l_child_volume_UOM = l_parent_volume_UOM THEN
14424           l_child_volume := l_cont_volume;
14425        ELSE
14426 
14427           IF NVL(l_cont_volume, 0) = 0 THEN
14428              l_child_volume := 0;
14429           ELSE
14430              IF l_debug_on THEN
14431                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.convert_uom',WSH_DEBUG_SV.C_PROC_LEVEL);
14432                 WSH_DEBUG_SV.log(l_module_name,'l_cont_volume',l_cont_volume);
14433              END IF;
14434              l_child_volume :=
14435              WSH_WV_UTILS.convert_uom(l_child_volume_UOM, l_parent_volume_UOM, l_cont_volume, l_child_inv_item_id);
14436           END IF;
14437 
14438        END IF;
14439 
14440        IF l_debug_on THEN
14441           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
14442        END IF;
14443 
14444        WSH_WV_UTILS.DD_WV_Post_Process(
14445           p_delivery_detail_id => l_parent_dd_id,
14446           p_diff_gross_wt      => l_child_gross_weight,
14447           p_diff_net_wt        => l_child_net_weight,
14448           p_diff_volume        => l_child_volume,
14449           p_diff_fill_volume   => l_child_volume,
14450           x_return_status      => l_return_status);
14451 
14452        WSH_UTIL_CORE.API_Post_Call
14453           (
14454             p_return_status => l_return_status,
14455             x_num_warnings  => l_num_warnings,
14456             x_num_errors    => l_num_errors);
14457 
14458 
14459    END LOOP;
14460 
14461    FORALL i in 1..p_delivery_details_tab.count
14462    update wsh_delivery_assignments
14463    set parent_delivery_detail_id = NULL
14464    where delivery_detail_id = p_delivery_details_tab(i)
14465    and type = 'C';
14466 
14467 
14468 
14469    IF l_num_errors > 0
14470    THEN
14471       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14472    ELSIF l_num_warnings > 0
14473    THEN
14474       x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
14475    ELSE
14476       x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
14477    END IF;
14478 --
14479 -- Debug Statements
14480 --
14481 IF l_debug_on THEN
14482     WSH_DEBUG_SV.pop(l_module_name);
14483 END IF;
14484 
14485 
14486 EXCEPTION
14487   WHEN FND_API.G_EXC_ERROR THEN
14488     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14489     --
14490     -- Debug Statements
14491     --
14492     IF l_debug_on THEN
14493         WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14494         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
14495     END IF;
14496 
14497 
14498   WHEN WSH_INVALID_COMBINATION THEN
14499         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14500         FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_COMBINATION');
14501         WSH_UTIL_CORE.Add_Message(x_return_status);
14502         --
14503         -- Debug Statements
14504         --
14505         IF l_debug_on THEN
14506         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_COMBINATION exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14507 
14508         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_COMBINATION');
14509         END IF;
14510         --
14511 
14512   WHEN OTHERS THEN
14513     wsh_util_core.default_handler('wsh_container_actions.unassign_detail_from_consol',l_module_name);
14514       --
14515     IF l_debug_on THEN
14516       wsh_debug_sv.pop(l_module_name, 'EXCEPTION:OTHERS');
14517     END IF;
14518 
14519 END Unpack_Details_from_Consol;
14520 
14521 --BUG#12904248
14522 /*
14523 -----------------------------------------------------------------------------
14524    PROCEDURE  : Get_Deliver_To_Location
14525    PARAMETERS : p_container_id - Delivery detail id for the container
14526 		        x_deliver_to_location_id - Deliver to location id depending upon delivery details packed in container.
14527 		        x_return_status - return status of API
14528   DESCRIPTION : This procedure will return deliver to location id for conatiner
14529                 if all the delivery details in container have same deliver to location id else
14530                 this procedure will return NULL deliver to location id
14531 
14532 As this procedure is only been called from inside the the package so this is
14533 only added to package body and not added to package spec
14534 ------------------------------------------------------------------------------
14535 */
14536 
14537 PROCEDURE Get_Deliver_To_Location(
14538  p_container_id IN NUMBER,
14539  x_deliver_to_location_id OUT NOCOPY NUMBER,
14540  x_return_status OUT NOCOPY VARCHAR2) IS
14541 
14542 CURSOR get_deliver_to_location_id (p_cont_id NUMBER) IS
14543  SELECT wdd.deliver_to_location_id
14544  FROM   wsh_delivery_details wdd, wsh_delivery_assignments wda
14545  WHERE  wda.delivery_detail_id = wdd.delivery_detail_id
14546  AND    wda.parent_delivery_detail_id = p_cont_id;
14547 
14548 cnt NUMBER := 0;
14549 l_deliver_to_location_id NUMBER :=NULL;
14550 
14551 l_debug_on BOOLEAN;
14552 
14553 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'GET_DELIVER_TO_LOCATION';
14554 
14555 BEGIN
14556 
14557 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
14558 
14559 IF l_debug_on IS NULL
14560  THEN
14561      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
14562  END IF;
14563 
14564 IF l_debug_on THEN
14565      WSH_DEBUG_SV.push(l_module_name);
14566 	 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_ID',p_container_id);
14567 END IF;
14568 
14569 
14570 FOR c1 in get_deliver_to_location_id(P_CONTAINER_ID) LOOP
14571 	IF l_debug_on THEN
14572        WSH_DEBUG_SV.log(l_module_name,'cnt',cnt);
14573 	      WSH_DEBUG_SV.log(l_module_name,'c1.deliver_to_location_id',c1.deliver_to_location_id);
14574        END IF;
14575    IF cnt =0 THEN
14576 	      l_deliver_to_location_id := c1.deliver_to_location_id;
14577    ELSE
14578           IF l_deliver_to_location_id <> c1.deliver_to_location_id	THEN
14579 		     l_deliver_to_location_id:= NULL;
14580 		  END IF;
14581    END IF;
14582     cnt:=cnt+1;
14583 END LOOP;
14584 
14585 x_deliver_to_location_id :=l_deliver_to_location_id;
14586 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
14587 
14588 IF l_debug_on THEN
14589     WSH_DEBUG_SV.pop(l_module_name);
14590 END IF;
14591 
14592 EXCEPTION
14593 
14594   WHEN Others THEN
14595 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Get_Deliver_To_Location',l_module_name);
14596 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
14597 
14598 --
14599 IF l_debug_on THEN
14600     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
14601     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
14602 END IF;
14603 
14604 END Get_Deliver_To_Location;
14605 
14606 END wsh_container_actions;