DBA Data[Home] [Help]

PACKAGE BODY: APPS.WSH_CONTAINER_ACTIONS

Source


1 PACKAGE BODY wsh_container_actions as
2 /* $Header: WSHCMACB.pls 120.19.12000000.4 2007/02/01 22:49:29 jishen 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_min_fill_pc NUMBER;
268   l_max_load_wt NUMBER;
269   l_max_vol NUMBER;
270   l_user_id NUMBER;
271   l_last_update_by NUMBER;
272   l_primary_uom VARCHAR2(3);
273 -- J: W/V Changes
274   l_unit_weight NUMBER;
275   l_unit_volume NUMBER;
276   l_row_id	VARCHAR2(30);
277   l_org_name VARCHAR2(240);
278   l_item_name VARCHAR2(2000);
279   l_additional_cont_attr wsh_glbl_var_strct_grp.LPNRecordType;
280 
281   i NUMBER;
282   j NUMBER;
283   l_return_status  VARCHAR2(2);
284   l_num_warnings   NUMBER := 0;
285   l_num_errors     NUMBER := 0;
286 
287   --
288   l_debug_on BOOLEAN;
289   --
290   l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'DEFAULT_CONTAINER_ATTR';
291   --
292 BEGIN
293 
294     --
295     --
296     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
297     --
298     IF l_debug_on IS NULL
299     THEN
300         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
301     END IF;
302     --
303     IF l_debug_on THEN
304         WSH_DEBUG_SV.push(l_module_name);
305         --
306         WSH_DEBUG_SV.log(l_module_name,'organization_id',P_container_rec.organization_id);
307         WSH_DEBUG_SV.log(l_module_name,'item_id',P_container_rec.inventory_item_id);
308     END IF;
309     --
310 
311     -- If one of the wt/vol fields are negative, or if any wt/vol is give
312     -- without their uom, or if any wt/vol's uom is given without value then
313     -- error out.
314 
315     l_additional_cont_attr := p_additional_cont_attr;
316 
317     IF P_container_rec.volume < 0 OR P_container_rec.filled_volume < 0
318      OR P_container_rec.net_weight < 0 OR P_container_rec.gross_weight < 0
319      OR l_additional_cont_attr.tare_weight < 0
320     THEN --{
321 
322        IF l_debug_on THEN --{
323 
324           WSH_DEBUG_SV.log(l_module_name,'1 gross_weight',P_container_rec.gross_weight);
325           WSH_DEBUG_SV.log(l_module_name,'net_weight',P_container_rec.net_weight);
326           WSH_DEBUG_SV.log(l_module_name,'tare_weight',l_additional_cont_attr.tare_weight);
327           WSH_DEBUG_SV.log(l_module_name,'volume',P_container_rec.volume);
328           WSH_DEBUG_SV.log(l_module_name,'filled_volume',P_container_rec.filled_volume);
329        END IF; --}
330 
331        RAISE FND_API.G_EXC_ERROR;
332 
333     ELSIF (nvl(P_container_rec.volume,0) > 0
334            AND P_container_rec.volume_uom_code IS NULL)
335        --OR (P_container_rec.volume IS NULL
336            --AND P_container_rec.volume_uom_code IS NOT NULL )
337        OR (NVL(P_container_rec.filled_volume,0)> 0
338            AND l_additional_cont_attr.filled_volume_uom_code IS NULL )
339        --OR (P_container_rec.filled_volume IS NULL
340            --AND l_additional_cont_attr.filled_volume_uom_code IS NOT NULL )
341        OR (nvl(P_container_rec.gross_weight,0) > 0
342            AND P_container_rec.weight_uom_code IS NULL )
343        --OR (P_container_rec.gross_weight IS NULL
344            --AND P_container_rec.weight_uom_code IS NOT NULL )
345        OR (nvl(P_container_rec.net_weight,0) > 0
346            AND P_container_rec.weight_uom_code IS NULL )
347        --OR (P_container_rec.net_weight IS NULL
348            --AND P_container_rec.weight_uom_code IS NOT NULL )
349        OR (nvl(l_additional_cont_attr.tare_weight,0) > 0
350            AND l_additional_cont_attr.tare_weight_uom_code IS NULL )
351        --OR (l_additional_cont_attr.tare_weight IS NULL
352            --AND l_additional_cont_attr.tare_weight_uom_code IS NOT NULL )
353     THEN --}{
354        IF l_debug_on THEN --{
355 
356           WSH_DEBUG_SV.log(l_module_name,'2 gross_weight',P_container_rec.gross_weight);
357           WSH_DEBUG_SV.log(l_module_name,'net_weight',P_container_rec.net_weight);
358           WSH_DEBUG_SV.log(l_module_name,'weight_uom_code',P_container_rec.weight_uom_code);
359           WSH_DEBUG_SV.log(l_module_name,'tare_weight',l_additional_cont_attr.tare_weight);
360           WSH_DEBUG_SV.log(l_module_name,'tare_weight_uom_code',l_additional_cont_attr.tare_weight_uom_code);
361           WSH_DEBUG_SV.log(l_module_name,'volume',P_container_rec.volume);
362           WSH_DEBUG_SV.log(l_module_name,'filled_volume',P_container_rec.filled_volume);
363           WSH_DEBUG_SV.log(l_module_name,'volume_uom_code',P_container_rec.volume_uom_code);
364           WSH_DEBUG_SV.log(l_module_name,'filled_volume_uom',l_additional_cont_attr.filled_volume_uom_code);
365        END IF; --}
366 
367        RAISE FND_API.G_EXC_ERROR;
368 
369     END IF; --}
370 
371     l_wms_org := wsh_util_validate.check_wms_org(P_container_rec.organization_id);
372     IF l_debug_on THEN
373       WSH_DEBUG_SV.log(l_module_name,'l_wms_org',l_wms_org);
377                              P_container_rec.organization_id,
374     END IF;
375 
376     OPEN Get_Cont_Item_Info (P_container_rec.inventory_item_id,
378                              l_wms_org);
379 
380      --
381      IF l_debug_on THEN
382          WSH_DEBUG_SV.logmsg(l_module_name, 'GETTING CONTAINER ITEM INFO'  );
383      END IF;
384      --
385 	FETCH Get_Cont_Item_Info INTO
386 	  l_description,
387 	  l_container_type_code,
388 	  l_wt_uom,
389 	  l_vol_uom,
390 	  l_min_fill_pc,
391 	  l_max_load_wt,
392 	  l_max_vol,
393 	  l_primary_uom,
394           l_unit_weight,
395           l_unit_volume;
396 
397 	IF Get_Cont_Item_Info%NOTFOUND THEN --{
398 	  --
399           IF NVL(p_caller,'WSH') NOT IN ( 'WSH_PICK_RELEASE', 'WSH_IB_PACK')
400             AND NVL(p_caller,'WSH') NOT LIKE 'WMS%'
401           THEN
402 
403 	     IF l_debug_on THEN
404 	         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
405 	     END IF;
406 	     --
407 	     l_item_name := WSH_UTIL_CORE.Get_Item_Name(P_container_rec.inventory_item_id,P_container_rec.organization_id);
408 	     FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_INV_ITEM');
409 	     FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
410 	     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
411    	     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
412           END IF;
413 
414 	  CLOSE Get_Cont_Item_Info;
415   	  --  Bug#: 3362895
416 	  IF P_container_rec.inventory_item_id IS NOT NULL THEN
417             IF l_debug_on THEN
418 	      WSH_DEBUG_SV.pop(l_module_name);
419 	    END IF;
420 	    --
421 	    return;
422 	  END IF;
423 
424 	  -- return;  Containers need not have an inventory item
425 	  -- 		 associated with them. Cross-Docking requirements
426 	ELSE --}{
427 	    CLOSE Get_Cont_Item_Info;
428 	END IF; --}
429 
430         --
431         IF l_debug_on THEN
432            WSH_DEBUG_SV.log(l_module_name, 'l_vol_uom',l_vol_uom  );
433            WSH_DEBUG_SV.log(l_module_name, 'l_wt_uom',l_wt_uom  );
434         END IF;
435         IF l_vol_uom IS NULL OR l_wt_uom IS NULL THEN --{
436            IF l_debug_on THEN
437 	          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.GET_DEFAULT_UOMS',WSH_DEBUG_SV.C_PROC_LEVEL);
438 	   END IF;
439 	   --
440 	   WSH_WV_UTILS.Get_Default_Uoms (
441 			   P_container_rec.organization_id,
442 			   l_wt_uom,
443 			   l_vol_uom,
444 			   l_return_status);
445 
446 	   IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN --{
447               --
448               IF l_debug_on THEN
449                 WSH_DEBUG_SV.logmsg(l_module_name, 'ERROR GETTING DEFFAULT UOMS'  );
450  	        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ORG_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
451  	      END IF;
452  	      --
453  	      l_org_name := WSH_UTIL_CORE.Get_Org_Name(P_container_rec.organization_id);
454 	      FND_MESSAGE.SET_NAME('WSH','WSH_DEFAULT_UOM_ERROR');
455 	      FND_MESSAGE.SET_TOKEN('ORG_NAME',l_org_name);
456 	      WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
457 	      --
458 	      IF l_debug_on THEN
459 	         WSH_DEBUG_SV.log(l_module_name,'Org Name is ',l_org_name);
460 	       END IF;
461 	       --
462                wsh_util_core.api_post_call
463                  (
464                    p_return_status => l_return_status,
465                    x_num_warnings  => l_num_warnings,
466                    x_num_errors    => l_num_errors
467                );
468 	   END IF; --}
469            --
470            IF l_debug_on THEN
471                WSH_DEBUG_SV.logmsg(l_module_name, 'NO ERRORS AFTER GETTING DEFAULT UOMS'  );
472                WSH_DEBUG_SV.logmsg(l_module_name, 'CLOSED GET_CONT_ITEM_INFO'  );
473            END IF;
474            --
475         END IF; --}
476 
477         --converting the uoms
478         p_container_rec.volume_uom_code := NVL(p_container_rec.volume_uom_code,l_vol_uom);
479         l_additional_cont_attr.filled_volume_uom_code := NVL(l_additional_cont_attr.filled_volume_uom_code, l_vol_uom);
480 
481         IF p_container_rec.volume_uom_code <> l_vol_uom THEN
482            p_container_rec.volume :=
483                   WSH_WV_UTILS.Convert_Uom_core (
484                                    from_uom => p_container_rec.volume_uom_code,
485                                    to_uom => l_vol_uom,
486                                    quantity => p_container_rec.volume,
487                                    item_id => P_container_rec.inventory_item_id,
488                                    x_return_status => l_return_status
489                                );
490            wsh_util_core.api_post_call
491              (
492                p_return_status => l_return_status,
493                x_num_warnings  => l_num_warnings,
494                x_num_errors    => l_num_errors
495              );
496         END IF;
497         p_container_rec.volume := NVL(p_container_rec.volume,l_unit_volume);
498         p_container_rec.volume_uom_code := l_vol_uom;
499 
500         IF l_additional_cont_attr.filled_volume_uom_code <> l_vol_uom THEN
501            p_container_rec.filled_volume :=
502                WSH_WV_UTILS.Convert_Uom_core (
506                        item_id =>P_container_rec.inventory_item_id,
503                        from_uom =>l_additional_cont_attr.filled_volume_uom_code,
504                        to_uom =>l_vol_uom,
505                        quantity =>p_container_rec.filled_volume,
507                        x_return_status => l_return_status );
508            wsh_util_core.api_post_call
509              (
510                p_return_status => l_return_status,
511                x_num_warnings  => l_num_warnings,
512                x_num_errors    => l_num_errors
513              );
514         END IF;
515         p_container_rec.unit_volume := l_unit_volume;
516         --p_container_rec.filled_volume := NVL(p_container_rec.filled_volume,l_unit_volume);
517 
518         p_container_rec.weight_uom_code := NVL(p_container_rec.weight_uom_code,l_wt_uom);
519         IF p_container_rec.weight_uom_code <> l_wt_uom THEN
520            p_container_rec.gross_weight :=
521                WSH_WV_UTILS.Convert_Uom_core (
522                                   from_uom => p_container_rec.weight_uom_code,
523                                   to_uom => l_wt_uom,
524                                   quantity => p_container_rec.gross_weight,
525                                   item_id => P_container_rec.inventory_item_id,
526                                   x_return_status => l_return_status
527                                );
528            wsh_util_core.api_post_call
529              (
530                p_return_status => l_return_status,
531                x_num_warnings  => l_num_warnings,
532                x_num_errors    => l_num_errors
533              );
534            IF  p_container_rec.net_weight is not NULL THEN
535                p_container_rec.net_weight :=
536                      WSH_WV_UTILS.Convert_Uom_core (
537                                   from_uom => p_container_rec.weight_uom_code,
538                                   to_uom => l_wt_uom,
539                                   quantity => p_container_rec.net_weight,
540                                   item_id =>P_container_rec.inventory_item_id,
541                                   x_return_status => l_return_status);
542                wsh_util_core.api_post_call
543                  (
544                    p_return_status => l_return_status,
545                    x_num_warnings  => l_num_warnings,
546                    x_num_errors    => l_num_errors
547                  );
548             END IF;
549         END IF;
550         p_container_rec.weight_uom_code := l_wt_uom;
551 
552         IF l_additional_cont_attr.tare_weight_uom_code <> l_wt_uom THEN
553               l_additional_cont_attr.tare_weight :=
554                   WSH_WV_UTILS.Convert_Uom_core (
555                           from_uom=>l_additional_cont_attr.tare_weight_uom_code,
556                           to_uom => l_wt_uom,
557                           quantity => l_additional_cont_attr.tare_weight,
558                           item_id => P_container_rec.inventory_item_id,
559                           x_return_status => l_return_status
560                   );
561                wsh_util_core.api_post_call
562                  (
563                    p_return_status => l_return_status,
564                    x_num_warnings  => l_num_warnings,
565                    x_num_errors    => l_num_errors
566                  );
567         END IF;
568 
569         p_container_rec.gross_weight := NVL(p_container_rec.gross_weight,l_unit_weight);
570         IF p_container_rec.net_weight IS NULL AND l_additional_cont_attr.tare_weight IS NOT NULL THEN
571            p_container_rec.net_weight := p_container_rec.gross_weight
572                                    - l_additional_cont_attr.tare_weight;
573         END IF;
574 
575         --
576         IF l_debug_on THEN
577             WSH_DEBUG_SV.log(l_module_name, 'gross weight', p_container_rec.gross_weight  );
578             WSH_DEBUG_SV.log(l_module_name, 'volume', p_container_rec.volume );
579             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.ORG_TO_LOCATION',WSH_DEBUG_SV.C_PROC_LEVEL);
580         END IF;
581         --
582         p_container_rec.ship_from_location_id := WSH_UTIL_CORE.Org_To_Location(p_container_rec.organization_id,TRUE);
583         p_container_rec.container_type_code := NVL(p_container_rec.container_type_code,l_container_type_code);
584         p_container_rec.item_description := l_description;
585         p_container_rec.requested_quantity := 1;
586         p_container_rec.shipped_quantity := null;
587         --
588         IF l_debug_on THEN
589             WSH_DEBUG_SV.logmsg(l_module_name, 'ASSIGNING RQ_UOM'  );
590         END IF;
591         --
592         p_container_rec.requested_quantity_uom := l_primary_uom;
593         p_container_rec.wv_frozen_flag := 'N';
594         p_container_rec.unit_weight := l_unit_weight;
595         p_container_rec.maximum_volume := l_max_vol;
596         p_container_rec.maximum_load_weight := l_max_load_wt;
597                   --NVL(p_container_rec.maximum_load_weight, l_max_load_wt);
598         p_container_rec.minimum_fill_percent := l_min_fill_pc;
599                    --NVL(p_container_rec.minimum_fill_percent,l_min_fill_pc);
600         p_container_rec.source_code := 'WSH';
601         p_container_rec.container_flag := 'Y';
602 
603         -- Fix for Bug 1820376 : Containers should have release status as 'X'
604         p_container_rec.released_status := 'X';
605 
606 
607         x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
608 
609 	--
613 	--
610 	IF l_debug_on THEN
611 	    WSH_DEBUG_SV.pop(l_module_name);
612 	END IF;
614 EXCEPTION
615     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
616       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
617       IF l_debug_on THEN
618         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle
619 error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
620         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
621       END IF;
622       --
623     WHEN WSH_UTIL_CORE.G_EXC_WARNING THEN
624       x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
625       --
626       IF l_debug_on THEN
627         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_UTIL_CORE.G_EXC_WARNING exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
628         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_UTIL_CORE.G_EXC_WARNING');      END IF;
629 
630     WHEN FND_API.G_EXC_ERROR THEN
631 
632       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
633       --
634       IF l_debug_on THEN
635         WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
636         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
637       END IF;
638       --
639 
640   WHEN Others THEN
641 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.default_container_attr',l_module_name);
642 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
643 
644         --
645         IF l_debug_on THEN
646             WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
647             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
648         END IF;
649         --
650 END default_container_attr;
651 
652 
653 /*
654 -----------------------------------------------------------------------------
655    PROCEDURE  : Create_Cont_Instance_Multi
656 -- This API has been created to Create Multiple Containers
657 -- while Auto Packing, p_num_of_containers specifies how
658 -- many containers need to be created
659 ------------------------------------------------------------------------------
660 */
661 
662 PROCEDURE Create_Cont_Instance_Multi (
663   x_cont_name IN OUT NOCOPY  VARCHAR2,
664   p_cont_item_id IN NUMBER,
665   x_cont_instance_id IN OUT NOCOPY  NUMBER,
666   p_par_detail_id IN NUMBER,
667   p_organization_id IN NUMBER,
668   p_container_type_code IN VARCHAR2,
669   p_num_of_containers IN NUMBER,
670   x_row_id OUT NOCOPY  VARCHAR2,
671   --x_row_id will containe the rowid of the first container created.
672   x_return_status OUT NOCOPY  VARCHAR2,
673   x_cont_tab OUT NOCOPY  WSH_UTIL_CORE.id_tab_type,
674   -- J: W/V Changes
675   x_unit_weight OUT NOCOPY NUMBER,
676   x_unit_volume OUT NOCOPY NUMBER,
677   x_weight_uom_code OUT NOCOPY VARCHAR2,
678   x_volume_uom_code OUT NOCOPY VARCHAR2,
679   p_lpn_id          IN NUMBER DEFAULT NULL,
680   p_ignore_for_planning IN VARCHAR2 DEFAULT 'N',
681   p_caller            IN VARCHAR2 DEFAULT 'WSH'
682   ) IS
683 
684   CURSOR Get_Cont_Item_Info (v_cont_item_id NUMBER, v_org_id NUMBER) IS
685   SELECT Description, Container_Type_Code, weight_uom_code, volume_uom_code,
686   minimum_fill_percent, maximum_load_weight, internal_volume, primary_uom_code,
687 -- J: W/V Changes
688   unit_weight, unit_volume
689   FROM MTL_SYSTEM_ITEMS
690   WHERE inventory_item_id = v_cont_item_id
691   AND container_item_flag = 'Y'
692   AND organization_id = v_org_id
693   AND    nvl(vehicle_item_flag,'N') = 'N'
694   AND    shippable_item_flag = 'Y';
695 -- bug 2828591 - remove the condition since it will prevent user to create container with other status
696 --  AND inventory_item_status_code='Active';
697 
698   CURSOR Get_Cont_Name (v_cont_inst_id NUMBER) IS
699   SELECT container_name
700   FROM WSH_DELIVERY_DETAILS
701   WHERE delivery_detail_id = v_cont_inst_id
702   AND container_flag = 'Y';
703 
704 --added cursors
705   CURSOR Get_Wdd_Nextval IS
706   SELECT wsh_delivery_details_s.nextval
707     FROM sys.dual;
708 
709   CURSOR Get_Wda_Nextval IS
710   SELECT wsh_delivery_assignments_s.nextval
711     FROM sys.dual;
712 
713   l_cont_instance_id NUMBER;
714   l_cont_name VARCHAR2(50);
715   l_description VARCHAR2(240);
716   l_container_type_code VARCHAR2(30);
717   l_min_fill_pc NUMBER;
718   l_max_load_wt NUMBER;
719   l_max_vol NUMBER;
720   l_user_id NUMBER;
721   l_last_update_by NUMBER;
722   l_primary_uom VARCHAR2(3);
723 -- J: W/V Changes
724 
725   l_container_rec       WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type;
726   l_del_assg_rec	WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_Type;
727 
728   l_row_id	VARCHAR2(30);
729   l_del_assg_id	NUMBER;
730 
731   l_cont_name VARCHAR2(30);
732   l_org_name VARCHAR2(240);
733 
734   l_item_name VARCHAR2(2000);
735   l_cont_rec wsh_container_actions.cont_inst_rec;
736   l_cont_tab wsh_container_actions.cont_inst_tab;
737   i NUMBER;
738   j NUMBER;
739   cnt NUMBER;
740   l_cont_dummy_tab  WSH_UTIL_CORE.id_tab_type;
741   l_assignment_dummy_tab  WSH_UTIL_CORE.id_tab_type;
742   l_delivery_detail_id NUMBER;
743 --lpn conv
744   l_orig_value   VARCHAR2(2);
745   l_orig_update_cont_value   VARCHAR2(2);
746   l_net_weight   number;
747 
748   l_LPN_PREFIX   mtl_parameters.LPN_PREFIX%TYPE;
752   --l_cont_names WSH_GLBL_VAR_STRCT_GRP.v50_Tbl_Type;
749   l_LPN_SUFFIX   mtl_parameters.LPN_SUFFIX%TYPE;
750   l_LPN_STARTING_NUMBER  mtl_parameters.LPN_STARTING_NUMBER%TYPE;
751   l_TOTAL_LPN_LENGTH     mtl_parameters.TOTAL_LPN_LENGTH%TYPE;
753   --l_lpn_ids              WSH_UTIL_CORE.id_tab_type;
754   l_cont_name_dig          number;
755   l_tare_wt   NUMBER;
756   l_tare_wt_uom VARCHAR2(10);
757   l_msg_count                 NUMBER;
758   l_msg_data                  VARCHAR2(32767);
759   l_container_info_rec        WSH_GLBL_VAR_STRCT_GRP.ContInfoRectype;
760   l_gen_lpn_rec           WMS_Data_Type_Definitions_pub.AutoCreateLPNRecordType;
761   l_lpn_tbl               WMS_Data_Type_Definitions_pub.LPNTableType;
762   l_num_warnings  NUMBER := 0;
763   l_num_errors    NUMBER := 0;
764   l_return_status VARCHAR2(10);
765   l_additional_cont_attr    wsh_glbl_var_strct_grp.LPNRecordType;
766   l_organization_id         NUMBER;
767   l_inventory_item_id       NUMBER;
768   l_first                   number;
769   CURSOR c_get_default_parameters (v_organization_id NUMBER) IS
770   SELECT LPN_PREFIX,
771          LPN_SUFFIX,
772          LPN_STARTING_NUMBER ,
773          TOTAL_LPN_LENGTH
774   FROM mtl_parameters
775   WHERE ORGANIZATION_ID = v_organization_id;
776 
777   CURSOR c_get_lpn_info(v_lpn_id NUMBER) IS
778   SELECT gross_weight ,
779          GROSS_WEIGHT_UOM_CODE,
780          TARE_WEIGHT_UOM_CODE,
781          TARE_WEIGHT,
782          --container_volume,
783          --CONTAINER_VOLUME_UOM,
784          content_volume,  --filled volume
785          CONTENT_VOLUME_UOM_CODE ,
786          locator_id,
787          subinventory_code,
788          license_plate_number ,
789          organization_id,
790          inventory_item_id
791    FROM wms_license_plate_numbers
792    WHERE lpn_id = v_lpn_id;
793 
794    CURSOR c_get_lpn_from_history (v_lpn_id number)IS
795    SELECT wlh.LICENSE_PLATE_NUMBER,
796           wlh.organization_id,
797           wlh.inventory_item_id
798   FROM wms_lpn_histories wlh
799   WHERE wlh.lpn_id = v_lpn_id
800   --AND wlh.OPERATION_MODE = 1
801   AND wlh.lpn_context = 7
802   AND wlh.SOURCE_TYPE_ID = 1;
803 
804   CURSOR c_get_rowid (v_delivery_detail number) IS
805   SELECT rowid , container_name
806   from wsh_delivery_details
807   WHERE delivery_detail_id = v_delivery_detail;
808 
809 
810 
811 
812 
813 --
814 l_debug_on BOOLEAN;
815 --
816 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CREATE_CONT_INSTANCE_MULTI';
817 --
818 BEGIN
819 
820     --
821     --
822     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
823     --
824     IF l_debug_on IS NULL
825     THEN
826         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
827     END IF;
828     --
829     IF l_debug_on THEN
830         WSH_DEBUG_SV.push(l_module_name);
831         --
832         WSH_DEBUG_SV.log(l_module_name,'X_CONT_NAME',X_CONT_NAME);
833         WSH_DEBUG_SV.log(l_module_name,'P_CONT_ITEM_ID',P_CONT_ITEM_ID);
834         WSH_DEBUG_SV.log(l_module_name,'X_CONT_INSTANCE_ID',X_CONT_INSTANCE_ID);
835         WSH_DEBUG_SV.log(l_module_name,'P_PAR_DETAIL_ID',P_PAR_DETAIL_ID);
836         WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
837         WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_TYPE_CODE',P_CONTAINER_TYPE_CODE);
838     END IF;
839     --
840     --
841     IF l_debug_on THEN
842         WSH_DEBUG_SV.logmsg(l_module_name, 'IN CREATE_CONT_INSTANCE_MULTI '  );
843     END IF;
844     --
845 
846     l_orig_value := WSH_WMS_LPN_GRP.g_call_group_api;
847     l_orig_update_cont_value := WSH_WMS_LPN_GRP.g_update_to_container;
848     l_inventory_item_id := p_cont_item_id;
849 
850     IF p_organization_id IS NULL AND p_lpn_id IS NULL THEN
851 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ORG_NULL');
852 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
853 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
854 	--
855 	IF l_debug_on THEN
856 	    WSH_DEBUG_SV.pop(l_module_name);
857 	END IF;
858 	--
859 	return;
860     END IF;
861 
862 --lpn conv
863     IF p_lpn_id IS NULL THEN --{
864 
865        WSH_WMS_LPN_GRP.g_call_group_api := 'N';
866        WSH_WMS_LPN_GRP.g_update_to_container := 'N';
867 
868        IF c_wms_code_present = 'Y' THEN --{
869 
870        IF l_debug_on THEN
871          WSH_DEBUG_SV.logmsg(l_module_name,
872                           'calling wms_container_grp.Auto_Create_LPNs'  );
873        END IF;
874 
875        l_gen_lpn_rec.container_item_id := l_inventory_item_id;
876        l_gen_lpn_rec.organization_id :=  p_organization_id;
877        --l_gen_lpn_rec.lpn_prefix:=  l_LPN_PREFIX;
878        --l_gen_lpn_rec.lpn_suffix := l_LPN_SUFFIX;
879        --l_gen_lpn_rec.starting_num :=  l_LPN_STARTING_NUMBER;
880        --l_gen_lpn_rec.total_length :=  l_TOTAL_LPN_LENGTH;
881        l_gen_lpn_rec.quantity:= p_num_of_containers;
882 
883        wms_container_grp.Auto_Create_LPNs (
884                p_api_version         => 1.0
885              , p_init_msg_list      => fnd_api.g_false
886              , p_commit             => fnd_api.g_false
887              , x_return_status      => l_return_status
888              , x_msg_count          => l_msg_count
892              , p_lpn_table          => l_lpn_tbl
889              , x_msg_data           => l_msg_data
890              , p_caller             => 'WSH_GENERATE'
891              , p_gen_lpn_rec        => l_gen_lpn_rec
893        );
894        wsh_util_core.api_post_call
895          (
896            p_return_status => l_return_status,
897            x_num_warnings  => l_num_warnings,
898            x_num_errors    => l_num_errors,
899            p_msg_data      => l_msg_data
900        );
901        WSH_WMS_LPN_GRP.g_call_group_api := l_orig_value;
902        WSH_WMS_LPN_GRP.g_update_to_container := l_orig_update_cont_value;
903 
904        j := 1;
905        i := l_lpn_tbl.first;
906        WHILE i IS NOT NULL LOOP
907           IF l_debug_on THEN
908 	     WSH_DEBUG_SV.log(l_module_name,'container_name',
909                                    l_lpn_tbl(i).license_plate_number);
910 	     WSH_DEBUG_SV.log(l_module_name,'lpn_id',
911                                    l_lpn_tbl(i).lpn_id);
912           END IF;
913           l_container_info_rec.container_names(j)
914                                    := l_lpn_tbl(i).license_plate_number;
915           l_container_info_rec.lpn_ids(j) := l_lpn_tbl(i).lpn_id;
916 
917           IF (l_container_info_rec.container_names(j) IS NULL)  OR (l_container_info_rec.lpn_ids(j) IS NULL )THEN
918              RAISE FND_API.G_EXC_ERROR;
919           END IF;
920 
921           i := l_lpn_tbl.NEXT(i);
922           j := J + 1;
923        END LOOP;
924 
925        l_container_rec.weight_uom_code :=
926                                      l_lpn_tbl(1).GROSS_WEIGHT_UOM_CODE;
927        l_container_rec.gross_weight :=
928                                        l_lpn_tbl(1).GROSS_WEIGHT;
929        l_additional_cont_attr.tare_weight :=
930                                        l_lpn_tbl(1).TARE_WEIGHT;
931        l_additional_cont_attr.tare_weight_uom_code :=
932                                        l_lpn_tbl(1).TARE_WEIGHT_UOM_CODE;
933        l_container_rec.volume_uom_code :=
934                        l_lpn_tbl(1).CONTAINER_VOLUME_UOM;
935        l_container_rec.volume := l_lpn_tbl(1).CONTAINER_VOLUME;
936        l_additional_cont_attr.filled_volume_uom_code :=
937                        l_lpn_tbl(1).CONTENT_VOLUME_UOM_CODE;
938        l_container_rec.filled_volume := l_lpn_tbl(1).CONTENT_VOLUME;
939        l_container_rec.locator_id := l_lpn_tbl(1).locator_id;
940        l_container_rec.subinventory := l_lpn_tbl(1).SUBINVENTORY_CODE;
941 
942        ELSE --}{
943        /* commment out this part once the wms code is ready*/
944        OPEN c_get_default_parameters(p_organization_id);
945        FETCH c_get_default_parameters INTO
946           l_LPN_PREFIX,
947           l_LPN_SUFFIX,
948           l_LPN_STARTING_NUMBER ,
949           l_TOTAL_LPN_LENGTH;
950        CLOSE c_get_default_parameters;
951        IF l_TOTAL_LPN_LENGTH IS NOT NULL THEN
952           l_cont_name_dig := length(l_TOTAL_LPN_LENGTH) -
953              nvl(length(l_LPN_SUFFIX),0) -
954              NVL(length(l_LPN_PREFIX),0);
955           IF l_cont_name_dig < 0 THEN
956              l_cont_name_dig := NULL;
957           END IF;
958        END IF;
959        Create_Multiple_Cont_name (
960           p_cont_name     => NULL,
961           p_cont_name_pre => l_LPN_PREFIX,
962           p_cont_name_suf => l_LPN_SUFFIX,
963           p_cont_name_num => l_LPN_STARTING_NUMBER,
964           p_cont_name_dig => l_cont_name_dig,
965           p_quantity      => p_num_of_containers,
966           x_cont_names    => l_container_info_rec.container_names,
967           x_return_status => l_return_status
968        );
969        wsh_util_core.api_post_call
970          (
971            p_return_status => l_return_status,
972            x_num_warnings  => l_num_warnings,
973            x_num_errors    => l_num_errors
974        );
975        i := l_container_info_rec.container_names.FIRST;
976        WHILE i IS NOT NULL LOOP
977          IF l_debug_on THEN
978 	    WSH_DEBUG_SV.log(l_module_name,'container_name', l_container_info_rec.container_names(i));
979          END IF;
980          l_container_info_rec.lpn_ids(i) := NULL;
981          i := l_container_info_rec.container_names.NEXT(i);
982        END LOOP;
983        END IF ; --} bmso
984     ELSE --}{
985        IF p_caller LIKE 'WSH_IB%' THEN --{
986           l_container_rec.container_name := x_cont_name;
987           l_organization_id := p_organization_id;
988           l_inventory_item_id := NULL;
989           l_container_info_rec.container_names(1) := l_container_rec.container_name;
990           l_container_info_rec.lpn_ids(1) := p_lpn_id;
991        ELSE --}{
992           OPEN  c_get_lpn_info(p_lpn_id);
993           FETCH c_get_lpn_info INTO
994              l_container_rec.gross_weight,
995              l_container_rec.weight_uom_code,
996              l_additional_cont_attr.tare_weight_uom_code,
997              l_additional_cont_attr.tare_weight,
998              --l_container_rec.volume,
999              --l_container_rec.volume_uom_code,
1000              l_container_rec.filled_volume,
1001              l_additional_cont_attr.filled_volume_uom_code,
1002              l_container_rec.locator_id,
1003              l_container_rec.subinventory,
1004              l_container_rec.container_name,
1005              l_organization_id,
1006              l_inventory_item_id;
1007 
1008              IF  c_get_lpn_info%NOTFOUND THEN
1009 	        IF l_debug_on THEN
1010 	           WSH_DEBUG_SV.log(l_module_name,'Error invalid Lpn_id ',
1014              END IF;
1011                                                                      p_lpn_id);
1012                 END IF;
1013                 RAISE FND_API.G_EXC_ERROR;
1015 
1016 /*
1017                 --compute the net weight
1018              IF (l_inventory_item_id IS NOT NULL)
1019                AND (l_tare_wt IS NOT NULL)
1020                AND (l_tare_wt_uom IS NOT NULL)
1021                AND (l_container_rec.weight_uom_code IS NOT NULL)
1022                AND (l_container_rec.gross_weight IS NOT NULL)
1023             THEN
1024                 l_net_weight := l_container_rec.gross_weight
1025                            -       WSH_WV_UTILS.Convert_Uom (l_tare_wt_uom,
1026                                            l_container_rec.weight_uom_code,
1027                                            l_tare_wt,
1028                                            l_inventory_item_id);
1029              END IF;
1030              IF l_debug_on THEN
1031 	         WSH_DEBUG_SV.log(l_module_name,'l_net_weight ',l_net_weight);
1032              END IF;
1033              l_container_rec.net_weight:= l_net_weight;
1034 */
1035              l_container_info_rec.container_names(1) := l_container_rec.container_name;
1036              l_container_info_rec.lpn_ids(1) := p_lpn_id;
1037 
1038           CLOSE c_get_lpn_info;
1039        END IF; --}
1040 
1041        IF p_organization_id IS NULL AND  l_organization_id IS NULL THEN
1042            FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ORG_NULL');
1043            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1044            WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1045            --
1046            IF l_debug_on THEN
1047                WSH_DEBUG_SV.pop(l_module_name);
1048            END IF;
1049            --
1050            return;
1051        END IF;
1052 
1053     END IF; --}
1054 
1055     l_container_rec.organization_id := NVL(p_organization_id,l_organization_id);
1056     l_container_rec.inventory_item_id := l_inventory_item_id;
1057     l_container_rec.container_type_code := p_container_type_code;
1058     l_container_rec.ignore_for_planning := p_ignore_for_planning;
1059 
1060     default_container_attr(l_container_rec,
1061                            l_additional_cont_attr ,
1062                            p_caller,
1063                            l_return_status);
1064 
1065     wsh_util_core.api_post_call
1066          (
1067            p_return_status => l_return_status,
1068            x_num_warnings  => l_num_warnings,
1069            x_num_errors    => l_num_errors
1070     );
1071    --lpn conv
1072 
1073 
1074 
1075     -- Populate Delivery Detail id and Delivery Assignment id
1076     -- within the Loop
1077 
1078     IF l_debug_on THEN
1079        WSH_DEBUG_SV.logmsg(l_module_name, 'CREATING DELIVERY DETAIL'||p_num_of_containers  );
1080        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.CREATE_DELIVERY_DETAILS_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
1081     END IF;
1082     --
1083 
1084 
1085     WSH_DELIVERY_DETAILS_PKG.create_delivery_details_bulk
1086        ( p_delivery_details_info => l_container_rec,
1087          p_num_of_rec            => p_num_of_containers,
1088          p_container_info_rec    => l_container_info_rec,
1089          x_return_status         => x_return_status,
1090          x_dd_id_tab             => l_cont_dummy_tab
1091        );
1092 
1093     --
1094     IF l_debug_on THEN
1095        WSH_DEBUG_SV.logmsg(l_module_name, 'Return status ' || x_return_status);
1096        WSH_DEBUG_SV.logmsg(l_module_name, 'CREATED DELIVERY DETAIL ' || l_cont_dummy_tab.count);
1097    END IF;
1098    --
1099 
1100    IF x_return_status IN
1101       (WSH_UTIL_CORE.G_RET_STS_ERROR,
1102        WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR  ) THEN
1103       --
1104       IF l_debug_on THEN
1105          WSH_DEBUG_SV.logmsg(l_module_name, 'ERROR CREATING CONTAINER' || TO_CHAR ( L_CONT_INSTANCE_ID )  );
1106       END IF;
1107       --
1108       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
1109       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1110       --
1111       IF l_debug_on THEN
1112 	        WSH_DEBUG_SV.pop(l_module_name);
1113       END IF;
1114       --
1115       return;
1116    END IF;
1117 
1118    l_first := l_cont_dummy_tab.FIRST;
1119    OPEN c_get_rowid(l_cont_dummy_tab(l_first));
1120    FETCH c_get_rowid INTO x_row_id, x_cont_name;
1121    CLOSE c_get_rowid;
1122    --
1123    IF l_debug_on THEN
1124        WSH_DEBUG_SV.log(l_module_name, 'x_row_id',x_row_id);
1125        WSH_DEBUG_SV.log(l_module_name, 'x_cont_name',x_cont_name);
1126        WSH_DEBUG_SV.logmsg(l_module_name, 'CREATED CONTAINER DELIVERY DETAIL ');
1127    END IF;
1128    --
1129 
1130    l_del_assg_rec.delivery_id := null;
1131    l_del_assg_rec.delivery_detail_id := l_cont_instance_id;
1132    l_del_assg_rec.parent_delivery_detail_id := null;
1133 
1134    --
1135    IF l_debug_on THEN
1136        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.CREATE_DELIV_ASSIGNMENT_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
1137        --WSH_DEBUG_SV.logmsg(l_module_name,'NUMBER OF CONTS'||p_num_of_containers);
1138        WSH_DEBUG_SV.logmsg(l_module_name,'NUMBER OF RECORDS IN WDD '||l_cont_dummy_tab.count);
1139    END IF;
1140    --
1141 
1142    WSH_DELIVERY_DETAILS_PKG.create_deliv_assignment_bulk
1143        ( p_delivery_assignments_info => l_del_assg_rec,
1144          p_num_of_rec => p_num_of_containers,
1148    );
1145          p_dd_id_tab  =>  l_cont_dummy_tab,
1146          x_da_id_tab => l_assignment_dummy_tab,
1147          x_return_status => x_return_status
1149 
1150    IF l_debug_on THEN
1151       WSH_DEBUG_SV.logmsg(l_module_name,'COUNT OF WDA RECORDS'||l_assignment_dummy_tab.count);
1152       WSH_DEBUG_SV.logmsg(l_module_name,'Create Delivery Assignment, Return Status'||x_return_status);
1153    END IF;
1154 
1155    IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
1156                              WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
1157 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
1158 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1159 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1160         --
1161         IF l_debug_on THEN
1162             WSH_DEBUG_SV.pop(l_module_name);
1163         END IF;
1164         --
1165         return;
1166    END IF;
1167 
1168    --x_cont_instance_id := l_cont_instance_id; lpn conv
1169    l_first := l_cont_dummy_tab.FIRST;
1170    IF l_first IS NOT NULL THEN
1171       x_cont_instance_id := l_cont_dummy_tab(l_first);
1172    END IF;
1173    x_cont_tab := l_cont_dummy_tab;
1174    -- J: W/V Changes
1175    x_unit_weight := l_container_rec.unit_weight;
1176    x_unit_volume := l_container_rec.unit_volume;
1177    x_weight_uom_code := l_container_rec.weight_uom_code;
1178    x_volume_uom_code := l_container_rec.volume_uom_code;
1179 
1180    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1181 
1182    --
1183    IF l_debug_on THEN
1184      WSH_DEBUG_SV.pop(l_module_name);
1185    END IF;
1186    --
1187 EXCEPTION
1188     WHEN FND_API.G_EXC_ERROR THEN
1189       WSH_WMS_LPN_GRP.g_call_group_api := l_orig_value;
1190       WSH_WMS_LPN_GRP.g_update_to_container := l_orig_update_cont_value;
1191       IF c_get_lpn_info%ISOPEN THEN
1192          CLOSE c_get_lpn_info;
1193       END IF;
1194       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1195 
1196       IF l_debug_on THEN
1197         WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1198         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
1199       END IF;
1200 
1201   WHEN Others THEN
1202         WSH_WMS_LPN_GRP.g_call_group_api := l_orig_value;
1203         WSH_WMS_LPN_GRP.g_update_to_container := l_orig_update_cont_value;
1204 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Create_Cont_Instance_Multi',l_module_name);
1205 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1206 
1207 --
1208 IF l_debug_on THEN
1209     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
1210     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
1211 END IF;
1212 --
1213 END Create_Cont_Instance_Multi;
1214 
1215 --
1216 /*
1217 -----------------------------------------------------------------------------
1218    PROCEDURE  : Create_Container_Instance
1219    PARAMETERS : p_cont_name - name for the container
1220 		p_cont_item_id - container item id (containers inv item id)
1221 		x_cont_instance_id - delivery_detail_id for new container - if
1222 		null then it will return a new id
1223 		p_par_detail_id - the parent detail id (parent container)
1224 		p_organization_id - organization id
1225 		p_container_type_code - the container type code of container
1226 		x_row_id - rowid of the new container record
1227 		x_return_status - return status of API
1228   DESCRIPTION : This procedure creates a new container and defaults some of the
1229 		container item attributes. The container item id of the
1230 		container that is being created is required. If	the container
1231 		name is not specified it defaults the name to be equal to the
1232 		delivery detail id.
1233 
1234                  PLEASE DO NOT USE THIS PROCEDURE ANYMORE
1235 
1236 ------------------------------------------------------------------------------
1237 */
1238 --
1239 --THIS PROCEDURE IS OBSOLETE
1240 PROCEDURE Create_Container_Instance (
1241   x_cont_name IN OUT NOCOPY  VARCHAR2,
1242   p_cont_item_id IN NUMBER,
1243   x_cont_instance_id IN OUT NOCOPY  NUMBER,
1244   p_par_detail_id IN NUMBER,
1245   p_organization_id IN NUMBER,
1246   p_container_type_code IN VARCHAR2,
1247   x_row_id OUT NOCOPY  VARCHAR2,
1248   x_return_status OUT NOCOPY  VARCHAR2) IS
1249 
1250 BEGIN
1251 
1252  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1253 
1254 END Create_Container_Instance;
1255 
1256 
1257 /*
1258 -----------------------------------------------------------------------------
1259    PROCEDURE  : Create_Multiple_Containers
1260    PARAMETERS : p_cont_item_id - container item id (containers inv item id)
1261 		p_organization_id - organization id
1262 		p_container_type_code - the container type code of container
1263 		p_cont_name - name for the container if qty is 1 (mainly used
1264 				by public APIs)
1265 		p_cont_name_pre - prefix for container name
1266 		p_cont_name_suf - suffix for container name
1267 		p_cont_name_num - starting number for number part of container
1268 				  name
1269 		p_cont_name_dig - number of digits to use for the number part
1270 				  of the container name
1271 		p_quantity - number of containers to create
1272 		x_cont_instance_tab - table of delivery_detail_ids for new
1273 				  containers - if null then it will return a
1274 				  table with new ids
1275 		x_return_status - return status of API
1276   DESCRIPTION : This procedure creates a new container and defaults some of the
1277 		container item attributes. The container item id of the
1281 ------------------------------------------------------------------------------
1278 		container that is being created is required. If	the container
1279 		name is not specified it defaults the name to be equal to the
1280 		delivery detail id.
1282 */
1283 
1284 -- THIS PROCEDURE IS OBSOLETE
1285 
1286 PROCEDURE Create_Multiple_Containers (
1287   p_cont_item_id IN NUMBER,
1288   p_organization_id IN NUMBER,
1289   p_container_type_code IN VARCHAR2,
1290   p_cont_name IN VARCHAR2,
1291   p_cont_name_pre IN VARCHAR2,
1292   p_cont_name_suf IN VARCHAR2,
1293   p_cont_name_num IN NUMBER,
1294   p_cont_name_dig IN NUMBER,
1295   p_quantity IN NUMBER,
1296   x_cont_instance_tab IN OUT NOCOPY  WSH_UTIL_CORE.id_tab_type,
1297   x_return_status OUT NOCOPY  VARCHAR2) IS
1298 
1299 --
1300 BEGIN
1301 
1302   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1303 
1304 END Create_Multiple_Containers;
1305 
1306 
1307 /*
1308 -----------------------------------------------------------------------------
1309    PROCEDURE  : Delete_Containers
1310    PARAMETERS : p_cont_tab - table of container instances to be deleted.
1311                 x_return_status - return status of API
1312   DESCRIPTION : This procedure in a  container instance and
1313                 deletes the container.  If the containers are not empty or
1314                 they are assigned to deliveries that are not open, they will
1315                 not be deleted. Also, if the containers are either assigned to
1316                 or container other containers packed into it, they will not be
1317                 deleted.
1318 ------------------------------------------------------------------------------
1319 */
1320 
1321 
1322 PROCEDURE Delete_Containers (
1323   p_container_id IN number,
1324   x_return_status OUT NOCOPY  VARCHAR2) IS
1325 
1326 CURSOR Check_Hierarchy (v_detail_id NUMBER) IS
1327 SELECT 'NOT EMPTY' FROM DUAL
1328 WHERE EXISTS (
1329 SELECT delivery_detail_id
1330 FROM wsh_delivery_assignments
1331 WHERE parent_delivery_detail_id = v_detail_id
1332 AND NVL(type, 'S') in ('C', 'S')
1333 AND rownum < 2
1334 UNION
1335 SELECT delivery_detail_id
1336 FROM wsh_delivery_assignments
1337 WHERE delivery_detail_id = v_detail_id
1338 AND parent_delivery_detail_id IS NOT NULL
1339 AND NVL(type, 'S') in ('C', 'S')
1340 AND rownum < 2);
1341 
1342 CURSOR Check_Container (v_detail_id NUMBER) IS
1343 SELECT container_flag
1344 FROM WSH_DELIVERY_DETAILS
1345 WHERE delivery_detail_id = v_detail_id;
1346 
1347 
1348 
1349 l_cont_status   VARCHAR2(30) := 'EMPTY';
1350 l_container_flag VARCHAR2(1);
1351 
1352 l_del_id        NUMBER;
1353 l_del_sts       VARCHAR2(10);
1354 
1355 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1356 
1357 
1358 Invalid_Container  EXCEPTION;
1359 Invalid_Delivery   EXCEPTION;
1360 Invalid_Detail     EXCEPTION;
1361 Delete_Det_Error   EXCEPTION;
1362 Cont_Not_Empty     EXCEPTION;
1363 Container_Error    EXCEPTION;
1364 Unassign_Del_Error EXCEPTION;
1365 
1366 --
1367 l_debug_on BOOLEAN;
1368 --
1369 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'DELETE_CONTAINERS';
1370 --
1371 BEGIN
1372         --
1373         --
1374         l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
1375         --
1376         IF l_debug_on IS NULL
1377         THEN
1378             l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
1379         END IF;
1380         --
1381         IF l_debug_on THEN
1382             WSH_DEBUG_SV.push(l_module_name);
1383             --
1384             WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_ID',P_CONTAINER_ID);
1385         END IF;
1386         --
1387         x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1388         SAVEPOINT Delete_Cont;
1389         IF (NVL(p_container_id,0) = 0) THEN
1390                 raise Invalid_Container;
1391         ELSE
1392          OPEN Check_Container (p_container_id);
1393          IF Check_Container%NOTFOUND THEN
1394                 raise Invalid_Detail;
1395          ELSE
1396            FETCH Check_Container INTO l_container_flag;
1397            IF l_container_flag = 'N' THEN
1398                 raise Invalid_Detail;
1399            END IF;
1400          END IF;
1401          IF Check_Container%ISOPEN THEN
1402            CLOSE Check_Container;
1403          END IF;
1404         END IF;
1405         -- get the delivery status of the container and check if it is assigned
1406         -- to a closed or in-transit delivery (only open deliveries allowed)
1407 
1408         --
1409         IF l_debug_on THEN
1410             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
1411         END IF;
1412         --
1413         WSH_CONTAINER_UTILITIES.Get_Delivery_Status (
1414                                                 p_container_id,
1415                                                 l_del_id,
1416                                                 l_del_sts,
1417                                                 x_return_status);
1418 
1419         IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
1420           raise Container_Error;
1421         END IF;
1422         IF ((nvl(l_del_id,-99) <> -99) AND (nvl(l_del_sts,'N/A') <> 'OP')) THEN
1423                     raise Invalid_Delivery;
1424         END IF;
1425         l_cont_status := 'EMPTY';
1426 
1430 
1427         OPEN Check_Hierarchy (p_container_id);
1428 
1429         FETCH Check_Hierarchy INTO l_cont_status;
1431         IF Check_Hierarchy%NOTFOUND THEN
1432 
1433 
1434                 --
1435                 IF l_debug_on THEN
1436                     WSH_DEBUG_SV.log(l_module_name,'Delivery Status',l_del_sts);
1437                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.DELETE_DELIVERY_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
1438                 END IF;
1439                 --
1440                 WSH_DELIVERY_DETAILS_PKG.Delete_Delivery_Details (
1441                                  p_rowid              => null,
1442                                  p_delivery_detail_id => p_container_id,
1443                                  x_return_status      => x_return_status);
1444 
1445                 --
1446                 IF l_debug_on THEN
1447                     WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
1448                 END IF;
1449                 --
1450 
1451                 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1452                     raise Container_Error;
1453                 END IF;
1454 
1455         ELSE
1456 
1457                 IF (nvl(l_cont_status,'EMPTY') <> 'EMPTY') THEN
1458                    raise Cont_Not_Empty;
1459                 ELSE
1460                     raise Container_Error;
1461                 END IF;
1462         END IF;
1463 
1464         IF Check_Hierarchy%ISOPEN THEN
1465                      CLOSE Check_Hierarchy;
1466         END IF;
1467 
1468 
1469 --
1470 IF l_debug_on THEN
1471     WSH_DEBUG_SV.pop(l_module_name);
1472 END IF;
1473 --
1474 EXCEPTION
1475 
1476   WHEN Invalid_Container  THEN
1477         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NULL_DELETE');
1478         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1479         WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1480         --
1481         IF l_debug_on THEN
1482             WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_CONTAINER exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1483             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_CONTAINER');
1484         END IF;
1485         --
1486   WHEN Invalid_Delivery   THEN
1487         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
1488         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1489         WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1490         --
1491         IF l_debug_on THEN
1492             WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DELIVERY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1493             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_DELIVERY');
1494         END IF;
1495         --
1496   WHEN Invalid_Detail     THEN
1497         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DELETE_NOT_CONT');
1498         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1499         WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1500         --
1501         IF l_debug_on THEN
1502             WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DETAIL exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1503             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_DETAIL');
1504         END IF;
1505         --
1506   WHEN Cont_Not_Empty     THEN
1507         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DELETE_NOT_EMPTY');
1508         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1509         WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1510         --
1511         IF l_debug_on THEN
1512             WSH_DEBUG_SV.logmsg(l_module_name,'CONT_NOT_EMPTY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1513             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CONT_NOT_EMPTY');
1514         END IF;
1515         --
1516   WHEN Container_Error    THEN
1517         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1518         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DELETE_ERROR');
1519         WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1520         --
1521         IF l_debug_on THEN
1522             WSH_DEBUG_SV.logmsg(l_module_name,'CONTAINER_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1523             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CONTAINER_ERROR');
1524         END IF;
1525         --
1526   WHEN Unassign_Del_Error THEN
1527         ROLLBACK to Delete_Cont;
1528         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1529         FND_MESSAGE.SET_NAME('WSH','WSH_UNASSIGN_DEL_ERROR');
1530         WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1531 
1532 --
1533 IF l_debug_on THEN
1534     WSH_DEBUG_SV.logmsg(l_module_name,'UNASSIGN_DEL_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1535     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:UNASSIGN_DEL_ERROR');
1536 END IF;
1537 --
1538   WHEN Others THEN
1539         WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Delete_Containers',l_module_name);
1540         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1541 
1542 --
1543 IF l_debug_on THEN
1544     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
1545     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
1546 END IF;
1547 --
1548 END Delete_Containers;
1549 
1550 -- THIS PROCEDURE IS OBSOLETE
1551 /*
1552 -----------------------------------------------------------------------------
1553    PROCEDURE  : Update_Container
1554    PARAMETERS : p_container_name - new container name that needs to be assigned
1555 		to the existing container.
1559 		to be used only if container instance id in the input parameter
1556 		p_container_instance_id - the delivery detail id for the
1557 		container that needs to be updated.
1558 		p_old_cont_name - exisiting container name for the container,
1560 		is null.
1561 		x_return_status - return status of API
1562   DESCRIPTION : This procedure takes in a new container name and existing
1563 		container information like the delivery detail id and existing
1564 		container name that needs to be updated. The API checks to see
1565 		if the container that is being updated is assigned to a closed,
1566 		confirmed or in-transit delivery. If it is, no update is
1567 		allowed - if not, only the container name can be updated.
1568 ------------------------------------------------------------------------------
1569 */
1570 
1571 
1572 --THIS PROCEDURE IS OBSOLETE
1573 PROCEDURE Update_Container (
1574   p_container_name IN VARCHAR2,
1575   p_container_instance_id IN NUMBER,
1576   p_old_cont_name IN VARCHAR2,
1577   x_return_status OUT NOCOPY  VARCHAR2) IS
1578 
1579 BEGIN
1580 
1581  x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1582 
1583 END Update_Container;
1584 
1585 
1586 
1587 /*
1588 -----------------------------------------------------------------------------
1589    PROCEDURE  : Assign_Detail
1590    PARAMETERS : p_container_instance_id - container instance id of container
1591 		p_del_detail_tab - table of delivery detail ids
1592 		x_pack_status - status of container after packing the lines
1593 			into it : underpacked or overpacked
1594 		x_return_status - return status of API
1595   DESCRIPTION : This procedure assigns a number of lines to the specified
1596 		container instance and returns a pack status of underpacked
1597 		or overpacked or success.
1598 ------------------------------------------------------------------------------
1599 */
1600 
1601 
1602 PROCEDURE Assign_Detail(
1603   p_container_instance_id IN NUMBER,
1604   p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
1605   x_pack_status OUT NOCOPY  VARCHAR2,
1606   x_return_status OUT NOCOPY  VARCHAR2,
1607   p_check_credit_holds IN BOOLEAN) IS
1608 
1609   CURSOR Get_First_Line (v_cont_instance_id NUMBER) IS
1610   SELECT delivery_detail_id
1611   FROM wsh_delivery_assignments_v
1612   WHERE parent_delivery_detail_id = v_cont_instance_id
1613   AND rownum < 2;
1614 
1615   CURSOR Get_Cont_Item IS
1616   SELECT inventory_item_id, master_serial_number
1617   FROM WSH_DELIVERY_DETAILS
1618   WHERE delivery_detail_id = p_container_instance_id
1619   AND container_flag = 'Y';
1620 
1621   CURSOR Get_Det_Cont_Item (v_detail_id NUMBER) IS
1622   SELECT nvl(detail_container_item_id, master_container_item_id),
1623 	 source_line_id, source_header_id,source_code
1624   FROM WSH_DELIVERY_DETAILS
1625   WHERE delivery_detail_id = v_detail_id
1626   AND container_flag = 'N';
1627 
1628   l_del_detail_id	WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
1629 
1630   l_group_id_tab 	WSH_UTIL_CORE.id_tab_type;
1631 --  l_temp_detail_tab	WSH_UTIL_CORE.id_tab_type;
1632 
1633   l_src_line_id		NUMBER;
1634   l_src_hdr_id		NUMBER;
1635   l_source_code         VARCHAR2(30);
1636 
1637   cnt			NUMBER;
1638   i			NUMBER;
1639   l_group_id		NUMBER;
1640 
1641   l_del_rows		WSH_UTIL_CORE.id_tab_type;
1642   l_ret_sts		VARCHAR2(1);
1643 
1644   l_cont_name VARCHAR2(30);
1645   l_delivery_id NUMBER;
1646   l_del_status VARCHAR2(10);
1647 
1648   l_det_cont_item_id NUMBER;
1649   l_cont_item_id NUMBER;
1650 
1651   l_tmp_status VARCHAR2(30) := 'OK';
1652 
1653   l_attr_flag VARCHAR2(1) := 'N';
1654 
1655   l_upd_flag BOOLEAN := FALSE;
1656 
1657   l_master_serial_number VARCHAR2(30);
1658   l_master_cont_id	NUMBER;
1659   l_master_cont_name    VARCHAR2(30);
1660 
1661   l_attr_tab  wsh_delivery_autocreate.grp_attr_tab_type;
1662   l_group_tab  wsh_delivery_autocreate.grp_attr_tab_type;
1663   l_action_rec wsh_delivery_autocreate.action_rec_type;
1664   l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
1665   l_matched_entities wsh_util_core.id_tab_type;
1666   l_out_rec wsh_delivery_autocreate.out_rec_type;
1667 
1668 
1669 
1670 --
1671 l_debug_on BOOLEAN;
1672 --
1673 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'ASSIGN_DETAIL';
1674 --
1675 BEGIN
1676 
1677   --
1678   --
1679   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
1680   --
1681   IF l_debug_on IS NULL
1682   THEN
1683       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
1684   END IF;
1685   --
1686   IF l_debug_on THEN
1687       WSH_DEBUG_SV.push(l_module_name);
1688       --
1689       WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
1690       WSH_DEBUG_SV.log(l_module_name,'P_CHECK_CREDIT_HOLDS',P_CHECK_CREDIT_HOLDS);
1691   END IF;
1692   --
1693   IF p_del_detail_tab.COUNT = 0 THEN
1694      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1695      FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_DET_ASSG_NULL');
1696      WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1697      --
1698      IF l_debug_on THEN
1699          WSH_DEBUG_SV.pop(l_module_name);
1700      END IF;
1701      --
1702      return;
1703   END IF;
1704 
1705   -- get the delivery status of the container and check if it is assigned
1706   -- to a closed or in-transit delivery (only open deliveries allowed)
1710       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
1707 
1708   --
1709   IF l_debug_on THEN
1711   END IF;
1712   --
1713   WSH_CONTAINER_UTILITIES.Get_Delivery_Status ( p_container_instance_id,
1714 						l_delivery_id,
1715 						l_del_status,
1716 						x_return_status);
1717 
1718   IF l_debug_on THEN
1719     WSH_DEBUG_SV.log(l_module_name,'Delivery Status',l_del_status);
1720     WSH_DEBUG_SV.log(l_module_name,'x_return_status',x_return_status);
1721   END IF;
1722   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1723 	--
1724 	IF l_debug_on THEN
1725 	    WSH_DEBUG_SV.pop(l_module_name);
1726 	END IF;
1727 	--
1728 	return;
1729   END IF;
1730 
1731   IF (nvl(l_delivery_id,-99) <> -99) THEN
1732 
1733 	IF (nvl(l_del_status,'N/A') NOT IN  ('OP','SA')) THEN
1734 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
1735 		x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1736 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1737 		x_pack_status := 'Error';
1738 		--
1739 		IF l_debug_on THEN
1740 		    WSH_DEBUG_SV.pop(l_module_name);
1741 		END IF;
1742 		--
1743 		return;
1744 	END IF;
1745   END IF;
1746 
1747 
1748   -- check container attributes to see if the attr columns have been populated
1749   -- if they are not null - it implies that lines are already assigned to the
1750   -- container in the hierarchy. so call the autocreate deliveries API with the
1751   -- container as the first line..
1752 
1753   --
1754   IF l_debug_on THEN
1755       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
1756   END IF;
1757   --
1758   wsh_container_actions.Check_Cont_Attributes (
1759 					p_container_instance_id,
1760 					l_attr_flag,
1761 					x_return_status);
1762 
1763   --
1764   IF l_debug_on THEN
1765       WSH_DEBUG_SV.log(l_module_name,' after CHECK_CONT_ATTRIBUTES, return status is',x_return_status);
1766   END IF;
1767 
1768   --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);
1769 
1770   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1771 	--
1772 	-- Debug Statements
1773 	--
1774 	IF l_debug_on THEN
1775 	    WSH_DEBUG_SV.pop(l_module_name);
1776 	END IF;
1777 	--
1778 	return;
1779   END IF;
1780 
1781   IF l_attr_flag = 'N' THEN
1782 	i := 1;
1783   ELSE
1784 	l_attr_tab(1).entity_id := p_container_instance_id;
1785 	l_attr_tab(1).entity_type := 'DELIVERY_DETAIL';
1786 	i := 2;
1787   END IF;
1788 
1789 
1790   FOR j IN 1.. p_del_detail_tab.COUNT LOOP
1791      l_attr_tab(i).entity_id := p_del_detail_tab(j);
1792      l_attr_tab(i).entity_type := 'DELIVERY_DETAIL';
1793      i := i + 1;
1794   END LOOP;
1795 
1796   IF Get_First_Line%ISOPEN THEN
1797   	CLOSE Get_First_Line;
1798   END IF;
1799 
1800   -- call auto_create del grouping API with l_temp_detail_tab returning
1801   -- l_group_id_tab of type WSH_UTIL_CORE.id_tab_type;
1802 
1803   --
1804   IF l_debug_on THEN
1805       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
1806   END IF;
1807   --
1808    l_action_rec.action := 'MATCH_GROUPS';
1809 
1810 
1811 
1812    WSH_Delivery_AutoCreate.Find_Matching_Groups(p_attr_tab => l_attr_tab,
1813                                                    p_action_rec => l_action_rec,
1814                                                    p_target_rec => l_target_rec,
1815                                                    p_group_tab => l_group_tab,
1816                                                    x_matched_entities => l_matched_entities,
1817                                                    x_out_rec => l_out_rec,
1818                                                    x_return_status => x_return_status);
1819 
1820   --
1821   IF (x_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
1822 	--dbms_output.put_line('error in autocreate');
1823 	FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
1824         WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1825 	--
1826   END IF;
1827 
1828   i := l_attr_tab.FIRST;
1829 
1830   l_group_id := l_attr_tab(i).group_id;
1831 
1832   -- if l_attr_flag = Y then it means that the first record in the PL/SQL table
1833   -- is the container itself and it should be ignored. so increment counters.
1834 
1835   IF l_attr_flag = 'Y' THEN
1836 	i := i + 1;
1837   END IF;
1838 
1839   l_del_detail_id := l_attr_tab(i).entity_id;
1840   l_ret_sts := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1841 
1842   OPEN Get_Cont_Item;
1843 
1844   FETCH Get_Cont_Item INTO l_cont_item_id,l_master_serial_number;
1845 
1846   IF Get_Cont_Item%NOTFOUND THEN
1847 	CLOSE Get_Cont_Item;
1848 	l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
1849 	--
1850 	IF l_debug_on THEN
1851 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
1852 	END IF;
1853 	--
1854 	l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
1855 	FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
1859 	x_pack_status := 'Error';
1856 	FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
1857 	WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
1858 	x_return_status := l_ret_sts;
1860 	--
1861 	IF l_debug_on THEN
1862 	    WSH_DEBUG_SV.pop(l_module_name);
1863 	END IF;
1864 	--
1865 	return;
1866   END IF;
1867 
1868   IF Get_Cont_Item%ISOPEN THEN
1869 	CLOSE Get_Cont_Item;
1870   END IF;
1871 
1872 
1873   WHILE  i <= l_attr_tab.COUNT LOOP
1874 
1875      IF l_group_id = l_attr_tab(i).group_id THEN
1876 
1877 
1878 	l_del_detail_id := l_attr_tab(i).entity_id;
1879 	l_src_line_id := NULL;
1880  	l_src_hdr_id := NULL;
1881 
1882 	-- check if the detail container item id on the line matches the
1883 	-- container item id of the container that it is being assigned to
1884 
1885         OPEN Get_Det_Cont_Item (l_del_detail_id);
1886 
1887 	FETCH Get_Det_Cont_Item INTO
1888 	      l_det_cont_item_id,
1889 	      l_src_line_id,
1890 	      l_src_hdr_id,l_source_code;
1891 
1892 	IF Get_Det_Cont_Item%NOTFOUND THEN
1893 	   CLOSE Get_Det_Cont_Item;
1894 	   l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
1895            l_tmp_status := 'Error';
1896 	   GOTO next_line;
1897 	 END IF;
1898 
1899 	 IF Get_Det_Cont_Item%ISOPEN THEN
1900 	    CLOSE Get_Det_Cont_Item;
1901 	 END IF;
1902 
1903 	 IF l_cont_item_id <> nvl(l_det_cont_item_id,l_cont_item_id) THEN
1904 		FND_MESSAGE.SET_NAME('WSH','WSH_DET_CONT_ITEM_DIFF');
1905 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
1906 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
1907 		IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
1908 		   l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
1909 		END IF;
1910 	 END IF;
1911 
1912 	  -- check if the line has any holds on it. IF yes ignore the line
1913 	  -- and set a warning and proceed to the next line.
1914 
1915 	--
1916 	--
1917 	-- added to fix bug 1818233.
1918 	-- Auto-pack performs 90% of time doing this check, especially
1919 	-- when a single delivery line is being split into multiple due to
1920 	-- container-load relationship.
1921 	-- This check will be made only once for a delivery line in place of
1922 	-- doing it every time we assign a split delivery line to a container.
1923 	-- Thus, auto-pack lines will always call assign_detail procedure
1924 	-- with parameter p_check_credit_holds = FALSE.
1925 	-- Auto-pack lines will explicitly call the procedure
1926 	-- WSH_DETAILS_VALIDATIONS.Check_Credit_Holds only once for a delivery
1927 	-- line
1928 	--
1929         IF p_check_credit_holds
1930 	THEN
1931 	    --
1932 	    IF l_debug_on THEN
1933 	        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_CREDIT_HOLDS',WSH_DEBUG_SV.C_PROC_LEVEL);
1934 	    END IF;
1935 	    --
1936 	    WSH_DETAILS_VALIDATIONS.Check_Credit_Holds (
1937 					l_del_detail_id,
1938 					'PACK',
1939 					l_src_line_id,
1940 					l_src_hdr_id,
1941                                         l_source_code,
1942 					'Y',
1943 					x_return_status);
1944 
1945             --
1946             IF l_debug_on THEN
1947               WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
1948             END IF;
1949             --
1950 	    IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1951 		IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
1952 		   l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
1953 		END IF;
1954 		l_tmp_status := 'Error';
1955 		GOTO next_line;
1956 	    END IF;
1957 	END IF;
1958 
1959 	-- check if line has any invalid hazmat codes - either by itself
1960 	-- or if there is any incompatability with any existing lines in
1961 	-- the container.
1962 
1963 	-- currently there is no code for this and so the API returns a
1964 	-- success always..
1965 
1966 	--
1967 	IF l_debug_on THEN
1968 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.VALIDATE_HAZARD_CLASS',WSH_DEBUG_SV.C_PROC_LEVEL);
1969 	END IF;
1970 	--
1971 	WSH_CONTAINER_UTILITIES.Validate_Hazard_Class (
1972 		l_del_detail_id,
1973 		p_container_instance_id,
1974 		x_return_status);
1975 
1976 	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1977 		IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
1978 		   l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
1979 		END IF;
1980 		l_tmp_status := 'Error';
1981 		GOTO next_line;
1982 	END IF;
1983 
1984 	-- create assignment with l_del_detail_id and p_container_instance_id;
1985 
1986         --
1987         IF l_debug_on THEN
1988                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_DETAIL_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
1989         END IF;
1990         --
1991         WSH_DELIVERY_DETAILS_ACTIONS.Assign_Detail_To_Cont (
1992 		l_del_detail_id,
1993 		p_container_instance_id,
1994 		x_return_status);
1995 
1996             --
1997         IF l_debug_on THEN
1998           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
1999         END IF;
2000         --
2001 	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2002            IF x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
2003               l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
2004            ELSE
2005 		-- l_ret_sts := x_return_status;
2009 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
2006 		--dbms_output.put_line('error assigning ' || l_del_detail_id);
2007 		l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
2008 	     	FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_DETAIL_NOT_ASSIGNED');
2010  	    	WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
2011 	    END IF;
2012 	 END IF;
2013 
2014 	 -- store group id to check for group id of next line
2015 	 -- l_group_id := l_group_id_tab(cnt);
2016 
2017 	    -- now update the container grouping attribute columns with the
2018 	    -- attributes from the delivery details (only for first line).
2019             -- we need to do this regardless of the fact the the line may have
2020             -- grouping attributes populated as in the case of updating line direction
2021             -- of a container already assigned to a delivery.
2022 
2023             IF NOT l_upd_flag THEN
2024 
2025 		--dbms_output.put_line('calling update cont hierarchy with ' || p_container_instance_id);
2026 	    	--
2027 	    	IF l_debug_on THEN
2028 	    	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
2029 	    	END IF;
2030 	    	--
2031 	    	wsh_container_actions.Update_Cont_Hierarchy (
2032 						l_del_detail_id,
2033 						NULL,
2034 						p_container_instance_id,
2035 						x_return_status);
2036                 --
2037                 IF l_debug_on THEN
2038                   WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2039                 END IF;
2040                 --
2041 
2042 	    	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2043 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
2044 			--
2045 			IF l_debug_on THEN
2046 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2047 			END IF;
2048 			--
2049 			l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
2050 			FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2051 			WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2052 	    	 END IF;
2053 
2054 		 l_upd_flag := TRUE;
2055 
2056 
2057 
2058 	    END IF;
2059 
2060 	    UPDATE WSH_DELIVERY_DETAILS
2061 	    SET master_serial_number = l_master_serial_number
2062 	    WHERE delivery_detail_id = l_del_detail_id;
2063 
2064 	    IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2065   --dbms_output.put_line('error updating master serial number for detail ' || l_del_detail_id);
2066 
2067 		FND_MESSAGE.SET_NAME('WSH','WSH_DET_UPD_SER_ERROR');
2068 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
2069 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2070 	 	IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2071 			l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
2072 	    	END IF;
2073 	     END IF;
2074         ELSE
2075 
2076           l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
2077           l_tmp_status := 'Error';
2078           GOTO next_line;
2079 
2080         END IF;
2081 
2082 	<<next_line>>
2083 		IF l_tmp_status = 'Error' THEN
2084 			FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_DETAIL_NOT_ASSIGNED');
2085 			FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
2086 			WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2087 	 	END IF;
2088 
2089 	i := i + 1;
2090 	l_tmp_status := 'OK';
2091 
2092    END LOOP;
2093 
2094    x_return_status := l_ret_sts;
2095 
2096 	--
2097 	IF l_debug_on THEN
2098            WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
2099 	   WSH_DEBUG_SV.pop(l_module_name);
2100 	END IF;
2101 	--
2102 EXCEPTION
2103 
2104   WHEN Others THEN
2105 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Assign_Detail',l_module_name);
2106 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
2107 
2108 --
2109 IF l_debug_on THEN
2110     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
2111     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
2112 END IF;
2113 --
2114 END Assign_Detail;
2115 
2116 
2117 /*
2118 -----------------------------------------------------------------------------
2119    PROCEDURE  : Unassign_Detail
2120    PARAMETERS : p_container_instance_id - container instance id of container
2121 		p_delivery_id - delivery id from which detail needs to be
2122 		unassigned
2123 		p_del_detail_tab - table of delivery detail ids
2124 		p_cont_unassign - flag to determine whether to unassign from
2125 		container or not.
2126 		p_del_unassign - flag to determine whether to unassign from
2127 		delivery or not
2128 		x_pack_status - status of container after packing the lines
2129 			into it : underpacked or overpacked
2130 		x_return_status - return status of API
2131   DESCRIPTION : This procedure unassigns a number of lines from the specified
2132 		container instance or delivery and returns a pack status of
2133 		underpacked or overpacked or success. The unassigning is
2134 		determined using the two unassign flags or by specific ids.
2135 ------------------------------------------------------------------------------
2136 */
2137 
2138 
2139 
2140 PROCEDURE Unassign_Detail(
2141   p_container_instance_id IN NUMBER,
2142   p_delivery_id IN NUMBER,
2143   p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
2147   x_return_status OUT NOCOPY  VARCHAR2,
2144   p_cont_unassign IN VARCHAR2,
2145   p_del_unassign IN VARCHAR2,
2146   x_pack_status OUT NOCOPY  VARCHAR2,
2148   p_action_prms IN wsh_glbl_var_strct_grp.dd_action_parameters_rec_type
2149   ) IS
2150 
2151   l_del_detail_rec 	WSH_UTIL_CORE.ID_TAB_TYPE;
2152 
2153   l_gross 	NUMBER;
2154   l_net		NUMBER;
2155   l_volume	NUMBER;
2156 -- J: W/V Changes
2157   l_fill_status  VARCHAR2(1);
2158 
2159   l_rows	NUMBER;
2160 
2161   cnt		NUMBER;
2162 
2163   CURSOR Get_Min_Fill IS
2164   SELECT minimum_fill_percent
2165   FROM WSH_DELIVERY_DETAILS
2166   WHERE delivery_detail_id = p_container_instance_id
2167   AND container_flag = 'Y';
2168 
2169   /* wms -change : Added inentory_item_id to later check (ignore) fill pc when LPN */
2170   CURSOR Is_Container (v_detail_id NUMBER) IS
2171   SELECT container_flag, serial_number, master_serial_number, inventory_item_id
2172   FROM WSH_DELIVERY_DETAILS
2173   WHERE delivery_detail_id = v_detail_id;
2174 
2175   CURSOR Get_Cont (v_detail_id NUMBER) IS
2176   SELECT wda.parent_delivery_detail_id container_instance_id, wda.delivery_id,
2177          wddp.organization_id, nvl(wddp.line_direction,'O'),    -- K LPN CONV. rv
2178          wddp.container_flag -- K: MDC
2179   FROM wsh_delivery_assignments wda,
2180        wsh_delivery_details wddp        -- K LPN CONV. rv
2181   WHERE wda.delivery_detail_id = v_detail_id
2182   AND   wda.parent_delivery_detail_id = wddp.delivery_detail_id(+)
2183   AND   NVL(wda.type, 'S') in ('S', 'C');
2184 
2185 
2186   l_cont_flag	VARCHAR2(1);
2187   l_serial_number VARCHAR2(30);
2188   l_master_serial_number VARCHAR2(30);
2189 
2190   l_master_cont_id NUMBER;
2191   l_master_cont_name VARCHAR2(30);
2192 
2193   l_cont_name VARCHAR2(30);
2194 
2195   l_cont_instance_id NUMBER;
2196   l_cont_org_id NUMBER;  -- K LPN CONV. rv
2197   l_cont_line_dir VARCHAR2(10);  -- K LPN CONV. rv
2198   l_cnt_org_id NUMBER;  -- K LPN CONV. rv
2199   l_delivery_id NUMBER;
2200   l_last_line_flag VARCHAR2(1);
2201   l_attr_flag VARCHAR2(1) := 'N';
2202 
2203   l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
2204 
2205   l_del_status VARCHAR2(10);
2206 
2207   l_cont_tab          WSH_UTIL_CORE.id_tab_type;
2208   l_cont_org_tab      WSH_UTIL_CORE.id_tab_type; -- K LPN CONV. rv
2209   l_cont_line_dir_tab WSH_UTIL_CORE.Column_Tab_Type; -- K LPN CONV. rv
2210 
2211   -- K: MDC
2212   l_mdc_index        NUMBER := 0;
2213   l_mdc_details      WSH_UTIL_CORE.id_tab_type;
2214 
2215 
2216   l_cont_item_id NUMBER;  -- wms change:
2217 
2218 l_num_warnings          number := 0;
2219 
2220 -- K LPN CONV. rv
2221 l_wms_org    VARCHAR2(10) := 'N';
2222 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
2223 
2224 cursor l_get_cnt_org_csr (p_cnt_inst_id IN NUMBER) is
2225 select organization_id
2226 from   wsh_delivery_details
2227 where  delivery_detail_id = p_cnt_inst_id;
2228 
2229 -- K LPN CONV. rv
2230 
2231 --
2232 l_debug_on BOOLEAN;
2233 --
2234 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UNASSIGN_DETAIL';
2235 --
2236 BEGIN
2237 
2238   --
2239   --
2240   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
2241   --
2242   IF l_debug_on IS NULL
2243   THEN
2244       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
2245   END IF;
2246   --
2247   IF l_debug_on THEN
2248       WSH_DEBUG_SV.push(l_module_name);
2249       --
2250       WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
2251       WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
2252       WSH_DEBUG_SV.log(l_module_name,'P_CONT_UNASSIGN',P_CONT_UNASSIGN);
2253       WSH_DEBUG_SV.log(l_module_name,'P_DEL_UNASSIGN',P_DEL_UNASSIGN);
2254   END IF;
2255   --
2256   IF p_del_detail_tab.count = 0 THEN
2257 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_ASSG_NULL');
2258 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2259 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2260 	--
2261 	IF l_debug_on THEN
2262 	    WSH_DEBUG_SV.pop(l_module_name);
2263 	END IF;
2264 	--
2265 	return;
2266   END IF;
2267 
2268   cnt := 0;
2269 
2270   FOR i IN 1..p_del_detail_tab.count LOOP
2271 
2272  	-- get the delivery status of the container and check if it is assigned
2273   	-- to a closed or in-transit delivery (only open deliveries allowed)
2274 	OPEN Get_Cont (p_del_detail_tab(i));
2275 	FETCH Get_Cont INTO l_cont_instance_id, l_delivery_id,
2276                             l_cont_org_id, l_cont_line_dir, -- K LPN CONV. rv
2277                             l_cont_flag; -- K: MDC
2278 
2279 	IF Get_Cont%NOTFOUND THEN
2280 		CLOSE Get_Cont;
2281 		GOTO next_detail;
2282 	END IF;
2283 	IF Get_Cont%ISOPEN THEN
2284 		CLOSE Get_Cont;
2285 	END IF;
2286 
2287   	--
2288   	IF l_debug_on THEN
2289   	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
2290   	END IF;
2291   	--
2292   	WSH_CONTAINER_UTILITIES.Get_Delivery_Status (
2293 					l_cont_instance_id,
2294 					l_delivery_id,
2295 					l_del_status,
2296 					x_return_status);
2297 
2298         --
2299         IF l_debug_on THEN
2300           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2301         END IF;
2305 			l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2302         --
2303   	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2304 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2306 		END IF;
2307 		GOTO next_detail;
2308   	END IF;
2309 
2310   	IF (nvl(l_delivery_id,-99) <> -99) THEN
2311 
2312 		IF (nvl(l_del_status,'N/A') <> 'OP')
2313         AND NVL(p_action_prms.caller,'!!!!') NOT LIKE '%' || WSH_UTIL_CORE.C_SPLIT_DLVY_SUFFIX   -- J-IB-NPARIKH
2314         THEN
2315 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
2316 			x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2317 			WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2318 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2319 				l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2320 			END IF;
2321 			x_pack_status := 'Error';
2322 			GOTO next_detail;
2323 		END IF;
2324   	END IF;
2325         IF l_cont_instance_id IS NOT NULL AND l_cont_flag = 'C' THEN
2326              l_mdc_index       := l_mdc_index + 1;
2327              l_mdc_details(l_mdc_index) := p_del_detail_tab(i);
2328         ELSE
2329 	   cnt := cnt + 1;
2330   	   l_del_detail_rec(cnt)    := p_del_detail_tab(i);
2331 	   l_cont_tab(cnt)          := l_cont_instance_id; -- K LPN CONV. rv
2332 	   l_cont_org_tab(cnt)      := l_cont_org_id;       -- K LPN CONV. rv
2333 	   l_cont_line_dir_tab(cnt) := l_cont_line_dir;     -- K LPN CONV. rv
2334         END IF;
2335         <<next_detail>>
2336 		null;
2337 
2338   END LOOP;
2339 
2340   IF l_mdc_index > 0 THEN
2341      IF l_debug_on THEN
2342          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Unpack_Details_from_Consol',WSH_DEBUG_SV.C_PROC_LEVEL);
2343      END IF;
2344      Unpack_Details_from_Consol
2345                (p_delivery_details_tab  => l_mdc_details,
2346                 p_caller                => 'WMS_UNASSIGN_CONSOL',
2347                 x_return_status         => x_return_status);
2348 
2349      IF l_debug_on THEN
2350         WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2351      END IF;
2352      --
2353      IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2354         IF x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
2355            l_num_warnings := l_num_warnings + 1;
2356         ELSE
2357 	  --
2358           IF l_debug_on THEN
2359 	    WSH_DEBUG_SV.pop(l_module_name);
2360 	  END IF;
2361 	  --
2362 	  return;
2363         END IF;
2364      END IF;
2365 
2366      IF cnt = 0 THEN
2367         return;
2368      END IF;
2369 
2370   END IF;
2371   --
2372   IF l_debug_on THEN
2373       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_MULTIPLE_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
2374   END IF;
2375   --
2376   WSH_DELIVERY_DETAILS_ACTIONS.Unassign_Multiple_Details (
2377 						l_del_detail_rec,
2378 						p_del_unassign,
2379 						p_cont_unassign,
2380 						x_return_status,
2381 						null,
2382                     p_action_prms);
2383 
2384    --
2385    IF l_debug_on THEN
2386      WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2387    END IF;
2388    --
2389   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2390      IF x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
2391         l_num_warnings := l_num_warnings + 1;
2392      ELSE
2393 --	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_UNASSG_ERROR');
2394 --	WSH_UTIL_CORE.Add_Message(x_return_status);
2395 	--
2396 	IF l_debug_on THEN
2397 	    WSH_DEBUG_SV.pop(l_module_name);
2398 	END IF;
2399 	--
2400 	return;
2401      END IF;
2402   END IF;
2403 
2404   -- fetch the container for each line and update the attr columns if it is
2405   -- the last line in the container hierarchy..
2406 
2407   FOR i IN 1..l_del_detail_rec.count LOOP
2408 
2409     IF l_cont_tab(i) IS NULL THEN
2410       -- not assigned to a container.
2411       GOTO next_line;
2412     END IF;
2413 
2414     -- K LPN CONV. rv
2415     l_wms_org := wsh_util_validate.check_wms_org(l_cont_org_tab(i));
2416     -- K LPN CONV. rv
2417 
2418     IF l_debug_on THEN
2419       WSH_DEBUG_SV.log(l_module_name,'l_wms_org',l_wms_org);
2420     END IF;
2421 	--dbms_output.put_line('calling last assigned line for ' || l_del_detail_rec(i));
2422 
2423 	--
2424 	IF l_debug_on THEN
2425 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.LAST_ASSIGNED_LINE',WSH_DEBUG_SV.C_PROC_LEVEL);
2426 	END IF;
2427 	--
2428 	wsh_container_actions.Last_Assigned_Line (
2429 					l_del_detail_rec(i),
2430 					l_cont_tab(i),
2431 					l_last_line_flag,
2432 					x_return_status);
2433 
2434         --
2435         IF l_debug_on THEN
2436           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2437         END IF;
2438         --
2439 	IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
2440                                WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
2441           ) THEN
2442 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_LAST_LINE_ERROR');
2443 		--
2444 		IF l_debug_on THEN
2445 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2446 		END IF;
2447 		--
2451 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2448 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i));
2449 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2450 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2452 			l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2453 		END IF;
2454 		GOTO next_line;
2455 	END IF;
2456 
2457 	--dbms_output.put_line('calling check cont attr with ' || l_cont_tab(i));
2458 
2459 	--
2460 	IF l_debug_on THEN
2461 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
2462 	END IF;
2463 	--
2464 	wsh_container_actions.Check_Cont_Attributes (
2465 					l_cont_tab(i),
2466 					l_attr_flag,
2467 					x_return_status);
2468         --
2469         IF l_debug_on THEN
2470           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2471         END IF;
2472         --
2473 
2474 	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2475 	--dbms_output.put_line('after check cont attr status is ' || x_return_status);
2476 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
2477 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2478 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2479 			l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2480 		END IF;
2481 		GOTO next_line;
2482 	END IF;
2483 
2484 --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));
2485 
2486 
2487 	IF (nvl(l_last_line_flag,'N') = 'Y') AND (nvl(l_attr_flag,'N') = 'Y') AND (nvl(l_delivery_id,-99) = -99) THEN
2488 
2489 --dbms_output.put_line('updating attr to null for ' || l_cont_tab(i));
2490 
2491 
2492                 --
2493                 -- K LPN CONV. rv
2494                 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
2495                 AND l_cont_line_dir_tab(i) IN ('O','IO')
2496                 AND
2497                 (
2498                   (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
2499                   OR
2500                   (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
2501                 )
2502                 THEN
2503                 --{
2504                     l_sync_tmp_rec.delivery_detail_id := l_cont_tab(i);
2505                     l_sync_tmp_rec.operation_type := 'UPDATE';
2506                     WSH_WMS_SYNC_TMP_PKG.MERGE
2507                     (
2508                       p_sync_tmp_rec      => l_sync_tmp_rec,
2509                       x_return_status     => l_return_status
2510                     );
2511 
2512                     IF l_debug_on THEN
2513                       WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
2514                     END IF;
2515                     --
2516                     --
2517                     IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
2518                       --
2519                       GOTO next_line;
2520                       --
2521                     ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
2522                       --
2523                       l_num_warnings := l_num_warnings + 1;
2524                       --
2525                     END IF;
2526                     --
2527                 --}
2528                 END IF;
2529                 -- K LPN CONV. rv
2530 
2531 		UPDATE WSH_DELIVERY_DETAILS
2532 		SET 	customer_id = NULL,
2533 			ship_to_location_id = NULL,
2534 			intmed_ship_to_location_id = NULL,
2535 			fob_code = NULL,
2536 		  	freight_terms_code = NULL,
2537 			ship_method_code = NULL,
2538 			carrier_id = NULL,
2539 			mode_of_transport = NULL,
2540 			service_level = NULL,
2541 			deliver_to_location_id = NULL,
2542                         line_direction = DECODE(line_direction,'IO','O',line_direction)    -- J-IB-NPARIKH
2543 		WHERE delivery_detail_id = l_cont_tab(i);
2544 
2545 		IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2546 			FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
2547 			WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
2548 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2549 				l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2550 			END IF;
2551 			GOTO next_line;
2552 		END IF;
2553 
2554 		--
2555 		IF l_debug_on THEN
2556 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
2557 		END IF;
2558 		--
2559 		wsh_container_actions.Update_Cont_Hierarchy (
2560 						l_cont_tab(i),
2561 						NULL,
2562 						l_cont_tab(i),
2563 						x_return_status);
2564                 --
2565                 IF l_debug_on THEN
2566                   WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2567                 END IF;
2568                 --
2569 
2570 	    	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2571 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
2572 			--
2573 			IF l_debug_on THEN
2574 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2575 			END IF;
2576 			--
2580 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2577 			l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i));
2578 			FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2579 			WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2581 				l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2582 			END IF;
2583 			GOTO next_line;
2584 		END IF;
2585 
2586 	END IF;
2587 
2588 	OPEN Is_Container (l_del_detail_rec(i));
2589 
2590 	FETCH Is_Container INTO
2591 		l_cont_flag,
2592 		l_serial_number,
2593 		l_master_serial_number,
2594 		l_cont_item_id;
2595 
2596 	IF Is_Container%NOTFOUND THEN
2597 		CLOSE Is_Container;
2598 		FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
2599 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_rec(i));
2600 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
2601 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2602 			l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2603 		END IF;
2604 		GOTO next_line;
2605 	END IF;
2606 
2607 	IF Is_Container%ISOPEN THEN
2608 		CLOSE Is_Container;
2609 	END IF;
2610 
2611          IF l_cont_flag = 'N' THEN --{
2612            --
2613            IF l_debug_on THEN
2614               WSH_DEBUG_SV.log(l_module_name,'l_cont_flag',l_cont_flag);
2615               WSH_DEBUG_SV.log(l_module_name,'delivery_detail_id',l_del_detail_rec(i));
2616            END IF;
2617            --
2618            UPDATE wsh_delivery_details --bug 5165197
2619            SET master_serial_number = NULL
2620            WHERE delivery_detail_id = l_del_detail_rec(i);
2621            --
2622          ELSIF l_cont_flag = 'Y' THEN --}{
2623 
2624 	  	--
2625 	  	IF l_debug_on THEN
2626 	  	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
2627 	  	END IF;
2628 	  	--
2629 	  	WSH_CONTAINER_UTILITIES.Get_Delivery_Status (
2630 					l_del_detail_rec(i),
2631 					l_delivery_id,
2632 					l_del_status,
2633 					x_return_status);
2634                 --
2635                 IF l_debug_on THEN
2636                   WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2637                 END IF;
2638                 --
2639 
2640   		IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2641 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2642 				l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2643 			END IF;
2644 			GOTO next_line;
2645   		END IF;
2646 
2647   		IF (nvl(l_delivery_id,-99) <> -99) THEN --{
2648 
2649 			IF (nvl(l_del_status,'N/A') <> 'OP') THEN
2650 				FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
2651 				x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2652 				WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2653 				IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2654 					l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2655 				END IF;
2656 				x_pack_status := 'Error';
2657 				GOTO next_line;
2658 			END IF;
2659   		END IF; --}
2660 
2661 		IF (nvl(l_delivery_id,-99) <> -99) THEN
2662 			GOTO next_line;
2663 		END IF;
2664 
2665 		--
2666 		IF l_debug_on THEN
2667 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.LAST_ASSIGNED_LINE',WSH_DEBUG_SV.C_PROC_LEVEL);
2668 		END IF;
2669 		--
2670 		wsh_container_actions.Last_Assigned_Line (
2671 					NULL,
2672 					l_del_detail_rec(i),
2673 					l_last_line_flag,
2674 					x_return_status);
2675                 --
2676                 IF l_debug_on THEN
2677                   WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2678                 END IF;
2679                 --
2680 
2681 		IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN --{
2682 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_LAST_LINE_ERROR');
2683 			--
2684 			IF l_debug_on THEN
2685 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2686 			END IF;
2687 			--
2688 			l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2689 			FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2690 			WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2691 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2692 				l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2693 			END IF;
2694 			GOTO next_line;
2695 		END IF;	--}
2696 
2697 	--dbms_output.put_line('calling check cont attr with ' || l_del_detail_rec(i));
2698 
2699 		--
2700 		IF l_debug_on THEN
2701 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
2702 		END IF;
2703 		--
2704 		wsh_container_actions.Check_Cont_Attributes (
2705 					l_del_detail_rec(i),
2706 					l_attr_flag,
2707 					x_return_status);
2708                 --
2709                 IF l_debug_on THEN
2710                   WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2711                 END IF;
2712                 --
2713 
2714 		IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN --{
2715 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
2716 			WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2717 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2718 				l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2719 			END IF;
2723 
2720 			GOTO next_line;
2721 		END IF;	--}
2722 
2724 		IF (nvl(l_last_line_flag,'N') = 'Y') AND (nvl(l_attr_flag,'N') = 'Y') AND (nvl(l_delivery_id,-99) = -99) THEN --{
2725                         --
2726                         -- K LPN CONV. rv
2727                         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
2728                         AND l_cont_line_dir_tab(i) IN ('O','IO')
2729                         AND
2730                         (
2731                           (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
2732                           OR
2733                           (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
2734                         )
2735                         THEN
2736                         --{
2737                             l_sync_tmp_rec.delivery_detail_id := l_del_detail_rec(i);
2738                             l_sync_tmp_rec.operation_type := 'UPDATE';
2739                             WSH_WMS_SYNC_TMP_PKG.MERGE
2740                             (
2741                               p_sync_tmp_rec      => l_sync_tmp_rec,
2742                               x_return_status     => l_return_status
2743                             );
2744 
2745                             IF l_debug_on THEN
2746                               WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
2747                             END IF;
2748                             --
2749                             --
2750                             --
2751                             IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
2752                               --
2753                               GOTO next_line;
2754                               --
2755                             ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
2756                               --
2757                               l_num_warnings := l_num_warnings + 1;
2758                               --
2759                             END IF;
2760                             --
2761                         --}
2762                         END IF;
2763                         -- K LPN CONV. rv
2764 
2765 			UPDATE WSH_DELIVERY_DETAILS
2766 			SET 	customer_id = NULL,
2767 				ship_to_location_id = NULL,
2768 				intmed_ship_to_location_id = NULL,
2769 				fob_code = NULL,
2770 			  	freight_terms_code = NULL,
2771 				ship_method_code = NULL,
2772 				service_level = NULL,
2773 				carrier_id = NULL,
2774 				mode_of_transport = NULL,
2775 				deliver_to_location_id = NULL,
2776                                 line_direction = DECODE(line_direction,'IO','O',line_direction)    -- J-IB-NPARIKH
2777 			WHERE delivery_detail_id = l_del_detail_rec(i);
2778 
2779 			IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2780 				FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
2781 				WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
2782 				IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2783 					l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2784 				END IF;
2785 				GOTO next_line;
2786 			END IF;
2787 
2788 			--
2789 			IF l_debug_on THEN
2790 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
2791 			END IF;
2792 			--
2793 			wsh_container_actions.Update_Cont_Hierarchy (
2794 						l_del_detail_rec(i),
2795 						NULL,
2796 						l_del_detail_rec(i),
2797 						x_return_status);
2798                         --
2799                         IF l_debug_on THEN
2800                           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2801                         END IF;
2802                         --
2803 
2804 		    	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN --{
2805 				FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
2806 				--
2807 				IF l_debug_on THEN
2808 				    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2809 				END IF;
2810 				--
2811 				l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2812 				FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2813 				WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2814 				IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2815 					l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2816 				END IF;
2817 				GOTO next_line;
2818 			END IF;	--}
2819 
2820 		END IF;--}
2821 
2822 		-- update child containers of the current hierarchy that was
2823 		-- unassigned with the serial number of the current top most
2824 		-- container..
2825                 --
2826                 -- K LPN CONV. rv
2827                 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
2828                 AND l_cont_line_dir_tab(i) IN ('O','IO')
2829                 AND
2830                 (
2831                   (WSH_WMS_LPN_GRP.GK_WMS_UPD_MISC and l_wms_org = 'Y')
2832                   OR
2833                   (WSH_WMS_LPN_GRP.GK_INV_UPD_MISC and l_wms_org = 'N')
2834                 )
2835                 THEN
2836                 --{
2837                     l_sync_tmp_rec.delivery_detail_id := l_del_detail_rec(i);
2838                     l_sync_tmp_rec.operation_type := 'UPDATE';
2839                     WSH_WMS_SYNC_TMP_PKG.MERGE
2840                     (
2841                       p_sync_tmp_rec      => l_sync_tmp_rec,
2842                       x_return_status     => l_return_status
2843                     );
2844 
2848                     --
2845                     IF l_debug_on THEN
2846                       WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
2847                     END IF;
2849                     --
2850                     --
2851                     IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
2852                       --
2853                       GOTO next_line;
2854                       --
2855                     ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
2856                       --
2857                       l_num_warnings := l_num_warnings + 1;
2858                       --
2859                     END IF;
2860                     --
2861                 --}
2862                 END IF;
2863                 -- K LPN CONV. rv
2864 
2865 		UPDATE WSH_DELIVERY_DETAILS
2866 		SET master_serial_number = serial_number
2867 		WHERE delivery_detail_id = l_del_detail_rec(i);
2868 
2869 		IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2870 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CHILD_UPD_ERROR');
2871 			--
2872 			IF l_debug_on THEN
2873 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2874 			END IF;
2875 			--
2876 			l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2877 			FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2878 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2879 				l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2880 			END IF;
2881 			GOTO next_line;
2882 		END IF;
2883 
2884 		--
2885 		IF l_debug_on THEN
2886 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_SERIAL_NUMBER',WSH_DEBUG_SV.C_PROC_LEVEL);
2887 		END IF;
2888 		--
2889 		WSH_CONTAINER_UTILITIES.Get_Master_Serial_Number (
2890 					l_del_detail_rec(i),
2891 					l_master_serial_number,
2892 					x_return_status);
2893                  --
2894                  IF l_debug_on THEN
2895                    WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2896                  END IF;
2897                  --
2898 
2899 		IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2900 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GET_SRL_ERROR');
2901 			--
2902 			IF l_debug_on THEN
2903 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2904 			END IF;
2905 			--
2906 			l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2907 			FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2908 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2909 				l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2910 			END IF;
2911 			GOTO next_line;
2912 		END IF;
2913 
2914 		--
2915 		IF l_debug_on THEN
2916 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
2917 		END IF;
2918 		--
2919 		WSH_CONTAINER_UTILITIES.Update_Child_Containers (
2920 					l_del_detail_rec(i),
2921 					l_master_cont_name,
2922 					l_master_serial_number,
2923 					x_return_status);
2924                  --
2925                  IF l_debug_on THEN
2926                    WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2927                  END IF;
2928                  --
2929 
2930 	    	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2931 			--
2932 			IF l_debug_on THEN
2933 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2934 			END IF;
2935 			--
2936 			l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2937      			FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
2938 			FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2939 			x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2940 			WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2941 			--
2942 			IF l_debug_on THEN
2943 			    WSH_DEBUG_SV.pop(l_module_name);
2944 			END IF;
2945 			--
2946 			return;
2947     		END IF;
2948 
2949 	END IF; --}
2950 
2951   	<<next_line>>
2952 		null;
2953 
2954   END LOOP;
2955 
2956 -- J: W/V Changes
2957         IF (p_container_instance_id is not null and l_cont_item_id IS NOT NULL) THEN
2958 
2959             -- LPN CONV. rv
2960             open  l_get_cnt_org_csr(p_container_instance_id);
2961             fetch l_get_cnt_org_csr into l_cnt_org_id;
2962 
2963             l_wms_org := 'N';
2964 
2965             IF l_cnt_org_id is NOT NULL THEN
2966               l_wms_org := wsh_util_validate.check_wms_org(l_cnt_org_id);
2967             END IF;
2968             close l_get_cnt_org_csr;
2969 
2970             -- LPN CONV. rv
2971             IF NOT(
2972                    l_wms_org = 'Y' AND nvl(wsh_wms_lpn_grp.g_caller,'WSH') like 'WMS%'
2973                   )
2974             THEN
2975             --{
2976                 WSH_WV_UTILS.Check_Fill_Pc (
2977                   p_container_instance_id => p_container_instance_id,
2978                   x_fill_status           => l_fill_status,
2979                   x_return_status         => l_return_status);
2980 
2981                 IF l_fill_status = 'O' THEN
2982 
2983                     IF l_debug_on THEN
2987                     l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
2984                         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2985                     END IF;
2986                     --
2988                     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_OVERPACKED');
2989                     FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2990                     l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2991                     WSH_UTIL_CORE.Add_Message(l_return_status);
2992                     x_pack_status := 'Overpacked';
2993 
2994                  ELSIF l_fill_status = 'U' THEN
2995                     IF l_debug_on THEN
2996                         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2997                     END IF;
2998                     --
2999                     l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
3000                     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UNDERPACKED');
3001                     FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3002                     l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
3003                     WSH_UTIL_CORE.Add_Message(l_return_status);
3004                     x_pack_status := 'Underpacked';
3005                   ELSE
3006                     x_pack_status := 'Success';
3007                   END IF;
3008             --}
3009             END IF;
3010         END IF;
3011 
3012         IF l_num_warnings > 0 THEN
3013            x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
3014         ELSE
3015            x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3016         END IF;
3017 
3018 	--
3019 	IF l_debug_on THEN
3020            WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3021 	    WSH_DEBUG_SV.pop(l_module_name);
3022 	END IF;
3023 	--
3024 EXCEPTION
3025 
3026   WHEN Others THEN
3027 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Unassign_Detail',l_module_name);
3028 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3029 
3030 --
3031 IF l_debug_on THEN
3032     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
3033     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3034 END IF;
3035 --
3036 END Unassign_Detail;
3037 
3038 -------------------------------------------------------------------
3039 -- This procedure is only for backward compatibility. No one should call
3040 -- this procedure.
3041 -------------------------------------------------------------------
3042 
3043 PROCEDURE Unassign_Detail(
3044   p_container_instance_id IN NUMBER,
3045   p_delivery_id IN NUMBER,
3046   p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
3047   p_cont_unassign IN VARCHAR2,
3048   p_del_unassign IN VARCHAR2,
3049   x_pack_status OUT NOCOPY  VARCHAR2,
3050   x_return_status OUT NOCOPY  VARCHAR2) IS
3051 
3052 
3053 --
3054 l_debug_on BOOLEAN;
3055 --
3056 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UNASSIGN_DETAIL';
3057 --
3058   l_action_prms   wsh_glbl_var_strct_grp.dd_action_parameters_rec_type;
3059 BEGIN
3060 
3061   --
3062   --
3063   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3064   --
3065   IF l_debug_on IS NULL
3066   THEN
3067       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3068   END IF;
3069   --
3070   IF l_debug_on THEN
3071       WSH_DEBUG_SV.push(l_module_name);
3072       --
3073       WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3074       WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3075       WSH_DEBUG_SV.log(l_module_name,'P_CONT_UNASSIGN',P_CONT_UNASSIGN);
3076       WSH_DEBUG_SV.log(l_module_name,'P_DEL_UNASSIGN',P_DEL_UNASSIGN);
3077   END IF;
3078   --
3079   --
3080   IF l_debug_on THEN
3081       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.Unassign_Detail',WSH_DEBUG_SV.C_PROC_LEVEL);
3082   END IF;
3083   --
3084   Unassign_Detail
3085     (
3086         p_container_instance_id,
3087         p_delivery_id,
3088         p_del_detail_tab,
3089         p_cont_unassign,
3090         p_del_unassign,
3091         x_pack_status,
3092         x_return_status,
3093         l_action_prms
3094      );
3095     --
3096     IF l_debug_on THEN
3097         WSH_DEBUG_SV.pop(l_module_name);
3098     END IF;
3099     --
3100 EXCEPTION
3101 
3102   WHEN Others THEN
3103     WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Unassign_Detail',l_module_name);
3104     x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3105     --
3106     IF l_debug_on THEN
3107         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3108     END IF;
3109     --
3110 END Unassign_Detail;
3111 /*
3112 -----------------------------------------------------------------------------
3113    PROCEDURE  : Assign_To_Delivery
3114    PARAMETERS : p_container_instance_id - container instance id of container
3115 		p_delivery_id - delivery id
3116 		x_return_status - return status of API
3117 --           x_dlvy_has_lines : 'Y' :delivery has non-container lines.
3118 --                              'N' : delivery does not have non-container lines
3119 --           x_dlvy_freight_Terms_code : Delivery's freight term code
3123 */
3120   DESCRIPTION : This procedure checks to see if a container can be assigned to
3121 		the specified delivery and returns a success or failure.
3122 ------------------------------------------------------------------------------
3124 
3125 
3126 PROCEDURE Assign_To_Delivery(
3127   p_container_instance_id IN NUMBER,
3128   p_delivery_id IN NUMBER,
3129   x_return_status OUT NOCOPY  VARCHAR2,
3130  x_dlvy_has_lines          IN OUT NOCOPY VARCHAR2,    -- J-IB-NPARIKH
3131  x_dlvy_freight_terms_code IN OUT NOCOPY VARCHAR2     -- J-IB-NPARIKH
3132   ) IS
3133 
3134 -- remove this cursor for Bug
3135   CURSOR Get_First_Line (v_cont_instance_id NUMBER) IS
3136   SELECT delivery_detail_id
3137   FROM wsh_delivery_assignments_v
3138   WHERE parent_delivery_detail_id = v_cont_instance_id
3139   AND rownum < 2;
3140 -- remove this cursor for Bug
3141 
3142   CURSOR Get_Cont_Org (v_cont_instance_id NUMBER) IS
3143   SELECT organization_id
3144   FROM WSH_DELIVERY_DETAILS
3145   WHERE delivery_detail_id = v_cont_instance_id
3146   AND container_flag = 'Y';
3147 
3148   CURSOR Get_Del_Org (v_del_id NUMBER) IS
3149   SELECT organization_id, freight_terms_code
3150   FROM WSH_NEW_DELIVERIES
3151   WHERE delivery_id = v_del_id;
3152 
3153   l_del_detail_id	WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
3154 
3155   l_cont_org 	NUMBER;
3156   l_del_org	NUMBER;
3157 
3158   l_cont_name VARCHAR2(30);
3159   l_del_name VARCHAR2(30);
3160   --
3161   --
3162   l_has_lines               VARCHAR2(1);
3163   l_dlvy_freight_terms_code VARCHAR2(30);
3164   --
3165   --
3166 l_debug_on BOOLEAN;
3167   --
3168   l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'ASSIGN_TO_DELIVERY';
3169   --
3170 BEGIN
3171 
3172   --
3173   --
3174   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3175   --
3176   IF l_debug_on IS NULL
3177   THEN
3178       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3179   END IF;
3180   --
3181   IF l_debug_on THEN
3182       WSH_DEBUG_SV.push(l_module_name);
3183       --
3184       WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3185       WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3186   END IF;
3187   --
3188   OPEN Get_Cont_Org (p_container_instance_id);
3189 
3190   FETCH Get_Cont_Org INTO l_cont_org;
3191 
3192   IF Get_Cont_Org%NOTFOUND THEN
3193      CLOSE Get_Cont_Org;
3194      --
3195      IF l_debug_on THEN
3196          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3197      END IF;
3198      --
3199      l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
3200      FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
3201      FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3202      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3203      WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3204      --
3205      IF l_debug_on THEN
3206          WSH_DEBUG_SV.pop(l_module_name);
3207      END IF;
3208      --
3209      return;
3210   END IF;
3211 
3212   CLOSE Get_Cont_Org;
3213 
3214 
3215   OPEN Get_Del_Org (p_delivery_id);
3216 
3217   FETCH Get_Del_Org INTO l_del_org, l_dlvy_freight_terms_code;
3218 
3219   IF Get_Del_Org%NOTFOUND THEN
3220      CLOSE Get_Del_Org;
3221      --
3222      IF l_debug_on THEN
3223          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.GET_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3224      END IF;
3225      --
3226      l_del_name := WSH_NEW_DELIVERIES_PVT.Get_Name(p_delivery_id);
3227      FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DEL');
3228      FND_MESSAGE.SET_TOKEN('DEL_NAME',l_del_name);
3229      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3230      WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3231      --
3232      IF l_debug_on THEN
3233          WSH_DEBUG_SV.pop(l_module_name);
3234      END IF;
3235      --
3236      return;
3237   END IF;
3238 
3239   CLOSE Get_Del_Org;
3240 
3241 
3242   -- just check for organization id match and create assignment
3243   IF l_cont_org = l_del_org THEN
3244 
3245 	--
3246 	IF l_debug_on THEN
3247 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CREATE_DELIVERY_ASSIGNMENT',WSH_DEBUG_SV.C_PROC_LEVEL);
3248 	END IF;
3249 	--
3250 	wsh_container_actions.Create_Delivery_Assignment(
3251 		p_container_instance_id,
3252 		p_delivery_id,
3253 		x_return_status,
3254 		x_dlvy_has_lines,
3255 		x_dlvy_freight_terms_code
3256 		);
3257 
3258        --
3259         IF l_debug_on THEN
3260           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3261         END IF;
3262         --
3263 
3264 	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3265 	   --
3266 	   IF l_debug_on THEN
3267 	       WSH_DEBUG_SV.pop(l_module_name);
3268 	   END IF;
3269 	   --
3270 	   return;
3271   	END IF;
3272     ELSE
3273      	--
3274      	IF l_debug_on THEN
3275      	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3276      	END IF;
3277      	--
3281             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.GET_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3278      	l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
3279         --
3280         IF l_debug_on THEN
3282         END IF;
3283         --
3284         l_del_name := WSH_NEW_DELIVERIES_PVT.Get_Name(p_delivery_id);
3285 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_ORG_DIFF');
3286 	FND_MESSAGE.SET_TOKEN('ENTITY1',l_cont_name);
3287 	FND_MESSAGE.SET_TOKEN('ENTITY2',l_del_name);
3288 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3289    	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3290 	--
3291 	IF l_debug_on THEN
3292 	    WSH_DEBUG_SV.pop(l_module_name);
3293 	END IF;
3294 	--
3295 	return;
3296     END IF;
3297 
3298 
3299   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3300 
3301 	--
3302 	IF l_debug_on THEN
3303 	    WSH_DEBUG_SV.pop(l_module_name);
3304 	END IF;
3305 	--
3306 EXCEPTION
3307 
3308   WHEN Others THEN
3309 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Assign_To_Delivery',l_module_name);
3310 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3311 
3312 --
3313 IF l_debug_on THEN
3314     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
3315     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3316 END IF;
3317 --
3318 END Assign_To_Delivery;
3319 
3320 -------------------------------------------------------------------
3321 -- This procedure is only for backward compatibility. No one should call
3322 -- this procedure.
3323 -------------------------------------------------------------------
3324 
3325 PROCEDURE Assign_To_Delivery(
3326  p_container_instance_id IN NUMBER,
3327  p_delivery_id IN NUMBER,
3328  x_return_status OUT NOCOPY  VARCHAR2
3329     ) IS
3330 
3331 --
3332 l_debug_on BOOLEAN;
3333 --
3334 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'Assign_To_Delivery';
3335 --
3336 l_has_lines               VARCHAR2(1);
3337 l_dlvy_freight_terms_code VARCHAR2(30);
3338 --
3339 BEGIN
3340     --
3341     --
3342     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3343     --
3344     IF l_debug_on IS NULL
3345     THEN
3346         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3347     END IF;
3348     --
3349     IF l_debug_on THEN
3350         WSH_DEBUG_SV.push(l_module_name);
3351          --
3352          WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3353          WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3354     END IF;
3355     --
3356     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3357     --
3358     l_has_lines := WSH_DELIVERY_VALIDATIONS.has_lines
3359                         (
3360                             p_delivery_id => p_delivery_id
3361                         );
3362     --
3363     Assign_To_Delivery
3364         (
3365             P_CONTAINER_INSTANCE_ID               => P_CONTAINER_INSTANCE_ID,
3366             p_delivery_id             => p_delivery_id,
3367             x_dlvy_has_lines               => l_has_lines,
3368             x_dlvy_freight_Terms_code => l_dlvy_freight_Terms_code,
3369 	    x_return_status => x_return_status
3370         );
3371     --
3372     IF l_debug_on THEN
3373         WSH_DEBUG_SV.pop(l_module_name);
3374     END IF;
3375     --
3376 EXCEPTION
3377     WHEN others THEN
3378         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3379         wsh_util_core.default_handler('WSH_CONTAINER_ACTIONS.Assign_To_Delivery',l_module_name);
3380         --
3381         IF l_debug_on THEN
3382             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3383         END IF;
3384 END Assign_To_Delivery;
3385 
3386 
3387 /*
3388 -----------------------------------------------------------------------------
3389    PROCEDURE  : Create_Delivery_Assignment
3390    PARAMETERS : p_container_instance_id - container instance id of container
3391 		p_delivery_id - delivery id
3392 		x_return_status - return status of API.
3393 --           x_dlvy_has_lines : 'Y' :delivery has non-container lines.
3394 --                              'N' : delivery does not have non-container lines
3395 --           x_dlvy_freight_Terms_code : Delivery's freight term code
3396   DESCRIPTION : This procedure assigns a container to the specified delivery.
3397 ------------------------------------------------------------------------------
3398 */
3399 
3400 
3401 PROCEDURE Create_Delivery_Assignment (
3402  p_container_instance_id IN NUMBER,
3403  p_delivery_id IN NUMBER,
3404  x_return_status OUT NOCOPY  VARCHAR2,
3405  x_dlvy_has_lines          IN OUT NOCOPY VARCHAR2,    -- J-IB-NPARIKH
3406  x_dlvy_freight_terms_code IN OUT NOCOPY VARCHAR2     -- J-IB-NPARIKH
3407  ) IS
3408 
3409 --
3410 l_debug_on BOOLEAN;
3411 --
3412 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CREATE_DELIVERY_ASSIGNMENT';
3413 --
3414 BEGIN
3415 
3416 /* instead of this entire stuff just call assign_detail_to_delivery in whcih call to check container attributes, all validations can be done*/
3417 
3418  --
3419  --
3420  l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3421  --
3422  IF l_debug_on IS NULL
3426  --
3423  THEN
3424      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3425  END IF;
3427  IF l_debug_on THEN
3428      WSH_DEBUG_SV.push(l_module_name);
3429      --
3430      WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3431      WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3432  END IF;
3433  --
3434  --
3435  IF l_debug_on THEN
3436      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_DETAIL_TO_DELIVERY',WSH_DEBUG_SV.C_PROC_LEVEL);
3437  END IF;
3438  --
3439  WSH_DELIVERY_DETAILS_ACTIONS.Assign_Detail_to_Delivery(
3440    P_DETAIL_ID =>p_container_instance_id ,
3441    P_DELIVERY_ID => p_delivery_id,
3442    X_RETURN_STATUS =>x_return_status,
3443    x_dlvy_has_lines               => x_dlvy_has_lines,
3444    x_dlvy_freight_Terms_code => x_dlvy_freight_Terms_code
3445  );
3446 
3447    IF l_debug_on THEN
3448      WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3449    END IF;
3450  IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3451 	--set proper error message
3452 	--
3453 	IF l_debug_on THEN
3454 	    WSH_DEBUG_SV.pop(l_module_name);
3455 	END IF;
3456 	--
3457 	return;
3458  END IF;
3459  x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3460 
3461 	--
3462 	IF l_debug_on THEN
3463 	    WSH_DEBUG_SV.pop(l_module_name);
3464 	END IF;
3465 	--
3466 EXCEPTION
3467   WHEN Others THEN
3468 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Create_Delivery_Assignment',l_module_name);
3469 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3470 	--
3471 	IF l_debug_on THEN
3472 	    WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
3473 	    WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3474 	END IF;
3475 	--
3476 END Create_Delivery_Assignment;
3477 
3478 -------------------------------------------------------------------
3479 -- This procedure is only for backward compatibility. No one should call
3480 -- this procedure.
3481 -------------------------------------------------------------------
3482 
3483 PROCEDURE Create_Delivery_Assignment(
3484  p_container_instance_id IN NUMBER,
3485  p_delivery_id IN NUMBER,
3486  x_return_status OUT NOCOPY  VARCHAR2
3487     ) IS
3488 
3489 --
3490 l_debug_on BOOLEAN;
3491 --
3492 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'Create_Delivery_Assignment';
3493 --
3494 l_has_lines               VARCHAR2(1);
3495 l_dlvy_freight_terms_code VARCHAR2(30);
3496 --
3497 BEGIN
3498     --
3499     --
3500     l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3501     --
3502     IF l_debug_on IS NULL
3503     THEN
3504         l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3505     END IF;
3506     --
3507     IF l_debug_on THEN
3508         WSH_DEBUG_SV.push(l_module_name);
3509          --
3510          WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3511          WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3512     END IF;
3513     --
3514     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3515     --
3516     l_has_lines := WSH_DELIVERY_VALIDATIONS.has_lines
3517                         (
3518                             p_delivery_id => p_delivery_id
3519                         );
3520     --
3521     Create_Delivery_Assignment
3522         (
3523             P_CONTAINER_INSTANCE_ID               => P_CONTAINER_INSTANCE_ID,
3524             p_delivery_id             => p_delivery_id,
3525             X_RETURN_STATUS           => X_RETURN_STATUS,
3526             x_dlvy_has_lines               => l_has_lines,
3527             x_dlvy_freight_Terms_code => l_dlvy_freight_Terms_code
3528         );
3529     --
3530     IF l_debug_on THEN
3531         WSH_DEBUG_SV.pop(l_module_name);
3532     END IF;
3533     --
3534 EXCEPTION
3535     WHEN others THEN
3536         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3537         wsh_util_core.default_handler('WSH_CONTAINER_ACTIONS.Create_Delivery_Assignment',l_module_name);
3538         --
3539         IF l_debug_on THEN
3540             WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3541         END IF;
3542 END Create_Delivery_Assignment;
3543 
3544 
3545 -- THIS IS OBSOLETED
3546 /*
3547 -----------------------------------------------------------------------------
3548    PROCEDURE  : Unassign_Delivery
3549    PARAMETERS : p_container_instance_id - container instance id of container
3550 		p_delivery_id - delivery id
3551 		x_return_status - return status of API
3552   DESCRIPTION : This procedure checks unassigns a container from the specified
3553 		delivery and returns a success or failure.
3554 ------------------------------------------------------------------------------
3555 */
3556 --THIS PROCEDURE IS OBSOLETE
3557 PROCEDURE Unassign_Delivery(
3558   p_container_instance_id IN NUMBER,
3559   p_delivery_id IN NUMBER,
3560   x_return_status OUT NOCOPY  VARCHAR2) IS
3561 
3562 BEGIN
3563 
3564   x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3565 
3566 END Unassign_Delivery;
3567 
3568 
3569 /*
3573 		p_par_cont_inst_id - container instance id of parent container
3570 -----------------------------------------------------------------------------
3571    PROCEDURE  : Assign_To_Container
3572    PARAMETERS : p_det_cont_inst_id - container instance id of child container
3574 		x_return_status - return status of API
3575   DESCRIPTION : This procedure checks to see if a container can be assigned to
3576 		a specified parent container and returns a success or failure.
3577 ------------------------------------------------------------------------------
3578 */
3579 
3580 
3581 PROCEDURE Assign_To_Container(
3582   p_det_cont_inst_id IN NUMBER,
3583   p_par_cont_inst_id IN NUMBER,
3584   x_return_status OUT NOCOPY  VARCHAR2) IS
3585 
3586 -- remove this cursor
3587   CURSOR Get_First_Line (v_cont_instance_id NUMBER) IS
3588   SELECT delivery_detail_id
3589   FROM wsh_delivery_assignments_v
3590   WHERE parent_delivery_detail_id = v_cont_instance_id
3591   AND rownum < 2;
3592 -- remove this cursor
3593 
3594   CURSOR Get_Cont_Org (v_cont_instance_id NUMBER) IS
3595   SELECT organization_id
3596   FROM WSH_DELIVERY_DETAILS
3597   WHERE delivery_detail_id = v_cont_instance_id
3598   AND container_flag in ('Y', 'C');
3599 
3600   l_det_detail_id	WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
3601   l_par_detail_id	WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
3602 
3603   l_det_cont_org 	NUMBER;
3604   l_par_cont_org	NUMBER;
3605 
3606   l_temp_detail_tab WSH_UTIL_CORE.id_tab_type;
3607 
3608   cnt 			NUMBER;
3609   l_del_rows		WSH_UTIL_CORE.id_tab_type;
3610   l_group_id_tab	WSH_UTIL_CORE.id_tab_type;
3611   l_ret_sts 		VARCHAR2(1);
3612 
3613   l_cont_name VARCHAR2(30);
3614 
3615   l_master_serial_number VARCHAR2(30);
3616   l_master_cont_id	NUMBER;
3617   l_master_cont_name    VARCHAR2(30);
3618 
3619   l_det_attr_flag VARCHAR2(1);
3620   l_par_attr_flag VARCHAR2(1);
3621 
3622   l_det_del_id NUMBER;
3623   l_par_del_id NUMBER;
3624   l_del_status VARCHAR2(10);
3625 
3626   l_attr_tab  wsh_delivery_autocreate.grp_attr_tab_type;
3627   l_group_tab  wsh_delivery_autocreate.grp_attr_tab_type;
3628   l_action_rec wsh_delivery_autocreate.action_rec_type;
3629   l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
3630   l_matched_entities wsh_util_core.id_tab_type;
3631   l_out_rec wsh_delivery_autocreate.out_rec_type;
3632 
3633 
3634 --
3635 l_debug_on BOOLEAN;
3636 --
3637 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'ASSIGN_TO_CONTAINER';
3638 --
3639 BEGIN
3640 
3641 
3642   --
3643   --
3644   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3645   --
3646   IF l_debug_on IS NULL
3647   THEN
3648       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3649   END IF;
3650   --
3651   IF l_debug_on THEN
3652       WSH_DEBUG_SV.push(l_module_name);
3653       --
3654       WSH_DEBUG_SV.log(l_module_name,'P_DET_CONT_INST_ID',P_DET_CONT_INST_ID);
3655       WSH_DEBUG_SV.log(l_module_name,'P_PAR_CONT_INST_ID',P_PAR_CONT_INST_ID);
3656   END IF;
3657   --
3658   OPEN Get_Cont_Org (p_det_cont_inst_id);
3659 
3660   FETCH Get_Cont_Org INTO l_det_cont_org;
3661 
3662   IF Get_Cont_Org%NOTFOUND THEN
3663      CLOSE Get_Cont_Org;
3664      --
3665      IF l_debug_on THEN
3666          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3667      END IF;
3668      --
3669      l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
3670      FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
3671      FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3672      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3673      WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3674      --
3675      IF l_debug_on THEN
3676          WSH_DEBUG_SV.pop(l_module_name);
3677      END IF;
3678      --
3679      return;
3680   END IF;
3681 
3682   IF Get_Cont_Org%ISOPEN THEN
3683   	CLOSE Get_Cont_Org;
3684   END IF;
3685 
3686   OPEN Get_Cont_Org (p_par_cont_inst_id);
3687 
3688   FETCH Get_Cont_Org INTO l_par_cont_org;
3689 
3690   IF Get_Cont_Org%NOTFOUND THEN
3691      CLOSE Get_Cont_Org;
3692      --
3693      IF l_debug_on THEN
3694          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3695      END IF;
3696      --
3697      l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3698      FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
3699      FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3700      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3701      WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3702      --
3703      IF l_debug_on THEN
3704          WSH_DEBUG_SV.pop(l_module_name);
3705      END IF;
3706      --
3707      return;
3708   END IF;
3709 
3710   IF Get_Cont_Org%ISOPEN THEN
3711   	CLOSE Get_Cont_Org;
3712   END IF;
3713 
3714   IF l_det_cont_org <> l_par_cont_org THEN
3715 	--
3716 	IF l_debug_on THEN
3717 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3718 	END IF;
3719 	--
3723 	--
3720 	l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
3721 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_ORG_DIFF');
3722 	FND_MESSAGE.SET_TOKEN('ENTITY1',l_cont_name);
3724 	IF l_debug_on THEN
3725 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3726 	END IF;
3727 	--
3728 	l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3729 	FND_MESSAGE.SET_TOKEN('ENTITY2',l_cont_name);
3730 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3731    	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3732 	--
3733 	IF l_debug_on THEN
3734 	    WSH_DEBUG_SV.pop(l_module_name);
3735 	END IF;
3736 	--
3737 	return;
3738   END IF;
3739 
3740   -- get the delivery status of the container and check if it is assigned
3741   -- to a closed or in-transit delivery (only open deliveries allowed)
3742 
3743   --
3744   IF l_debug_on THEN
3745       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
3746   END IF;
3747   --
3748   WSH_CONTAINER_UTILITIES.Get_Delivery_Status ( p_par_cont_inst_id,
3749 						l_par_del_id,
3750 						l_del_status,
3751 						x_return_status);
3752 
3753   IF l_debug_on THEN
3754     WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3755   END IF;
3756   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3757 	--
3758 	IF l_debug_on THEN
3759 	    WSH_DEBUG_SV.pop(l_module_name);
3760 	END IF;
3761 	--
3762 	return;
3763   END IF;
3764 
3765   IF (nvl(l_par_del_id,-99) <> -99) THEN
3766 
3767 	IF (nvl(l_del_status,'N/A') <> 'OP') THEN
3768 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
3769 		x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3770 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3771 		--
3772 		IF l_debug_on THEN
3773 		    WSH_DEBUG_SV.pop(l_module_name);
3774 		END IF;
3775 		--
3776 		return;
3777 	END IF;
3778   END IF;
3779 
3780   -- get the delivery status of the container and check if it is assigned
3781   -- to a closed or in-transit delivery (only open deliveries allowed)
3782 
3783   --
3784   IF l_debug_on THEN
3785       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
3786   END IF;
3787   --
3788   WSH_CONTAINER_UTILITIES.Get_Delivery_Status ( p_det_cont_inst_id,
3789 						l_det_del_id,
3790 						l_del_status,
3791 						x_return_status);
3792 
3793   IF l_debug_on THEN
3794     WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3795   END IF;
3796   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3797 	--
3798 	IF l_debug_on THEN
3799 	    WSH_DEBUG_SV.pop(l_module_name);
3800 	END IF;
3801 	--
3802 	return;
3803   END IF;
3804 
3805   IF (nvl(l_det_del_id,-99) <> -99) THEN
3806 
3807 	IF (nvl(l_del_status,'N/A') <> 'OP') THEN
3808 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
3809 		x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3810 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3811 		--
3812 		IF l_debug_on THEN
3813 		    WSH_DEBUG_SV.pop(l_module_name);
3814 		END IF;
3815 		--
3816 		return;
3817 	END IF;
3818   END IF;
3819 
3820   IF l_debug_on THEN
3821     WSH_DEBUG_SV.log(l_module_name,'l_det_del_id',l_det_del_id);
3822     WSH_DEBUG_SV.log(l_module_name,'l_par_del_id',l_par_del_id);
3823   END IF;
3824 
3825   IF ((nvl(l_det_del_id,-99) <> -99) AND (nvl(l_par_del_id,-99) <> -99)) THEN
3826 
3827   	IF l_det_del_id <> l_par_del_id THEN
3828 
3829 
3830             -- R12: MDC: For WMS we can assign containers to parent containers on different deliveries.
3831             IF wsh_util_validate.check_wms_org(l_par_cont_org) = 'Y' THEN
3832 
3833 	       IF l_debug_on THEN
3834 	         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Assign_Container_to_Consol',WSH_DEBUG_SV.C_PROC_LEVEL);
3835 	       END IF;
3836                Assign_Container_to_Consol(
3837                  p_child_container_id   => p_det_cont_inst_id,
3838                  p_parent_container_id  => p_par_cont_inst_id,
3839                  p_caller               => 'WMS_PACK_CONSOL',
3840                  x_return_status        => x_return_status);
3841 
3842                IF l_debug_on THEN
3843                   WSH_DEBUG_SV.log(l_module_name,'return status -',x_return_status);
3844                END IF;
3845 
3846 	       return;
3847             ELSE
3848 
3849 
3850 		--
3851 		IF l_debug_on THEN
3852 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3853 		END IF;
3854 		--
3855 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
3856 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_DEL_DIFF');
3857 		FND_MESSAGE.SET_TOKEN('ENTITY1',l_cont_name);
3858 		--
3859 		IF l_debug_on THEN
3860 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3861 		END IF;
3862 		--
3863 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3864 		FND_MESSAGE.SET_TOKEN('ENTITY2',l_cont_name);
3865 		x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3869 		    WSH_DEBUG_SV.pop(l_module_name);
3866    		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3867 		--
3868 		IF l_debug_on THEN
3870 		END IF;
3871 		--
3872 		return;
3873 
3874             END IF;
3875 
3876   	END IF;
3877    END IF;
3878 
3879   --
3880   IF l_debug_on THEN
3881       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_CONT_SERIAL',WSH_DEBUG_SV.C_PROC_LEVEL);
3882   END IF;
3883   --
3884   WSH_CONTAINER_UTILITIES.Get_Master_Cont_Serial (
3885 				p_par_cont_inst_id,
3886 				l_master_cont_id,
3887 				l_master_cont_name,
3888 				l_master_serial_number,
3889 				x_return_status);
3890   IF l_debug_on THEN
3891     WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3892   END IF;
3893 
3894   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3895 	--dbms_output.put_line('error while getting master serial for parent ' || p_par_cont_inst_id);
3896 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GET_MASTER_ERROR');
3897 	--
3898 	IF l_debug_on THEN
3899 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3900 	END IF;
3901 	--
3902 	l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3903 	FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3904 	WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
3905 	IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
3906 	   l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
3907 	END IF;
3908 	l_master_cont_id := NULL;
3909 	l_master_serial_number := NULL;
3910   END IF;
3911 
3912   --
3913   IF l_debug_on THEN
3914       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
3915   END IF;
3916   --
3917   wsh_container_actions.Check_Cont_Attributes (
3918 				p_det_cont_inst_id,
3919 				l_det_attr_flag,
3920 				x_return_status);
3921 
3922   IF l_debug_on THEN
3923     WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3924   END IF;
3925 
3926   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3927 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
3928 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3929 	--
3930 	IF l_debug_on THEN
3931 	    WSH_DEBUG_SV.pop(l_module_name);
3932 	END IF;
3933 	--
3934 	return;
3935   END IF;
3936 
3937 
3938   --
3939   IF l_debug_on THEN
3940       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
3941   END IF;
3942   --
3943   wsh_container_actions.Check_Cont_Attributes (
3944 				p_par_cont_inst_id,
3945 				l_par_attr_flag,
3946 				x_return_status);
3947 
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 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
3954 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3955 	--
3956 	IF l_debug_on THEN
3957 	    WSH_DEBUG_SV.pop(l_module_name);
3958 	END IF;
3959 	--
3960 	return;
3961   END IF;
3962 
3963   IF l_det_attr_flag = 'N' AND l_par_attr_flag = 'N' THEN
3964 
3965 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
3966     	-- just create assignment of child container to parent.
3967 	--
3968 	IF l_debug_on THEN
3969 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
3970 	END IF;
3971 	--
3972 	WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
3973 			p_det_cont_inst_id,
3974 			p_par_cont_inst_id,
3975 			x_return_status);
3976 
3977         IF l_debug_on THEN
3978           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3979         END IF;
3980 
3981     	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3982 		--
3983 		IF l_debug_on THEN
3984 		    WSH_DEBUG_SV.pop(l_module_name);
3985 		END IF;
3986 		--
3987 		return;
3988     	END IF;
3989 
3990 --	l_master_cont_id := WSH_CONTAINER_UTILITIES.Get_Master_Cont_Id (p_det_cont_inst_id);
3991 
3992 
3993 	--
3994 	IF l_debug_on THEN
3995 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
3996 	END IF;
3997 	--
3998 	WSH_CONTAINER_UTILITIES.Update_Child_Containers (
3999 					p_det_cont_inst_id,
4000 					l_master_cont_id,
4001 					l_master_serial_number,
4002 					x_return_status);
4003 
4004         IF l_debug_on THEN
4005           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4006         END IF;
4007 
4008     	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4009 		--
4010 		IF l_debug_on THEN
4011 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4012 		END IF;
4013 		--
4014 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4015      		FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4016 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4020 		IF l_debug_on THEN
4017 		x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4018 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4019 		--
4021 		    WSH_DEBUG_SV.pop(l_module_name);
4022 		END IF;
4023 		--
4024 		return;
4025     	END IF;
4026 
4027    ELSIF l_det_attr_flag = 'N' AND l_par_attr_flag = 'Y' THEN
4028 
4029 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4030 
4031     	-- just create assignment of child container to parent.
4032 	--
4033 	IF l_debug_on THEN
4034 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
4035 	END IF;
4036 	--
4037 	WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
4038 			p_det_cont_inst_id,
4039 			p_par_cont_inst_id,
4040 			x_return_status);
4041 
4042         IF l_debug_on THEN
4043           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4044         END IF;
4045     	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4046 		--
4047 		IF l_debug_on THEN
4048 		    WSH_DEBUG_SV.pop(l_module_name);
4049 		END IF;
4050 		--
4051 		return;
4052     	END IF;
4053 
4054         --
4055         -- Debug Statements
4056         --
4057         IF l_debug_on THEN
4058             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
4059         END IF;
4060         --
4061         wsh_container_actions.Update_Cont_Hierarchy (
4062 					p_par_cont_inst_id,
4063 					l_det_del_id,
4064 					p_det_cont_inst_id,
4065 					x_return_status );
4066         IF l_debug_on THEN
4067           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4068         END IF;
4069 
4070 	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4071 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GRP_ATTR_WARN');
4072 		--
4073 		IF l_debug_on THEN
4074 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4075 		END IF;
4076 		--
4077 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4078 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4079 		l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
4080 		WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
4081 	END IF;
4082 
4083 	--
4084 	IF l_debug_on THEN
4085 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
4086 	END IF;
4087 	--
4088 	WSH_CONTAINER_UTILITIES.Update_Child_Containers (
4089 					p_det_cont_inst_id,
4090 					l_master_cont_id,
4091 					l_master_serial_number,
4092 					x_return_status);
4093         IF l_debug_on THEN
4094           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4095         END IF;
4096 
4097     	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4098 		--
4099 		IF l_debug_on THEN
4100 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4101 		END IF;
4102 		--
4103 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4104      		FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4105 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4106 		x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4107 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4108 		--
4109 		IF l_debug_on THEN
4110 		    WSH_DEBUG_SV.pop(l_module_name);
4111 		END IF;
4112 		--
4113 		return;
4114     	END IF;
4115 
4116    ELSIF l_det_attr_flag = 'Y' and l_par_attr_flag = 'N' THEN
4117 
4118 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4119 
4120     	-- just create assignment of child container to parent.
4121 	--
4122 	IF l_debug_on THEN
4123 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
4124 	END IF;
4125 	--
4126 	WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
4127 			p_det_cont_inst_id,
4128 			p_par_cont_inst_id,
4129 			x_return_status);
4130 
4131         IF l_debug_on THEN
4132           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4133         END IF;
4134     	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4135 		--dbms_output.put_line('cont not assigned');
4136 		--
4137 		IF l_debug_on THEN
4138 		    WSH_DEBUG_SV.pop(l_module_name);
4139 		END IF;
4140 		--
4141 		return;
4142     	END IF;
4143 
4144         --
4145         IF l_debug_on THEN
4146             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
4147         END IF;
4148         --
4149         wsh_container_actions.Update_Cont_Hierarchy (
4150 				p_det_cont_inst_id,
4151 				l_par_del_id,
4152 				p_par_cont_inst_id,
4153 				x_return_status );
4154 
4155         IF l_debug_on THEN
4156           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4157         END IF;
4158 	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4159 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GRP_ATTR_WARN');
4163 		END IF;
4160 		--
4161 		IF l_debug_on THEN
4162 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4164 		--
4165 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4166 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4167 		l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
4168 		WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
4169 	END IF;
4170 
4171 	--
4172 	IF l_debug_on THEN
4173 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
4174 	END IF;
4175 	--
4176 	WSH_CONTAINER_UTILITIES.Update_Child_Containers (
4177 					p_det_cont_inst_id,
4178 					l_master_cont_id,
4179 					l_master_serial_number,
4180 					x_return_status);
4181         IF l_debug_on THEN
4182           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4183         END IF;
4184 
4185     	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4186 		--
4187 		IF l_debug_on THEN
4188 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4189 		END IF;
4190 		--
4191 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4192      		FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4193 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4194 		x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4195 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4196 		--
4197 		IF l_debug_on THEN
4198 		    WSH_DEBUG_SV.pop(l_module_name);
4199 		END IF;
4200 		--
4201 		return;
4202     	END IF;
4203 
4204    ELSIF l_det_attr_flag = 'Y' and l_par_attr_flag = 'Y' THEN
4205 
4206 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4207 
4208 	-- check on using the container instance ids for grouping
4209 	-- attribute comparisons instead of using the lines.
4210 
4211 	l_attr_tab(1).entity_id := p_det_cont_inst_id;
4212 	l_attr_tab(1).entity_type := 'DELIVERY_DETAIL';
4213 	l_attr_tab(2).entity_id := p_par_cont_inst_id;
4214 	l_attr_tab(2).entity_type := 'DELIVERY_DETAIL';
4215 
4216 	--
4217 	IF l_debug_on THEN
4218 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
4219 	END IF;
4220 
4221       l_action_rec.action := 'MATCH_GROUPS';
4222       l_action_rec.check_single_grp := 'Y';
4223 
4224 
4225       WSH_DELIVERY_AUTOCREATE.Find_Matching_Groups(p_attr_tab => l_attr_tab,
4226                         p_action_rec => l_action_rec,
4227                         p_target_rec => l_target_rec,
4228                         p_group_tab => l_group_tab,
4229                         x_matched_entities => l_matched_entities,
4230                         x_out_rec => l_out_rec,
4231                         x_return_status => x_return_status);
4232 
4233         IF l_debug_on THEN
4234           WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4235         END IF;
4236 	IF (x_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
4237         OR  NVL(l_out_rec.single_group, 'N') = 'N') THEN
4238 		FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
4239        		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4240 		--
4241 		IF l_debug_on THEN
4242 		    WSH_DEBUG_SV.pop(l_module_name);
4243 		END IF;
4244 		--
4245 		return;
4246 	END IF;
4247 
4248 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4249 
4250 	    -- create assignment between child and parent container
4251             --
4252             IF l_debug_on THEN
4253                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
4254             END IF;
4255             --
4256             WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
4257 		p_det_cont_inst_id,
4258 		p_par_cont_inst_id,
4259 		x_return_status);
4260 
4261             IF l_debug_on THEN
4262               WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4263             END IF;
4264 	    IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4265 		l_ret_sts := x_return_status;
4266 		--
4267 		IF l_debug_on THEN
4268 		    WSH_DEBUG_SV.pop(l_module_name);
4269 		END IF;
4270 		--
4271 		return;
4272 	    END IF;
4273 
4274 	    -- call update cont attributes to update grouping attr.
4275 	    --
4276 	    IF l_debug_on THEN
4277 	        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
4278 	    END IF;
4279 	    --
4280 	    WSH_CONTAINER_UTILITIES.Update_Child_Containers (
4281 					p_det_cont_inst_id,
4282 					l_master_cont_id,
4283 					l_master_serial_number,
4284 					x_return_status);
4285             IF l_debug_on THEN
4286               WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4287             END IF;
4288 
4289     	    IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4290 		--
4291 		IF l_debug_on THEN
4292 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4293 		END IF;
4294 		--
4298 		x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4295 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4296      		FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4297 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4299 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4300 		--
4301 		IF l_debug_on THEN
4302 		    WSH_DEBUG_SV.pop(l_module_name);
4303 		END IF;
4304 		--
4305 		return;
4306     	    END IF;
4307 
4308 
4309    END IF;
4310 
4311   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4312 
4313 	--
4314 	IF l_debug_on THEN
4315 	    WSH_DEBUG_SV.pop(l_module_name);
4316 	END IF;
4317 	--
4318 EXCEPTION
4319 
4320   WHEN Others THEN
4321 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Assign_To_Container',l_module_name);
4322 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4323 
4324 --
4325 IF l_debug_on THEN
4326     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4327     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4328 END IF;
4329 --
4330 END Assign_To_Container;
4331 
4332 /*
4333 -----------------------------------------------------------------------------
4334    PROCEDURE  : Get_Cont_Load_Vol_info
4335    PARAMETERS : p_container_item_id - Item Id of the Container
4336                 p_organization_id - Organization Id of the item
4337                 p_w_v_both - W (Find Weight), V (Find Volume),
4338                              B (Find Weight and Volume)
4339                 x_return_status - Return Status of the API
4340                 x_error_cnt     - Count of errors encountered
4341                 x_max_load      - Max Load Weight of the container
4342                 x_max_vol       - Internal Volume of the container
4343                 x_wt_uom        - Weight UOM of the container
4344                 x_vol_uom       - Volume UOM of the container
4345   DESCRIPTION : This procedure finds Container Weight/Volume attributes
4346                 either from database or from cached PL/SQL table and caches
4347                 the info if fetched from database.
4348 ------------------------------------------------------------------------------
4349 */
4350 
4351 PROCEDURE  Get_Cont_Load_Vol_info(
4352              p_container_item_id IN  NUMBER,
4353              p_organization_id   IN  NUMBER,
4354              p_w_v_both          IN  VARCHAR2,
4355              x_max_load          OUT NOCOPY  NUMBER,
4356              x_max_vol           OUT NOCOPY  NUMBER,
4357              x_wt_uom            OUT NOCOPY  VARCHAR2,
4358              x_vol_uom           OUT NOCOPY  VARCHAR2,
4359           --   x_inventory_item_status_code OUT VARCHAR2,
4360              x_return_status     OUT NOCOPY  VARCHAR2,
4361              x_error_cnt         OUT NOCOPY  NUMBER) IS
4362 -- in this cursor we can add filters as required in 2428050
4363   CURSOR Get_Cont_Msi (v_cont_item_id NUMBER, v_org_id NUMBER) IS
4364   SELECT maximum_load_weight, internal_volume,
4365          weight_uom_code, volume_uom_code
4366   FROM   MTL_SYSTEM_ITEMS
4367   WHERE  inventory_item_id = v_cont_item_id
4368   AND    organization_id   = v_org_id
4369 -- bug 2828591 - remove the condition since it will prevent user to create container with other status
4370 --  AND    inventory_item_status_code = 'Active'
4371   AND    container_item_flag = 'Y'
4372   AND    nvl(vehicle_item_flag,'N') = 'N'
4373   AND    shippable_item_flag = 'Y' ;
4374 
4375   l_mtl_max_load NUMBER;
4376   l_mtl_max_vol  NUMBER;
4377   l_mtl_wt_uom   VARCHAR2(3);
4378   l_mtl_vol_uom  VARCHAR2(3);
4379   l_inv_item_status_code VARCHAR2(10);
4380   l_flag VARCHAR2(1);
4381   l_item_name    VARCHAR2(2000);
4382 
4383 --
4384 l_debug_on BOOLEAN;
4385 --
4386 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'GET_CONT_LOAD_VOL_INFO';
4387 --
4388 BEGIN
4389   --
4390   --
4391   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4392   --
4393   IF l_debug_on IS NULL
4394   THEN
4395       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4396   END IF;
4397   --
4398   IF l_debug_on THEN
4399       WSH_DEBUG_SV.push(l_module_name);
4400       --
4401       WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_ITEM_ID',P_CONTAINER_ITEM_ID);
4402       WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
4403       WSH_DEBUG_SV.log(l_module_name,'P_W_V_BOTH',P_W_V_BOTH);
4404   END IF;
4405   --
4406   x_error_cnt := 0;
4407   x_return_status := C_SUCCESS_STATUS;
4408   --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);
4409   IF ((g_cont_msi_tab.COUNT > 0) AND (g_cont_msi_tab.EXISTS(p_container_item_id))) THEN
4410 
4411 -- added for valid flag in PL SQL table
4412     IF g_cont_msi_tab(p_container_item_id).valid_flag = 'Y' THEN
4413       NULL;
4414     ELSE
4415       --
4416       IF l_debug_on THEN
4417           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4418       END IF;
4419       --
4420       l_item_name := WSH_UTIL_CORE.Get_Item_Name(p_container_item_id, p_organization_id);
4421       --dbms_output.put_line('Container '||p_container_item_id||' not found in Org '||p_organization_id);
4422       FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_INV_ITEM');
4423       FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
4424       CLOSE Get_Cont_Msi;
4428 
4425       WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4426       x_return_status := C_ERROR_STATUS;
4427       x_error_cnt := x_error_cnt + 1;
4429     END IF;
4430 -- end of for valid flag
4431 
4432      --dbms_output.put_line('Using Cached Cont/Msi Info');
4433   ELSE
4434     l_mtl_max_load := NULL;
4435     l_mtl_max_vol  := NULL;
4436     l_mtl_wt_uom   := NULL;
4437     l_mtl_vol_uom  := NULL;
4438 
4439     l_flag := 'Y';
4440 
4441     OPEN Get_Cont_Msi(p_container_item_id, p_organization_id);
4442     FETCH Get_Cont_Msi
4443     INTO  l_mtl_max_load,
4444           l_mtl_max_vol,
4445           l_mtl_wt_uom,
4446           l_mtl_vol_uom;
4447 
4448     IF Get_Cont_Msi%NOTFOUND THEN
4449       --
4450       IF l_debug_on THEN
4451           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4452       END IF;
4453       --
4454       l_item_name := WSH_UTIL_CORE.Get_Item_Name(p_container_item_id, p_organization_id);
4455       --dbms_output.put_line('Container '||p_container_item_id||' not found in Org '||p_organization_id);
4456       FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_INV_ITEM');
4457       FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
4458       CLOSE Get_Cont_Msi;
4459       WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4460       x_return_status := C_ERROR_STATUS;
4461       x_error_cnt := x_error_cnt + 1;
4462     ELSE
4463 
4464     --dbms_output.put_line('IN ELSE CLAUSE'||l_flag);
4465       CLOSE Get_Cont_Msi;
4466 
4467 
4468       IF ((NVL(l_mtl_max_load,0) <= 0) AND (p_w_v_both in ('W','B'))) THEN
4469         --dbms_output.put_line('Preferred Container Weight is <= 0');
4470         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_LOAD_ERROR');
4471         WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4472         x_return_status := C_ERROR_STATUS;
4473         x_error_cnt := x_error_cnt + 1;
4474         l_flag := 'N';
4475       END IF;
4476 
4477       IF ((NVL(l_mtl_max_vol,0) <= 0) AND (p_w_v_both in ('V','B'))) THEN
4478         --dbms_output.put_line('Preferred Container Volume is <= 0');
4479         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_VOL_ERROR');
4480         WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4481         x_return_status := C_ERROR_STATUS;
4482         x_error_cnt := x_error_cnt + 1;
4483         l_flag := 'N';
4484       END IF;
4485 
4486       IF (l_flag IS NULL OR l_flag <> 'N') THEN
4487         l_flag := 'Y';
4488       END IF;
4489 
4490     END IF;
4491 
4492     --dbms_output.put_line('Caching Cont/Msi Info'||l_flag);
4493     g_cont_msi_tab(p_container_item_id).mtl_max_load := l_mtl_max_load;
4494     g_cont_msi_tab(p_container_item_id).mtl_max_vol  := l_mtl_max_vol;
4495     g_cont_msi_tab(p_container_item_id).mtl_wt_uom   := l_mtl_wt_uom;
4496     g_cont_msi_tab(p_container_item_id).mtl_vol_uom  := l_mtl_vol_uom;
4497     g_cont_msi_tab(p_container_item_id).valid_flag  := l_flag;
4498   END IF;
4499 
4500   x_max_load := g_cont_msi_tab(p_container_item_id).mtl_max_load;
4501   x_max_vol  := g_cont_msi_tab(p_container_item_id).mtl_max_vol;
4502   x_wt_uom   := g_cont_msi_tab(p_container_item_id).mtl_wt_uom;
4503   x_vol_uom  := g_cont_msi_tab(p_container_item_id).mtl_vol_uom;
4504   --x_inventory_item_status_code  := g_cont_msi_tab(p_container_item_id).inventory_item_status_code;
4505   --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Get_Cont_Load_Vol_info returned '||x_return_status||' with error count '||x_error_cnt);
4506 
4507   --
4508   IF l_debug_on THEN
4509       WSH_DEBUG_SV.log(l_module_name,'MAX LOAD',x_max_load);
4510       WSH_DEBUG_SV.log(l_module_name,'MAX VOLUME',x_max_vol);
4511       WSH_DEBUG_SV.pop(l_module_name);
4512   END IF;
4513   --
4514   RETURN;
4515 
4516 EXCEPTION
4517   WHEN Others THEN
4518     IF (Get_Cont_Msi%ISOPEN) THEN
4519       CLOSE Get_Cont_Msi;
4520     END IF;
4521     WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Get_Cont_Load_Vol_info',l_module_name);
4522         x_return_status := C_UNEXP_ERROR_STATUS;
4523 
4524 --
4525 IF l_debug_on THEN
4526     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4527     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4528 END IF;
4529 --
4530 END  Get_Cont_Load_Vol_info;
4531 
4532 /*
4533 -----------------------------------------------------------------------------
4534    PROCEDURE  : Calc_Fill_Basis_and_Proc_Flag
4535    PARAMETERS : p_organization_id - Organization Id for which Fill Basis and
4536                                     Process Flag is to be determined
4537                 x_return_status - Return Status of the API
4538                 x_error_cnt     - Count of errors encountered
4539                 x_fill_basis    - Fill Basis for the organization
4540                 x_process_flag  - Discrete/Process Organization
4541   DESCRIPTION : This procedure finds Fill Basis for organization and determines
4542                 whether organization uses Process or Discrete Manufacturing
4543                 either from database or from cached PL/SQL table and caches
4544                 the info if fetched from database.
4545 ------------------------------------------------------------------------------
4546 */
4547 
4548 PROCEDURE Calc_Fill_Basis_and_Proc_Flag(
4549             p_organization_id IN  NUMBER,
4550             x_return_status   OUT NOCOPY  VARCHAR2,
4551             x_fill_basis      OUT NOCOPY  VARCHAR2,
4552             x_process_flag    OUT NOCOPY  VARCHAR2) IS
4556 --
4553 
4554   l_param_info  WSH_SHIPPING_PARAMS_PVT.Parameter_Rec_Typ;
4555 
4557 l_debug_on BOOLEAN;
4558 --
4559 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CALC_FILL_BASIS_AND_PROC_FLAG';
4560 --
4561 BEGIN
4562 
4563   --
4564   --
4565   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4566   --
4567   IF l_debug_on IS NULL
4568   THEN
4569       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4570   END IF;
4571   --
4572   IF l_debug_on THEN
4573       WSH_DEBUG_SV.push(l_module_name);
4574       --
4575       WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
4576   END IF;
4577   --
4578   --
4579   IF l_debug_on THEN
4580       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_SHIPPING_PARAMS_PVT.GET',WSH_DEBUG_SV.C_PROC_LEVEL);
4581   END IF;
4582   --
4583   WSH_SHIPPING_PARAMS_PVT.Get(
4584     p_organization_id => p_organization_id,
4585     x_param_info      => l_param_info,
4586     x_return_status   => x_return_status);
4587 
4588   IF l_debug_on THEN
4589     WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4590   END IF;
4591   IF (x_return_status = C_SUCCESS_STATUS) THEN
4592     x_fill_basis   := l_param_info.percent_fill_basis_flag;
4593 -- HW OPMCONV - No need to populate this value
4594 --  x_process_flag := l_param_info.process_flag;
4595   END IF;
4596 
4597   --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Calc_Fill_Basis_and_proc_flag returned '||x_return_status);
4598 
4599   --
4600   IF l_debug_on THEN
4601       WSH_DEBUG_SV.pop(l_module_name);
4602   END IF;
4603   --
4604   RETURN;
4605 
4606 --
4607 IF l_debug_on THEN
4608     WSH_DEBUG_SV.pop(l_module_name);
4609 END IF;
4610 --
4611 EXCEPTION
4612   WHEN Others THEN
4613     WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Calc_Fill_Basis_and_proc_flag',l_module_name);
4614     x_return_status := C_UNEXP_ERROR_STATUS;
4615     --
4616     IF l_debug_on THEN
4617         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4618         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4619     END IF;
4620     --
4621 END  Calc_Fill_Basis_and_proc_flag;
4622 
4623 /*
4624 -----------------------------------------------------------------------------
4625    PROCEDURE  : Calc_Pref_Container
4626    PARAMETERS : p_organization_id - Organization Id of the Item for which
4627                                     Preferred Container is to be determined
4628                 p_inventory_item_id - Item for which Preferred Container is to
4629                                       be determined
4630                 p_fill_pc_basis - Fill Basis for the organization
4631                 x_return_status - Return Status of the API
4632                 x_error_cnt     - Count of errors encountered
4633                 x_cont_item_id  - Preferred Container Item Id
4634                 x_max_load_qty  - Max Load Qty of the Preferred Container
4635   DESCRIPTION : This procedure finds preferred container for item-organization
4636                 combination either from database or from cached PL/SQL table
4637                 and caches the info if fetched from database.
4638                 This procedure also finds and caches the Max Load qty a
4639                 preferred container can hold if fill basis is Quantity.
4640 ------------------------------------------------------------------------------
4641 */
4642 
4643 PROCEDURE Calc_Pref_Container(
4644             p_organization_id   IN  NUMBER,
4645             p_inventory_item_id IN  NUMBER,
4646             p_fill_pc_basis     IN  VARCHAR2,
4647             x_return_status     OUT NOCOPY  VARCHAR2,
4648             x_error_cnt         OUT NOCOPY  NUMBER,
4649             x_cont_item_id      OUT NOCOPY  NUMBER,
4650             x_max_load_qty      OUT NOCOPY  NUMBER) IS
4651 
4652   CURSOR Get_Cont_Load (v_inv_item_id NUMBER, v_organization_id NUMBER) IS
4653   SELECT container_item_id,
4654          max_load_quantity
4655   FROM   WSH_CONTAINER_ITEMS
4656   WHERE  load_item_id           = v_inv_item_id
4657   AND    master_organization_id = v_organization_id
4658   AND    preferred_flag         = 'Y';
4659 
4660   l_wcl_cont_item_id NUMBER;
4661   l_max_load_qty     NUMBER;
4662   l_item_name VARCHAR2(2000);
4663   l_org_name VARCHAR2(240);
4664 
4665 
4666 --
4667 l_debug_on BOOLEAN;
4668 --
4669 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CALC_PREF_CONTAINER';
4670 --
4671 BEGIN
4672   --
4673   --
4674   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4675   --
4676   IF l_debug_on IS NULL
4677   THEN
4678       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4679   END IF;
4680   --
4681   IF l_debug_on THEN
4682       WSH_DEBUG_SV.push(l_module_name);
4683       --
4684       WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
4685       WSH_DEBUG_SV.log(l_module_name,'P_INVENTORY_ITEM_ID',P_INVENTORY_ITEM_ID);
4686       WSH_DEBUG_SV.log(l_module_name,'P_FILL_PC_BASIS',P_FILL_PC_BASIS);
4687   END IF;
4688   --
4689   x_error_cnt := 0;
4690   x_return_status := C_SUCCESS_STATUS;
4691 
4692   IF ((g_cache_cont_load_info_tab.COUNT > 0) AND (g_cache_cont_load_info_tab.EXISTS(p_inventory_item_id))) THEN
4693     NULL;
4694     --dbms_output.put_line('Using Cached Cont/Load info');
4695   ELSE
4696     l_wcl_cont_item_id := NULL;
4700 
4697     l_max_load_qty     := NULL;
4698 
4699     OPEN Get_Cont_Load (p_inventory_item_id, p_organization_id);
4701     FETCH Get_Cont_Load
4702     INTO  l_wcl_cont_item_id,
4703           l_max_load_qty;
4704 
4705     IF Get_Cont_Load%NOTFOUND THEN
4706       CLOSE Get_Cont_Load;
4707       --
4708       IF l_debug_on THEN
4709           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4710       END IF;
4711       --
4712       l_item_name := WSH_UTIL_CORE.Get_Item_Name(p_inventory_item_id, p_organization_id);
4713       --
4714       IF l_debug_on THEN
4715           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ORG_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4716       END IF;
4717       --
4718       l_org_name := WSH_UTIL_CORE.Get_Org_Name(p_organization_id);
4719       --dbms_output.put_line('Error: Cont/Load Relationship does not exist for Item '||l_item_name||' Org '||l_org_name);
4720       --dbms_output.put_line('p_inventory_item_id '||p_inventory_item_id||' p_organization_id '||p_organization_id);
4721       FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONT_LOAD');
4722       FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
4723       FND_MESSAGE.SET_TOKEN('ORG_NAME',l_org_name);
4724       WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4725       x_return_status := C_ERROR_STATUS;
4726       x_error_cnt := x_error_cnt + 1;
4727     ELSE
4728       CLOSE Get_Cont_Load;
4729       IF ((l_max_load_qty = 0) AND (p_fill_pc_basis = 'Q')) THEN
4730         --dbms_output.put_line('Error: Max Load qty for Preferred Container is 0');
4731         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_LOAD_QTY_ERROR');
4732         WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4733         x_error_cnt := x_error_cnt + 1;
4734         x_return_status := C_ERROR_STATUS;
4735         l_wcl_cont_item_id := NULL;
4736       END IF;
4737     END IF;
4738 
4739     g_cache_cont_load_info_tab(p_inventory_item_id).cont_item_id := l_wcl_cont_item_id;
4740     g_cache_cont_load_info_tab(p_inventory_item_id).max_load_qty := l_max_load_qty;
4741     --dbms_output.put_line('Caching Cont/Load info');
4742   END IF;
4743   x_cont_item_id :=  g_cache_cont_load_info_tab(p_inventory_item_id).cont_item_id;
4744   x_max_load_qty :=  g_cache_cont_load_info_tab(p_inventory_item_id).max_load_qty;
4745   --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Calc_Pref_Container returned '||x_return_status||' with error count '||x_error_cnt);
4746 
4747   --
4748   IF l_debug_on THEN
4749       WSH_DEBUG_SV.pop(l_module_name);
4750   END IF;
4751   --
4752   RETURN;
4753 
4754 --
4755 IF l_debug_on THEN
4756     WSH_DEBUG_SV.pop(l_module_name);
4757 END IF;
4758 --
4759 EXCEPTION
4760   WHEN Others THEN
4761     IF (Get_Cont_Load%ISOPEN) THEN
4762       CLOSE Get_Cont_Load;
4763     END IF;
4764     WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Calc_Pref_Container',l_module_name);
4765     x_return_status := C_UNEXP_ERROR_STATUS;
4766 
4767 --
4768 IF l_debug_on THEN
4769     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4770     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4771 END IF;
4772 --
4773 END Calc_Pref_Container;
4774 
4775 /*
4776 -----------------------------------------------------------------------------
4777    PROCEDURE  : Pack_Delivery_Detail
4778    PARAMETERS : p_line_cont_rec - Dd info which needs to be autopacked
4779                 x_return_status - Return Status of the API
4780   DESCRIPTION : This procedure packs a delivery detail into Container either
4781                 by creating a new one or by packing it into one created for
4782                 previous delivery details (created in the same run)
4783 ------------------------------------------------------------------------------
4784 */
4785 
4786 PROCEDURE Pack_Delivery_Detail(
4787   p_line_cont_rec IN  wsh_container_actions.line_cont_info,
4788   x_return_status OUT NOCOPY  VARCHAR2) IS
4789 
4790   l_mtl_max_load          NUMBER;
4791   l_mtl_max_vol           NUMBER;
4792   l_item_name             VARCHAR2(2000);
4793   l_weight_per_pc         NUMBER;
4794   l_volume_per_pc         NUMBER;
4795   l_volume_per_pc2        NUMBER;
4796   l_equal_distribution    BOOLEAN;
4797   l_wt_left               NUMBER;
4798   l_vol_left              NUMBER;
4799   l_original_qty          NUMBER;
4800   l_quantity_left              NUMBER;
4801   l_tmp_split_qty         NUMBER;
4802   l_tmp_split_qty2        NUMBER;
4803   l_split_qty             NUMBER;
4804   l_split_qty2            NUMBER;
4805   l_split_del_detail_id   NUMBER;
4806   l_return_status VARCHAR2(1) := C_SUCCESS_STATUS;
4807   l_output_qty            NUMBER;
4808   l_discard_message     VARCHAR2(2000);
4809   l_max_load_qty        NUMBER;
4810   l_tot_gross_wt NUMBER;
4811   l_tot_net_wt NUMBER;
4812   l_tot_vol NUMBER;
4813   l_dd_wt_per_pc  NUMBER;
4814   l_dd_gross_wt_left    NUMBER;
4815   l_dd_net_wt_left    NUMBER;
4816   l_dd_vol_per_pc NUMBER;
4817   l_dd_vol_left   NUMBER;
4818 
4819   i NUMBER;
4820   j NUMBER;
4821   gcdvalue NUMBER;
4822 
4823   l_count_container NUMBER;
4824   l_container_item_id NUMBER;
4825   l_container_org_id NUMBER;
4826   l_num_of_split     NUMBER;
4830 l_debug_on BOOLEAN;
4827   l_dd_id_tab        WSH_UTIL_CORE.id_tab_type;
4828 
4829 --
4831 --
4832 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'PACK_DELIVERY_DETAIL';
4833 --
4834 BEGIN
4835   --
4836   --
4837   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4838   --
4839   IF l_debug_on IS NULL
4840   THEN
4841       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4842   END IF;
4843   --
4844   IF l_debug_on THEN
4845     WSH_DEBUG_SV.push(l_module_name);
4846     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);
4847     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 );
4848   END IF;
4849   --
4850   l_dd_gross_wt_left := ROUND(p_line_cont_rec.gross_weight,LIMITED_PRECISION);
4851   l_dd_net_wt_left   := ROUND(p_line_cont_rec.net_weight,LIMITED_PRECISION);
4852   l_dd_vol_left      := ROUND(p_line_cont_rec.volume,LIMITED_PRECISION);
4853 
4854   IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
4855      l_max_load_qty := p_line_cont_rec.max_load_qty;
4856      --dbms_output.put_line('Max Load qty is '||p_line_cont_rec.max_load_qty);
4857   ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
4858 
4859     l_mtl_max_load := p_line_cont_rec.cont_wt;
4860 
4861     -- Calculate Wt per Piece. We pack based on converted Container UOM weight
4862     l_weight_per_pc  := TRUNC(p_line_cont_rec.converted_wt/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
4863     l_wt_left       := p_line_cont_rec.converted_wt;
4864 -- Bug 2786021
4865     IF (nvl(l_mtl_max_load,0) = 0 OR nvl(l_weight_per_pc,0) = 0)THEN
4866       x_return_status := C_ERROR_STATUS;
4867       IF nvl(l_mtl_max_load,0) = 0 THEN
4868         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_LOAD_ERROR');
4869       ELSIF nvl(l_weight_per_pc,0) = 0 THEN
4870         FND_MESSAGE.SET_NAME('WSH','WSH_NULL_WEIGHT_VOLUME');
4871         FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL',p_line_cont_rec.delivery_detail_id);
4872       END IF;
4873       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4874       IF l_debug_on THEN
4875         WSH_DEBUG_SV.pop(l_module_name);
4876       END IF;
4877       RETURN;
4878     END IF;
4879 -- Bug 2786021
4880 
4881   ELSE
4882     l_mtl_max_vol := p_line_cont_rec.cont_vol;
4883 
4884     -- Calculate Vol per Piece. We pack based on converted Container UOM volume
4885     l_volume_per_pc  := TRUNC(p_line_cont_rec.converted_vol/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
4886     l_vol_left       := p_line_cont_rec.converted_vol;
4887 -- Bug 2786021
4888     IF (nvl(l_mtl_max_vol,0) = 0 OR nvl(l_volume_per_pc,0) = 0) THEN
4889       x_return_status := C_ERROR_STATUS;
4890       IF nvl(l_mtl_max_vol,0) = 0 THEN
4891         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_VOL_ERROR');
4892       ELSIF nvl(l_volume_per_pc,0) = 0 THEN
4893         FND_MESSAGE.SET_NAME('WSH','WSH_NULL_WEIGHT_VOLUME');
4894         FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL',p_line_cont_rec.delivery_detail_id);
4895       END IF;
4896       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4897       IF l_debug_on THEN
4898         WSH_DEBUG_SV.pop(l_module_name);
4899       END IF;
4900       RETURN;
4901     END IF;
4902 -- Bug 2786021
4903   END IF;
4904 
4905   IF l_debug_on THEN
4906     WSH_DEBUG_SV.log(l_module_name,'Wt per pc-',l_weight_per_pc);
4907     WSH_DEBUG_SV.log(l_module_name,'Vol per pc-',l_volume_per_pc);
4908     WSH_DEBUG_SV.log(l_module_name,'Cont max load-',l_mtl_max_load);
4909     WSH_DEBUG_SV.log(l_module_name,'Cont max vol-',l_mtl_max_vol);
4910   END IF;
4911 
4912   l_original_qty  := p_line_cont_rec.shp_qty;
4913   l_quantity_left := p_line_cont_rec.shp_qty;
4914 
4915   -- Check Empty Containers first
4916   IF (g_empty_cont_tab.COUNT > 0 ) THEN
4917 --dbms_output.put_line('There are containers with empty space'||to_char(sysdate,'HH24:MI:SS'));
4918 
4919     i := g_empty_cont_tab.FIRST;
4920     WHILE i <= g_empty_cont_tab.LAST LOOP
4921       IF p_line_cont_rec.preferred_container <> g_empty_cont_tab(i).container_item_Id OR
4922          p_line_cont_rec.organization_id <> g_empty_cont_tab(i).organization_id OR
4923          p_line_cont_rec.group_id <> g_empty_cont_tab(i).group_id  OR
4924          (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
4925          g_empty_cont_tab(i).empty <= 0 THEN
4926         GOTO next_cont;
4927       END IF;
4928 
4929       -- Got a Match in empty container table
4930 
4931       IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
4932         --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);
4933         -- Calculate qty than can fit in 'empty' space
4934         -- Bug 2733274
4935         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);
4936 
4937       ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
4938         --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty weight '||g_empty_cont_tab(i).empty);
4939         -- Calculate qty than can fit in 'empty' space
4940         l_tmp_split_qty := TRUNC(g_empty_cont_tab(i).empty/l_weight_per_pc,LIMITED_PRECISION);
4941       ELSE
4945       END IF;
4942         --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty volume '||g_empty_cont_tab(i).empty);
4943         -- Calculate qty than can fit in 'empty' space
4944         l_tmp_split_qty := TRUNC(g_empty_cont_tab(i).empty/l_volume_per_pc,LIMITED_PRECISION);
4946       -- l_tmp_split_qty is qty, in fraction, that can fit into empty container
4947       --dbms_output.put_line('l_tmp_split_qty '||l_tmp_split_qty||' l_tmp_split_qty2 '||l_tmp_split_qty2);
4948 
4949       -- Per Pushkar,OPM: Call Check_Decimal_Quantity for both OPM and Discrete for primary quantity
4950       --
4951       IF l_debug_on THEN
4952           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
4953       END IF;
4954       --
4955       WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
4956            p_line_cont_rec.inventory_item_id,
4957            p_line_cont_rec.organization_id,
4958            l_tmp_split_qty,
4959            p_line_cont_rec.req_qty_uom,
4960            l_output_qty,
4961            l_return_status);
4962 
4963       IF l_debug_on THEN
4964         WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
4965       END IF;
4966       IF (l_return_status <> C_SUCCESS_STATUS OR
4967           p_line_cont_rec.indivisible_flag = 'Y')THEN
4968         -- Fractional qtys not allowed
4969         --dbms_output.put_line('WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity returned '||l_return_status);
4970         l_discard_message := FND_MESSAGE.GET;
4971         l_tmp_split_qty  := FLOOR(l_tmp_split_qty);
4972       END IF;
4973 -- HW OPMCONV - 1) No need to check for process
4974 --            - 2) Changed code to handle qty2
4975 --            - 3) Remove OPM specific precision to 9
4976 
4977       IF ( p_line_cont_rec.shp_qty2 IS NOT NULL ) THEN
4978         l_tmp_split_qty2 := (l_tmp_split_qty * p_line_cont_rec.shp_qty2)/p_line_cont_rec.shp_qty;
4979       ELSE
4980         l_tmp_split_qty2 := NULL;
4981       END IF;
4982       --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);
4983 
4984       IF (l_tmp_split_qty <= 0) THEN
4985         -- Container insufficient, skip this
4986         --dbms_output.put_line('Container Insufficient. Skipping this');
4987         GOTO next_cont;
4988       ELSE
4989         IF (l_tmp_split_qty >= l_quantity_left) THEN
4990           -- all left can be packed into the empty container
4991           l_tmp_split_qty := l_quantity_left;
4992           l_quantity_left := 0;
4993 
4994           -- Assign the dd to container
4995           g_assign_detail_index := g_assign_detail_index + 1;
4996           g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := p_line_cont_rec.delivery_detail_id;
4997           g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
4998           g_assign_detail_tab(g_assign_detail_index).container_index := g_empty_cont_tab(i).container_index;
4999           g_assign_detail_tab(g_assign_detail_index).gross_weight := l_dd_gross_wt_left;
5000           g_assign_detail_tab(g_assign_detail_index).net_weight := l_dd_net_wt_left;
5001           g_assign_detail_tab(g_assign_detail_index).volume := l_dd_vol_left;
5002           -- J: W/V Changes
5003           g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5004           g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5005           g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5006           -- K LPN CONV. rv
5007           g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5008           g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5009 
5010           --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);
5011 
5012         ELSIF (l_tmp_split_qty < l_quantity_left) THEN
5013           -- Some qty will be left out
5014 --- HW OPM BUG#3011758
5015 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
5016 --            - 2) Changed check condition for lot divisible from 1 to 'N'
5017           IF( p_line_cont_rec.lot_divisible_flag = 'N')    THEN
5018              goto next_cont;
5019           END IF;
5020 
5021           l_quantity_left := l_quantity_left - l_tmp_split_qty;
5022 
5023           --dbms_output.put_line('Splitting dd '||p_line_cont_rec.delivery_detail_id||' with qty '||l_tmp_split_qty);
5024           --
5025           IF l_debug_on THEN
5026               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
5027               WSH_DEBUG_SV.logmsg(l_module_name,'SPLIT QTY IS'||l_tmp_split_qty);
5028           END IF;
5029           --
5030 
5031 -- added l_dd_id_tab for Bulk call
5032 -- empty container logic, need to test and modify this
5033 -- the value for p_num_of_split is passed as 1
5034 -- so that split occurs once
5035 
5036           WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details_bulk (
5037                p_from_detail_id => p_line_cont_rec.delivery_detail_id,
5038                p_req_quantity   => l_tmp_split_qty,
5039                p_req_quantity2  => l_tmp_split_qty2,
5040                p_manual_split   => 'C',
5041                p_num_of_split  => 1,
5042                x_new_detail_id  => l_split_del_detail_id,
5043                x_dd_id_tab     => l_dd_id_tab,
5047           IF l_debug_on THEN
5044                x_return_status  => l_return_status
5045               );
5046 
5048             WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5049           END IF;
5050 --dbms_output.put_line('STATUS after SPLITDD in empty'||l_return_status||l_dd_id_tab.count);
5051 
5052           IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
5053                                  WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
5054             --dbms_output.put_line('WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details returned '|| l_return_status);
5055             x_return_status := C_ERROR_STATUS;
5056             --dbms_output.put_line('WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details returned '||x_return_status);
5057             FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
5058             FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_line_cont_rec.delivery_detail_id);
5059             WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5060             --
5061             IF l_debug_on THEN
5062                 WSH_DEBUG_SV.pop(l_module_name);
5063             END IF;
5064             --
5065             return;
5066           END IF;
5067 
5068           IF l_debug_on THEN
5069             WSH_DEBUG_SV.logmsg(l_module_name,'COUNT OF WDD RECORDS IS'||l_dd_id_tab.count);
5070           END IF;
5071 
5072           --dbms_output.put_line('Created new dd '||l_split_del_detail_id);
5073 
5074           -- Calculate distributed wt/vol for the new dd
5075           l_tot_gross_wt := ROUND((l_tmp_split_qty * p_line_cont_rec.gross_weight)/p_line_cont_rec.shp_qty, LIMITED_PRECISION);
5076           l_tot_net_wt   := ROUND((l_tmp_split_qty * p_line_cont_rec.net_weight)/p_line_cont_rec.shp_qty, LIMITED_PRECISION);
5077           l_tot_vol      := ROUND((l_tmp_split_qty * p_line_cont_rec.volume)/p_line_cont_rec.shp_qty, LIMITED_PRECISION);
5078           l_dd_gross_wt_left := l_dd_gross_wt_left - l_tot_gross_wt;
5079           l_dd_net_wt_left   := l_dd_net_wt_left - l_tot_net_wt;
5080           l_dd_vol_left      := l_dd_vol_left - l_tot_vol;
5081 
5082 -- Use Bulk assignment into this PL SQL table
5083 -- from the returned PL SQL table
5084 -- weight volume will be same
5085 -- Look for empty container population in record, is this correct???
5086 
5087         FOR j in 1..l_dd_id_tab.count
5088         LOOP
5089           -- Assign the newly created dd
5090 --dbms_output.put_line('Value of j is'||j);
5091           g_assign_detail_index := g_assign_detail_index + 1;
5092           --g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_split_del_detail_id;
5093           g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_dd_id_tab(j);
5094           g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5095           g_assign_detail_tab(g_assign_detail_index).container_index := g_empty_cont_tab(i).container_index;
5096           g_assign_detail_tab(g_assign_detail_index).gross_weight := l_tot_gross_wt;
5097           g_assign_detail_tab(g_assign_detail_index).net_weight := l_tot_net_wt;
5098           g_assign_detail_tab(g_assign_detail_index).volume := l_tot_vol;
5099           -- J: W/V Changes
5100           g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5101           g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5102           g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5103           -- K LPN CONV. rv
5104           g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5105           g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5106           --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);
5107 
5108          -- j := j + 1;
5109 
5110          END LOOP;
5111          l_dd_id_tab.DELETE;
5112         END IF;
5113 
5114         -- Calcualte space left and see if container needs to be deleted from empty cont PL/SQL table
5115         IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
5116           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);
5117           g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator * l_max_load_qty;
5118 
5119 	  /* Bug # 3005780 : Added GCD just to reduce the numerator and denominator values
5120 	   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
5121 	   allowable value in NUMBER data type. to overcome that problem using the Get_Gcd function which limit the both numerator and denominator                   */
5122           IF (g_empty_cont_tab(i).numerator <> 0 ) AND (g_empty_cont_tab(i).denominator <> 0 ) THEN
5123               gcdvalue := Get_Gcd(g_empty_cont_tab(i).numerator , g_empty_cont_tab(i).denominator);
5124               --dbms_output.put_line('Get_Gcd return value is  '||gcdvalue');
5125               IF (gcdvalue > 1) THEN
5126                   g_empty_cont_tab(i).numerator := g_empty_cont_tab(i).numerator / gcdvalue;
5127                   g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator / gcdvalue ;
5128               END IF;
5129           END IF;
5130           IF ((g_empty_cont_tab(i).numerator <= 0) OR
5131               (g_empty_cont_tab(i).numerator >= g_empty_cont_tab(i).denominator)) THEN
5132             --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
5133             g_empty_cont_tab.DELETE(i);
5134           END IF;
5138           IF (g_empty_cont_tab(i).empty <= 0) THEN
5135         ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
5136           l_wt_left       := l_wt_left - ROUND(l_tmp_split_qty*l_weight_per_pc,LIMITED_PRECISION);
5137           g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - (l_tmp_split_qty * l_weight_per_pc);
5139             --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
5140             g_empty_cont_tab.DELETE(i);
5141           END IF;
5142         ELSE
5143           l_vol_left       := l_vol_left - ROUND(l_tmp_split_qty*l_volume_per_pc,LIMITED_PRECISION);
5144           g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - (l_tmp_split_qty * l_volume_per_pc);
5145           IF (g_empty_cont_tab(i).empty <= 0) THEN
5146             --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
5147             g_empty_cont_tab.DELETE(i);
5148           END IF;
5149         END IF;
5150 
5151       END IF; -- l_tmp_split_qty <= 0
5152 
5153       -- If the whole qty is packed then exit the loop
5154       IF (l_quantity_left <= 0) THEN
5155         EXIT;
5156       END IF;
5157 
5158       <<next_cont>>
5159         i := g_empty_cont_tab.NEXT(i);
5160     END LOOP;
5161   END IF; -- g_empty_cont_tab > 0
5162 
5163 --dbms_output.put_line('AFter EMPTY containers with empty space'||to_char(sysdate,'HH24:MI:SS'));
5164 
5165   --dbms_output.put_line(' *** Looping empty cont tab is Over and Quantity Left is '||l_quantity_left||' ***');
5166   IF (l_quantity_left > 0) THEN
5167     -- Some qty is left out
5168 
5169     IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
5170 
5171       l_tmp_split_qty  := l_max_load_qty;
5172       l_split_qty      := l_tmp_split_qty;
5173 
5174     ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
5175 
5176       -- Need to do TRUNC instead of ROUND because of following case
5177       -- 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
5178       --     Total wt of split dd will be 0.66667 * 3 = 2.00001 which is > Cont capacity
5179       l_tmp_split_qty := TRUNC((l_quantity_left*l_mtl_max_load)/l_wt_left,LIMITED_PRECISION);
5180       l_split_qty := l_tmp_split_qty;
5181       --dbms_output.put_line('l_quantity_left '||l_quantity_left||' l_wt_left '||l_wt_left||' l_mtl_max_load '||l_mtl_max_load);
5182 
5183     ELSE
5184 
5185       l_tmp_split_qty := TRUNC((l_quantity_left*l_mtl_max_vol)/l_vol_left,LIMITED_PRECISION);
5186       l_split_qty := l_tmp_split_qty;
5187       --dbms_output.put_line('l_quantity_left '||l_quantity_left||' l_vol_left '||l_vol_left||' l_mtl_max_vol '||l_mtl_max_vol);
5188 
5189     END IF;
5190     -- l_tmp_split_qty holds max that can be packed into a new container
5191     --dbms_output.put_line(' l_tmp_split_qty '||l_tmp_split_qty);
5192 
5193     -- Per Pushkar,OPM: Call Check_Decimal_Quantity for both OPM and Discrete for primary quantity
5194     --
5195     IF l_debug_on THEN
5196         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
5197     END IF;
5198     --
5199     WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
5200        p_line_cont_rec.inventory_item_id,
5201        p_line_cont_rec.organization_id,
5202        l_tmp_split_qty,
5203        p_line_cont_rec.req_qty_uom,
5204        l_output_qty,
5205        l_return_status);
5206 
5207     IF l_debug_on THEN
5208       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5209     END IF;
5210     IF (l_return_status <> C_SUCCESS_STATUS OR
5211         p_line_cont_rec.indivisible_flag = 'Y')THEN
5212       -- Fractional qtys not allowed
5213       --dbms_output.put_line('WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity returned '||l_return_status);
5214       l_discard_message := FND_MESSAGE.GET;
5215       l_split_qty  := FLOOR(l_tmp_split_qty);
5216     END IF;
5217 
5218 -- HW OPMCONV - 1) No need to check for process
5219 --            - 2) Changed code to handle qty2
5220 
5221     IF ( p_line_cont_rec.shp_qty2 IS NOT NULL ) THEN
5222       l_split_qty2 := (l_split_qty * p_line_cont_rec.shp_qty2)/p_line_cont_rec.shp_qty;
5223     ELSE
5224       l_split_qty2 := NULL;
5225     END IF;
5226     -- Split Qty holds quantity that can be packed into a container
5227 
5228     --dbms_output.put_line('l_split_qty '||l_split_qty||' l_split_qty2 '||l_split_qty2);
5229 -- initialize the variables
5230     l_count_container := 0;
5231     l_container_item_id := -99;
5232     l_container_org_id := -99;
5233 
5234 --dbms_output.put_line('Before LOOP in pack DD'||to_char(sysdate,'HH24:MI:SS'));
5235     WHILE (l_quantity_left > 0) LOOP
5236 
5237       -- Create new container index
5238       --g_new_cont_index := g_new_cont_index + 1;
5239 
5240 -- added code here
5241       IF (p_line_cont_rec.preferred_container = l_container_item_id
5242           AND p_line_cont_rec.organization_id = l_container_org_id)
5243       THEN
5244 -- keep appending this logic is moved to the end
5245         null;
5246       ELSE
5247 -- reset counter
5248         l_count_container := 0;
5249       END IF;
5250 
5251       l_container_item_id := p_line_cont_rec.preferred_container;
5252       l_container_org_id := p_line_cont_rec.organization_id;
5253 
5254       --dbms_output.put_line('Created Container index '||g_new_cont_index);
5255       --dbms_output.put_line('l_tmp_split_qty '||l_tmp_split_qty||' l_split_qty '||l_split_qty);
5256 
5257       IF (l_split_qty < l_quantity_left
5258           AND l_split_qty > 0
5262 
5259          ) THEN
5260         -- Quantity left is > Split qty
5261         l_num_of_split := CEIL(l_quantity_left/l_split_qty) -1;
5263         -- Start BugFix#3475352
5264 	IF (l_num_of_split + 1) > 100000 THEN
5265             x_return_status := C_ERROR_STATUS;
5266             FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONT_COUNT');
5267             FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_line_cont_rec.delivery_detail_id);
5268             WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5269 	    return;
5270         END IF;
5271         -- End BugFix#3475352
5272 
5273         --dbms_output.put_line('Splitting dd '||p_line_cont_rec.delivery_detail_id||' with qty '||l_split_qty);
5274         IF l_debug_on THEN
5275             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
5276             WSH_DEBUG_SV.logmsg(l_module_name,'Split Qty is'||l_split_qty);
5277             WSH_DEBUG_SV.logmsg(l_module_name,'Number of split is'||l_num_of_split);
5278         END IF;
5279 
5280 --this is in Main Loop
5281 -- Call BULK Split API
5282 
5283 --dbms_output.put_line('======BEFORE SPLIT'||l_dd_id_tab.count||'<'||l_num_of_split);
5284 
5285         WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details_bulk (
5286              p_from_detail_id => p_line_cont_rec.delivery_detail_id,
5287              p_req_quantity   => l_split_qty,
5288              p_req_quantity2  => l_split_qty2,
5289              p_manual_split   => 'C',
5290              p_num_of_split   => l_num_of_split,
5291              x_new_detail_id  => l_split_del_detail_id,
5292              x_dd_id_tab      => l_dd_id_tab,
5293              x_return_status  => l_return_status
5294         );
5295 
5296     IF l_debug_on THEN
5297       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5298     END IF;
5299 
5300         IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
5301                                  WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
5302           --dbms_output.put_line('WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details returned '|| l_return_status);
5303           x_return_status := C_ERROR_STATUS;
5304           FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
5305           FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_line_cont_rec.delivery_detail_id);
5306           WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5307 
5308           IF l_debug_on THEN
5309               WSH_DEBUG_SV.pop(l_module_name);
5310           END IF;
5311 
5312           return;
5313         END IF;
5314 --dbms_output.put_line('======AFTER SPLIT'||l_dd_id_tab.count);
5315 
5316       ELSE -- (l_split_qty < l_quantity_left)
5317       -- l_quantity_left <= l_split_qty which means there is no more qty left
5318 
5319         l_split_qty := l_quantity_left;
5320         l_split_del_detail_id := p_line_cont_rec.delivery_detail_id;
5321         l_dd_id_tab(l_dd_id_tab.count + 1) := p_line_cont_rec.delivery_detail_id;
5322       END IF;
5323       --dbms_output.put_line('l_tmp_split_qty '||l_tmp_split_qty||' l_split_qty '||l_split_qty);
5324 
5325       -- Insert the new container into empty PL/SQL cont table only if l_tmp_split_qty > l_split_qty
5326       -- Otherwise Container is full
5327       IF ((l_tmp_split_qty - l_split_qty) > 0) THEN
5328         -- l_tmp_split_qty > l_split_qty means container is not full and
5329         -- we need to calculate how much empty space is left
5330         IF (g_empty_cont_tab.COUNT = 0) THEN
5331           j := 1;
5332         ELSE
5333           j:= g_empty_cont_tab.LAST + 1;
5334         END IF;
5335         --g_empty_cont_tab(j).container_index   := g_new_cont_index;
5336 -- changed this part
5337         g_empty_cont_tab(j).container_index   := g_new_cont_index + 1;
5338         g_empty_cont_tab(j).container_item_id := p_line_cont_rec.preferred_container;
5339         g_empty_cont_tab(j).organization_id   := p_line_cont_rec.organization_id;
5340         g_empty_cont_tab(j).group_id          := p_line_cont_rec.group_id;
5341         g_empty_cont_tab(j).mast_cont_item_id := p_line_cont_rec.master_cont_item_id;
5342 
5343         -- Calculate Empty Space
5344         IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
5345           g_empty_cont_tab(j).numerator   := l_max_load_qty - l_split_qty;
5346           g_empty_cont_tab(j).denominator := l_max_load_qty;
5347           --dbms_output.put_line('Inserted Container '||j||' with numerator '||g_empty_cont_tab(j).numerator||' and denominator '||g_empty_cont_tab(j).denominator);
5348         ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
5349           g_empty_cont_tab(j).empty             := l_mtl_max_load - (l_split_qty * l_weight_per_pc);
5350           --dbms_output.put_line('Inserted Container '||j||' with empty weight '||g_empty_cont_tab(j).empty||' into empty cont');
5351         ELSE
5352           g_empty_cont_tab(j).empty             := l_mtl_max_vol - ROUND(l_split_qty * l_volume_per_pc,LIMITED_PRECISION);
5353           --dbms_output.put_line('Inserted Container '||j||' with empty volume '||g_empty_cont_tab(j).empty||' into empty cont');
5354         END IF;
5355       END IF;
5356 
5357       -- Calculate distributed wt/vol for the new dd
5358       l_tot_gross_wt  := ROUND((l_split_qty * p_line_cont_rec.gross_weight)/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
5359       l_tot_net_wt    := ROUND((l_split_qty * p_line_cont_rec.net_weight)/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
5360       l_tot_vol       := ROUND((l_split_qty * p_line_cont_rec.volume)/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
5361 --dbms_output.put_line('l_tot_vol '||l_tot_vol||' l_dd_vol_left '||l_dd_vol_left);
5362 
5363       -- Assign the split dd/existing dd
5367         FOR j in 1..l_dd_id_tab.count
5364 -- changed the call to populate the PL SQL table
5365 
5366       IF l_dd_id_tab.count > 0 THEN
5368         LOOP
5369           IF l_count_container > 0 THEN
5370             l_count_container := l_count_container + 1;
5371             g_new_container_tab(g_num_cont_index).number_of_containers := l_count_container;
5372             g_new_cont_index := g_new_cont_index + 1;
5373           ELSE
5374             l_count_container := 1;
5375             g_num_cont_index := g_num_cont_index + 1;
5376             g_new_cont_index := g_new_cont_index + 1;
5377             g_new_container_tab(g_num_cont_index).container_item_id := p_line_cont_rec.preferred_container;
5378             g_new_container_tab(g_num_cont_index).organization_id   := p_line_cont_rec.organization_id;
5379             g_new_container_tab(g_num_cont_index).mast_cont_item_id := p_line_cont_rec.master_cont_item_id;
5380             g_new_container_tab(g_num_cont_index).number_of_containers := l_count_container;
5381 
5382           END IF;
5383 
5384           g_assign_detail_index := g_assign_detail_index + 1;
5385           g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_dd_id_tab(j);
5386           g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5387           g_assign_detail_tab(g_assign_detail_index).container_index    := g_new_cont_index;
5388           g_assign_detail_tab(g_assign_detail_index).gross_weight := l_tot_gross_wt;
5389           g_assign_detail_tab(g_assign_detail_index).net_weight := l_tot_net_wt;
5390           g_assign_detail_tab(g_assign_detail_index).volume := l_tot_vol;
5391           -- J: W/V Changes
5392           g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5393           g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5394           g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5395           -- K LPN CONV. rv
5396           g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5397           g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5398           -- K LPN CONV. rv
5399 
5400           l_quantity_left := l_quantity_left - l_split_qty;
5401           l_dd_gross_wt_left  := l_dd_gross_wt_left - l_tot_gross_wt;
5402           l_dd_net_wt_left  := l_dd_net_wt_left - l_tot_net_wt;
5403           l_dd_vol_left := l_dd_vol_left - l_tot_vol;
5404 
5405         END LOOP;
5406 
5407         l_dd_id_tab.DELETE;
5408 
5409 -- so that this table is not read later,
5410 -- we continue in the LOOP even if qty_left = 1, so in that case
5411 -- should not reach here
5412 
5413 --  commented this and put it in the LOOP above
5414 --         l_quantity_left := GREATEST(l_quantity_left - (FLOOR(l_quantity_left/l_split_qty) *l_split_qty),0);
5415       ELSE
5416         g_assign_detail_index := g_assign_detail_index + 1;
5417         g_new_cont_index := g_new_cont_index + 1;
5418         g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_split_del_detail_id;
5419         g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5420         g_assign_detail_tab(g_assign_detail_index).container_index    := g_new_cont_index;
5421         g_assign_detail_tab(g_assign_detail_index).gross_weight := l_tot_gross_wt;
5422         g_assign_detail_tab(g_assign_detail_index).net_weight := l_tot_net_wt;
5423         g_assign_detail_tab(g_assign_detail_index).volume := l_tot_vol;
5424         -- J: W/V Changes
5425         g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5426         g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5427         g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5428         -- K LPN CONV. rv
5429         g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5430         g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5431         -- K LPN CONV. rv
5432       --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);
5433 
5434         l_quantity_left := l_quantity_left - l_split_qty;
5435 
5436       END IF;
5437 
5438 
5439       -- If there is no more qty left, then adjust any wt/vol left on last dd
5440       IF (l_quantity_left <= 0) THEN
5441         --dbms_output.put_line('Assigning the left over Weight');
5442         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;
5443         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;
5444         g_assign_detail_tab(g_assign_detail_index).volume := g_assign_detail_tab(g_assign_detail_index).volume + l_dd_vol_left;
5445       END IF;
5446       --dbms_output.put_line('l_quantity_left '||l_quantity_left);
5447 
5448     END LOOP;
5449 
5450 --dbms_output.put_line('End of Pack DD, Count is '||l_count_container||to_char(sysdate,'HH24:MI:SS'));
5451 
5452   END IF;
5453   x_return_status := C_SUCCESS_STATUS;
5454   --
5455   IF l_debug_on THEN
5456       WSH_DEBUG_SV.pop(l_module_name);
5457   END IF;
5458   --
5459   RETURN;
5460 
5461 EXCEPTION
5462   WHEN Others THEN
5463         WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Pack_Delivery_Detail',l_module_name);
5464         x_return_status := C_UNEXP_ERROR_STATUS;
5465 
5466 --
5470 END IF;
5467 IF l_debug_on THEN
5468     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
5469     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
5471 --
5472 END Pack_Delivery_Detail;
5473 
5474 /*
5475 -----------------------------------------------------------------------------
5476    PROCEDURE  : Validate_Dd_for_Pack
5477    PARAMETERS : p_group_id_tab_id - table of group ids for lines that need to
5478 			            be autopacked.
5479 		p_del_detail_tab  - table of delivery detail ids
5480 		x_line_cont_tab   - Delivery Details along with other info
5481 			            which passed validations
5482 		x_error_cnt       - Count of errors encountered during validation
5483 		x_warn_cnt        - Count of warnings encountered during validation
5484                 x_fill_pc_warn_cnt - Count of Fill Percent Basis 'None' dds.
5485                 x_fill_pc_warn_cnt - Count of details with Fill Percent Basis 'None'.
5486                 x_release_warn_cnt - Count of 'Released to Warehouse' dds.
5487   DESCRIPTION : This procedure takes a list of delivery details and does all
5488                 validations and returns a list of delivery details which passed
5489                 validations
5490 ------------------------------------------------------------------------------
5491 */
5492 
5493 PROCEDURE Validate_Dd_for_Pack(
5494   p_group_id_tab      IN  WSH_UTIL_CORE.id_tab_type,
5495   p_del_detail_tab    IN  WSH_UTIL_CORE.id_tab_type,
5496   x_line_cont_tab     OUT NOCOPY  wsh_container_actions.line_cont_info_tab,
5497   x_error_cnt         OUT NOCOPY  NUMBER,
5498   x_warn_cnt          OUT NOCOPY  NUMBER,
5499   x_fill_pc_warn_cnt  OUT NOCOPY  NUMBER, -- bug 3562797 jckwok
5500   x_release_warn_cnt  OUT NOCOPY  NUMBER) IS
5501 
5502   CURSOR Get_dd_Detail IS
5503   SELECT wdd.inventory_item_id inventory_item_id,
5504          NVL(wdd.shipped_quantity, NVL(wdd.picked_quantity, wdd.requested_quantity)) packed_quantity,
5505          NVL(wdd.shipped_quantity2, NVL(wdd.picked_quantity2, wdd.requested_quantity2)) packed_quantity2,
5506          NVL(wdd.picked_quantity, wdd.requested_quantity) picked_quantity,
5507          NVL(wdd.picked_quantity2, wdd.requested_quantity2) picked_quantity2,
5508          wdd.requested_quantity_uom requested_quantity_uom,
5509          nvl(wdd.wv_frozen_flag,'Y') wv_frozen_flag,
5510          wdd.gross_weight gross_weight,
5511          wdd.net_weight net_weight,
5512          wdd.weight_uom_code weight_uom_code,
5513          wdd.volume volume,
5514          wdd.volume_uom_code volume_uom_code,
5515          wdd.detail_container_item_id detail_container_item_id,
5516          wdd.master_container_item_id master_container_item_id,
5517          wdd.organization_id organization_id,
5518          wdd.source_line_id source_line_id,
5519          wdd.delivery_detail_id delivery_detail_id,
5520          wdd.released_status,
5521          wdd.source_code,
5522          wda.parent_delivery_detail_id parent_delivery_detail_id,
5523          wda.delivery_id delivery_id, --  added delivery id
5524          msi.indivisible_flag indivisible_flag
5525   FROM   WSH_DELIVERY_DETAILS wdd,
5526          wsh_delivery_assignments_v wda,
5527          MTL_SYSTEM_ITEMS msi,
5528          WSH_TMP wt
5529   WHERE  wdd.delivery_detail_id =  wt.id
5530   AND    wdd.delivery_detail_id = wda.delivery_detail_id
5531   AND    wdd.container_flag     = 'N'
5532   AND    wdd.inventory_item_id  = msi.inventory_item_id
5533   AND    wdd.organization_id    = msi.organization_id
5534   ORDER BY wdd.organization_id,wdd.inventory_item_id,source_line_id;
5535 
5536   CURSOR Get_Cont_Item_Load (v_inv_item_id NUMBER, v_cont_item_id NUMBER, v_organization_id NUMBER) IS
5537   SELECT max_load_quantity
5538   FROM   WSH_CONTAINER_ITEMS
5539   WHERE  load_item_id           = v_inv_item_id
5540   AND    container_item_id      = v_cont_item_id
5541   AND    master_organization_id = v_organization_id;
5542 
5543   line_cont_rec line_cont_info;
5544   line_cont_tab line_cont_info_tab;
5545 
5546   l_dd_count        NUMBER;
5547   l_group_id        NUMBER;
5548   l_wcl_cont_item_id NUMBER;
5549   l_fill_pc_basis   VARCHAR2(1);
5550   l_max_load_qty    NUMBER;
5551   l_item_load_found BOOLEAN;
5552 
5553   l_return_status   VARCHAR2(1);
5554 
5555   l_dd_gross_wt     NUMBER;
5556   l_dd_net_wt       NUMBER;
5557   l_dd_volume       NUMBER;
5558   l_mtl_max_load    NUMBER;
5559   l_mtl_max_vol     NUMBER;
5560   l_mtl_wt_uom      VARCHAR2(3);
5561   l_mtl_vol_uom     VARCHAR2(3);
5562   l_tmp_num_cont    NUMBER;
5563   l_discard_message VARCHAR2(2000);
5564   l_output_qty      NUMBER;
5565   l_process_flag    VARCHAR2(1);
5566   l_last_organization_id NUMBER;
5567   l_error_cnt       NUMBER := 0;
5568 
5569   warn_cnt          NUMBER := 0;
5570   error_cnt         NUMBER := 0;
5571   release_warn_cnt  NUMBER := 0;
5572   fill_pc_warn_cnt  NUMBER := 0; -- bug 3562797 jckwok
5573 --
5574 l_debug_on BOOLEAN;
5575 --
5576 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'VALIDATE_DD_FOR_PACK';
5577 --
5578 
5579 -- HW OPMCONV - New variable to hold item info
5580 l_item_info                   WSH_DELIVERY_DETAILS_INV.mtl_system_items_rec;
5581 -- HW OPM BUG# 3011758
5582 -- HW OPMCONV - Removed opm variables
5583 
5584 -- HW OPMCONV - Renamed variable from lot_indivisible to l_lot_divisible_flag
5585 l_lot_divisible_flag                        VARCHAR2(1);
5586 
5587 -- HW OPMCONV - New variables to hold warnings and errors
5588 l_num_warnings                NUMBER :=0;
5592 
5589 l_num_errors                  NUMBER := 0;
5590 x_return_status VARCHAR2(5);
5591 BEGIN
5593   --dbms_output.put_line('---------------------------');
5594   --dbms_output.put_line('In Validate_Dd_for_Pack ...');
5595   --dbms_output.put_line('---------------------------');
5596 
5597   -- 10. Delete and Bulk Insert into the wsh_tmp table
5598   --
5599   --
5600   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
5601   --
5602   IF l_debug_on IS NULL
5603   THEN
5604       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
5605   END IF;
5606   --
5607   IF l_debug_on THEN
5608       WSH_DEBUG_SV.push(l_module_name);
5609   END IF;
5610   --
5611   DELETE FROM wsh_tmp;
5612 
5613   FORALL i IN 1..p_del_detail_tab.count
5614     INSERT INTO wsh_tmp (id) VALUES(p_del_detail_tab(i));
5615 
5616   -- 20. Populate  detail dd info into line_cont_tab PL/SQL table
5617   l_last_organization_id := NULL;
5618   l_dd_count := 0;
5619 
5620   FOR rec in get_dd_detail
5621   LOOP
5622     --dbms_output.put_line('Processing dd '||rec.delivery_detail_id||' Org '||rec.organization_id);
5623 
5624     -- 20.10 Delete Organization Specfic Cached Tables if organization_id changes
5625     IF ((l_last_organization_id IS NULL) OR (rec.organization_id <> l_last_organization_id)) THEN
5626       g_cache_cont_load_info_tab.DELETE;
5627       g_cont_msi_tab.DELETE;
5628 
5629       l_last_organization_id := rec.organization_id;
5630     END IF;
5631 
5632 
5633     /* grouping API will return a number = negative delivery_id if the line is
5634        already assigned to a delivery. So, check for negative numbers and if number
5635        < 0, then convert it to a postive number = delivery_id.
5636     */
5637     l_group_id := ABS(p_group_id_tab(rec.delivery_detail_id));
5638     --dbms_output.put_line('l_group_id '||l_group_id);
5639 
5640     -- 20.12 Populate line_cont_tab PL/SQL table now
5641     IF ((rec.packed_quantity <> 0) AND (rec.released_status NOT IN ('C','D'))) THEN
5642       line_cont_rec.group_id            := l_group_id;
5643       line_cont_rec.delivery_detail_id  := rec.delivery_detail_id;
5644       line_cont_rec.inventory_item_id   := rec.inventory_item_id;
5645       line_cont_rec.shp_qty             := rec.packed_quantity;
5646       line_cont_rec.shp_qty2            := rec.packed_quantity2;
5647       line_cont_rec.req_qty             := rec.picked_quantity;
5648       line_cont_rec.req_qty2            := rec.picked_quantity2;
5649       line_cont_rec.req_qty_uom         := rec.requested_quantity_uom;
5650       line_cont_rec.detail_cont_item_id := rec.detail_container_item_id;
5651       line_cont_rec.master_cont_item_id := rec.master_container_item_id;
5652       line_cont_rec.gross_weight        := rec.gross_weight;
5653       line_cont_rec.net_weight          := rec.net_weight;
5654       line_cont_rec.weight_uom          := rec.weight_uom_code;
5655       line_cont_rec.volume              := rec.volume;
5656       line_cont_rec.volume_uom          := rec.volume_uom_code;
5657       line_cont_rec.organization_id     := rec.organization_id;
5658       line_cont_rec.source_line_id      := rec.source_line_id;
5659       line_cont_rec.indivisible_flag    := rec.indivisible_flag;
5660       line_cont_rec.delivery_id         := rec.delivery_id;
5661     ELSE
5662       goto next_detail;
5663     END IF;
5664 
5665     -- 20.20 Check if the detail is already packed
5666     IF (rec.parent_delivery_detail_id IS NOT NULL) THEN
5667       --dbms_output.put_line('Warning: dd already packed');
5668       warn_cnt := warn_cnt + 1;
5669       goto next_detail;
5670     END IF;
5671 
5672     -- 20.30 Ignore dds with status 'Released to Warehouse'
5673     IF (rec.released_status = 'S') THEN
5674       release_warn_cnt := release_warn_cnt + 1;
5675       goto next_detail;
5676     END IF;
5677 
5678      --dbms_output.put_line('Before calc_fill_basis');
5679 
5680     -- 20.40 Determine Fill PC Basis from shipping parameters and Process Flag
5681     Calc_Fill_Basis_and_Proc_Flag(
5682       p_organization_id => rec.organization_id,
5683       x_return_status   => l_return_status,
5684       x_fill_basis      => l_fill_pc_basis,
5685       x_process_flag    => l_process_flag);
5686 
5687 
5688     IF (l_return_status <> C_SUCCESS_STATUS) THEN
5689       error_cnt := error_cnt + 1;
5690       goto next_detail;
5691     END IF;
5692     --
5693     -- bug 3562797 jckwok  - Ignore dds with 'Shipping Parameter' percent fill basis as None.
5694     -- Increment fill_pc_warn_cnt so that the caller know how many had fill basis of None.
5695     --
5696     IF (l_fill_pc_basis = 'N') THEN
5697       fill_pc_warn_cnt := fill_pc_warn_cnt + 1;
5698       goto next_detail;
5699     END IF;
5700     -- end bug
5701 
5702     line_cont_rec.fill_pc_basis := l_fill_pc_basis;
5703 -- HW OPMCONV - No need to populate this value
5704 --  line_cont_rec.process_flag  := l_process_flag;
5705 
5706 -- HW OPM BUG#:3011758 Retrieve OPM item information
5707 -- HW OPMCONV - 1)Change the call from OPM API to get item info
5708 --                to a new WSH API
5709 --            - 2) Remove checking for process
5710 
5711     WSH_DELIVERY_DETAILS_INV.Get_item_information
5712           (
5713                p_organization_id       => rec.organization_id
5714               , p_inventory_item_id    => rec.inventory_item_id
5715               , x_mtl_system_items_rec => l_item_info
5716               , x_return_status        => l_return_status
5717             );
5718 
5719 
5720      IF l_debug_on THEN
5724      wsh_util_core.api_post_call
5721       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5722     END IF;
5723 
5725       (
5726         p_return_status => l_return_status,
5727         x_num_warnings  => l_num_warnings,
5728         x_num_errors    => l_num_errors
5729       );
5730 
5731      IF (  l_item_info.lot_divisible_flag = 'N' AND
5732            l_item_info.lot_control_code= 2) THEN
5733          line_cont_rec.lot_divisible_flag := 'N';
5734      ELSE
5735          line_cont_rec.lot_divisible_flag := 'Y';
5736      END IF;
5737 
5738 
5739 -- HW OPMCONV - No need to check for process_flag. Removed OR condition
5740     IF (line_cont_rec.fill_pc_basis IS NULL) THEN
5741       --dbms_output.put_line('Skipping dd');
5742 
5743       goto next_detail;
5744     END IF;
5745 
5746     -- 20.50 Determine Preferred Container
5747     line_cont_rec.preferred_container := nvl(rec.detail_container_item_id,rec.master_container_item_id);
5748     line_cont_rec.max_load_qty := NULL;
5749 
5750      --dbms_output.put_line('Before calc_pref_cont');
5751 
5752     IF (line_cont_rec.preferred_container IS NULL) THEN
5753 
5754       Calc_Pref_Container(
5755         p_organization_id   => rec.organization_id,
5756         p_inventory_item_id => rec.inventory_item_id,
5757         p_fill_pc_basis     => line_cont_rec.fill_pc_basis,
5758         x_return_status     => l_return_status,
5759         x_error_cnt         => l_error_cnt,
5760         x_cont_item_id      => l_wcl_cont_item_id,
5761         x_max_load_qty      => l_max_load_qty);
5762 
5763       IF l_debug_on THEN
5764         WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5765       END IF;
5766 
5767       IF (l_return_status = C_ERROR_STATUS) THEN
5768         error_cnt := error_cnt + l_error_cnt;
5769       END IF;
5770 
5771       line_cont_rec.preferred_container := l_wcl_cont_item_id;
5772       line_cont_rec.max_load_qty        := l_max_load_qty;
5773     END IF;
5774 
5775     -- bug 3440811
5776     validate_container(
5777       p_organization_id  => rec.organization_id,
5778       p_cont_item_id     => line_cont_rec.preferred_container,
5779       x_return_status    => l_return_status);
5780 
5781     IF (l_return_status IN (C_UNEXP_ERROR_STATUS,C_ERROR_STATUS)) THEN
5782         line_cont_rec.preferred_container := null;
5783         line_cont_rec.max_load_qty := null;
5784         l_error_cnt := l_error_cnt + 1;
5785         error_cnt := error_cnt + l_error_cnt;
5786     END IF;
5787     -- bug 3440811
5788 
5789 
5790     IF (line_cont_rec.preferred_container is NULL) THEN
5791       --dbms_output.put_line('Skipping dd');
5792       goto next_detail;
5793     END IF;
5794 
5795 
5796     -- 20.60 Calculate Max Load/Converted wt/Converted Vol depending on fill basis
5797     line_cont_rec.converted_wt := NULL;
5798     line_cont_rec.converted_vol := NULL;
5799 
5800      --dbms_output.put_line('FILL BASIS'||line_cont_rec.fill_pc_basis||line_cont_rec.max_load_qty);
5801     IF (line_cont_rec.fill_pc_basis = 'Q') THEN
5802       IF (line_cont_rec.max_load_qty IS NULL) THEN
5803         OPEN Get_Cont_Item_Load (rec.inventory_item_id,line_cont_rec.preferred_container, rec.organization_id);
5804 
5805         FETCH Get_Cont_Item_Load
5806         INTO  l_max_load_qty;
5807 
5808         l_item_load_found := FALSE;
5809         IF Get_Cont_Item_Load%NOTFOUND THEN
5810           l_item_load_found := TRUE;
5811         END IF;
5812         CLOSE Get_Cont_Item_Load;
5813 
5814         IF (l_item_load_found) THEN
5815           --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);
5816 
5817           -- Calculate max load qty depending on Weight/Volume
5818           IF (rec.net_weight IS NULL OR rec.volume IS NULL) THEN
5819             --
5820             IF rec.wv_frozen_flag = 'N' THEN
5821 
5822               IF l_debug_on THEN
5823                   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DETAIL_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
5824               END IF;
5825               --
5826               WSH_WV_UTILS.Detail_Weight_Volume(
5827                    p_delivery_detail_id => rec.delivery_detail_id,
5828                    -- J: W/V Changes
5829                    p_update_flag        => 'Y',
5830                    p_post_process_flag  => 'Y',
5831                    p_calc_wv_if_frozen  => 'N',
5832                    x_net_weight         => l_dd_net_wt,
5833                    x_volume             => l_dd_volume ,
5834                    x_return_status      => l_return_status);
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_SUCCESS_STATUS) THEN
5840                 --dbms_output.put_line('WSH_WV_UTILS.Detail_Weight_Volume did not return success');
5841                 FND_MESSAGE.SET_NAME('WSH','WSH_DET_WT_VOL_FAILED');
5842                 FND_MESSAGE.SET_TOKEN('DETAIL_ID',rec.delivery_detail_id);
5843                 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
5844                 error_cnt := error_cnt + 1;
5845                 --dbms_output.put_line('Skipping this dd');
5846                 goto next_detail;
5847               END IF;
5848 
5849               rec.gross_weight := NVL(rec.gross_weight,l_dd_net_wt);
5850               rec.net_weight   := NVL(rec.net_weight,l_dd_net_wt);
5854 
5851               rec.volume       := NVL(rec.volume,l_dd_volume);
5852 
5853             END IF;
5855             IF ((NVL(rec.net_weight,0) = 0) OR
5856                 (NVL(rec.volume,0) = 0)) THEN
5857               --dbms_output.put_line('Weight or Volume is NULL or 0');
5858               FND_MESSAGE.SET_NAME('WSH', 'WSH_NULL_WEIGHT_VOLUME');
5859               FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL', rec.delivery_detail_id);
5860               WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5861               error_cnt := error_cnt + 1;
5862               --dbms_output.put_line('Skipping this dd');
5863               goto next_detail;
5864             END IF;
5865           END IF;
5866 
5867 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 4');
5868           Get_Cont_Load_Vol_info(
5869              p_container_item_id => line_cont_rec.preferred_container,
5870              p_organization_id   => line_cont_rec.organization_id,
5871              p_w_v_both          => 'B',
5872              x_max_load          => l_mtl_max_load,
5873              x_max_vol           => l_mtl_max_vol,
5874              x_wt_uom            => l_mtl_wt_uom,
5875              x_vol_uom           => l_mtl_vol_uom,
5876              x_return_status     => l_return_status,
5877              x_error_cnt         => l_error_cnt);
5878 
5879           IF l_debug_on THEN
5880             WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5881           END IF;
5882           IF (l_return_status IN (C_ERROR_STATUS,C_UNEXP_ERROR_STATUS)
5883               ) THEN
5884             error_cnt := error_cnt + l_error_cnt;
5885           END IF;
5886 
5887 -- Bug 2786021
5888           IF (nvl(l_mtl_max_load,0) = 0) OR
5889              (nvl(l_mtl_max_vol,0) = 0) THEN
5890             IF l_debug_on THEN
5891               WSH_DEBUG_SV.log(l_module_name,'fill pc is Q,but use Wt or Vol');
5892               WSH_DEBUG_SV.log(l_module_name,'Wt-'||l_mtl_max_load);
5893               WSH_DEBUG_SV.log(l_module_name,'Vol-'||l_mtl_max_vol);
5894             END IF;
5895             FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_MAX_WT_ERROR');
5896             WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5897             error_cnt := error_cnt + l_error_cnt;
5898             goto next_detail;
5899           END IF;
5900 -- Bug 2786021
5901 
5902           IF ((NVL(l_mtl_max_load,0) <= 0) OR (NVL(l_mtl_max_vol,0) <= 0)) THEN
5903             --dbms_output.put_line('Skipping this dd');
5904             goto next_detail;
5905           END IF;
5906 
5907           IF (l_mtl_wt_uom <> rec.weight_uom_code) THEN
5908             --
5909             IF l_debug_on THEN
5910                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
5911             END IF;
5912             --
5913             l_dd_gross_wt := WSH_WV_UTILS.Convert_Uom (
5914                                   from_uom => rec.weight_uom_code,
5915                                   to_uom   => l_mtl_wt_uom,
5916                                   quantity => rec.gross_weight,
5917                                   item_id  => rec.inventory_item_id);
5918           ELSE
5919             l_dd_gross_wt := rec.gross_weight;
5920           END IF;
5921 
5922           IF (l_mtl_vol_uom <> rec.volume_uom_code) THEN
5923             --
5924             IF l_debug_on THEN
5925                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
5926             END IF;
5927             --
5928             l_dd_volume :=  WSH_WV_UTILS.Convert_Uom (
5929                                   from_uom => rec.volume_uom_code,
5930                                   to_uom   => l_mtl_vol_uom,
5931                                   quantity => rec.volume,
5932                                   item_id  => rec.inventory_item_id);
5933           ELSE
5934             l_dd_volume:= rec.volume;
5935           END IF;
5936 
5937           IF ((l_dd_gross_wt/l_mtl_max_load) >= (l_dd_volume/l_mtl_max_vol)) THEN
5938             l_max_load_qty := (l_dd_gross_wt/l_mtl_max_load);
5939           ELSE
5940             l_max_load_qty := (l_dd_volume/l_mtl_max_vol);
5941           END IF;
5942           --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);
5943 
5944           --
5945           IF l_debug_on THEN
5946               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
5947           END IF;
5948           --
5949           WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
5950                       p_item_id         => rec.inventory_item_id,
5951                       p_organization_id => rec.organization_id,
5952                       p_input_quantity  => ROUND((rec.packed_quantity/l_max_load_qty),LIMITED_PRECISION),
5953                       p_uom_code        => rec.requested_quantity_uom,
5954                       x_output_quantity => l_output_qty,
5955                       x_return_status   => l_return_status);
5956 
5957           IF l_debug_on THEN
5958             WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5959           END IF;
5960           IF l_return_status <> C_SUCCESS_STATUS THEN
5961             --dbms_output.put_line('WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity returned '||l_return_status);
5962             l_discard_message := FND_MESSAGE.GET;
5966               FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
5963             l_tmp_num_cont := FLOOR(rec.packed_quantity/l_max_load_qty);
5964 
5965             IF (l_tmp_num_cont = 0) THEN
5967               WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5968               error_cnt := error_cnt + 1;
5969               goto next_detail;
5970             ELSE
5971               --l_max_load_qty := (rec.packed_quantity/l_tmp_num_cont);
5972               l_max_load_qty := l_tmp_num_cont;
5973             END IF;
5974           ELSE
5975             l_max_load_qty := ROUND((rec.packed_quantity/l_max_load_qty),LIMITED_PRECISION);
5976           END IF;
5977         END IF; -- l_item_load_found
5978         line_cont_rec.max_load_qty := l_max_load_qty;
5979 
5980         IF (NVL(line_cont_rec.max_load_qty,0) <= 0) THEN
5981           --dbms_output.put_line('Max Load Qty is NULL or <= 0. Skipping this dd');
5982           FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
5983           WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5984           error_cnt := error_cnt + 1;
5985           goto next_detail;
5986         END IF;
5987 
5988       END IF; -- line_cont_rec.max_load_qty IS NULL
5989       --dbms_output.put_line('line_cont_rec.max_load_qty '||line_cont_rec.max_load_qty);
5990 
5991     ELSIF (line_cont_rec.fill_pc_basis in ('W','V')) THEN
5992       -- Calculate max load qty depending on Weight/Volume
5993       IF ((rec.gross_weight IS NULL AND line_cont_rec.fill_pc_basis = 'W') OR
5994           (rec.volume IS NULL) AND (line_cont_rec.fill_pc_basis = 'V')) THEN
5995         --
5996         IF rec.wv_frozen_flag = 'N' THEN
5997 
5998           IF l_debug_on THEN
5999               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DETAIL_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
6000           END IF;
6001           --
6002           WSH_WV_UTILS.Detail_Weight_Volume(
6003                p_delivery_detail_id => rec.delivery_detail_id,
6004                -- J: W/V Changes
6005                p_update_flag        => 'Y',
6006                p_post_process_flag  => 'Y',
6007                p_calc_wv_if_frozen  => 'N',
6008                x_net_weight         => l_dd_net_wt,
6009                x_volume             => l_dd_volume ,
6010                x_return_status      => l_return_status);
6011 
6012           IF l_debug_on THEN
6013             WSH_DEBUG_SV.log(l_module_name,'return status -,wt,vol',l_return_status||l_dd_net_wt||','||l_dd_volume);
6014           END IF;
6015 
6016           IF (l_return_status <> C_SUCCESS_STATUS) THEN
6017             --dbms_output.put_line('WSH_WV_UTILS.Detail_Weight_Volume did not return success');
6018             FND_MESSAGE.SET_NAME('WSH','WSH_DET_WT_VOL_FAILED');
6019             FND_MESSAGE.SET_TOKEN('DETAIL_ID',rec.delivery_detail_id);
6020             WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6021             error_cnt := error_cnt + 1;
6022             --dbms_output.put_line('Skipping this dd');
6023             goto next_detail;
6024           END IF;
6025 
6026           IF (line_cont_rec.fill_pc_basis = 'W') THEN
6027             rec.gross_weight := NVL(rec.gross_weight,l_dd_net_wt);
6028             rec.net_weight   := NVL(rec.net_weight,l_dd_net_wt);
6029           ELSE
6030             rec.volume := NVL(rec.volume,l_dd_volume);
6031           END IF;
6032 
6033         END IF;
6034 
6035         IF (line_cont_rec.fill_pc_basis = 'W') THEN
6036 
6037           IF (NVL(rec.gross_weight,0) = 0) THEN
6038             --dbms_output.put_line('Weight is NULL or 0');
6039             FND_MESSAGE.SET_NAME('WSH', 'WSH_NULL_WEIGHT_VOLUME');
6040             FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL', rec.delivery_detail_id);
6041             WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6042             error_cnt := error_cnt + 1;
6043             --dbms_output.put_line('Skipping this dd');
6044             goto next_detail;
6045           END IF;
6046         ELSE
6047 
6048           IF (NVL(rec.volume,0) = 0) THEN
6049             --dbms_output.put_line('Volume is NULL or 0');
6050             FND_MESSAGE.SET_NAME('WSH', 'WSH_NULL_WEIGHT_VOLUME');
6051             FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL', rec.delivery_detail_id);
6052             WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6053             error_cnt := error_cnt + 1;
6054             --dbms_output.put_line('Skipping this dd');
6055             goto next_detail;
6056           END IF;
6057         END IF;
6058 
6059       END IF;
6060 
6061 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 3');
6062       Get_Cont_Load_Vol_info(
6063          p_container_item_id => line_cont_rec.preferred_container,
6064          p_organization_id   => line_cont_rec.organization_id,
6065          p_w_v_both          => line_cont_rec.fill_pc_basis,
6066          x_max_load          => l_mtl_max_load,
6067          x_max_vol           => l_mtl_max_vol,
6068          x_wt_uom            => l_mtl_wt_uom,
6069          x_vol_uom           => l_mtl_vol_uom,
6070          x_return_status     => l_return_status,
6071          x_error_cnt         => l_error_cnt);
6072 
6073       IF l_debug_on THEN
6074         WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6075       END IF;
6076       IF (l_return_status = C_ERROR_STATUS) THEN
6077         error_cnt := error_cnt + l_error_cnt;
6078       END IF;
6079 
6080       IF (line_cont_rec.fill_pc_basis = 'W') THEN
6081         IF (NVL(l_mtl_max_load,0) <= 0) THEN
6085 
6082           --dbms_output.put_line('Skipping this dd');
6083           goto next_detail;
6084          END IF;
6086         line_cont_rec.cont_wt := l_mtl_max_load;
6087 
6088         IF (l_mtl_wt_uom <> rec.weight_uom_code) THEN
6089           --
6090           IF l_debug_on THEN
6091               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
6092           END IF;
6093           --
6094           l_dd_gross_wt :=  WSH_WV_UTILS.Convert_Uom (
6095                                 from_uom => rec.weight_uom_code,
6096                                 to_uom   => l_mtl_wt_uom,
6097                                 quantity => rec.gross_weight,
6098                                 item_id  => rec.inventory_item_id);
6099         ELSE
6100           l_dd_gross_wt := rec.gross_weight;
6101         END IF;
6102         line_cont_rec.converted_wt := l_dd_gross_wt;
6103         --dbms_output.put_line('line_cont_rec.converted_wt '||line_cont_rec.converted_wt);
6104       ELSE
6105         IF (NVL(l_mtl_max_vol,0) <= 0) THEN
6106           --dbms_output.put_line('Skipping this dd');
6107           goto next_detail;
6108          END IF;
6109 
6110         line_cont_rec.cont_vol := l_mtl_max_vol;
6111 
6112         IF (l_mtl_vol_uom <> rec.volume_uom_code) THEN
6113           --
6114           IF l_debug_on THEN
6115               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
6116           END IF;
6117           --
6118           l_dd_volume :=  WSH_WV_UTILS.Convert_Uom (
6119                                 from_uom => rec.volume_uom_code,
6120                                 to_uom   => l_mtl_vol_uom,
6121                                 quantity => rec.volume,
6122                                 item_id  => rec.inventory_item_id);
6123         ELSE
6124           l_dd_volume := rec.volume;
6125         END IF;
6126         line_cont_rec.converted_vol := l_dd_volume;
6127         --dbms_output.put_line('line_cont_rec.converted_vol '||line_cont_rec.converted_vol);
6128       END IF;
6129 
6130       -- Check if the container can hold atleast 1 piece if the item is indivisible
6131       IF (line_cont_rec.indivisible_flag = 'Y' AND
6132           ((line_cont_rec.fill_pc_basis = 'W' AND ((line_cont_rec.converted_wt/line_cont_rec.shp_qty) > l_mtl_max_load)) OR
6133            (line_cont_rec.fill_pc_basis = 'V' AND ((line_cont_rec.converted_vol/line_cont_rec.shp_qty) > l_mtl_max_vol)))) THEN
6134         --dbms_output.put_line('Indivisible flag is Y and Preferred Cont cannot hold atleast 1 piece');
6135 	-- Bug#: 2503937 - New Error Message
6136         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_VOL_ERROR');
6137         WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6138         error_cnt := error_cnt + 1;
6139         --dbms_output.put_line('Skipping this dd');
6140         goto next_detail;
6141       END IF;
6142 
6143     END IF;
6144 
6145 
6146 
6147 -- HW OPM BUG#: 3011758 For debugging purposes.
6148 -- HW OPMCONV - 1) Removed all GMI print msgs
6149 
6150 -- HW OPM BUG#:3011758 Check if OPM lot indivisible and check percent fill basis
6151 -- If 'Q', compare the delivery line qty shipped against the max_load
6152 -- If 'W, compare the delivery line net weight against the container's net weight
6153 -- If 'V', compare the delivery line volume against the container's volume
6154 -- If any of the above exceeds the max allowed, an error is raised
6155 -- because it will not fit into the container without splitting
6156 -- OPM item that are lot indivisible should not split
6157 
6158 -- HW OPMCONV - 1) Renamed lot_divisible_flag
6159 --            - 2) Changed checking value of visible flag from 1 to 'N'
6160    IF ( line_cont_rec.lot_divisible_flag = 'N' AND
6161         ((line_cont_rec.fill_pc_basis = 'Q' AND (line_cont_rec.shp_qty  > line_cont_rec.max_load_qty ))
6162       OR (line_cont_rec.fill_pc_basis = 'W' AND (l_dd_gross_wt > line_cont_rec.cont_wt) )
6163       OR (line_cont_rec.fill_pc_basis = 'V' AND (l_dd_volume> line_cont_rec.cont_vol) ) ) ) THEN
6164 
6165         FND_MESSAGE.SET_NAME('WSH','WSH_OPM_IND_SPLIT_PACK');
6166         FND_MESSAGE.SET_TOKEN('DETAIL_ID',rec.delivery_detail_id);
6167         l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6168         WSH_UTIL_CORE.Add_Message(l_return_status);
6169         error_cnt := error_cnt + 1;
6170         goto next_detail;
6171     END IF;-- end of 3011758
6172 
6173     -- 20.70 Do Credit Check
6174     --dbms_output.put_line('Doing Credit Check');
6175     --
6176     IF l_debug_on THEN
6177         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_CREDIT_HOLDS',WSH_DEBUG_SV.C_PROC_LEVEL);
6178     END IF;
6179     --
6180     WSH_DETAILS_VALIDATIONS.Check_Credit_Holds (
6181              p_detail_id        => rec.delivery_detail_id,
6182              p_activity_type    => 'PACK',
6183              p_source_line_id   => NULL,
6184              p_source_header_id => NULL,
6185              p_source_code      => rec.source_code,
6186              p_init_flag        => 'Y',
6187              x_return_status    => l_return_status);
6188 
6189     IF l_debug_on THEN
6190       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6191     END IF;
6192 -- Bug 2847515
6193 -- Error was being treated as warning
6197       ELSIF l_return_status = C_WARNING_STATUS THEN
6194     IF l_return_status <> C_SUCCESS_STATUS THEN
6195       IF l_return_status IN (C_ERROR_STATUS,C_UNEXP_ERROR_STATUS) THEN
6196         error_cnt := error_cnt + 1;
6198       --dbms_output.put_line('Credit Check Failed. Warning: Skipping dd');
6199         warn_cnt := warn_cnt + 1;
6200       END IF;
6201       goto next_detail;
6202     END IF;
6203 
6204     l_dd_count := l_dd_count + 1;
6205     line_cont_tab(l_dd_count) := line_cont_rec;
6206 
6207     <<next_detail>>
6208       null;
6209 
6210   END LOOP;
6211 
6212   DELETE FROM wsh_tmp;
6213 
6214   x_error_cnt        := error_cnt;
6215   x_warn_cnt         := warn_cnt;
6216   x_fill_pc_warn_cnt := fill_pc_warn_cnt; -- bug 3562797 jckwok
6217   x_release_warn_cnt := release_warn_cnt;
6218   x_line_cont_tab    := line_cont_tab;
6219 
6220   --dbms_output.put_line('Exiting Validate_Dd_for_Pack');
6221 
6222   --
6223   IF l_debug_on THEN
6224     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);
6225     WSH_DEBUG_SV.log(l_module_name,'Error Count '|| x_error_cnt||' Warning Count '|| x_warn_cnt||' Release Warn Count '|| x_release_warn_cnt);
6226     WSH_DEBUG_SV.pop(l_module_name);
6227   END IF;
6228   --
6229   RETURN;
6230 
6231 --
6232 IF l_debug_on THEN
6233     WSH_DEBUG_SV.pop(l_module_name);
6234 END IF;
6235 --
6236 EXCEPTION
6237   WHEN Others THEN
6238     IF (Get_dd_Detail%ISOPEN) THEN
6239       CLOSE Get_dd_Detail;
6240     END IF;
6241     IF (Get_Cont_Item_Load%ISOPEN) THEN
6242       CLOSE Get_Cont_Item_Load;
6243     END IF;
6244     WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Validate_Dd_For_Pack',l_module_name);
6245     --
6246     IF l_debug_on THEN
6247         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
6248         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
6249     END IF;
6250     --
6251     raise;
6252 
6253 --
6254 IF l_debug_on THEN
6255     WSH_DEBUG_SV.pop(l_module_name);
6256 END IF;
6257 --
6258 END Validate_Dd_For_Pack;
6259 
6260 
6261 /*
6262 -----------------------------------------------------------------------------
6263    PROCEDURE  : Auto_Pack_Lines
6264    PARAMETERS : p_group_id_tab_id - table of group ids for lines that need to
6265 			be autopacked.
6266 		p_del_detail_tab - table of delivery detail ids
6267 		p_pack_cont_flag - 'Y' or 'N' to determine whether to try and
6268 			autopack the detail containers into master containers.
6269 		x_cont_instance_id - table of container instance ids that were
6270 			created during the autopacking.
6271 		x_pack_status - indicates whether containers overpacked or not
6272 		x_return_status - return status of API.
6273   DESCRIPTION : This procedure takes the number of lines and groups them by
6274 		common grouping attributes - similar to grouping attributes of
6275 		delivery.  If a group id table is specified it uses the
6276 		group ids in the table to decided which lines can be grouped
6277 		into the same container. If a group id table is not specified,
6278 		it creates the group id table before autopacking. It creates
6279 		the required number and type of containers per line and keeps
6280 		track of all partially filled containers in the empty
6281 		containers table. Before creating new container instances, it
6282 		searches for available space using the empty container table
6283 		and after filling up a container, it creates a new one if
6284 		there are no empty containers of the same type.
6285 ------------------------------------------------------------------------------
6286 */
6287 
6288 PROCEDURE Auto_Pack_Lines (
6289   p_group_id_tab      IN     WSH_UTIL_CORE.id_tab_type,
6290   p_del_detail_tab    IN     WSH_UTIL_CORE.id_tab_type,
6291   p_pack_cont_flag    IN     VARCHAR2,
6292   x_cont_instance_tab IN OUT NOCOPY  WSH_UTIL_CORE.id_tab_type,
6293   x_return_status     OUT NOCOPY     VARCHAR2) IS
6294 
6295    CURSOR c_get_attributes(v_delivery_detail_id IN NUMBER) IS
6296     SELECT customer_id,ship_to_location_id,
6297            intmed_ship_to_location_id,
6298            fob_code,freight_terms_code,ship_method_code,
6299            mode_of_transport, carrier_id, service_level,
6300            deliver_to_location_id,
6301            NVL(line_direction,'O') line_direction,   -- J-IB-NPARIKH
6302            shipping_control,    -- J-IB-NPARIKH
6303            NVL(ignore_for_planning,'N') ignore_for_planning
6304       FROM wsh_delivery_details
6305      WHERE delivery_detail_id = v_delivery_detail_id;
6306 
6307    -- OTM R12 : assign delivery detail
6308    CURSOR c_get_tare_weight(v_detail_id NUMBER) IS
6309    SELECT nvl(unit_weight, 0)
6310      FROM wsh_delivery_details
6311     WHERE delivery_detail_id = v_detail_id;
6312 
6313    CURSOR c_get_plan_and_tms_flag(v_delivery_id NUMBER) IS
6314    SELECT nvl(ignore_for_planning, 'N'),
6315           nvl(tms_interface_flag, WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT)
6316      FROM wsh_new_deliveries
6317     WHERE delivery_id = v_delivery_id;
6318 
6319    TYPE Boolean_Tab_Type IS TABLE OF BOOLEAN INDEX BY BINARY_INTEGER;
6320 
6321    -- OTM R12 : assign delivery detail
6322 
6323    TYPE tab_varchar IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
6324 
6325    l_tab_cust_id wsh_util_core.id_tab_type;
6326    l_tab_ship_location_id wsh_util_core.id_tab_type;
6330    l_tab_fob_code tab_varchar;
6327    l_tab_intmed_location_id wsh_util_core.id_tab_type;
6328    l_tab_deliver_location_id wsh_util_core.id_tab_type;
6329    l_tab_carrier_id wsh_util_core.id_tab_type;
6331    l_tab_freight_terms_code tab_varchar;
6332    l_tab_ship_method_code tab_varchar;
6333    l_tab_mode_of_transport tab_varchar;
6334    l_tab_service_level tab_varchar;
6335    l_tab_line_direction tab_varchar;
6336    l_tab_shipping_control tab_varchar;
6337    l_tab_ignore_for_planning tab_varchar;
6338 
6339   line_cont_tab line_cont_info_tab;
6340 
6341   l_group_id_temp_tab    WSH_UTIL_CORE.id_tab_type;
6342   l_group_id_tab    WSH_UTIL_CORE.id_tab_type;
6343   l_del_row_tab     WSH_UTIL_CORE.id_tab_type;
6344   l_mast_cont_tab   WSH_UTIL_CORE.id_tab_type;
6345   l_tmp_detail_tab  WSH_UTIL_CORE.id_tab_type;
6346   l_detail_cont_rec empty_cont_info;
6347   l_detail_cont_tab empty_cont_info_tab;
6348 
6349   l_return_status   VARCHAR2(1);
6350   l_cont_instance_id NUMBER;
6351   l_cont_name       VARCHAR2(30);
6352   l_row_id          VARCHAR2(30);
6353   l_pack_status     VARCHAR2(30);
6354 
6355   l_net_weight      NUMBER;
6356   l_cont_fill_pc    NUMBER;
6357   l_err_cont_name   VARCHAR2(30);
6358   l_last_organization_id NUMBER;
6359 
6360   i                 NUMBER;
6361   j                 NUMBER;
6362   cnt               NUMBER;
6363   l_cont_instance_cnt NUMBER;
6364 
6365   warn_cnt          NUMBER := 0;
6366   error_cnt         NUMBER := 0;
6367   succ_cnt          NUMBER := 0;
6368   cont_warn         NUMBER := 0;
6369   l_release_warn_count NUMBER := 0;
6370   l_fill_pc_warn_count NUMBER := 0; -- bug 3562797 jckwok
6371   l_error_cnt       NUMBER := 0;
6372 
6373   l_new_contid_count  NUMBER := 0;
6374   --l_cont_tab          wsh_container_actions.cont_inst_tab;
6375   l_cont_tab          WSH_UTIL_CORE.id_tab_type;
6376 
6377   TYPE NumList IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
6378   TYPE CharList IS TABLE OF VARCHAR2(3) INDEX BY BINARY_INTEGER;
6379   l_GrossWtlist     NumList;
6380   l_NetWtlist       NumList;
6381   l_Vollist         NumList;
6382   l_ddlist          NumList;
6383   l_dellist         NumList; -- for delivery id
6384   l_contlist        NumList; -- containers for delivery detail id
6385   l_contlist1       NumList; -- containers and delivery id
6386   l_dellist1         NumList; -- containers and delivery id
6387   m                 NUMBER;
6388   l_del_tab         WSH_UTIL_CORE.id_tab_type;
6389   l_exists_flag     VARCHAR2(1);
6390   l_duplicate_flag     VARCHAR2(1);   -- for checking record
6391 
6392   -- J: W/V Changes
6393   l_prev_del_id   NUMBER;
6394   l_prev_dd_id    NUMBER;
6395   l_prev_cont_id  NUMBER;
6396   l_unit_weight   NUMBER;
6397   l_unit_volume   NUMBER;
6398   l_weight_uom_code VARCHAR2(3);
6399   l_volume_uom_code VARCHAR2(3);
6400   l_cont_Wtlist   NumList;
6401   l_cont_Vollist  NumList;
6402   l_WtUOMlist   CharList;
6403   l_VolUOMlist  CharList;
6404   l_InvItemlist  NumList;
6405   l_cont_InvItemlist  NumList;
6406   l_cont_WtUOMlist   CharList;
6407   l_cont_VolUOMlist  CharList;
6408   l_tot_dd_gross_wt NUMBER;
6409   l_tot_dd_net_wt NUMBER;
6410   l_tot_dd_vol    NUMBER;
6411 /*
6412   l_tot_cont_gross_wt NUMBER;
6413   l_tot_cont_vol  NUMBER;
6414 */
6415   l_tot_del_vol   NUMBER;
6416   TYPE del_wv_adjust_info IS RECORD (
6417         dd_id   NUMBER,
6418         gross_wt       NUMBER,
6419         net_wt         NUMBER,
6420         vol            NUMBER);
6421   TYPE del_wv_adjust_tab IS TABLE OF del_wv_adjust_info INDEX BY BINARY_INTEGER;
6422   l_tmp_dd1list del_wv_adjust_tab;
6423   l_tmp_dd2list del_wv_adjust_tab;
6424   del_index       NUMBER;
6425   i1 NUMBER := 0;
6426   j1 NUMBER := 0;
6427   k1 NUMBER := 0;
6428   l_prev_wt_uom VARCHAR2(3);
6429   l_prev_vol_uom VARCHAR2(3);
6430   l_item_changed BOOLEAN;
6431   l_cont_item_changed BOOLEAN;
6432   l_prev_item NUMBER;
6433 
6434   l_attr_tab  wsh_delivery_autocreate.grp_attr_tab_type;
6435   l_group_tab  wsh_delivery_autocreate.grp_attr_tab_type;
6436   l_action_rec wsh_delivery_autocreate.action_rec_type;
6437   l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
6438   l_matched_entities wsh_util_core.id_tab_type;
6439   l_out_rec wsh_delivery_autocreate.out_rec_type;
6440 
6441   mark_reprice_error EXCEPTION;
6442 
6443   -- OTM R12 : assign delivery detail
6444   l_gc3_is_installed         VARCHAR2(1);
6445   l_is_delivery_empty        VARCHAR2(1);
6446   l_index                    NUMBER;
6447   l_index_update             NUMBER;
6448   l_tare_weight              WSH_DELIVERY_DETAILS.UNIT_WEIGHT%TYPE;
6449   l_ignore_for_planning_tab  WSH_UTIL_CORE.COLUMN_TAB_TYPE;
6450   l_tms_interface_flag_tab   WSH_UTIL_CORE.COLUMN_TAB_TYPE;
6451   l_delivery_was_empty_tab   BOOLEAN_TAB_TYPE;
6452   l_delivery_id_tab          WSH_UTIL_CORE.ID_TAB_TYPE;
6453   l_interface_flag_tab       WSH_UTIL_CORE.COLUMN_TAB_TYPE;
6454   -- End of OTM R12 : assign delivery detail
6455 
6456 -- K LPN CONV. rv
6457 l_wms_org    VARCHAR2(10) := 'N';
6458 l_sync_tmp_wms_ddlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6459 l_sync_tmp_inv_ddlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6460 l_wms_ddtlist_cnt NUMBER;
6461 l_inv_ddtlist_cnt NUMBER;
6462 l_sync_tmp_wms_contlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6463 l_sync_tmp_inv_contlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6464 l_wms_contlist_cnt NUMBER;
6465 l_inv_contlist_cnt NUMBER;
6469 l_inv_contlist1_cnt NUMBER;
6466 l_sync_tmp_wms_contlist1 wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6467 l_sync_tmp_inv_contlist1 wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6468 l_wms_contlist1_cnt NUMBER;
6470 -- K LPN CONV. rv
6471 l_mdc_id_tab wsh_util_core.id_tab_type;
6472 l_mdc_index_i NUMBER;
6473 l_mdc_index_j NUMBER;
6474 
6475 --
6476 l_debug_on BOOLEAN;
6477 --
6478 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'AUTO_PACK_LINES';
6479 --
6480 BEGIN
6481 
6482   --dbms_output.put_line('==================================================');
6483   --dbms_output.put_line('   AUTO  PACK  LINES                              ');
6484   --dbms_output.put_line('==================================================');
6485 
6486   --dbms_output.put_line('Start of WSH_CONTAINER_ACTIONS.Auto_Pack_Lines...');
6487   -- Delete all Global PL/SQL tables to start with
6488   --
6489   --
6490 
6491   -- OTM R12 : assign delivery detail
6492   l_gc3_is_installed := WSH_UTIL_CORE.G_GC3_IS_INSTALLED;
6493 
6494   IF (l_gc3_is_installed IS NULL) THEN
6495     l_gc3_is_installed := WSH_UTIL_CORE.GC3_IS_INSTALLED;
6496   END IF;
6497 
6498   -- End of OTM R12 : assign delivery detail
6499 
6500   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
6501   --
6502   IF l_debug_on IS NULL
6503   THEN
6504       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
6505   END IF;
6506   --
6507   IF l_debug_on THEN
6508       WSH_DEBUG_SV.push(l_module_name);
6509       --
6510       WSH_DEBUG_SV.log(l_module_name,'P_PACK_CONT_FLAG',P_PACK_CONT_FLAG);
6511       WSH_DEBUG_SV.log(l_module_name,'l_gc3_is_installed', l_gc3_is_installed);                        -- OTM R12 : assign delivery detail
6512   END IF;
6513   --
6514   g_empty_cont_tab.DELETE;
6515   g_assign_detail_tab.DELETE;
6516   g_new_container_tab.DELETE;
6517   g_cache_organization_info_tab.DELETE;
6518   g_cont_msi_tab.DELETE;
6519   g_new_contid_tab.DELETE;
6520   g_new_cont_index := 0;
6521   g_num_cont_index := 0;
6522   g_assign_detail_index := 0;
6523 
6524   -- 10. Check if Count of p_del_detail_tab table is 0
6525   IF p_del_detail_tab.count = 0 THEN
6526     --dbms_output.put_line('p_del_detail_tab count is 0');
6527     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_ASSG_NULL');
6528     x_return_status := C_ERROR_STATUS;
6529     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6530     --
6531     IF l_debug_on THEN
6532         WSH_DEBUG_SV.pop(l_module_name);
6533     END IF;
6534     --
6535     return;
6536   END IF;
6537 --dbms_output.put_line('Before Autocreate Del'||to_char(sysdate,'HH24:MI:SS'));
6538   -- 20. Generate Grouping Ids
6539   IF p_group_id_tab.COUNT = 0 THEN
6540 
6541     -- call autocreate delivery API with a check flag set to 'Y' and
6542     -- container flag set to 'Y' to fetch group id table for delivery lines
6543 
6544     --dbms_output.put_line('Calling WSH_DELIVERY_AUTOCREATE.autocreate_deliveries to generate group_ids');
6545     --
6546     IF l_debug_on THEN
6547         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
6548     END IF;
6549     --
6550 
6551    l_attr_tab.delete;
6552 
6553    FOR i in 1..p_del_detail_tab.count LOOP
6554 
6555        l_attr_tab(i).entity_id := p_del_detail_tab(i);
6556        l_attr_tab(i).entity_type := 'DELIVERY_DETAIL';
6557 
6558    END LOOP;
6559 
6560    l_action_rec.action := 'MATCH_GROUPS';
6561 
6562 
6563 
6564    WSH_Delivery_AutoCreate.Find_Matching_Groups(p_attr_tab => l_attr_tab,
6565                                                    p_action_rec => l_action_rec,
6566                                                    p_target_rec => l_target_rec,
6567                                                    p_group_tab => l_group_tab,
6568                                                    x_matched_entities => l_matched_entities,
6569                                                    x_out_rec => l_out_rec,
6570                                                    x_return_status => l_return_status);
6571 
6572     IF l_debug_on THEN
6573       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6574     END IF;
6575     IF (l_return_status = C_ERROR_STATUS) OR
6576        (l_return_status = C_UNEXP_ERROR_STATUS) THEN
6577       --dbms_output.put_line('***WSH_DELIVERY_AUTOCREATE.autocreate_deliveries returned '||l_return_status);
6578       FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
6579       WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
6580       x_return_status := l_return_status;
6581       --
6582       IF l_debug_on THEN
6583           WSH_DEBUG_SV.pop(l_module_name);
6584       END IF;
6585       --
6586       return;
6587     END IF;
6588     FOR i in 1..l_attr_tab.COUNT LOOP
6589       l_group_id_tab(l_attr_tab(i).entity_id) := l_attr_tab(i).group_id;
6590     END LOOP;
6591   ELSE
6592     cnt := p_group_id_tab.FIRST;
6593 
6594     IF ((cnt IS NULL) OR (p_group_id_tab.COUNT <> p_del_detail_tab.count)) THEN
6595       x_return_status := C_ERROR_STATUS;
6596       FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
6597       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6598       --
6599       IF l_debug_on THEN
6600           WSH_DEBUG_SV.pop(l_module_name);
6601       END IF;
6602       --
6603       return;
6604     ELSE
6605 
6609 
6606       FOR i in 1..p_group_id_tab.COUNT LOOP
6607         l_group_id_tab(p_del_detail_tab(i)) := p_group_id_tab(i);
6608       END LOOP;
6610     END IF;
6611   END IF;
6612 
6613 
6614 --dbms_output.put_line('Before Validate DD for Pack'||to_char(sysdate,'HH24:MI:SS'));
6615   Validate_Dd_for_Pack(
6616     p_group_id_tab     => l_group_id_tab,
6617     p_del_detail_tab   => p_del_detail_tab,
6618     x_line_cont_tab    => line_cont_tab,
6619     x_error_cnt        => error_cnt,
6620     x_warn_cnt         => warn_cnt,
6621     x_fill_pc_warn_cnt => l_fill_pc_warn_count, -- bug 3562797 jckwok
6622     x_release_warn_cnt => l_release_warn_count);
6623 
6624     IF l_debug_on THEN
6625       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6626       WSH_DEBUG_SV.log(l_module_name,'line cont tab count -',line_cont_tab.count);
6627     END IF;
6628   --dbms_output.put_line(p_del_detail_tab.count||'<CALL TO VALIDATE DD FOR PACK>'||l_release_warn_count||'>'||line_cont_tab.count);
6629 
6630   -- Raise warning if we found some delivery details with status 'S'
6631   -- Raise Error if all lines are with status 'S'
6632   IF (l_release_warn_count = p_del_detail_tab.count) THEN
6633     x_return_status := C_ERROR_STATUS;
6634     FND_MESSAGE.SET_NAME('WSH','WSH_DEL_RELEASED_STATUS');
6635     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6636     -- Bug 3337629 : Added the following return statement.
6637     IF l_debug_on THEN
6638       WSH_DEBUG_SV.pop(l_module_name);
6639     END IF;
6640     RETURN;
6641   ELSIF (l_release_warn_count > 0) THEN
6642     -- Bug 3337629 - x_return_status does not hold any value.
6643     -- Compare it with l_return_status.
6644     -- Also increment the warn_cnt.
6645 
6646     --IF (x_return_status <> C_ERROR_STATUS) THEN
6647     IF (l_return_status <> C_ERROR_STATUS) THEN
6648       x_return_status := C_WARNING_STATUS;
6649       warn_cnt := warn_cnt + 1;
6650       FND_MESSAGE.SET_NAME('WSH','WSH_DEL_REL_STATUS_WARN');
6651       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6652     END IF;
6653   END IF;
6654   --
6655   -- bug 3562797 jckwok
6656   -- Raise Error if all dds have 'Shipping Parameter' percent fill basis as None
6657   -- Raise warning if only some of the dds have 'Shipping Parameter' percent fill basis as None
6658   --
6659   IF (l_fill_pc_warn_count = p_del_detail_tab.count) THEN
6660     x_return_status := C_ERROR_STATUS;
6661     FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
6662     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6663     IF l_debug_on THEN
6664       WSH_DEBUG_SV.pop(l_module_name);
6665     END IF;
6666     RETURN;
6667   ELSIF (l_fill_pc_warn_count > 0) THEN
6668     IF (l_return_status <> C_ERROR_STATUS) THEN
6669       x_return_status := C_WARNING_STATUS;
6670       warn_cnt := warn_cnt + 1;
6671       FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
6672       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6673     END IF;
6674   END IF;
6675   -- end of bug 3562797 jckwok
6676 
6677 --dbms_output.put_line('Before 50'||to_char(sysdate,'HH24:MI:SS'));
6678   IF (line_cont_tab.COUNT > 0) THEN
6679     -- 50. Loop through all lines that need to be Auto-Packed
6680     cnt := 1;
6681     l_last_organization_id := NULL;
6682     WHILE (cnt <= line_cont_tab.COUNT) LOOP
6683 
6684       IF l_debug_on THEN
6685         WSH_DEBUG_SV.log(l_module_name,'======================================================');
6686         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);
6687       END IF;
6688 
6689       IF (l_last_organization_id is NULL) THEN
6690         l_last_organization_id := line_cont_tab(cnt).organization_id;
6691       ELSIF (l_last_organization_id <> line_cont_tab(cnt).organization_id) THEN
6692         l_last_organization_id := line_cont_tab(cnt).organization_id;
6693 
6694         -- Delete the empty PL/SQL cont table if organization_id changes
6695         g_empty_cont_tab.DELETE;
6696       END IF;
6697 
6698       Pack_Delivery_Detail(
6699          p_line_cont_rec => line_cont_tab(cnt),
6700          x_return_status => l_return_status);
6701  -- Bug  2786021 handle unexpected error
6702       IF (l_return_status = C_ERROR_STATUS OR
6703           l_return_status = C_UNEXP_ERROR_STATUS
6704          ) THEN
6705        error_cnt := error_cnt + 1;
6706       ELSE
6707        succ_cnt := succ_cnt + 1;
6708       END IF;
6709       cnt := cnt + 1;
6710 
6711     END LOOP;
6712 --dbms_output.put_line('Error Count '|| error_cnt||' Success Count '||succ_cnt);
6713 --dbms_output.put_line('Before Create'||to_char(sysdate,'HH24:MI:SS')||'g_new_container_tab.count'||g_new_container_tab.COUNT);
6714 
6715     -- 60.1 Create Containers from g_new_container_tab PL/SQL table
6716     --dbms_output.put_line('*** Creating Actual Containers ***');
6717     cnt := 1;
6718     l_cont_instance_cnt := 1;
6719     WHILE (cnt <= g_new_container_tab.COUNT) LOOP
6720       l_cont_name := null;
6721 
6722       --
6723       IF l_debug_on THEN
6724           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CREATE_CONT_INSTANCE_MULTI',WSH_DEBUG_SV.C_PROC_LEVEL);
6725           WSH_DEBUG_SV.logmsg(l_module_name,'Number of Containers'||g_new_container_tab(cnt).number_of_containers);
6726           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);
6727       END IF;
6728       --
6732                x_cont_instance_id    => l_cont_instance_id,
6729       wsh_container_actions.Create_Cont_Instance_Multi (
6730                x_cont_name           => l_cont_name,
6731                p_cont_item_id        => g_new_container_tab(cnt).container_item_id,
6733                p_par_detail_id       => NULL,
6734                p_organization_id     => g_new_container_tab(cnt).organization_id,
6735                p_container_type_code => NULL,
6736                p_num_of_containers   => g_new_container_tab(cnt).number_of_containers,
6737                x_row_id              => l_row_id,
6738                x_return_status       => l_return_status,
6739                x_cont_tab            => l_cont_tab,
6740                -- J: W/V Changes
6741                x_unit_weight         => l_unit_weight,
6742                x_unit_volume         => l_unit_volume,
6743                x_weight_uom_code     => l_weight_uom_code,
6744                x_volume_uom_code     => l_volume_uom_code,
6745                p_lpn_id              => NULL,
6746                p_ignore_for_planning => NULL,
6747                p_caller              => 'WSH'
6748                );
6749       IF l_debug_on THEN
6750           WSH_DEBUG_SV.log(l_module_name,'return status ,cont tab count -',l_return_status||l_cont_tab.count);
6751       END IF;
6752 
6753       IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
6754         ) THEN
6755         --dbms_output.put_line('Container Creation failed for index '|| cnt);
6756         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
6757         WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6758         error_cnt := error_cnt + 1;
6759       ELSE
6760 
6761         IF l_debug_on THEN
6762           WSH_DEBUG_SV.logmsg(l_module_name,'Created Containers'||l_cont_tab.count);
6763         END IF;
6764 -- do not use this container instance id
6765         g_new_container_tab(cnt).cont_instance_id := l_cont_instance_id;
6766 
6767 -- This new PL SQL table will have mapping records to g_new_container_tab
6768 -- where count of g_new_container_tab will have records here
6769 -- Example if l_new_contid_count is 1 and in g_new_container_tab, the
6770 -- number of containers is 10, then those 10 container instance id can be
6771 -- extracted from this new PL SQL table
6772         IF l_new_contid_count IS NULL THEN
6773           l_new_contid_count := 0;
6774         ELSE
6775           l_new_contid_count := g_new_contid_tab.count;
6776         END IF;
6777 
6778 -- can replace l_new_contid_count with g_new_contid_tab.count
6779         FOR j in 1..l_cont_tab.count
6780         LOOP
6781           l_new_contid_count := l_new_contid_count + 1;
6782           g_new_contid_tab(l_new_contid_count).match_id := cnt;
6783           g_new_contid_tab(l_new_contid_count).cont_instance_id := l_cont_tab(j);
6784           -- J: W/V Changes
6785           g_new_contid_tab(l_new_contid_count).unit_weight := l_unit_weight;
6786           g_new_contid_tab(l_new_contid_count).unit_volume := l_unit_volume;
6787           g_new_contid_tab(l_new_contid_count).weight_uom := l_weight_uom_code;
6788           g_new_contid_tab(l_new_contid_count).volume_uom := l_volume_uom_code;
6789           g_new_contid_tab(l_new_contid_count).item_id := g_new_container_tab(cnt).container_item_id;
6790 
6791           -- K LPN CONV. rv
6792           g_new_contid_tab(l_new_contid_count).organization_id := g_new_container_tab(cnt).organization_id;
6793 
6794           x_cont_instance_tab(l_new_contid_count) := l_cont_tab(j);
6795           -- Bug 3570364 : Adding the Master container item id of the line to all it's
6796 	  --               container LPN's. This information is passed to Auto_pack_conts.
6797 	  l_detail_cont_rec.container_instance_id := l_cont_tab(j);
6798           l_detail_cont_rec.container_item_id     := g_new_container_tab(cnt).mast_cont_item_id;
6799           l_detail_cont_tab(l_new_contid_count)  := l_detail_cont_rec;
6800 
6801           --g_new_contid_tab(l_new_contid_count).cont_instance_id := l_cont_tab(j).cont_instance_id;
6802           --x_cont_instance_tab(l_new_contid_count) := l_cont_tab(j).cont_instance_id;
6803         END LOOP;
6804 
6805 --dbms_output.put_line('COUNT in new tab'||g_new_contid_tab.count||'<'||x_cont_instance_tab.count);
6806 
6807 -- End of PL SQL table usage
6808  -- move this call of x_cont_instance_tab to within the above LOOP
6809         --x_cont_instance_tab(l_cont_instance_cnt)    := l_cont_instance_id;
6810 
6811         -- Bug  3570364 : Move following stmt's to within the above LOOP
6812 	--                which stores the master container item id for each LPN
6813        /*{ l_detail_cont_rec.container_instance_id := l_cont_instance_id;
6814         l_detail_cont_rec.container_item_id     := g_new_container_tab(cnt).mast_cont_item_id;
6815         l_detail_cont_tab(l_cont_instance_cnt)  := l_detail_cont_rec;
6816         l_cont_instance_cnt := l_cont_instance_cnt + 1; } */
6817 
6818         --dbms_output.put_line('Container dd id '||l_cont_instance_id||' for index '|| cnt);
6819       END IF;
6820       cnt := cnt + 1;
6821     END LOOP;
6822     --dbms_output.put_line('Error Count after CREATE CONTAINER'|| error_cnt);
6823 
6824 
6825     -- 70.1 Assign Details to Actual Containers created
6826     IF l_debug_on THEN
6827 
6828      WSH_DEBUG_SV.log(l_module_name,'*** Assigning Details to Containers Created ***'||g_assign_detail_tab.count);
6829      WSH_DEBUG_SV.log(l_module_name,'*** COUNT ***'||g_new_contid_tab.count||'<'||g_new_container_tab.count||to_char(sysdate,'HH24:MI:SS'));
6830     END IF;
6831 
6832 -- doing BULK UPDATE here
6833 -- First Update WDA for each delivey detail to have parent_delivery_detail populated
6834 -- correctly
6835 
6839     FOR cnt in 1..g_assign_detail_tab.COUNT
6836     m := 0;
6837     l_wms_ddtlist_cnt :=1;
6838     l_inv_ddtlist_cnt :=1;
6840     LOOP
6841       l_GrossWtlist(cnt) := g_assign_detail_tab(cnt).gross_weight;
6842       l_NetWtlist(cnt) := g_assign_detail_tab(cnt).net_weight;
6843       l_WtUOMlist(cnt) := g_assign_detail_tab(cnt).weight_uom;
6844       l_Vollist(cnt) := g_assign_detail_tab(cnt).volume;
6845       l_VolUOMlist(cnt) := g_assign_detail_tab(cnt).volume_uom;
6846       l_InvItemlist(cnt) :=  g_assign_detail_tab(cnt).inventory_item_id;
6847       l_ddlist(cnt) := g_assign_detail_tab(cnt).delivery_detail_id;
6848       l_dellist(cnt) := g_assign_detail_tab(cnt).delivery_id;
6849       l_wms_org := 'N';
6850       -- K LPN CONV. rv
6851       IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
6852       --{
6853           l_wms_org := wsh_util_validate.check_wms_org(g_assign_detail_tab(cnt).organization_id);
6854           IF (l_wms_org = 'Y') THEN
6855             l_sync_tmp_wms_ddlist.delivery_detail_id_tbl(l_wms_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_detail_id;
6856             l_sync_tmp_wms_ddlist.delivery_id_tbl(l_wms_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_id;
6857             l_sync_tmp_wms_ddlist.parent_detail_id_tbl(l_wms_ddtlist_cnt) := NULL;
6858             l_sync_tmp_wms_ddlist.operation_type_tbl(l_wms_ddtlist_cnt) := 'PRIOR';
6859             l_wms_ddtlist_cnt := l_wms_ddtlist_cnt + 1;
6860           ELSE
6861             l_sync_tmp_inv_ddlist.delivery_detail_id_tbl(l_inv_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_detail_id;
6862             l_sync_tmp_inv_ddlist.delivery_id_tbl(l_inv_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_id;
6863             l_sync_tmp_inv_ddlist.parent_detail_id_tbl(l_inv_ddtlist_cnt) := NULL;
6864             l_sync_tmp_inv_ddlist.operation_type_tbl(l_inv_ddtlist_cnt) := 'PRIOR';
6865             l_inv_ddtlist_cnt := l_inv_ddtlist_cnt + 1;
6866           END IF;
6867       --}
6868       END IF;
6869       -- K LPN CONV. rv
6870     IF l_dellist(cnt) IS NOT NULL THEN
6871 -- no check for distinct was there earlier, added the check
6872       IF l_del_tab.count > 0 THEN
6873         FOR j in 1..l_del_tab.COUNT
6874         LOOP
6875           IF (l_dellist(cnt) IS NOT NULL
6876              AND l_dellist(cnt) = l_del_tab(j)
6877             ) THEN
6878 
6879             l_exists_flag := 'Y';
6880             EXIT;
6881           ELSE
6882             l_exists_flag := 'N';
6883 
6884           END IF;
6885         END LOOP;
6886       ELSE
6887         l_exists_flag := 'N';
6888       END IF;
6889 
6890       IF l_exists_flag = 'N' THEN
6891          m := m + 1;
6892          l_del_tab(m) := l_dellist(cnt);
6893       END IF;
6894     END IF;
6895     END LOOP;
6896 -- the number of records should be same
6897 -- when Empty Container logic is used, then there can be a record in
6898 -- assign table with no one to one mapping in new container table
6899 -- so use container index to find that container
6900 
6901     m := 0;
6902     -- K LPN CONV. rv
6903     l_wms_contlist_cnt := 1;
6904     l_inv_contlist_cnt := 1;
6905 
6906     l_wms_contlist1_cnt := 1;
6907     l_inv_contlist1_cnt := 1;
6908     -- K LPN CONV. rv
6909     FOR cnt in 1..g_assign_detail_tab.COUNT
6910     LOOP
6911 
6912       l_contlist(cnt) :=
6913         g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id;
6914       -- K LPN CONV. rv
6915       IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
6916       --{
6917           l_wms_org := 'N';
6918           l_wms_org := wsh_util_validate.check_wms_org(g_new_contid_tab(g_assign_detail_tab(cnt).container_index).organization_id);
6919           IF (l_wms_org = 'Y') THEN
6920             l_sync_tmp_wms_contlist.delivery_detail_id_tbl(l_wms_contlist_cnt) := l_contlist(cnt);
6921             l_sync_tmp_wms_contlist.operation_type_tbl(l_wms_contlist_cnt) := 'UPDATE';
6922             l_wms_contlist_cnt :=  l_wms_contlist_cnt + 1;
6923           ELSE
6924             l_sync_tmp_inv_contlist.delivery_detail_id_tbl(l_inv_contlist_cnt) := l_contlist(cnt);
6925             l_sync_tmp_inv_contlist.operation_type_tbl(l_inv_contlist_cnt) := 'UPDATE';
6926             l_inv_contlist_cnt :=  l_inv_contlist_cnt + 1;
6927           END IF;
6928       --}
6929       END IF;
6930       -- K LPN CONV. rv
6931 
6932       IF ((cnt = 1)
6933           OR
6934           (cnt > 1
6935              AND l_contlist1(m) <>
6936                  g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id)
6937          )THEN
6938 
6939          IF l_contlist1.count > 0 THEN
6940            FOR j in l_contlist1.FIRST..l_contlist1.LAST
6941            LOOP
6942              IF l_contlist1(j) =
6943                   g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id
6944              THEN
6945                l_duplicate_flag := 'Y';
6946                EXIT;  -- out of the loop
6947              ELSE
6948                l_duplicate_flag := 'N';
6949              END IF;
6950            END LOOP;
6951          ELSE
6952            l_duplicate_flag := 'N';
6953          END IF;
6954          IF l_duplicate_flag = 'N' THEN
6955            m := m + 1;
6956            l_contlist1(m) :=
6957              g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id;
6958            -- J: W/V Changes
6959            l_cont_Wtlist(m) :=
6960              g_new_contid_tab(g_assign_detail_tab(cnt).container_index).unit_weight;
6961            l_cont_Vollist(m) :=
6965            IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
6962              g_new_contid_tab(g_assign_detail_tab(cnt).container_index).unit_volume;
6963            l_dellist1(m) := g_assign_detail_tab(cnt).delivery_id;
6964            -- K LPN CONV. rv
6966            --{
6967                IF (l_wms_org = 'Y') THEN
6968                  l_sync_tmp_wms_contlist1.delivery_detail_id_tbl(l_wms_contlist1_cnt) := l_contlist1(m);
6969                  l_sync_tmp_wms_contlist1.delivery_id_tbl(l_wms_contlist1_cnt) := NULL;
6970                  l_sync_tmp_wms_contlist1.parent_detail_id_tbl(l_wms_contlist1_cnt) := NULL;
6971                  l_sync_tmp_wms_contlist1.operation_type_tbl(l_wms_contlist1_cnt) := 'PRIOR';
6972                  l_wms_contlist1_cnt := l_wms_contlist1_cnt + 1;
6973                ELSE
6974                  l_sync_tmp_inv_contlist1.delivery_detail_id_tbl(l_inv_contlist1_cnt) := l_contlist1(m);
6975                  l_sync_tmp_inv_contlist1.delivery_id_tbl(l_inv_contlist1_cnt) := NULL;
6976                  l_sync_tmp_inv_contlist1.parent_detail_id_tbl(l_inv_contlist1_cnt) := NULL;
6977                  l_sync_tmp_inv_contlist1.operation_type_tbl(l_inv_contlist1_cnt) := 'PRIOR';
6978                  l_inv_contlist1_cnt := l_inv_contlist1_cnt + 1;
6979                END IF;
6980            --}
6981            END IF;
6982            -- K LPN CONV. rv
6983          END IF;
6984       END IF;
6985     END LOOP; -- g_assign_detail_tab Loop
6986 
6987     IF l_debug_on THEN
6988       WSH_DEBUG_SV.logmsg(l_module_name,'Count-g_assign_detail_tab'||g_assign_detail_tab.COUNT);
6989       WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_contlist'||l_contlist.COUNT);
6990       WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_dellist>'||l_dellist.COUNT);
6991       WSH_DEBUG_SV.logmsg(l_module_name,'Count-g_new_contid>'||g_new_contid_tab.COUNT);
6992       WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_contlist1>'||l_contlist1.COUNT);
6993       WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_dellist1>'||l_dellist1.COUNT);
6994     END IF;
6995 
6996 -- J: W/V Changes
6997     -- 70.2 Accumulate the W/V to be adjusted by delivery and container for perf reasons. After the following loop
6998     --      l_tmp_dd1list will have W/V that needs to be reduced from deliveries (if the lines are already assigned to a delivery)
6999     --      l_tmp_dd2list will have W/V that needs to be propogated to container only.
7000     -- The W/V is accumulated and stored in the above tables whenever item,W/V uom change in container and delivery
7001     -- 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)
7002     --         and say the line got auto-packed into a container with tare wt. 2 Lbs and Vol. 100 Cu. Ft
7003     --         Then after the following loop, l_tmp_dd1list will have dd with vol -20. l_tmp_dd2list will have
7004     --         gross wt. 10 Lbs and Vol 20 Cu. Ft.
7005 
7006     IF l_debug_on THEN
7007      WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7008     END IF;
7009     l_prev_del_id := NULL;
7010     l_prev_dd_id := NULL;
7011     l_prev_cont_id := NULL;
7012     l_tot_dd_gross_wt := 0;
7013     l_tot_dd_net_wt := 0;
7014     l_tot_dd_vol    := 0;
7015     l_tot_del_vol   := 0;
7016     i := 0;
7017     l_item_changed := FALSE;
7018 
7019     LOOP
7020       i := i + 1;
7021 
7022       IF l_debug_on THEN
7023         IF i <= l_dellist.COUNT THEN
7024           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);
7025         END IF;
7026       END IF;
7027 
7028       IF (i > l_dellist.COUNT OR l_contlist(i) is NOT NULL) THEN
7029 
7030         IF (i > 1) AND (i <= l_dellist.COUNT) THEN
7031           IF (l_prev_item <> l_InvItemlist(i)) OR
7032              (NVL(l_prev_wt_uom,'-99') <> NVL(l_WtUOMlist(i),'-99')) OR
7033              (NVL(l_prev_vol_uom,'-99') <> NVL(l_VolUOMlist(i),'-99')) THEN
7034              l_item_changed := TRUE;
7035           END IF;
7036 
7037         END IF;
7038 
7039         IF (i > l_dellist.COUNT) OR
7040            (l_prev_del_id is NOT NULL AND (NVL(l_dellist(i),-99) <> l_prev_del_id)) OR
7041            l_item_changed THEN
7042           i1 := i1 + 1;
7043           l_tmp_dd1list(i1).dd_id := l_prev_dd_id;
7044           l_tmp_dd1list(i1).vol   := -1 * l_tot_del_vol;
7045           l_tot_del_vol := 0;
7046         END IF;
7047 
7048         IF i > l_dellist.COUNT OR
7049            (l_prev_cont_id is NOT NULL AND (l_contlist(i) <> l_prev_cont_id)) OR
7050            l_item_changed THEN
7051 
7052           k1 := k1 + 1;
7053           l_tmp_dd2list(k1).dd_id    := l_prev_dd_id;
7054           l_tmp_dd2list(k1).gross_wt := l_tot_dd_gross_wt;
7055           l_tmp_dd2list(k1).net_wt   := l_tot_dd_net_wt;
7056           l_tmp_dd2list(k1).vol      := l_tot_dd_vol;
7057 
7058           l_tot_dd_gross_wt := 0;
7059           l_tot_dd_net_wt   := 0;
7060           l_tot_dd_vol      := 0;
7061         END IF;
7062 
7063         IF i > l_dellist.COUNT THEN
7064           EXIT;
7065         END IF;
7066 
7067         l_tot_dd_gross_wt := l_tot_dd_gross_wt + NVL(l_GrossWtlist(i),0);
7068         l_tot_dd_net_wt := l_tot_dd_net_wt + NVL(l_NetWtlist(i),0);
7069         l_tot_dd_vol    := l_tot_dd_vol    + NVL(l_Vollist(i),0);
7070         IF l_dellist(i) is not null THEN
7071           l_tot_del_vol   := l_tot_del_vol   + NVL(l_Vollist(i),0);
7072         END IF;
7073         l_prev_dd_id := l_ddlist(i);
7077         l_prev_item := l_InvItemlist(i);
7074         l_prev_cont_id := l_contlist(i);
7075         l_prev_wt_uom := l_WtUOMlist(i);
7076         l_prev_vol_uom := l_VolUOMlist(i);
7078         l_prev_del_id := l_dellist(i);
7079 
7080       END IF;
7081     END LOOP;
7082     IF l_debug_on THEN
7083      WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7084      --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);
7085      WSH_DEBUG_SV.log(l_module_name,'l_tmp_dd1list.COUNT '||l_tmp_dd1list.COUNT||' l_tmp_dd2list.COUNT '||l_tmp_dd2list.COUNT);
7086      WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment 1 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7087     END IF;
7088 
7089 -- J: W/V Changes
7090    FOR i in 1..l_tmp_dd1list.COUNT LOOP
7091      IF l_debug_on THEN
7092        WSH_DEBUG_SV.logmsg(l_module_name,'Del1:Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
7093      END IF;
7094 
7095      WSH_WV_UTILS.DD_WV_Post_Process(
7096        p_delivery_detail_id => l_tmp_dd1list(i).dd_id,
7097        p_diff_gross_wt      => l_tmp_dd1list(i).gross_wt,
7098        p_diff_net_wt        => NULL,
7099        p_diff_volume        => l_tmp_dd1list(i).vol,
7100        p_diff_fill_volume   => l_tmp_dd1list(i).vol,
7101        x_return_status      => l_return_status);
7102 
7103      IF (l_return_status <> C_SUCCESS_STATUS) THEN
7104        --
7105        IF (l_return_status = C_ERROR_STATUS OR
7106            l_return_status = C_UNEXP_ERROR_STATUS) THEN
7107          error_cnt := error_cnt + 1;
7108        ELSE
7109          cont_warn := cont_warn + 1;
7110        END IF;
7111 
7112      END IF;
7113    END LOOP;
7114    IF l_debug_on THEN
7115      WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment 1 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7116    END IF;
7117 
7118 -- changes to add l_dellist1 and add new messages
7119     --
7120     -- K LPN CONV. rv
7121     IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7122     THEN
7123     --{
7124         IF (WSH_WMS_LPN_GRP.GK_WMS_PACK and l_sync_tmp_wms_ddlist.delivery_detail_id_tbl.count > 0)
7125         THEN
7126         --{
7127             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7128               (
7129                 p_sync_tmp_recTbl   => l_sync_tmp_wms_ddlist,
7130                 x_return_status     => l_return_status
7131               );
7132 
7133             IF l_debug_on THEN
7134               WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7135             END IF;
7136             --
7137             IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7138               x_return_status := l_return_status;
7139               --
7140               IF l_debug_on THEN
7141                   WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7142                   WSH_DEBUG_SV.pop(l_module_name);
7143               END IF;
7144               --
7145               RETURN;
7146             ELSE
7147               IF l_return_status <> C_SUCCESS_STATUS THEN
7148                 x_return_status := C_WARNING_STATUS;
7149               END IF;
7150             END IF;
7151         --}
7152         ELSIF (WSH_WMS_LPN_GRP.GK_INV_PACK and l_sync_tmp_inv_ddlist.delivery_detail_id_tbl.count > 0)
7153         THEN
7154         --{
7155             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7156               (
7157                 p_sync_tmp_recTbl   => l_sync_tmp_inv_ddlist,
7158                 x_return_status     => l_return_status
7159               );
7160 
7161             IF l_debug_on THEN
7162               WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7163             END IF;
7164             --
7165             IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7166               x_return_status := l_return_status;
7167               --
7168               IF l_debug_on THEN
7169                   WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7170                   WSH_DEBUG_SV.pop(l_module_name);
7171               END IF;
7172               --
7173               RETURN;
7174             ELSE
7175               IF l_return_status <> C_SUCCESS_STATUS THEN
7176                 x_return_status := C_WARNING_STATUS;
7177               END IF;
7178             END IF;
7179         --}
7180         END IF;
7181     --}
7182     END IF;
7183     -- K LPN CONV. rv
7184 
7185     FORALL cnt IN 1..g_assign_detail_tab.COUNT
7186       UPDATE wsh_delivery_assignments_v
7187       SET    PARENT_DELIVERY_DETAIL_ID = l_contlist(cnt),
7188              last_update_date = SYSDATE,
7189              last_updated_by = FND_GLOBAL.USER_ID,
7190              last_update_login = FND_GLOBAL.LOGIN_ID
7191       WHERE  DELIVERY_DETAIL_ID = l_ddlist(cnt);
7192     l_mdc_id_tab.delete;
7193     l_mdc_index_i := l_ddlist.FIRST;
7194     l_mdc_index_j := 0;
7195     WHILE l_mdc_index_i IS NOT NULL LOOP
7196        l_mdc_index_j := l_mdc_index_j + 1;
7197        l_mdc_id_tab(l_mdc_index_j) := l_ddlist(l_mdc_index_i);
7198        l_mdc_index_i := l_ddlist.next(l_mdc_index_i);
7199 
7200     END LOOP;
7201     WSH_DELIVERY_DETAILS_ACTIONS.Delete_Consol_Record(
7202                    p_detail_id_tab     => l_mdc_id_tab,
7203                    x_return_status     => x_return_status);
7204 
7208             WSH_DEBUG_SV.pop(l_module_name);
7205     IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7206          IF l_debug_on THEN
7207             WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
7209          END IF;
7210          RETURN;
7211    END IF;
7212 
7213 
7214 -- J: W/V Changes
7215    IF l_debug_on THEN
7216      WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment 2 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7217    END IF;
7218    FOR i in 1..l_tmp_dd2list.COUNT LOOP
7219      IF l_debug_on THEN
7220        WSH_DEBUG_SV.logmsg(l_module_name,'Del2:Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
7221      END IF;
7222 
7223      WSH_WV_UTILS.DD_WV_Post_Process(
7224        p_delivery_detail_id => l_tmp_dd2list(i).dd_id,
7225        p_diff_gross_wt      => l_tmp_dd2list(i).gross_wt,
7226        p_diff_net_wt        => l_tmp_dd2list(i).net_wt,
7227        p_diff_volume        => l_tmp_dd2list(i).vol,
7228        p_diff_fill_volume   => l_tmp_dd2list(i).vol,
7229        x_return_status      => l_return_status);
7230 
7231      IF (l_return_status <> C_SUCCESS_STATUS) THEN
7232        --
7233        IF (l_return_status = C_ERROR_STATUS OR
7234            l_return_status = C_UNEXP_ERROR_STATUS) THEN
7235          error_cnt := error_cnt + 1;
7236        ELSE
7237          cont_warn := cont_warn + 1;
7238        END IF;
7239 
7240      END IF;
7241    END LOOP;
7242    IF l_debug_on THEN
7243      WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment 2 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7244    END IF;
7245 
7246 -- fetch all the attributes for the delivery line
7247     cnt := 0;
7248     FOR i in 1..l_ddlist.count
7249     LOOP
7250 -- the inner loop will process one record at a time
7251       FOR rec in c_get_attributes(l_ddlist(i))
7252       LOOP
7253       cnt := cnt + 1;
7254       l_tab_cust_id(cnt) := rec.customer_id;
7255       l_tab_ship_location_id(cnt) := rec.ship_to_location_id;
7256       l_tab_intmed_location_id(cnt) := rec.intmed_ship_to_location_id;
7257       l_tab_fob_code(cnt) := rec.fob_code;
7258       l_tab_freight_terms_code(cnt) := rec.freight_terms_code;
7259       l_tab_ship_method_code(cnt) := rec.ship_method_code;
7260       l_tab_carrier_id(cnt) := rec.carrier_id;
7261       l_tab_mode_of_transport(cnt) := rec.mode_of_transport;
7262       l_tab_service_level(cnt) := rec.service_level;
7263       l_tab_deliver_location_id(cnt) := rec.deliver_to_location_id;
7264       l_tab_line_direction(cnt)     := rec.line_direction;   -- J-IB-NPARIKH
7265       l_tab_shipping_control(cnt)   := rec.shipping_control;   -- J-IB-NPARIKH
7266       l_tab_ignore_for_planning(cnt)   := rec.ignore_for_planning;
7267       END LOOP;
7268 
7269     END LOOP;
7270 
7271     --
7272     -- K LPN CONV. rv
7273     IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7274     THEN
7275     --{
7276         IF (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_sync_tmp_wms_contlist.delivery_detail_id_tbl.count > 0)
7277         THEN
7278         --{
7279             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7280               (
7281                 p_sync_tmp_recTbl   => l_sync_tmp_wms_contlist,
7282                 x_return_status     => l_return_status
7283               );
7284 
7285             IF l_debug_on THEN
7286               WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7287             END IF;
7288             --
7289             IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7290               x_return_status := l_return_status;
7291               --
7292               IF l_debug_on THEN
7293                   WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7294                   WSH_DEBUG_SV.pop(l_module_name);
7295               END IF;
7296               --
7297               RETURN;
7298             ELSE
7299               IF l_return_status <> C_SUCCESS_STATUS THEN
7300                 x_return_status := C_WARNING_STATUS;
7301               END IF;
7302             END IF;
7303         --}
7304         ELSIF (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_sync_tmp_inv_contlist.delivery_detail_id_tbl.count > 0)
7305         THEN
7306         --{
7307             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7308               (
7309                 p_sync_tmp_recTbl   => l_sync_tmp_inv_contlist,
7310                 x_return_status     => l_return_status
7311               );
7312 
7313             IF l_debug_on THEN
7314               WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7315             END IF;
7316             --
7317             IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7318               x_return_status := l_return_status;
7319               --
7320               IF l_debug_on THEN
7321                   WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7322                   WSH_DEBUG_SV.pop(l_module_name);
7323               END IF;
7324               --
7325               RETURN;
7326             ELSE
7327               IF l_return_status <> C_SUCCESS_STATUS THEN
7328                 x_return_status := C_WARNING_STATUS;
7329               END IF;
7330             END IF;
7331         --}
7332         END IF;
7333     --}
7337     FORALL cnt IN 1..g_assign_detail_tab.COUNT
7334     END IF;
7335     -- K LPN CONV. rv
7336 -- update container with all the attributes
7338       UPDATE WSH_DELIVERY_DETAILS
7339          SET customer_id = l_tab_cust_id(cnt),
7340              ship_to_location_id = l_tab_ship_location_id(cnt),
7341              intmed_ship_to_location_id = l_tab_intmed_location_id(cnt),
7342              fob_code = l_tab_fob_code(cnt),
7343              freight_terms_code = l_tab_freight_terms_code(cnt),
7344              ship_method_code = l_tab_ship_method_code(cnt),
7345              carrier_id = l_tab_carrier_id(cnt),
7346              service_level = l_tab_service_level(cnt),
7347              mode_of_transport = l_tab_mode_of_transport(cnt),
7348              deliver_to_location_id = l_tab_deliver_location_id(cnt),
7349              line_direction = l_tab_line_direction(cnt),
7350              shipping_control = l_tab_shipping_control(cnt),
7351              ignore_for_planning = l_tab_ignore_for_planning(cnt)
7352        WHERE DELIVERY_DETAIL_ID = l_contlist(cnt);
7353 
7354 
7355 -- then if the delivery detail has a delivery assigned, update the container records
7356 -- in WDA to indicate delivery id
7357     --
7358     -- K LPN CONV. rv
7359     IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7360     THEN
7361     --{
7362         IF (WSH_WMS_LPN_GRP.GK_WMS_ASSIGN_DLVY and l_sync_tmp_wms_contlist1.delivery_detail_id_tbl.count > 0)
7363         THEN
7364         --{
7365             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7366               (
7367                 p_sync_tmp_recTbl   => l_sync_tmp_wms_contlist1,
7368                 x_return_status     => l_return_status
7369               );
7370 
7371             IF l_debug_on THEN
7372               WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7373             END IF;
7374             --
7375             IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7376               x_return_status := l_return_status;
7377               --
7378               IF l_debug_on THEN
7379                   WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7380                   WSH_DEBUG_SV.pop(l_module_name);
7381               END IF;
7382               --
7383               RETURN;
7384             ELSE
7385               IF l_return_status <> C_SUCCESS_STATUS THEN
7386                 x_return_status := C_WARNING_STATUS;
7387               END IF;
7388             END IF;
7389         --}
7390         ELSIF (WSH_WMS_LPN_GRP.GK_INV_ASSIGN_DLVY and l_sync_tmp_inv_contlist1.delivery_detail_id_tbl.count > 0)
7391         THEN
7392         --{
7393             WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7394               (
7395                 p_sync_tmp_recTbl   => l_sync_tmp_inv_contlist1,
7396                 x_return_status     => l_return_status
7397               );
7398 
7399             IF l_debug_on THEN
7400               WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7401             END IF;
7402             --
7403             IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7404               x_return_status := l_return_status;
7405               --
7406               IF l_debug_on THEN
7407                   WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7408                   WSH_DEBUG_SV.pop(l_module_name);
7409               END IF;
7410               --
7411               RETURN;
7412             ELSE
7413               IF l_return_status <> C_SUCCESS_STATUS THEN
7414                 x_return_status := C_WARNING_STATUS;
7415               END IF;
7416             END IF;
7417         --}
7418         END IF;
7419     --}
7420     END IF;
7421     -- K LPN CONV. rv
7422 
7423     -- OTM R12 : assign delivery detail
7424 
7425     IF (l_gc3_is_installed = 'Y') THEN
7426       -- loop through the deliveries in l_dellist1,
7427       -- and get ignore_for_planning and tms_interface_flag tab,
7428       -- for ignore_for_planning delivery, check whether it's empty
7429       l_index := l_dellist1.FIRST;
7430       WHILE (l_index IS NOT NULL) LOOP
7431         -- l_dellist1(l_index) might be null if the container is not assigned
7432         -- to a delivery
7433         IF (l_dellist1(l_index) IS NOT NULL) THEN
7434           OPEN c_get_plan_and_tms_flag(l_dellist1(l_index));
7435           FETCH c_get_plan_and_tms_flag INTO l_ignore_for_planning_tab(l_index),
7436                                              l_tms_interface_flag_tab(l_index);
7437           IF c_get_plan_and_tms_flag%NOTFOUND THEN
7438           --{
7439             IF l_debug_on THEN
7440               WSH_DEBUG_SV.log(l_module_name,'No data for c_get_plan_and_tms_flag', l_dellist1(l_index));
7441             END IF;
7442             CLOSE c_get_plan_and_tms_flag;
7443             raise FND_API.G_EXC_ERROR;
7444           END IF;
7445 
7446           CLOSE c_get_plan_and_tms_flag;
7447 
7448           l_delivery_was_empty_tab(l_index) := FALSE;
7449           IF (l_ignore_for_planning_tab(l_index) = 'N') THEN
7450             l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(l_dellist1(l_index));
7451             IF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
7452               IF l_debug_on THEN
7453                 WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
7454               END IF;
7458             END IF;
7455               raise FND_API.G_EXC_ERROR;
7456             ELSIF (l_is_delivery_empty = 'Y') THEN
7457               l_delivery_was_empty_tab(l_index) := TRUE;
7459           END IF;
7460           IF l_debug_on THEN
7461             WSH_DEBUG_SV.log(l_module_name,'l_dellist1('||l_index||')', l_dellist1(l_index));
7462             WSH_DEBUG_SV.log(l_module_name,'l_contlist1('||l_index||')', l_contlist1(l_index));
7463             WSH_DEBUG_SV.log(l_module_name,'l_ignore_for_planning_tab('||l_index||')', l_ignore_for_planning_tab(l_index));
7464             WSH_DEBUG_SV.log(l_module_name,'l_tms_interface_flag_tab('||l_index||')', l_tms_interface_flag_tab(l_index));
7465           END IF;
7466         ELSE
7467           l_ignore_for_planning_tab(l_index) := NULL;
7468           l_tms_interface_flag_tab(l_index) := NULL;
7469           l_delivery_was_empty_tab(l_index) := NULL;
7470           IF l_debug_on THEN
7471             WSH_DEBUG_SV.log(l_module_name, 'l_dellist1 is null for ', l_contlist1(l_index));
7472           END IF;
7473         END IF;
7474 
7475         l_index := l_dellist1.NEXT(l_index);
7476       END LOOP;
7477     END IF;
7478     -- End of OTM R12 : assign delivery detail
7479 
7480     FORALL cnt IN 1..g_new_contid_tab.COUNT
7481       UPDATE wsh_delivery_assignments_v
7482        SET delivery_id = l_dellist1(cnt),
7483              last_update_date = SYSDATE,
7484              last_updated_by = FND_GLOBAL.USER_ID,
7485              last_update_login = FND_GLOBAL.LOGIN_ID
7486       WHERE  DELIVERY_DETAIL_ID = l_contlist1(cnt);
7487 
7488     -- OTM R12 : assign delivery detail
7489     IF (l_gc3_is_installed = 'Y') THEN
7490 
7491       l_index := l_dellist1.FIRST;
7492       l_index_update := 0;
7493       WHILE (l_index IS NOT NULL) LOOP
7494         IF (l_dellist1(l_index) IS NOT NULL AND
7495             l_ignore_for_planning_tab(l_index) = 'N') THEN
7496 
7497           IF (l_delivery_was_empty_tab(l_index)) THEN
7498             l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(l_dellist1(l_index));
7499 
7500             IF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
7501               --handle the error approriately to the procedure this code is in
7502               IF l_debug_on THEN
7503                 WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
7504               END IF;
7505               raise FND_API.G_EXC_ERROR;
7506             ELSIF (l_is_delivery_empty = 'N') THEN
7507               IF (l_tms_interface_flag_tab(l_index) = WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT) THEN
7508                 l_index_update := l_index_update + 1;
7509                 l_delivery_id_tab(l_index_update) := l_dellist1(l_index);
7510                 l_interface_flag_tab(l_index_update) := WSH_NEW_DELIVERIES_PVT.C_TMS_CREATE_REQUIRED;
7511 
7512                 IF (l_debug_on) THEN
7513                   WSH_DEBUG_SV.logmsg(l_module_name, 'Delivery is not empty');
7514                   WSH_DEBUG_SV.log(l_module_name,'l_dellist1', l_dellist1(l_index));
7515                   WSH_DEBUG_SV.log(l_module_name,'l_interface_flag_tab', l_interface_flag_tab(l_index_update));
7516                 END IF;
7517               ELSIF (l_tms_interface_flag_tab(l_index) in
7518                      (WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_REQUIRED,
7519                       WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_IN_PROCESS)) THEN
7520                 l_index_update := l_index_update + 1;
7521                 l_delivery_id_tab(l_index_update) := l_dellist1(l_index);
7522                 l_interface_flag_tab(l_index_update) := WSH_NEW_DELIVERIES_PVT.C_TMS_UPDATE_REQUIRED;
7523                 IF (l_debug_on) THEN
7524                   WSH_DEBUG_SV.logmsg(l_module_name, 'Delivery is not empty');
7525                   WSH_DEBUG_SV.log(l_module_name,'l_dellist1', l_dellist1(l_index));
7526                   WSH_DEBUG_SV.log(l_module_name,'l_interface_flag_tab', l_interface_flag_tab(l_index_update));
7527                 END IF;
7528               END IF;
7529             END IF;
7530           ELSE -- (NOT l_delivery_was_empty)
7531 
7532             OPEN c_get_tare_weight(l_contlist1(l_index));
7533             FETCH c_get_tare_weight INTO l_tare_weight;
7534 
7535             IF c_get_tare_weight%NOTFOUND THEN
7536             --{
7537               IF l_debug_on THEN
7538                 WSH_DEBUG_SV.log(l_module_name,'No data for c_get_tare_weight', l_contlist1(l_index));
7539               END IF;
7540               CLOSE c_get_tare_weight;
7541               raise FND_API.G_EXC_ERROR;
7542             END IF;
7543             CLOSE c_get_tare_weight;
7544 
7545             IF (l_debug_on) THEN
7546               WSH_DEBUG_SV.logmsg(l_module_name, 'Delivery was not empty');
7547               WSH_DEBUG_SV.log(l_module_name,'l_dellist1', l_dellist1(l_index));
7548               WSH_DEBUG_SV.log(l_module_name,'l_contlist1', l_contlist1(l_index));
7549               WSH_DEBUG_SV.log(l_module_name,'l_tare_weight', l_tare_weight);
7550             END IF;
7551 
7552             IF (l_tare_weight <> 0) THEN
7553               -- do not update if assign/unassign 0/NULL
7554               -- weight line/LPN to nonempty delivery
7555               l_index_update := l_index_update + 1;
7556               l_delivery_id_tab(l_index_update) := l_dellist1(l_index);
7557               l_interface_flag_tab(l_index_update) := NULL;
7558               --setting this flag here to null so that
7559               -- the update_tms_interface_flag procedure will take care of it.
7560             END IF;
7561           END IF;
7562         END IF;
7563         l_index := l_dellist1.NEXT(l_index);
7567         WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG(
7564       END LOOP;
7565 
7566       IF (l_index_update > 0) THEN
7568                        p_delivery_id_tab        => l_delivery_id_tab,
7569                        p_tms_interface_flag_tab => l_interface_flag_tab,
7570                        x_return_status          => l_return_status);
7571 
7572         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
7573           IF l_debug_on THEN
7574             WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG '||l_return_status);
7575           END IF;
7576           raise FND_API.G_EXC_ERROR;
7577         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
7578           IF l_debug_on THEN
7579             WSH_DEBUG_SV.logmsg(l_module_name,'Warning in WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG '||l_return_status);
7580           END IF;
7581           cont_warn := cont_warn + 1;
7582         END IF;
7583 
7584       END IF;
7585     END IF;
7586     -- End of OTM R12 : assign delivery detail
7587 
7588    l_mdc_id_tab.delete;
7589    l_mdc_index_i := l_contlist1.FIRST;
7590    l_mdc_index_j := 0;
7591    WHILE l_mdc_index_i IS NOT NULL LOOP
7592        l_mdc_index_j := l_mdc_index_j + 1;
7593        l_mdc_id_tab(l_mdc_index_j) := l_contlist1(l_mdc_index_i);
7594        l_mdc_index_i := l_contlist1.next(l_mdc_index_i);
7595 
7596    END LOOP;
7597 
7598    WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
7599                   p_detail_id_tab     => l_mdc_id_tab,
7600                   x_return_status     => x_return_status);
7601 
7602    IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7603        IF l_debug_on THEN
7604           WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
7605           WSH_DEBUG_SV.pop(l_module_name);
7606        END IF;
7607        RETURN;
7608    END IF;
7609 
7610 -- J: W/V Changes
7611    IF l_debug_on THEN
7612      WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment 3 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7613    END IF;
7614    FOR i in 1..l_contlist1.COUNT LOOP
7615      IF l_debug_on THEN
7616        WSH_DEBUG_SV.logmsg(l_module_name,'Cont:Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
7617      END IF;
7618 
7619      WSH_WV_UTILS.DD_WV_Post_Process(
7620        p_delivery_detail_id => l_contlist1(i),
7621        p_diff_gross_wt      => l_cont_Wtlist(i),
7622        p_diff_net_wt        => NULL,
7623        p_diff_volume        => l_cont_Vollist(i),
7624        p_diff_fill_volume   => l_cont_Vollist(i),
7625        x_return_status      => l_return_status);
7626 
7627      IF (l_return_status <> C_SUCCESS_STATUS) THEN
7628        --
7629        IF (l_return_status = C_ERROR_STATUS OR
7630            l_return_status = C_UNEXP_ERROR_STATUS) THEN
7631          error_cnt := error_cnt + 1;
7632        ELSE
7633          cont_warn := cont_warn + 1;
7634        END IF;
7635 
7636      END IF;
7637    END LOOP;
7638    IF l_debug_on THEN
7639      WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment 3 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7640    END IF;
7641 
7642     -- 75.1 Bulk Update Weight/Volume on packed delivery details
7643  -- added the WHO columns in the UPDATE
7644  -- in WSHWVUTB.pls , update_container_wt there are no WHO columns
7645     FORALL cnt IN 1..g_assign_detail_tab.COUNT
7646       UPDATE WSH_DELIVERY_DETAILS
7647       SET    NET_WEIGHT   = l_NetWtlist(cnt),
7648              GROSS_WEIGHT = l_GrossWtlist(cnt),
7649              VOLUME       = l_Vollist(cnt),
7650              last_update_date = SYSDATE,
7651              last_updated_by = FND_GLOBAL.USER_ID,
7652              last_update_login = FND_GLOBAL.LOGIN_ID
7653       WHERE  DELIVERY_DETAIL_ID = l_ddlist(cnt);
7654 
7655   END IF; -- line_cont_tab.COUNT > 0
7656 
7657   --H integration : Pricing Integration
7658   IF l_del_tab.count > 0 THEN
7659     IF l_debug_on THEN
7660       WSH_DEBUG_SV.logmsg(l_module_name,'Calling Program Unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
7661     END IF;
7662     WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required
7663       (p_entity_type => 'DELIVERY',
7664        p_entity_ids  => l_del_tab,
7665        x_return_status => l_return_status
7666       );
7667     IF l_debug_on THEN
7668       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
7669     END IF;
7670     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
7671       RAISE mark_reprice_error;
7672     END IF;
7673   END IF;
7674   -- End of H integration : Pricing Integration
7675 
7676 --dbms_output.put_line('AFTER CONT WT'||to_char(sysdate,'HH24:MI:SS'));
7677   -- 90.1 Summarize errors/warnings
7678 
7679   IF l_debug_on THEN
7680     WSH_DEBUG_SV.logmsg(l_module_name,'Error, warn,success Count -'||error_cnt||','||warn_cnt||','||succ_cnt);
7681   END IF;
7682   IF (warn_cnt > 0 OR cont_warn > 0) THEN
7683     x_return_status := C_WARNING_STATUS;
7684     IF cont_warn > 0 THEN
7685       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_PACK_WARN');
7686       FND_MESSAGE.SET_TOKEN('CONT_WARN',cont_warn);
7687       FND_MESSAGE.SET_TOKEN('CONT_ERR',0);
7688       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7689     END IF;
7690   ELSIF (error_cnt > 0) THEN
7691     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_PACK_ERROR');
7692     FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
7693     FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
7697     ELSE
7694     FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
7695     IF succ_cnt > 0 THEN
7696       x_return_status := C_WARNING_STATUS;
7698       x_return_status := C_ERROR_STATUS;
7699     END IF;
7700     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7701   ELSE
7702     x_return_status := C_SUCCESS_STATUS;
7703   END IF;
7704 
7705   IF l_debug_on THEN
7706     WSH_DEBUG_SV.logmsg(l_module_name,'L ret status -'||l_return_status);
7707     WSH_DEBUG_SV.logmsg(l_module_name,'X ret status -'||x_return_status);
7708   END IF;
7709   IF x_return_status = C_ERROR_STATUS THEN
7710     IF p_pack_cont_flag = 'Y' THEN
7711       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MASTER_NOT_PACK');
7712       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7713     END IF;
7714     --
7715     IF l_debug_on THEN
7716         WSH_DEBUG_SV.pop(l_module_name);
7717     END IF;
7718     --
7719     return;
7720   ELSE
7721     l_return_status := x_return_status;
7722   END IF;
7723 
7724   IF l_debug_on THEN
7725     WSH_DEBUG_SV.logmsg(l_module_name,'2L ret status -'||l_return_status);
7726     WSH_DEBUG_SV.logmsg(l_module_name,'2X ret status -'||x_return_status);
7727   END IF;
7728   -- 100.1 Call WSH_CONTAINER_ACTIONS.Auto_Pack_Conts depending on
7729   --       p_pack_cont_flag and if new detail containers are created
7730   IF l_detail_cont_tab.count > 0 AND p_pack_cont_flag = 'Y' THEN
7731 
7732     l_group_id_tab.delete;
7733 
7734     --dbms_output.put_line('Calling AUTO PACK CONTS With x_cont_instance count of ' || x_cont_instance_tab.count);
7735     --
7736     IF l_debug_on THEN
7737         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.AUTO_PACK_CONTS',WSH_DEBUG_SV.C_PROC_LEVEL);
7738     END IF;
7739     --
7740     wsh_container_actions.Auto_Pack_Conts (
7741       l_group_id_tab,
7742       l_detail_cont_tab,
7743       x_cont_instance_tab,
7744       l_mast_cont_tab,
7745       l_return_status);
7746 
7747     IF l_debug_on THEN
7748       WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
7749     END IF;
7750     IF l_return_status = C_UNEXP_ERROR_STATUS THEN
7751       --dbms_output.put_line('Returned from autopack conts with unexpected error');
7752       /* No message WSH_CONT_CONT_AUTOPACK_ERR
7753       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CONT_AUTOPACK_ERR');
7754       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7755       IF l_return_status <> C_ERROR_STATUS THEN
7756         l_return_status := C_WARNING_STATUS;
7757       END IF;
7758       */
7759       x_return_status := l_return_status;
7760       --
7761       IF l_debug_on THEN
7762           WSH_DEBUG_SV.pop(l_module_name);
7763       END IF;
7764       --
7765       RETURN;
7766     ELSE
7767       IF l_return_status <> C_SUCCESS_STATUS THEN
7768         x_return_status := C_WARNING_STATUS;
7769       END IF;
7770     END IF;
7771 
7772     --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Auto_Pack_Conts created '||l_mast_cont_tab.COUNT||' Master Containers');
7773     IF l_mast_cont_tab.COUNT > 0 THEN
7774       i := 1;
7775       cnt := x_cont_instance_tab.COUNT;
7776       WHILE i  <= l_mast_cont_tab.COUNT LOOP
7777         cnt := cnt + 1;
7778         x_cont_instance_tab(cnt) := l_mast_cont_tab(i);
7779         i := i + 1;
7780       END LOOP;
7781     END IF;
7782 
7783   END IF;
7784 
7785   IF l_debug_on THEN
7786     WSH_DEBUG_SV.logmsg(l_module_name,'3L ret status -'||l_return_status);
7787     WSH_DEBUG_SV.logmsg(l_module_name,'3X ret status -'||x_return_status);
7788   END IF;
7789 IF l_debug_on THEN
7790     WSH_DEBUG_SV.pop(l_module_name);
7791 END IF;
7792 --
7793 EXCEPTION
7794 
7795   WHEN mark_reprice_error THEN
7796     FND_MESSAGE.Set_Name('WSH','WSH_REPRICE_REQD_ERR');
7797     x_return_status := l_return_status;
7798     WSH_UTIL_CORE.add_message(x_return_status,l_module_name);
7799     IF l_debug_on THEN
7800       WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7801       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
7802     END IF;
7803 
7804   -- OTM R12 : assign delivery detail
7805   WHEN FND_API.G_EXC_ERROR THEN
7806     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7807     IF c_get_plan_and_tms_flag%ISOPEN THEN
7808       CLOSE c_get_plan_and_tms_flag;
7809     END IF;
7810     IF c_get_tare_weight%ISOPEN THEN
7811       CLOSE c_get_tare_weight;
7812     END IF;
7813 
7814     --
7815     IF l_debug_on THEN
7816       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
7817       WSH_DEBUG_SV.pop(l_module_name);
7818     END IF;
7819     --
7820     RETURN;
7821   -- End of OTM R12 : assign delivery detail
7822 
7823   WHEN Others THEN
7824     -- OTM R12 : assign delivery detail
7825     IF c_get_plan_and_tms_flag%ISOPEN THEN
7826       CLOSE c_get_plan_and_tms_flag;
7827     END IF;
7828     IF c_get_tare_weight%ISOPEN THEN
7829       CLOSE c_get_tare_weight;
7830     END IF;
7831     -- End of OTM R12 : assign delivery detail
7832 
7833         WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Auto_Pack_Lines',l_module_name);
7834         x_return_status := C_UNEXP_ERROR_STATUS;
7835 
7836 --
7837 IF l_debug_on THEN
7841 --
7838     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
7839     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
7840 END IF;
7842 END Auto_Pack_Lines;
7843 
7844 /*
7845 -----------------------------------------------------------------------------
7846    PROCEDURE  : Auto_Pack_Delivery
7847    PARAMETERS : p_delivery_tab - table of delivery ids that need to be
7848 			autopacked.
7849 		x_cont_instance_tab - table of container instance ids that were
7850 			created during the autopacking.
7851 		x_return_status - return status of API.
7852   DESCRIPTION : This procedure takes a table of deliveries that need to be
7853 		autopacked and checks for all unpacked lines in each of the
7854 		deliveries. After fetching all unpacked lines in each delivery,
7855 		it calls the Auto_Pack_Lines with the table of unpacked lines.
7856 		After autopacking the lines, it recalculates the weight and
7857 		volume of the delivery.
7858 ------------------------------------------------------------------------------
7859 */
7860 
7861 
7862 PROCEDURE Auto_Pack_Delivery (
7863   p_delivery_tab IN WSH_UTIL_CORE.id_tab_type,
7864   p_pack_cont_flag IN VARCHAR2,
7865   x_cont_instance_tab OUT NOCOPY  WSH_UTIL_CORE.id_tab_type,
7866   x_return_status OUT NOCOPY  VARCHAR2) IS
7867 
7868   CURSOR get_delivery_wms(x_delivery_id NUMBER) IS
7869   SELECT mp.wms_enabled_flag
7870   FROM   wsh_new_deliveries wnd,
7871          mtl_parameters     mp
7872   WHERE  wnd.delivery_id = x_delivery_id
7873   AND    mp.organization_id = wnd.organization_id;
7874 
7875 
7876   CURSOR Get_Delivery_Lines (v_delivery_id NUMBER) IS
7877   SELECT wda.delivery_detail_id
7878   FROM wsh_delivery_assignments_v wda,
7879        WSH_DELIVERY_DETAILS wdd
7880   WHERE wda.delivery_id = v_delivery_id
7881   AND wda.delivery_id IS NOT NULL
7882   AND wda.parent_delivery_detail_id IS NULL
7883   AND wda.delivery_detail_id = wdd.delivery_detail_id
7884   AND wdd.container_flag = 'N';
7885 
7886   l_del_detail_tab WSH_UTIL_CORE.id_tab_type;
7887   l_group_id_tab WSH_UTIL_CORE.id_tab_type;
7888 
7889   l_gross_weight NUMBER;
7890   l_volume NUMBER;
7891 
7892   l_cont_instance_tab WSH_UTIL_CORE.id_tab_type;
7893 
7894   l_ret_sts VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
7895   l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
7896 
7897   error_cnt NUMBER := 0;
7898   warn_cnt  NUMBER := 0;
7899   succ_cnt NUMBER := 0;
7900 
7901   i NUMBER;
7902   m NUMBER := 0;
7903   l_del_rows WSH_UTIL_CORE.id_tab_type;
7904 
7905   l_del_name VARCHAR2(30);
7906   l_wms_count NUMBER := 0;
7907   l_wms_enabled_flag VARCHAR2(1);
7908 
7909   -- LPN CONV. rv
7910   l_lpn_in_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_in_rec_type;
7911   l_lpn_out_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_out_rec_type;
7912   l_msg_count NUMBER;
7913   l_msg_data VARCHAR2(32767);
7914   e_return_excp EXCEPTION;
7915   -- LPN CONV. rv
7916 
7917 
7918 --
7919 l_debug_on BOOLEAN;
7920 --
7921 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'AUTO_PACK_DELIVERY';
7922 --
7923 BEGIN
7924   --
7925   --
7926   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
7927   --
7928   IF l_debug_on IS NULL
7929   THEN
7930       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
7931   END IF;
7932   --
7933   IF l_debug_on THEN
7934       WSH_DEBUG_SV.push(l_module_name);
7935       --
7936       WSH_DEBUG_SV.log(l_module_name,'P_PACK_CONT_FLAG',P_PACK_CONT_FLAG);
7937   END IF;
7938   --
7939   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
7940 
7941   l_del_rows.delete;
7942 
7943   FOR j IN 1..p_delivery_tab.count LOOP
7944 
7945     i := 1;
7946     l_ret_sts := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
7947     l_del_detail_tab.delete;
7948 
7949     IF l_debug_on THEN
7950       WSH_DEBUG_SV.log(l_module_name,'Auto pack delivery ', p_delivery_tab(j));
7951     END IF;
7952     -- bug 1578527: disallow packing actions in WMS
7953 
7954     OPEN  get_delivery_wms(p_delivery_tab(j));
7955     FETCH get_delivery_wms INTO l_wms_enabled_flag;
7956     IF get_delivery_wms%NOTFOUND THEN
7957       CLOSE get_delivery_wms;
7958       FND_MESSAGE.SET_NAME('WSH', 'WSH_NO_DATA_FOUND');
7959       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7960       --
7961       --IF l_debug_on THEN
7962           --WSH_DEBUG_SV.pop(l_module_name);
7963       --END IF;
7964       --
7965       --RETURN; LPN CONV. rv
7966       raise e_return_excp; -- LPN CONV. rv
7967     END IF;
7968     CLOSE get_delivery_wms;
7969 
7970     IF l_wms_enabled_flag = 'Y' THEN
7971       l_wms_count := l_wms_count + 1;
7972       l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
7973       goto next_delivery_to_autopack;
7974     END IF;
7975 
7976     FOR d IN Get_Delivery_Lines (p_delivery_tab(j)) LOOP
7977 
7978 	l_del_detail_tab(i) := d.delivery_detail_id;
7979         IF l_debug_on THEN
7980            WSH_DEBUG_SV.log(l_module_name,'pupulate delivery detail id  ', d.delivery_detail_id );
7981         END IF;
7982 	i := i + 1;
7983 
7984     END LOOP;
7985 
7986     IF Get_Delivery_Lines%ISOPEN THEN
7990        WSH_DEBUG_SV.log(l_module_name,'l_del_detail_tab.count: ', l_del_detail_tab.count );
7987 	CLOSE Get_Delivery_Lines;
7988     END IF;
7989     IF l_debug_on THEN
7991     END IF;
7992     IF l_del_detail_tab.count = 0 THEN
7993 
7994 	l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
7995 
7996 	FND_MESSAGE.SET_NAME('WSH','WSH_DEL_AUTOPACK_NULL');
7997 	--
7998 	IF l_debug_on THEN
7999 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.GET_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
8000 	END IF;
8001 	--
8002 	l_del_name := WSH_NEW_DELIVERIES_PVT.Get_Name(p_delivery_tab(j));
8003 	FND_MESSAGE.SET_TOKEN('DEL_NAME',l_del_name);
8004 	WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
8005     ELSE
8006 
8007     	--
8008     	IF l_debug_on THEN
8009     	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.AUTO_PACK_LINES',WSH_DEBUG_SV.C_PROC_LEVEL);
8010     	END IF;
8011     	--
8012 
8013     	wsh_container_actions.Auto_Pack_Lines (
8014 		l_group_id_tab,
8015 		l_del_detail_tab,
8016 		p_pack_cont_flag,
8017 		l_cont_instance_tab,
8018 		l_return_status);
8019 
8020         IF l_debug_on THEN
8021           WSH_DEBUG_SV.log(l_module_name,'Return status from wsh_container_actions.Auto_Pack_Lines -',l_return_status);
8022         END IF;
8023     	IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR OR l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
8024 		--dbms_output.put_line('autopack lines failed');
8025 		l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
8026     	ELSE
8027           IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
8028 	    l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
8029 	  ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN  -- Bug#2903864 - Start
8030 	     IF (x_cont_instance_tab IS NULL) THEN
8031 	         x_cont_instance_tab := l_cont_instance_tab;
8032 	     ELSE
8033 		 FOR i in 1..l_cont_instance_tab.count LOOP
8034 			x_cont_instance_tab(x_cont_instance_tab.count + 1) := l_cont_instance_tab(i);
8035 		 END LOOP;
8036 	     END IF; -- Bug#2903864 - End
8037 
8038           END IF;
8039 
8040     	END IF;
8041 
8042     END IF;
8043     <<next_delivery_to_autopack>>
8044     IF l_debug_on THEN
8045       WSH_DEBUG_SV.log(l_module_name,'return status for delivery '|| p_delivery_tab(j), l_ret_sts );
8046     END IF;
8047     IF l_ret_sts = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8048        succ_cnt := succ_cnt + 1;
8049     ELSIF l_ret_sts = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
8050        warn_cnt := warn_cnt + 1;
8051     ELSE
8052        error_cnt := error_cnt + 1;
8053     END IF;
8054   END LOOP;
8055 
8056    -- bug 1578527: disallow packing actions in WMS
8057    IF l_wms_count > 0 THEN
8058       IF l_wms_count = p_delivery_tab.count THEN
8059           FND_MESSAGE.SET_NAME('WSH', 'WSH_WMS_PACK_NOT_ALLOWED');
8060           WSH_UTIL_CORE.Add_message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
8061       ELSE
8062           FND_MESSAGE.SET_NAME('WSH', 'WSH_WMS_RECORDS_NOT_PACKED');
8063           FND_MESSAGE.SET_TOKEN('COUNT', l_wms_count);
8064           WSH_UTIL_CORE.Add_message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
8065       END IF;
8066    END IF;
8067 
8068    /*  H integration: Pricing integration csun
8069        when plan a delivery
8070    */
8071    IF l_del_rows.count > 0 THEN
8072 	--
8073 	IF l_debug_on THEN
8074 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
8075 	END IF;
8076 	--
8077 	WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
8078 	   p_entity_type => 'DELIVERY',
8079 	   p_entity_ids   => l_del_rows,
8080 	   x_return_status => l_return_status);
8081 
8082         IF l_debug_on THEN
8083           WSH_DEBUG_SV.log(l_module_name,'Return status from WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required -',l_return_status);
8084         END IF;
8085         IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR
8086 	      l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
8087 	      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8088 	      FND_MESSAGE.SET_NAME('WSH', 'WSH_REPRICE_REQUIRED_ERR');
8089 	      WSH_UTIL_CORE.add_message(x_return_status,l_module_name);
8090               --IF l_debug_on THEN
8091               --  WSH_DEBUG_SV.pop(l_module_name);
8092               --END IF;
8093 	      --return; LPN CONV. rv
8094               raise e_return_excp; -- LPN CONV. rv
8095 	END IF;
8096    END IF;
8097 
8098    -- LPN CONV. rv
8099    --
8100    IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8101    THEN
8102    --{
8103 
8104        IF l_debug_on THEN
8105          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);
8106        END IF;
8107        --
8108        WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8109          (
8110            p_in_rec             => l_lpn_in_sync_comm_rec,
8111            x_return_status      => l_return_status,
8112            x_out_rec            => l_lpn_out_sync_comm_rec
8113          );
8114        --
8115        IF l_debug_on THEN
8116            WSH_DEBUG_SV.log(l_module_name,  'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
8117        END IF;
8118        --
8119        WSH_UTIL_CORE.API_POST_CALL
8120          (
8124            p_raise_error_flag => false
8121            p_return_status    => l_return_status,
8122            x_num_warnings     => warn_cnt,
8123            x_num_errors       => error_cnt,
8125          );
8126    --}
8127    END IF;
8128    -- LPN CONV. rv
8129    --
8130 
8131   IF warn_cnt > 0 THEN
8132   	x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8133   	FND_MESSAGE.SET_NAME('WSH','WSH_DEL_PACK_WARN');
8134  	FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
8135 	FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
8136 	FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
8137   	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8138 
8139   ELSIF error_cnt > 0 THEN
8140      IF succ_cnt > 0 THEN
8141   	x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8142   	FND_MESSAGE.SET_NAME('WSH','WSH_DEL_PACK_WARN');
8143  	FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
8144 	FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
8145 	FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
8146   	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8147      ELSE
8148         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8149 	FND_MESSAGE.SET_NAME('WSH','WSH_DEL_PACK_ERROR');
8150 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8151      END IF;
8152   ELSIF succ_cnt > 0 THEN
8153      x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8154   ELSE
8155      x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8156   END IF;
8157 
8158   IF l_debug_on THEN
8159       WSH_DEBUG_SV.pop(l_module_name);
8160   END IF;
8161 
8162 EXCEPTION
8163     -- LPN CONV. rv
8164     WHEN e_return_excp THEN
8165         --
8166         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8167         THEN
8168         --{
8169              --
8170              IF l_debug_on THEN
8171                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);
8172              END IF;
8173              --
8174              WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8175                (
8176                  p_in_rec             => l_lpn_in_sync_comm_rec,
8177                  x_return_status      => l_return_status,
8178                  x_out_rec            => l_lpn_out_sync_comm_rec
8179                );
8180              --
8181              IF l_debug_on THEN
8182                WSH_DEBUG_SV.log(l_module_name,  'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
8183              END IF;
8184              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
8185                x_return_status := l_return_status;
8186              END IF;
8187         --}
8188         END IF;
8189         --
8190         -- LPN CONV. rv
8191         --
8192         IF l_debug_on THEN
8193           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:E_RETURN_EXCP');
8194         END IF;
8195 
8196   WHEN Others THEN
8197         --
8198         WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Auto_Pack_Delivery',l_module_name);
8199         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8200 
8201         IF l_debug_on THEN
8202           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);
8203         END IF;
8204         --
8205         IF l_debug_on THEN
8206           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);
8207         END IF;
8208         --
8209         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8210         THEN
8211         --{
8212              --
8213              IF l_debug_on THEN
8214                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);
8215              END IF;
8216              --
8217             WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8218               (
8219                 p_in_rec             => l_lpn_in_sync_comm_rec,
8220                 x_return_status      => l_return_status,
8221                 x_out_rec            => l_lpn_out_sync_comm_rec
8222               );
8223             --
8224             IF l_debug_on THEN
8225               WSH_DEBUG_SV.log(l_module_name,  'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
8226             END IF;
8227         --}
8228         END IF;
8229         --
8230         -- LPN CONV. rv
8231         --
8232         IF l_debug_on THEN
8233           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
8234         END IF;
8235 END Auto_Pack_Delivery;
8236 
8237 
8238 /*
8239 -----------------------------------------------------------------------------
8240    PROCEDURE  : Pack_Multi
8241    PARAMETERS : p_cont_tab - table of container instance ids that are being
8242 		packed.
8243 		p_del_detail_tab - table of unpacked delivery detail ids.
8244 		p_pack_mode  - indicates whether containers are packed in
8245 		equal/proportional mode ('E') or in full/sequential mode ('F')
8246 		p_split_pc - the percentage by which each line is going to be
8247 		split in the case of equal packing mode.
8251 		x_return_status - return status of API.
8248 		x_pack_status - the packed status of containers after the multi
8249 		pack is performed - indicates whether any underpacked or
8250 		overpacked containers.
8252   DESCRIPTION : This procedure takes the specified delivery detail ids and
8253 		packs them into the selected containers in either the full mode
8254 		or equal mode. In the full mode, it packs the first container
8255 		fully before packing the next. In the equal mode, all lines
8256 		are split equally between all the containers and packed
8257 		equally between them.
8258 ------------------------------------------------------------------------------
8259 */
8260 
8261 
8262 PROCEDURE Pack_Multi (
8263  p_cont_tab IN WSH_UTIL_CORE.id_tab_type,
8264  p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
8265  p_pack_mode IN VARCHAR2,
8266  p_split_pc IN NUMBER,
8267  x_pack_status OUT NOCOPY  VARCHAR2,
8268  x_return_status OUT NOCOPY  VARCHAR2) IS
8269 
8270 
8271  CURSOR Get_Cont_Info (v_cont_instance_id NUMBER) IS
8272  SELECT inventory_item_id, organization_id, gross_weight, net_weight,
8273 	volume, weight_uom_code, volume_uom_code, fill_percent,
8274 	minimum_fill_percent, maximum_load_weight, maximum_volume
8275  FROM wsh_delivery_details
8276  WHERE delivery_detail_id = v_cont_instance_id
8277  AND container_flag = 'Y';
8278 
8279  CURSOR Get_Detail_Info (v_del_detail_id NUMBER) IS
8280  SELECT inventory_item_id, nvl(shipped_quantity, NVL(picked_quantity, requested_quantity)) pack_qty,
8281 	requested_quantity_uom, net_weight, volume,
8282 	weight_uom_code, volume_uom_code, organization_id,
8283 	nvl(detail_container_item_id, master_container_item_id) cont_item_id,
8284         nvl(shipped_quantity2, NVL(picked_quantity2, requested_quantity2)) pack_qty2
8285  FROM wsh_delivery_details
8286  WHERE delivery_detail_id = v_del_detail_id
8287  AND container_flag = 'N';
8288 
8289  TYPE Cont_Rec IS RECORD (container_instance_id NUMBER, pack_status VARCHAR2(30));
8290 
8291  TYPE Detail_Rec IS RECORD (delivery_detail_id NUMBER, pack_status VARCHAR2(30));
8292 
8293  TYPE Cont_Rec_Table IS TABLE OF Cont_Rec INDEX BY BINARY_INTEGER;
8294  TYPE Detail_Rec_Table IS TABLE OF Detail_Rec INDEX BY BINARY_INTEGER;
8295 
8296  l_cont_item_id		NUMBER;
8297  l_cont_org_id		NUMBER;
8298  l_cont_gross		NUMBER;
8299  l_cont_net		NUMBER;
8300  l_cont_volume		NUMBER;
8301  l_cont_wt_uom		VARCHAR2(3);
8302  l_cont_vol_uom		VARCHAR2(3);
8303  l_cont_fill_pc		NUMBER;
8304  l_cont_min_fill_pc	NUMBER;
8305  l_cont_max_load_wt	NUMBER;
8306  l_cont_max_vol		NUMBER;
8307 
8308  l_det_inv_item_id	NUMBER;
8309  l_det_pack_qty		NUMBER;
8310  l_det_pack_qty2	NUMBER;
8311  l_det_qty_uom		VARCHAR2(3);
8312  l_det_net		NUMBER;
8313  l_det_volume		NUMBER;
8314  l_det_wt_uom		VARCHAR2(3);
8315  l_det_vol_uom		VARCHAR2(3);
8316  l_det_org_id		NUMBER;
8317  l_det_cont_item_id	NUMBER;
8318 
8319  l_split_det_id		NUMBER;
8320  i			NUMBER;
8321  j			NUMBER;
8322  cont_count		NUMBER;
8323  det_count		NUMBER;
8324  l_req_cont_num		NUMBER;
8325  l_cont_avail_pc	NUMBER;
8326  l_cont_self_tare	NUMBER;
8327  l_split_qty		NUMBER;
8328  l_split_qty2           NUMBER;
8329  l_return_status	VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8330 
8331  l_tmp_cont_gr		NUMBER;
8332  l_tmp_cont_net		NUMBER;
8333  l_tmp_cont_vol		NUMBER;
8334  l_tmp_fill_pc		NUMBER;
8335  l_pack_status		VARCHAR2(30);
8336 
8337  l_tmp_split_qty 	NUMBER;
8338 
8339  l_tmp_det_net		NUMBER;
8340  l_tmp_det_vol		NUMBER;
8341 
8342  l_det_pack_sts		VARCHAR2(30);
8343 
8344  l_tmp_det_tab		WSH_UTIL_CORE.id_tab_type;
8345 
8346  l_cont_tab		Cont_Rec_Table;
8347  l_det_tab		Detail_Rec_Table;
8348 
8349  l_split_pc		NUMBER;
8350 
8351  l_tmp_det_qty 		NUMBER;
8352  l_tmp_det_count	NUMBER;
8353 
8354  l_tmp_delta            NUMBER;
8355 
8356  l_cont_name VARCHAR2(30);
8357 
8358  warn_cnt NUMBER := 0;
8359  succ_cnt NUMBER := 0;
8360  error_cnt NUMBER := 0;
8361 
8362  cont_warn NUMBER := 0;
8363  cont_err NUMBER := 0;
8364  cont_succ NUMBER := 0;
8365  l_tmp_return_status   varchar2(1);
8366 
8367  l_tmp_status VARCHAR2(30)  := 'OK';
8368  l_discard_status          VARCHAR2(1);
8369  l_discard_message VARCHAR2(2000);
8370  -- J: W/V Changes
8371  l_fill_status VARCHAR2(1);
8372 
8373   /* H projects: pricing integration csun */
8374   m NUMBER := 0;
8375   l_detail_rows   WSH_UTIL_CORE.id_tab_type;
8376 
8377 -- for Load Tender
8378   l_trip_id_tab wsh_util_core.id_tab_type;
8379 
8380 -- bug 3562797 jckwok
8381   l_process_flag         VARCHAR2(1);
8382   l_fill_pc_basis        VARCHAR2(1);
8383 -- end bug 3562797 jckwok
8384 
8385 --
8386 l_debug_on BOOLEAN;
8387 --
8388 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'PACK_MULTI';
8389 --Bugfix 4070732
8390 l_api_session_name CONSTANT VARCHAR2(150) := G_PKG_NAME ||'.' || l_module_name;
8391 l_reset_flags BOOLEAN;
8392 l_num_errors  NUMBER;
8393 --
8394 --
8395   l_num_warnings NUMBER;
8396 --
8397 
8398 -- HW OPM BUG# 3011758
8399 --HW OPMCONV - Removed OPM local variables
8400 
8401 -- HW OPMCONV - Renamed variable to l_lot_divisible_flag
8405 
8402 l_lot_divisible_flag                        VARCHAR2(1);
8403 -- HW OPMCONV - New variable to hold item info
8404 l_item_info                   WSH_DELIVERY_DETAILS_INV.mtl_system_items_rec;
8406 -- LPN CONV. rv
8407 l_lpn_in_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_in_rec_type;
8408 l_lpn_out_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_out_rec_type;
8409 l_msg_count NUMBER;
8410 l_msg_data VARCHAR2(32767);
8411 e_return_excp EXCEPTION;
8412 -- LPN CONV. rv
8413 
8414 BEGIN
8415  IF WSH_UTIL_CORE.G_START_OF_SESSION_API is null THEN  --Bugfix 4070732
8416    WSH_UTIL_CORE.G_START_OF_SESSION_API     := l_api_session_name;
8417    WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API := FALSE;
8418  END IF;
8419  --
8420  --
8421  l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
8422  --
8423  IF l_debug_on IS NULL
8424  THEN
8425      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
8426  END IF;
8427  --
8428  IF l_debug_on THEN
8429      WSH_DEBUG_SV.push(l_module_name);
8430      --
8431      WSH_DEBUG_SV.log(l_module_name,'P_PACK_MODE',P_PACK_MODE);
8432      WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_PC',P_SPLIT_PC);
8433  END IF;
8434  --
8435  IF p_cont_tab.count = 0 OR p_del_detail_tab.count = 0 THEN
8436     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_ASSG_NULL');
8437     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8438     x_pack_status := 'Error';
8439     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8440     --
8441     --Bugfix 4070732 {
8442     IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API)  = upper(l_api_session_name) THEN
8443        IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
8444           IF l_debug_on THEN
8445                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
8446           END IF;
8447 
8448           WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags   => TRUE,
8449                                                     x_return_status => l_tmp_return_status);
8450 
8451 
8452           IF l_debug_on THEN
8453                WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
8454           END IF;
8455           /*wsh_util_core.api_post_call
8456                (
8457                  p_return_status => l_return_status,
8458                  x_num_warnings  => l_num_warnings,
8459                  x_num_errors    => l_num_errors
8460                 );
8461           */
8462           IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
8463             X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8464           END IF;
8465        END IF;
8466     END IF;
8467     --}
8468     --IF l_debug_on THEN
8469     --    WSH_DEBUG_SV.pop(l_module_name);
8470     --END IF;
8471     --
8472     --return; LPN CONV. rv
8473     raise e_return_excp; -- LPN CONV. rv
8474  END IF;
8475 
8476  cont_count := p_cont_tab.count;
8477  det_count := p_del_detail_tab.count;
8478 
8479  --dbms_output.put_line('in pack multi conts are ' || cont_count || ' details are ' || det_count);
8480 
8481  FOR i IN 1..cont_count LOOP
8482 
8483    l_cont_tab(i).container_instance_id := p_cont_tab(i);
8484    l_cont_tab(i).pack_status := 'Unpacked';
8485 
8486  END LOOP;
8487 
8488 	--
8489 	--
8490 	-- added to fix bug 1818233.
8491 	-- pack_multi performs most of time doing this check, especially
8492 	-- when a single delivery line is being split into multiple due to
8493 	-- container-load relationship.
8494 	-- This check will be made only once for a delivery line in place of
8495 	-- doing it every time we assign a split delivery line to a container.
8496 	-- Thus, auto-pack lines will always call assign_detail procedure
8497 	-- with parameter p_check_credit_holds = FALSE.
8498 	-- pack_multi lines will explicitly call the procedure (as follows)
8499 	-- WSH_DETAILS_VALIDATIONS.Check_Credit_Holds only once for a delivery
8500 	-- line . If any of the delivery lines fails this check, API will
8501 	-- return with error.
8502 	--
8503 
8504  FOR j IN 1..det_count LOOP
8505 
8506    l_det_tab(j).delivery_detail_id := p_del_detail_tab(j);
8507    l_det_tab(j).pack_status := 'Unpacked';
8508 
8509             --
8510             IF l_debug_on THEN
8511                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_CREDIT_HOLDS',WSH_DEBUG_SV.C_PROC_LEVEL);
8512             END IF;
8513             --
8514             WSH_DETAILS_VALIDATIONS.Check_Credit_Holds (
8515                                         l_det_tab(j).delivery_detail_id,
8516                                         'PACK',
8517                                         NULL,
8518                                         NULL,
8519                                         NULL,
8520                                         'Y',
8521                                         x_return_status);
8522             IF l_debug_on THEN
8523               WSH_DEBUG_SV.log(l_module_name,'return status-', x_return_status);
8524             END IF;
8525 
8526             IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8527                 l_return_status :=  WSH_UTIL_CORE.G_RET_STS_ERROR;
8528 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DETAIL_NOT_ASSIGNED');
8529 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
8533 
8530 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
8531                 x_pack_status := 'Error';
8532             END IF;
8534  END LOOP;
8535 
8536  IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR
8537  THEN
8538      --Bugfix 4070732 {
8539     IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API)  = upper(l_api_session_name) THEN
8540        IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
8541           IF l_debug_on THEN
8542                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
8543           END IF;
8544 
8545           WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags   => TRUE,
8546                                                     x_return_status => l_tmp_return_status);
8547 
8548           IF l_debug_on THEN
8549                WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
8550           END IF;
8551 
8552           /* wsh_util_core.api_post_call
8553                (
8554                  p_return_status => l_return_status,
8555                  x_num_warnings  => l_num_warnings,
8556                  x_num_errors    => l_num_errors
8557                 );
8558           */
8559 
8560           IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
8561             X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8562           END IF;
8563        END IF;
8564     END IF;
8565     --}
8566     --
8567     --IF l_debug_on THEN
8568     --    WSH_DEBUG_SV.pop(l_module_name);
8569     --END IF;
8570     --
8571     --RETURN; LPN CONV. rv
8572     raise e_return_excp; -- LPN CONV. rv
8573  END IF;
8574 
8575  i := 1;
8576  j := 1;
8577 
8578  IF p_pack_mode = 'F' THEN
8579    -- packing mode is full - each container is filled before packing the next
8580 
8581    WHILE j <= det_count LOOP
8582 
8583 	--dbms_output.put_line('j = ' || j);
8584 	l_det_pack_sts := 'Unpacked';
8585 	i := 1;
8586 
8587         IF l_debug_on THEN
8588 	  WSH_DEBUG_SV.log(l_module_name,'processing line ' || j || ' detail is ' || l_det_tab(j).delivery_detail_id);
8589         END IF;
8590 
8591 	WHILE i <= cont_count LOOP
8592 	    	IF l_cont_tab(i).pack_status = 'Skipped' THEN
8593 			l_cont_tab(i).pack_status := 'Unpacked';
8594 		END IF;
8595 		i := i + 1;
8596 	END LOOP;
8597 
8598 	i := 1;
8599 
8600         WHILE (i <= cont_count AND l_det_pack_sts = 'Unpacked') LOOP
8601 
8602 /*
8603 	   if i <= 0 or i > 10 then
8604 		exit;
8605 	   end if;
8606 */
8607 
8608  	   OPEN Get_Detail_Info (l_det_tab(j).delivery_detail_id);
8609 
8610 	   FETCH Get_Detail_Info INTO
8611 	  	l_det_inv_item_id,
8612 	  	l_det_pack_qty,
8613 	  	l_det_qty_uom,
8614 	  	l_det_net,
8615 	  	l_det_volume,
8616 	  	l_det_wt_uom,
8617 	  	l_det_vol_uom,
8618 	  	l_det_org_id,
8619 	  	l_det_cont_item_id,
8620                 l_det_pack_qty2;
8621 
8622 	   IF Get_Detail_Info%NOTFOUND THEN
8623 	   	FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
8624 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
8625 	   	x_pack_status := 'Error';
8626 	   	l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8627 	   	CLOSE Get_Detail_Info;
8628 		WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
8629 		error_cnt := error_cnt + 1;
8630 		l_det_tab(j).pack_status := 'Error';
8631 		exit;
8632  	   END IF;
8633 
8634 	   IF Get_Detail_Info%ISOPEN THEN
8635 	   	CLOSE Get_Detail_Info;
8636 	   END IF;
8637 
8638            -- bug 3562797 jckwok
8639            -- when percent fill basis flag is None and packing mode as Full,
8640            -- packing workbench raises error.
8641            Calc_Fill_Basis_and_Proc_Flag(
8642                     p_organization_id => l_det_org_id,
8643                     x_return_status   => x_return_status,
8644                     x_fill_basis      => l_fill_pc_basis,
8645                     x_process_flag    => l_process_flag);
8646 
8647            IF l_debug_on THEN
8648              WSH_DEBUG_SV.log(l_module_name,'return status -',x_return_status);
8649            END IF;
8650 
8651            IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
8652                --Bugfix 4070732 {
8653              IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API)  = upper(l_api_session_name) THEN
8654                   IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
8655                      IF l_debug_on THEN
8656                            WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
8657                      END IF;
8658 
8659                      WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags   => TRUE,
8660                                                                x_return_status => l_tmp_return_status);
8661 
8662 
8663                      IF l_debug_on THEN
8664                           WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
8665                      END IF;
8666 
8667                      /*wsh_util_core.api_post_call
8668                           (
8669                             p_return_status => l_return_status,
8670                             x_num_warnings  => l_num_warnings,
8674 
8671                             x_num_errors    => l_num_errors
8672                            );
8673                      */
8675                      IF
8676                      (l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
8677                      OR
8678                      (x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
8679                      THEN --{
8680                         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8681                      ELSIF x_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR
8682                      THEN
8683                         IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR
8684                         THEN
8685                            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8686                         ELSIF l_tmp_return_status =
8687                            WSH_UTIL_CORE.G_RET_STS_WARNING THEN
8688                            x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8689                         END IF;
8690                      END IF; --}
8691 
8692                   END IF;
8693              END IF;
8694              --}
8695              --IF l_debug_on THEN
8696              --  WSH_DEBUG_SV.pop(l_module_name);
8697              --END IF;
8698              --RETURN;
8699              raise e_return_excp; -- LPN CONV. rv
8700            END IF;
8701            IF (l_fill_pc_basis = 'N') THEN
8702               FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
8703               l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8704               WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
8705               x_pack_status := 'Error';
8706               error_cnt := error_cnt + 1;
8707               l_det_tab(j).pack_status := 'Error';
8708               exit;
8709            END IF;
8710            -- end bug 3562797 jckwok
8711 --- HW OPM BUG# 3011758
8712 -- HW OPMCONV - 1) Removed branching code
8713 --            - 2) Removed call to OPM API to get item info
8714 --            - 3) New WSH API call to get item info
8715 
8716            WSH_DELIVERY_DETAILS_INV.Get_item_information
8717              (
8718                 p_organization_id       =>l_det_org_id
8719               , p_inventory_item_id    => l_det_inv_item_id
8720               , x_mtl_system_items_rec => l_item_info
8721               , x_return_status        => l_return_status
8722              );
8723 
8724             wsh_util_core.api_post_call
8725              (
8726                 p_return_status => l_return_status,
8727                 x_num_warnings  => l_num_warnings,
8728                 x_num_errors    => l_num_errors
8729              );
8730 
8731 -- HW OPMCONV - Get flag from correct record
8732              IF ( l_item_info.lot_divisible_flag = 'N' AND
8733                   l_item_info.lot_control_code = 2 ) THEN
8734                l_lot_divisible_flag := 'N';
8735              ELSE
8736                l_lot_divisible_flag := 'Y';
8737              END IF;
8738 
8739 	   --dbms_output.put_line('before checking for unpacked conts ' || i || l_cont_tab(i).pack_status);
8740 
8741 
8742 	   WHILE (i <= cont_count and l_cont_tab(i).pack_status <> 'Unpacked') LOOP
8743 	 	i := i + 1;
8744 
8745 	   END LOOP;
8746 
8747 	   --dbms_output.put_line('after looping for unpacked conts i = ' || i);
8748 
8749 	   IF i > cont_count THEN
8750 		exit;
8751 	   END IF;
8752 
8753 	   OPEN Get_Cont_Info (l_cont_tab(i).container_instance_id);
8754 
8755 	   FETCH Get_Cont_Info INTO
8756 		l_cont_item_id,
8757 		l_cont_org_id,
8758 		l_cont_gross,
8759 	  	l_cont_net,
8760 	  	l_cont_volume,
8761 	  	l_cont_wt_uom,
8762 	  	l_cont_vol_uom,
8763 	  	l_cont_fill_pc,
8764 	  	l_cont_min_fill_pc,
8765 	  	l_cont_max_load_wt,
8766 	  	l_cont_max_vol;
8767 
8768 	   IF Get_Cont_Info%NOTFOUND THEN
8769 		--
8770 		IF l_debug_on THEN
8771 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
8772 		END IF;
8773 		--
8774 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
8775 	   	FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
8776 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
8777 	   	x_pack_status := 'Error';
8778 	   	l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8779 	   	CLOSE Get_Cont_Info;
8780 		WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
8781 		cont_err := cont_err + 1;
8782 		l_cont_tab(i).pack_status := 'Error';
8783 		l_tmp_status := 'Error';
8784 		GOTO new_container;
8785  	   END IF;
8786 
8787 	   CLOSE Get_Cont_Info;
8788 
8789 	   --dbms_output.put_line('processing container ' || i || ' id is ' || l_cont_tab(i).container_instance_id);
8790 
8791 /*
8792 --           WSH_WV_UTILS.Container_Weight_Volume (
8793 --	     replacing with TPA enabled API..
8794 
8795 	     --
8796 	     IF l_debug_on THEN
8797 	         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
8798 	     END IF;
8799 	     --
8800 	     WSH_TPA_CONTAINER_PKG.Container_Weight_Volume (
8801 				l_cont_tab(i).container_instance_id,
8802 				'Y',
8803 				l_tmp_cont_gr,
8804 				l_tmp_cont_net,
8805 				l_tmp_cont_vol,
8806 				'Y',
8807 				l_tmp_fill_pc,
8811            END IF;
8808 				x_return_status);
8809            IF l_debug_on THEN
8810 	     WSH_DEBUG_SV.log(l_module_name,'return status ' ,x_return_status);
8812 
8813 	   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8814 		--dbms_output.put_line('container wt vol error');
8815 
8816 		l_cont_tab(i).pack_status := 'Warning';
8817 		--
8818 		IF l_debug_on THEN
8819 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
8820 		END IF;
8821 		--
8822 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
8823 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
8824 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
8825 
8826 
8827 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
8828 		cont_warn := cont_warn + 1;
8829 		l_tmp_status := 'Error';
8830 		GOTO new_container;
8831 	   END IF;
8832 
8833 	   IF (l_tmp_fill_pc > 100) THEN
8834 */
8835            IF (l_cont_fill_pc > 100) THEN
8836 
8837 		--dbms_output.put_line('cont overpacked');
8838 
8839 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
8840 			l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8841 		END IF;
8842 
8843 		l_cont_tab(i).pack_status := 'Overpacked';
8844 		cont_warn := cont_warn + 1;
8845 		l_tmp_status := 'Error';
8846 		GOTO new_container;
8847            END IF;
8848 
8849            -- bug 4642837 l_tmp_fill_pc --> l_cont_fill_pc
8850 
8851 	   l_cont_avail_pc := 1 - (nvl(l_cont_fill_pc,0)/100);
8852 
8853 	   IF (l_cont_org_id = l_det_org_id) THEN
8854 
8855 --	  	WSH_CONTAINER_UTILITIES.Estimate_Detail_Containers (
8856 --		replacing with TPA enabled API..
8857 
8858 		--
8859 		IF l_debug_on THEN
8860 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.ESTIMATE_DETAIL_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
8861 		END IF;
8862 		--
8863 		WSH_TPA_CONTAINER_PKG.Estimate_Detail_Containers (
8864 			l_cont_tab(i).container_instance_id,
8865 			l_cont_item_id,
8866 			l_det_tab(j).delivery_detail_id,
8867 			l_det_org_id,
8868 			l_req_cont_num,
8869 			x_return_status);
8870 
8871                 IF l_debug_on THEN
8872 	          WSH_DEBUG_SV.log(l_module_name,'return status ' ,x_return_status);
8873                 END IF;
8874 	    	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8875 			l_cont_tab(i).pack_status := 'Skipped';
8876 			l_det_tab(j).pack_status := 'Error';
8877 			error_cnt := error_cnt + 1;
8878 			l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8879 			l_tmp_status := 'Error';
8880 			GOTO new_container;
8881 	    	END IF;
8882 
8883 		--dbms_output.put_line('req cont is ' || l_req_cont_num);
8884 		--dbms_output.put_line(' cont avail pc is ' || l_cont_avail_pc);
8885 
8886 		IF l_req_cont_num <= l_cont_avail_pc THEN
8887 
8888 		    l_tmp_det_tab(1) := l_det_tab(j).delivery_detail_id;
8889 
8890                 IF l_debug_on THEN
8891 	          WSH_DEBUG_SV.log(l_module_name,'assigning detail ' || l_tmp_det_tab(1) || ' to container ' || l_cont_tab(i).container_instance_id);
8892 		  WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
8893                 END IF;
8894 
8895 		    --
8896 		    wsh_container_actions.Assign_Detail (
8897 					l_cont_tab(i).container_instance_id,
8898 					l_tmp_det_tab,
8899 					l_pack_status,
8900 					x_return_status,FALSE);
8901                     IF l_debug_on THEN
8902 	              WSH_DEBUG_SV.log(l_module_name,'return status ' ,x_return_status);
8903                     END IF;
8904 		    IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8905 			--dbms_output.put_line('could not assign');
8906 			l_cont_tab(i).pack_status := 'Skipped';
8907 			l_det_tab(j).pack_status := 'Error';
8908 			error_cnt := error_cnt + 1;
8909 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
8910 				l_return_status := x_return_status;
8911 			END IF;
8912 
8913 		    ELSIF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8914 			l_det_tab(j).pack_status := 'Packed';
8915 			l_det_pack_sts := 'Packed';
8916 -- J: W/V Changes
8917                        WSH_WV_UTILS.Check_Fill_Pc (
8918                          p_container_instance_id => l_cont_tab(i).container_instance_id,
8919                          x_fill_status           => l_fill_status,
8920                          x_return_status         => l_return_status);
8921 
8922                        IF l_fill_status = 'O' THEN
8923                            --
8924                            IF l_debug_on THEN
8925                                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
8926                            END IF;
8927                            --
8928                            l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
8929 
8930                            --dbms_output.put_line('container ' || l_cont_name || ' overpacked ');
8931 
8932 
8933                            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
8934                                 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8935                            END IF;
8939                            l_tmp_status := 'Error';
8936 
8937                            l_cont_tab(i).pack_status := 'Overpacked';
8938                            cont_warn := cont_warn + 1;
8940                        END IF;
8941 
8942 		       l_det_pack_sts := 'Packed';
8943 
8944  		       IF l_req_cont_num = l_cont_avail_pc THEN
8945 	 	          l_cont_tab(i).pack_status := 'Packed';
8946 			  i := i + 1;
8947 		       END IF;
8948 
8949 
8950  		     END IF;
8951 
8952 		ELSE -- if line needs to be split
8953 
8954 		    l_tmp_split_qty := ROUND(((l_det_pack_qty*l_cont_avail_pc)/l_req_cont_num),LIMITED_PRECISION);
8955 
8956 		    --
8957 		    IF l_debug_on THEN
8958 		        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
8959 		    END IF;
8960 		    --
8961 		    WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
8962 					l_det_inv_item_id,
8963 					l_det_org_id,
8964 					l_tmp_split_qty,
8965 					l_det_qty_uom,
8966 					l_split_qty,
8967 					l_discard_status);
8968                        IF l_debug_on THEN
8969 	                 WSH_DEBUG_SV.log(l_module_name,'return status ' ,l_discard_status);
8970                        END IF;
8971 
8972 		    -- bug 1716136: errors likely mean integers are safe values.
8973 		    IF l_discard_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8974                         l_discard_message := FND_MESSAGE.GET;
8975                         l_split_qty := FLOOR(l_tmp_split_qty);
8976 		    END IF;
8977 
8978 		    IF l_split_qty IS NULL THEN
8979 			l_split_qty := l_tmp_split_qty;
8980 		    END IF;
8981 
8982 		    IF (l_split_qty < 0 OR l_split_qty > l_det_pack_qty) THEN
8983 			FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
8984 			FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
8985 			l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8986 			WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
8987 			l_det_tab(j).pack_status := 'Error';
8988 			error_cnt := error_cnt + 1;
8989 			exit;
8990 		    END IF;
8991 
8992 		    IF l_split_qty >= 1 THEN
8993 
8994                       IF l_det_pack_qty = l_split_qty THEN
8995                         IF l_debug_on THEN
8996                           WSH_DEBUG_SV.log(l_module_name,'In IF of equal-');
8997                         END IF;
8998                         l_split_det_id := l_det_tab(j).delivery_detail_id;
8999                         IF l_debug_on THEN
9000                           WSH_DEBUG_SV.log(l_module_name,'DELIVERY DETAIL id'||l_split_det_id);
9001                         END IF;
9002                         l_tmp_det_tab(1) := l_split_det_id;
9003                         l_tmp_det_count := j;
9004                         l_det_pack_sts := 'Packed';
9005 
9006                       ELSIF l_det_pack_qty > l_split_qty THEN
9007 
9008 --- HW OPM BUG# 3011758
9009 -- if lot indivisbile and last container, raise an error
9010 -- else go to the next container
9011 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9012 --            - 2) Changed check condition for lot divisible from 1 to 'N'
9013                          IF  ( l_lot_divisible_flag = 'N' AND i = cont_count AND l_det_pack_sts = 'Unpacked') THEN
9014                            FND_MESSAGE.SET_NAME('WSH','WSH_OPM_IND_SPLIT_PACK');
9015                            FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9016                            l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9017                            WSH_UTIL_CORE.Add_Message(l_return_status);
9018                            l_det_tab(j).pack_status := 'Error';
9019                            error_cnt := error_cnt + 1;
9020                            exit;
9021 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9022 --            - 2) Changed check condition for lot divisible from 1 to 'N'
9023                          ELSIF  ( l_lot_divisible_flag = 'N' AND i < cont_count AND l_det_pack_sts = 'Unpacked') THEN
9024                            goto new_container;
9025 			--dbms_output.put_line('calling split details');
9026 
9027 		    	--
9028 		    	ELSE -- non divisible
9029 
9030                           l_split_qty2 := (l_split_qty * l_det_pack_qty2)/l_det_pack_qty;
9031 		    	  IF l_debug_on THEN
9032                             WSH_DEBUG_SV.log(l_module_name,'l_split_qty',l_split_qty);
9033                             WSH_DEBUG_SV.log(l_module_name,'l_split_qty2',l_split_qty2);
9034                             WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty2',l_det_pack_qty2);
9035                             WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty',l_det_pack_qty);
9036 		    	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
9037 		    	  END IF;
9038 		    	--
9039 
9040 		    	  WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details (
9041 				p_from_detail_id => l_det_tab(j).delivery_detail_id,
9042 				p_req_quantity => l_split_qty,
9043 				p_req_quantity2 => l_split_qty2,
9044 				x_new_detail_id => l_split_det_id,
9045 				x_return_status =>x_return_status,
9046                                 p_manual_split => 'C'
9047                                 );
9048 			--dbms_output.put_line('...split detail id ' || l_split_det_id);
9049 		    	  IF l_debug_on THEN
9053 		    	  IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9050 		    	    WSH_DEBUG_SV.log(l_module_name,'return status,split det id -',x_return_status||l_split_det_id);
9051 		    	  END IF;
9052 
9054 				--dbms_output.put_line('error in splitting');
9055 				FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
9056 				FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9057 				l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9058 				WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9059 				l_det_tab(j).pack_status := 'Error';
9060 				error_cnt := error_cnt + 1;
9061 				exit;
9062 		    	  END IF;
9063 
9064 			--dbms_output.put_line('after splitting lines');
9065 
9066 			-- update detail attributes by decrementing shipped quantity
9067 			-- (if not null) by the split quantity and updating the shipped
9068 			-- quantity of the new line to be eqaul to the split quantity
9069 
9070 		   	l_tmp_det_tab(1) := l_split_det_id;
9071 		        l_tmp_det_count := l_det_tab.count + 1;
9072 			l_det_tab(l_tmp_det_count).delivery_detail_id := l_split_det_id;
9073 
9074 		      END IF;
9075 		    	--
9076 		    	IF l_debug_on THEN
9077 		    	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
9078 		    	END IF;
9079 		    	--
9080 		    	wsh_container_actions.Assign_Detail (
9081 					l_cont_tab(i).container_instance_id,
9082 				        l_tmp_det_tab,
9083 					l_pack_status,
9084 					x_return_status,FALSE);
9085 
9086 		    	IF l_debug_on THEN
9087 		    	    WSH_DEBUG_SV.log(l_module_name,'return status -',x_return_status);
9088 		    	END IF;
9089 
9090 		    	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9091 			     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9092 				l_return_status := x_return_status;
9093 			     END IF;
9094 
9095 			     l_det_tab(l_tmp_det_count).pack_status := 'Error';
9096 			     l_cont_tab(i).pack_status := 'Skipped';
9097 			     error_cnt := error_cnt + 1;
9098 
9099 		        END IF;
9100 
9101 		        IF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9102 			   l_det_tab(l_tmp_det_count).pack_status := 'Packed';
9103 			   l_cont_tab(i).pack_status := 'Packed';
9104 -- J: W/V Changes
9105 
9106                            WSH_WV_UTILS.Check_Fill_Pc (
9107                              p_container_instance_id => l_cont_tab(i).container_instance_id,
9108                              x_fill_status           => l_fill_status,
9109                              x_return_status         => l_return_status);
9110 
9111                            IF l_fill_status = 'O' THEN
9112                                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9113                                    l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9114                                 END IF;
9115 
9116                                 l_cont_tab(i).pack_status := 'Overpacked';
9117                                 cont_warn := cont_warn + 1;
9118                                 l_tmp_status := 'Error';
9119                                 GOTO new_container;
9120                            END IF;
9121 
9122 			   l_cont_tab(i).pack_status := 'Packed';
9123 
9124 		    	END IF; -- if packing successful
9125                       END IF; --- of of 3011758
9126 		    ELSE -- split qty < 1 means cannot split - so try next cont
9127 
9128 			i := i + 1;
9129 
9130 		    END IF; -- if split qty >= 1
9131 
9132 		END IF; -- if l_req_cont_num < = l_cont_avail_pc
9133 
9134 	     ELSE -- means org ids don't match and so try next container.
9135 
9136 		i := i + 1;
9137 
9138 	     END IF; -- if l_cont_org_id = l_det_org_id
9139 
9140 	     <<new_container>>
9141 		  	i := i + 1;
9142 			l_tmp_status := 'OK';
9143 
9144 	     END LOOP;  -- inner loop of containers
9145 
9146 	     j := j + 1;
9147 
9148 	 END LOOP;    -- outer loop of lines
9149 
9150    -- at end of loop, if all containers had been used, cont_count should be 0
9151    -- and if all lines had been used, j should be > det_count.
9152    -- if j <= det_count, then it implies that some lines were unpacked so
9153    -- issue a warning.
9154 
9155  ELSIF p_pack_mode = 'E' THEN
9156    -- packing mode is equal - each line is split equally between all containers
9157    -- and each split line is packed into each container. Packs even if
9158    -- container is overpacked/underpacked and returns with a warning.
9159 
9160     IF (p_split_pc IS NULL OR p_split_pc = 0) THEN
9161 	l_split_pc := 100/(p_cont_tab.count);
9162     ELSE
9163 	l_split_pc := p_split_pc;
9164     END IF;
9165 
9166     FOR j IN 1..det_count LOOP
9167 
9168    	IF l_debug_on THEN
9169    	  WSH_DEBUG_SV.log(l_module_name,'===========================================');
9170           WSH_DEBUG_SV.log(l_module_name,'pack mode E: processing detail ' || l_det_tab(j).delivery_detail_id);
9171    	END IF;
9172 
9173 	OPEN Get_Detail_Info (l_det_tab(j).delivery_detail_id);
9174 
9175 	FETCH Get_Detail_Info INTO
9176 	    l_det_inv_item_id,
9177 	    l_det_pack_qty,
9178 	    l_det_qty_uom,
9179 	    l_det_net,
9180 	    l_det_volume,
9181 	    l_det_wt_uom,
9182 	    l_det_vol_uom,
9183 	    l_det_org_id,
9184 	    l_det_cont_item_id,
9185             l_det_pack_qty2;
9186 
9190 	    l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9187 	IF Get_Detail_Info%NOTFOUND THEN
9188 	    FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
9189 	    FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9191 	    CLOSE Get_Detail_Info;
9192 	    --dbms_output.put_line('error in fetching details for ' || l_det_tab(j).delivery_detail_id);
9193 	    l_det_tab(j).pack_status := 'Error';
9194 	    WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9195 	    l_tmp_status := 'Error';
9196 	    GOTO next_detail;
9197  	END IF;
9198 
9199 	CLOSE Get_Detail_Info;
9200 
9201 
9202 -- HW OPM BUG#:3011758. get OPM item information
9203 -- HW OPMCONV - 1)Change the call from OPM API to get item info
9204 --                to a new WSH API
9205 --            - 2) Remove checking for process
9206 
9207           WSH_DELIVERY_DETAILS_INV.Get_item_information
9208           (
9209                p_organization_id       => l_det_org_id
9210               , p_inventory_item_id    => l_det_inv_item_id
9211               , x_mtl_system_items_rec => l_item_info
9212               , x_return_status        => l_return_status
9213             );
9214 
9215      wsh_util_core.api_post_call
9216       (
9217         p_return_status => l_return_status,
9218         x_num_warnings  => l_num_warnings,
9219         x_num_errors    => l_num_errors
9220       );
9221 
9222 
9223            IF ( l_item_info.lot_divisible_flag = 'N' AND
9224                   l_item_info.lot_control_code = 2 ) THEN
9225              l_lot_divisible_flag := 'N';
9226            ELSE
9227              l_lot_divisible_flag := 'Y';
9228            END IF;
9229 
9230         l_tmp_split_qty := ROUND((l_split_pc*l_det_pack_qty/100),LIMITED_PRECISION);
9231 
9232 	--
9233 	IF l_debug_on THEN
9234 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
9235 	END IF;
9236 	--
9237 	WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
9238 			l_det_inv_item_id,
9239 			l_det_org_id,
9240 			l_tmp_split_qty,
9241 			l_det_qty_uom,
9242 			l_split_qty,
9243 			l_discard_status);
9244 
9245 	IF l_debug_on THEN
9246 	  WSH_DEBUG_SV.log(l_module_name,'return status-',l_discard_status);
9247 	END IF;
9248 
9249         -- bug 1716136: errors likely mean integers are safe values.
9250 	IF l_discard_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9251                 l_discard_message := FND_MESSAGE.GET;
9252                 l_split_qty := FLOOR(l_tmp_split_qty);
9253 	END IF;
9254 	/* Bug 2173615 - added l_split_qty = 0,in case of fractional split example = 0.3 */
9255 	IF (l_split_qty IS NULL OR l_split_qty = 0) THEN
9256 		l_split_qty := l_tmp_split_qty;
9257 	END IF;
9258 
9259 	--dbms_output.put_line('l_split_qty = ' || l_split_qty);
9260         /* Bug 2173615 ,changed 1 to zero */
9261         IF l_split_qty < 0 THEN
9262 	   l_split_qty := 1;
9263 	   --dbms_output.put_line('because < 1, l_split_qty now = ' || l_split_qty);
9264         END IF;
9265 
9266 	l_tmp_det_qty := 0;
9267 
9268  	FOR i IN 1..cont_count LOOP
9269 
9270 	IF l_debug_on THEN
9271 	  WSH_DEBUG_SV.log(l_module_name,'----- packing into container ' || l_cont_tab(i).container_instance_id);
9272           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);
9273 	END IF;
9274 	   --dbms_output.put_line('l_tmp_det_qty = ' || l_tmp_det_qty);
9275 	   --dbms_output.put_line('l_det_pack_qty = ' || l_det_pack_qty);
9276 	   --dbms_output.put_line('l_split_qty = ' || l_split_qty);
9277 
9278 	   IF l_tmp_det_qty <= l_det_pack_qty THEN
9279 
9280 		OPEN Get_Cont_Info (l_cont_tab(i).container_instance_id);
9281 
9282 		FETCH Get_Cont_Info INTO
9283 			l_cont_item_id,
9284 			l_cont_org_id,
9285 			l_cont_gross,
9286 		  	l_cont_net,
9287 		  	l_cont_volume,
9288 		  	l_cont_wt_uom,
9289 		  	l_cont_vol_uom,
9290 	  		l_cont_fill_pc,
9291 		  	l_cont_min_fill_pc,
9292 		  	l_cont_max_load_wt,
9293 	  		l_cont_max_vol;
9294 
9295 		IF Get_Cont_Info%NOTFOUND THEN
9296 			--
9297 			IF l_debug_on THEN
9298 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9299 			END IF;
9300 			--
9301 			l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9302 	   		FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
9303 			FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9304 		   	-- x_pack_status := 'Error';
9305 		   	l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9306 			l_cont_tab(i).pack_status := 'Error';
9307 	   		CLOSE Get_Cont_Info;
9308 			WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9309 			cont_err := cont_err + 1;
9310 			l_tmp_status := 'Error';
9311 			GOTO next_container;
9312  	   	END IF;
9313 
9314 	   	CLOSE Get_Cont_Info;
9315 
9316 		IF l_cont_org_id = l_det_org_id THEN
9317 
9318 		   --dbms_output.put_line('Decision point: compare ' || (l_tmp_det_qty + l_split_qty) || ' with ' || l_det_pack_qty);
9319 
9320 		   -- bug 1367540:
9321 		   -- due to round-off errors in calculating floating-point values (e.g., 1/3 = 0.33333...)
9322 		   -- avoid exact comparisons
9323 
9324 		   l_tmp_delta := l_det_pack_qty - (l_tmp_det_qty + l_split_qty);
9325 
9329  	    	   	--
9326 		   IF l_tmp_delta > 0.00001 THEN  -- if (l_tmp_det_qty + l_split_qty) < l_det_pack_qty) then
9327 
9328 			--dbms_output.put_line('SPLITTING line ' || l_det_tab(j).delivery_detail_id || ' by ' || l_split_qty);
9330 
9331 --- HW OPM BUG# 3011758
9332 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9333 --            - 2) Changed check condition for lot divisible from 1 to 'N'
9334                       IF  ( l_lot_divisible_flag = 'N' AND i = cont_count AND l_det_pack_sts = 'Unpacked') THEN
9335                          FND_MESSAGE.SET_NAME('WSH','WSH_OPM_IND_SPLIT_PACK');
9336                          FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9337                          l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9338                          WSH_UTIL_CORE.Add_Message(l_return_status);
9339                          l_det_tab(j).pack_status := 'Error';
9340                          error_cnt := error_cnt + 1;
9341                          exit;
9342 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9343 --            - 2) Changed check condition for lot divisible from 1 to 'N'
9344                       ELSIF  ( l_lot_divisible_flag = 'N' AND i < cont_count AND l_det_pack_sts = 'Unpacked') THEN
9345                         goto next_container;
9346 
9347                       ELSE -- non divisible
9348                         l_split_qty2 := (l_split_qty * l_det_pack_qty2)/l_det_pack_qty;
9349 
9350  	    	   	IF l_debug_on THEN
9351                           WSH_DEBUG_SV.log(l_module_name,'l_split_qty',l_split_qty);
9352                           WSH_DEBUG_SV.log(l_module_name,'l_split_qty2',l_split_qty2);
9353                           WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty2',l_det_pack_qty2);
9354                           WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty',l_det_pack_qty);
9355  	    	   	  WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
9356  	    	   	END IF;
9357 
9358   	    	        WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details (
9359 			  p_from_detail_id => l_det_tab(j).delivery_detail_id,
9360 			  p_req_quantity => l_split_qty,
9361 			  p_req_quantity2 => l_split_qty2,
9362 			  x_new_detail_id => l_split_det_id,
9363 			  x_return_status => x_return_status,
9364                           p_manual_split => 'C'
9365                                 );
9366  	    	   	IF l_debug_on THEN
9367  	    	   	   WSH_DEBUG_SV.log(l_module_name,'return status',x_return_status);
9368  	    	   	END IF;
9369 			--dbms_output.put_line('...split detail id ' || l_split_det_id);
9370 
9371 	    	   	IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9372 			  FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
9373 			  FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9374                           l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9375 			  WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9376 	    		--dbms_output.put_line('error in splitting details for ' || l_det_tab(j).delivery_detail_id);
9377                           error_cnt := error_cnt + 1;
9378                           l_det_tab(j).pack_status := 'Error';
9379                           exit;
9380 	    	   	END IF;
9381 	    	      END IF; -- end of 3011758
9382 
9383 			-- update detail attributes by decrementing shipped quantity
9384 			-- (if not null) by the split quantity and updating the shipped
9385 			-- quantity of the new line to be eqaul to the split quantity
9386 
9387 	   	   	l_tmp_det_tab(1) := l_split_det_id;
9388    	           	l_tmp_det_count := l_det_tab.count + 1;
9389 		   	l_det_tab(l_tmp_det_count).delivery_detail_id := l_split_det_id;
9390   		    	--dbms_output.put_line('split line is  ' || l_split_det_id);
9391 
9392 		   ELSIF l_tmp_delta >= -0.00001 THEN -- elsif (l_tmp_det_qty + l_split_qty) = l_det_pack_qty then
9393 			-- Here, l_tmp_delta is between -0.00001 and 0.00001 (see the first IF condition).
9394 
9395 			l_split_det_id := l_det_tab(j).delivery_detail_id;
9396 			l_tmp_det_tab(1) := l_det_tab(j).delivery_detail_id;
9397 			l_tmp_det_count := j;
9398 		    	--dbms_output.put_line('NO SPLIT and line is  ' || l_split_det_id);
9399 		   ELSE
9400 			-- bug 1367540: this case had not been handled before,
9401 			-- so when neither condition above was met, the last split detail was reassigned.
9402 			-- The API will return a warning if the container turns out to be overpacked.
9403 			l_split_det_id := l_det_tab(j).delivery_detail_id;
9404 			l_tmp_det_tab(1) := l_det_tab(j).delivery_detail_id;
9405 			l_tmp_det_count := j;
9406 		    	--dbms_output.put_line('NO SPLIT, POSSIBLE OVERPACK and line ' || l_split_det_id || ' will be assigned.');
9407 		   END IF;
9408 
9409 		   --dbms_output.put_line('* * * ASSIGNING detail ' || l_tmp_det_tab(1) || ' to container ' || l_cont_tab(i).container_instance_id);
9410 
9411 	    	   --
9412 	    	   IF l_debug_on THEN
9413 	    	       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
9414 	    	   END IF;
9415 	    	   --
9416 	    	   wsh_container_actions.Assign_Detail (
9417 			l_cont_tab(i).container_instance_id,
9418 		        l_tmp_det_tab,
9419 			l_pack_status,
9420 			x_return_status,FALSE);
9421 
9422  	    	  IF l_debug_on THEN
9423  	    	    WSH_DEBUG_SV.log(l_module_name,'return status',x_return_status);
9424  	    	  END IF;
9425 
9426 	    	   IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9430 			END IF;
9427 		        --dbms_output.put_line('error in assigning details for ' || l_tmp_det_tab(1));
9428 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9429 				l_return_status := x_return_status;
9431 		 	error_cnt := error_cnt + 1;
9432 		       	l_det_tab(l_tmp_det_count).pack_status := 'Error';
9433 
9434 	           ELSIF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9435 		       --dbms_output.put_line('assigned line ' || l_tmp_det_tab(1));
9436 		       l_det_tab(l_tmp_det_count).pack_status := 'Packed';
9437 		       l_cont_tab(i).pack_status := 'Packed';
9438 
9439 -- J: W/V Changes
9440                        WSH_WV_UTILS.Check_Fill_Pc (
9441                          p_container_instance_id => l_cont_tab(i).container_instance_id,
9442                          x_fill_status           => l_fill_status,
9443                          x_return_status         => l_return_status);
9444 
9445                        IF (l_fill_status = 'O'  AND l_cont_item_id IS NOT NULL) THEN
9446 
9447                           IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9448                             l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9449                           END IF;
9450 
9451                           cont_warn := cont_warn + 1;
9452                           l_cont_tab(i).pack_status := 'Overpacked';
9453                        ELSIF (l_fill_status = 'U'
9454                                           AND l_cont_item_id IS NOT NULL ) THEN
9455 
9456                           IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9457                             l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9458                           END IF;
9459 
9460                           cont_warn := cont_warn + 1;
9461                           l_cont_tab(i).pack_status := 'Underpacked';
9462                        ELSE
9463                           l_cont_tab(i).pack_status := 'Packed';
9464                        END IF;
9465 
9466 		   END IF; -- if assign was successful
9467 
9468 		   l_tmp_det_qty := l_tmp_det_qty + l_split_qty;
9469 		ELSE
9470 		   --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);
9471 		   FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NO_MATCH');
9472 		   FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9473 		   --
9474 		   IF l_debug_on THEN
9475 		       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9476 		   END IF;
9477 		   --
9478 		   l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9479 		   FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9480 
9481 		END IF; -- cont org and det org id check
9482 
9483 	   END IF; -- if l_tmp_det_qty < l_det_pack_qty
9484 
9485            <<next_container>>
9486 		null;
9487 
9488         END LOOP; -- looping though containers - inner loop
9489 
9490         IF (l_tmp_det_qty = l_det_pack_qty) AND (l_det_tab(j).pack_status <> 'Error' ) THEN
9491 	   l_det_tab(j).pack_status := 'Packed';
9492         END IF;
9493 
9494         l_tmp_det_qty := 0;
9495 
9496 	<<next_detail>>
9497 	  	null;
9498 
9499     END LOOP; -- looping through lines - outer loop
9500 
9501  ELSE
9502    -- packing mode is invalid - did not pack
9503 
9504    FND_MESSAGE.SET_NAME('WSH','WSH_CONT_INVALID_PACK_MODE');
9505    x_pack_status := 'Error';
9506    x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9507    WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
9508    --Bugfix 4070732 {
9509    IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API)  = upper(l_api_session_name) THEN
9510       IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9511          IF l_debug_on THEN
9512                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9513          END IF;
9514 
9515          WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags   => TRUE,
9516                                                    x_return_status => l_tmp_return_status);
9517 
9518 
9519          IF l_debug_on THEN
9520               WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9521          END IF;
9522 
9523          /*wsh_util_core.api_post_call
9524               (
9525                 p_return_status => l_return_status,
9526                 x_num_warnings  => l_num_warnings,
9527                 x_num_errors    => l_num_errors
9528                );
9529         */
9530         IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
9531             X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9532         END IF;
9533       END IF;
9534    END IF;
9535    --}
9536    --
9537    --IF l_debug_on THEN
9538    --    WSH_DEBUG_SV.pop(l_module_name);
9539    --END IF;
9540    --
9541    --return;
9542    raise e_return_excp; -- LPN CONV. rv
9543  END IF;
9544 
9545 
9546  error_cnt := 0;
9547  warn_cnt := 0;
9548  succ_cnt := 0;
9549 
9550  cont_warn := 0;
9551  cont_err := 0;
9552  x_pack_status := NULL;
9553 
9554  --dbms_output.put_line('l_return_status = ' || l_return_status);
9555 
9556  FOR i IN 1..l_det_tab.count LOOP
9557 	--dbms_output.put_line('detail ' || l_det_tab(i).delivery_detail_id || ' status is ' || l_det_tab(i).pack_status);
9561 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DETAIL_NOT_ASSIGNED');
9558 	IF l_det_tab(i).pack_status <> 'Packed' THEN
9559 	   IF l_det_tab(i).pack_status = 'Error' THEN
9560 		error_cnt := error_cnt + 1;
9562 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(i).delivery_detail_id);
9563 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
9564            ELSE
9565 		IF l_det_tab(i).pack_status = 'Unpacked' THEN
9566 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_IGNORED');
9567 			FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(i).delivery_detail_id);
9568 			WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9569 		END IF;
9570 	        warn_cnt := warn_cnt + 1;
9571 	   END IF;
9572 	ELSE
9573 	   succ_cnt := succ_cnt + 1;
9574 	   /* H projects: pricing integration csun */
9575 	   m := m+1;
9576 	   l_detail_rows(m) := l_det_tab(i).delivery_detail_id;
9577 	END IF;
9578 
9579  END LOOP;
9580 
9581  IF error_cnt > 0 or warn_cnt > 0 THEN
9582     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_PACK_ERROR');
9583     FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
9584     FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
9585     FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
9586     IF error_cnt > 0 THEN
9587       l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9588     ELSIF warn_cnt > 0 THEN
9589       l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9590     END IF;
9591 
9592     WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9593 
9594     IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9595    	x_return_status := l_return_status;
9596     	x_pack_status := 'Error';
9597         --Bugfix 4070732 {
9598         IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API)  = upper(l_api_session_name) THEN
9599            IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9600               IF l_debug_on THEN
9601                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9602               END IF;
9603 
9604               WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags   => TRUE,
9605                                                         x_return_status => l_tmp_return_status);
9606 
9607 
9608               IF l_debug_on THEN
9609                    WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9610               END IF;
9611 
9612               /*wsh_util_core.api_post_call
9613                    (
9614                      p_return_status => l_return_status,
9615                      x_num_warnings  => l_num_warnings,
9616                      x_num_errors    => l_num_errors
9617                     );
9618               */
9619               IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
9620                    X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9621               END IF;
9622            END IF;
9623         END IF;
9624         --}
9625         --
9626         --IF l_debug_on THEN
9627         --    WSH_DEBUG_SV.pop(l_module_name);
9628         --END IF;
9629         --
9630         --return;
9631         raise e_return_excp; -- LPN CONV. rv
9632     END IF;
9633 
9634  END IF;
9635 
9636  /*  H integration: Pricing integration csun
9637  */
9638  IF l_detail_rows.count > 0 THEN
9639 	 --
9640 	 IF l_debug_on THEN
9641 	     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
9642 	 END IF;
9643 	 --
9644 	 WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
9645 	    p_entity_type => 'DELIVERY_DETAIL',
9646 	    p_entity_ids   => l_detail_rows,
9647 	    x_return_status => l_return_status);
9648 
9649        IF l_debug_on THEN
9650          WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
9651        END IF;
9652 	 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9653 	      x_return_status := l_return_status;
9654 	      FND_MESSAGE.SET_NAME('WSH', 'WSH_REPRICE_REQUIRED_ERR');
9655 	      WSH_UTIL_CORE.add_message(x_return_status,l_module_name);
9656 	      --
9657               --Bugfix 4070732 {
9658               IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API)  = upper(l_api_session_name) THEN
9659                  IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9660                     IF l_debug_on THEN
9661                           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9662                     END IF;
9663 
9664                     WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags   => TRUE,
9665                                                               x_return_status => l_tmp_return_status);
9666 
9667 
9668                     IF l_debug_on THEN
9669                          WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9670                     END IF;
9671 
9672                     /*wsh_util_core.api_post_call
9673                          (
9674                            p_return_status => l_return_status,
9675                            x_num_warnings  => l_num_warnings,
9676                            x_num_errors    => l_num_errors
9677                           );
9678                     */
9679                     IF
9680                      (l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9681                        OR
9685                     ELSIF x_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR
9682                      (x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9683                     THEN --{
9684                        x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9686                     THEN
9687                        IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR
9688                        THEN
9689                           x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9690                        ELSIF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING
9691                        THEN
9692                           x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9693                        END IF;
9694                     END IF; --}
9695                  END IF;
9696               END IF;
9697               --}
9698 	      --IF l_debug_on THEN
9699 	      --    WSH_DEBUG_SV.pop(l_module_name);
9700 	      --END IF;
9701 	      --
9702 	      --return;
9703               raise e_return_excp; -- LPN CONV. rv
9704 	 END IF;
9705  END IF;
9706 
9707 
9708 
9709  FOR i IN 1..l_cont_tab.count LOOP
9710 	   --dbms_output.put_line('container ' || l_cont_tab(i).container_instance_id || ' is ' || l_cont_tab(i).pack_status);
9711 	IF l_cont_tab(i).pack_status <> 'Packed' THEN
9712 	   IF l_cont_tab(i).pack_status = 'Error' THEN
9713 		l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9714 		cont_err := cont_err + 1;
9715 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NOT_PACKED');
9716 		--
9717 		IF l_debug_on THEN
9718 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9719 		END IF;
9720 		--
9721 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9722 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9723 		WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9724 	   ELSIF l_cont_tab(i).pack_status = 'Overpacked' THEN
9725 		cont_warn := cont_warn + 1;
9726 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_OVERPACKED');
9727 		--
9728 		IF l_debug_on THEN
9729 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9730 		END IF;
9731 		--
9732 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9733 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9734 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9735 	        IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9736 		        l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9737 		END IF;
9738 	   ELSIF l_cont_tab(i).pack_status = 'Underpacked' THEN
9739 		cont_warn := cont_warn + 1;
9740 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UNDERPACKED');
9741 		--
9742 		IF l_debug_on THEN
9743 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9744 		END IF;
9745 		--
9746 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9747 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9748 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9749 	        IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9750 		        l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9751 		END IF;
9752 	   ELSIF l_cont_tab(i).pack_status = 'Warning' THEN
9753 		cont_warn := cont_warn + 1;
9754 		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
9755 		--
9756 		IF l_debug_on THEN
9757 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9758 		END IF;
9759 		--
9760 		l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9761 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9762 		WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9763 
9764 	        IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9765 		        l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9766 		END IF;
9767 	   END IF;
9768 	END IF;
9769 
9770  END LOOP;
9771 
9772 
9773  -- LPN CONV. rv
9774  --
9775  IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
9776  THEN
9777  --{
9778 
9779      IF l_debug_on THEN
9780        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);
9781      END IF;
9782      --
9783      WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
9784        (
9785          p_in_rec             => l_lpn_in_sync_comm_rec,
9786          x_return_status      => l_return_status,
9787          x_out_rec            => l_lpn_out_sync_comm_rec
9788        );
9789      --
9790      IF l_debug_on THEN
9791          WSH_DEBUG_SV.log(l_module_name,  'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
9792      END IF;
9793      --
9794      WSH_UTIL_CORE.API_POST_CALL
9795        (
9796          p_return_status    => l_return_status,
9797          x_num_warnings     => cont_warn,
9798          x_num_errors       => cont_err,
9799          p_raise_error_flag => false
9800        );
9801  --}
9802  END IF;
9803  -- LPN CONV. rv
9804  --
9805 
9806  IF cont_err > 0 OR cont_warn > 0 THEN
9807 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_PACK_WARN');
9808  	FND_MESSAGE.SET_TOKEN('CONT_WARN',cont_warn);
9809 	FND_MESSAGE.SET_TOKEN('CONT_ERR',cont_err);
9810 	IF cont_err > 0 THEN
9814 	END IF;
9811 		l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9812 	ELSE
9813 		l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9815 	WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9816  END IF;
9817 
9818  IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9819  	x_return_status := l_return_status;
9820  ELSE
9821 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
9822  END IF;
9823 
9824  IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9825     x_pack_status := 'Success';
9826  ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9827     x_pack_status := 'Error';
9828  ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9829     x_pack_status := 'Warning';
9830     l_num_warnings := nvl(l_num_warnings,0 ) + 1;
9831  END IF;
9832 
9833 
9834  IF x_pack_status IS NULL THEN
9835 	x_pack_status := 'Success';
9836  END IF;
9837 
9838 --Bugfix 4070732 {
9839 IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
9840    IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9841       IF l_debug_on THEN
9842           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Process_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9843       END IF;
9844 
9845       WSH_UTIL_CORE.Process_stops_for_load_tender(p_reset_flags   => TRUE,
9846                                                   x_return_status => l_tmp_return_status);
9847       IF l_debug_on THEN
9848           WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9849       END IF;
9850 
9851       /*wsh_util_core.api_post_call
9852          (
9853             p_return_status => l_return_status,
9854             x_num_warnings  => l_num_warnings,
9855             x_num_errors    => l_num_errors
9856          );
9857       */
9858       IF (l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9859          OR (x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9860       THEN --{
9861          x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9862          x_pack_status := 'Error';
9863       ELSIF x_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR
9864       THEN
9865          IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9866             x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9867             x_pack_status := 'Error';
9868          ELSIF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING
9869          THEN
9870             x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9871             x_pack_status := 'Warning';
9872          END IF;
9873       END IF; --}
9874 
9875    END IF;
9876 END IF;
9877 --}
9878 
9879  	--
9880  	IF l_debug_on THEN
9881  	    WSH_DEBUG_SV.pop(l_module_name);
9882  	END IF;
9883  	--
9884 EXCEPTION
9885   -- LPN CONV. rv
9886   WHEN e_return_excp THEN
9887         --
9888         --
9889         IF l_debug_on THEN
9890           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);
9891         END IF;
9892         --
9893         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
9894         THEN
9895         --{
9896              --
9897              IF l_debug_on THEN
9898                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);
9899              END IF;
9900              --
9901             WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
9902               (
9903                 p_in_rec             => l_lpn_in_sync_comm_rec,
9904                 x_return_status      => l_return_status,
9905                 x_out_rec            => l_lpn_out_sync_comm_rec
9906               );
9907             --
9908             IF l_debug_on THEN
9909               WSH_DEBUG_SV.log(l_module_name,  'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
9910             END IF;
9911             --
9912             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
9913               x_return_status := l_return_status;
9914             END IF;
9915         --}
9916         END IF;
9917         --
9918         -- LPN CONV. rv
9919         --
9920         --
9921         IF l_debug_on THEN
9922           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:E_RETURN_EXCP');
9923         END IF;
9924   WHEN Others THEN
9925         --
9926 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Pack_Multi',l_module_name);
9927 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9928         --
9929 IF l_debug_on THEN
9930     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
9931 END IF;
9932         --
9933         -- LPN CONV. rv
9934         IF l_debug_on THEN
9935           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);
9936         END IF;
9937         --
9938         IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
9939         THEN
9940         --{
9941              --
9942              IF l_debug_on THEN
9943                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);
9944              END IF;
9945              --
9949                 x_return_status      => l_return_status,
9946             WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
9947               (
9948                 p_in_rec             => l_lpn_in_sync_comm_rec,
9950                 x_out_rec            => l_lpn_out_sync_comm_rec
9951               );
9952             --
9953             IF l_debug_on THEN
9954               WSH_DEBUG_SV.log(l_module_name,  'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
9955             END IF;
9956         --}
9957         END IF;
9958         --
9959         -- LPN CONV. rv
9960         --
9961 
9962         --Bugfix 4070732 {
9963         IF  upper(WSH_UTIL_CORE.G_START_OF_SESSION_API)  = upper(l_api_session_name) THEN
9964            IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9965               IF l_debug_on THEN
9966                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9967               END IF;
9968 
9969               WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags   => TRUE,
9970                                                         x_return_status => l_return_status);
9971 
9972 
9973               IF l_debug_on THEN
9974                    WSH_DEBUG_SV.log(l_module_name,'l_return_status',l_return_status);
9975               END IF;
9976 
9977               /*wsh_util_core.api_post_call
9978                    (
9979                      p_return_status => l_return_status,
9980                      x_num_warnings  => l_num_warnings,
9981                      x_num_errors    => l_num_errors
9982                     );
9983               */
9984            END IF;
9985         END IF;
9986         --}
9987 --
9988 IF l_debug_on THEN
9989     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
9990 END IF;
9991 --
9992 END Pack_Multi;
9993 
9994 
9995 /*
9996 -----------------------------------------------------------------------------
9997    PROCEDURE  : Update_Shipped_Qty
9998    PARAMETERS : p_delivery_detail_id - delivery detail id of the original line
9999 		that was split
10000 		p_split_detail_id - delivery detail id of the newly created
10001 		split line
10002 		p_split_qty - quantity used to split original delivery line
10003 		x_return_status - return status of API
10004   DESCRIPTION : This procedure updates the shipped quantities of the original
10005 		delivery line that was split and the new line that was created
10006 		due to the split.  The shipped quantity of the original line is
10007 		decremented by split qty and that of the new line is increased
10008 		to be equal to the split qty.  The updating is done only if the
10009 		original shipped quantity is not null.
10010 ------------------------------------------------------------------------------
10011 */
10012 
10013 
10014 
10015 PROCEDURE Update_Shipped_Qty(
10016   p_delivery_detail_id IN NUMBER,
10017   p_split_detail_id IN NUMBER,
10018   p_split_qty IN NUMBER,
10019   x_return_status OUT NOCOPY  VARCHAR2) IS
10020 
10021  CURSOR Get_Ship_Qty (v_det_id NUMBER) IS
10022  SELECT nvl(shipped_quantity,-99)
10023  FROM WSH_DELIVERY_DETAILS
10024  WHERE delivery_detail_id = v_det_id
10025  AND   nvl(line_direction,'O') IN ('O','IO')
10026  AND container_flag = 'N';
10027 
10028  l_shp_qty          NUMBER;
10029  l_db_split_shp_qty NUMBER;
10030 
10031 --
10032 l_debug_on BOOLEAN;
10033 --
10034 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_SHIPPED_QTY';
10035 --
10036 BEGIN
10037 
10038  --
10039  l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10040  --
10041  IF l_debug_on IS NULL
10042  THEN
10043      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10044  END IF;
10045  --
10046  IF l_debug_on THEN
10047      WSH_DEBUG_SV.push(l_module_name);
10048      --
10049      WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_DETAIL_ID',P_DELIVERY_DETAIL_ID);
10050      WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_DETAIL_ID',P_SPLIT_DETAIL_ID);
10051      WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_QTY',P_SPLIT_QTY);
10052  END IF;
10053  --
10054  IF p_split_detail_id IS NULL THEN
10055    -- nothing split, ergo nothing to update...
10056    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10057    --
10058    IF l_debug_on THEN
10059        WSH_DEBUG_SV.pop(l_module_name);
10060    END IF;
10061    --
10062    return;
10063  END IF;
10064 
10065  OPEN Get_Ship_Qty (p_delivery_detail_id);
10066 
10067  FETCH Get_Ship_Qty INTO l_shp_qty;
10068 
10069  IF Get_Ship_Qty%NOTFOUND THEN
10070 	CLOSE Get_Ship_Qty;
10071    	FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10072 	FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_detail_id);
10073 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10074 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10075 	--
10076 	IF l_debug_on THEN
10077 	    WSH_DEBUG_SV.pop(l_module_name);
10078 	END IF;
10079 	--
10080 	return;
10081  END IF;
10082 
10083  IF Get_Ship_Qty%ISOPEN THEN
10084 	CLOSE Get_Ship_Qty;
10085  END IF;
10086 
10087  IF l_shp_qty = -99 THEN
10088 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10089 	--
10090 	IF l_debug_on THEN
10091 	    WSH_DEBUG_SV.pop(l_module_name);
10092 	END IF;
10096 
10093 	--
10094 	return;
10095  END IF;
10097 
10098  -- need to look up the split detail's shipped quantity
10099  -- so that we can correctly adjust the original detail's shipped quantity
10100 
10101  OPEN Get_Ship_Qty(p_split_detail_id);
10102  FETCH Get_Ship_Qty into l_db_split_shp_qty;
10103 
10104  IF Get_Ship_Qty%NOTFOUND THEN
10105 	CLOSE Get_Ship_Qty;
10106    	FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10107 	FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_split_detail_id);
10108 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10109 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10110 	--
10111 	IF l_debug_on THEN
10112 	    WSH_DEBUG_SV.pop(l_module_name);
10113 	END IF;
10114 	--
10115 	return;
10116  END IF;
10117 
10118  CLOSE Get_Ship_Qty;
10119 
10120  IF l_db_split_shp_qty = -99 THEN
10121 	l_db_split_shp_qty := 0;
10122  END IF;
10123  --dbms_output.put_line('l_db_split_shp_qty = ' || l_db_split_shp_qty);
10124 
10125  l_shp_qty := l_shp_qty - nvl(p_split_qty,0) + l_db_split_shp_qty;
10126  --dbms_output.put_line('new l_shp_qty = ' || l_shp_qty);
10127 
10128  UPDATE WSH_DELIVERY_DETAILS
10129  SET shipped_quantity = l_shp_qty
10130  WHERE delivery_detail_id = p_delivery_detail_id;
10131 
10132  IF SQL%NOTFOUND THEN
10133 	FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10134 	FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_detail_id);
10135 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10136 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10137 	--
10138 	IF l_debug_on THEN
10139 	    WSH_DEBUG_SV.pop(l_module_name);
10140 	END IF;
10141 	--
10142 	return;
10143  END IF;
10144 
10145  UPDATE WSH_DELIVERY_DETAILS
10146  SET shipped_quantity = p_split_qty
10147  WHERE delivery_detail_id = p_split_detail_id;
10148 
10149  IF SQL%NOTFOUND THEN
10150 	FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10151 	FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_split_detail_id);
10152 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10153 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10154 	--
10155 	IF l_debug_on THEN
10156 	    WSH_DEBUG_SV.pop(l_module_name);
10157 	END IF;
10158 	--
10159 	return;
10160  END IF;
10161 
10162  x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10163 
10164 
10165  	--
10166  	IF l_debug_on THEN
10167  	    WSH_DEBUG_SV.pop(l_module_name);
10168  	END IF;
10169  	--
10170 EXCEPTION
10171 
10172   WHEN Others THEN
10173 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_Shipped_Qty',l_module_name);
10174 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
10175 
10176 --
10177 IF l_debug_on THEN
10178     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
10179     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
10180 END IF;
10181 --
10182 END Update_Shipped_Qty;
10183 
10184 /*
10185 -----------------------------------------------------------------------------
10186    PROCEDURE  : Pack_Container
10187    PARAMETERS : p_line_cont_rec - Container info which needs to be autopacked
10188                 x_return_status - Return Status of the API
10189   DESCRIPTION : This procedure packs a container into Master Container either
10190                 by creating a new one or by packing it into one created for
10191                 previous containers (created in the same run)
10192 ------------------------------------------------------------------------------
10193 */
10194 
10195 PROCEDURE Pack_Container(
10196            p_line_cont_rec IN  cont_info,
10197            x_return_status OUT NOCOPY  VARCHAR2) IS
10198 
10199   l_quantity_left              NUMBER;
10200   l_tmp_split_qty         NUMBER;
10201 
10202   i NUMBER;
10203   j NUMBER;
10204   gcdvalue NUMBER;
10205 
10206 --
10207 l_debug_on BOOLEAN;
10208 --
10209 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'PACK_CONTAINER';
10210 --
10211 BEGIN
10212 
10213   --
10214   --
10215   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10216   --
10217   IF l_debug_on IS NULL
10218   THEN
10219       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10220   END IF;
10221   --
10222   IF l_debug_on THEN
10223       WSH_DEBUG_SV.push(l_module_name);
10224       WSH_DEBUG_SV.log(l_module_name,'shp_qty',p_line_cont_rec.shp_qty);
10225       WSH_DEBUG_SV.log(l_module_name,'preferred_container',p_line_cont_rec.preferred_container);
10226       WSH_DEBUG_SV.log(l_module_name,'organization_id',p_line_cont_rec.organization_id);
10227       WSH_DEBUG_SV.log(l_module_name,'group_id',p_line_cont_rec.group_id);
10228   END IF;
10229   --
10230   l_quantity_left := p_line_cont_rec.shp_qty;
10231 
10232   -- Check Empty Containers first
10233   IF (g_empty_cont_tab.COUNT > 0 ) THEN
10234     --dbms_output.put_line('There are containers with empty space');
10235 
10236     i := g_empty_cont_tab.FIRST;
10237     WHILE i <= g_empty_cont_tab.LAST LOOP
10238       IF p_line_cont_rec.preferred_container <> g_empty_cont_tab(i).container_item_Id OR
10239          p_line_cont_rec.organization_id <> g_empty_cont_tab(i).organization_id OR
10243       END IF;
10240          p_line_cont_rec.group_id <> g_empty_cont_tab(i).group_id  OR
10241          g_empty_cont_tab(i).empty <= 0 THEN
10242         GOTO next_cont;
10244 
10245       -- Got a Match in empty container table
10246       IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
10247         --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);
10248         -- Calculate qty than can fit in 'empty' space
10249         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);
10250         IF (l_tmp_split_qty < 1) THEN
10251           GOTO next_cont;
10252         END IF;
10253 
10254       ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
10255         --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty weight '||g_empty_cont_tab(i).empty);
10256         -- Calculate qty than can fit in 'empty' space
10257         IF (p_line_cont_rec.converted_wt > g_empty_cont_tab(i).empty) THEN
10258           GOTO next_cont;
10259         END IF;
10260       ELSE
10261         --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty volume '||g_empty_cont_tab(i).empty);
10262         -- Calculate qty than can fit in 'empty' space
10263         IF (p_line_cont_rec.converted_vol > g_empty_cont_tab(i).empty) THEN
10264           GOTO next_cont;
10265         END IF;
10266       END IF;
10267 
10268       -- Assign the dd to container
10269       g_assign_detail_index := g_assign_detail_index + 1;
10270       g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := p_line_cont_rec.delivery_detail_id;
10271       g_assign_detail_tab(g_assign_detail_index).container_index := g_empty_cont_tab(i).container_index;
10272       l_quantity_left := l_quantity_left - p_line_cont_rec.shp_qty;
10273 
10274       --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);
10275 
10276       -- Calcualte space left and see if container needs to be deleted from empty cont PL/SQL table
10277       IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
10278         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);
10279         g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator * p_line_cont_rec.max_load_qty;
10280 
10281 	-- Bug # 3005780 : Added GCD just to reduce the numerator and denominator values
10282         IF (g_empty_cont_tab(i).numerator <> 0 ) AND (g_empty_cont_tab(i).denominator <> 0 ) THEN
10283             gcdvalue := Get_Gcd(g_empty_cont_tab(i).numerator , g_empty_cont_tab(i).denominator);
10284             --dbms_output.put_line('Get_Gcd return value is  '||gcdvalue');
10285             IF (gcdvalue > 1) THEN
10286                 g_empty_cont_tab(i).numerator := g_empty_cont_tab(i).numerator / gcdvalue;
10287                 g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator / gcdvalue ;
10288             END IF;
10289         END IF;
10290         IF ((g_empty_cont_tab(i).numerator <= 0) OR
10291             (g_empty_cont_tab(i).numerator >= g_empty_cont_tab(i).denominator)) THEN
10292           --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
10293           g_empty_cont_tab.DELETE(i);
10294         END IF;
10295       ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
10296         g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - p_line_cont_rec.gross_weight;
10297         IF (g_empty_cont_tab(i).empty <= 0) THEN
10298           --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
10299           g_empty_cont_tab.DELETE(i);
10300         END IF;
10301       ELSE
10302         g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - p_line_cont_rec.volume;
10303         IF (g_empty_cont_tab(i).empty <= 0) THEN
10304           --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
10305           g_empty_cont_tab.DELETE(i);
10306         END IF;
10307       END IF;
10308 
10309       -- If the whole qty is packed then exit the loop
10310       IF (l_quantity_left <= 0) THEN
10311         EXIT;
10312       END IF;
10313 
10314       <<next_cont>>
10315         i := g_empty_cont_tab.NEXT(i);
10316     END LOOP;
10317   END IF; -- g_empty_cont_tab > 0
10318 
10319   --dbms_output.put_line(' *** Looping empty cont tab is Over and Quantity Left is '||l_quantity_left||' ***');
10320   IF (l_quantity_left > 0) THEN
10321 
10322     -- Create new container index
10323     g_new_cont_index := g_new_cont_index + 1;
10324     g_new_container_tab(g_new_cont_index).container_item_id := p_line_cont_rec.preferred_container;
10325     g_new_container_tab(g_new_cont_index).organization_id   := p_line_cont_rec.organization_id;
10326     --dbms_output.put_line('Created Container index '||g_new_cont_index);
10327 
10328     -- Assign the split dd/existing dd
10329     g_assign_detail_index := g_assign_detail_index + 1;
10330     g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := p_line_cont_rec.delivery_detail_id;
10331     g_assign_detail_tab(g_assign_detail_index).container_index    := g_new_cont_index;
10332     --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);
10336       j := 1;
10333 
10334 
10335     IF (g_empty_cont_tab.COUNT = 0) THEN
10337     ELSE
10338       j:= g_empty_cont_tab.LAST + 1;
10339     END IF;
10340 
10341     -- Calculate Empty Space
10342     IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
10343       IF (l_quantity_left < p_line_cont_rec.max_load_qty) THEN
10344         g_empty_cont_tab(j).container_index   := g_new_cont_index;
10345         g_empty_cont_tab(j).container_item_id := p_line_cont_rec.preferred_container;
10346         g_empty_cont_tab(j).organization_id   := p_line_cont_rec.organization_id;
10347         g_empty_cont_tab(j).group_id          := p_line_cont_rec.group_id;
10348         g_empty_cont_tab(j).numerator         := p_line_cont_rec.max_load_qty - l_quantity_left;
10349         g_empty_cont_tab(j).denominator       := p_line_cont_rec.max_load_qty;
10350         --dbms_output.put_line('Inserted Container '||j||' with numerator '||g_empty_cont_tab(j).numerator||' and denominator '||g_empty_cont_tab(j).denominator);
10351       END IF;
10352     ELSIF (p_line_cont_rec.fill_pc_basis in ('W','V')) THEN
10353       IF ((p_line_cont_rec.converted_wt < p_line_cont_rec.cont_wt AND p_line_cont_rec.fill_pc_basis = 'W') OR
10354           (p_line_cont_rec.converted_vol < p_line_cont_rec.cont_vol AND p_line_cont_rec.fill_pc_basis = 'V')) THEN
10355         g_empty_cont_tab(j).container_index   := g_new_cont_index;
10356         g_empty_cont_tab(j).container_item_id := p_line_cont_rec.preferred_container;
10357         g_empty_cont_tab(j).organization_id   := p_line_cont_rec.organization_id;
10358         g_empty_cont_tab(j).group_id          := p_line_cont_rec.group_id;
10359 
10360         IF (p_line_cont_rec.fill_pc_basis = 'W') THEN
10361           g_empty_cont_tab(j).empty             := p_line_cont_rec.cont_wt - p_line_cont_rec.converted_wt;
10362           --dbms_output.put_line('Inserted Container '||j||' with empty weight '||g_empty_cont_tab(j).empty||' into empty cont');
10363         ELSE
10364           g_empty_cont_tab(j).empty             := p_line_cont_rec.cont_vol - p_line_cont_rec.converted_vol;
10365           --dbms_output.put_line('Inserted Container '||j||' with empty volume '||g_empty_cont_tab(j).empty||' into empty cont');
10366         END IF;
10367 
10368       END IF;
10369     END IF;
10370 
10371   END IF;
10372   x_return_status := C_SUCCESS_STATUS;
10373   --
10374   IF l_debug_on THEN
10375       WSH_DEBUG_SV.pop(l_module_name);
10376   END IF;
10377   --
10378   RETURN;
10379 
10380 --
10381 IF l_debug_on THEN
10382     WSH_DEBUG_SV.pop(l_module_name);
10383 END IF;
10384 --
10385 EXCEPTION
10386   WHEN Others THEN
10387         WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Pack_Container',l_module_name);
10388         x_return_status := C_UNEXP_ERROR_STATUS;
10389 
10390 --
10391 IF l_debug_on THEN
10392     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
10393     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
10394 END IF;
10395 --
10396 END Pack_Container;
10397 
10398 /*
10399 -----------------------------------------------------------------------------
10400    PROCEDURE  : Validate_Container_For_Pack
10401    PARAMETERS : p_group_id_tab_id - table of group ids for lines that need to
10402                                     be autopacked.
10403                 p_cont_info_tab  - table of Container ids
10404                 x_line_cont_tab   - Delivery Detail(Cont)s along with other info
10405                                     which passed validations
10406                 x_error_cnt       - Count of errors encountered during validation
10407                 x_warn_cnt        - Count of warnings encountered during validation
10408   DESCRIPTION : This procedure takes a list of containers and does all
10409                 validations and returns a list of containers which passed
10410                 validations
10411 ------------------------------------------------------------------------------
10412 */
10413 -- Bug 3570364 : Added new parameter p_mast_cont_info_tab which contains the
10414 --               Master container informations which is used when Auto_pack Master
10415 --               action performed on delivery detail lines
10416 
10417 PROCEDURE Validate_Container_For_Pack(
10418   p_group_id_tab       IN  WSH_UTIL_CORE.id_tab_type,
10419   p_cont_info_tab      IN  wsh_util_core.id_tab_type,
10420   p_mast_cont_info_tab IN wsh_container_actions.empty_cont_info_tab,
10421   x_line_cont_tab      OUT NOCOPY  wsh_container_actions.cont_info_tab,
10422   x_error_cnt          OUT NOCOPY  NUMBER,
10423   x_warn_cnt           OUT NOCOPY  NUMBER,
10424   x_fill_pc_warn_cnt   OUT NOCOPY  NUMBER -- bug 3421823
10425   ) IS
10426 
10427 --Bug 3405853 : Added detail_container_item_id in the select clause
10428   CURSOR Get_dd_Detail(c_dd_id NUMBER) IS
10429   SELECT wdd.inventory_item_id inventory_item_id,
10430          wdd.gross_weight gross_weight,
10431          wdd.weight_uom_code weight_uom,
10432          wdd.volume volume,
10433          wdd.volume_uom_code volume_uom,
10434          wdd.organization_id organization_id,
10435          wdd.delivery_detail_id,
10436          wda.parent_delivery_detail_id parent_delivery_detail_id,
10437 	 nvl(wdd.detail_container_item_id,wdd.master_container_item_id) detail_container_item_id
10438   FROM   wsh_delivery_details wdd,
10439          wsh_delivery_assignments_v wda
10440   WHERE  wdd.delivery_detail_id = c_dd_id
10441   AND    wdd.delivery_detail_id = wda.delivery_detail_id
10442   AND    source_code = 'WSH';
10443 
10447   WHERE  load_item_id           = v_inv_item_id
10444   CURSOR Get_Cont_Item_Load (v_inv_item_id NUMBER, v_cont_item_id NUMBER, v_organization_id NUMBER) IS
10445   SELECT max_load_quantity
10446   FROM   WSH_CONTAINER_ITEMS
10448   AND    container_item_id      = v_cont_item_id
10449   AND    master_organization_id = v_organization_id;
10450 
10451   line_cont_rec wsh_container_actions.cont_info;
10452   line_cont_tab wsh_container_actions.cont_info_tab;
10453 
10454   l_return_status        VARCHAR2(1);
10455   l_last_organization_id NUMBER;
10456   l_dd_count             NUMBER;
10457   l_group_id_cnt         NUMBER;
10458   l_group_id             NUMBER;
10459   l_parent_delivery_detail_id NUMBER;
10460   l_error_cnt            NUMBER;
10461   l_process_flag         VARCHAR2(1);
10462   l_fill_pc_basis        VARCHAR2(1);
10463   l_wcl_cont_item_id     NUMBER;
10464   l_max_load_qty         NUMBER;
10465   l_dd_gross_wt          NUMBER;
10466   l_dd_net_wt            NUMBER;
10467   l_dd_volume            NUMBER;
10468   l_cont_fill_pc         NUMBER;
10469   l_cont_name            VARCHAR2(30);
10470   l_mtl_max_load         NUMBER;
10471   l_mtl_max_vol          NUMBER;
10472   l_mtl_wt_uom           VARCHAR2(3);
10473   l_mtl_vol_uom          VARCHAR2(3);
10474   l_item_name		VARCHAR2(2000); -- <-- for Bug 3577115
10475   --Bug #3405853
10476   l_detail_container_item_id  NUMBER;
10477 
10478 
10479   error_cnt              NUMBER := 0;
10480   warn_cnt               NUMBER := 0;
10481 
10482   fill_pc_warn_cnt       NUMBER := 0; -- 3562797 jckwok
10483 --
10484 l_debug_on BOOLEAN;
10485 --
10486 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'VALIDATE_CONTAINER_FOR_PACK';
10487 --
10488 BEGIN
10489 
10490 
10491   -- 10. Populate  detail dd info into line_cont_tab PL/SQL table
10492   --
10493   --
10494   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10495   --
10496   IF l_debug_on IS NULL
10497   THEN
10498       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10499   END IF;
10500   --
10501   IF l_debug_on THEN
10502       WSH_DEBUG_SV.push(l_module_name);
10503       WSH_DEBUG_SV.log(l_module_name,'---------------------------------');
10504       WSH_DEBUG_SV.log(l_module_name,'In Validate_Container_For_Pack...');
10505       WSH_DEBUG_SV.log(l_module_name,'---------------------------------');
10506   END IF;
10507   --
10508   l_last_organization_id := NULL;
10509   l_dd_count := 0;
10510   l_group_id_cnt := 1;
10511 
10512   WHILE ( l_group_id_cnt <= p_cont_info_tab.COUNT )
10513   LOOP
10514     --dbms_output.put_line('Processing dd '||p_cont_info_tab(l_group_id_cnt));
10515 
10516      OPEN get_dd_detail(p_cont_info_tab(l_group_id_cnt));
10517 
10518      FETCH get_dd_detail
10519      INTO  line_cont_rec.inventory_item_id,
10520            line_cont_rec.gross_weight,
10521            line_cont_rec.weight_uom,
10522            line_cont_rec.volume,
10523            line_cont_rec.volume_uom,
10524            line_cont_rec.organization_id,
10525            line_cont_rec.delivery_detail_id,
10526            l_parent_delivery_detail_id,
10527 	   l_detail_container_item_id;
10528      IF (get_dd_detail%NOTFOUND) THEN
10529        CLOSE get_dd_detail;
10530        goto next_cont;
10531      END IF;
10532 
10533      CLOSE get_dd_detail;
10534 
10535     -- 10.10 Delete Organization Specfic Cached Tables if organization_id changes
10536     IF ((l_last_organization_id IS NULL) OR (line_cont_rec.organization_id <> l_last_organization_id)) THEN
10537       g_cache_cont_load_info_tab.DELETE;
10538       g_cont_msi_tab.DELETE;
10539 
10540       l_last_organization_id := line_cont_rec.organization_id;
10541     END IF;
10542 
10543     /* grouping API will return a number = negative delivery_id if the line is
10544        already assigned to a delivery. So, check for negative numbers and if number
10545        < 0, then convert it to a postive number = delivery_id.
10546     */
10547     l_group_id := ABS(p_group_id_tab(p_cont_info_tab(l_group_id_cnt)));
10548     --dbms_output.put_line('l_group_id '||l_group_id);
10549 
10550     -- 10.20 Check if the detail is already packed
10551     IF (l_parent_delivery_detail_id IS NOT NULL) THEN
10552       --dbms_output.put_line('Warning: cont already packed');
10553       warn_cnt := warn_cnt + 1;
10554       goto next_cont;
10555     END IF;
10556 
10557     -- 10.30 Determine Fill PC Basis from shipping parameters
10558     Calc_Fill_Basis_and_Proc_Flag(
10559       p_organization_id => line_cont_rec.organization_id,
10560       x_return_status   => l_return_status,
10561       x_fill_basis      => l_fill_pc_basis,
10562       x_process_flag    => l_process_flag);
10563     IF l_debug_on THEN
10564       WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10565     END IF;
10566     IF (l_return_status <> C_SUCCESS_STATUS) THEN
10567       error_cnt := error_cnt + 1;
10568       goto next_cont;
10569     END IF;
10570 
10571     line_cont_rec.fill_pc_basis := l_fill_pc_basis;
10572     IF (line_cont_rec.fill_pc_basis IS NULL) THEN
10573       --dbms_output.put_line('Skipping cont');
10574       goto next_cont;
10575     --
10576     -- bug 3562797 jckwok
10577     -- check Shipping Parameter Fill Percent Basis.
10578     --
10579     ELSIF line_cont_rec.fill_pc_basis='N' THEN
10580       fill_pc_warn_cnt := fill_pc_warn_cnt + 1;
10584     -- 10.40 Determine Preferred Container
10581       goto next_cont;
10582     END IF;
10583     -- end of bug 3562797
10585     -- Bug 3405853 : First check the detail lpn entered if it is null
10586     --               then consider the preferred container.
10587     -- Bug 3570364 : First check the master container item for the line ( Auto Pack Master action on Lines)
10588     --               If it is NULL then check for the Detail container item for the
10589     --               LPN ( Auto Pack Action on LPN's)
10590     IF p_mast_cont_info_tab.exists(l_group_id_cnt) THEN
10591       line_cont_rec.preferred_container := nvl(p_mast_cont_info_tab(l_group_id_cnt).container_item_id,l_detail_container_item_id);
10592     ELSE
10593       line_cont_rec.preferred_container := l_detail_container_item_id;
10594     END IF;
10595     line_cont_rec.max_load_qty := NULL;
10596 
10597     IF (line_cont_rec.preferred_container IS NULL) THEN
10598       Calc_Pref_Container(
10599         p_organization_id   => line_cont_rec.organization_id,
10600         p_inventory_item_id => line_cont_rec.inventory_item_id,
10601         p_fill_pc_basis     => line_cont_rec.fill_pc_basis,
10602         x_return_status     => l_return_status,
10603         x_error_cnt         => l_error_cnt,
10604         x_cont_item_id      => l_wcl_cont_item_id,
10605         x_max_load_qty      => l_max_load_qty);
10606     IF l_debug_on THEN
10607       WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10608     END IF;
10609       IF (l_return_status = C_ERROR_STATUS) THEN
10610         error_cnt := error_cnt + l_error_cnt;
10611       END IF;
10612 
10613       line_cont_rec.preferred_container := l_wcl_cont_item_id;
10614       line_cont_rec.max_load_qty        := l_max_load_qty;
10615     END IF;
10616 
10617     -- bug 3440811
10618     validate_container(
10619       p_organization_id  => line_cont_rec.organization_id,
10620       p_cont_item_id     => line_cont_rec.preferred_container,
10621       x_return_status    => l_return_status);
10622 
10623     IF (l_return_status IN (C_UNEXP_ERROR_STATUS,C_ERROR_STATUS)) THEN
10624         line_cont_rec.preferred_container := null;
10625         line_cont_rec.max_load_qty := null;
10626         l_error_cnt := l_error_cnt + 1;
10627         error_cnt := error_cnt + l_error_cnt;
10628     END IF;
10629     -- bug 3440811
10630 
10631     IF (line_cont_rec.preferred_container is NULL) THEN
10632       --dbms_output.put_line('Skipping cont');
10633       goto next_cont;
10634     END IF;
10635 
10636     -- 10.50 Calculate Max Load/Converted wt/Converted Vol depending on fill basis
10637     line_cont_rec.converted_wt := NULL;
10638     line_cont_rec.converted_vol := NULL;
10639 
10640     IF (line_cont_rec.fill_pc_basis = 'Q') THEN
10641       IF (line_cont_rec.max_load_qty IS NULL) THEN
10642         OPEN Get_Cont_Item_Load (line_cont_rec.inventory_item_id,line_cont_rec.preferred_container, line_cont_rec.organization_id);
10643 
10644         FETCH Get_Cont_Item_Load
10645         INTO  l_max_load_qty;
10646 
10647         IF Get_Cont_Item_Load%NOTFOUND THEN
10648           --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);
10649           CLOSE Get_Cont_Item_Load;
10650 
10651           -- Calculate max load qty depending on Weight/Volume
10652           IF (line_cont_rec.gross_weight IS NULL OR line_cont_rec.volume IS NULL) THEN
10653             --
10654             IF l_debug_on THEN
10655                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
10656             END IF;
10657             --
10658 -- J: W/V Changes
10659             WSH_WV_UTILS.Container_Weight_Volume(
10660                  p_container_instance_id => line_cont_rec.delivery_detail_id,
10661                  p_override_flag      => 'Y',
10662                  p_post_process_flag  => 'Y',
10663                  p_calc_wv_if_frozen  => 'N',
10664                  x_gross_weight       => l_dd_gross_wt,
10665                  x_net_weight         => l_dd_net_wt,
10666                  x_volume             => l_dd_volume ,
10667                  p_fill_pc_flag       => 'N',
10668                  x_cont_fill_pc       => l_cont_fill_pc,
10669                  x_return_status      => l_return_status);
10670 
10671             IF l_debug_on THEN
10672               WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10673             END IF;
10674             IF (l_return_status <> C_SUCCESS_STATUS) THEN
10675               --dbms_output.put_line('WSH_TPA_CONTAINER_PKG.Container_Weight_Volume did not return success');
10676               --
10677               IF l_debug_on THEN
10678                   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
10679               END IF;
10680               --
10681               l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(line_cont_rec.delivery_detail_id);
10682               FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
10683               FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
10684               IF l_return_status = C_WARNING_STATUS THEN
10685                 warn_cnt := warn_cnt + 1;
10686               ELSE
10687                 error_cnt := error_cnt + 1;
10688               END IF;
10689               --dbms_output.put_line('Skipping this cont');
10690               goto next_cont;
10691             END IF;
10692 
10696             IF ((NVL(line_cont_rec.gross_weight,0) = 0) OR
10693             line_cont_rec.gross_weight := NVL(line_cont_rec.gross_weight,l_dd_gross_wt);
10694             line_cont_rec.volume     := NVL(line_cont_rec.volume,l_dd_volume);
10695 
10697                 (NVL(line_cont_rec.volume,0) = 0)) THEN
10698               --dbms_output.put_line('Weight or Volume is NULL or 0');
10699               FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
10700               WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10701               error_cnt := error_cnt + 1;
10702               --dbms_output.put_line('Skipping this cont');
10703               goto next_cont;
10704             END IF;
10705           END IF;
10706 
10707 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 2');
10708           Get_Cont_Load_Vol_info(
10709              p_container_item_id => line_cont_rec.preferred_container,
10710              p_organization_id   => line_cont_rec.organization_id,
10711              p_w_v_both          => 'B',
10712              x_max_load          => l_mtl_max_load,
10713              x_max_vol           => l_mtl_max_vol,
10714              x_wt_uom            => l_mtl_wt_uom,
10715              x_vol_uom           => l_mtl_vol_uom,
10716              x_return_status     => l_return_status,
10717              x_error_cnt         => l_error_cnt);
10718             IF l_debug_on THEN
10719               WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10720             END IF;
10721           IF (l_return_status = C_ERROR_STATUS) THEN
10722             error_cnt := error_cnt + l_error_cnt;
10723           END IF;
10724 
10725           IF ((NVL(l_mtl_max_load,0) <= 0) OR (NVL(l_mtl_max_vol,0) <= 0)) THEN
10726             --dbms_output.put_line('Skipping this Cont');
10727             goto next_cont;
10728           END IF;
10729 
10730           IF (l_mtl_wt_uom <> line_cont_rec.weight_uom) THEN
10731             --
10732             IF l_debug_on THEN
10733                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
10734             END IF;
10735             --
10736             l_dd_gross_wt := WSH_WV_UTILS.Convert_Uom (
10737                                   from_uom => line_cont_rec.weight_uom,
10738                                   to_uom   => l_mtl_wt_uom,
10739                                   quantity => line_cont_rec.gross_weight,
10740                                   item_id  => line_cont_rec.inventory_item_id);
10741           ELSE
10742             l_dd_gross_wt := line_cont_rec.gross_weight;
10743           END IF;
10744 
10745           IF (l_mtl_vol_uom <> line_cont_rec.volume_uom) THEN
10746             --
10747             IF l_debug_on THEN
10748                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
10749             END IF;
10750             --
10751             l_dd_volume :=  WSH_WV_UTILS.Convert_Uom (
10752                                   from_uom => line_cont_rec.volume_uom,
10753                                   to_uom   => l_mtl_vol_uom,
10754                                   quantity => line_cont_rec.volume,
10755                                   item_id  => line_cont_rec.inventory_item_id);
10756           ELSE
10757             l_dd_volume:= line_cont_rec.volume;
10758           END IF;
10759 
10760           IF ((l_mtl_max_load/l_dd_gross_wt) >= (l_mtl_max_vol/l_dd_volume)) THEN
10761             l_max_load_qty := l_mtl_max_load/l_dd_gross_wt;
10762           ELSE
10763             l_max_load_qty := l_mtl_max_vol/l_dd_volume;
10764           END IF;
10765           --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);
10766 
10767           -- Containers cannot be split. So take FLOOR of l_max_load_qty
10768           l_max_load_qty := FLOOR(l_max_load_qty);
10769 
10770         ELSE -- Get_Cont_Item_Load%NOTFOUND
10771           CLOSE Get_Cont_Item_Load;
10772         END IF;
10773         line_cont_rec.max_load_qty := l_max_load_qty;
10774 
10775         IF (NVL(line_cont_rec.max_load_qty,0) <= 0) THEN
10776           --dbms_output.put_line('Max Load Qty is null or <= 0. Skipping this container');
10777           FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
10778           WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10779           error_cnt := error_cnt + 1;
10780           goto next_cont;
10781         END IF;
10782 
10783       END IF; -- line_cont_rec.max_load_qty IS NULL
10784       --dbms_output.put_line('line_cont_rec.max_load_qty '||line_cont_rec.max_load_qty);
10785     ELSIF (line_cont_rec.fill_pc_basis in ('W','V')) THEN
10786       -- Calculate max load qty depending on Weight
10787       IF ((line_cont_rec.gross_weight IS NULL AND line_cont_rec.fill_pc_basis = 'W') OR
10788           (line_cont_rec.volume IS NULL AND line_cont_rec.fill_pc_basis = 'V')) THEN
10789         --
10790         IF l_debug_on THEN
10791             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
10792         END IF;
10793         --
10794 -- J: W/V Changes
10795         WSH_WV_UTILS.Container_Weight_Volume(
10796              p_container_instance_id => line_cont_rec.delivery_detail_id,
10797              p_override_flag      => 'Y',
10798              p_post_process_flag  => 'Y',
10799              p_calc_wv_if_frozen  => 'N',
10803              p_fill_pc_flag       => 'N',
10800              x_gross_weight       => l_dd_gross_wt,
10801              x_net_weight         => l_dd_net_wt,
10802              x_volume             => l_dd_volume ,
10804              x_cont_fill_pc       => l_cont_fill_pc,
10805              x_return_status      => l_return_status);
10806 
10807         IF l_debug_on THEN
10808           WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10809         END IF;
10810         IF (l_return_status <> C_SUCCESS_STATUS) THEN
10811           --dbms_output.put_line('WSH_TPA_CONTAINER_PKG.Container_Weight_Volume did not return success');
10812           --
10813           IF l_debug_on THEN
10814               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
10815           END IF;
10816           --
10817           l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(line_cont_rec.delivery_detail_id);
10818           FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
10819           FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
10820           IF l_return_status = C_WARNING_STATUS THEN
10821             warn_cnt := warn_cnt + 1;
10822           ELSE
10823             error_cnt := error_cnt + 1;
10824           END IF;
10825           error_cnt := error_cnt + 1;
10826           --dbms_output.put_line('Skipping this cont');
10827           goto next_cont;
10828         END IF;
10829 
10830         IF (line_cont_rec.fill_pc_basis = 'W') THEN
10831           line_cont_rec.gross_weight := NVL(line_cont_rec.gross_weight,l_dd_gross_wt);
10832 
10833           IF (NVL(line_cont_rec.gross_weight,0) = 0) THEN
10834             --dbms_output.put_line('Weight is NULL or 0');
10835                 --BUG 3577115
10836 		   --FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
10837 		    l_item_name := WSH_UTIL_CORE.Get_Item_Name(line_cont_rec.inventory_item_id, line_cont_rec.organization_id);
10838 		    FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NULL_WEIGHT_VOLUME');
10839 		    FND_MESSAGE.SET_TOKEN('CONT_NAME',l_item_name);
10840 		--BUG 3577115
10841             WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10842             error_cnt := error_cnt + 1;
10843             --dbms_output.put_line('Skipping this Cont');
10844             goto next_cont;
10845           END IF;
10846         ELSE
10847           line_cont_rec.volume := NVL(line_cont_rec.volume,l_dd_volume);
10848 
10849           IF (NVL(line_cont_rec.volume,0) = 0) THEN
10850             --dbms_output.put_line('Volume is NULL or 0');
10851                --BUG 3577115
10852 		   --FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_VOL_ERROR');
10853 		    l_item_name := WSH_UTIL_CORE.Get_Item_Name(line_cont_rec.inventory_item_id, line_cont_rec.organization_id);
10854 		    FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NULL_WEIGHT_VOLUME');
10855 		    FND_MESSAGE.SET_TOKEN('CONT_NAME',l_item_name);
10856 		--BUG 3577115
10857              WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10858              error_cnt := error_cnt + 1;
10859             --dbms_output.put_line('Skipping this Cont');
10860             goto next_cont;
10861           END IF;
10862         END IF;
10863       END IF;
10864 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 1');
10865       Get_Cont_Load_Vol_info(
10866          p_container_item_id => line_cont_rec.preferred_container,
10867          p_organization_id   => line_cont_rec.organization_id,
10868          p_w_v_both          => line_cont_rec.fill_pc_basis,
10869          x_max_load          => l_mtl_max_load,
10870          x_max_vol           => l_mtl_max_vol,
10871          x_wt_uom            => l_mtl_wt_uom,
10872          x_vol_uom           => l_mtl_vol_uom,
10873          x_return_status     => l_return_status,
10874          x_error_cnt         => l_error_cnt);
10875       IF l_debug_on THEN
10876         WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10877       END IF;
10878       IF (l_return_status = C_ERROR_STATUS) THEN
10879         error_cnt := error_cnt + l_error_cnt;
10880       END IF;
10881 
10882       IF (line_cont_rec.fill_pc_basis = 'W') THEN
10883         IF (NVL(l_mtl_max_load,0) <= 0) THEN
10884           --dbms_output.put_line('Skipping this Cont');
10885           goto next_cont;
10886          END IF;
10887 
10888         line_cont_rec.cont_wt := l_mtl_max_load;
10889 
10890         IF (l_mtl_wt_uom <> line_cont_rec.weight_uom) THEN
10891           --
10892           IF l_debug_on THEN
10893               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
10894           END IF;
10895           --
10896           l_dd_net_wt :=  WSH_WV_UTILS.Convert_Uom (
10897                                 from_uom => line_cont_rec.weight_uom,
10898                                 to_uom   => l_mtl_wt_uom,
10899                                 quantity => line_cont_rec.gross_weight,
10900                                 item_id  => line_cont_rec.inventory_item_id);
10901         ELSE
10902           l_dd_net_wt := line_cont_rec.gross_weight;
10903         END IF;
10904 
10905 
10906         line_cont_rec.converted_wt := l_dd_net_wt;
10907         --dbms_output.put_line('line_cont_rec.converted_wt '||line_cont_rec.converted_wt);
10908       ELSE
10909         IF (NVL(l_mtl_max_vol,0) <= 0) THEN
10910           --dbms_output.put_line('Skipping this Cont');
10911           goto next_cont;
10912          END IF;
10913 
10917           --
10914         line_cont_rec.cont_vol := l_mtl_max_vol;
10915 
10916         IF (l_mtl_vol_uom <> line_cont_rec.volume_uom) THEN
10918           IF l_debug_on THEN
10919               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
10920           END IF;
10921           --
10922           l_dd_volume :=  WSH_WV_UTILS.Convert_Uom (
10923                                 from_uom => line_cont_rec.volume_uom,
10924                                 to_uom   => l_mtl_vol_uom,
10925                                 quantity => line_cont_rec.volume,
10926                                 item_id  => line_cont_rec.inventory_item_id);
10927         ELSE
10928           l_dd_volume := line_cont_rec.volume;
10929         END IF;
10930         line_cont_rec.converted_vol := l_dd_volume;
10931         --dbms_output.put_line('line_cont_rec.converted_vol '||line_cont_rec.converted_vol);
10932       END IF;
10933 
10934       -- Check if the Master container can hold atleast 1 piece of the Detail Container
10935       IF  ((line_cont_rec.fill_pc_basis = 'W' AND (line_cont_rec.converted_wt > l_mtl_max_load)) OR
10936            (line_cont_rec.fill_pc_basis = 'V' AND (line_cont_rec.converted_vol > l_mtl_max_vol))) THEN
10937         --dbms_output.put_line('Indivisible flag is Y and Preferred Mast Cont cannot hold atleast 1 piece');
10938 	-- Bug#: 2503937 - New Error Message
10939         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_VOL_ERROR');
10940         WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10941         error_cnt := error_cnt + 1;
10942         --dbms_output.put_line('Skipping this Cont');
10943         goto next_cont;
10944       END IF;
10945     END IF;
10946 
10947     -- 10.60 Populate line_cont_tab PL/SQL table now
10948     line_cont_rec.group_id  := l_group_id;
10949     line_cont_rec.shp_qty   := 1;
10950     line_cont_rec.req_qty   := 1;
10951 
10952     l_dd_count := l_dd_count + 1;
10953     line_cont_tab(l_dd_count) := line_cont_rec;
10954 
10955     <<next_cont>>
10956       l_group_id_cnt := l_group_id_cnt + 1;
10957 
10958   END LOOP;
10959 
10960   x_error_cnt     := error_cnt;
10961   x_warn_cnt      := warn_cnt;
10962   x_line_cont_tab := line_cont_tab;
10963   x_fill_pc_warn_cnt := fill_pc_warn_cnt; -- bug 3562797 jckwok
10964 
10965   IF l_debug_on THEN
10966     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);
10967     WSH_DEBUG_SV.log(l_module_name,'Error Count '|| error_cnt||' Warning Count '|| warn_cnt);
10968     WSH_DEBUG_SV.pop(l_module_name);
10969   END IF;
10970 
10971   RETURN;
10972 
10973 EXCEPTION
10974   WHEN Others THEN
10975     IF (Get_dd_Detail%ISOPEN) THEN
10976       CLOSE Get_dd_Detail;
10977     END IF;
10978     IF (Get_Cont_Item_Load%ISOPEN) THEN
10979       CLOSE Get_Cont_Item_Load;
10980     END IF;
10981     WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Validate_Container_For_Pack',l_module_name);
10982     --
10983     IF l_debug_on THEN
10984         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
10985         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
10986     END IF;
10987     --
10988     raise;
10989 
10990 END Validate_Container_For_Pack;
10991 
10992 
10993 /*
10994 -----------------------------------------------------------------------------
10995    PROCEDURE  : Auto_Pack_Conts
10996    PARAMETERS : p_group_id_tab_id - table of group ids for containers that need
10997 		to be autopacked.
10998   		p_det_cont_info - table of detail containers created during the
10999 		autopack process consisting of container instances, master
11000 		container item ids and percentage empty.
11001 		p_cont_detail_tab - table of container delivery detail ids that
11002 		were created during the autopacking of lines.
11003 		x_cont_instance_id - table of container instance ids that were
11004 			created during the autopacking.
11005 		x_return_status - return status of API.
11006   DESCRIPTION : This procedure takes the number of containers and groups them
11007 		by common grouping attributes - similar to grouping attributes
11008 		of delivery.  If a group id table is specified it uses the
11009 		group ids in the table to decided which container can be
11010 		grouped	into the same parent container. If a group id table is
11011 		not specified, it creates the group id table before autopacking
11012 		It creates the required number and type of parent containers
11013 		per detail container and keeps track of all partially filled
11014 		containers in the empty containers table. Before creating new
11015 		container instances, it	searches for available space using the
11016 		empty container table and after filling up a container, it
11017 		creates a new one if there are no empty containers of the same
11018 		type. The difference between this API and the autopack lines is
11019 		that this API does not split containers if they don't fit
11020 		entirely into a parent container.
11021 ------------------------------------------------------------------------------
11022 */
11023 
11024 PROCEDURE Auto_Pack_Conts (
11025   p_group_id_tab      IN     WSH_UTIL_CORE.id_tab_type,
11026   p_cont_info_tab     IN     wsh_container_actions.empty_cont_info_tab,
11027   p_cont_detail_tab   IN     WSH_UTIL_CORE.id_tab_type,
11028   x_cont_instance_tab IN OUT NOCOPY  WSH_UTIL_CORE.id_tab_type,
11032   line_cont_tab wsh_container_actions.cont_info_tab;
11029   x_return_status OUT NOCOPY  VARCHAR2) IS
11030 
11031   line_cont_rec wsh_container_actions.cont_info;
11033 
11034   l_group_id_temp_tab         WSH_UTIL_CORE.id_tab_type;
11035   l_group_id_tab         WSH_UTIL_CORE.id_tab_type;
11036   l_del_row_tab          WSH_UTIL_CORE.id_tab_type;
11037   l_return_status        VARCHAR2(1);
11038   l_cont_instance_id     NUMBER;
11039   l_row_id               VARCHAR2(30);
11040   l_gross_weight         NUMBER;
11041   l_net_weight           NUMBER;
11042   l_volume               NUMBER;
11043   l_err_cont_name        VARCHAR2(30);
11044   l_cont_instance_cnt    NUMBER;
11045   l_last_organization_id NUMBER;
11046   l_cont_fill_pc         NUMBER;
11047   l_cont_name            VARCHAR2(30);
11048 
11049 
11050   l_attr_tab  wsh_delivery_autocreate.grp_attr_tab_type;
11051   l_group_tab  wsh_delivery_autocreate.grp_attr_tab_type;
11052   l_action_rec wsh_delivery_autocreate.action_rec_type;
11053   l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
11054   l_matched_entities wsh_util_core.id_tab_type;
11055   l_out_rec wsh_delivery_autocreate.out_rec_type;
11056 
11057 
11058   i   NUMBER;
11059   cnt NUMBER;
11060 
11061   error_cnt NUMBER := 0;
11062   succ_cnt  NUMBER  := 0;
11063   warn_cnt  NUMBER  := 0;
11064   cont_warn NUMBER := 0;
11065 
11066   l_fill_pc_warn_count NUMBER := 0; -- bug 3562797 jckwok
11067 
11068   CURSOR c_get_detail(p_del_det_id NUMBER) IS
11069   SELECT nvl(ignore_for_planning, 'N') ignore_for_planning,
11070          organization_id,                        -- K LPN CON. rv
11071          nvl(line_direction,'O') line_direction  -- K LPN CONV. rv
11072   FROM wsh_delivery_details
11073   WHERE delivery_detail_id=p_del_det_id;
11074 
11075 -- K LPN CONV. rv
11076 l_wms_org    VARCHAR2(10) := 'N';
11077 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
11078 l_cont_tab wsh_util_core.id_tab_type;
11079 l_lpn_unit_weight NUMBER;
11080 l_lpn_unit_volume NUMBER;
11081 l_lpn_weight_uom_code VARCHAR2(100);
11082 l_lpn_volume_uom_code VARCHAR2(100);
11083 l_cnt_orgn_id NUMBER;
11084 l_cnt_line_dir VARCHAR2(10);
11085 l_cnt_ignore_plan_flag VARCHAR2(10);
11086 -- K LPN CONV. rv
11087 --
11088 l_debug_on BOOLEAN;
11089 --
11090 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'AUTO_PACK_CONTS';
11091 --
11092 BEGIN
11093 
11094   --dbms_output.put_line('==================================================');
11095   --dbms_output.put_line('Start of WSH_CONTAINER_ACTIONS.Auto_Pack_Conts...');
11096   --dbms_output.put_line('==================================================');
11097 
11098   -- Delete all Global PL/SQL tables to start with
11099   --
11100   --
11101   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
11102   --
11103   IF l_debug_on IS NULL
11104   THEN
11105       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
11106   END IF;
11107   --
11108   IF l_debug_on THEN
11109       WSH_DEBUG_SV.push(l_module_name);
11110   END IF;
11111   --
11112   g_empty_cont_tab.DELETE;
11113   g_assign_detail_tab.DELETE;
11114   g_new_container_tab.DELETE;
11115   g_cache_organization_info_tab.DELETE;
11116   g_cont_msi_tab.DELETE;
11117   g_new_cont_index := 0;
11118   g_assign_detail_index := 0;
11119 
11120   -- 10. Check if Count of p_del_detail_tab table is 0
11121   --IF (p_cont_detail_tab.COUNT = 0 OR p_cont_info_tab.COUNT = 0) THEN
11122   IF (p_cont_detail_tab.COUNT = 0) THEN
11123     --dbms_output.put_line('p_cont_detail_tab count is 0');
11124     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CONT_ASSG_NULL');
11125     x_return_status := C_ERROR_STATUS;
11126     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11127     --
11128     IF l_debug_on THEN
11129         WSH_DEBUG_SV.pop(l_module_name);
11130     END IF;
11131     --
11132     return;
11133   END IF;
11134 
11135   -- 20. Generate Grouping Ids
11136   IF p_group_id_tab.COUNT = 0 THEN
11137 
11138     -- call autocreate delivery API with a check flag set to 'Y' and
11139     -- container flag set to 'Y' to fetch group id table for delivery lines
11140 
11141     --dbms_output.put_line('Calling WSH_DELIVERY_AUTOCREATE.autocreate_deliveries to generate group_ids');
11142     --
11143     IF l_debug_on THEN
11144         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
11145     END IF;
11146     --
11147    l_attr_tab.delete;
11148    FOR i in 1..p_cont_detail_tab.count LOOP
11149 
11150        l_attr_tab(i).entity_id := p_cont_detail_tab(i);
11151        l_attr_tab(i).entity_type := 'DELIVERY_DETAIL';
11152 
11153    END LOOP;
11154 
11155    l_action_rec.action := 'MATCH_GROUPS';
11156 
11157 
11158 
11159    WSH_Delivery_AutoCreate.Find_Matching_Groups(p_attr_tab => l_attr_tab,
11160                                                    p_action_rec => l_action_rec,
11161                                                    p_target_rec => l_target_rec,
11162                                                    p_group_tab => l_group_tab,
11163                                                    x_matched_entities => l_matched_entities,
11164                                                    x_out_rec => l_out_rec,
11165                                                    x_return_status => l_return_status);
11166 
11167 
11168 
11169       IF l_debug_on THEN
11173        (l_return_status = C_UNEXP_ERROR_STATUS) THEN
11170           WSH_DEBUG_SV.log(l_module_name,'return status', l_return_status);
11171       END IF;
11172     IF (l_return_status = C_ERROR_STATUS) OR
11174       --dbms_output.put_line('WSH_DELIVERY_AUTOCREATE.autocreate_deliveries returned '||l_return_status);
11175       FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
11176       WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
11177       x_return_status := l_return_status;
11178       --
11179       IF l_debug_on THEN
11180           WSH_DEBUG_SV.pop(l_module_name);
11181       END IF;
11182       --
11183       return;
11184     END IF;
11185     FOR i in 1..l_attr_tab.COUNT LOOP
11186         l_group_id_tab(l_attr_tab(i).entity_id) := l_attr_tab(i).group_id;
11187     END LOOP;
11188   ELSE
11189     cnt := p_group_id_tab.FIRST;
11190     IF ((cnt IS NULL) OR (p_group_id_tab.COUNT <> p_cont_detail_tab.count)) THEN
11191         x_return_status := C_ERROR_STATUS;
11192         FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
11193         WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11194         --
11195         IF l_debug_on THEN
11196             WSH_DEBUG_SV.pop(l_module_name);
11197         END IF;
11198         --
11199         return;
11200     ELSE
11201         FOR i in 1..l_group_id_tab.COUNT LOOP
11202           l_group_id_tab(p_cont_detail_tab(i)) := p_group_id_tab(i);
11203         END LOOP;
11204     END IF;
11205   END IF;
11206 
11207   --dbms_output.put_line('Checking group_ids is over');
11208 
11209   -- 40. Call Validate_Container_For_Pack to validate detail info in p_cont_detail_tab
11210   -- Bug 3570364 : Passing the parameter p_cont_info_tab which contains the
11211   --               master container item id's for all LPN's( For Auto_pack Master Action on Lines).
11212   Validate_Container_For_Pack(
11213     p_group_id_tab    => l_group_id_tab,
11214     p_cont_info_tab   => p_cont_detail_tab,
11215     p_mast_cont_info_tab => p_cont_info_tab,
11216     x_line_cont_tab   => line_cont_tab,
11217     x_error_cnt       => error_cnt,
11218     x_warn_cnt        => warn_cnt,
11219     x_fill_pc_warn_cnt => l_fill_pc_warn_count -- bug 3562797 jckwok
11220   );
11221 
11222       IF l_debug_on THEN
11223           WSH_DEBUG_SV.log(l_module_name,'after validate container for pack-error,warning', error_cnt||','||warn_cnt);
11224       END IF;
11225   --
11226   -- bug 3562797 jckwok
11227   -- Raise Error if all containers have 'Shipping Parameter' percent fill basis as None
11228   -- Raise warning if found some of the containers with 'Shipping Parameter'
11229   -- percent fill basis as None.
11230   --
11231   IF (l_fill_pc_warn_count = p_cont_detail_tab.count) THEN
11232     x_return_status := C_ERROR_STATUS;
11233     FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
11234     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11235     IF l_debug_on THEN
11236       WSH_DEBUG_SV.pop(l_module_name);
11237     END IF;
11238     RETURN;
11239   ELSIF (l_fill_pc_warn_count > 0) THEN
11240     IF (l_return_status <> C_ERROR_STATUS) THEN
11241       x_return_status := C_WARNING_STATUS;
11242       warn_cnt := warn_cnt + 1;
11243       FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
11244       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11245     END IF;
11246   END IF;
11247   -- end of bug 3562797 jckwok
11248 
11249   IF (line_cont_tab.COUNT > 0) THEN
11250     -- 50. Loop through all Containers that need to be Auto-Packed
11251     cnt := 1;
11252     succ_cnt := 0;
11253     l_last_organization_id := NULL;
11254     WHILE (cnt <= line_cont_tab.COUNT) LOOP
11255 
11256       --dbms_output.put_line('======================================================');
11257       IF l_debug_on THEN
11258           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);
11259       END IF;
11260 
11261       IF (l_last_organization_id is NULL) THEN
11262         l_last_organization_id := line_cont_tab(cnt).organization_id;
11263       ELSIF (l_last_organization_id <> line_cont_tab(cnt).organization_id) THEN
11264         l_last_organization_id := line_cont_tab(cnt).organization_id;
11265 
11266         -- Delete the empty PL/SQL cont table if organization_id changes
11267         g_empty_cont_tab.DELETE;
11268       END IF;
11269 
11270       Pack_Container(
11271          p_line_cont_rec => line_cont_tab(cnt),
11272          x_return_status => l_return_status);
11273 
11274       IF l_return_status = C_ERROR_STATUS THEN
11275         error_cnt := error_cnt + 1;
11276       ELSE
11277         succ_cnt := succ_cnt + 1;
11278       END IF;
11279       cnt := cnt + 1;
11280 
11281     END LOOP;
11282 
11283     -- 60.1 Create Containers from g_new_container_tab PL/SQL table
11284     --dbms_output.put_line('*** Creating Actual Containers ***');
11285     cnt := 1;
11286     l_cont_instance_cnt := 1;
11287     WHILE (cnt <= g_new_container_tab.COUNT) LOOP
11288       l_cont_name := null;
11289 
11290       --
11291       -- K LPN CONV. rv
11292       IF l_debug_on THEN
11293           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CREATE_CONT_INSTANCE_MULTI',WSH_DEBUG_SV.C_PROC_LEVEL);
11294       END IF;
11295       --
11296       WSH_CONTAINER_ACTIONS.Create_Cont_Instance_Multi(
11297         x_cont_name           => l_cont_name,
11301         p_organization_id     => g_new_container_tab(cnt).organization_id,
11298         p_cont_item_id        => g_new_container_tab(cnt).container_item_id,
11299         x_cont_instance_id    => l_cont_instance_id,
11300         p_par_detail_id       => NULL,
11302         p_container_type_code => NULL,
11303         p_num_of_containers   => 1,
11304         x_row_id              => l_row_id,
11305         x_return_status       => l_return_status,
11306         x_cont_tab            => l_cont_tab,
11307         x_unit_weight         => l_lpn_unit_weight,
11308         x_unit_volume         => l_lpn_unit_volume,
11309         x_weight_uom_code     => l_lpn_weight_uom_code,
11310         x_volume_uom_code     => l_lpn_volume_uom_code,
11311         p_lpn_id              => NULL,
11312         p_ignore_for_planning => NULL,
11313         p_caller              => 'WSH_AUTO_PACK_CONTS');
11314       IF l_debug_on THEN
11315           WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
11316           WSH_DEBUG_SV.log(l_module_name,'count of l_cont_tab',l_cont_tab.count);
11317       END IF;
11318       -- K LPN CONV. rv
11319 
11320       IF l_return_status <> C_SUCCESS_STATUS THEN
11321         --dbms_output.put_line('Container Creation failed for index '|| cnt);
11322         FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
11323         WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
11324         error_cnt := error_cnt + 1;
11325       ELSE
11326         l_cont_instance_id := l_cont_tab(1);
11327         g_new_container_tab(cnt).cont_instance_id := l_cont_instance_id;
11328         x_cont_instance_tab(l_cont_instance_cnt) := l_cont_instance_id;
11329         l_cont_instance_cnt := l_cont_instance_cnt + 1;
11330         --dbms_output.put_line('Container dd id '||l_cont_instance_id||' for index '|| cnt);
11331       END IF;
11332       cnt := cnt + 1;
11333     END LOOP;
11334 
11335 
11336     -- 70.1 Assign Details to Actual Containers created
11337     --dbms_output.put_line('*** Assigning Containers to Containers Created ***');
11338     cnt := 1;
11339     WHILE (cnt <= g_assign_detail_tab.COUNT) LOOP
11340       l_cont_instance_id := g_new_container_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id;
11341       IF l_debug_on THEN
11342           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);
11343       END IF;
11344 
11345        --
11346        -- K LPN CONV. rv
11347        IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
11348        --{
11349            open  c_get_detail(l_cont_instance_id);
11350            fetch c_get_detail into l_cnt_ignore_plan_flag, l_cnt_orgn_id, l_cnt_line_dir;
11351            close c_get_detail;
11352 
11353            l_wms_org := wsh_util_validate.check_wms_org(l_cnt_orgn_id);
11354        --}
11355        END IF;
11356        -- K LPN CONV. rv
11357        --
11358        -- J TP Release
11359        --update the container's ignore value with the first line's ignore
11360        --since grouping will have already sorted out lines with diff ignore, this shud be okay
11361        FOR cur IN c_get_detail(g_assign_detail_tab(cnt).delivery_detail_id) LOOP
11362           IF l_debug_on THEN
11363              WSH_DEBUG_SV.log(l_module_name,'ignore_for_planning',cur.ignore_for_planning);
11364           END IF;
11365           --
11366           -- K LPN CONV. rv
11367           IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
11368           AND l_cnt_line_dir IN ('O','IO')
11369           AND
11370           (
11371             (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
11372             OR
11373             (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
11374           )
11375           THEN
11376           --{
11377               l_sync_tmp_rec.delivery_detail_id := l_cont_instance_id;
11378               l_sync_tmp_rec.operation_type := 'UPDATE';
11379               WSH_WMS_SYNC_TMP_PKG.MERGE
11380               (
11381                 p_sync_tmp_rec      => l_sync_tmp_rec,
11382                 x_return_status     => l_return_status
11383               );
11384 
11385               IF l_debug_on THEN
11386                 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
11387               END IF;
11388               --
11389               IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11390                 --
11391                 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11392                   warn_cnt := warn_cnt + 1;
11393                 ELSE
11394                   --
11395                   error_cnt := error_cnt + 1;
11396                   IF l_debug_on THEN
11397                     WSH_DEBUG_SV.logmsg(l_module_name,'WSH_WMS_SYNC_TMP_PKG.MERGE completed with an error');
11398                   END IF;
11399                   --
11400                 END IF;
11401                 --
11402               END IF;
11403           --}
11404           END IF;
11405           -- K LPN CONV. rv
11406           UPDATE wsh_delivery_details
11407           SET ignore_for_planning=cur.ignore_for_planning
11408           WHERE delivery_detail_id=l_cont_instance_id;
11409 
11410           IF SQL%NOTFOUND THEN
11411              FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
11412              IF l_debug_on THEN
11416 	    FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
11413 	        WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
11414              END IF;
11415             l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_instance_id);
11417 	    x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11418 	    WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11419             IF l_debug_on THEN
11420 	       WSH_DEBUG_SV.pop(l_module_name);
11421 	    END IF;
11422             return;
11423           END IF;
11424        END LOOP;
11425 
11426       IF (l_cont_instance_id is NOT NULL) THEN
11427         --
11428         IF l_debug_on THEN
11429             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_TO_CONTAINER',WSH_DEBUG_SV.C_PROC_LEVEL);
11430         END IF;
11431         --
11432         wsh_container_actions.Assign_To_Container (
11433               p_det_cont_inst_id => g_assign_detail_tab(cnt).delivery_detail_id,
11434               p_par_cont_inst_id => l_cont_instance_id,
11435               x_return_status    => l_return_status);
11436       IF l_debug_on THEN
11437           WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
11438       END IF;
11439 
11440         --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Assign_To_Container returned '||l_return_status);
11441         IF l_return_status = C_ERROR_STATUS THEN
11442            error_cnt := error_cnt + 1;
11443         ELSIF l_return_status = C_WARNING_STATUS THEN
11444            warn_cnt := warn_cnt + 1;
11445         ELSE
11446            NULL;
11447            --dbms_output.put_line('Assigned dd '||g_assign_detail_tab(cnt).delivery_detail_id||' to Cont '||l_cont_instance_id);
11448         END IF;
11449       END IF;
11450 
11451       cnt := cnt + 1;
11452     END LOOP;
11453 
11454   END IF; -- line_cont_tab.COUNT > 0
11455 
11456         IF l_debug_on THEN
11457           WSH_DEBUG_SV.log(l_module_name,'error cnt is ' || error_cnt || ' warn cnt is ' || warn_cnt|| ' succ cnt is ' || succ_cnt);
11458         END IF;
11459 
11460   -- 90.1 Summarize errors/warnings
11461   IF (error_cnt > 0) THEN
11462     FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CONT_PACK_ERROR');
11463     FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
11464     FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
11465     FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
11466     IF succ_cnt > 0 THEN
11467       x_return_status := C_WARNING_STATUS;
11468     ELSE
11469       x_return_status := C_ERROR_STATUS;
11470     END IF;
11471     WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11472   ELSIF (warn_cnt > 0 OR cont_warn > 0) THEN
11473     x_return_status := C_WARNING_STATUS;
11474     IF cont_warn > 0 THEN
11475       FND_MESSAGE.SET_NAME('WSH','WSH_CONT_PACK_WARN');
11476       FND_MESSAGE.SET_TOKEN('CONT_WARN',cont_warn);
11477       FND_MESSAGE.SET_TOKEN('CONT_ERR',0);
11478       WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11479     END IF;
11480   ELSE
11481     x_return_status := C_SUCCESS_STATUS;
11482   END IF;
11483 
11484   --
11485   IF l_debug_on THEN
11486       WSH_DEBUG_SV.pop(l_module_name);
11487   END IF;
11488   --
11489   RETURN;
11490 
11491 --
11492 IF l_debug_on THEN
11493     WSH_DEBUG_SV.pop(l_module_name);
11494 END IF;
11495 --
11496 EXCEPTION
11497   WHEN Others THEN
11498     WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Auto_Pack_conts',l_module_name);
11499     x_return_status := C_UNEXP_ERROR_STATUS;
11500 
11501 --
11502 IF l_debug_on THEN
11503     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11504     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11505 END IF;
11506 --
11507 END Auto_Pack_conts;
11508 
11509 /*
11510 -----------------------------------------------------------------------------
11511    PROCEDURE  : Update_Cont_Attributes
11512    PARAMETERS : p_delivery_detail_id - delivery detail id
11513 		p_delivery_id - delivery id if container assigned to delivery
11514 		p_container_instance_id - delivery detail id for the container
11515 		x_return_status - return status of API
11516   DESCRIPTION : This procedure updates the grouping attribute columns of the
11517 		container with the grouping attribute values derived from the
11518 		delivery line that is input.
11519 ------------------------------------------------------------------------------
11520 */
11521 
11522 PROCEDURE Update_Cont_Attributes (
11523  p_delivery_detail_id IN NUMBER,
11524  p_delivery_id IN NUMBER,
11525  p_container_instance_id IN NUMBER,
11526  x_return_status OUT NOCOPY  VARCHAR2) IS
11527 
11528 
11529  CURSOR Get_Detail_Attr (v_detail_id NUMBER) IS
11530  SELECT organization_id, customer_id, ship_to_location_id,
11531 	intmed_ship_to_location_id,
11532 	fob_code, freight_terms_code, ship_method_code,
11533         mode_of_transport, service_level, carrier_id,
11534 	deliver_to_location_id,
11535         NVL(line_direction,'O') line_direction,   -- J-IB-NPARIKH
11536         shipping_control,   -- J-IB-NPARIKH
11537         vendor_id,   -- J-IB-NPARIKH
11538         party_id,   -- J-IB-NPARIKH
11539         nvl(ignore_for_planning, 'N')  ignore_for_planning --J TP Release
11540  FROM WSH_DELIVERY_DETAILS
11541  WHERE delivery_detail_id = v_detail_id;
11542 
11543  CURSOR Get_Del_Attr (v_del_id NUMBER) IS
11544  SELECT organization_id, customer_id, ultimate_dropoff_location_id,
11548 	ultimate_dropoff_location_id deliver_to_location_id,
11545 	intmed_ship_to_location_id,
11546 	fob_code, freight_terms_code, ship_method_code,
11547         mode_of_transport, service_level, carrier_id,
11549         NVL(shipment_direction,'O') line_direction,   -- J-IB-NPARIKH
11550         shipping_control,   -- J-IB-NPARIKH
11551         vendor_id,   -- J-IB-NPARIKH
11552         party_id,   -- J-IB-NPARIKH
11553         nvl(ignore_for_planning,'N') ignore_for_planning --J TP Release
11554  FROM WSH_NEW_DELIVERIES
11555  WHERE delivery_id = v_del_id;
11556 
11557  l_cont_name VARCHAR2(30);
11558 
11559  l_org_id NUMBER;
11560  l_cust_id NUMBER;
11561  l_intmed_loc_id NUMBER;
11562  l_fob_code VARCHAR2(30);
11563  l_freight_terms_code VARCHAR2(30);
11564  l_ship_method_code VARCHAR2(30);
11565  l_carrier_id NUMBER;
11566  l_service_level VARCHAR2(30);
11567  l_mode_of_transport VARCHAR2(30);
11568  l_deliver_to_loc_id NUMBER;
11569  l_ship_to_loc_id NUMBER;
11570  l_line_direction VARCHAR2(30);
11571  l_shipping_control VARCHAR2(30);
11572  l_vendor_id NUMBER;
11573  l_party_id  NUMBER;
11574  l_ignore_for_planning VARCHAR2(1);
11575 
11576 -- K LPN CONV. rv
11577 l_wms_org    VARCHAR2(10) := 'N';
11578 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
11579 l_return_status VARCHAR2(1);
11580 l_num_warnings  NUMBER := 0;
11581 l_cnt_line_dir VARCHAR2(10);
11582 -- K LPN CONV. rv
11583 
11584 --
11585 l_debug_on BOOLEAN;
11586 --
11587 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_CONT_ATTRIBUTES';
11588 --
11589 BEGIN
11590 
11591  --
11592  --
11593  l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
11594  --
11595  IF l_debug_on IS NULL
11596  THEN
11597      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
11598  END IF;
11599  --
11600  IF l_debug_on THEN
11601      WSH_DEBUG_SV.push(l_module_name);
11602      --
11603      WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_DETAIL_ID',P_DELIVERY_DETAIL_ID);
11604      WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
11605      WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
11606  END IF;
11607  --
11608  IF p_delivery_detail_id IS NOT NULL THEN
11609 
11610 	 OPEN Get_Detail_Attr (p_delivery_detail_id);
11611 
11612 	 FETCH Get_Detail_Attr INTO
11613 		l_org_id,
11614 		l_cust_id,
11615 		l_ship_to_loc_id,
11616 		l_intmed_loc_id,
11617 		l_fob_code,
11618 		l_freight_terms_code,
11619 		l_ship_method_code,
11620 		l_mode_of_transport,
11621 		l_service_level,
11622 		l_carrier_id,
11623 		l_deliver_to_loc_id,
11624         l_line_direction,
11625         l_shipping_control,
11626         l_vendor_id,
11627         l_partY_id,
11628         l_ignore_for_planning
11629         ;
11630 
11631 	 IF Get_Detail_Attr%NOTFOUND THEN
11632 --dbms_output.put_line('invalid detail id ' || p_delivery_detail_id);
11633 		CLOSE Get_Detail_Attr;
11634 		FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
11635 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_detail_id);
11636 		x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11637 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11638 		--
11639 		IF l_debug_on THEN
11640 		    WSH_DEBUG_SV.pop(l_module_name);
11641 		END IF;
11642 		--
11643 		return;
11644 	 END IF;
11645 
11646 	 IF Get_Detail_Attr%ISOPEN THEN
11647 		CLOSE Get_Detail_Attr;
11648 	 END IF;
11649 
11650  ELSIF p_delivery_id IS NOT NULL THEN
11651 
11652 	 OPEN Get_Del_Attr (p_delivery_id);
11653 
11654 	 FETCH Get_Del_Attr INTO
11655 		l_org_id,
11656 		l_cust_id,
11657 		l_ship_to_loc_id,
11658 		l_intmed_loc_id,
11659 		l_fob_code,
11660 		l_freight_terms_code,
11661 		l_ship_method_code,
11662                 l_mode_of_transport,
11663                 l_service_level,
11664                 l_carrier_id,
11665 		l_deliver_to_loc_id,
11666                 l_line_direction,
11667                 l_shipping_control,
11668                 l_vendor_id,
11669                 l_partY_id,
11670                 l_ignore_for_planning
11671         ;
11672 
11673 	 IF Get_Del_Attr%NOTFOUND THEN
11674 		CLOSE Get_Del_Attr;
11675 		FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DELIVERY');
11676 		FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_id);
11677 		x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11678 		WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11679 		--
11680 		IF l_debug_on THEN
11681 		    WSH_DEBUG_SV.pop(l_module_name);
11682 		END IF;
11683 		--
11684 		return;
11685 	 END IF;
11686 
11687 	 IF Get_Del_Attr%ISOPEN THEN
11688 		CLOSE Get_Del_Attr;
11689 	 END IF;
11690 
11691  ELSE
11692 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NO_ATTR_ERROR');
11693 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11694 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11695 	--
11696 	IF l_debug_on THEN
11697 	    WSH_DEBUG_SV.pop(l_module_name);
11698 	END IF;
11699 	--
11700 	return;
11701 
11702  END IF;
11703 
11704 
11705  --dbms_output.put_line('calling update with customer id ' || l_cust_id || ' and ship to ' || l_ship_to_loc_id);
11706 
11707  -- K LPN CONV. rv
11708  IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
11712    END LOOP;
11709    FOR cnt_inst_rec in Get_Detail_Attr(p_container_instance_id) LOOP
11710      l_wms_org := wsh_util_validate.check_wms_org(cnt_inst_rec.organization_id);
11711      l_cnt_line_dir := cnt_inst_rec.line_direction;
11713  END IF;
11714  --
11715  IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
11716  AND l_cnt_line_dir IN ('O','IO')
11717  AND
11718  (
11719    (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
11720    OR
11721    (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
11722  )
11723  THEN
11724  --{
11725      l_sync_tmp_rec.delivery_detail_id := p_container_instance_id;
11726      l_sync_tmp_rec.operation_type := 'UPDATE';
11727      WSH_WMS_SYNC_TMP_PKG.MERGE
11728      (
11729        p_sync_tmp_rec      => l_sync_tmp_rec,
11730        x_return_status     => l_return_status
11731      );
11732 
11733      IF l_debug_on THEN
11734        WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
11735      END IF;
11736      --
11737      IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
11738        --
11739        x_return_status := l_return_status;
11740        --
11741        IF l_debug_on THEN
11742          WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
11743          WSH_DEBUG_SV.pop(l_module_name);
11744        END IF;
11745        --
11746        return;
11747        --
11748      ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
11749        --
11750        l_num_warnings := l_num_warnings + 1;
11751        --
11752      END IF;
11753      --
11754  --}
11755  END IF;
11756  -- K LPN CONV. rv
11757  UPDATE WSH_DELIVERY_DETAILS SET
11758 	customer_id = l_cust_id,
11759 	ship_to_location_id = l_ship_to_loc_id,
11760 	intmed_ship_to_location_id = l_intmed_loc_id,
11761 	fob_code = l_fob_code,
11762   	freight_terms_code = l_freight_terms_code,
11763 	ship_method_code = l_ship_method_code,
11764 	mode_of_transport = l_mode_of_transport,
11765 	carrier_id = l_carrier_id,
11766 	service_level = l_service_level,
11767 	deliver_to_location_id = l_deliver_to_loc_id,
11768         line_direction      = l_line_direction ,   -- J-IB-NPARIKH
11769         shipping_control    = l_shipping_control,   -- J-IB-NPARIKH
11770         --vendor_id           = l_vendor_id,   -- J-IB-NPARIKH
11771         --party_id            = l_party_id   -- J-IB-NPARIKH
11772         ignore_for_planning   = l_ignore_for_planning
11773  WHERE delivery_detail_id = p_container_instance_id;
11774 
11775  IF SQL%NOTFOUND THEN
11776 --dbms_output.put_line('could not update container ' || p_container_instance_id);
11777 	FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
11778 	--
11779 	IF l_debug_on THEN
11780 	    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
11781 	END IF;
11782 	--
11783 	l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
11784 	FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
11785 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11786 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11787 	--
11788 	IF l_debug_on THEN
11789 	    WSH_DEBUG_SV.pop(l_module_name);
11790 	END IF;
11791 	--
11792 	return;
11793  END IF;
11794 
11795  x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11796 
11797  IF l_num_warnings > 0 THEN
11798     x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
11799  END IF;
11800 
11801 
11802 --
11803 IF l_debug_on THEN
11804     WSH_DEBUG_SV.pop(l_module_name);
11805 END IF;
11806 --
11807 EXCEPTION
11808 
11809   WHEN Others THEN
11810 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_Cont_Attributes',l_module_name);
11811 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11812 
11813 --
11814 IF l_debug_on THEN
11815     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11816     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11817 END IF;
11818 --
11819 END Update_Cont_Attributes;
11820 
11821 
11822 
11823 /*
11824 -----------------------------------------------------------------------------
11825    PROCEDURE  : Check_Cont_Attributes
11826    PARAMETERS : p_container_instance_id - delivery detail id for the container
11827 		x_attr_flag - 'Y' or 'N' to determine if any of the grouping
11828 		attributes other than org id and ship from has been populated.
11829 		x_return_status - return status of API
11830   DESCRIPTION : This procedure fetched the grouping attribute columns of the
11831 		container and checks to see if the columns are null or if they
11832 		are populated. If any of the values are not null, then the API
11833 		returns a x_attr_flag of 'Y' else it returns a 'N'.
11834 ------------------------------------------------------------------------------
11835 */
11836 
11837 PROCEDURE Check_Cont_Attributes (
11838  p_container_instance_id IN NUMBER,
11839  x_attr_flag OUT NOCOPY  VARCHAR2,
11840  x_return_status OUT NOCOPY  VARCHAR2) IS
11841 
11842  CURSOR Get_Detail_Attr (v_detail_id NUMBER) IS
11843  SELECT customer_id, intmed_ship_to_location_id,
11844 	fob_code, freight_terms_code, ship_method_code,
11845         mode_of_transport, service_level, carrier_id,
11846 	deliver_to_location_id
11847  FROM WSH_DELIVERY_DETAILS
11851 
11848  WHERE delivery_detail_id = v_detail_id;
11849 
11850  l_cont_name VARCHAR2(30);
11852  l_org_id NUMBER;
11853  l_cust_id NUMBER;
11854  l_intmed_loc_id NUMBER;
11855  l_fob_code VARCHAR2(30);
11856  l_freight_terms_code VARCHAR2(30);
11857  l_ship_method_code VARCHAR2(30);
11858  l_carrier_id NUMBER;
11859  l_mode_of_transport VARCHAR2(30);
11860  l_service_level VARCHAR2(30);
11861  l_deliver_to_loc_id NUMBER;
11862 
11863  l_attr_flag VARCHAR2(1) := 'N';
11864 
11865 --
11866 l_debug_on BOOLEAN;
11867 --
11868 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CHECK_CONT_ATTRIBUTES';
11869 --
11870 BEGIN
11871 
11872 --dbms_output.put_line('in check cont attr with ' || p_container_instance_id);
11873 
11874  --
11875  --
11876  l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
11877  --
11878  IF l_debug_on IS NULL
11879  THEN
11880      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
11881  END IF;
11882  --
11883  IF l_debug_on THEN
11884      WSH_DEBUG_SV.push(l_module_name);
11885      --
11886      WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
11887  END IF;
11888  --
11889  OPEN Get_Detail_Attr (p_container_instance_id);
11890 
11891  FETCH Get_Detail_Attr INTO
11892 	l_cust_id,
11893 	l_intmed_loc_id,
11894 	l_fob_code,
11895 	l_freight_terms_code,
11896 	l_ship_method_code,
11897         l_mode_of_transport,
11898         l_service_level,
11899         l_carrier_id,
11900 	l_deliver_to_loc_id;
11901 
11902  IF Get_Detail_Attr%NOTFOUND THEN
11903 	CLOSE Get_Detail_Attr;
11904 --dbms_output.put_line('no detail found for ' || p_container_instance_id);
11905 	FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
11906 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11907 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11908  	x_attr_flag := 'N';
11909 	--
11910 	IF l_debug_on THEN
11911 	    WSH_DEBUG_SV.pop(l_module_name);
11912 	END IF;
11913 	--
11914 	return;
11915  END IF;
11916 
11917  IF Get_Detail_Attr%ISOPEN THEN
11918 	CLOSE Get_Detail_Attr;
11919  END IF;
11920 
11921  IF l_cust_id IS NOT NULL THEN
11922 	l_attr_flag := 'Y';
11923  END IF;
11924 
11925  IF l_intmed_loc_id IS NOT NULL THEN
11926 	l_attr_flag := 'Y';
11927  END IF;
11928 
11929  IF l_fob_code IS NOT NULL THEN
11930 	l_attr_flag := 'Y';
11931  END IF;
11932 
11933  IF l_freight_terms_code IS NOT NULL THEN
11934 	l_attr_flag := 'Y';
11935  END IF;
11936 
11937  IF l_service_level IS NOT NULL THEN
11938 	l_attr_flag := 'Y';
11939  END IF;
11940  IF l_mode_of_transport IS NOT NULL THEN
11941 	l_attr_flag := 'Y';
11942  END IF;
11943  IF l_carrier_id IS NOT NULL THEN
11944 	l_attr_flag := 'Y';
11945  END IF;
11946  IF l_ship_method_code IS NOT NULL THEN
11947 	l_attr_flag := 'Y';
11948  END IF;
11949 
11950  IF l_deliver_to_loc_id IS NOT NULL THEN
11951 	l_attr_flag := 'Y';
11952  END IF;
11953 
11954  x_attr_flag := l_attr_flag;
11955 
11956  x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11957 
11958 --
11959 IF l_debug_on THEN
11960     WSH_DEBUG_SV.pop(l_module_name);
11961 END IF;
11962 --
11963 EXCEPTION
11964 
11965   WHEN Others THEN
11966 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Check_Cont_Attributes',l_module_name);
11967 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11968 
11969 --
11970 IF l_debug_on THEN
11971     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11972     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11973 END IF;
11974 --
11975 END Check_Cont_Attributes;
11976 
11977 
11978 /*
11979 -----------------------------------------------------------------------------
11980    PROCEDURE  : Update_Cont_Hierarchy
11981    PARAMETERS : p_delivery_detail_id - delivery detail id
11982 		p_delivery_id - delivery id if container assigned to delivery
11983 		p_container_instance_id - delivery detail id for the container
11984 		x_return_status - return status of API
11985   DESCRIPTION : This procedure updates the grouping attribute columns of the
11986 		the entire container hierarchy for the specified container
11987 		with the grouping attribute values derived from the
11988 		delivery line that is input.
11989 ------------------------------------------------------------------------------
11990 */
11991 
11992 PROCEDURE Update_Cont_Hierarchy (
11993  p_del_detail_id IN NUMBER,
11994  p_delivery_id IN NUMBER,
11995  p_container_instance_id IN NUMBER,
11996  x_return_status OUT NOCOPY  VARCHAR2) IS
11997 
11998 
11999  CURSOR Get_Child_Containers(v_cont_instance_id NUMBER) IS
12000  SELECT delivery_detail_id
12001  FROM wsh_delivery_assignments_v
12002  START WITH delivery_detail_id = v_cont_instance_id
12003  CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id;
12004 
12005  CURSOR Get_Cont_Flag (v_detail_id NUMBER) IS
12006  SELECT container_flag
12007  FROM WSH_DELIVERY_DETAILS
12008  WHERE delivery_detail_id = v_detail_id;
12009 
12010  l_master_cont_inst_id NUMBER;
12011  l_master_cont_name VARCHAR2(30);
12012 
12016  l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12013  l_cont_name VARCHAR2(30);
12014  l_cont_flag VARCHAR2(1);
12015 
12017 
12018 --
12019 l_debug_on BOOLEAN;
12020 --
12021 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_CONT_HIERARCHY';
12022 --
12023 BEGIN
12024 
12025  --
12026  --
12027  l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12028  --
12029  IF l_debug_on IS NULL
12030  THEN
12031      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12032  END IF;
12033  --
12034  IF l_debug_on THEN
12035      WSH_DEBUG_SV.push(l_module_name);
12036      --
12037      WSH_DEBUG_SV.log(l_module_name,'P_DEL_DETAIL_ID',P_DEL_DETAIL_ID);
12038      WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
12039      WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
12040  END IF;
12041  --
12042  --
12043  IF l_debug_on THEN
12044      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_CONT_ID',WSH_DEBUG_SV.C_PROC_LEVEL);
12045  END IF;
12046  --
12047  l_master_cont_inst_id := WSH_CONTAINER_UTILITIES.Get_Master_Cont_Id(p_container_instance_id);
12048 
12049  IF l_master_cont_inst_id IS NULL THEN
12050 	l_master_cont_inst_id := p_container_instance_id;
12051  END IF;
12052 
12053  --dbms_output.put_line('calling get child containers with ' || l_master_cont_inst_id);
12054 
12055  FOR cont IN Get_Child_Containers(l_master_cont_inst_id) LOOP
12056 
12057 	EXIT WHEN Get_Child_Containers%NOTFOUND;
12058 
12059  --dbms_output.put_line('in loop with ' || cont.delivery_detail_id);
12060 
12061 	OPEN Get_Cont_Flag (cont.delivery_detail_id);
12062 
12063 	FETCH Get_Cont_Flag INTO l_cont_flag;
12064 
12065  	IF Get_Cont_Flag%NOTFOUND THEN
12066 --dbms_output.put_line('cont flag not found for ' || cont.delivery_detail_id);
12067 		CLOSE Get_Cont_Flag;
12068 		GOTO next_cont;
12069 	END IF;
12070 
12071 	IF Get_Cont_Flag%ISOPEN THEN
12072 		CLOSE Get_Cont_Flag;
12073 	END IF;
12074 
12075 --dbms_output.put_line('called get child containers with ' || cont.delivery_detail_id || ' and cont flag is ' || l_cont_flag);
12076 
12077 	IF (nvl(l_cont_flag,'N') = 'Y') THEN
12078 
12079 	--dbms_output.put_line('calling update cont attr with ' || cont.delivery_detail_id);
12080 
12081 		--
12082 		IF l_debug_on THEN
12083 		    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
12084 		END IF;
12085 		--
12086 		wsh_container_actions.Update_Cont_Attributes (
12087 						p_del_detail_id,
12088 						p_delivery_id,
12089 						cont.delivery_detail_id,
12090 						l_return_status);
12091                 IF l_debug_on THEN
12092                   WSH_DEBUG_SV.log(l_module_name,'return status-',l_return_status);
12093                 END IF;
12094 
12095 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12096 			FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
12097 			--
12098 			IF l_debug_on THEN
12099 			    WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
12100 			END IF;
12101 			--
12102 			l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(cont.delivery_detail_id);
12103 			FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
12104 			x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12105 			WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
12106 		END IF;
12107 
12108 	END IF;
12109 
12110 	<<next_cont>>
12111 	     null;
12112 
12113 	l_cont_flag := NULL;
12114 
12115   END LOOP;
12116 
12117   IF nvl(x_return_status,WSH_UTIL_CORE.G_RET_STS_SUCCESS) <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12118 	--
12119 	IF l_debug_on THEN
12120 	    WSH_DEBUG_SV.pop(l_module_name);
12121 	END IF;
12122 	--
12123 	return;
12124   ELSE
12125 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12126   END IF;
12127 
12128 --
12129 IF l_debug_on THEN
12130     WSH_DEBUG_SV.pop(l_module_name);
12131 END IF;
12132 --
12133 EXCEPTION
12134 
12135   WHEN Others THEN
12136 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_Cont_Hierarchy',l_module_name);
12137 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12138 
12139 --
12140 IF l_debug_on THEN
12141     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12142     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12143 END IF;
12144 --
12145 END Update_Cont_Hierarchy;
12146 
12147 
12148 /*
12149 -----------------------------------------------------------------------------
12150    PROCEDURE  : Last_Assigned_Line
12151    PARAMETERS : p_delivery_detail_id - delivery detail id
12152 		p_container_instance_id - delivery detail id for the container
12153 		x_last_line_flag - 'Y' or 'N' depending on whether it is the
12154 		last line in the container hierarchy or not.
12155 		x_return_status - return status of API
12156   DESCRIPTION : This procedure checks to see if the delivery detail id is the
12157 		last assigned line in the container hierarchy for the input
12158 		container. If it is, x_last_line_flag is set to 'Y' else it is
12159 		set to 'N'.
12163 PROCEDURE Last_Assigned_Line (
12160 ------------------------------------------------------------------------------
12161 */
12162 
12164  p_del_detail_id IN NUMBER,
12165  p_container_instance_id IN NUMBER,
12166  x_last_line_flag OUT NOCOPY  VARCHAR2,
12167  x_return_status OUT NOCOPY  VARCHAR2) IS
12168 
12169  CURSOR Get_Contents (v_detail_id NUMBER) IS
12170  SELECT count(*)
12171  FROM wsh_delivery_assignments_v
12172  START WITH delivery_detail_id = v_detail_id
12173  CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id;
12174 
12175  CURSOR Get_Cont_Count (v_cont_id NUMBER) IS
12176  SELECT count(*)
12177  FROM wsh_delivery_assignments_v
12178  WHERE delivery_detail_id IN
12179 	(SELECT delivery_detail_id
12180 	 FROM WSH_DELIVERY_DETAILS
12181   	 WHERE container_flag = 'Y')
12182  START WITH delivery_detail_id = v_cont_id
12183  CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id;
12184 
12185  l_content_cnt NUMBER;
12186  l_cont_cnt NUMBER;
12187 
12188  l_mast_cont_inst_id NUMBER;
12189 
12190 --
12191 l_debug_on BOOLEAN;
12192 --
12193 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'LAST_ASSIGNED_LINE';
12194 --
12195 BEGIN
12196 
12197  --
12198  --
12199  l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12200  --
12201  IF l_debug_on IS NULL
12202  THEN
12203      l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12204  END IF;
12205  --
12206  IF l_debug_on THEN
12207      WSH_DEBUG_SV.push(l_module_name);
12208      --
12209      WSH_DEBUG_SV.log(l_module_name,'P_DEL_DETAIL_ID',P_DEL_DETAIL_ID);
12210      WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
12211  END IF;
12212  --
12213  --
12214  IF l_debug_on THEN
12215      WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_CONT_ID',WSH_DEBUG_SV.C_PROC_LEVEL);
12216  END IF;
12217  --
12218  l_mast_cont_inst_id := WSH_CONTAINER_UTILITIES.Get_Master_Cont_Id (p_container_instance_id);
12219 
12220  IF l_mast_cont_inst_id IS NULL THEN
12221 	l_mast_cont_inst_id := p_container_instance_id;
12222  END IF;
12223 
12224  OPEN Get_Contents (l_mast_cont_inst_id);
12225 
12226  FETCH Get_Contents INTO l_content_cnt;
12227 
12228  IF Get_Contents%NOTFOUND THEN
12229 	CLOSE Get_Contents;
12230 	x_last_line_flag := 'N';
12231 	FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
12232 	x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12233 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
12234 	--
12235 	IF l_debug_on THEN
12236 	    WSH_DEBUG_SV.pop(l_module_name);
12237 	END IF;
12238 	--
12239 	return;
12240  END IF;
12241 
12242  IF Get_Contents%ISOPEN THEN
12243 	CLOSE Get_Contents;
12244  END IF;
12245 
12246  OPEN Get_Cont_Count (l_mast_cont_inst_id);
12247 
12248  FETCH Get_Cont_Count INTO l_cont_cnt;
12249 
12250  IF Get_Cont_Count%NOTFOUND THEN
12251 	CLOSE Get_Cont_Count;
12252 	x_last_line_flag := 'N';
12253 	FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
12254 	x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12255 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
12256 	--
12257 	IF l_debug_on THEN
12258 	    WSH_DEBUG_SV.pop(l_module_name);
12259 	END IF;
12260 	--
12261 	return;
12262  END IF;
12263 
12264  IF Get_Cont_Count%ISOPEN THEN
12265 	CLOSE Get_Cont_Count;
12266  END IF;
12267 
12268  IF (l_content_cnt - l_cont_cnt) > 0 THEN
12269 	x_last_line_flag := 'N';
12270  ELSE
12271 	x_last_line_flag := 'Y';
12272  END IF;
12273 
12274  x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12275 
12276 --
12277 IF l_debug_on THEN
12278     WSH_DEBUG_SV.pop(l_module_name);
12279 END IF;
12280 --
12281 EXCEPTION
12282 
12283   WHEN Others THEN
12284 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Last_Assigned_Line',l_module_name);
12285 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12286 
12287 --
12288 IF l_debug_on THEN
12289     WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12290     WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12291 END IF;
12292 --
12293 END Last_Assigned_Line;
12294 
12295 
12296 
12297 -- J-IB-NPARIKH-{
12298 --
12299 --========================================================================
12300 -- PROCEDURE : pack_inbound_lines
12301 --
12302 -- PARAMETERS: p_lines_tbl       Table of delivery lines to be packed
12303 --             p_lpn_id          LPN ID
12304 --             p_lpn_name        Container name as entered on ASN
12305 --             p_delivery_id     Delivery ID for delivery, input lines belong to
12306 --             p_transactionType ASN/RECEIPT
12307 --             x_return_status   Return status of the API
12308 --
12309 -- ASSUMPTION: All input lines belong to only one delivery, specified by p_delivery_id
12310 --
12311 -- COMMENT   : This procedure is called only from the Inbound ASN/Receipt
12312 --             integration to pack delivery lines as per the ASN LPN
12313 --             Configuration.
12314 --             It performs the following steps:
12318 --             04. Append LPN name with delivery name.
12315 --             01. Validate that input delivery id is not null and is a valid delivery.
12316 --             02. Validate that input table of lines contain at least one record.
12317 --             03. If input delivery is outbound, return with error.
12319 --             05. Create container instance
12320 --             06. Update container delivery detail record with grouping attributes from delivery.
12321 --             07. Assign container to delivery
12322 --             08. Assign input lines to container
12323 --             09. Calculate container dates
12324 --             10. Calculate container weight/volume
12325 --
12326 --========================================================================
12327 --
12328 PROCEDURE pack_inbound_lines
12329             (
12330                p_lines_tbl          IN          WSH_UTIL_CORE.id_tab_type,
12331                p_lpn_id             IN          NUMBER,
12332                p_lpn_name           IN        VARCHAR2,
12333                p_delivery_id        IN          NUMBER,
12334                p_transactionType    IN          VARCHAR2 DEFAULT 'ASN',
12335                x_return_status      OUT NOCOPY  VARCHAR2,
12336 	       p_waybill_number     IN          VARCHAR2,
12337                p_caller             IN          VARCHAR2
12338             )
12339 IS
12340 --{
12341     --
12342     -- Get delivery information
12343     --
12344     CURSOR dlvy_csr (p_delivery_id IN NUMBER)
12345     IS
12346         SELECT organization_id,
12347                nvl(shipment_direction,'O') shipment_direction,
12348                initial_pickup_location_id,
12349                ultimate_dropoff_location_id,
12350                customer_id,
12351                intmed_ship_to_location_id,
12352                fob_code,
12353                freight_terms_code,
12354                ship_method_code,
12355                shipping_control,
12356                vendor_id,
12357                party_id,
12358                name,
12359                nvl(ignore_for_planning,'N') ignore_for_planning
12360         FROM   wsh_new_deliveries wnd
12361         WHERE  delivery_id             = p_delivery_id;
12362     --
12363     --
12364     l_dlvy_rec dlvy_csr%ROWTYPE;
12365     --
12366     l_num_warnings                NUMBER := 0;
12367     l_num_errors                  NUMBER := 0;
12368     l_return_status               VARCHAR2(10);
12369     --
12370     l_cont_name                   VARCHAR2(100);
12371     l_container_instance_id       NUMBER;
12372     l_rowid                       VARCHAR2(32767);
12373     l_cont_tbl                    WSH_UTIL_CORE.id_tab_type;
12374 				--
12375     l_gross_weight                NUMBER;
12376     l_net_weight                  NUMBER;
12377     l_volume                      NUMBER;
12378     l_cont_fill_pc                NUMBER;
12379 
12380     l_detail_tab                  WSH_UTIL_CORE.id_tab_type;  -- DBI Project
12381     l_dbi_rs                      VARCHAR2(1); -- Return Status from DBI API
12382 
12383     cursor l_dup_del_csr(p_lpn_name IN VARCHAR2)
12384     is
12385     select wnd.delivery_id,
12386            wnd.name,
12387            wnd.status_code,
12388            wda.delivery_detail_id
12389     from   wsh_delivery_details wdd,
12390            wsh_delivery_assignments_v wda,
12391            wsh_new_deliveries wnd
12392     where  wdd.container_name = p_lpn_name
12393     and    wdd.container_flag = 'Y'
12394     and    wda.delivery_detail_id = wdd.delivery_detail_id
12395     and    wda.delivery_id = wnd.delivery_id(+);
12396 
12397     l_dup_del_id     NUMBER;
12398     l_dup_del_name   VARCHAR2(32767);
12399     l_dup_del_status VARCHAR2(2);
12400     l_dup_cnt_id     NUMBER;
12401     --
12402 
12403 -- K LPN CONV. rv
12404 l_cont_tab wsh_util_core.id_tab_type;
12405 l_lpn_unit_weight NUMBER;
12406 l_lpn_unit_volume NUMBER;
12407 l_lpn_weight_uom_code VARCHAR2(100);
12408 l_lpn_volume_uom_code VARCHAR2(100);
12409 -- K LPN CONV. rv
12410     l_debug_on                    BOOLEAN;
12411     --
12412     l_module_name        CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'pack_inbound_lines';
12413     --
12414 --}
12415 BEGIN
12416 --{
12417     SAVEPOINT pack_inbound_lines_sp;
12418     --
12419     l_debug_on := wsh_debug_interface.g_debug;
12420     --
12421     IF l_debug_on IS NULL THEN
12422       l_debug_on := wsh_debug_sv.is_debug_enabled;
12423     END IF;
12424     --
12425     IF l_debug_on THEN
12426       wsh_debug_sv.push(l_module_name);
12427       --
12428       wsh_debug_sv.LOG(l_module_name, 'p_lpn_id', p_lpn_id);
12429       wsh_debug_sv.LOG(l_module_name, 'p_delivery_id', p_delivery_id);
12430       wsh_debug_sv.LOG(l_module_name, 'p_transactionTYpe', p_transactionTYpe);
12431     END IF;
12432     --
12433     x_return_status := wsh_util_core.g_ret_sts_success;
12434     --
12435     --
12436     IF p_delivery_id IS NULL
12437     THEN
12438     --{
12439         --
12440         -- p_delivery_id is mandatory
12441         --
12442         FND_MESSAGE.SET_NAME('WSH', 'WSH_REQUIRED_FIELD_NULL');
12443         FND_MESSAGE.SET_TOKEN('FIELD_NAME', 'p_delivery_id');
12444         WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12445         --
12446         RAISE FND_API.G_EXC_ERROR;
12447     --}
12451     THEN
12448     END IF;
12449     --
12450     IF p_lines_tbl.count = 0
12452     --{
12453         --
12454         -- p_lines_tbl should have at least one record
12455         --
12456         FND_MESSAGE.SET_NAME('WSH', 'WSH_EMPTY_TABLE_ERROR');
12457         FND_MESSAGE.SET_TOKEN('TABLE_NAME', 'p_lines_tbl');
12458         WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12459         --
12460         RAISE FND_API.G_EXC_ERROR;
12461     --}
12462     END IF;
12463     --
12464     --
12465     OPEN dlvy_csr(p_delivery_id);
12466     FETCH dlvy_csr INTO l_dlvy_rec;
12467     CLOSE dlvy_csr;
12468     --
12469     IF l_dlvy_rec.initial_pickup_location_id IS NULL
12470     THEN
12471     --{
12472         FND_MESSAGE.SET_NAME('WSH','WSH_DLVY_NOT_EXIST');
12473         FND_MESSAGE.SET_TOKEN('DELIVERY_ID', p_delivery_id);
12474         WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12475         --
12476         RAISE FND_API.G_EXC_ERROR;
12477     --}
12478     END IF;
12479     --
12480     --
12481     IF l_dlvy_rec.shipment_direction IN ('O','IO')
12482     THEN
12483     --{
12484         --
12485         -- Invalid operation for outbound delivery
12486         --
12487         FND_MESSAGE.SET_NAME('WSH','WSH_NOT_IB_DLVY_ERROR');
12488         FND_MESSAGE.SET_TOKEN('DELIVERY_NAME', l_dlvy_rec.name);
12489         WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12490         --
12491         RAISE FND_API.G_EXC_ERROR;
12492     --}
12493     END IF;
12494     --
12495     --
12496     --l_cont_name := SUBSTRB(p_lpn_id || '.' || l_dlvy_rec.name,1,30);
12497     l_cont_name := p_lpn_name;
12498     --
12499     -- commented out the following code because this is not applicable anymore
12500     -- as container name is not unique in WSH.  This check is not required.
12501     /*
12502     open  l_dup_del_csr(p_lpn_name);
12503     fetch l_dup_del_csr into l_dup_del_id,l_dup_del_name, l_dup_del_status, l_dup_cnt_id;
12504     close l_dup_del_csr;
12505 
12506     IF l_debug_on THEN
12507         WSH_DEBUG_SV.log(l_module_name,'l_dup_del_id', l_dup_del_id);
12508         WSH_DEBUG_SV.log(l_module_name,'l_dup_del_name', l_dup_del_name);
12509         WSH_DEBUG_SV.log(l_module_name,'l_dup_del_status', l_dup_del_status);
12510         WSH_DEBUG_SV.log(l_module_name,'l_dup_cnt_id', l_dup_cnt_id);
12511     END IF;
12512 
12513     IF(l_dup_del_id is not null AND nvl(l_dup_del_status,'OP') = 'CL') THEN
12514     --{
12515         update wsh_delivery_details
12516         set    container_name = SUBSTRB(p_lpn_name || '.' ||l_dup_del_name,1,50)
12517         where  delivery_detail_id = l_dup_cnt_id;
12518     --}
12519     ELSIF(l_dup_cnt_id IS NOT NULL) THEN
12520     --{
12521         l_cont_name := SUBSTRB(p_lpn_name || '.' || l_dlvy_rec.name,1,50);
12522     --}
12523     END IF;
12524     */
12525     --l_cont_name := SUBSTRB(p_lpn_name || '.' || l_dlvy_rec.name,1,50);
12526     --
12527     --
12528     IF l_debug_on THEN
12529         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Create_Cont_Instance_Multi',WSH_DEBUG_SV.C_PROC_LEVEL);
12530     END IF;
12531     --
12532     G_CALLED_FROM_INBOUND := TRUE;
12533     --
12534       --
12535       -- K LPN CONV. rv
12536       --
12537       WSH_CONTAINER_ACTIONS.Create_Cont_Instance_Multi(
12538         x_cont_name           => l_cont_name,
12539         p_cont_item_id        => NULL,
12540         x_cont_instance_id    => l_container_instance_id,
12541         p_par_detail_id       => NULL,
12542         p_organization_id     => l_dlvy_rec.organization_id,
12543         p_container_type_code => NULL,
12544         p_num_of_containers   => 1,
12545         x_row_id              => l_rowid,
12546         x_return_status       => l_return_status,
12547         x_cont_tab            => l_cont_tab,
12548         x_unit_weight         => l_lpn_unit_weight,
12549         x_unit_volume         => l_lpn_unit_volume,
12550         x_weight_uom_code     => l_lpn_weight_uom_code,
12551         x_volume_uom_code     => l_lpn_volume_uom_code,
12552         p_lpn_id              => p_lpn_id,
12553         p_ignore_for_planning => l_dlvy_rec.ignore_for_planning,
12554         p_caller              => 'WSH_IB_PACK');
12555       --
12556       IF l_debug_on THEN
12557           WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
12558           WSH_DEBUG_SV.log(l_module_name,'count of l_cont_tab',l_cont_tab.count);
12559       END IF;
12560       l_container_instance_id := l_cont_tab(1);
12561       -- K LPN CONV. rv
12562     --
12563     --
12564     G_CALLED_FROM_INBOUND := FALSE;
12565     --
12566     wsh_util_core.api_post_call
12567       (
12568         p_return_status => l_return_status,
12569         x_num_warnings  => l_num_warnings,
12570         x_num_errors    => l_num_errors
12571       );
12572     --
12573     --
12574     -- Update Container record with delivery grouping attributes
12575     --
12576     UPDATE WSH_DELIVERY_DETAILS
12577     SET    lpn_id                       = p_lpn_id,
12578            shipped_quantity             = DECODE(p_transactionType,'ASN',1,shipped_quantity),
12579            received_quantity            = DECODE(p_transactionType,'RECEIPT',1,received_quantity),
12583            requested_quantity_uom       = 'Ea'  ,
12580            released_status              = DECODE(p_transactionType,'ASN','C','RECEIPT','L','C'),
12581            src_requested_quantity       = requested_quantity,
12582            src_requested_quantity_uom   = 'Ea'  ,
12584            line_direction               = l_dlvy_rec.shipment_direction,
12585            ship_from_location_id        = l_dlvy_rec.initial_pickup_location_id,
12586            ship_to_location_id          = l_dlvy_rec.ultimate_dropoff_location_id,
12587            customer_id                  = l_dlvy_rec.customer_id,
12588            intmed_ship_to_location_id   = l_dlvy_rec.intmed_ship_to_location_id,
12589            fob_code                     = l_dlvy_rec.fob_code,
12590            freight_terms_code           = l_dlvy_rec.freight_terms_code,
12591            ship_method_code             = l_dlvy_rec.ship_method_code,
12592            shipping_control             = l_dlvy_rec.shipping_control,
12593            vendor_id                    = l_dlvy_rec.vendor_id,
12594            party_id                     = l_dlvy_rec.party_id,
12595            ignore_for_planning          = l_dlvy_rec.ignore_for_planning,
12596            tracking_number              = NVL(p_waybill_number,tracking_number),
12597            last_update_date             = SYSDATE,
12598            last_updated_by              = FND_GLOBAL.USER_ID,
12599            last_update_login            = FND_GLOBAL.LOGIN_ID
12600    WHERE   rowid                        = l_rowid;
12601    --
12602    -- l_container_instance_id is the delivery_detail_id, use for DBI call
12603    -- DBI Project
12604    -- Update of wsh_delivery_details where requested_quantity/released_status
12605    -- are changed, call DBI API after the update.
12606    -- This API will also check for DBI Installed or not
12607    IF l_debug_on THEN
12608      WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail id-',l_container_instance_id);
12609    END IF;
12610    l_detail_tab(1) := l_container_instance_id;
12611    WSH_INTEGRATION.DBI_Update_Detail_Log
12612      (p_delivery_detail_id_tab => l_detail_tab,
12613       p_dml_type               => 'UPDATE',
12614       x_return_status          => l_dbi_rs);
12615 
12616    IF l_debug_on THEN
12617      WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
12618    END IF;
12619 
12620    IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
12621      x_return_status := l_dbi_rs;
12622      -- just pass this return status to caller API
12623      IF l_debug_on THEN
12624        WSH_DEBUG_SV.pop(l_module_name,'DBI API Returned Unexpected error '||x_return_status);
12625        WSH_DEBUG_SV.pop(l_module_name);
12626      END IF;
12627      return;
12628    END IF;
12629    -- treat all other return status as Success
12630    -- End of Code for DBI Project
12631    --
12632    -- Assign container to delivery
12633    --
12634    UPDATE wsh_delivery_assignments_v
12635    SET      delivery_id        = p_delivery_id,
12636             last_update_date   = SYSDATE,
12637             last_updated_by    = FND_GLOBAL.USER_ID,
12638             last_update_login  = FND_GLOBAL.LOGIN_ID
12639    WHERE    delivery_detail_id = l_container_instance_id;
12640    --
12641    --
12642    -- Assign lines to container
12643    --
12644    FORALL i IN p_lines_tbl.FIRST..p_lines_tbl.LAST
12645    UPDATE wsh_delivery_assignments_v
12646    SET      parent_delivery_detail_id   = l_container_instance_id,
12647             last_update_date   = SYSDATE,
12648             last_updated_by    = FND_GLOBAL.USER_ID,
12649             last_update_login  = FND_GLOBAL.LOGIN_ID
12650    WHERE    delivery_detail_id = p_lines_tbl(i);
12651    --
12652    --
12653    l_cont_tbl(1) := l_container_instance_id;
12654    --
12655    --
12656     --
12657     IF l_debug_on THEN
12658         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit wsh_tp_release.calculate_cont_del_tpdates',WSH_DEBUG_SV.C_PROC_LEVEL);
12659     END IF;
12660     --
12661    --
12662    -- Calculate container dates
12663    --
12664    wsh_tp_release.calculate_cont_del_tpdates
12665     (
12666         p_entity        => 'LPN',
12667         p_entity_ids    => l_cont_tbl,
12668         x_return_status => l_return_status
12669     );
12670    --
12671    wsh_util_core.api_post_call
12672       (
12673         p_return_status => l_return_status,
12674         x_num_warnings  => l_num_warnings,
12675         x_num_errors    => l_num_errors
12676       );
12677     --
12678         IF nvl(p_caller, '!!!!') <> 'WSH_VENDOR_MERGE' THEN
12679         --{
12680 
12681             IF l_debug_on THEN
12682                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
12683             END IF;
12684             --
12685             --
12686             -- Calculate container weight and volume
12687             --
12688             WSH_TPA_CONTAINER_PKG.Container_Weight_Volume(
12689                  p_container_instance_id => l_container_instance_id,
12690                  p_override_flag         => 'Y',
12691                  p_calc_wv_if_frozen     => 'N',
12692                  x_gross_weight          => l_gross_weight,
12693                  x_net_weight            => l_net_weight,
12694                  x_volume                => l_volume ,
12695                  p_fill_pc_flag          => 'Y',
12699             IF l_debug_on THEN
12696                  x_cont_fill_pc          => l_cont_fill_pc,
12697                  x_return_status         => l_return_status);
12698             --
12700               WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
12701             END IF;
12702         --}
12703         END IF;
12704 
12705 			--
12706 			--
12707    IF l_num_errors > 0
12708    THEN
12709         x_return_status         := WSH_UTIL_CORE.G_RET_STS_ERROR;
12710    ELSIF l_num_warnings > 0
12711    THEN
12712         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12713    ELSE
12714         x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12715    END IF;
12716    --
12717    IF l_debug_on THEN
12718       wsh_debug_sv.pop(l_module_name);
12719    END IF;
12720     --
12721 --}
12722 EXCEPTION
12723 --{
12724       --
12725     WHEN FND_API.G_EXC_ERROR THEN
12726 
12727       G_CALLED_FROM_INBOUND := FALSE;
12728       ROLLBACK TO  pack_inbound_lines_sp;
12729       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12730       --
12731       IF l_debug_on THEN
12732         WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
12733         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
12734       END IF;
12735       --
12736     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
12737 
12738       G_CALLED_FROM_INBOUND := FALSE;
12739       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
12740       ROLLBACK TO  pack_inbound_lines_sp;
12741       --
12742       IF l_debug_on THEN
12743         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12744         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
12745       END IF;
12746       --
12747     WHEN WSH_UTIL_CORE.G_EXC_WARNING THEN
12748 
12749       G_CALLED_FROM_INBOUND := FALSE;
12750       x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12751       --
12752       IF l_debug_on THEN
12753         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_UTIL_CORE.G_EXC_WARNING exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
12754         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_UTIL_CORE.G_EXC_WARNING');
12755       END IF;
12756       --
12757     WHEN OTHERS THEN
12758 
12759         G_CALLED_FROM_INBOUND := FALSE;
12760         ROLLBACK TO  pack_inbound_lines_sp;
12761         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
12762         wsh_util_core.default_handler('wsh_container_actions.pack_inbound_lines', l_module_name);
12763         IF l_debug_on THEN
12764            WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12765         END IF;
12766         --
12767 --}
12768 END pack_inbound_lines;
12769 --
12770 --
12771 --
12772 --========================================================================
12773 -- PROCEDURE : unpack_inbound_delivery
12774 --
12775 -- PARAMETERS: p_delivery_id     Delivery ID for delivery, input lines belong to
12776 --             x_return_status   Return status of the API
12777 --
12778 --
12779 -- COMMENT   : This procedure is called only from the cancel ASN/Revert ASN events
12780 --             It performs the following steps:
12781 --             01. Validate that input delivery id is not null and is a valid delivery.
12782 --             02. If input delivery is outbound, return with error.
12783 --             03. Delete all containers within the delivery (WDD and WDA)
12784 --             04. Unassign all lines (within delivery) from container.
12785 --
12786 --========================================================================
12787 --
12788 --
12789 PROCEDURE unpack_inbound_delivery
12790             (
12791                p_delivery_id        IN          NUMBER,
12792                x_return_status      OUT NOCOPY  VARCHAR2
12793             )
12794 IS
12795 --{
12796     CURSOR dlvy_csr (p_delivery_id IN NUMBER)
12797     IS
12798         SELECT nvl(shipment_direction,'O') shipment_direction,
12799                initial_pickup_location_id,
12800                name
12801         FROM   wsh_new_deliveries wnd
12802         WHERE  delivery_id             = p_delivery_id;
12803     --
12804     l_dlvy_rec dlvy_csr%ROWTYPE;
12805     --
12806     --
12807     l_num_warnings                NUMBER := 0;
12808     l_num_errors                  NUMBER := 0;
12809     l_return_status               VARCHAR2(10);
12810     --
12811     l_lines_tbl                   WSH_UTIL_CORE.id_tab_type;
12812     --
12813     l_debug_on                    BOOLEAN;
12814     --
12815     l_module_name        CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'unpack_inbound_delivery';
12816     --
12817 --}
12818 BEGIN
12819 --{
12820     SAVEPOINT unpack_inbound_delivery_sp;
12821     --
12822     l_debug_on := wsh_debug_interface.g_debug;
12823     --
12824     IF l_debug_on IS NULL THEN
12825       l_debug_on := wsh_debug_sv.is_debug_enabled;
12826     END IF;
12827     --
12828     IF l_debug_on THEN
12829       wsh_debug_sv.push(l_module_name);
12830       --
12831       wsh_debug_sv.LOG(l_module_name, 'p_delivery_id', p_delivery_id);
12832     END IF;
12833     --
12837     IF p_delivery_id IS NULL
12834     x_return_status := wsh_util_core.g_ret_sts_success;
12835     --
12836     --
12838     THEN
12839     --{
12840         --
12841         -- p_delivery_id is mandatory
12842         --
12843         FND_MESSAGE.SET_NAME('WSH', 'WSH_REQUIRED_FIELD_NULL');
12844         FND_MESSAGE.SET_TOKEN('FIELD_NAME', 'p_delivery_id');
12845         WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12846         --
12847         RAISE FND_API.G_EXC_ERROR;
12848     --}
12849     END IF;
12850     --
12851     --
12852     OPEN dlvy_csr(p_delivery_id);
12853     FETCH dlvy_csr INTO l_dlvy_rec;
12854     CLOSE dlvy_csr;
12855     --
12856     IF l_dlvy_rec.initial_pickup_location_id IS NULL
12857     THEN
12858     --{
12859         FND_MESSAGE.SET_NAME('WSH','WSH_DLVY_NOT_EXIST');
12860         FND_MESSAGE.SET_TOKEN('DELIVERY_ID', p_delivery_id);
12861         WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12862         --
12863         RAISE FND_API.G_EXC_ERROR;
12864     --}
12865     END IF;
12866     --
12867     --
12868     IF l_dlvy_rec.shipment_direction IN ('O','IO')
12869     THEN
12870     --{
12871         --
12872         -- Invalid operation for outbound delivery
12873         --
12874         FND_MESSAGE.SET_NAME('WSH','WSH_NOT_IB_DLVY_ERROR');
12875         FND_MESSAGE.SET_TOKEN('DELIVERY_NAME', l_dlvy_rec.name);
12876         WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12877         --
12878         RAISE FND_API.G_EXC_ERROR;
12879     --}
12880     END IF;
12881     --
12882     --
12883     -- Delete all containers within the delivery
12884     --
12885     DELETE WSH_DELIVERY_DETAILS
12886     WHERE  DELIVERY_DETAIL_ID IN (
12887                                     SELECT wdd.delivery_detail_id
12888                                     FROM   wsh_delivery_details wdd,
12889                                            wsh_delivery_assignments_v wda
12890                                     WHERE  wda.delivery_id = p_delivery_id
12891                                     AND    wda.delivery_detail_id = wdd.delivery_detail_id
12892                                     AND    NVL(wdd.container_flag,'N') = 'Y'
12893                                  )
12894     RETURNING delivery_detail_id BULK COLLECT INTO l_lines_tbl;
12895     --
12896     --
12897     IF l_lines_tbl.COUNT > 0
12898     THEN
12899     --{
12900         FORALL i IN l_lines_tbl.FIRST..l_lines_tbl.LAST
12901         DELETE wsh_delivery_assignments_v
12902         WHERE  delivery_detail_id = l_lines_tbl(i);
12903     --}
12904     END IF;
12905     --
12906     --
12907     --
12908     -- Unassign all lines from containers.
12909     --
12910    UPDATE wsh_delivery_assignments_v
12911    SET      parent_delivery_detail_id = NULL,
12912             last_update_date   = SYSDATE,
12913             last_updated_by    = FND_GLOBAL.USER_ID,
12914             last_update_login  = FND_GLOBAL.LOGIN_ID
12915    WHERE    delivery_id        = p_delivery_id;
12916    --
12917    --
12918    IF l_num_errors > 0
12919    THEN
12920         x_return_status         := WSH_UTIL_CORE.G_RET_STS_ERROR;
12921    ELSIF l_num_warnings > 0
12922    THEN
12923         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12924    ELSE
12925         x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12926    END IF;
12927    --
12928    IF l_debug_on THEN
12929       wsh_debug_sv.pop(l_module_name);
12930    END IF;
12931     --
12932 --}
12933 EXCEPTION
12934 --{
12935       --
12936     WHEN FND_API.G_EXC_ERROR THEN
12937 
12938       ROLLBACK TO  unpack_inbound_delivery_sp;
12939       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12940       --
12941       IF l_debug_on THEN
12942         WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
12943         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
12944       END IF;
12945       --
12946     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
12947 
12948       ROLLBACK TO  unpack_inbound_delivery_sp;
12949       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
12950       --
12951       IF l_debug_on THEN
12952         WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12953         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
12954       END IF;
12955       --
12956     WHEN WSH_UTIL_CORE.G_EXC_WARNING THEN
12957       x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12958       --
12959       IF l_debug_on THEN
12960         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_UTIL_CORE.G_EXC_WARNING exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
12961         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_UTIL_CORE.G_EXC_WARNING');
12962       END IF;
12963       --
12964     WHEN OTHERS THEN
12965 
12966         ROLLBACK TO  unpack_inbound_delivery_sp;
12967         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
12968         wsh_util_core.default_handler('wsh_container_actions.unpack_inbound_delivery', l_module_name);
12969         IF l_debug_on THEN
12970            WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12974 END unpack_inbound_delivery;
12971         END IF;
12972         --
12973 --}
12975 --
12976 --
12977 -- J-IB-NPARIKH-}
12978 /* This procedure is a temporarily procedure that will create
12979    container names and will be deleted once WMS provides the functionality.
12980    lpn conv
12981 */
12982 
12983 PROCEDURE Create_Multiple_Cont_name (
12984   p_cont_name IN VARCHAR2,
12985   p_cont_name_pre IN VARCHAR2,
12986   p_cont_name_suf IN VARCHAR2,
12987   p_cont_name_num IN NUMBER,
12988   p_cont_name_dig IN NUMBER,
12989   p_quantity IN NUMBER,
12990   x_cont_names OUT NOCOPY  WSH_GLBL_VAR_STRCT_GRP.v50_Tbl_Type,
12991   x_return_status OUT NOCOPY  VARCHAR2) IS
12992 
12993   CURSOR Get_Exist_Cont(v_cont_name VARCHAR2) IS
12994   SELECT NVL(MAX(1),0) FROM DUAL
12995   WHERE EXISTS ( SELECT 1 FROM WSH_DELIVERY_DETAILS
12996                  WHERE container_name = v_cont_name
12997                  AND container_flag = 'Y');
12998 
12999   l_cont_name VARCHAR2(30);
13000   l_cont_name_num NUMBER;
13001   l_cont_inst_id NUMBER;
13002   l_row_id VARCHAR2(30);
13003   l_cont_cnt NUMBER;
13004   l_all_null_flag VARCHAR2(1) := 'Y';
13005   l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13006 
13007 --
13008 l_debug_on BOOLEAN;
13009 --
13010 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CREATE_MULTIPLE_CONT_NAME';
13011 --
13012 BEGIN
13013 
13014   --
13015   --
13016   l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13017   --
13018   IF l_debug_on IS NULL
13019   THEN
13020       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13021   END IF;
13022   --
13023   IF l_debug_on THEN
13024       WSH_DEBUG_SV.push(l_module_name);
13025       --
13026       WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME',P_CONT_NAME);
13027       WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_PRE',P_CONT_NAME_PRE);
13028       WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_SUF',P_CONT_NAME_SUF);
13029       WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_NUM',P_CONT_NAME_NUM);
13030       WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_DIG',P_CONT_NAME_DIG);
13031       WSH_DEBUG_SV.log(l_module_name,'P_QUANTITY',P_QUANTITY);
13032   END IF;
13033   --
13034   IF ( NVL(p_quantity,0) <=  0 )  THEN
13035 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
13036 	x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13037 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
13038 	--
13039 	IF l_debug_on THEN
13040 	    WSH_DEBUG_SV.pop(l_module_name);
13041 	END IF;
13042 	--
13043 	return;
13044   END IF;
13045 
13046   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
13047 	l_all_null_flag := 'Y';
13048   ELSE
13049 	l_all_null_flag := 'N';
13050   END IF;
13051 
13052   l_cont_name_num := NVL(p_cont_name_num,0);
13053   FOR i IN 1..p_quantity LOOP
13054      IF p_quantity = 1 AND p_cont_name IS NOT NULL THEN
13055         l_cont_name := p_cont_name;
13056      ELSIF l_all_null_flag = 'Y' THEN
13057         l_cont_name := NULL;
13058      ELSE
13059         -- if p..dig is null don't do padding
13060 	   IF (p_cont_name_dig IS NOT NULL) THEN
13061   	      l_cont_name := p_cont_name_pre || LPAD(to_char(l_cont_name_num),p_cont_name_dig,'0') || p_cont_name_suf;
13062 	   ELSE
13063   	      l_cont_name := p_cont_name_pre || to_char(l_cont_name_num)|| p_cont_name_suf;
13064         END IF;
13065      END IF;
13066 	l_cont_name_num := l_cont_name_num + 1;
13067 
13068 	OPEN Get_Exist_Cont(l_cont_name);
13069      FETCH Get_Exist_Cont INTO l_cont_cnt;
13070      CLOSE Get_Exist_Cont;
13071 
13072 	IF l_cont_cnt = 0 THEN
13073 		--
13074                 x_cont_names(x_cont_names.count+1) := l_cont_name;
13075 	ELSE
13076 		l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13077   		FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NAME_DUPLICATE');
13078 		FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
13079 		WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
13080 	END IF;
13081   END LOOP;
13082 
13083   IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
13084 	x_return_status := l_return_status;
13085 	FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
13086 	WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
13087 	--
13088 	IF l_debug_on THEN
13089 	    WSH_DEBUG_SV.pop(l_module_name);
13090 	END IF;
13091 	--
13092 	return;
13093   END IF;
13094 
13095   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13096 
13097 --
13098 IF l_debug_on THEN
13099     WSH_DEBUG_SV.pop(l_module_name);
13100 END IF;
13101 --
13102 EXCEPTION
13103 
13104   WHEN Others THEN
13105 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Create_Multiple_Cont_names',l_module_name);
13106 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13107 
13108 
13109          IF l_debug_on THEN
13110 	    WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13111 	    WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13112 	END IF;
13113         --
13114 END Create_Multiple_Cont_name;
13115 
13116 
13120    This procedure updates all the containers included in p_container_id
13117 /* ----------------------------------------------------------------------
13118 
13119 PROCEDURE Update_child_inv_info
13121    with p_locator_id and p_subinventory (downward in hirearchy)
13122 
13123 Prameters
13124    p_container_id
13125    p_locator_id
13126    p_subinventory
13127    x_return_status
13128 
13129 ------------------------------------------------------------------------*/
13130 
13131 --lpn conv
13132 PROCEDURE Update_child_inv_info(p_container_id  IN NUMBER,
13133                         P_locator_id IN NUMBER,
13134                         P_subinventory IN VARCHAR2,
13135                         X_return_status OUT NOCOPY VARCHAR2)
13136 IS
13137 
13138 
13139    --
13140    l_debug_on BOOLEAN;
13141    --
13142    l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_CHILD_INV_INFO';
13143    --
13144    l_container_id      NUMBER;
13145 
13146    child_cont_locked     EXCEPTION;
13147    PRAGMA EXCEPTION_INIT(child_cont_locked, -00054);
13148 
13149    CURSOR lock_containers(v_container_id NUMBER) IS
13150    SELECT delivery_detail_id
13151    FROM wsh_delivery_details
13152    --WHERE container_flag = 'Y'
13153    WHERE delivery_detail_id IN
13154    (SELECT delivery_detail_id
13155     FROM wsh_delivery_assignments
13156     START WITH parent_delivery_detail_id = v_container_id
13157    CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id
13158    )
13159    FOR UPDATE NOWAIT;
13160 
13161 BEGIN
13162 
13163   --
13164   --
13165   SAVEPOINT s_Update_child_inv_info;
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_container_id',p_container_id);
13177       WSH_DEBUG_SV.log(l_module_name,'P_locator_id',P_locator_id);
13178       WSH_DEBUG_SV.log(l_module_name,'P_subinventory',P_subinventory);
13179   END IF;
13180   --
13181 
13182 
13183   OPEN lock_containers(p_container_id);
13184   LOOP --{
13185      FETCH lock_containers INTO l_container_id;
13186      EXIT WHEN lock_containers%NOTFOUND;
13187 
13188      UPDATE wsh_delivery_details
13189      SET locator_id = p_locator_id,
13190          subinventory = p_subinventory
13191      WHERE delivery_detail_id = l_container_id;
13192 
13193   END LOOP ; --}
13194 
13195   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13196 
13197   --
13198   IF l_debug_on THEN
13199       WSH_DEBUG_SV.pop(l_module_name);
13200   END IF;
13201   --
13202 EXCEPTION
13203 
13204   WHEN  child_cont_locked THEN
13205       rollback to s_Update_child_inv_info;
13206       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13207       --
13208       IF l_debug_on THEN
13209         WSH_DEBUG_SV.logmsg(l_module_name,'Could not lock record for the containers ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13210         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:child_cont_locked');
13211       END IF;
13212       --
13213   WHEN Others THEN
13214       rollback to s_Update_child_inv_info;
13215 	WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_child_inv_info',l_module_name);
13216 	x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13217 
13218 
13219          IF l_debug_on THEN
13220 	    WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13221 	    WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13222 	END IF;
13223         --
13224 END Update_child_inv_info;
13225 
13226 -----------------------------------------------------------------------------------------------------------------------
13227 --
13228 -- Name:
13229 -- Assign_Container_to_Consol
13230 --
13231 -- Purpose:
13232 -- This API will assign a content LPN to a consol LPN.
13233 -- If the parent LPN is not a consol LPN, we will convert it
13234 -- to a consol LPN and create the corresponding consol deliveries
13235 -- and trips.
13236 --
13237 -- Parameters:
13238 -- p_child_container_id: LPN that needs to be assigned.
13239 -- p_parent_container_id: LPN that will be assigned to
13240 -- p_caller: Calling entity/action
13241 -- x_return_status: status
13242 
13243 PROCEDURE Assign_Container_to_Consol(
13244              p_child_container_id   IN NUMBER,
13245              p_parent_container_id  IN NUMBER,
13246              p_caller               IN VARCHAR2,
13247              x_return_status        OUT NOCOPY VARCHAR2) IS
13248 
13249 cursor c_get_container_info(p_delivery_detail_id in number) is
13250 select d.container_flag, a.delivery_id, a.parent_delivery_id, d.inventory_item_id, d.organization_id
13251 from wsh_delivery_details d, wsh_delivery_assignments a
13252 where d.delivery_detail_id = p_delivery_detail_id
13253 and d.container_flag in ('Y', 'C')
13254 and a.type in ('C', 'S')
13255 and a.delivery_detail_id = d.delivery_detail_id
13256 and a.parent_delivery_detail_id is null
13257 and a.delivery_id is not null;
13258 
13259 
13260 
13264 l_del_tab wsh_util_core.id_tab_type;
13261 l_parent_container_info c_get_container_info%rowtype;
13262 l_child_container_info c_get_container_info%rowtype;
13263 l_new_parent_delivery_id NUMBER := NULL;
13265 
13266 
13267 -- This cursor accepts a given delivery, p_del_id,
13268 -- and looks for consol deliveries that share the
13269 -- same trip as this delivery from the initial pickup location.
13270 
13271 cursor c_get_trip_info(p_del_id in number) is
13272 select s.trip_id, d2.delivery_id
13273 from  wsh_delivery_legs l1, wsh_delivery_legs l2,
13274       wsh_new_deliveries d1, wsh_new_deliveries d2,
13275       wsh_trip_stops s
13276 where l1.delivery_id = p_del_id
13277 and l1.delivery_id = d1.delivery_id   -- bug 4891897
13278 and s.stop_id = l1.pick_up_stop_id
13279 and s.stop_location_id = d1.initial_pickup_location_id
13280 and l1.pick_up_stop_id = l2.pick_up_stop_id
13281 and l2.delivery_id = d2.delivery_id
13282 and d2.delivery_type = 'CONSOLIDATION';
13283 
13284 cursor c_get_child_details(p_parent_detail_id in number) IS
13285 SELECT delivery_detail_id
13286 FROM wsh_delivery_assignments_v
13287 WHERE parent_delivery_detail_id = p_parent_detail_id;
13288 
13289 /*CURSOR Get_Cont_Item_Info (v_cont_item_id NUMBER, v_org_id NUMBER) IS
13290   SELECT  Container_Type_Code, weight_uom_code, volume_uom_code,
13291   minimum_fill_percent, maximum_load_weight, internal_volume, primary_uom_code,
13292   unit_weight, unit_volume
13293   FROM MTL_SYSTEM_ITEMS
13294   WHERE inventory_item_id = v_cont_item_id
13295   AND container_item_flag = 'Y'
13296   AND organization_id = v_org_id
13297   AND    nvl(vehicle_item_flag,'N') = 'N'
13298   AND    shippable_item_flag = 'Y';
13299 
13300 */
13301 
13302 CURSOR c_get_trip_id(p_delivery_id in number) IS
13303 SELECT trip_id
13304 FROM wsh_trip_stops s, wsh_delivery_legs l
13305 WHERE s.stop_id = l.pick_up_stop_id
13306 AND l.delivery_id = p_delivery_id;
13307 
13308 l_assign_flag VARCHAR2(1);
13309 l_del_info_tab WSH_NEW_DELIVERIES_PVT.Delivery_Attr_Tbl_Type;
13310 l_parent_del_info_rec WSH_NEW_DELIVERIES_PVT.Delivery_Rec_Type;
13311 l_del_asg_info_rec WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_TYPE;
13312 l_child_details_tab wsh_util_core.id_tab_type;
13313 l_dummy_asg_tab wsh_util_core.id_tab_type;
13314 l_wv_delivery_tab wsh_util_core.id_tab_type;
13315 l_child_delivery_id NUMBER;
13316 l_trip_id NUMBER;
13317 l_parent_trip_id NUMBER;
13318 l_parent_consol_del_id NUMBER;
13319 l_child_trip_id NUMBER;
13320 l_child_consol_del_id NUMBER;
13321 l_unassign_dels wsh_util_core.id_tab_type;
13322 l_trip_id_tab wsh_util_core.id_tab_type;
13323 
13324 l_cont_gross_weight NUMBER;
13325 l_cont_net_weight NUMBER;
13326 l_cont_volume NUMBER;
13327 l_cont_fill_pc NUMBER;
13328 
13329 l_gross_wt NUMBER;
13330 l_net_wt NUMBER;
13331 l_volume NUMBER;
13332 
13333 l_num_warnings              NUMBER  := 0;
13334 l_num_errors                NUMBER  := 0;
13335 l_return_status             VARCHAR2(30);
13336 
13337 CURSOR c_get_filled_vol(p_container_id NUMBER) IS
13338 SELECT filled_volume
13339 FROM WSH_DELIVERY_DETAILS
13340 WHERE delivery_detail_id = p_container_id;
13341 
13342 l_filled_volume  NUMBER;
13343 
13344 
13345 WSH_INVALID_CHILD EXCEPTION;
13346 WSH_INVALID_PARENT EXCEPTION;
13347 WSH_INVALID_CONSOL_ASSIGN EXCEPTION;
13348 WSH_ASSIGN_CONSOL_LPN_ERROR EXCEPTION;
13349 WSH_CONSOL_DEL_NO_MATCH EXCEPTION;
13350 WSH_NO_CHILD_LPNS EXCEPTION;
13351 WSH_INVALID_TRIPS EXCEPTION;
13352 
13353 l_debug_on                    BOOLEAN;
13354 l_module_name        CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'Assign_Container_to_Consol';
13355 
13356 BEGIN
13357 
13358    l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13359    --
13360    IF l_debug_on IS NULL
13361    THEN
13362       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13363    END IF;
13364    --
13365    IF l_debug_on THEN
13366       WSH_DEBUG_SV.push(l_module_name);
13367       --
13368       WSH_DEBUG_SV.log(l_module_name,'p_caller',p_caller);
13369       WSH_DEBUG_SV.log(l_module_name,'p_child_container_id',p_child_container_id);
13370       WSH_DEBUG_SV.log(l_module_name,'p_parent_container_id',p_parent_container_id);
13371    END IF;
13372     -- Check if the parent lpn is a consol LPN
13373 
13374     OPEN c_get_container_info(p_parent_container_id);
13375     FETCH c_get_container_info INTO l_parent_container_info;
13376     IF c_get_container_info%NOTFOUND THEN
13377        CLOSE c_get_container_info;
13378        RAISE WSH_INVALID_PARENT;
13379 
13380     END IF;
13381     CLOSE c_get_container_info;
13382 
13383     -- validate child LPN
13384 
13385     OPEN c_get_container_info(p_child_container_id);
13386     FETCH c_get_container_info INTO l_child_container_info;
13387     IF c_get_container_info%NOTFOUND OR l_child_container_info.container_flag = 'C' THEN
13388        CLOSE c_get_container_info;
13389        RAISE WSH_INVALID_CHILD;
13390     END IF;
13391     CLOSE c_get_container_info;
13392 
13393     IF l_child_container_info.delivery_id = l_parent_container_info.delivery_id THEN
13394 
13395        -- Don't use this API!!!, use API's to pack into content LPNs.
13396        RAISE WSH_INVALID_CONSOL_ASSIGN;
13397 
13398 
13399     END IF;
13400 
13404       WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.container_flag',l_parent_container_info.container_flag);
13401     IF l_debug_on THEN
13402       WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13403       WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13405     END IF;
13406     IF l_parent_container_info.container_flag = 'Y' THEN
13407 
13408     -- This is not a consol LPN, so we need to convert this to a consol before assignment.
13409     -- We consider the following cases:
13410     -- case 1. Neither the parent LPN nor the child LPN is attached to a consol delivery.
13411     --         We need to create a consolidation delivery for both.
13412     -- case 2. The parent LPN, even though not a consol LPN, is attached to
13413     --         a consol delivery, but the child is not.
13414     --         We need to assign the child container's delivery to the parent container's
13415     --         consol delivery.
13416     -- case 3. The child LPN is attached to a consol delivery, but the parent is not.
13417     --         We need to assign the parent container's delivery to the child
13418     --         container's consol delivery.
13419     -- case 4. Both the child and the parent containers have consolidation deliveries,
13420     --         but they do not match.
13421     --         Raise an exception since this is not a valid assignment.
13422     -- case 5. Both the child and the parent container have the same consol delivery.
13423     --         We do not need to do anything (this case is ignored) apart from converting the LPN.
13424 
13425 
13426 
13427        IF l_parent_container_info.parent_delivery_id IS NULL
13428        AND l_child_container_info.parent_delivery_id IS NULL THEN
13429 
13430        -- case 1. Neither the parent LPN nor the child LPN are attached to any consol deliveries.
13431        --         Check if the deliveries are assigned to trips. If they are assigned to
13432        --         the same trip, or if only one of the deliveries has a trip. Check if
13433        --         this trip has a consol delivery. If yes, we can use this consol delivery, else
13434        --         We need to create a consolidation delivery for both.
13435            IF l_debug_on THEN
13436              WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13437              WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13438            END IF;
13439 
13440            -- Check if the trips have consolidation deliveries.
13441            -- Check trip for the parent lpn.
13442            OPEN c_get_trip_info(l_parent_container_info.delivery_id);
13443            FETCH c_get_trip_info INTO l_parent_trip_id, l_parent_consol_del_id;
13444            CLOSE c_get_trip_info;
13445 
13446 
13447            -- Check trip for the child lpn.
13448            OPEN c_get_trip_info(l_child_container_info.delivery_id);
13449            FETCH c_get_trip_info INTO l_child_trip_id, l_child_consol_del_id;
13450            CLOSE c_get_trip_info;
13451 
13452            IF (l_child_trip_id <> l_parent_trip_id) THEN
13453 
13454               RAISE WSH_INVALID_TRIPS;
13455 
13456            END IF;
13457 
13458            IF (l_child_trip_id IS NOT NULL) OR (l_parent_trip_id IS NOT NULL) THEN
13459 
13460                -- Unassign the deliveries from the trip.
13461 
13462                IF l_child_trip_id IS NOT NULL THEN
13463 
13464                   l_unassign_dels(1) := l_child_container_info.delivery_id;
13465 
13466                END IF;
13467                IF l_parent_trip_id IS NOT NULL THEN
13468 
13469                   l_unassign_dels(l_unassign_dels.count + 1) := l_parent_container_info.delivery_id;
13470 
13471                END IF;
13472 
13473                l_child_trip_id := NVL(l_child_trip_id, l_parent_trip_id);
13474 
13475 
13476               IF l_debug_on THEN
13477                  WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TRIPS_ACTIONS.Unassign_Trip',WSH_DEBUG_SV.C_PROC_LEVEL);
13478               END IF;
13479 
13480               WSH_TRIPS_ACTIONS.Unassign_Trip(p_del_rows => l_unassign_dels,
13481                             p_trip_id  => l_child_trip_id,
13482                             x_return_status => l_return_status);
13483 
13484               wsh_util_core.api_post_call
13485                       (
13486                         p_return_status => l_return_status,
13487                         x_num_warnings  => l_num_warnings,
13488                         x_num_errors    => l_num_errors
13489                       );
13490 
13491               l_assign_flag := 'Y';
13492               l_new_parent_delivery_id := NVL(l_parent_consol_del_id, l_child_consol_del_id);
13493               l_del_tab(1) := l_parent_container_info.delivery_id;
13494               l_del_tab(2) := l_child_container_info.delivery_id;
13495            END IF;
13496            IF l_new_parent_delivery_id IS NULL THEN
13497            -- Create a new consolidation delivery.
13498               IF l_debug_on THEN
13499                 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13503               FOR i in 1..2 LOOP
13500                 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13501               END IF;
13502 
13504 
13505                  IF i = 1 THEN
13506                     l_child_delivery_id :=  l_parent_container_info.delivery_id;
13507                  ELSE
13508                     l_child_delivery_id := l_child_container_info.delivery_id;
13509                  END IF;
13510 
13511                  IF l_debug_on THEN
13512                     WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.Populate_Record',WSH_DEBUG_SV.C_PROC_LEVEL);
13513                  END IF;
13514                  WSH_NEW_DELIVERIES_PVT.Populate_Record(
13515                               p_delivery_id => l_child_delivery_id,
13516                               x_delivery_info => l_del_info_tab(i),
13517                               x_return_status => l_return_status);
13518 
13519                  wsh_util_core.api_post_call
13520                       (
13521                         p_return_status => l_return_status,
13522                         x_num_warnings  => l_num_warnings,
13523                         x_num_errors    => l_num_errors
13524                       );
13525                  -- Handle return status
13526 
13527               END LOOP;
13528 
13529 
13530               IF l_debug_on THEN
13531                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_Delivery_Autocreate.Autocreate_Consol_Delivery',WSH_DEBUG_SV.C_PROC_LEVEL);
13532               END IF;
13533               WSH_Delivery_Autocreate.Autocreate_Consol_Delivery(
13534                            p_del_attributes_tab => l_del_info_tab,
13535                            p_caller => p_caller,
13536                            x_parent_del_id => l_new_parent_delivery_id,
13537                            x_parent_trip_id => l_trip_id,
13538                            x_return_status => l_return_status);
13539 
13540               wsh_util_core.api_post_call
13541                       (
13542                         p_return_status => l_return_status,
13543                         x_num_warnings  => l_num_warnings,
13544                         x_num_errors    => l_num_errors
13545                       );
13546            END IF;
13547 
13548        ELSIF  (l_parent_container_info.parent_delivery_id <> l_child_container_info.parent_delivery_id) OR
13549               (l_parent_container_info.parent_delivery_id IS NULL) OR
13550               (l_child_container_info.parent_delivery_id IS NULL) THEN
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           END IF;
13555 
13556           IF l_parent_container_info.parent_delivery_id IS NOT NULL
13557           AND  l_child_container_info.parent_delivery_id IS NULL THEN
13558           -- case 2. The parent LPN, even though not a consol LPN, is attached to
13559           --         a consol delivery, but the child is not.
13560           --         We need to assign the child containers delivery to the parent containers
13561           --         consol delivery.
13562              IF l_debug_on THEN
13563                 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13564                 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13565              END IF;
13566 
13567              l_assign_flag := 'Y';
13568              l_new_parent_delivery_id := l_parent_container_info.parent_delivery_id;
13569              l_del_tab(1) := l_child_container_info.delivery_id;
13570 
13571 
13572           ELSIF l_parent_container_info.parent_delivery_id IS NULL
13573           AND  l_child_container_info.parent_delivery_id IS NOT NULL THEN
13574           -- case 3. The child LPN is attached to a consol delivery, but the parent is not.
13575           --         We need to assign the parent container's delivery to the child
13576           --         containers consol delivery.
13577              IF l_debug_on THEN
13578                 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13579                 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13580              END IF;
13581 
13582 		     l_assign_flag := 'Y';
13583 		     l_new_parent_delivery_id := l_child_container_info.parent_delivery_id;
13584 		     l_del_tab(1) := l_parent_container_info.delivery_id;
13585 
13586 
13587 	  ELSIF l_parent_container_info.parent_delivery_id <> l_child_container_info.parent_delivery_id THEN
13588 	  -- case 4. Both the child and the parent containers have consolidation deliveries
13589 	  --         but they do not match.
13590 	  --         Raise an exception since this is not a valid assignment.
13591 
13592 	     IF l_debug_on THEN
13593 		WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13594 		WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13595 	     END IF;
13599        ELSIF l_child_container_info.parent_delivery_id = l_parent_container_info.parent_delivery_id THEN
13596 	     RAISE WSH_CONSOL_DEL_NO_MATCH;
13597 
13598 	  END IF;
13600           IF l_debug_on THEN
13601              WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13602              WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13603           END IF;
13604 
13605           l_new_parent_delivery_id := l_parent_container_info.parent_delivery_id;
13606 
13607        END IF;
13608 
13609        -- Convert the parent LPN to be a consol LPN.
13610 
13611        -- Get the attributes of the parent delivery
13612        IF l_debug_on THEN
13613 	 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.Populate_Record',WSH_DEBUG_SV.C_PROC_LEVEL);
13614        END IF;
13615 
13616        WSH_NEW_DELIVERIES_PVT.Populate_Record(
13617 			      p_delivery_id => l_new_parent_delivery_id,
13618 			      x_delivery_info => l_parent_del_info_rec,
13619 			      x_return_status => l_return_status);
13620 
13621        wsh_util_core.api_post_call
13622 		      (
13623 			p_return_status => l_return_status,
13624 			x_num_warnings  => l_num_warnings,
13625 			x_num_errors    => l_num_errors
13626 		      );
13627        -- update the LPN with the parents' attributes and set the container_flag to 'C'
13628 
13629        -- Lock the delivery details and assignments.
13630 
13631        BEGIN
13632 	  wsh_delivery_details_pkg.lock_detail_no_compare(p_delivery_detail_id => p_parent_container_id);
13633 	  wsh_delivery_details_pkg.lock_wda_no_compare(p_delivery_detail_id => p_parent_container_id);
13634 	  wsh_delivery_details_pkg.lock_wda_no_compare(p_delivery_detail_id => p_child_container_id);
13635        EXCEPTION
13636 	  WHEN OTHERS THEN
13637 	    x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13638 	    FND_MESSAGE.SET_NAME('WSH','WSH_NO_LOCK');
13639 	    WSH_UTIL_CORE.Add_Message(x_return_status);
13640 	    --
13641 	    -- Debug Statements
13642 	    --
13643 	    IF l_debug_on THEN
13644 	       WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_LOCK exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13645 	       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_LOCK');
13646 	    END IF;
13647 	    RETURN;
13648 	   --
13649        END;
13650 
13651 
13652        update wsh_delivery_details
13653        set container_flag = 'C',
13654 	   ship_to_location_id = l_parent_del_info_rec.ultimate_dropoff_location_id,
13655 	   intmed_ship_to_location_id = l_parent_del_info_rec.intmed_ship_to_location_id,
13656 	   customer_id = l_parent_del_info_rec.customer_id,
13657 	   fob_code = l_parent_del_info_rec.fob_code,
13658 	   freight_terms_code = l_parent_del_info_rec.freight_terms_code,
13659 	   ship_method_code = l_parent_del_info_rec.ship_method_code,
13660 	   carrier_id = l_parent_del_info_rec.carrier_id,
13661 	   mode_of_transport = l_parent_del_info_rec.mode_of_transport,
13662 	   service_level = l_parent_del_info_rec.service_level,
13663 	   deliver_to_location_id = l_parent_del_info_rec.ultimate_dropoff_location_id,
13664 	   line_direction = 'O'
13665        where delivery_detail_id = p_parent_container_id;
13666 
13667 
13668        -- Perform wda conversion.
13669        -- wda picture before conversion
13670 
13671        -----------------------------------------------------------------------
13672        -- | del asg id| del det id| parent det id| del id| parent del id| type
13673        -----------------------------------------------------------------------
13674        -- | 1         | dd1       | lpn1         | d1    | NULL         | S
13675        -----------------------------------------------------------------------
13676        -- | 2         | lpn1      | NULL         | d1    | NULL         | S
13677        -----------------------------------------------------------------------
13678 
13679        -- wda picture after conversion
13680 
13681        -----------------------------------------------------------------------
13682        -- | del asg id| del det id| parent det id| del id| parent del id| type
13683        -----------------------------------------------------------------------
13684        -- | 1         | dd1       | NULL         | d1    | NULL         | O
13685        -----------------------------------------------------------------------
13686        -- | 2         | lpn1      | NULL         | pd1   | NULL         | S
13687        -----------------------------------------------------------------------
13688        -- | 3         | dd1       | lpn1         | d1    | pd1          | C
13689        -----------------------------------------------------------------------
13690 
13691        -- Here we are only converting the parent LPN into a consol LPN, we are not
13692        -- assigning any new children to the parent yet.
13693 
13694        -- Parent container has a consolidation record. Since the parent
13695        -- is now a consol LPN, the consolidation record should be on the
13696        -- topmost children currently assigned to the parent, so we need
13697        -- to delete the parent's consolidation record.
13698 
13699        delete from wsh_delivery_assignments
13700        where delivery_detail_id = p_parent_container_id
13701        and type = 'C';
13702 
13703 
13704        -- Get the current topmost children of the parent LPN.
13705        IF l_debug_on THEN
13709        OPEN c_get_child_details(p_parent_container_id);
13706 	  WSH_DEBUG_SV.log(l_module_name,'p_parent_container_id',p_parent_container_id);
13707        END IF;
13708 
13710        FETCH c_get_child_details BULK COLLECT
13711        INTO l_child_details_tab;
13712        IF l_debug_on THEN
13713 	  WSH_DEBUG_SV.log(l_module_name,'l_child_details_tab.count',l_child_details_tab.count);
13714        END IF;
13715        CLOSE c_get_child_details;
13716 
13717        -- lock the children.
13718 
13719        BEGIN
13720 	  FOR i in 1..l_child_details_tab.count LOOP
13721 	      wsh_delivery_details_pkg.lock_wda_no_compare(p_delivery_detail_id => l_child_details_tab(i));
13722 	  END LOOP;
13723 
13724        EXCEPTION
13725 	  WHEN OTHERS THEN
13726 	    x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13727 	    FND_MESSAGE.SET_NAME('WSH','WSH_NO_LOCK');
13728 	    WSH_UTIL_CORE.Add_Message(x_return_status);
13729 	    --
13730 	    -- Debug Statements
13731 	    --
13732 	    IF l_debug_on THEN
13733 	       WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_LOCK exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13734 	       WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_LOCK');
13735 	    END IF;
13736 	    RETURN;
13737 	   --
13738        END;
13739 
13740        -- Step 1.
13741        -- Update the outer assignment to be 'O', and null out
13742        -- its parent delivery detail id which is now a consolidation LPN.
13743 
13744        FORALL i in 1..l_child_details_tab.count
13745        update wsh_delivery_assignments
13746        set parent_delivery_detail_id = NULL,
13747        type = 'O'
13748        where delivery_detail_id = l_child_details_tab(i)
13749        and NVL(type, 'S') = 'S';
13750 
13751 
13752 
13753        -- Step 2.
13754        -- Now update the consol LPN's delivery assignment to be the consol delivery,
13755        -- and set its parent delivery id to be NULL.
13756 
13757        update wsh_delivery_assignments
13758        set delivery_id = l_new_parent_delivery_id,
13759 	   parent_delivery_id = NULL,
13760 	   type = 'S'
13761        where delivery_detail_id = p_parent_container_id;
13762 
13763        -- Step 3.
13764        -- Create new delivery assignments with type 'C' for all the topmost
13765        -- children of the parent.
13766 
13767        l_del_asg_info_rec.parent_delivery_detail_id := p_parent_container_id;
13768        l_del_asg_info_rec.delivery_id := l_parent_container_info.delivery_id;
13769        l_del_asg_info_rec.parent_delivery_id := l_new_parent_delivery_id;
13770        l_del_asg_info_rec.type := 'C';
13771 
13772        IF l_debug_on THEN
13773          WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_Delivery_Details_PKG.Create_Deliv_Assignment_bulk',WSH_DEBUG_SV.C_PROC_LEVEL);
13774        END IF;
13775        WSH_Delivery_Details_PKG.Create_Deliv_Assignment_bulk(
13776                      p_delivery_assignments_info => l_del_asg_info_rec,
13777                      p_num_of_rec => l_child_details_tab.count,
13778                      p_dd_id_tab => l_child_details_tab,
13779                      x_da_id_tab => l_dummy_asg_tab,
13780                      x_return_status => l_return_status);
13781 
13782        wsh_util_core.api_post_call
13783                       (
13784                         p_return_status => l_return_status,
13785                         x_num_warnings  => l_num_warnings,
13786                         x_num_errors    => l_num_errors
13787                       );
13788        -- Handle return status
13789 
13790     ELSE -- if l_parent_container_info.container_flag = 'C'
13791 
13792     -- The parent is already a consol LPN.
13793     -- this implies that the delivery id of the parent in wda
13794     -- is the consol delivery.
13795 
13796        IF l_child_container_info.parent_delivery_id IS NULL THEN
13797 
13798          -- Assign child delivery to parent's delivery.
13799          -- this will validate the constraints and the deconsol point.
13800 
13801          l_assign_flag := 'Y';
13802          l_del_tab(1) := l_child_container_info.delivery_id;
13803          l_new_parent_delivery_id := l_parent_container_info.delivery_id;
13804 
13805 
13806        ELSIF l_child_container_info.parent_delivery_id <> l_parent_container_info.delivery_id THEN
13807 
13808           -- Error! The child's parent delivery has to be the same as the consol delivery of the parent.
13809 
13810           -- RAISE EXCEPTION;
13811           RAISE WSH_CONSOL_DEL_NO_MATCH;
13812        ELSE
13813 
13814          l_new_parent_delivery_id := l_parent_container_info.delivery_id;
13815 
13816        END IF;
13817 
13818     END IF; -- if l_parent_container_info.container_flag = 'Y'
13819 
13820     -- We now need to make the assignment of deliveries to consol deliveries where
13821     -- one delivery had a consol delivery and the other did not.
13822 
13823     IF l_assign_flag = 'Y' THEN
13824 
13825        -- Assign the unassigned delivery to the consol delivery.
13826        -- This will also validate constraints/deconsol point.
13827 
13828 
13829         FOR i in 1..l_del_tab.count LOOP
13830 
13831             IF l_debug_on THEN
13832                WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.Populate_Record',WSH_DEBUG_SV.C_PROC_LEVEL);
13833             END IF;
13834             WSH_NEW_DELIVERIES_PVT.Populate_Record(
13838 
13835                               p_delivery_id => l_del_tab(i),
13836                               x_delivery_info => l_del_info_tab(i),
13837                               x_return_status => l_return_status);
13839             wsh_util_core.api_post_call
13840                       (
13841                         p_return_status => l_return_status,
13842                         x_num_warnings  => l_num_warnings,
13843                         x_num_errors    => l_num_errors
13844                       );
13845                  -- Handle return status
13846 
13847        END LOOP;
13848 
13849 
13850 
13851 
13852        IF l_debug_on THEN
13853          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);
13854        END IF;
13855        WSH_New_Delivery_Actions.Assign_Del_to_Consol_Del(
13856             p_del_tab         => l_del_info_tab,
13857             p_parent_del_id   => l_new_parent_delivery_id,
13858             p_caller          => p_caller,
13859             x_return_status   => l_return_status);
13860 
13861           -- Handle return status.
13862 
13863         wsh_util_core.api_post_call
13864                       (
13865                         p_return_status => l_return_status,
13866                         x_num_warnings  => l_num_warnings,
13867                         x_num_errors    => l_num_errors
13868                       );
13869 
13870     END IF;
13871 
13872 
13873     -- At this point the parent LPN is a consol LPN and is assigned to a
13874     -- consol delivery. The child LPN is also assigned to the same consol delivery.
13875     -- All we need to do now is to update the child's consolidation record to
13876     -- create the assignment.
13877 
13878     update wsh_delivery_assignments
13879     set parent_delivery_detail_id = p_parent_container_id
13880     where delivery_detail_id = p_child_container_id
13881     and type = 'C';
13882 
13883     -- Handle wt/vol for consol deliveries/LPNs.
13884 /***
13885     IF l_debug_on THEN
13886       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.Container_Weight_Volume',WSH_DEBUG_SV.C_PROC_LEVEL);
13887     END IF;
13888     WSH_WV_UTILS.Container_Weight_Volume (
13889          p_container_instance_id => p_parent_container_id,
13890          p_override_flag         => 'Y',
13891          p_fill_pc_flag          => 'Y',
13892          p_post_process_flag     => 'N',
13893          p_calc_wv_if_frozen     => 'N',
13894          x_gross_weight          => l_cont_gross_weight,
13895          x_net_weight            => l_cont_net_weight,
13896          x_volume                => l_cont_volume,
13897          x_cont_fill_pc          => l_cont_fill_pc,
13898          x_return_status         => l_return_status);
13899 
13900     wsh_util_core.api_post_call
13901                       (
13902                         p_return_status => l_return_status,
13903                         x_num_warnings  => l_num_warnings,
13904                         x_num_errors    => l_num_errors
13905                       );
13906 ***/
13907     -- Need to recalculate the wt/vol for the releated entities.
13908     -- Calculating for the trips would drive all the way to the deliveries and lpns.
13909     IF l_debug_on THEN
13910         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TRIPS_ACTIONS.trip_weight_volume',WSH_DEBUG_SV.C_PROC_LEVEL);
13911     END IF;
13912     OPEN c_get_filled_vol(p_parent_container_id);
13913     FETCH c_get_filled_vol INTO l_filled_volume;
13914     CLOSE c_get_filled_vol;
13915 
13916     OPEN c_get_trip_id(l_new_parent_delivery_id);
13917     FETCH c_get_trip_id INTO l_trip_id_tab(1);
13918     CLOSE c_get_trip_id;
13919     WSH_TRIPS_ACTIONS.trip_weight_volume(
13920           p_trip_rows            => l_trip_id_tab,
13921           p_override_flag        => 'Y',
13922           p_calc_wv_if_frozen    => 'N',
13923           p_start_departure_date => to_date(NULL),
13924           p_calc_del_wv          => 'Y',
13925           x_return_status        => l_return_status,
13926           p_suppress_errors      => 'N');
13927 
13928     UPDATE wsh_delivery_details
13929     SET filled_volume = l_filled_volume
13930     WHERE delivery_detail_id =  p_parent_container_id;
13931 
13932     IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
13933       IF l_debug_on THEN
13934         WSH_DEBUG_SV.logmsg(l_module_name,'Error calculating trip wt/vol');
13935       END IF;
13936     END IF;
13937 /*
13938 
13939     IF l_debug_on THEN
13940       WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.Delivery_Weight_Volume',WSH_DEBUG_SV.C_PROC_LEVEL);
13941     END IF;
13942 
13943     WSH_WV_UTILS.Delivery_Weight_Volume
13944                 ( p_delivery_id    => l_new_parent_delivery_id,
13945                   p_update_flag    => 'Y',
13946                   p_calc_wv_if_frozen => 'N',
13947                   x_gross_weight   => l_gross_wt,
13948                   x_net_weight     => l_net_wt,
13949                   x_volume         => l_volume,
13950                   x_return_status  => l_return_status);
13951 */
13952     wsh_util_core.api_post_call
13953                       (
13954                         p_return_status => l_return_status,
13955                         x_num_warnings  => l_num_warnings,
13959     THEN
13956                         x_num_errors    => l_num_errors);
13957 
13958     IF l_num_errors > 0
13960         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13961     ELSIF l_num_warnings > 0
13962     THEN
13963         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
13964     ELSE
13965         x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13966     END IF;
13967 --
13968 -- Debug Statements
13969 --
13970 IF l_debug_on THEN
13971     WSH_DEBUG_SV.pop(l_module_name);
13972 END IF;
13973 --
13974 
13975 EXCEPTION
13976     WHEN FND_API.G_EXC_ERROR THEN
13977       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13978       --
13979       -- Debug Statements
13980       --
13981       IF l_debug_on THEN
13982           WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13983           WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
13984       END IF;
13985 
13986     WHEN WSH_INVALID_TRIPS THEN
13987       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13988       FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_TRIPS');
13989       WSH_UTIL_CORE.Add_Message(x_return_status);
13990       --
13991       -- Debug Statements
13992       --
13993       IF l_debug_on THEN
13994         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_TRIPS exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13995 
13996         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_TRIPS');
13997       END IF;
13998 
13999     WHEN WSH_NO_CHILD_LPNS THEN
14000       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14001       FND_MESSAGE.SET_NAME('WSH','WSH_NO_CHILD_LPNS');
14002       WSH_UTIL_CORE.Add_Message(x_return_status);
14003       --
14004       -- Debug Statements
14005       --
14006       IF l_debug_on THEN
14007         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_CHILD_LPNS exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14008 
14009         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_CHILD_LPNS');
14010       END IF;
14011 
14012     WHEN WSH_CONSOL_DEL_NO_MATCH THEN
14013       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14014       FND_MESSAGE.SET_NAME('WSH','WSH_CONSOL_DEL_NO_MATCH');
14015       WSH_UTIL_CORE.Add_Message(x_return_status);
14016       --
14017       -- Debug Statements
14018       --
14019       IF l_debug_on THEN
14020         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_CONSOL_DEL_NO_MATCH exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14021 
14022         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_CONSOL_DEL_NO_MATCH');
14023       END IF;
14024 
14025     WHEN WSH_ASSIGN_CONSOL_LPN_ERROR THEN
14026       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14027       FND_MESSAGE.SET_NAME('WSH','WSH_ASSIGN_CONSOL_LPN_ERROR');
14028       WSH_UTIL_CORE.Add_Message(x_return_status);
14029       --
14030       -- Debug Statements
14031       --
14032       IF l_debug_on THEN
14033         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_ASSIGN_CONSOL_LPN_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14034 
14035         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_ASSIGN_CONSOL_LPN_ERROR');
14036       END IF;
14037 
14038     WHEN WSH_INVALID_CONSOL_ASSIGN THEN
14039       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14040       FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONSOL_ASSIGN');
14041       WSH_UTIL_CORE.Add_Message(x_return_status);
14042       --
14043       -- Debug Statements
14044       --
14045       IF l_debug_on THEN
14046         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_CONSOL_ASSIGN exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14047 
14048         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_CONSOL_ASSIGN');
14049       END IF;
14050 
14051     WHEN WSH_INVALID_PARENT THEN
14052       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14053       FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_PARENT');
14054       WSH_UTIL_CORE.Add_Message(x_return_status);
14055       --
14056       -- Debug Statements
14057       --
14058       IF l_debug_on THEN
14059         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_PARENT exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14060 
14061         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_PARENT');
14062       END IF;
14063 
14064     WHEN WSH_INVALID_CHILD THEN
14065       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14066       FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CHILD');
14067       WSH_UTIL_CORE.Add_Message(x_return_status);
14068       --
14069       -- Debug Statements
14070       --
14071       IF l_debug_on THEN
14072         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_CHILD exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14073 
14074         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_CHILD');
14075       END IF;
14076        --
14077 
14078     WHEN OTHERS THEN
14079 
14080       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
14081       wsh_util_core.default_handler('wsh_container_actions.Assign_Container_to_Consol', l_module_name);
14082       IF l_debug_on THEN
14083          WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
14084       END IF;
14085 
14086 END Assign_Container_to_Consol;
14087 
14088 PROCEDURE Unpack_Details_from_Consol
14089                (p_delivery_details_tab IN WSH_UTIL_CORE.ID_TAB_TYPE,
14093 cursor c_check_valid_combination(p_dd_id IN NUMBER) IS
14090                 p_caller               IN VARCHAR2,
14091                 x_return_status       OUT NOCOPY VARCHAR2) IS
14092 
14094 select wdd1.delivery_detail_id,
14095        wdd2.delivery_detail_id,
14096        wdd1.gross_weight,
14097        wdd1.net_weight,
14098        wdd1.volume,
14099        wdd1.weight_uom_code,
14100        wdd1.volume_uom_code,
14101        wdd1.inventory_item_id,
14102        wdd2.weight_uom_code,
14103        wdd2.volume_uom_code
14104 from wsh_delivery_details wdd1,
14105      wsh_delivery_details wdd2,
14106      wsh_delivery_assignments wda,
14107      wsh_new_deliveries wnd
14108 where wdd1.delivery_detail_id = p_dd_id
14109 and wda.delivery_detail_id = wdd1.delivery_detail_id
14110 and wda.type = 'C'
14111 and wda.delivery_id = wnd.delivery_id
14112 and wnd.status_code = 'OP'
14113 and wdd1.container_flag in ('Y', 'N')
14114 and wda.parent_delivery_detail_id = wdd2.delivery_detail_id
14115 and wdd2.container_flag = 'C'
14116 order by wdd2.delivery_detail_id;
14117 
14118 cursor c_check_empty_consol(p_consol_lpn_id in number) is
14119 select delivery_detail_id
14120 from wsh_delivery_assignments
14121 where parent_delivery_detail_id = p_consol_lpn_id
14122 and type = 'C'
14123 and rownum = 1;
14124 
14125 
14126 l_consol_lpn_tab wsh_util_core.id_tab_type;
14127 l_empty_lpn_tab wsh_util_core.id_tab_type;
14128 l_rem_lpn_tab  wsh_util_core.id_tab_type;
14129 
14130 l_cont_gross_weight    NUMBER;
14131 l_cont_net_weight      NUMBER;
14132 l_cont_volume          NUMBER;
14133 l_child_gross_weight    NUMBER;
14134 l_child_net_weight      NUMBER;
14135 l_child_volume          NUMBER;
14136 l_child_inv_item_id     NUMBER;
14137 l_child_weight_UOM      VARCHAR2(30);
14138 l_child_volume_UOM      VARCHAR2(30);
14139 l_parent_weight_UOM      VARCHAR2(30);
14140 l_parent_volume_UOM      VARCHAR2(30);
14141 l_cont_fill_pc         NUMBER;
14142 l_child_dd_id          NUMBER;
14143 l_parent_dd_id          NUMBER;
14144 l_dummy_dd_id          NUMBER;
14145 j                      NUMBER := 0;
14146 k                      NUMBER := 0;
14147 l                      NUMBER := 0;
14148 
14149 l_num_warnings              NUMBER  := 0;
14150 l_num_errors                NUMBER  := 0;
14151 l_return_status             VARCHAR2(30);
14152 
14153 WSH_INVALID_COMBINATION EXCEPTION;
14154 
14155 l_debug_on                    BOOLEAN;
14156 l_module_name        CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'Unpack_Details_from_Consol';
14157 
14158 BEGIN
14159 
14160    l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
14161    --
14162    IF l_debug_on IS NULL
14163    THEN
14164       l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
14165    END IF;
14166    --
14167    IF l_debug_on THEN
14168       WSH_DEBUG_SV.push(l_module_name);
14169       --
14170       WSH_DEBUG_SV.log(l_module_name,'p_caller',p_caller);
14171    END IF;
14172    --
14173 
14174 
14175    FOR i in 1..p_delivery_details_tab.count LOOP
14176 
14177        OPEN c_check_valid_combination(p_delivery_details_tab(i));
14178        FETCH c_check_valid_combination
14179        INTO l_child_dd_id,
14180             l_parent_dd_id,
14181             l_cont_gross_weight,
14182             l_cont_net_weight,
14183             l_cont_volume,
14184             l_child_weight_UOM,
14185             l_child_volume_UOM,
14186             l_child_inv_item_id,
14187             l_parent_weight_UOM,
14188             l_parent_volume_UOM;
14189        IF c_check_valid_combination%NOTFOUND THEN
14190           CLOSE c_check_valid_combination;
14191           RAISE WSH_INVALID_COMBINATION;
14192        END IF;
14193        CLOSE c_check_valid_combination;
14194 
14195        IF i = 1 THEN
14196           j := 1;
14197           l_consol_lpn_tab(j) := l_parent_dd_id;
14198        ELSIF l_parent_dd_id <> l_consol_lpn_tab(j) THEN
14199           j := j +1;
14200           l_consol_lpn_tab(j) := l_parent_dd_id;
14201        END IF;
14202 
14203        -- Lock the delivery assignments.
14204 
14205        BEGIN
14206 
14207           WSH_DELIVERY_DETAILS_PKG.lock_wda_no_compare(p_delivery_detail_id => p_delivery_details_tab(i));
14208 
14209        EXCEPTION
14210          WHEN OTHERS THEN
14211            x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14212            FND_MESSAGE.SET_NAME('WSH','WSH_NO_LOCK');
14213            WSH_UTIL_CORE.Add_Message(x_return_status);
14214            --
14215            -- Debug Statements
14216            --
14217            IF l_debug_on THEN
14218               WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_LOCK exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14219               WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_LOCK');
14220            END IF;
14221            RETURN;
14222            --
14223        END;
14224 
14225 
14226 
14227        -- WMS will update the consol LPN with the decremented wt/vol (LPN convergence).
14228        -- This will also decrement the consol delivery wt/vol. However since the child
14229        -- LPN is still attached to the consol delivery, the consol delivery wt/vol should
14233 
14230        -- not change. So here we put back the child wt/vol onto the consol delivery in
14231        -- anticipation of it being decremented during the WMS call.
14232 
14234        IF l_debug_on THEN
14235           WSH_DEBUG_SV.log(l_module_name,'l_cont_gross_weight',l_cont_gross_weight);
14236           WSH_DEBUG_SV.log(l_module_name,'l_cont_net_weight',l_cont_net_weight);
14237           WSH_DEBUG_SV.log(l_module_name,'l_cont_volume',l_cont_volume);
14238           WSH_DEBUG_SV.log(l_module_name,'l_child_weight_UOM',l_child_weight_UOM);
14239           WSH_DEBUG_SV.log(l_module_name,'l_parent_weight_UOM',l_parent_weight_UOM);
14240           WSH_DEBUG_SV.log(l_module_name,'l_child_volume_UOM',l_child_volume_UOM);
14241           WSH_DEBUG_SV.log(l_module_name,'l_parent_volume_UOM',l_parent_volume_UOM);
14242        END IF;
14243 
14244        -- convert the child UOM to the parent UOMs.
14245 
14246        IF l_child_weight_UOM = l_parent_weight_UOM THEN
14247           l_child_gross_weight := l_cont_gross_weight;
14248           l_child_net_weight   := l_cont_net_weight;
14249        ELSE
14250 
14251           IF NVL(l_cont_gross_weight, 0) = 0 THEN
14252              l_child_gross_weight := 0;
14253           ELSE
14254              IF l_debug_on THEN
14255                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.convert_uom',WSH_DEBUG_SV.C_PROC_LEVEL);
14256                 WSH_DEBUG_SV.log(l_module_name,'l_cont_gross_weight',l_cont_gross_weight);
14257              END IF;
14258              l_child_gross_weight :=
14259              WSH_WV_UTILS.convert_uom(l_child_weight_UOM, l_parent_weight_UOM, l_cont_gross_weight, l_child_inv_item_id);
14260           END IF;
14261           IF NVL(l_cont_net_weight, 0) = 0 THEN
14262              l_child_net_weight := 0;
14263           ELSE
14264              IF l_debug_on THEN
14265                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.convert_uom',WSH_DEBUG_SV.C_PROC_LEVEL);
14266                 WSH_DEBUG_SV.log(l_module_name,'l_cont_net_weight',l_cont_net_weight);
14267              END IF;
14268              l_child_net_weight :=
14269              WSH_WV_UTILS.convert_uom(l_child_weight_UOM, l_parent_weight_UOM, l_cont_net_weight, l_child_inv_item_id);
14270           END IF;
14271 
14272        END IF;
14273        IF l_child_volume_UOM = l_parent_volume_UOM THEN
14274           l_child_volume := l_cont_volume;
14275        ELSE
14276 
14277           IF NVL(l_cont_volume, 0) = 0 THEN
14278              l_child_volume := 0;
14279           ELSE
14280              IF l_debug_on THEN
14281                 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.convert_uom',WSH_DEBUG_SV.C_PROC_LEVEL);
14282                 WSH_DEBUG_SV.log(l_module_name,'l_cont_volume',l_cont_volume);
14283              END IF;
14284              l_child_volume :=
14285              WSH_WV_UTILS.convert_uom(l_child_volume_UOM, l_parent_volume_UOM, l_cont_volume, l_child_inv_item_id);
14286           END IF;
14287 
14288        END IF;
14289 
14290        IF l_debug_on THEN
14291           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
14292        END IF;
14293 
14294        WSH_WV_UTILS.DD_WV_Post_Process(
14295           p_delivery_detail_id => l_parent_dd_id,
14296           p_diff_gross_wt      => l_child_gross_weight,
14297           p_diff_net_wt        => l_child_net_weight,
14298           p_diff_volume        => l_child_volume,
14299           p_diff_fill_volume   => l_child_volume,
14300           x_return_status      => l_return_status);
14301 
14302        WSH_UTIL_CORE.API_Post_Call
14303           (
14304             p_return_status => l_return_status,
14305             x_num_warnings  => l_num_warnings,
14306             x_num_errors    => l_num_errors);
14307 
14308 
14309    END LOOP;
14310 
14311    FORALL i in 1..p_delivery_details_tab.count
14312    update wsh_delivery_assignments
14313    set parent_delivery_detail_id = NULL
14314    where delivery_detail_id = p_delivery_details_tab(i)
14315    and type = 'C';
14316 
14317 
14318 
14319    IF l_num_errors > 0
14320    THEN
14321       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14322    ELSIF l_num_warnings > 0
14323    THEN
14324       x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
14325    ELSE
14326       x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
14327    END IF;
14328 --
14329 -- Debug Statements
14330 --
14331 IF l_debug_on THEN
14332     WSH_DEBUG_SV.pop(l_module_name);
14333 END IF;
14334 
14335 
14336 EXCEPTION
14337   WHEN FND_API.G_EXC_ERROR THEN
14338     x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14339     --
14340     -- Debug Statements
14341     --
14342     IF l_debug_on THEN
14343         WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14344         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
14345     END IF;
14346 
14347 
14348   WHEN WSH_INVALID_COMBINATION THEN
14349         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14350         FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_COMBINATION');
14351         WSH_UTIL_CORE.Add_Message(x_return_status);
14352         --
14353         -- Debug Statements
14354         --
14355         IF l_debug_on THEN
14356         WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_COMBINATION exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14357 
14358         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_COMBINATION');
14359         END IF;
14360         --
14361 
14362   WHEN OTHERS THEN
14363     wsh_util_core.default_handler('wsh_container_actions.unassign_detail_from_consol',l_module_name);
14364       --
14365     IF l_debug_on THEN
14366       wsh_debug_sv.pop(l_module_name, 'EXCEPTION:OTHERS');
14367     END IF;
14368 
14369 END Unpack_Details_from_Consol;
14370 
14371 END wsh_container_actions;