[Home] [Help]
PACKAGE BODY: APPS.WSH_CONTAINER_ACTIONS
Source
1 PACKAGE BODY wsh_container_actions as
2 /* $Header: WSHCMACB.pls 120.27.12020000.3 2013/03/01 00:41:40 adagur ship $ */
3
4 LIMITED_PRECISION NUMBER := 5;
5 c_wms_code_present varchar2(2) := 'Y';
6 -- HW OPMCONV - Removed OPM variable
7
8 G_CALLED_FROM_INBOUND BOOLEAN := FALSE;
9
10 TYPE empty_container_info IS RECORD (
11 container_index NUMBER,
12 container_item_id WSH_DELIVERY_DETAILS.inventory_item_id%TYPE,
13 mast_cont_item_id WSH_DELIVERY_DETAILS.master_container_item_id%TYPE,
14 organization_id WSH_DELIVERY_DETAILS.organization_id%TYPE,
15 group_id NUMBER,
16 numerator NUMBER,
17 denominator NUMBER,
18 empty NUMBER);
19 TYPE empty_container_info_tab IS TABLE OF empty_container_info INDEX BY BINARY_INTEGER;
20 g_empty_cont_tab empty_container_info_tab;
21 g_new_cont_index NUMBER := 0;
22 g_num_cont_index NUMBER := 0;
23
24 TYPE assign_detail_info IS RECORD (
25 container_index NUMBER,
26 gross_weight WSH_DELIVERY_DETAILS.net_weight%TYPE,
27 net_weight WSH_DELIVERY_DETAILS.net_weight%TYPE,
28 volume WSH_DELIVERY_DETAILS.volume%TYPE,
29 delivery_id wsh_delivery_assignments_v.delivery_id%TYPE,
30 delivery_detail_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE,
31 -- J: W/V Changes
32 inventory_item_id WSH_DELIVERY_DETAILS.inventory_item_id%TYPE,
33 weight_uom WSH_DELIVERY_DETAILS.weight_uom_code%TYPE,
34 volume_uom WSH_DELIVERY_DETAILS.volume_uom_code%TYPE,
35 -- K LPN CONV
36 organization_id WSH_DELIVERY_DETAILS.organization_id%TYPE);
37 TYPE assign_detail_info_tab IS TABLE OF assign_detail_info INDEX BY BINARY_INTEGER;
38 g_assign_detail_tab assign_detail_info_tab;
39 g_assign_detail_index NUMBER := 0;
40
41 -- added number_of_containers to the record structure
42 TYPE new_container_info IS RECORD (
43 organization_id WSH_DELIVERY_DETAILS.organization_id%TYPE,
44 container_item_id WSH_DELIVERY_DETAILS.inventory_item_id%TYPE,
45 mast_cont_item_id WSH_DELIVERY_DETAILS.master_container_item_id%TYPE,
46 cont_instance_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE,
47 number_of_containers NUMBER
48 );
49 TYPE new_container_info_tab IS TABLE OF new_container_info INDEX BY BINARY_INTEGER;
50 g_new_container_tab new_container_info_tab;
51
52 -- another temp table to store id
53 -- Store container instance id after Bulk Insert
54 TYPE new_contid_rec IS RECORD (
55 match_id NUMBER,
56 cont_instance_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE,
57 -- J: W/V Changes
58 unit_weight NUMBER,
59 unit_volume NUMBER,
60 weight_uom VARCHAR2(3),
61 volume_uom VARCHAR2(3),
62 item_id NUMBER,
63 -- K LPN CONV
64 organization_id NUMBER
65 );
66 TYPE new_contid_info_tab IS TABLE OF new_contid_rec INDEX BY BINARY_INTEGER;
67 g_new_contid_tab new_contid_info_tab;
68
69 -- Cache Tables
70 TYPE organization_info IS RECORD (
71 process_flag VARCHAR2(1),
72 fill_pc_basis WSH_SHIPPING_PARAMETERS.percent_fill_basis_flag%TYPE);
73 TYPE organization_info_tab IS TABLE OF organization_info INDEX BY BINARY_INTEGER;
74 g_cache_organization_info_tab organization_info_tab;
75
76 /* Organization specific Cache Table */
77 TYPE container_load_info IS RECORD (
78 cont_item_id WSH_CONTAINER_ITEMS.container_item_id%TYPE,
79 max_load_qty WSH_CONTAINER_ITEMS.max_load_quantity%TYPE);
80 TYPE container_load_info_tab IS TABLE OF container_load_info INDEX BY BINARY_INTEGER;
81 g_cache_cont_load_info_tab container_load_info_tab;
82
83 /* Organization specific Cache Table */
84
85 -- valid_flag indicates if this container can be used for packing or not
86 -- inactive containers cannot be used
87 TYPE cont_msi_info IS RECORD (
88 mtl_max_load MTL_SYSTEM_ITEMS.maximum_load_weight%TYPE,
89 mtl_max_vol MTL_SYSTEM_ITEMS.internal_volume%TYPE,
90 mtl_wt_uom MTL_SYSTEM_ITEMS.weight_uom_code%TYPE,
91 mtl_vol_uom MTL_SYSTEM_ITEMS.volume_uom_code%TYPE,
92 valid_flag VARCHAR2(1)
93 );
94 TYPE cont_msi_tab IS TABLE OF cont_msi_info INDEX BY BINARY_INTEGER;
95 g_cont_msi_tab cont_msi_tab;
96
97 C_ERROR_STATUS CONSTANT VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_ERROR;
98 C_WARNING_STATUS CONSTANT VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_WARNING;
99 C_SUCCESS_STATUS CONSTANT VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
100 C_UNEXP_ERROR_STATUS CONSTANT VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
101
102 --
103 G_PKG_NAME CONSTANT VARCHAR2(50) := 'WSH_CONTAINER_ACTIONS';
104 --
105
106 --Bug #3005780 : Added the local function Get_Gcd
107 /*
108 -----------------------------------------------------------------------------
109 FUNCTION : Get_Gcd
110 PARAMETERS : num1 - First Number
111 num2 - Second Number
112 DESCRIPTION : This function finds greatest common devisor for the given
113 Two numbers num1 and num2. If one number is zero then it
114 returns other number as GCD value
115 ------------------------------------------------------------------------------
116 */
117
118 FUNCTION Get_Gcd (num1 IN NUMBER,
119 num2 IN NUMBER) RETURN NUMBER IS
120 temp_int NUMBER;
121 num1_int NUMBER := num1;
122 num2_int NUMBER := num2;
123 BEGIN
124 IF num1_int = 0 THEN return num2_int; END IF;
125 WHILE num2_int <> 0 LOOP
126 temp_int := mod(num1_int,num2_int);
127 num1_int := num2_int;
128 num2_int := temp_int;
129 END LOOP;
130 return num1_int;
131 END Get_Gcd;
132
133 -- bug 3440811
134 /*
135 -----------------------------------------------------------------------------
136 PROCEDURE : Validate_Container
137 PARAMETERS : p_organization_id - Organization Id
138 p_cont_item_id - Container Item Id
139
140 DESCRIPTION : This procedure takes the organization_id and the container's item_id
141 to check if the container is a valid container for packing or not.
142 ------------------------------------------------------------------------------
143 */
144
145 PROCEDURE Validate_Container(
146 p_organization_id IN NUMBER,
147 p_cont_item_id IN NUMBER,
148 x_return_status OUT NOCOPY VARCHAR2)
149 IS
150 CURSOR l_valid_cont_csr (p_cont_item_id NUMBER, p_org_id NUMBER) IS
151 SELECT 'X'
152 FROM MTL_SYSTEM_ITEMS
153 WHERE inventory_item_id = p_cont_item_id
154 AND container_item_flag = 'Y'
155 AND organization_id = p_org_id
156 AND nvl(vehicle_item_flag,'N') = 'N'
157 AND shippable_item_flag = 'Y';
158
159 l_valid_container VARCHAR2(1);
160 l_item_name VARCHAR2(32767);
161 --
162 l_debug_on BOOLEAN;
163 --
164 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'VALIDATE_CONTAINER';
165 --
166
167 BEGIN
168 --
169 --
170 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
171 --
172 IF l_debug_on IS NULL
173 THEN
174 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
175 END IF;
176 --
177 IF l_debug_on THEN
178 WSH_DEBUG_SV.push(l_module_name);
179 WSH_DEBUG_SV.log(l_module_name, 'p_cont_item_id', p_cont_item_id);
180 WSH_DEBUG_SV.log(l_module_name, 'p_organization_id', p_organization_id);
181 END IF;
182
183 x_return_status := wsh_util_core.g_ret_sts_success;
184 IF p_cont_item_id IS NOT NULL THEN
185 --{
186 OPEN l_valid_cont_csr (p_cont_item_id, p_organization_id);
187 FETCH l_valid_cont_csr INTO l_valid_container;
188 IF l_valid_cont_csr%NOTFOUND THEN
189 --{
190 IF l_debug_on THEN
191 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
192 END IF;
193 --
194 l_item_name := WSH_UTIL_CORE.Get_Item_Name(p_cont_item_id,p_organization_id);
195 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_INV_ITEM');
196 FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
197 CLOSE l_valid_cont_csr;
198 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
199
200 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
201 --}
202 ELSE
203 --{
204 CLOSE l_valid_cont_csr;
205 --}
206 END IF;
207 --}
208 END IF;
209
210 IF l_debug_on THEN
211 WSH_DEBUG_SV.pop(l_module_name);
212 END IF;
213 EXCEPTION
214 WHEN Others THEN
215 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Validate_Container',l_module_name);
216 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
217 --
218 IF l_debug_on THEN
219 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
220 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
221 END IF;
222 --
223 END Validate_Container;
224 -- bug 3440811
225
226 /* lpn conv
227 -----------------------------------------------------------------------------
228 PROCEDURE : default_container_attr
229 ------------------------------------------------------------------------------
230 */
231
232 PROCEDURE default_container_attr (
233 P_container_rec IN OUT NOCOPY
234 wsh_glbl_var_strct_grp.Delivery_Details_Rec_Type,
235 p_additional_cont_attr IN wsh_glbl_var_strct_grp.LPNRecordType,
236 p_caller IN VARCHAR2,
237 x_return_status OUT NOCOPY VARCHAR2
238
239 ) IS
240
241 l_wms_org VARCHAR2(5) := 'N';
242
243 CURSOR Get_Cont_Item_Info (v_cont_item_id NUMBER,
244 v_org_id NUMBER,
245 v_wms_org VARCHAR2 ) IS
246 SELECT Description, Container_Type_Code, weight_uom_code, volume_uom_code,
247 minimum_fill_percent, maximum_load_weight, internal_volume, primary_uom_code,
248 -- J: W/V Changes
249 unit_weight, unit_volume
250 FROM MTL_SYSTEM_ITEMS
251 WHERE inventory_item_id = v_cont_item_id
252 AND container_item_flag = 'Y'
253 AND organization_id = v_org_id
254 AND nvl(vehicle_item_flag,'N') = 'N'
255 AND ((shippable_item_flag = 'Y' AND v_wms_org = 'N')
256 OR v_wms_org = 'Y') ;
257
258 -- bug 2828591 - remove the condition since it will prevent user to create container with other status
259 -- AND inventory_item_status_code='Active';
260
261 l_cont_name VARCHAR2(50);
262 i NUMBER;
263 l_description VARCHAR2(240);
264 l_container_type_code VARCHAR2(30);
265 l_wt_uom VARCHAR2(3);
266 l_vol_uom VARCHAR2(3);
267 l_wt_uom_org VARCHAR2(3); --bug 7615765
268 l_vol_uom_org VARCHAR2(3);--bug 7615765
269 l_min_fill_pc NUMBER;
270 l_max_load_wt NUMBER;
271 l_max_vol NUMBER;
272 l_user_id NUMBER;
273 l_last_update_by NUMBER;
274 l_primary_uom VARCHAR2(3);
275 -- J: W/V Changes
276 l_unit_weight NUMBER;
277 l_unit_volume NUMBER;
278 l_row_id VARCHAR2(30);
279 l_org_name VARCHAR2(240);
280 l_item_name VARCHAR2(2000);
281 l_additional_cont_attr wsh_glbl_var_strct_grp.LPNRecordType;
282
283 i NUMBER;
284 j NUMBER;
285 l_return_status VARCHAR2(2);
286 l_num_warnings NUMBER := 0;
287 l_num_errors NUMBER := 0;
288
289 --
290 l_debug_on BOOLEAN;
291 --
292 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'DEFAULT_CONTAINER_ATTR';
293 --
294 BEGIN
295
296 --
297 --
298 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
299 --
300 IF l_debug_on IS NULL
301 THEN
302 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
303 END IF;
304 --
305 IF l_debug_on THEN
306 WSH_DEBUG_SV.push(l_module_name);
307 --
308 WSH_DEBUG_SV.log(l_module_name,'organization_id',P_container_rec.organization_id);
309 WSH_DEBUG_SV.log(l_module_name,'item_id',P_container_rec.inventory_item_id);
310 END IF;
311 --
312
313 -- If one of the wt/vol fields are negative, or if any wt/vol is give
314 -- without their uom, or if any wt/vol's uom is given without value then
315 -- error out.
316
317 l_additional_cont_attr := p_additional_cont_attr;
318
319 IF P_container_rec.volume < 0 OR P_container_rec.filled_volume < 0
320 OR P_container_rec.net_weight < 0 OR P_container_rec.gross_weight < 0
321 OR l_additional_cont_attr.tare_weight < 0
322 THEN --{
323
324 IF l_debug_on THEN --{
325
326 WSH_DEBUG_SV.log(l_module_name,'1 gross_weight',P_container_rec.gross_weight);
327 WSH_DEBUG_SV.log(l_module_name,'net_weight',P_container_rec.net_weight);
328 WSH_DEBUG_SV.log(l_module_name,'tare_weight',l_additional_cont_attr.tare_weight);
329 WSH_DEBUG_SV.log(l_module_name,'volume',P_container_rec.volume);
330 WSH_DEBUG_SV.log(l_module_name,'filled_volume',P_container_rec.filled_volume);
331 END IF; --}
332
333 RAISE FND_API.G_EXC_ERROR;
334
335 ELSIF (nvl(P_container_rec.volume,0) > 0
336 AND P_container_rec.volume_uom_code IS NULL)
337 --OR (P_container_rec.volume IS NULL
338 --AND P_container_rec.volume_uom_code IS NOT NULL )
339 OR (NVL(P_container_rec.filled_volume,0)> 0
340 AND l_additional_cont_attr.filled_volume_uom_code IS NULL )
341 --OR (P_container_rec.filled_volume IS NULL
342 --AND l_additional_cont_attr.filled_volume_uom_code IS NOT NULL )
343 OR (nvl(P_container_rec.gross_weight,0) > 0
344 AND P_container_rec.weight_uom_code IS NULL )
345 --OR (P_container_rec.gross_weight IS NULL
346 --AND P_container_rec.weight_uom_code IS NOT NULL )
347 OR (nvl(P_container_rec.net_weight,0) > 0
348 AND P_container_rec.weight_uom_code IS NULL )
349 --OR (P_container_rec.net_weight IS NULL
350 --AND P_container_rec.weight_uom_code IS NOT NULL )
351 OR (nvl(l_additional_cont_attr.tare_weight,0) > 0
352 AND l_additional_cont_attr.tare_weight_uom_code IS NULL )
353 --OR (l_additional_cont_attr.tare_weight IS NULL
354 --AND l_additional_cont_attr.tare_weight_uom_code IS NOT NULL )
355 THEN --}{
356 IF l_debug_on THEN --{
357
358 WSH_DEBUG_SV.log(l_module_name,'2 gross_weight',P_container_rec.gross_weight);
359 WSH_DEBUG_SV.log(l_module_name,'net_weight',P_container_rec.net_weight);
360 WSH_DEBUG_SV.log(l_module_name,'weight_uom_code',P_container_rec.weight_uom_code);
361 WSH_DEBUG_SV.log(l_module_name,'tare_weight',l_additional_cont_attr.tare_weight);
362 WSH_DEBUG_SV.log(l_module_name,'tare_weight_uom_code',l_additional_cont_attr.tare_weight_uom_code);
363 WSH_DEBUG_SV.log(l_module_name,'volume',P_container_rec.volume);
364 WSH_DEBUG_SV.log(l_module_name,'filled_volume',P_container_rec.filled_volume);
365 WSH_DEBUG_SV.log(l_module_name,'volume_uom_code',P_container_rec.volume_uom_code);
366 WSH_DEBUG_SV.log(l_module_name,'filled_volume_uom',l_additional_cont_attr.filled_volume_uom_code);
367 END IF; --}
368
369 RAISE FND_API.G_EXC_ERROR;
370
371 END IF; --}
372
373 l_wms_org := wsh_util_validate.check_wms_org(P_container_rec.organization_id);
374 IF l_debug_on THEN
375 WSH_DEBUG_SV.log(l_module_name,'l_wms_org',l_wms_org);
376 END IF;
377
378 OPEN Get_Cont_Item_Info (P_container_rec.inventory_item_id,
379 P_container_rec.organization_id,
380 l_wms_org);
381
382 --
383 IF l_debug_on THEN
384 WSH_DEBUG_SV.logmsg(l_module_name, 'GETTING CONTAINER ITEM INFO' );
385 END IF;
386 --
387 FETCH Get_Cont_Item_Info INTO
388 l_description,
389 l_container_type_code,
390 l_wt_uom,
391 l_vol_uom,
392 l_min_fill_pc,
393 l_max_load_wt,
394 l_max_vol,
395 l_primary_uom,
396 l_unit_weight,
397 l_unit_volume;
398
399 IF Get_Cont_Item_Info%NOTFOUND THEN --{
400 --
401 IF NVL(p_caller,'WSH') NOT IN ( 'WSH_PICK_RELEASE', 'WSH_IB_PACK')
402 AND NVL(p_caller,'WSH') NOT LIKE 'WMS%'
403 THEN
404
405 IF l_debug_on THEN
406 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
407 END IF;
408 --
409 l_item_name := WSH_UTIL_CORE.Get_Item_Name(P_container_rec.inventory_item_id,P_container_rec.organization_id);
410 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_INV_ITEM');
411 FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
412 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
413 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
414 END IF;
415
416 CLOSE Get_Cont_Item_Info;
417 -- Bug#: 3362895
418 IF P_container_rec.inventory_item_id IS NOT NULL THEN
419 IF l_debug_on THEN
420 WSH_DEBUG_SV.pop(l_module_name);
421 END IF;
422 --
423 return;
424 END IF;
425
426 -- return; Containers need not have an inventory item
427 -- associated with them. Cross-Docking requirements
428 ELSE --}{
429 CLOSE Get_Cont_Item_Info;
430 END IF; --}
431
432 --
433 IF l_debug_on THEN
434 WSH_DEBUG_SV.log(l_module_name, 'l_vol_uom',l_vol_uom );
435 WSH_DEBUG_SV.log(l_module_name, 'l_wt_uom',l_wt_uom );
436 END IF;
437 IF l_vol_uom IS NULL OR l_wt_uom IS NULL THEN --{
438 IF l_debug_on THEN
439 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.GET_DEFAULT_UOMS',WSH_DEBUG_SV.C_PROC_LEVEL);
440 END IF;
441 --
442 WSH_WV_UTILS.Get_Default_Uoms (
443 P_container_rec.organization_id,
444 -- bug 761576
445 --l_wt_uom,
446 --l_vol_uom,
447 l_wt_uom_org,
448 l_vol_uom_org,
449 l_return_status);
450
451 IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN --{
452 --
453 IF l_debug_on THEN
454 WSH_DEBUG_SV.logmsg(l_module_name, 'ERROR GETTING DEFFAULT UOMS' );
455 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ORG_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
456 END IF;
457 --
458 l_org_name := WSH_UTIL_CORE.Get_Org_Name(P_container_rec.organization_id);
459 FND_MESSAGE.SET_NAME('WSH','WSH_DEFAULT_UOM_ERROR');
460 FND_MESSAGE.SET_TOKEN('ORG_NAME',l_org_name);
461 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
462 --
463 IF l_debug_on THEN
464 WSH_DEBUG_SV.log(l_module_name,'Org Name is ',l_org_name);
465 END IF;
466 --
467 wsh_util_core.api_post_call
468 (
469 p_return_status => l_return_status,
470 x_num_warnings => l_num_warnings,
471 x_num_errors => l_num_errors
472 );
473 END IF; --}
474 --
475 IF l_debug_on THEN
476 WSH_DEBUG_SV.logmsg(l_module_name, 'NO ERRORS AFTER GETTING DEFAULT UOMS' );
477 WSH_DEBUG_SV.logmsg(l_module_name, 'CLOSED GET_CONT_ITEM_INFO' );
478 END IF;
479 --
480
481 --Changes for bug 7615765 Give preference to Container Item attributes
482 IF l_wt_uom IS NULL THEN
483 --{
484 l_wt_uom := l_wt_uom_ORG;
485 IF l_debug_on THEN
486 WSH_DEBUG_SV.logmsg(l_module_name, 'l_wt_uom updated to org dafault value' );
487 WSH_DEBUG_SV.log(l_module_name, 'l_wt_uom',l_wt_uom );
488 END IF;
489 --}
490 END IF;
491
492 IF l_vol_uom IS NULL THEN
493 --{
494 l_vol_uom := l_vol_uom_ORG;
495 IF l_debug_on THEN
496 WSH_DEBUG_SV.logmsg(l_module_name, 'l_vol_uom updated to org dafault value' );
497 WSH_DEBUG_SV.log(l_module_name, 'l_vol_uom',l_vol_uom);
498 END IF;
499 --}
500 END IF;
501
502 END IF; --}
503
504 --converting the uoms
505 p_container_rec.volume_uom_code := NVL(p_container_rec.volume_uom_code,l_vol_uom);
506 l_additional_cont_attr.filled_volume_uom_code := NVL(l_additional_cont_attr.filled_volume_uom_code, l_vol_uom);
507
508 IF p_container_rec.volume_uom_code <> l_vol_uom THEN
509 p_container_rec.volume :=
510 WSH_WV_UTILS.Convert_Uom_core (
511 from_uom => p_container_rec.volume_uom_code,
512 to_uom => l_vol_uom,
513 quantity => p_container_rec.volume,
514 item_id => P_container_rec.inventory_item_id,
515 x_return_status => l_return_status
516 );
517 wsh_util_core.api_post_call
518 (
519 p_return_status => l_return_status,
520 x_num_warnings => l_num_warnings,
521 x_num_errors => l_num_errors
522 );
523 END IF;
524 p_container_rec.volume := NVL(p_container_rec.volume,l_unit_volume);
525 p_container_rec.volume_uom_code := l_vol_uom;
526
527 IF l_additional_cont_attr.filled_volume_uom_code <> l_vol_uom THEN
528 p_container_rec.filled_volume :=
529 WSH_WV_UTILS.Convert_Uom_core (
530 from_uom =>l_additional_cont_attr.filled_volume_uom_code,
531 to_uom =>l_vol_uom,
532 quantity =>p_container_rec.filled_volume,
533 item_id =>P_container_rec.inventory_item_id,
534 x_return_status => l_return_status );
535 wsh_util_core.api_post_call
536 (
537 p_return_status => l_return_status,
538 x_num_warnings => l_num_warnings,
539 x_num_errors => l_num_errors
540 );
541 END IF;
542 p_container_rec.unit_volume := l_unit_volume;
543 --p_container_rec.filled_volume := NVL(p_container_rec.filled_volume,l_unit_volume);
544
545 p_container_rec.weight_uom_code := NVL(p_container_rec.weight_uom_code,l_wt_uom);
546 IF p_container_rec.weight_uom_code <> l_wt_uom THEN
547 p_container_rec.gross_weight :=
548 WSH_WV_UTILS.Convert_Uom_core (
549 from_uom => p_container_rec.weight_uom_code,
550 to_uom => l_wt_uom,
551 quantity => p_container_rec.gross_weight,
552 item_id => P_container_rec.inventory_item_id,
553 x_return_status => l_return_status
554 );
555 wsh_util_core.api_post_call
556 (
557 p_return_status => l_return_status,
558 x_num_warnings => l_num_warnings,
559 x_num_errors => l_num_errors
560 );
561 IF p_container_rec.net_weight is not NULL THEN
562 p_container_rec.net_weight :=
563 WSH_WV_UTILS.Convert_Uom_core (
564 from_uom => p_container_rec.weight_uom_code,
565 to_uom => l_wt_uom,
566 quantity => p_container_rec.net_weight,
567 item_id =>P_container_rec.inventory_item_id,
568 x_return_status => l_return_status);
569 wsh_util_core.api_post_call
570 (
571 p_return_status => l_return_status,
572 x_num_warnings => l_num_warnings,
573 x_num_errors => l_num_errors
574 );
575 END IF;
576 END IF;
577 p_container_rec.weight_uom_code := l_wt_uom;
578
579 IF l_additional_cont_attr.tare_weight_uom_code <> l_wt_uom THEN
580 l_additional_cont_attr.tare_weight :=
581 WSH_WV_UTILS.Convert_Uom_core (
582 from_uom=>l_additional_cont_attr.tare_weight_uom_code,
583 to_uom => l_wt_uom,
584 quantity => l_additional_cont_attr.tare_weight,
585 item_id => P_container_rec.inventory_item_id,
586 x_return_status => l_return_status
587 );
588 wsh_util_core.api_post_call
589 (
590 p_return_status => l_return_status,
591 x_num_warnings => l_num_warnings,
592 x_num_errors => l_num_errors
593 );
594 END IF;
595
596 p_container_rec.gross_weight := NVL(p_container_rec.gross_weight,l_unit_weight);
597 IF p_container_rec.net_weight IS NULL AND l_additional_cont_attr.tare_weight IS NOT NULL THEN
598 p_container_rec.net_weight := p_container_rec.gross_weight
599 - l_additional_cont_attr.tare_weight;
600 END IF;
601
602 --
603 IF l_debug_on THEN
604 WSH_DEBUG_SV.log(l_module_name, 'gross weight', p_container_rec.gross_weight );
605 WSH_DEBUG_SV.log(l_module_name, 'volume', p_container_rec.volume );
606 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.ORG_TO_LOCATION',WSH_DEBUG_SV.C_PROC_LEVEL);
607 END IF;
608 --
609 p_container_rec.ship_from_location_id := WSH_UTIL_CORE.Org_To_Location(p_container_rec.organization_id,TRUE);
610 p_container_rec.container_type_code := NVL(p_container_rec.container_type_code,l_container_type_code);
611 p_container_rec.item_description := l_description;
612 p_container_rec.requested_quantity := 1;
613 p_container_rec.shipped_quantity := null;
614 --
615 IF l_debug_on THEN
616 WSH_DEBUG_SV.logmsg(l_module_name, 'ASSIGNING RQ_UOM' );
617 END IF;
618 --
619 p_container_rec.requested_quantity_uom := l_primary_uom;
620 p_container_rec.wv_frozen_flag := 'N';
621 p_container_rec.unit_weight := l_unit_weight;
622 p_container_rec.maximum_volume := l_max_vol;
623 p_container_rec.maximum_load_weight := l_max_load_wt;
624 --NVL(p_container_rec.maximum_load_weight, l_max_load_wt);
625 p_container_rec.minimum_fill_percent := l_min_fill_pc;
626 --NVL(p_container_rec.minimum_fill_percent,l_min_fill_pc);
627 p_container_rec.source_code := 'WSH';
628 p_container_rec.container_flag := 'Y';
629
630 -- Fix for Bug 1820376 : Containers should have release status as 'X'
631 p_container_rec.released_status := 'X';
632
633
634 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
635
636 --
637 IF l_debug_on THEN
638 WSH_DEBUG_SV.pop(l_module_name);
639 END IF;
640 --
641 EXCEPTION
642 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
643 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
644 IF l_debug_on THEN
645 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle
646 error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
647 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
648 END IF;
649 --
650 WHEN WSH_UTIL_CORE.G_EXC_WARNING THEN
651 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
652 --
653 IF l_debug_on THEN
654 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_UTIL_CORE.G_EXC_WARNING exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
655 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_UTIL_CORE.G_EXC_WARNING'); END IF;
656
657 WHEN FND_API.G_EXC_ERROR THEN
658
659 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
660 --
661 IF l_debug_on THEN
662 WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
663 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
664 END IF;
665 --
666
667 WHEN Others THEN
668 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.default_container_attr',l_module_name);
669 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
670
671 --
672 IF l_debug_on THEN
673 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
674 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
675 END IF;
676 --
677 END default_container_attr;
678
679
680 /*
681 -----------------------------------------------------------------------------
682 PROCEDURE : Create_Cont_Instance_Multi
683 -- This API has been created to Create Multiple Containers
684 -- while Auto Packing, p_num_of_containers specifies how
685 -- many containers need to be created
686 ------------------------------------------------------------------------------
687 */
688
689 PROCEDURE Create_Cont_Instance_Multi (
690 x_cont_name IN OUT NOCOPY VARCHAR2,
691 p_cont_item_id IN NUMBER,
692 x_cont_instance_id IN OUT NOCOPY NUMBER,
693 p_par_detail_id IN NUMBER,
694 p_organization_id IN NUMBER,
695 p_container_type_code IN VARCHAR2,
696 p_num_of_containers IN NUMBER,
697 x_row_id OUT NOCOPY VARCHAR2,
698 --x_row_id will containe the rowid of the first container created.
699 x_return_status OUT NOCOPY VARCHAR2,
700 x_cont_tab OUT NOCOPY WSH_UTIL_CORE.id_tab_type,
701 -- J: W/V Changes
702 x_unit_weight OUT NOCOPY NUMBER,
703 x_unit_volume OUT NOCOPY NUMBER,
704 x_weight_uom_code OUT NOCOPY VARCHAR2,
705 x_volume_uom_code OUT NOCOPY VARCHAR2,
706 p_lpn_id IN NUMBER DEFAULT NULL,
707 p_ignore_for_planning IN VARCHAR2 DEFAULT 'N',
708 p_caller IN VARCHAR2 DEFAULT 'WSH'
709 ) IS
710
711 CURSOR Get_Cont_Item_Info (v_cont_item_id NUMBER, v_org_id NUMBER) IS
712 SELECT Description, Container_Type_Code, weight_uom_code, volume_uom_code,
713 minimum_fill_percent, maximum_load_weight, internal_volume, primary_uom_code,
714 -- J: W/V Changes
715 unit_weight, unit_volume
716 FROM MTL_SYSTEM_ITEMS
717 WHERE inventory_item_id = v_cont_item_id
718 AND container_item_flag = 'Y'
719 AND organization_id = v_org_id
720 AND nvl(vehicle_item_flag,'N') = 'N'
721 AND shippable_item_flag = 'Y';
722 -- bug 2828591 - remove the condition since it will prevent user to create container with other status
723 -- AND inventory_item_status_code='Active';
724
725 CURSOR Get_Cont_Name (v_cont_inst_id NUMBER) IS
726 SELECT container_name
727 FROM WSH_DELIVERY_DETAILS
728 WHERE delivery_detail_id = v_cont_inst_id
729 AND container_flag = 'Y';
730
731 --added cursors
732 CURSOR Get_Wdd_Nextval IS
733 SELECT wsh_delivery_details_s.nextval
734 FROM sys.dual;
735
736 CURSOR Get_Wda_Nextval IS
737 SELECT wsh_delivery_assignments_s.nextval
738 FROM sys.dual;
739
740 l_cont_instance_id NUMBER;
741 l_cont_name VARCHAR2(50);
742 l_description VARCHAR2(240);
743 l_container_type_code VARCHAR2(30);
744 l_min_fill_pc NUMBER;
745 l_max_load_wt NUMBER;
746 l_max_vol NUMBER;
747 l_user_id NUMBER;
748 l_last_update_by NUMBER;
749 l_primary_uom VARCHAR2(3);
750 -- J: W/V Changes
751
752 l_container_rec WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type;
753 l_del_assg_rec WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_Type;
754
755 l_row_id VARCHAR2(30);
756 l_del_assg_id NUMBER;
757
758 l_cont_name VARCHAR2(30);
759 l_org_name VARCHAR2(240);
760
761 l_item_name VARCHAR2(2000);
762 l_cont_rec wsh_container_actions.cont_inst_rec;
763 l_cont_tab wsh_container_actions.cont_inst_tab;
764 i NUMBER;
765 j NUMBER;
766 cnt NUMBER;
767 l_cont_dummy_tab WSH_UTIL_CORE.id_tab_type;
768 l_assignment_dummy_tab WSH_UTIL_CORE.id_tab_type;
769 l_delivery_detail_id NUMBER;
770 --lpn conv
771 l_orig_value VARCHAR2(2);
772 l_orig_update_cont_value VARCHAR2(2);
773 l_net_weight number;
774
775 l_LPN_PREFIX mtl_parameters.LPN_PREFIX%TYPE;
776 l_LPN_SUFFIX mtl_parameters.LPN_SUFFIX%TYPE;
777 l_LPN_STARTING_NUMBER mtl_parameters.LPN_STARTING_NUMBER%TYPE;
778 l_TOTAL_LPN_LENGTH mtl_parameters.TOTAL_LPN_LENGTH%TYPE;
779 --l_cont_names WSH_GLBL_VAR_STRCT_GRP.v50_Tbl_Type;
780 --l_lpn_ids WSH_UTIL_CORE.id_tab_type;
781 l_cont_name_dig number;
782 l_tare_wt NUMBER;
783 l_tare_wt_uom VARCHAR2(10);
784 l_msg_count NUMBER;
785 l_msg_data VARCHAR2(32767);
786 l_container_info_rec WSH_GLBL_VAR_STRCT_GRP.ContInfoRectype;
787 l_gen_lpn_rec WMS_Data_Type_Definitions_pub.AutoCreateLPNRecordType;
788 l_lpn_tbl WMS_Data_Type_Definitions_pub.LPNTableType;
789 l_num_warnings NUMBER := 0;
790 l_num_errors NUMBER := 0;
791 l_return_status VARCHAR2(10);
792 l_additional_cont_attr wsh_glbl_var_strct_grp.LPNRecordType;
793 l_organization_id NUMBER;
794 l_inventory_item_id NUMBER;
795 l_first number;
796 CURSOR c_get_default_parameters (v_organization_id NUMBER) IS
797 SELECT LPN_PREFIX,
798 LPN_SUFFIX,
799 LPN_STARTING_NUMBER ,
800 TOTAL_LPN_LENGTH
801 FROM mtl_parameters
802 WHERE ORGANIZATION_ID = v_organization_id;
803
804 CURSOR c_get_lpn_info(v_lpn_id NUMBER) IS
805 SELECT gross_weight ,
806 GROSS_WEIGHT_UOM_CODE,
807 TARE_WEIGHT_UOM_CODE,
808 TARE_WEIGHT,
809 --container_volume,
810 --CONTAINER_VOLUME_UOM,
811 content_volume, --filled volume
812 CONTENT_VOLUME_UOM_CODE ,
813 locator_id,
814 subinventory_code,
815 license_plate_number ,
816 organization_id,
817 inventory_item_id
818 FROM wms_license_plate_numbers
819 WHERE lpn_id = v_lpn_id;
820
821 CURSOR c_get_lpn_from_history (v_lpn_id number)IS
822 SELECT wlh.LICENSE_PLATE_NUMBER,
823 wlh.organization_id,
824 wlh.inventory_item_id
825 FROM wms_lpn_histories wlh
826 WHERE wlh.lpn_id = v_lpn_id
827 --AND wlh.OPERATION_MODE = 1
828 AND wlh.lpn_context = 7
829 AND wlh.SOURCE_TYPE_ID = 1;
830
831 CURSOR c_get_rowid (v_delivery_detail number) IS
832 SELECT rowid , container_name
833 from wsh_delivery_details
834 WHERE delivery_detail_id = v_delivery_detail;
835
836
837
838
839
840 --
841 l_debug_on BOOLEAN;
842 --
843 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CREATE_CONT_INSTANCE_MULTI';
844 --
845 BEGIN
846
847 --
848 --
849 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
850 --
851 IF l_debug_on IS NULL
852 THEN
853 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
854 END IF;
855 --
856 IF l_debug_on THEN
857 WSH_DEBUG_SV.push(l_module_name);
858 --
859 WSH_DEBUG_SV.log(l_module_name,'X_CONT_NAME',X_CONT_NAME);
860 WSH_DEBUG_SV.log(l_module_name,'P_CONT_ITEM_ID',P_CONT_ITEM_ID);
861 WSH_DEBUG_SV.log(l_module_name,'X_CONT_INSTANCE_ID',X_CONT_INSTANCE_ID);
862 WSH_DEBUG_SV.log(l_module_name,'P_PAR_DETAIL_ID',P_PAR_DETAIL_ID);
863 WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
864 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_TYPE_CODE',P_CONTAINER_TYPE_CODE);
865 END IF;
866 --
867 --
868 IF l_debug_on THEN
869 WSH_DEBUG_SV.logmsg(l_module_name, 'IN CREATE_CONT_INSTANCE_MULTI ' );
870 END IF;
871 --
872
873 l_orig_value := WSH_WMS_LPN_GRP.g_call_group_api;
874 l_orig_update_cont_value := WSH_WMS_LPN_GRP.g_update_to_container;
875 l_inventory_item_id := p_cont_item_id;
876
877 IF p_organization_id IS NULL AND p_lpn_id IS NULL THEN
878 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ORG_NULL');
879 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
880 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
881 --
882 IF l_debug_on THEN
883 WSH_DEBUG_SV.pop(l_module_name);
884 END IF;
885 --
886 return;
887 END IF;
888
889 --lpn conv
890 IF p_lpn_id IS NULL THEN --{
891
892 WSH_WMS_LPN_GRP.g_call_group_api := 'N';
893 WSH_WMS_LPN_GRP.g_update_to_container := 'N';
894
895 IF c_wms_code_present = 'Y' THEN --{
896
897 IF l_debug_on THEN
898 WSH_DEBUG_SV.logmsg(l_module_name,
899 'calling wms_container_grp.Auto_Create_LPNs' );
900 END IF;
901
902 l_gen_lpn_rec.container_item_id := l_inventory_item_id;
903 l_gen_lpn_rec.organization_id := p_organization_id;
904 --l_gen_lpn_rec.lpn_prefix:= l_LPN_PREFIX;
905 --l_gen_lpn_rec.lpn_suffix := l_LPN_SUFFIX;
906 --l_gen_lpn_rec.starting_num := l_LPN_STARTING_NUMBER;
907 --l_gen_lpn_rec.total_length := l_TOTAL_LPN_LENGTH;
908 l_gen_lpn_rec.quantity:= p_num_of_containers;
909
910 wms_container_grp.Auto_Create_LPNs (
911 p_api_version => 1.0
912 , p_init_msg_list => fnd_api.g_false
913 , p_commit => fnd_api.g_false
914 , x_return_status => l_return_status
915 , x_msg_count => l_msg_count
916 , x_msg_data => l_msg_data
917 , p_caller => 'WSH_GENERATE'
918 , p_gen_lpn_rec => l_gen_lpn_rec
919 , p_lpn_table => l_lpn_tbl
920 );
921 wsh_util_core.api_post_call
922 (
923 p_return_status => l_return_status,
924 x_num_warnings => l_num_warnings,
925 x_num_errors => l_num_errors,
926 p_msg_data => l_msg_data
927 );
928 WSH_WMS_LPN_GRP.g_call_group_api := l_orig_value;
929 WSH_WMS_LPN_GRP.g_update_to_container := l_orig_update_cont_value;
930
931 j := 1;
932 i := l_lpn_tbl.first;
933 WHILE i IS NOT NULL LOOP
934 IF l_debug_on THEN
935 WSH_DEBUG_SV.log(l_module_name,'container_name',
936 l_lpn_tbl(i).license_plate_number);
937 WSH_DEBUG_SV.log(l_module_name,'lpn_id',
938 l_lpn_tbl(i).lpn_id);
939 END IF;
940 l_container_info_rec.container_names(j)
941 := l_lpn_tbl(i).license_plate_number;
942 l_container_info_rec.lpn_ids(j) := l_lpn_tbl(i).lpn_id;
943
944 IF (l_container_info_rec.container_names(j) IS NULL) OR (l_container_info_rec.lpn_ids(j) IS NULL )THEN
945 RAISE FND_API.G_EXC_ERROR;
946 END IF;
947
948 i := l_lpn_tbl.NEXT(i);
949 j := J + 1;
950 END LOOP;
951
952 l_container_rec.weight_uom_code :=
953 l_lpn_tbl(1).GROSS_WEIGHT_UOM_CODE;
954 l_container_rec.gross_weight :=
955 l_lpn_tbl(1).GROSS_WEIGHT;
956 l_additional_cont_attr.tare_weight :=
957 l_lpn_tbl(1).TARE_WEIGHT;
958 l_additional_cont_attr.tare_weight_uom_code :=
959 l_lpn_tbl(1).TARE_WEIGHT_UOM_CODE;
960 l_container_rec.volume_uom_code :=
961 l_lpn_tbl(1).CONTAINER_VOLUME_UOM;
962 l_container_rec.volume := l_lpn_tbl(1).CONTAINER_VOLUME;
963 l_additional_cont_attr.filled_volume_uom_code :=
964 l_lpn_tbl(1).CONTENT_VOLUME_UOM_CODE;
965 l_container_rec.filled_volume := l_lpn_tbl(1).CONTENT_VOLUME;
966 l_container_rec.locator_id := l_lpn_tbl(1).locator_id;
967 l_container_rec.subinventory := l_lpn_tbl(1).SUBINVENTORY_CODE;
968
969 ELSE --}{
970 /* commment out this part once the wms code is ready*/
971 OPEN c_get_default_parameters(p_organization_id);
972 FETCH c_get_default_parameters INTO
973 l_LPN_PREFIX,
974 l_LPN_SUFFIX,
975 l_LPN_STARTING_NUMBER ,
976 l_TOTAL_LPN_LENGTH;
977 CLOSE c_get_default_parameters;
978 IF l_TOTAL_LPN_LENGTH IS NOT NULL THEN
979 l_cont_name_dig := length(l_TOTAL_LPN_LENGTH) -
980 nvl(length(l_LPN_SUFFIX),0) -
981 NVL(length(l_LPN_PREFIX),0);
982 IF l_cont_name_dig < 0 THEN
983 l_cont_name_dig := NULL;
984 END IF;
985 END IF;
986 Create_Multiple_Cont_name (
987 p_cont_name => NULL,
988 p_cont_name_pre => l_LPN_PREFIX,
989 p_cont_name_suf => l_LPN_SUFFIX,
990 p_cont_name_num => l_LPN_STARTING_NUMBER,
991 p_cont_name_dig => l_cont_name_dig,
992 p_quantity => p_num_of_containers,
993 x_cont_names => l_container_info_rec.container_names,
994 x_return_status => l_return_status
995 );
996 wsh_util_core.api_post_call
997 (
998 p_return_status => l_return_status,
999 x_num_warnings => l_num_warnings,
1000 x_num_errors => l_num_errors
1001 );
1002 i := l_container_info_rec.container_names.FIRST;
1003 WHILE i IS NOT NULL LOOP
1004 IF l_debug_on THEN
1005 WSH_DEBUG_SV.log(l_module_name,'container_name', l_container_info_rec.container_names(i));
1006 END IF;
1007 l_container_info_rec.lpn_ids(i) := NULL;
1008 i := l_container_info_rec.container_names.NEXT(i);
1009 END LOOP;
1010 END IF ; --} bmso
1011 ELSE --}{
1012 IF p_caller LIKE 'WSH_IB%' THEN --{
1013 l_container_rec.container_name := x_cont_name;
1014 l_organization_id := p_organization_id;
1015 l_inventory_item_id := NULL;
1016 l_container_info_rec.container_names(1) := l_container_rec.container_name;
1017 l_container_info_rec.lpn_ids(1) := p_lpn_id;
1018 ELSE --}{
1019 OPEN c_get_lpn_info(p_lpn_id);
1020 FETCH c_get_lpn_info INTO
1021 l_container_rec.gross_weight,
1022 l_container_rec.weight_uom_code,
1023 l_additional_cont_attr.tare_weight_uom_code,
1024 l_additional_cont_attr.tare_weight,
1025 --l_container_rec.volume,
1026 --l_container_rec.volume_uom_code,
1027 l_container_rec.filled_volume,
1028 l_additional_cont_attr.filled_volume_uom_code,
1029 l_container_rec.locator_id,
1030 l_container_rec.subinventory,
1031 l_container_rec.container_name,
1032 l_organization_id,
1033 l_inventory_item_id;
1034
1035 IF c_get_lpn_info%NOTFOUND THEN
1036 IF l_debug_on THEN
1037 WSH_DEBUG_SV.log(l_module_name,'Error invalid Lpn_id ',
1038 p_lpn_id);
1039 END IF;
1040 RAISE FND_API.G_EXC_ERROR;
1041 END IF;
1042
1043 /*
1044 --compute the net weight
1045 IF (l_inventory_item_id IS NOT NULL)
1046 AND (l_tare_wt IS NOT NULL)
1047 AND (l_tare_wt_uom IS NOT NULL)
1048 AND (l_container_rec.weight_uom_code IS NOT NULL)
1049 AND (l_container_rec.gross_weight IS NOT NULL)
1050 THEN
1051 l_net_weight := l_container_rec.gross_weight
1052 - WSH_WV_UTILS.Convert_Uom (l_tare_wt_uom,
1053 l_container_rec.weight_uom_code,
1054 l_tare_wt,
1055 l_inventory_item_id);
1056 END IF;
1057 IF l_debug_on THEN
1058 WSH_DEBUG_SV.log(l_module_name,'l_net_weight ',l_net_weight);
1059 END IF;
1060 l_container_rec.net_weight:= l_net_weight;
1061 */
1062 l_container_info_rec.container_names(1) := l_container_rec.container_name;
1063 l_container_info_rec.lpn_ids(1) := p_lpn_id;
1064
1065 CLOSE c_get_lpn_info;
1066 END IF; --}
1067
1068 IF p_organization_id IS NULL AND l_organization_id IS NULL THEN
1069 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ORG_NULL');
1070 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1071 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1072 --
1073 IF l_debug_on THEN
1074 WSH_DEBUG_SV.pop(l_module_name);
1075 END IF;
1076 --
1077 return;
1078 END IF;
1079
1080 END IF; --}
1081
1082 l_container_rec.organization_id := NVL(p_organization_id,l_organization_id);
1083 l_container_rec.inventory_item_id := l_inventory_item_id;
1084 l_container_rec.container_type_code := p_container_type_code;
1085 l_container_rec.ignore_for_planning := p_ignore_for_planning;
1086
1087 default_container_attr(l_container_rec,
1088 l_additional_cont_attr ,
1089 p_caller,
1090 l_return_status);
1091
1092 wsh_util_core.api_post_call
1093 (
1094 p_return_status => l_return_status,
1095 x_num_warnings => l_num_warnings,
1096 x_num_errors => l_num_errors
1097 );
1098 --lpn conv
1099
1100
1101
1102 -- Populate Delivery Detail id and Delivery Assignment id
1103 -- within the Loop
1104
1105 IF l_debug_on THEN
1106 WSH_DEBUG_SV.logmsg(l_module_name, 'CREATING DELIVERY DETAIL'||p_num_of_containers );
1107 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.CREATE_DELIVERY_DETAILS_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
1108 END IF;
1109 --
1110
1111
1112 WSH_DELIVERY_DETAILS_PKG.create_delivery_details_bulk
1113 ( p_delivery_details_info => l_container_rec,
1114 p_num_of_rec => p_num_of_containers,
1115 p_container_info_rec => l_container_info_rec,
1116 x_return_status => x_return_status,
1117 x_dd_id_tab => l_cont_dummy_tab
1118 );
1119
1120 --
1121 IF l_debug_on THEN
1122 WSH_DEBUG_SV.logmsg(l_module_name, 'Return status ' || x_return_status);
1123 WSH_DEBUG_SV.logmsg(l_module_name, 'CREATED DELIVERY DETAIL ' || l_cont_dummy_tab.count);
1124 END IF;
1125 --
1126
1127 IF x_return_status IN
1128 (WSH_UTIL_CORE.G_RET_STS_ERROR,
1129 WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ) THEN
1130 --
1131 IF l_debug_on THEN
1132 WSH_DEBUG_SV.logmsg(l_module_name, 'ERROR CREATING CONTAINER' || TO_CHAR ( L_CONT_INSTANCE_ID ) );
1133 END IF;
1134 --
1135 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
1136 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1137 --
1138 IF l_debug_on THEN
1139 WSH_DEBUG_SV.pop(l_module_name);
1140 END IF;
1141 --
1142 return;
1143 END IF;
1144
1145 l_first := l_cont_dummy_tab.FIRST;
1146 OPEN c_get_rowid(l_cont_dummy_tab(l_first));
1147 FETCH c_get_rowid INTO x_row_id, x_cont_name;
1148 CLOSE c_get_rowid;
1149 --
1150 IF l_debug_on THEN
1151 WSH_DEBUG_SV.log(l_module_name, 'x_row_id',x_row_id);
1152 WSH_DEBUG_SV.log(l_module_name, 'x_cont_name',x_cont_name);
1153 WSH_DEBUG_SV.logmsg(l_module_name, 'CREATED CONTAINER DELIVERY DETAIL ');
1154 END IF;
1155 --
1156
1157 l_del_assg_rec.delivery_id := null;
1158 l_del_assg_rec.delivery_detail_id := l_cont_instance_id;
1159 l_del_assg_rec.parent_delivery_detail_id := null;
1160
1161 --
1162 IF l_debug_on THEN
1163 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.CREATE_DELIV_ASSIGNMENT_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
1164 --WSH_DEBUG_SV.logmsg(l_module_name,'NUMBER OF CONTS'||p_num_of_containers);
1165 WSH_DEBUG_SV.logmsg(l_module_name,'NUMBER OF RECORDS IN WDD '||l_cont_dummy_tab.count);
1166 END IF;
1167 --
1168
1169 WSH_DELIVERY_DETAILS_PKG.create_deliv_assignment_bulk
1170 ( p_delivery_assignments_info => l_del_assg_rec,
1171 p_num_of_rec => p_num_of_containers,
1172 p_dd_id_tab => l_cont_dummy_tab,
1173 x_da_id_tab => l_assignment_dummy_tab,
1174 x_return_status => x_return_status
1175 );
1176
1177 IF l_debug_on THEN
1178 WSH_DEBUG_SV.logmsg(l_module_name,'COUNT OF WDA RECORDS'||l_assignment_dummy_tab.count);
1179 WSH_DEBUG_SV.logmsg(l_module_name,'Create Delivery Assignment, Return Status'||x_return_status);
1180 END IF;
1181
1182 IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
1183 WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
1184 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
1185 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1186 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1187 --
1188 IF l_debug_on THEN
1189 WSH_DEBUG_SV.pop(l_module_name);
1190 END IF;
1191 --
1192 return;
1193 END IF;
1194
1195 --x_cont_instance_id := l_cont_instance_id; lpn conv
1196 l_first := l_cont_dummy_tab.FIRST;
1197 IF l_first IS NOT NULL THEN
1198 x_cont_instance_id := l_cont_dummy_tab(l_first);
1199 END IF;
1200 x_cont_tab := l_cont_dummy_tab;
1201 -- J: W/V Changes
1202 x_unit_weight := l_container_rec.unit_weight;
1203 x_unit_volume := l_container_rec.unit_volume;
1204 x_weight_uom_code := l_container_rec.weight_uom_code;
1205 x_volume_uom_code := l_container_rec.volume_uom_code;
1206
1207 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1208
1209 --
1210 IF l_debug_on THEN
1211 WSH_DEBUG_SV.pop(l_module_name);
1212 END IF;
1213 --
1214 EXCEPTION
1215 WHEN FND_API.G_EXC_ERROR THEN
1216 WSH_WMS_LPN_GRP.g_call_group_api := l_orig_value;
1217 WSH_WMS_LPN_GRP.g_update_to_container := l_orig_update_cont_value;
1218 IF c_get_lpn_info%ISOPEN THEN
1219 CLOSE c_get_lpn_info;
1220 END IF;
1221 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1222
1223 IF l_debug_on THEN
1224 WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1225 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
1226 END IF;
1227
1228 WHEN Others THEN
1229 WSH_WMS_LPN_GRP.g_call_group_api := l_orig_value;
1230 WSH_WMS_LPN_GRP.g_update_to_container := l_orig_update_cont_value;
1231 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Create_Cont_Instance_Multi',l_module_name);
1232 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1233
1234 --
1235 IF l_debug_on THEN
1236 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
1237 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
1238 END IF;
1239 --
1240 END Create_Cont_Instance_Multi;
1241
1242 --
1243 /*
1244 -----------------------------------------------------------------------------
1245 PROCEDURE : Create_Container_Instance
1246 PARAMETERS : p_cont_name - name for the container
1247 p_cont_item_id - container item id (containers inv item id)
1248 x_cont_instance_id - delivery_detail_id for new container - if
1249 null then it will return a new id
1250 p_par_detail_id - the parent detail id (parent container)
1251 p_organization_id - organization id
1252 p_container_type_code - the container type code of container
1253 x_row_id - rowid of the new container record
1254 x_return_status - return status of API
1255 DESCRIPTION : This procedure creates a new container and defaults some of the
1256 container item attributes. The container item id of the
1257 container that is being created is required. If the container
1258 name is not specified it defaults the name to be equal to the
1259 delivery detail id.
1260
1261 PLEASE DO NOT USE THIS PROCEDURE ANYMORE
1262
1263 ------------------------------------------------------------------------------
1264 */
1265 --
1266 --THIS PROCEDURE IS OBSOLETE
1267 PROCEDURE Create_Container_Instance (
1268 x_cont_name IN OUT NOCOPY VARCHAR2,
1269 p_cont_item_id IN NUMBER,
1270 x_cont_instance_id IN OUT NOCOPY NUMBER,
1271 p_par_detail_id IN NUMBER,
1272 p_organization_id IN NUMBER,
1273 p_container_type_code IN VARCHAR2,
1274 x_row_id OUT NOCOPY VARCHAR2,
1275 x_return_status OUT NOCOPY VARCHAR2) IS
1276
1277 BEGIN
1278
1279 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1280
1281 END Create_Container_Instance;
1282
1283
1284 /*
1285 -----------------------------------------------------------------------------
1286 PROCEDURE : Create_Multiple_Containers
1287 PARAMETERS : p_cont_item_id - container item id (containers inv item id)
1288 p_organization_id - organization id
1289 p_container_type_code - the container type code of container
1290 p_cont_name - name for the container if qty is 1 (mainly used
1291 by public APIs)
1292 p_cont_name_pre - prefix for container name
1293 p_cont_name_suf - suffix for container name
1294 p_cont_name_num - starting number for number part of container
1295 name
1296 p_cont_name_dig - number of digits to use for the number part
1297 of the container name
1298 p_quantity - number of containers to create
1299 x_cont_instance_tab - table of delivery_detail_ids for new
1300 containers - if null then it will return a
1301 table with new ids
1302 x_return_status - return status of API
1303 DESCRIPTION : This procedure creates a new container and defaults some of the
1304 container item attributes. The container item id of the
1305 container that is being created is required. If the container
1306 name is not specified it defaults the name to be equal to the
1307 delivery detail id.
1308 ------------------------------------------------------------------------------
1309 */
1310
1311 -- THIS PROCEDURE IS OBSOLETE
1312
1313 PROCEDURE Create_Multiple_Containers (
1314 p_cont_item_id IN NUMBER,
1315 p_organization_id IN NUMBER,
1316 p_container_type_code IN VARCHAR2,
1317 p_cont_name IN VARCHAR2,
1318 p_cont_name_pre IN VARCHAR2,
1319 p_cont_name_suf IN VARCHAR2,
1320 p_cont_name_num IN NUMBER,
1321 p_cont_name_dig IN NUMBER,
1322 p_quantity IN NUMBER,
1323 x_cont_instance_tab IN OUT NOCOPY WSH_UTIL_CORE.id_tab_type,
1324 x_return_status OUT NOCOPY VARCHAR2) IS
1325
1326 --
1327 BEGIN
1328
1329 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1330
1331 END Create_Multiple_Containers;
1332
1333
1334 /*
1335 -----------------------------------------------------------------------------
1336 PROCEDURE : Delete_Containers
1337 PARAMETERS : p_cont_tab - table of container instances to be deleted.
1338 x_return_status - return status of API
1339 DESCRIPTION : This procedure in a container instance and
1340 deletes the container. If the containers are not empty or
1341 they are assigned to deliveries that are not open, they will
1342 not be deleted. Also, if the containers are either assigned to
1343 or container other containers packed into it, they will not be
1344 deleted.
1345 ------------------------------------------------------------------------------
1346 */
1347
1348
1349 PROCEDURE Delete_Containers (
1350 p_container_id IN number,
1351 x_return_status OUT NOCOPY VARCHAR2) IS
1352
1353 CURSOR Check_Hierarchy (v_detail_id NUMBER) IS
1354 SELECT 'NOT EMPTY' FROM DUAL
1355 WHERE EXISTS (
1356 SELECT delivery_detail_id
1357 FROM wsh_delivery_assignments
1358 WHERE parent_delivery_detail_id = v_detail_id
1359 AND NVL(type, 'S') in ('C', 'S')
1360 AND rownum < 2
1361 UNION
1362 SELECT delivery_detail_id
1363 FROM wsh_delivery_assignments
1364 WHERE delivery_detail_id = v_detail_id
1365 AND parent_delivery_detail_id IS NOT NULL
1366 AND NVL(type, 'S') in ('C', 'S')
1367 AND rownum < 2);
1368
1369 CURSOR Check_Container (v_detail_id NUMBER) IS
1370 SELECT container_flag
1371 FROM WSH_DELIVERY_DETAILS
1372 WHERE delivery_detail_id = v_detail_id;
1373
1374
1375
1376 l_cont_status VARCHAR2(30) := 'EMPTY';
1377 l_container_flag VARCHAR2(1);
1378
1379 l_del_id NUMBER;
1380 l_del_sts VARCHAR2(10);
1381
1382 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1383
1384
1385 Invalid_Container EXCEPTION;
1386 Invalid_Delivery EXCEPTION;
1387 Invalid_Detail EXCEPTION;
1388 Delete_Det_Error EXCEPTION;
1389 Cont_Not_Empty EXCEPTION;
1390 Container_Error EXCEPTION;
1391 Unassign_Del_Error EXCEPTION;
1392
1393 --
1394 l_debug_on BOOLEAN;
1395 --
1396 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'DELETE_CONTAINERS';
1397 --
1398 BEGIN
1399 --
1400 --
1401 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
1402 --
1403 IF l_debug_on IS NULL
1404 THEN
1405 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
1406 END IF;
1407 --
1408 IF l_debug_on THEN
1409 WSH_DEBUG_SV.push(l_module_name);
1410 --
1411 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_ID',P_CONTAINER_ID);
1412 END IF;
1413 --
1414 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1415 SAVEPOINT Delete_Cont;
1416 IF (NVL(p_container_id,0) = 0) THEN
1417 raise Invalid_Container;
1418 ELSE
1419 OPEN Check_Container (p_container_id);
1420 IF Check_Container%NOTFOUND THEN
1421 raise Invalid_Detail;
1422 ELSE
1423 FETCH Check_Container INTO l_container_flag;
1424 IF l_container_flag = 'N' THEN
1425 raise Invalid_Detail;
1426 END IF;
1427 END IF;
1428 IF Check_Container%ISOPEN THEN
1429 CLOSE Check_Container;
1430 END IF;
1431 END IF;
1432 -- get the delivery status of the container and check if it is assigned
1433 -- to a closed or in-transit delivery (only open deliveries allowed)
1434
1435 --
1436 IF l_debug_on THEN
1437 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
1438 END IF;
1439 --
1440 WSH_CONTAINER_UTILITIES.Get_Delivery_Status (
1441 p_container_id,
1442 l_del_id,
1443 l_del_sts,
1444 x_return_status);
1445
1446 IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
1447 raise Container_Error;
1448 END IF;
1449 IF ((nvl(l_del_id,-99) <> -99) AND (nvl(l_del_sts,'N/A') <> 'OP')) THEN
1450 raise Invalid_Delivery;
1451 END IF;
1452 l_cont_status := 'EMPTY';
1453
1454 OPEN Check_Hierarchy (p_container_id);
1455
1456 FETCH Check_Hierarchy INTO l_cont_status;
1457
1458 IF Check_Hierarchy%NOTFOUND THEN
1459
1460
1461 --
1462 IF l_debug_on THEN
1463 WSH_DEBUG_SV.log(l_module_name,'Delivery Status',l_del_sts);
1464 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.DELETE_DELIVERY_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
1465 END IF;
1466 --
1467 WSH_DELIVERY_DETAILS_PKG.Delete_Delivery_Details (
1468 p_rowid => null,
1469 p_delivery_detail_id => p_container_id,
1470 x_return_status => x_return_status);
1471
1472 --
1473 IF l_debug_on THEN
1474 WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
1475 END IF;
1476 --
1477
1478 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1479 raise Container_Error;
1480 END IF;
1481
1482 ELSE
1483
1484 IF (nvl(l_cont_status,'EMPTY') <> 'EMPTY') THEN
1485 raise Cont_Not_Empty;
1486 ELSE
1487 raise Container_Error;
1488 END IF;
1489 END IF;
1490
1491 IF Check_Hierarchy%ISOPEN THEN
1492 CLOSE Check_Hierarchy;
1493 END IF;
1494
1495
1496 --
1497 IF l_debug_on THEN
1498 WSH_DEBUG_SV.pop(l_module_name);
1499 END IF;
1500 --
1501 EXCEPTION
1502
1503 WHEN Invalid_Container THEN
1504 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NULL_DELETE');
1505 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1506 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1507 --
1508 IF l_debug_on THEN
1509 WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_CONTAINER exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1510 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_CONTAINER');
1511 END IF;
1512 --
1513 WHEN Invalid_Delivery THEN
1514 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
1515 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1516 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1517 --
1518 IF l_debug_on THEN
1519 WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DELIVERY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1520 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_DELIVERY');
1521 END IF;
1522 --
1523 WHEN Invalid_Detail THEN
1524 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DELETE_NOT_CONT');
1525 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1526 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1527 --
1528 IF l_debug_on THEN
1529 WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DETAIL exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1530 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_DETAIL');
1531 END IF;
1532 --
1533 WHEN Cont_Not_Empty THEN
1534 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DELETE_NOT_EMPTY');
1535 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1536 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1537 --
1538 IF l_debug_on THEN
1539 WSH_DEBUG_SV.logmsg(l_module_name,'CONT_NOT_EMPTY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1540 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CONT_NOT_EMPTY');
1541 END IF;
1542 --
1543 WHEN Container_Error THEN
1544 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1545 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DELETE_ERROR');
1546 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1547 --
1548 IF l_debug_on THEN
1549 WSH_DEBUG_SV.logmsg(l_module_name,'CONTAINER_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1550 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CONTAINER_ERROR');
1551 END IF;
1552 --
1553 WHEN Unassign_Del_Error THEN
1554 ROLLBACK to Delete_Cont;
1555 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1556 FND_MESSAGE.SET_NAME('WSH','WSH_UNASSIGN_DEL_ERROR');
1557 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1558
1559 --
1560 IF l_debug_on THEN
1561 WSH_DEBUG_SV.logmsg(l_module_name,'UNASSIGN_DEL_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1562 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:UNASSIGN_DEL_ERROR');
1563 END IF;
1564 --
1565 WHEN Others THEN
1566 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Delete_Containers',l_module_name);
1567 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1568
1569 --
1570 IF l_debug_on THEN
1571 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
1572 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
1573 END IF;
1574 --
1575 END Delete_Containers;
1576
1577 -- THIS PROCEDURE IS OBSOLETE
1578 /*
1579 -----------------------------------------------------------------------------
1580 PROCEDURE : Update_Container
1581 PARAMETERS : p_container_name - new container name that needs to be assigned
1582 to the existing container.
1583 p_container_instance_id - the delivery detail id for the
1584 container that needs to be updated.
1585 p_old_cont_name - exisiting container name for the container,
1586 to be used only if container instance id in the input parameter
1587 is null.
1588 x_return_status - return status of API
1589 DESCRIPTION : This procedure takes in a new container name and existing
1590 container information like the delivery detail id and existing
1591 container name that needs to be updated. The API checks to see
1592 if the container that is being updated is assigned to a closed,
1593 confirmed or in-transit delivery. If it is, no update is
1594 allowed - if not, only the container name can be updated.
1595 ------------------------------------------------------------------------------
1596 */
1597
1598
1599 --THIS PROCEDURE IS OBSOLETE
1600 PROCEDURE Update_Container (
1601 p_container_name IN VARCHAR2,
1602 p_container_instance_id IN NUMBER,
1603 p_old_cont_name IN VARCHAR2,
1604 x_return_status OUT NOCOPY VARCHAR2) IS
1605
1606 BEGIN
1607
1608 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1609
1610 END Update_Container;
1611
1612
1613
1614 /*
1615 -----------------------------------------------------------------------------
1616 PROCEDURE : Assign_Detail
1617 PARAMETERS : p_container_instance_id - container instance id of container
1618 p_del_detail_tab - table of delivery detail ids
1619 x_pack_status - status of container after packing the lines
1620 into it : underpacked or overpacked
1621 x_return_status - return status of API
1622 DESCRIPTION : This procedure assigns a number of lines to the specified
1623 container instance and returns a pack status of underpacked
1624 or overpacked or success.
1625 ------------------------------------------------------------------------------
1626 */
1627
1628
1629 PROCEDURE Assign_Detail(
1630 p_container_instance_id IN NUMBER,
1631 p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
1632 x_pack_status OUT NOCOPY VARCHAR2,
1633 x_return_status OUT NOCOPY VARCHAR2,
1634 p_check_credit_holds IN BOOLEAN) IS
1635
1636 CURSOR Get_First_Line (v_cont_instance_id NUMBER) IS
1637 SELECT delivery_detail_id
1638 FROM wsh_delivery_assignments_v
1639 WHERE parent_delivery_detail_id = v_cont_instance_id
1640 AND rownum < 2;
1641
1642 CURSOR Get_Cont_Item IS
1643 SELECT inventory_item_id, master_serial_number
1644 FROM WSH_DELIVERY_DETAILS
1645 WHERE delivery_detail_id = p_container_instance_id
1646 AND container_flag = 'Y';
1647
1648 CURSOR Get_Det_Cont_Item (v_detail_id NUMBER) IS
1649 SELECT nvl(detail_container_item_id, master_container_item_id),
1650 source_line_id, source_header_id,source_code
1651 FROM WSH_DELIVERY_DETAILS
1652 WHERE delivery_detail_id = v_detail_id
1653 AND container_flag = 'N';
1654
1655 l_del_detail_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
1656
1657 l_group_id_tab WSH_UTIL_CORE.id_tab_type;
1658 -- l_temp_detail_tab WSH_UTIL_CORE.id_tab_type;
1659
1660 l_src_line_id NUMBER;
1661 l_src_hdr_id NUMBER;
1662 l_source_code VARCHAR2(30);
1663
1664 cnt NUMBER;
1665 i NUMBER;
1666 l_group_id NUMBER;
1667
1668 l_del_rows WSH_UTIL_CORE.id_tab_type;
1669 l_ret_sts VARCHAR2(1);
1670
1671 l_cont_name VARCHAR2(30);
1672 l_delivery_id NUMBER;
1673 l_del_status VARCHAR2(10);
1674
1675 l_det_cont_item_id NUMBER;
1676 l_cont_item_id NUMBER;
1677
1678 l_tmp_status VARCHAR2(30) := 'OK';
1679
1680 l_attr_flag VARCHAR2(1) := 'N';
1681
1682 l_upd_flag BOOLEAN := FALSE;
1683
1684 l_master_serial_number VARCHAR2(30);
1685 l_master_cont_id NUMBER;
1686 l_master_cont_name VARCHAR2(30);
1687
1688 l_attr_tab wsh_delivery_autocreate.grp_attr_tab_type;
1689 l_group_tab wsh_delivery_autocreate.grp_attr_tab_type;
1690 l_action_rec wsh_delivery_autocreate.action_rec_type;
1691 l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
1692 l_matched_entities wsh_util_core.id_tab_type;
1693 l_out_rec wsh_delivery_autocreate.out_rec_type;
1694
1695
1696
1697 --
1698 l_debug_on BOOLEAN;
1699 --
1700 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'ASSIGN_DETAIL';
1701 --
1702 BEGIN
1703
1704 --
1705 --
1706 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
1707 --
1708 IF l_debug_on IS NULL
1709 THEN
1710 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
1711 END IF;
1712 --
1713 IF l_debug_on THEN
1714 WSH_DEBUG_SV.push(l_module_name);
1715 --
1716 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
1717 WSH_DEBUG_SV.log(l_module_name,'P_CHECK_CREDIT_HOLDS',P_CHECK_CREDIT_HOLDS);
1718 END IF;
1719 --
1720 IF p_del_detail_tab.COUNT = 0 THEN
1721 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1722 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_DET_ASSG_NULL');
1723 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1724 --
1725 IF l_debug_on THEN
1726 WSH_DEBUG_SV.pop(l_module_name);
1727 END IF;
1728 --
1729 return;
1730 END IF;
1731
1732 -- get the delivery status of the container and check if it is assigned
1733 -- to a closed or in-transit delivery (only open deliveries allowed)
1734
1735 --
1736 IF l_debug_on THEN
1737 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
1738 END IF;
1739 --
1740 WSH_CONTAINER_UTILITIES.Get_Delivery_Status ( p_container_instance_id,
1741 l_delivery_id,
1742 l_del_status,
1743 x_return_status);
1744
1745 IF l_debug_on THEN
1746 WSH_DEBUG_SV.log(l_module_name,'Delivery Status',l_del_status);
1747 WSH_DEBUG_SV.log(l_module_name,'x_return_status',x_return_status);
1748 END IF;
1749 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1750 --
1751 IF l_debug_on THEN
1752 WSH_DEBUG_SV.pop(l_module_name);
1753 END IF;
1754 --
1755 return;
1756 END IF;
1757
1758 IF (nvl(l_delivery_id,-99) <> -99) THEN
1759
1760 IF (nvl(l_del_status,'N/A') NOT IN ('OP','SA')) THEN
1761 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
1762 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1763 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1764 x_pack_status := 'Error';
1765 --
1766 IF l_debug_on THEN
1767 WSH_DEBUG_SV.pop(l_module_name);
1768 END IF;
1769 --
1770 return;
1771 END IF;
1772 END IF;
1773
1774
1775 -- check container attributes to see if the attr columns have been populated
1776 -- if they are not null - it implies that lines are already assigned to the
1777 -- container in the hierarchy. so call the autocreate deliveries API with the
1778 -- container as the first line..
1779
1780 --
1781 IF l_debug_on THEN
1782 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
1783 END IF;
1784 --
1785 wsh_container_actions.Check_Cont_Attributes (
1786 p_container_instance_id,
1787 l_attr_flag,
1788 x_return_status);
1789
1790 --
1791 IF l_debug_on THEN
1792 WSH_DEBUG_SV.log(l_module_name,' after CHECK_CONT_ATTRIBUTES, return status is',x_return_status);
1793 END IF;
1794
1795 --dbms_output.put_line('after check attr for ' || p_container_instance_id || ' attr flag is ' || l_attr_flag || ' and ret sts is ' || x_return_status);
1796
1797 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1798 --
1799 -- Debug Statements
1800 --
1801 IF l_debug_on THEN
1802 WSH_DEBUG_SV.pop(l_module_name);
1803 END IF;
1804 --
1805 return;
1806 END IF;
1807
1808 IF l_attr_flag = 'N' THEN
1809 i := 1;
1810 ELSE
1811 l_attr_tab(1).entity_id := p_container_instance_id;
1812 l_attr_tab(1).entity_type := 'DELIVERY_DETAIL';
1813 i := 2;
1814 END IF;
1815
1816
1817 FOR j IN 1.. p_del_detail_tab.COUNT LOOP
1818 l_attr_tab(i).entity_id := p_del_detail_tab(j);
1819 l_attr_tab(i).entity_type := 'DELIVERY_DETAIL';
1820 i := i + 1;
1821 END LOOP;
1822
1823 IF Get_First_Line%ISOPEN THEN
1824 CLOSE Get_First_Line;
1825 END IF;
1826
1827 -- call auto_create del grouping API with l_temp_detail_tab returning
1828 -- l_group_id_tab of type WSH_UTIL_CORE.id_tab_type;
1829
1830 --
1831 IF l_debug_on THEN
1832 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
1833 END IF;
1834 --
1835 l_action_rec.action := 'MATCH_GROUPS';
1836
1837
1838
1839 WSH_Delivery_AutoCreate.Find_Matching_Groups(p_attr_tab => l_attr_tab,
1840 p_action_rec => l_action_rec,
1841 p_target_rec => l_target_rec,
1842 p_group_tab => l_group_tab,
1843 x_matched_entities => l_matched_entities,
1844 x_out_rec => l_out_rec,
1845 x_return_status => x_return_status);
1846
1847 --
1848 IF (x_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
1849 --dbms_output.put_line('error in autocreate');
1850 FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
1851 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1852 --
1853 END IF;
1854
1855 i := l_attr_tab.FIRST;
1856
1857 l_group_id := l_attr_tab(i).group_id;
1858
1859 -- if l_attr_flag = Y then it means that the first record in the PL/SQL table
1860 -- is the container itself and it should be ignored. so increment counters.
1861
1862 IF l_attr_flag = 'Y' THEN
1863 i := i + 1;
1864 END IF;
1865
1866 l_del_detail_id := l_attr_tab(i).entity_id;
1867 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1868
1869 OPEN Get_Cont_Item;
1870
1871 FETCH Get_Cont_Item INTO l_cont_item_id,l_master_serial_number;
1872
1873 IF Get_Cont_Item%NOTFOUND THEN
1874 CLOSE Get_Cont_Item;
1875 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
1876 --
1877 IF l_debug_on THEN
1878 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
1879 END IF;
1880 --
1881 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
1882 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
1883 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
1884 WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
1885 x_return_status := l_ret_sts;
1886 x_pack_status := 'Error';
1887 --
1888 IF l_debug_on THEN
1889 WSH_DEBUG_SV.pop(l_module_name);
1890 END IF;
1891 --
1892 return;
1893 END IF;
1894
1895 IF Get_Cont_Item%ISOPEN THEN
1896 CLOSE Get_Cont_Item;
1897 END IF;
1898
1899
1900 WHILE i <= l_attr_tab.COUNT LOOP
1901
1902 IF l_group_id = l_attr_tab(i).group_id THEN
1903
1904
1905 l_del_detail_id := l_attr_tab(i).entity_id;
1906 l_src_line_id := NULL;
1907 l_src_hdr_id := NULL;
1908
1909 -- check if the detail container item id on the line matches the
1910 -- container item id of the container that it is being assigned to
1911
1912 OPEN Get_Det_Cont_Item (l_del_detail_id);
1913
1914 FETCH Get_Det_Cont_Item INTO
1915 l_det_cont_item_id,
1916 l_src_line_id,
1917 l_src_hdr_id,l_source_code;
1918
1919 IF Get_Det_Cont_Item%NOTFOUND THEN
1920 CLOSE Get_Det_Cont_Item;
1921 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
1922 l_tmp_status := 'Error';
1923 GOTO next_line;
1924 END IF;
1925
1926 IF Get_Det_Cont_Item%ISOPEN THEN
1927 CLOSE Get_Det_Cont_Item;
1928 END IF;
1929
1930 IF l_cont_item_id <> nvl(l_det_cont_item_id,l_cont_item_id) THEN
1931 FND_MESSAGE.SET_NAME('WSH','WSH_DET_CONT_ITEM_DIFF');
1932 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
1933 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
1934 IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
1935 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
1936 END IF;
1937 END IF;
1938
1939 -- check if the line has any holds on it. IF yes ignore the line
1940 -- and set a warning and proceed to the next line.
1941
1942 --
1943 --
1944 -- added to fix bug 1818233.
1945 -- Auto-pack performs 90% of time doing this check, especially
1946 -- when a single delivery line is being split into multiple due to
1947 -- container-load relationship.
1948 -- This check will be made only once for a delivery line in place of
1949 -- doing it every time we assign a split delivery line to a container.
1950 -- Thus, auto-pack lines will always call assign_detail procedure
1951 -- with parameter p_check_credit_holds = FALSE.
1952 -- Auto-pack lines will explicitly call the procedure
1953 -- WSH_DETAILS_VALIDATIONS.Check_Credit_Holds only once for a delivery
1954 -- line
1955 --
1956 IF p_check_credit_holds
1957 THEN
1958 --
1959 IF l_debug_on THEN
1960 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_CREDIT_HOLDS',WSH_DEBUG_SV.C_PROC_LEVEL);
1961 END IF;
1962 --
1963 WSH_DETAILS_VALIDATIONS.Check_Credit_Holds (
1964 l_del_detail_id,
1965 'PACK',
1966 l_src_line_id,
1967 l_src_hdr_id,
1968 l_source_code,
1969 'Y',
1970 x_return_status);
1971
1972 --
1973 IF l_debug_on THEN
1974 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
1975 END IF;
1976 --
1977 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1978 IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
1979 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
1980 END IF;
1981 l_tmp_status := 'Error';
1982 GOTO next_line;
1983 END IF;
1984 END IF;
1985
1986 -- check if line has any invalid hazmat codes - either by itself
1987 -- or if there is any incompatability with any existing lines in
1988 -- the container.
1989
1990 -- currently there is no code for this and so the API returns a
1991 -- success always..
1992
1993 --
1994 IF l_debug_on THEN
1995 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.VALIDATE_HAZARD_CLASS',WSH_DEBUG_SV.C_PROC_LEVEL);
1996 END IF;
1997 --
1998 WSH_CONTAINER_UTILITIES.Validate_Hazard_Class (
1999 l_del_detail_id,
2000 p_container_instance_id,
2001 x_return_status);
2002
2003 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2004 IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2005 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
2006 END IF;
2007 l_tmp_status := 'Error';
2008 GOTO next_line;
2009 END IF;
2010
2011 -- create assignment with l_del_detail_id and p_container_instance_id;
2012
2013 --
2014 IF l_debug_on THEN
2015 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_DETAIL_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
2016 END IF;
2017 --
2018 WSH_DELIVERY_DETAILS_ACTIONS.Assign_Detail_To_Cont (
2019 l_del_detail_id,
2020 p_container_instance_id,
2021 x_return_status);
2022
2023 --
2024 IF l_debug_on THEN
2025 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2026 END IF;
2027 --
2028 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2029 IF x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
2030 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
2031 ELSE
2032 -- l_ret_sts := x_return_status;
2033 --dbms_output.put_line('error assigning ' || l_del_detail_id);
2034 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
2035 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_DETAIL_NOT_ASSIGNED');
2036 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
2037 WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
2038 END IF;
2039 END IF;
2040
2041 -- store group id to check for group id of next line
2042 -- l_group_id := l_group_id_tab(cnt);
2043
2044 -- now update the container grouping attribute columns with the
2045 -- attributes from the delivery details (only for first line).
2046 -- we need to do this regardless of the fact the the line may have
2047 -- grouping attributes populated as in the case of updating line direction
2048 -- of a container already assigned to a delivery.
2049
2050 IF NOT l_upd_flag THEN
2051
2052 --dbms_output.put_line('calling update cont hierarchy with ' || p_container_instance_id);
2053 --
2054 IF l_debug_on THEN
2055 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
2056 END IF;
2057 --
2058 wsh_container_actions.Update_Cont_Hierarchy (
2059 l_del_detail_id,
2060 NULL,
2061 p_container_instance_id,
2062 x_return_status);
2063 --
2064 IF l_debug_on THEN
2065 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2066 END IF;
2067 --
2068
2069 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2070 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
2071 --
2072 IF l_debug_on THEN
2073 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2074 END IF;
2075 --
2076 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
2077 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2078 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2079 END IF;
2080
2081 l_upd_flag := TRUE;
2082
2083
2084
2085 END IF;
2086
2087 UPDATE WSH_DELIVERY_DETAILS
2088 SET master_serial_number = l_master_serial_number
2089 WHERE delivery_detail_id = l_del_detail_id;
2090
2091 IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2092 --dbms_output.put_line('error updating master serial number for detail ' || l_del_detail_id);
2093
2094 FND_MESSAGE.SET_NAME('WSH','WSH_DET_UPD_SER_ERROR');
2095 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
2096 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2097 IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2098 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
2099 END IF;
2100 END IF;
2101 ELSE
2102
2103 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
2104 l_tmp_status := 'Error';
2105 GOTO next_line;
2106
2107 END IF;
2108
2109 <<next_line>>
2110 IF l_tmp_status = 'Error' THEN
2111 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_DETAIL_NOT_ASSIGNED');
2112 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
2113 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2114 END IF;
2115
2116 i := i + 1;
2117 l_tmp_status := 'OK';
2118
2119 END LOOP;
2120
2121 x_return_status := l_ret_sts;
2122
2123 --
2124 IF l_debug_on THEN
2125 WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
2126 WSH_DEBUG_SV.pop(l_module_name);
2127 END IF;
2128 --
2129 EXCEPTION
2130
2131 WHEN Others THEN
2132 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Assign_Detail',l_module_name);
2133 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
2134
2135 --
2136 IF l_debug_on THEN
2137 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
2138 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
2139 END IF;
2140 --
2141 END Assign_Detail;
2142
2143
2144 /*
2145 -----------------------------------------------------------------------------
2146 PROCEDURE : Unassign_Detail
2147 PARAMETERS : p_container_instance_id - container instance id of container
2148 p_delivery_id - delivery id from which detail needs to be
2149 unassigned
2150 p_del_detail_tab - table of delivery detail ids
2151 p_cont_unassign - flag to determine whether to unassign from
2152 container or not.
2153 p_del_unassign - flag to determine whether to unassign from
2154 delivery or not
2155 x_pack_status - status of container after packing the lines
2156 into it : underpacked or overpacked
2157 x_return_status - return status of API
2158 DESCRIPTION : This procedure unassigns a number of lines from the specified
2159 container instance or delivery and returns a pack status of
2160 underpacked or overpacked or success. The unassigning is
2161 determined using the two unassign flags or by specific ids.
2162 ------------------------------------------------------------------------------
2163 */
2164
2165
2166
2167 PROCEDURE Unassign_Detail(
2168 p_container_instance_id IN NUMBER,
2169 p_delivery_id IN NUMBER,
2170 p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
2171 p_cont_unassign IN VARCHAR2,
2172 p_del_unassign IN VARCHAR2,
2173 x_pack_status OUT NOCOPY VARCHAR2,
2174 x_return_status OUT NOCOPY VARCHAR2,
2175 p_action_prms IN wsh_glbl_var_strct_grp.dd_action_parameters_rec_type
2176 ) IS
2177
2178 l_del_detail_rec WSH_UTIL_CORE.ID_TAB_TYPE;
2179
2180 l_gross NUMBER;
2181 l_net NUMBER;
2182 l_volume NUMBER;
2183 -- J: W/V Changes
2184 l_fill_status VARCHAR2(1);
2185
2186 l_rows NUMBER;
2187
2188 cnt NUMBER;
2189
2190 CURSOR Get_Min_Fill IS
2191 SELECT minimum_fill_percent
2192 FROM WSH_DELIVERY_DETAILS
2193 WHERE delivery_detail_id = p_container_instance_id
2194 AND container_flag = 'Y';
2195
2196 /* wms -change : Added inentory_item_id to later check (ignore) fill pc when LPN */
2197 CURSOR Is_Container (v_detail_id NUMBER) IS
2198 SELECT container_flag, serial_number, master_serial_number, inventory_item_id
2199 FROM WSH_DELIVERY_DETAILS
2200 WHERE delivery_detail_id = v_detail_id;
2201
2202 CURSOR Get_Cont (v_detail_id NUMBER) IS
2203 SELECT wda.parent_delivery_detail_id container_instance_id, wda.delivery_id,
2204 wddp.organization_id, nvl(wddp.line_direction,'O'), -- K LPN CONV. rv
2205 wddp.container_flag -- K: MDC
2206 FROM wsh_delivery_assignments wda,
2207 wsh_delivery_details wddp -- K LPN CONV. rv
2208 WHERE wda.delivery_detail_id = v_detail_id
2209 AND wda.parent_delivery_detail_id = wddp.delivery_detail_id(+)
2210 AND NVL(wda.type, 'S') in ('S', 'C');
2211
2212
2213 l_cont_flag VARCHAR2(1);
2214 l_serial_number VARCHAR2(30);
2215 l_master_serial_number VARCHAR2(30);
2216
2217 l_master_cont_id NUMBER;
2218 l_master_cont_name VARCHAR2(30);
2219
2220 l_cont_name VARCHAR2(30);
2221
2222 l_cont_instance_id NUMBER;
2223 l_cont_org_id NUMBER; -- K LPN CONV. rv
2224 l_cont_line_dir VARCHAR2(10); -- K LPN CONV. rv
2225 l_cnt_org_id NUMBER; -- K LPN CONV. rv
2226 l_delivery_id NUMBER;
2227 l_last_line_flag VARCHAR2(1);
2228 l_attr_flag VARCHAR2(1) := 'N';
2229
2230 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
2231
2232 l_del_status VARCHAR2(10);
2233
2234 l_cont_tab WSH_UTIL_CORE.id_tab_type;
2235 l_cont_org_tab WSH_UTIL_CORE.id_tab_type; -- K LPN CONV. rv
2236 l_cont_line_dir_tab WSH_UTIL_CORE.Column_Tab_Type; -- K LPN CONV. rv
2237
2238 -- K: MDC
2239 l_mdc_index NUMBER := 0;
2240 l_mdc_details WSH_UTIL_CORE.id_tab_type;
2241
2242
2243 l_cont_item_id NUMBER; -- wms change:
2244
2245 l_num_warnings number := 0;
2246
2247 -- K LPN CONV. rv
2248 l_wms_org VARCHAR2(10) := 'N';
2249 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
2250
2251 cursor l_get_cnt_org_csr (p_cnt_inst_id IN NUMBER) is
2252 select organization_id
2253 from wsh_delivery_details
2254 where delivery_detail_id = p_cnt_inst_id;
2255
2256 -- K LPN CONV. rv
2257
2258 --BUG#12904248
2259 l_deliver_to_location_id NUMBER;
2260
2261 --
2262 l_debug_on BOOLEAN;
2263 --
2264 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UNASSIGN_DETAIL';
2265 --
2266 BEGIN
2267
2268 --
2269 --
2270 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
2271 --
2272 IF l_debug_on IS NULL
2273 THEN
2274 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
2275 END IF;
2276 --
2277 IF l_debug_on THEN
2278 WSH_DEBUG_SV.push(l_module_name);
2279 --
2280 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
2281 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
2282 WSH_DEBUG_SV.log(l_module_name,'P_CONT_UNASSIGN',P_CONT_UNASSIGN);
2283 WSH_DEBUG_SV.log(l_module_name,'P_DEL_UNASSIGN',P_DEL_UNASSIGN);
2284 END IF;
2285 --
2286 IF p_del_detail_tab.count = 0 THEN
2287 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_ASSG_NULL');
2288 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2289 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2290 --
2291 IF l_debug_on THEN
2292 WSH_DEBUG_SV.pop(l_module_name);
2293 END IF;
2294 --
2295 return;
2296 END IF;
2297
2298 cnt := 0;
2299
2300 FOR i IN 1..p_del_detail_tab.count LOOP
2301
2302 -- get the delivery status of the container and check if it is assigned
2303 -- to a closed or in-transit delivery (only open deliveries allowed)
2304 OPEN Get_Cont (p_del_detail_tab(i));
2305 FETCH Get_Cont INTO l_cont_instance_id, l_delivery_id,
2306 l_cont_org_id, l_cont_line_dir, -- K LPN CONV. rv
2307 l_cont_flag; -- K: MDC
2308
2309 IF Get_Cont%NOTFOUND THEN
2310 CLOSE Get_Cont;
2311 GOTO next_detail;
2312 END IF;
2313 IF Get_Cont%ISOPEN THEN
2314 CLOSE Get_Cont;
2315 END IF;
2316
2317 --
2318 IF l_debug_on THEN
2319 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
2320 END IF;
2321 --
2322 WSH_CONTAINER_UTILITIES.Get_Delivery_Status (
2323 l_cont_instance_id,
2324 l_delivery_id,
2325 l_del_status,
2326 x_return_status);
2327
2328 --
2329 IF l_debug_on THEN
2330 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2331 END IF;
2332 --
2333 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2334 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2335 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2336 END IF;
2337 GOTO next_detail;
2338 END IF;
2339
2340 IF (nvl(l_delivery_id,-99) <> -99) THEN
2341
2342 IF (nvl(l_del_status,'N/A') <> 'OP')
2343 AND NVL(p_action_prms.caller,'!!!!') NOT LIKE '%' || WSH_UTIL_CORE.C_SPLIT_DLVY_SUFFIX -- J-IB-NPARIKH
2344 THEN
2345 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
2346 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2347 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2348 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2349 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2350 END IF;
2351 x_pack_status := 'Error';
2352 GOTO next_detail;
2353 END IF;
2354 END IF;
2355 IF l_cont_instance_id IS NOT NULL AND l_cont_flag = 'C' THEN
2356 l_mdc_index := l_mdc_index + 1;
2357 l_mdc_details(l_mdc_index) := p_del_detail_tab(i);
2358 ELSE
2359 cnt := cnt + 1;
2360 l_del_detail_rec(cnt) := p_del_detail_tab(i);
2361 l_cont_tab(cnt) := l_cont_instance_id; -- K LPN CONV. rv
2362 l_cont_org_tab(cnt) := l_cont_org_id; -- K LPN CONV. rv
2363 l_cont_line_dir_tab(cnt) := l_cont_line_dir; -- K LPN CONV. rv
2364 END IF;
2365 <<next_detail>>
2366 null;
2367
2368 END LOOP;
2369
2370 IF l_mdc_index > 0 THEN
2371 IF l_debug_on THEN
2372 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Unpack_Details_from_Consol',WSH_DEBUG_SV.C_PROC_LEVEL);
2373 END IF;
2374 Unpack_Details_from_Consol
2375 (p_delivery_details_tab => l_mdc_details,
2376 p_caller => 'WMS_UNASSIGN_CONSOL',
2377 x_return_status => x_return_status);
2378
2379 IF l_debug_on THEN
2380 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2381 END IF;
2382 --
2383 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2384 IF x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
2385 l_num_warnings := l_num_warnings + 1;
2386 ELSE
2387 --
2388 IF l_debug_on THEN
2389 WSH_DEBUG_SV.pop(l_module_name);
2390 END IF;
2391 --
2392 return;
2393 END IF;
2394 END IF;
2395
2396 IF cnt = 0 THEN
2397 return;
2398 END IF;
2399
2400 END IF;
2401 --
2402 IF l_debug_on THEN
2403 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_MULTIPLE_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
2404 END IF;
2405 --
2406 WSH_DELIVERY_DETAILS_ACTIONS.Unassign_Multiple_Details (
2407 l_del_detail_rec,
2408 p_del_unassign,
2409 p_cont_unassign,
2410 x_return_status,
2411 null,
2412 p_action_prms);
2413
2414 --
2415 IF l_debug_on THEN
2416 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2417 END IF;
2418 --
2419 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2420 IF x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
2421 l_num_warnings := l_num_warnings + 1;
2422 ELSE
2423 -- FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_UNASSG_ERROR');
2424 -- WSH_UTIL_CORE.Add_Message(x_return_status);
2425 --
2426 IF l_debug_on THEN
2427 WSH_DEBUG_SV.pop(l_module_name);
2428 END IF;
2429 --
2430 return;
2431 END IF;
2432 END IF;
2433
2434 -- fetch the container for each line and update the attr columns if it is
2435 -- the last line in the container hierarchy..
2436
2437 FOR i IN 1..l_del_detail_rec.count LOOP
2438
2439 IF l_cont_tab(i) IS NULL THEN
2440 -- not assigned to a container.
2441 GOTO next_line;
2442 END IF;
2443
2444 -- K LPN CONV. rv
2445 l_wms_org := wsh_util_validate.check_wms_org(l_cont_org_tab(i));
2446 -- K LPN CONV. rv
2447
2448 IF l_debug_on THEN
2449 WSH_DEBUG_SV.log(l_module_name,'l_wms_org',l_wms_org);
2450 END IF;
2451 --dbms_output.put_line('calling last assigned line for ' || l_del_detail_rec(i));
2452
2453 --
2454 IF l_debug_on THEN
2455 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.LAST_ASSIGNED_LINE',WSH_DEBUG_SV.C_PROC_LEVEL);
2456 END IF;
2457 --
2458 wsh_container_actions.Last_Assigned_Line (
2459 l_del_detail_rec(i),
2460 l_cont_tab(i),
2461 l_last_line_flag,
2462 x_return_status);
2463
2464 --
2465 IF l_debug_on THEN
2466 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2467 END IF;
2468 --
2469 IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
2470 WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
2471 ) THEN
2472 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_LAST_LINE_ERROR');
2473 --
2474 IF l_debug_on THEN
2475 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2476 END IF;
2477 --
2478 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i));
2479 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2480 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2481 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2482 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2483 END IF;
2484 GOTO next_line;
2485 END IF;
2486
2487 --dbms_output.put_line('calling check cont attr with ' || l_cont_tab(i));
2488
2489 --
2490 IF l_debug_on THEN
2491 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
2492 END IF;
2493 --
2494 wsh_container_actions.Check_Cont_Attributes (
2495 l_cont_tab(i),
2496 l_attr_flag,
2497 x_return_status);
2498 --
2499 IF l_debug_on THEN
2500 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2501 END IF;
2502 --
2503
2504 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2505 --dbms_output.put_line('after check cont attr status is ' || x_return_status);
2506 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
2507 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2508 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2509 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2510 END IF;
2511 GOTO next_line;
2512 END IF;
2513
2514 --dbms_output.put_line(' last line flag is ' || l_last_line_flag || ' attr flag ' || l_attr_flag || ' and delivery_id ' || l_delivery_id || ' before updating cont ' || l_cont_tab(i));
2515
2516
2517 IF (nvl(l_last_line_flag,'N') = 'Y') AND (nvl(l_attr_flag,'N') = 'Y') AND (nvl(l_delivery_id,-99) = -99) THEN
2518
2519 --dbms_output.put_line('updating attr to null for ' || l_cont_tab(i));
2520
2521
2522 --
2523 -- K LPN CONV. rv
2524 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
2525 AND l_cont_line_dir_tab(i) IN ('O','IO')
2526 AND
2527 (
2528 (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
2529 OR
2530 (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
2531 )
2532 THEN
2533 --{
2534 l_sync_tmp_rec.delivery_detail_id := l_cont_tab(i);
2535 l_sync_tmp_rec.operation_type := 'UPDATE';
2536 WSH_WMS_SYNC_TMP_PKG.MERGE
2537 (
2538 p_sync_tmp_rec => l_sync_tmp_rec,
2539 x_return_status => l_return_status
2540 );
2541
2542 IF l_debug_on THEN
2543 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
2544 END IF;
2545 --
2546 --
2547 IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
2548 --
2549 GOTO next_line;
2550 --
2551 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
2552 --
2553 l_num_warnings := l_num_warnings + 1;
2554 --
2555 END IF;
2556 --
2557 --}
2558 END IF;
2559 -- K LPN CONV. rv
2560
2561 UPDATE WSH_DELIVERY_DETAILS
2562 SET customer_id = NULL,
2563 ship_to_location_id = NULL,
2564 intmed_ship_to_location_id = NULL,
2565 fob_code = NULL,
2566 freight_terms_code = NULL,
2567 ship_method_code = NULL,
2568 carrier_id = NULL,
2569 mode_of_transport = NULL,
2570 service_level = NULL,
2571 deliver_to_location_id = NULL,
2572 line_direction = DECODE(line_direction,'IO','O',line_direction), -- J-IB-NPARIKH
2573 client_id = NULL -- LSP PROJECT :
2574 WHERE delivery_detail_id = l_cont_tab(i);
2575
2576 IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2577 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
2578 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
2579 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2580 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2581 END IF;
2582 GOTO next_line;
2583 END IF;
2584
2585 --
2586 IF l_debug_on THEN
2587 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
2588 END IF;
2589 --
2590 wsh_container_actions.Update_Cont_Hierarchy (
2591 l_cont_tab(i),
2592 NULL,
2593 l_cont_tab(i),
2594 x_return_status);
2595 --
2596 IF l_debug_on THEN
2597 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2598 END IF;
2599 --
2600
2601 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2602 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
2603 --
2604 IF l_debug_on THEN
2605 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2606 END IF;
2607 --
2608 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i));
2609 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2610 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2611 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2612 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2613 END IF;
2614 GOTO next_line;
2615 END IF;
2616
2617 END IF;
2618
2619 OPEN Is_Container (l_del_detail_rec(i));
2620
2621 FETCH Is_Container INTO
2622 l_cont_flag,
2623 l_serial_number,
2624 l_master_serial_number,
2625 l_cont_item_id;
2626
2627 IF Is_Container%NOTFOUND THEN
2628 CLOSE Is_Container;
2629 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
2630 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_rec(i));
2631 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
2632 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2633 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2634 END IF;
2635 GOTO next_line;
2636 END IF;
2637
2638 IF Is_Container%ISOPEN THEN
2639 CLOSE Is_Container;
2640 END IF;
2641
2642 IF l_cont_flag = 'N' THEN --{
2643 --
2644 IF l_debug_on THEN
2645 WSH_DEBUG_SV.log(l_module_name,'l_cont_flag',l_cont_flag);
2646 WSH_DEBUG_SV.log(l_module_name,'delivery_detail_id',l_del_detail_rec(i));
2647 END IF;
2648 --
2649 UPDATE wsh_delivery_details --bug 5165197
2650 SET master_serial_number = NULL
2651 WHERE delivery_detail_id = l_del_detail_rec(i);
2652 --
2653 ELSIF l_cont_flag = 'Y' THEN --}{
2654
2655 --
2656 IF l_debug_on THEN
2657 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
2658 END IF;
2659 --
2660 WSH_CONTAINER_UTILITIES.Get_Delivery_Status (
2661 l_del_detail_rec(i),
2662 l_delivery_id,
2663 l_del_status,
2664 x_return_status);
2665 --
2666 IF l_debug_on THEN
2667 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2668 END IF;
2669 --
2670
2671 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2672 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2673 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2674 END IF;
2675 GOTO next_line;
2676 END IF;
2677
2678 IF (nvl(l_delivery_id,-99) <> -99) THEN --{
2679
2680 IF (nvl(l_del_status,'N/A') <> 'OP') THEN
2681 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
2682 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2683 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2684 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2685 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2686 END IF;
2687 x_pack_status := 'Error';
2688 GOTO next_line;
2689 END IF;
2690 END IF; --}
2691
2692 -- Bug 8925387 .. Removed the goto next_line statement,since master serial number has to be updated irrespect of delivery exist or not.
2693 -- Last_Assigned_Line and Check_Cont_Attributes will be called only if the container belongs to a delivery.
2694 IF (nvl(l_delivery_id,-99) = -99) THEN --{ Delivery Check
2695 --
2696 IF l_debug_on THEN
2697 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.LAST_ASSIGNED_LINE',WSH_DEBUG_SV.C_PROC_LEVEL);
2698 END IF;
2699 --
2700 wsh_container_actions.Last_Assigned_Line (
2701 NULL,
2702 l_del_detail_rec(i),
2703 l_last_line_flag,
2704 x_return_status);
2705 --
2706 IF l_debug_on THEN
2707 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2708 END IF;
2709 --
2710
2711 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN --{
2712 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_LAST_LINE_ERROR');
2713 --
2714 IF l_debug_on THEN
2715 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2716 END IF;
2717 --
2718 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2719 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2720 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2721
2722 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2723 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2724 END IF;
2725 GOTO next_line;
2726 END IF; --}
2727
2728 --dbms_output.put_line('calling check cont attr with ' || l_del_detail_rec(i));
2729
2730 --
2731 IF l_debug_on THEN
2732 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
2733 END IF;
2734 --
2735 wsh_container_actions.Check_Cont_Attributes (
2736 l_del_detail_rec(i),
2737 l_attr_flag,
2738 x_return_status);
2739 --
2740 IF l_debug_on THEN
2741 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2742 END IF;
2743 --
2744
2745 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN --{
2746 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
2747 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2748
2749 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2750 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2751 END IF;
2752 GOTO next_line;
2753 END IF; --}
2754 END IF; --} Delivery Check
2755
2756
2757 IF (nvl(l_last_line_flag,'N') = 'Y') AND (nvl(l_attr_flag,'N') = 'Y') AND (nvl(l_delivery_id,-99) = -99) THEN --{
2758 --
2759 -- K LPN CONV. rv
2760 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
2761 AND l_cont_line_dir_tab(i) IN ('O','IO')
2762 AND
2763 (
2764 (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
2765 OR
2766 (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
2767 )
2768 THEN
2769 --{
2770 l_sync_tmp_rec.delivery_detail_id := l_del_detail_rec(i);
2771 l_sync_tmp_rec.operation_type := 'UPDATE';
2772 WSH_WMS_SYNC_TMP_PKG.MERGE
2773 (
2774 p_sync_tmp_rec => l_sync_tmp_rec,
2775 x_return_status => l_return_status
2776 );
2777
2778 IF l_debug_on THEN
2779 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
2780 END IF;
2781 --
2782 --
2783 --
2784 IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
2785 --
2786 GOTO next_line;
2787 --
2788 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
2789 --
2790 l_num_warnings := l_num_warnings + 1;
2791 --
2792 END IF;
2793 --
2794 --}
2795 END IF;
2796 -- K LPN CONV. rv
2797
2798 UPDATE WSH_DELIVERY_DETAILS
2799 SET customer_id = NULL,
2800 ship_to_location_id = NULL,
2801 intmed_ship_to_location_id = NULL,
2802 fob_code = NULL,
2803 freight_terms_code = NULL,
2804 ship_method_code = NULL,
2805 service_level = NULL,
2806 carrier_id = NULL,
2807 mode_of_transport = NULL,
2808 deliver_to_location_id = NULL,
2809 line_direction = DECODE(line_direction,'IO','O',line_direction), -- J-IB-NPARIKH
2810 client_id = NULL -- LSP PROJECT
2811 WHERE delivery_detail_id = l_del_detail_rec(i);
2812
2813 IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2814 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
2815 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
2816 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2817 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2818 END IF;
2819 GOTO next_line;
2820 END IF;
2821
2822 --
2823 IF l_debug_on THEN
2824 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
2825 END IF;
2826 --
2827 wsh_container_actions.Update_Cont_Hierarchy (
2828 l_del_detail_rec(i),
2829 NULL,
2830 l_del_detail_rec(i),
2831 x_return_status);
2832 --
2833 IF l_debug_on THEN
2834 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2835 END IF;
2836 --
2837
2838 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN --{
2839 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
2840 --
2841 IF l_debug_on THEN
2842 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2843 END IF;
2844 --
2845 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2846 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2847 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2848 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2849 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2850 END IF;
2851 GOTO next_line;
2852 END IF; --}
2853
2854 END IF;--}
2855
2856 -- update child containers of the current hierarchy that was
2857 -- unassigned with the serial number of the current top most
2858 -- container..
2859 --
2860 -- K LPN CONV. rv
2861 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
2862 AND l_cont_line_dir_tab(i) IN ('O','IO')
2863 AND
2864 (
2865 (WSH_WMS_LPN_GRP.GK_WMS_UPD_MISC and l_wms_org = 'Y')
2866 OR
2867 (WSH_WMS_LPN_GRP.GK_INV_UPD_MISC and l_wms_org = 'N')
2868 )
2869 THEN
2870 --{
2871 l_sync_tmp_rec.delivery_detail_id := l_del_detail_rec(i);
2872 l_sync_tmp_rec.operation_type := 'UPDATE';
2873 WSH_WMS_SYNC_TMP_PKG.MERGE
2874 (
2875 p_sync_tmp_rec => l_sync_tmp_rec,
2876 x_return_status => l_return_status
2877 );
2878
2879 IF l_debug_on THEN
2880 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
2881 END IF;
2882 --
2883 --
2884 --
2885 IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
2886 --
2887 GOTO next_line;
2888 --
2889 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
2890 --
2891 l_num_warnings := l_num_warnings + 1;
2892 --
2893 END IF;
2894 --
2895 --}
2896 END IF;
2897 -- K LPN CONV. rv
2898
2899 UPDATE WSH_DELIVERY_DETAILS
2900 SET master_serial_number = serial_number
2901 WHERE delivery_detail_id = l_del_detail_rec(i);
2902
2903 IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2904 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CHILD_UPD_ERROR');
2905 --
2906 IF l_debug_on THEN
2907 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2908 END IF;
2909 --
2910 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2911 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2912 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2913 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2914 END IF;
2915 GOTO next_line;
2916 END IF;
2917
2918 --
2919 IF l_debug_on THEN
2920 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_SERIAL_NUMBER',WSH_DEBUG_SV.C_PROC_LEVEL);
2921 END IF;
2922 --
2923 WSH_CONTAINER_UTILITIES.Get_Master_Serial_Number (
2924 l_del_detail_rec(i),
2925 l_master_serial_number,
2926 x_return_status);
2927 --
2928 IF l_debug_on THEN
2929 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2930 END IF;
2931 --
2932
2933 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2934 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GET_SRL_ERROR');
2935 --
2936 IF l_debug_on THEN
2937 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2938 END IF;
2939 --
2940 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2941 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2942 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2943 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2944 END IF;
2945 GOTO next_line;
2946 END IF;
2947
2948 --
2949 IF l_debug_on THEN
2950 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
2951 END IF;
2952 --
2953 WSH_CONTAINER_UTILITIES.Update_Child_Containers (
2954 l_del_detail_rec(i),
2955 l_master_cont_name,
2956 l_master_serial_number,
2957 x_return_status);
2958 --
2959 IF l_debug_on THEN
2960 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2961 END IF;
2962 --
2963
2964 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2965 --
2966 IF l_debug_on THEN
2967 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2968 END IF;
2969 --
2970 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2971 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
2972 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2973 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2974 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2975 --
2976 IF l_debug_on THEN
2977 WSH_DEBUG_SV.pop(l_module_name);
2978 END IF;
2979 --
2980 return;
2981 END IF;
2982
2983 END IF; --}
2984
2985 <<next_line>>
2986 null;
2987
2988 END LOOP;
2989
2990 -- J: W/V Changes
2991 IF (p_container_instance_id is not null and l_cont_item_id IS NOT NULL) THEN
2992
2993 -- LPN CONV. rv
2994 open l_get_cnt_org_csr(p_container_instance_id);
2995 fetch l_get_cnt_org_csr into l_cnt_org_id;
2996
2997 l_wms_org := 'N';
2998
2999 IF l_cnt_org_id is NOT NULL THEN
3000 l_wms_org := wsh_util_validate.check_wms_org(l_cnt_org_id);
3001 END IF;
3002 close l_get_cnt_org_csr;
3003
3004 -- LPN CONV. rv
3005 IF NOT(
3006 l_wms_org = 'Y' AND nvl(wsh_wms_lpn_grp.g_caller,'WSH') like 'WMS%'
3007 )
3008 THEN
3009 --{
3010 WSH_WV_UTILS.Check_Fill_Pc (
3011 p_container_instance_id => p_container_instance_id,
3012 x_fill_status => l_fill_status,
3013 x_return_status => l_return_status);
3014
3015 IF l_fill_status = 'O' THEN
3016
3017 IF l_debug_on THEN
3018 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3019 END IF;
3020 --
3021 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
3022 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_OVERPACKED');
3023 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3024 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
3025 WSH_UTIL_CORE.Add_Message(l_return_status);
3026 x_pack_status := 'Overpacked';
3027
3028 ELSIF l_fill_status = 'U' THEN
3029 IF l_debug_on THEN
3030 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3031 END IF;
3032 --
3033 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
3034 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UNDERPACKED');
3035 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3036 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
3037 WSH_UTIL_CORE.Add_Message(l_return_status);
3038 x_pack_status := 'Underpacked';
3039 ELSE
3040 x_pack_status := 'Success';
3041 END IF;
3042 --}
3043 END IF;
3044 END IF;
3045
3046 --BUG#12904248
3047 FOR i IN 1..l_cont_tab.count LOOP
3048 IF l_debug_on THEN
3049 WSH_DEBUG_SV.log(l_module_name,'l_cont_tab.count',l_cont_tab(i));
3050 END IF;
3051
3052 Get_Deliver_To_Location(
3053 p_container_id => l_cont_tab(i),
3054 x_deliver_to_location_id => l_deliver_to_location_id,
3055 x_return_status => l_return_status);
3056
3057 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3058
3059 UPDATE wsh_delivery_details
3060 SET deliver_to_location_id = l_deliver_to_location_id
3061 WHERE delivery_detail_id = l_cont_tab(i);
3062 END IF;
3063
3064 END LOOP;
3065
3066 IF l_num_warnings > 0 THEN
3067 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
3068 ELSE
3069 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3070 END IF;
3071
3072 --
3073 IF l_debug_on THEN
3074 WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3075 WSH_DEBUG_SV.pop(l_module_name);
3076 END IF;
3077 --
3078 EXCEPTION
3079
3080 WHEN Others THEN
3081 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Unassign_Detail',l_module_name);
3082 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3083
3084 --
3085 IF l_debug_on THEN
3086 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
3087 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3088 END IF;
3089 --
3090 END Unassign_Detail;
3091
3092 -------------------------------------------------------------------
3093 -- This procedure is only for backward compatibility. No one should call
3094 -- this procedure.
3095 -------------------------------------------------------------------
3096
3097 PROCEDURE Unassign_Detail(
3098 p_container_instance_id IN NUMBER,
3099 p_delivery_id IN NUMBER,
3100 p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
3101 p_cont_unassign IN VARCHAR2,
3102 p_del_unassign IN VARCHAR2,
3103 x_pack_status OUT NOCOPY VARCHAR2,
3104 x_return_status OUT NOCOPY VARCHAR2) IS
3105
3106
3107 --
3108 l_debug_on BOOLEAN;
3109 --
3110 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UNASSIGN_DETAIL';
3111 --
3112 l_action_prms wsh_glbl_var_strct_grp.dd_action_parameters_rec_type;
3113 BEGIN
3114
3115 --
3116 --
3117 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3118 --
3119 IF l_debug_on IS NULL
3120 THEN
3121 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3122 END IF;
3123 --
3124 IF l_debug_on THEN
3125 WSH_DEBUG_SV.push(l_module_name);
3126 --
3127 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3128 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3129 WSH_DEBUG_SV.log(l_module_name,'P_CONT_UNASSIGN',P_CONT_UNASSIGN);
3130 WSH_DEBUG_SV.log(l_module_name,'P_DEL_UNASSIGN',P_DEL_UNASSIGN);
3131 END IF;
3132 --
3133 --
3134 IF l_debug_on THEN
3135 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.Unassign_Detail',WSH_DEBUG_SV.C_PROC_LEVEL);
3136 END IF;
3137 --
3138 Unassign_Detail
3139 (
3140 p_container_instance_id,
3141 p_delivery_id,
3142 p_del_detail_tab,
3143 p_cont_unassign,
3144 p_del_unassign,
3145 x_pack_status,
3146 x_return_status,
3147 l_action_prms
3148 );
3149 --
3150 IF l_debug_on THEN
3151 WSH_DEBUG_SV.pop(l_module_name);
3152 END IF;
3153 --
3154 EXCEPTION
3155
3156 WHEN Others THEN
3157 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Unassign_Detail',l_module_name);
3158 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3159 --
3160 IF l_debug_on THEN
3161 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3162 END IF;
3163 --
3164 END Unassign_Detail;
3165 /*
3166 -----------------------------------------------------------------------------
3167 PROCEDURE : Assign_To_Delivery
3168 PARAMETERS : p_container_instance_id - container instance id of container
3169 p_delivery_id - delivery id
3170 x_return_status - return status of API
3171 -- x_dlvy_has_lines : 'Y' :delivery has non-container lines.
3172 -- 'N' : delivery does not have non-container lines
3173 -- x_dlvy_freight_Terms_code : Delivery's freight term code
3174 DESCRIPTION : This procedure checks to see if a container can be assigned to
3175 the specified delivery and returns a success or failure.
3176 ------------------------------------------------------------------------------
3177 */
3178
3179
3180 PROCEDURE Assign_To_Delivery(
3181 p_container_instance_id IN NUMBER,
3182 p_delivery_id IN NUMBER,
3183 x_return_status OUT NOCOPY VARCHAR2,
3184 x_dlvy_has_lines IN OUT NOCOPY VARCHAR2, -- J-IB-NPARIKH
3185 x_dlvy_freight_terms_code IN OUT NOCOPY VARCHAR2 -- J-IB-NPARIKH
3186 ) IS
3187
3188 -- remove this cursor for Bug
3189 CURSOR Get_First_Line (v_cont_instance_id NUMBER) IS
3190 SELECT delivery_detail_id
3191 FROM wsh_delivery_assignments_v
3192 WHERE parent_delivery_detail_id = v_cont_instance_id
3193 AND rownum < 2;
3194 -- remove this cursor for Bug
3195
3196 CURSOR Get_Cont_Org (v_cont_instance_id NUMBER) IS
3197 SELECT organization_id
3198 FROM WSH_DELIVERY_DETAILS
3199 WHERE delivery_detail_id = v_cont_instance_id
3200 AND container_flag = 'Y';
3201
3202 CURSOR Get_Del_Org (v_del_id NUMBER) IS
3203 SELECT organization_id, freight_terms_code
3204 FROM WSH_NEW_DELIVERIES
3205 WHERE delivery_id = v_del_id;
3206
3207 l_del_detail_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
3208
3209 l_cont_org NUMBER;
3210 l_del_org NUMBER;
3211
3212 l_cont_name VARCHAR2(30);
3213 l_del_name VARCHAR2(30);
3214 --
3215 --
3216 l_has_lines VARCHAR2(1);
3217 l_dlvy_freight_terms_code VARCHAR2(30);
3218 --
3219 --
3220 l_debug_on BOOLEAN;
3221 --
3222 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'ASSIGN_TO_DELIVERY';
3223 --
3224 BEGIN
3225
3226 --
3227 --
3228 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3229 --
3230 IF l_debug_on IS NULL
3231 THEN
3232 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3233 END IF;
3234 --
3235 IF l_debug_on THEN
3236 WSH_DEBUG_SV.push(l_module_name);
3237 --
3238 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3239 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3240 END IF;
3241 --
3242 OPEN Get_Cont_Org (p_container_instance_id);
3243
3244 FETCH Get_Cont_Org INTO l_cont_org;
3245
3246 IF Get_Cont_Org%NOTFOUND THEN
3247 CLOSE Get_Cont_Org;
3248 --
3249 IF l_debug_on THEN
3250 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3251 END IF;
3252 --
3253 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
3254 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
3255 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3256 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3257 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3258 --
3259 IF l_debug_on THEN
3260 WSH_DEBUG_SV.pop(l_module_name);
3261 END IF;
3262 --
3263 return;
3264 END IF;
3265
3266 CLOSE Get_Cont_Org;
3267
3268
3269 OPEN Get_Del_Org (p_delivery_id);
3270
3271 FETCH Get_Del_Org INTO l_del_org, l_dlvy_freight_terms_code;
3272
3273 IF Get_Del_Org%NOTFOUND THEN
3274 CLOSE Get_Del_Org;
3275 --
3276 IF l_debug_on THEN
3277 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.GET_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3278 END IF;
3279 --
3280 l_del_name := WSH_NEW_DELIVERIES_PVT.Get_Name(p_delivery_id);
3281 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DEL');
3282 FND_MESSAGE.SET_TOKEN('DEL_NAME',l_del_name);
3283 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3284 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3285 --
3286 IF l_debug_on THEN
3287 WSH_DEBUG_SV.pop(l_module_name);
3288 END IF;
3289 --
3290 return;
3291 END IF;
3292
3293 CLOSE Get_Del_Org;
3294
3295
3296 -- just check for organization id match and create assignment
3297 IF l_cont_org = l_del_org THEN
3298
3299 --
3300 IF l_debug_on THEN
3301 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CREATE_DELIVERY_ASSIGNMENT',WSH_DEBUG_SV.C_PROC_LEVEL);
3302 END IF;
3303 --
3304 wsh_container_actions.Create_Delivery_Assignment(
3305 p_container_instance_id,
3306 p_delivery_id,
3307 x_return_status,
3308 x_dlvy_has_lines,
3309 x_dlvy_freight_terms_code
3310 );
3311
3312 --
3313 IF l_debug_on THEN
3314 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3315 END IF;
3316 --
3317
3318 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3319 --
3320 IF l_debug_on THEN
3321 WSH_DEBUG_SV.pop(l_module_name);
3322 END IF;
3323 --
3324 return;
3325 END IF;
3326 ELSE
3327 --
3328 IF l_debug_on THEN
3329 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3330 END IF;
3331 --
3332 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
3333 --
3334 IF l_debug_on THEN
3335 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.GET_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3336 END IF;
3337 --
3338 l_del_name := WSH_NEW_DELIVERIES_PVT.Get_Name(p_delivery_id);
3339 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_ORG_DIFF');
3340 FND_MESSAGE.SET_TOKEN('ENTITY1',l_cont_name);
3341 FND_MESSAGE.SET_TOKEN('ENTITY2',l_del_name);
3342 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3343 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3344 --
3345 IF l_debug_on THEN
3346 WSH_DEBUG_SV.pop(l_module_name);
3347 END IF;
3348 --
3349 return;
3350 END IF;
3351
3352
3353 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3354
3355 --
3356 IF l_debug_on THEN
3357 WSH_DEBUG_SV.pop(l_module_name);
3358 END IF;
3359 --
3360 EXCEPTION
3361
3362 WHEN Others THEN
3363 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Assign_To_Delivery',l_module_name);
3364 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3365
3366 --
3367 IF l_debug_on THEN
3368 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
3369 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3370 END IF;
3371 --
3372 END Assign_To_Delivery;
3373
3374 -------------------------------------------------------------------
3375 -- This procedure is only for backward compatibility. No one should call
3376 -- this procedure.
3377 -------------------------------------------------------------------
3378
3379 PROCEDURE Assign_To_Delivery(
3380 p_container_instance_id IN NUMBER,
3381 p_delivery_id IN NUMBER,
3382 x_return_status OUT NOCOPY VARCHAR2
3383 ) IS
3384
3385 --
3386 l_debug_on BOOLEAN;
3387 --
3388 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'Assign_To_Delivery';
3389 --
3390 l_has_lines VARCHAR2(1);
3391 l_dlvy_freight_terms_code VARCHAR2(30);
3392 --
3393 BEGIN
3394 --
3395 --
3396 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3397 --
3398 IF l_debug_on IS NULL
3399 THEN
3400 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3401 END IF;
3402 --
3403 IF l_debug_on THEN
3404 WSH_DEBUG_SV.push(l_module_name);
3405 --
3406 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3407 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3408 END IF;
3409 --
3410 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3411 --
3412 l_has_lines := WSH_DELIVERY_VALIDATIONS.has_lines
3413 (
3414 p_delivery_id => p_delivery_id
3415 );
3416 --
3417 Assign_To_Delivery
3418 (
3419 P_CONTAINER_INSTANCE_ID => P_CONTAINER_INSTANCE_ID,
3420 p_delivery_id => p_delivery_id,
3421 x_dlvy_has_lines => l_has_lines,
3422 x_dlvy_freight_Terms_code => l_dlvy_freight_Terms_code,
3423 x_return_status => x_return_status
3424 );
3425 --
3426 IF l_debug_on THEN
3427 WSH_DEBUG_SV.pop(l_module_name);
3428 END IF;
3429 --
3430 EXCEPTION
3431 WHEN others THEN
3432 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3433 wsh_util_core.default_handler('WSH_CONTAINER_ACTIONS.Assign_To_Delivery',l_module_name);
3434 --
3435 IF l_debug_on THEN
3436 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3437 END IF;
3438 END Assign_To_Delivery;
3439
3440
3441 /*
3442 -----------------------------------------------------------------------------
3443 PROCEDURE : Create_Delivery_Assignment
3444 PARAMETERS : p_container_instance_id - container instance id of container
3445 p_delivery_id - delivery id
3446 x_return_status - return status of API.
3447 -- x_dlvy_has_lines : 'Y' :delivery has non-container lines.
3448 -- 'N' : delivery does not have non-container lines
3449 -- x_dlvy_freight_Terms_code : Delivery's freight term code
3450 DESCRIPTION : This procedure assigns a container to the specified delivery.
3451 ------------------------------------------------------------------------------
3452 */
3453
3454
3455 PROCEDURE Create_Delivery_Assignment (
3456 p_container_instance_id IN NUMBER,
3457 p_delivery_id IN NUMBER,
3458 x_return_status OUT NOCOPY VARCHAR2,
3459 x_dlvy_has_lines IN OUT NOCOPY VARCHAR2, -- J-IB-NPARIKH
3460 x_dlvy_freight_terms_code IN OUT NOCOPY VARCHAR2 -- J-IB-NPARIKH
3461 ) IS
3462
3463 --
3464 l_debug_on BOOLEAN;
3465 --
3466 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CREATE_DELIVERY_ASSIGNMENT';
3467 --
3468 BEGIN
3469
3470 /* instead of this entire stuff just call assign_detail_to_delivery in whcih call to check container attributes, all validations can be done*/
3471
3472 --
3473 --
3474 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3475 --
3476 IF l_debug_on IS NULL
3477 THEN
3478 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3479 END IF;
3480 --
3481 IF l_debug_on THEN
3482 WSH_DEBUG_SV.push(l_module_name);
3483 --
3484 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3485 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3486 END IF;
3487 --
3488 --
3489 IF l_debug_on THEN
3490 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_DETAIL_TO_DELIVERY',WSH_DEBUG_SV.C_PROC_LEVEL);
3491 END IF;
3492 --
3493 WSH_DELIVERY_DETAILS_ACTIONS.Assign_Detail_to_Delivery(
3494 P_DETAIL_ID =>p_container_instance_id ,
3495 P_DELIVERY_ID => p_delivery_id,
3496 X_RETURN_STATUS =>x_return_status,
3497 x_dlvy_has_lines => x_dlvy_has_lines,
3498 x_dlvy_freight_Terms_code => x_dlvy_freight_Terms_code
3499 );
3500
3501 IF l_debug_on THEN
3502 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3503 END IF;
3504 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3505 --set proper error message
3506 --
3507 IF l_debug_on THEN
3508 WSH_DEBUG_SV.pop(l_module_name);
3509 END IF;
3510 --
3511 return;
3512 END IF;
3513 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3514
3515 --
3516 IF l_debug_on THEN
3517 WSH_DEBUG_SV.pop(l_module_name);
3518 END IF;
3519 --
3520 EXCEPTION
3521 WHEN Others THEN
3522 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Create_Delivery_Assignment',l_module_name);
3523 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3524 --
3525 IF l_debug_on THEN
3526 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
3527 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3528 END IF;
3529 --
3530 END Create_Delivery_Assignment;
3531
3532 -------------------------------------------------------------------
3533 -- This procedure is only for backward compatibility. No one should call
3534 -- this procedure.
3535 -------------------------------------------------------------------
3536
3537 PROCEDURE Create_Delivery_Assignment(
3538 p_container_instance_id IN NUMBER,
3539 p_delivery_id IN NUMBER,
3540 x_return_status OUT NOCOPY VARCHAR2
3541 ) IS
3542
3543 --
3544 l_debug_on BOOLEAN;
3545 --
3546 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'Create_Delivery_Assignment';
3547 --
3548 l_has_lines VARCHAR2(1);
3549 l_dlvy_freight_terms_code VARCHAR2(30);
3550 --
3551 BEGIN
3552 --
3553 --
3554 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3555 --
3556 IF l_debug_on IS NULL
3557 THEN
3558 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3559 END IF;
3560 --
3561 IF l_debug_on THEN
3562 WSH_DEBUG_SV.push(l_module_name);
3563 --
3564 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3565 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3566 END IF;
3567 --
3568 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3569 --
3570 l_has_lines := WSH_DELIVERY_VALIDATIONS.has_lines
3571 (
3572 p_delivery_id => p_delivery_id
3573 );
3574 --
3575 Create_Delivery_Assignment
3576 (
3577 P_CONTAINER_INSTANCE_ID => P_CONTAINER_INSTANCE_ID,
3578 p_delivery_id => p_delivery_id,
3579 X_RETURN_STATUS => X_RETURN_STATUS,
3580 x_dlvy_has_lines => l_has_lines,
3581 x_dlvy_freight_Terms_code => l_dlvy_freight_Terms_code
3582 );
3583 --
3584 IF l_debug_on THEN
3585 WSH_DEBUG_SV.pop(l_module_name);
3586 END IF;
3587 --
3588 EXCEPTION
3589 WHEN others THEN
3590 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3591 wsh_util_core.default_handler('WSH_CONTAINER_ACTIONS.Create_Delivery_Assignment',l_module_name);
3592 --
3593 IF l_debug_on THEN
3594 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3595 END IF;
3596 END Create_Delivery_Assignment;
3597
3598
3599 -- THIS IS OBSOLETED
3600 /*
3601 -----------------------------------------------------------------------------
3602 PROCEDURE : Unassign_Delivery
3603 PARAMETERS : p_container_instance_id - container instance id of container
3604 p_delivery_id - delivery id
3605 x_return_status - return status of API
3606 DESCRIPTION : This procedure checks unassigns a container from the specified
3607 delivery and returns a success or failure.
3608 ------------------------------------------------------------------------------
3609 */
3610 --THIS PROCEDURE IS OBSOLETE
3611 PROCEDURE Unassign_Delivery(
3612 p_container_instance_id IN NUMBER,
3613 p_delivery_id IN NUMBER,
3614 x_return_status OUT NOCOPY VARCHAR2) IS
3615
3616 BEGIN
3617
3618 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3619
3620 END Unassign_Delivery;
3621
3622
3623 /*
3624 -----------------------------------------------------------------------------
3625 PROCEDURE : Assign_To_Container
3626 PARAMETERS : p_det_cont_inst_id - container instance id of child container
3627 p_par_cont_inst_id - container instance id of parent container
3628 x_return_status - return status of API
3629 DESCRIPTION : This procedure checks to see if a container can be assigned to
3630 a specified parent container and returns a success or failure.
3631 ------------------------------------------------------------------------------
3632 */
3633
3634
3635 PROCEDURE Assign_To_Container(
3636 p_det_cont_inst_id IN NUMBER,
3637 p_par_cont_inst_id IN NUMBER,
3638 x_return_status OUT NOCOPY VARCHAR2) IS
3639
3640 -- remove this cursor
3641 CURSOR Get_First_Line (v_cont_instance_id NUMBER) IS
3642 SELECT delivery_detail_id
3643 FROM wsh_delivery_assignments_v
3644 WHERE parent_delivery_detail_id = v_cont_instance_id
3645 AND rownum < 2;
3646 -- remove this cursor
3647
3648 CURSOR Get_Cont_Org (v_cont_instance_id NUMBER) IS
3649 SELECT organization_id
3650 FROM WSH_DELIVERY_DETAILS
3651 WHERE delivery_detail_id = v_cont_instance_id
3652 AND container_flag in ('Y', 'C');
3653
3654 l_det_detail_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
3655 l_par_detail_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
3656
3657 l_det_cont_org NUMBER;
3658 l_par_cont_org NUMBER;
3659
3660 l_temp_detail_tab WSH_UTIL_CORE.id_tab_type;
3661
3662 cnt NUMBER;
3663 l_del_rows WSH_UTIL_CORE.id_tab_type;
3664 l_group_id_tab WSH_UTIL_CORE.id_tab_type;
3665 l_ret_sts VARCHAR2(1);
3666
3667 l_cont_name VARCHAR2(30);
3668
3669 l_master_serial_number VARCHAR2(30);
3670 l_master_cont_id NUMBER;
3671 l_master_cont_name VARCHAR2(30);
3672
3673 l_det_attr_flag VARCHAR2(1);
3674 l_par_attr_flag VARCHAR2(1);
3675
3676 l_det_del_id NUMBER;
3677 l_par_del_id NUMBER;
3678 l_del_status VARCHAR2(10);
3679
3680 l_attr_tab wsh_delivery_autocreate.grp_attr_tab_type;
3681 l_group_tab wsh_delivery_autocreate.grp_attr_tab_type;
3682 l_action_rec wsh_delivery_autocreate.action_rec_type;
3683 l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
3684 l_matched_entities wsh_util_core.id_tab_type;
3685 l_out_rec wsh_delivery_autocreate.out_rec_type;
3686
3687 --BUG#12904248
3688 l_deliver_to_location_id NUMBER;
3689 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3690
3691 --
3692 l_debug_on BOOLEAN;
3693 --
3694 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'ASSIGN_TO_CONTAINER';
3695 --
3696 BEGIN
3697
3698
3699 --
3700 --
3701 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3702 --
3703 IF l_debug_on IS NULL
3704 THEN
3705 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3706 END IF;
3707 --
3708 IF l_debug_on THEN
3709 WSH_DEBUG_SV.push(l_module_name);
3710 --
3711 WSH_DEBUG_SV.log(l_module_name,'P_DET_CONT_INST_ID',P_DET_CONT_INST_ID);
3712 WSH_DEBUG_SV.log(l_module_name,'P_PAR_CONT_INST_ID',P_PAR_CONT_INST_ID);
3713 END IF;
3714 --
3715 OPEN Get_Cont_Org (p_det_cont_inst_id);
3716
3717 FETCH Get_Cont_Org INTO l_det_cont_org;
3718
3719 IF Get_Cont_Org%NOTFOUND THEN
3720 CLOSE Get_Cont_Org;
3721 --
3722 IF l_debug_on THEN
3723 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3724 END IF;
3725 --
3726 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
3727 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
3728 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3729 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3730 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3731 --
3732 IF l_debug_on THEN
3733 WSH_DEBUG_SV.pop(l_module_name);
3734 END IF;
3735 --
3736 return;
3737 END IF;
3738
3739 IF Get_Cont_Org%ISOPEN THEN
3740 CLOSE Get_Cont_Org;
3741 END IF;
3742
3743 OPEN Get_Cont_Org (p_par_cont_inst_id);
3744
3745 FETCH Get_Cont_Org INTO l_par_cont_org;
3746
3747 IF Get_Cont_Org%NOTFOUND THEN
3748 CLOSE Get_Cont_Org;
3749 --
3750 IF l_debug_on THEN
3751 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3752 END IF;
3753 --
3754 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3755 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
3756 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3757 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3758 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3759 --
3760 IF l_debug_on THEN
3761 WSH_DEBUG_SV.pop(l_module_name);
3762 END IF;
3763 --
3764 return;
3765 END IF;
3766
3767 IF Get_Cont_Org%ISOPEN THEN
3768 CLOSE Get_Cont_Org;
3769 END IF;
3770
3771 IF l_det_cont_org <> l_par_cont_org THEN
3772 --
3773 IF l_debug_on THEN
3774 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3775 END IF;
3776 --
3777 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
3778 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_ORG_DIFF');
3779 FND_MESSAGE.SET_TOKEN('ENTITY1',l_cont_name);
3780 --
3781 IF l_debug_on THEN
3782 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3783 END IF;
3784 --
3785 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3786 FND_MESSAGE.SET_TOKEN('ENTITY2',l_cont_name);
3787 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3788 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3789 --
3790 IF l_debug_on THEN
3791 WSH_DEBUG_SV.pop(l_module_name);
3792 END IF;
3793 --
3794 return;
3795 END IF;
3796
3797 -- get the delivery status of the container and check if it is assigned
3798 -- to a closed or in-transit delivery (only open deliveries allowed)
3799
3800 --
3801 IF l_debug_on THEN
3802 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
3803 END IF;
3804 --
3805 WSH_CONTAINER_UTILITIES.Get_Delivery_Status ( p_par_cont_inst_id,
3806 l_par_del_id,
3807 l_del_status,
3808 x_return_status);
3809
3810 IF l_debug_on THEN
3811 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3812 END IF;
3813 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3814 --
3815 IF l_debug_on THEN
3816 WSH_DEBUG_SV.pop(l_module_name);
3817 END IF;
3818 --
3819 return;
3820 END IF;
3821
3822 IF (nvl(l_par_del_id,-99) <> -99) THEN
3823
3824 -- TPW - Distributed Organization Changes
3825 IF (nvl(l_del_status,'N/A') NOT IN ('OP','SA')) THEN
3826 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
3827 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3828 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3829 --
3830 IF l_debug_on THEN
3831 WSH_DEBUG_SV.pop(l_module_name);
3832 END IF;
3833 --
3834 return;
3835 END IF;
3836 END IF;
3837
3838 -- get the delivery status of the container and check if it is assigned
3839 -- to a closed or in-transit delivery (only open deliveries allowed)
3840
3841 --
3842 IF l_debug_on THEN
3843 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
3844 END IF;
3845 --
3846 WSH_CONTAINER_UTILITIES.Get_Delivery_Status ( p_det_cont_inst_id,
3847 l_det_del_id,
3848 l_del_status,
3849 x_return_status);
3850
3851 IF l_debug_on THEN
3852 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3853 END IF;
3854 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3855 --
3856 IF l_debug_on THEN
3857 WSH_DEBUG_SV.pop(l_module_name);
3858 END IF;
3859 --
3860 return;
3861 END IF;
3862
3863 IF (nvl(l_det_del_id,-99) <> -99) THEN
3864
3865 IF (nvl(l_del_status,'N/A') <> 'OP') THEN
3866 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
3867 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3868 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3869 --
3870 IF l_debug_on THEN
3871 WSH_DEBUG_SV.pop(l_module_name);
3872 END IF;
3873 --
3874 return;
3875 END IF;
3876 END IF;
3877
3878 IF l_debug_on THEN
3879 WSH_DEBUG_SV.log(l_module_name,'l_det_del_id',l_det_del_id);
3880 WSH_DEBUG_SV.log(l_module_name,'l_par_del_id',l_par_del_id);
3881 END IF;
3882
3883 IF ((nvl(l_det_del_id,-99) <> -99) AND (nvl(l_par_del_id,-99) <> -99)) THEN
3884
3885 IF l_det_del_id <> l_par_del_id THEN
3886
3887
3888 -- R12: MDC: For WMS we can assign containers to parent containers on different deliveries.
3889 IF wsh_util_validate.check_wms_org(l_par_cont_org) = 'Y' THEN
3890
3891 IF l_debug_on THEN
3892 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Assign_Container_to_Consol',WSH_DEBUG_SV.C_PROC_LEVEL);
3893 END IF;
3894 Assign_Container_to_Consol(
3895 p_child_container_id => p_det_cont_inst_id,
3896 p_parent_container_id => p_par_cont_inst_id,
3897 p_caller => 'WMS_PACK_CONSOL',
3898 x_return_status => x_return_status);
3899
3900 IF l_debug_on THEN
3901 WSH_DEBUG_SV.log(l_module_name,'return status -',x_return_status);
3902 END IF;
3903
3904 return;
3905 ELSE
3906
3907
3908 --
3909 IF l_debug_on THEN
3910 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3911 END IF;
3912 --
3913 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
3914 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_DEL_DIFF');
3915 FND_MESSAGE.SET_TOKEN('ENTITY1',l_cont_name);
3916 --
3917 IF l_debug_on THEN
3918 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3919 END IF;
3920 --
3921 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3922 FND_MESSAGE.SET_TOKEN('ENTITY2',l_cont_name);
3923 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3924 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3925 --
3926 IF l_debug_on THEN
3927 WSH_DEBUG_SV.pop(l_module_name);
3928 END IF;
3929 --
3930 return;
3931
3932 END IF;
3933
3934 END IF;
3935 END IF;
3936
3937 --
3938 IF l_debug_on THEN
3939 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_CONT_SERIAL',WSH_DEBUG_SV.C_PROC_LEVEL);
3940 END IF;
3941 --
3942 WSH_CONTAINER_UTILITIES.Get_Master_Cont_Serial (
3943 p_par_cont_inst_id,
3944 l_master_cont_id,
3945 l_master_cont_name,
3946 l_master_serial_number,
3947 x_return_status);
3948 IF l_debug_on THEN
3949 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3950 END IF;
3951
3952 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3953 --dbms_output.put_line('error while getting master serial for parent ' || p_par_cont_inst_id);
3954 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GET_MASTER_ERROR');
3955 --
3956 IF l_debug_on THEN
3957 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3958 END IF;
3959 --
3960 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3961 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3962 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
3963 IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
3964 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
3965 END IF;
3966 l_master_cont_id := NULL;
3967 l_master_serial_number := NULL;
3968 END IF;
3969
3970 --
3971 IF l_debug_on THEN
3972 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
3973 END IF;
3974 --
3975 wsh_container_actions.Check_Cont_Attributes (
3976 p_det_cont_inst_id,
3977 l_det_attr_flag,
3978 x_return_status);
3979
3980 IF l_debug_on THEN
3981 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3982 END IF;
3983
3984 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3985 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
3986 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3987 --
3988 IF l_debug_on THEN
3989 WSH_DEBUG_SV.pop(l_module_name);
3990 END IF;
3991 --
3992 return;
3993 END IF;
3994
3995
3996 --
3997 IF l_debug_on THEN
3998 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
3999 END IF;
4000 --
4001 wsh_container_actions.Check_Cont_Attributes (
4002 p_par_cont_inst_id,
4003 l_par_attr_flag,
4004 x_return_status);
4005
4006 IF l_debug_on THEN
4007 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4008 END IF;
4009
4010 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4011 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
4012 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4013 --
4014 IF l_debug_on THEN
4015 WSH_DEBUG_SV.pop(l_module_name);
4016 END IF;
4017 --
4018 return;
4019 END IF;
4020
4021 IF l_det_attr_flag = 'N' AND l_par_attr_flag = 'N' THEN
4022
4023 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4024 -- just create assignment of child container to parent.
4025 --
4026 IF l_debug_on THEN
4027 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
4028 END IF;
4029 --
4030 WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
4031 p_det_cont_inst_id,
4032 p_par_cont_inst_id,
4033 x_return_status);
4034
4035 IF l_debug_on THEN
4036 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4037 END IF;
4038
4039 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4040 --
4041 IF l_debug_on THEN
4042 WSH_DEBUG_SV.pop(l_module_name);
4043 END IF;
4044 --
4045 return;
4046 END IF;
4047
4048 -- l_master_cont_id := WSH_CONTAINER_UTILITIES.Get_Master_Cont_Id (p_det_cont_inst_id);
4049
4050
4051 --
4052 IF l_debug_on THEN
4053 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
4054 END IF;
4055 --
4056 WSH_CONTAINER_UTILITIES.Update_Child_Containers (
4057 p_det_cont_inst_id,
4058 l_master_cont_id,
4059 l_master_serial_number,
4060 x_return_status);
4061
4062 IF l_debug_on THEN
4063 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4064 END IF;
4065
4066 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4067 --
4068 IF l_debug_on THEN
4069 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4070 END IF;
4071 --
4072 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4073 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4074 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4075 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4076 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4077 --
4078 IF l_debug_on THEN
4079 WSH_DEBUG_SV.pop(l_module_name);
4080 END IF;
4081 --
4082 return;
4083 END IF;
4084
4085 ELSIF l_det_attr_flag = 'N' AND l_par_attr_flag = 'Y' THEN
4086
4087 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4088
4089 -- just create assignment of child container to parent.
4090 --
4091 IF l_debug_on THEN
4092 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
4093 END IF;
4094 --
4095 WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
4096 p_det_cont_inst_id,
4097 p_par_cont_inst_id,
4098 x_return_status);
4099
4100 IF l_debug_on THEN
4101 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4102 END IF;
4103 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4104 --
4105 IF l_debug_on THEN
4106 WSH_DEBUG_SV.pop(l_module_name);
4107 END IF;
4108 --
4109 return;
4110 END IF;
4111
4112 --
4113 -- Debug Statements
4114 --
4115 IF l_debug_on THEN
4116 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
4117 END IF;
4118 --
4119 wsh_container_actions.Update_Cont_Hierarchy (
4120 p_par_cont_inst_id,
4121 l_det_del_id,
4122 p_det_cont_inst_id,
4123 x_return_status );
4124 IF l_debug_on THEN
4125 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4126 END IF;
4127
4128 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4129 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GRP_ATTR_WARN');
4130 --
4131 IF l_debug_on THEN
4132 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4133 END IF;
4134 --
4135 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4136 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4137 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
4138 WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
4139 END IF;
4140
4141 --
4142 IF l_debug_on THEN
4143 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
4144 END IF;
4145 --
4146 WSH_CONTAINER_UTILITIES.Update_Child_Containers (
4147 p_det_cont_inst_id,
4148 l_master_cont_id,
4149 l_master_serial_number,
4150 x_return_status);
4151 IF l_debug_on THEN
4152 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4153 END IF;
4154
4155 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4156 --
4157 IF l_debug_on THEN
4158 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4159 END IF;
4160 --
4161 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4162 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4163 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4164 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4165 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4166 --
4167 IF l_debug_on THEN
4168 WSH_DEBUG_SV.pop(l_module_name);
4169 END IF;
4170 --
4171 return;
4172 END IF;
4173
4174 ELSIF l_det_attr_flag = 'Y' and l_par_attr_flag = 'N' THEN
4175
4176 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4177
4178 -- just create assignment of child container to parent.
4179 --
4180 IF l_debug_on THEN
4181 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
4182 END IF;
4183 --
4184 WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
4185 p_det_cont_inst_id,
4186 p_par_cont_inst_id,
4187 x_return_status);
4188
4189 IF l_debug_on THEN
4190 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4191 END IF;
4192 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4193 --dbms_output.put_line('cont not assigned');
4194 --
4195 IF l_debug_on THEN
4196 WSH_DEBUG_SV.pop(l_module_name);
4197 END IF;
4198 --
4199 return;
4200 END IF;
4201
4202 --
4203 IF l_debug_on THEN
4204 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
4205 END IF;
4206 --
4207 wsh_container_actions.Update_Cont_Hierarchy (
4208 p_det_cont_inst_id,
4209 l_par_del_id,
4210 p_par_cont_inst_id,
4211 x_return_status );
4212
4213 IF l_debug_on THEN
4214 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4215 END IF;
4216 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4217 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GRP_ATTR_WARN');
4218 --
4219 IF l_debug_on THEN
4220 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4221 END IF;
4222 --
4223 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4224 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4225 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
4226 WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
4227 END IF;
4228
4229 --
4230 IF l_debug_on THEN
4231 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
4232 END IF;
4233 --
4234 WSH_CONTAINER_UTILITIES.Update_Child_Containers (
4235 p_det_cont_inst_id,
4236 l_master_cont_id,
4237 l_master_serial_number,
4238 x_return_status);
4239 IF l_debug_on THEN
4240 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4241 END IF;
4242
4243 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4244 --
4245 IF l_debug_on THEN
4246 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4247 END IF;
4248 --
4249 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4250 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4251 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4252 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4253 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4254 --
4255 IF l_debug_on THEN
4256 WSH_DEBUG_SV.pop(l_module_name);
4257 END IF;
4258 --
4259 return;
4260 END IF;
4261
4262 ELSIF l_det_attr_flag = 'Y' and l_par_attr_flag = 'Y' THEN
4263
4264 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4265
4266 -- check on using the container instance ids for grouping
4267 -- attribute comparisons instead of using the lines.
4268
4269 l_attr_tab(1).entity_id := p_det_cont_inst_id;
4270 l_attr_tab(1).entity_type := 'DELIVERY_DETAIL';
4271 l_attr_tab(2).entity_id := p_par_cont_inst_id;
4272 l_attr_tab(2).entity_type := 'DELIVERY_DETAIL';
4273
4274 --
4275 IF l_debug_on THEN
4276 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
4277 END IF;
4278
4279 l_action_rec.action := 'MATCH_GROUPS';
4280 l_action_rec.check_single_grp := 'Y';
4281
4282
4283 WSH_DELIVERY_AUTOCREATE.Find_Matching_Groups(p_attr_tab => l_attr_tab,
4284 p_action_rec => l_action_rec,
4285 p_target_rec => l_target_rec,
4286 p_group_tab => l_group_tab,
4287 x_matched_entities => l_matched_entities,
4288 x_out_rec => l_out_rec,
4289 x_return_status => x_return_status);
4290
4291 IF l_debug_on THEN
4292 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4293 END IF;
4294 IF (x_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
4295 OR NVL(l_out_rec.single_group, 'N') = 'N') THEN
4296 FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
4297 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4298 --
4299 IF l_debug_on THEN
4300 WSH_DEBUG_SV.pop(l_module_name);
4301 END IF;
4302 --
4303 return;
4304 END IF;
4305
4306 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4307
4308 -- create assignment between child and parent container
4309 --
4310 IF l_debug_on THEN
4311 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
4312 END IF;
4313 --
4314 WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
4315 p_det_cont_inst_id,
4316 p_par_cont_inst_id,
4317 x_return_status);
4318
4319 IF l_debug_on THEN
4320 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4321 END IF;
4322 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4323 l_ret_sts := x_return_status;
4324 --
4325 IF l_debug_on THEN
4326 WSH_DEBUG_SV.pop(l_module_name);
4327 END IF;
4328 --
4329 return;
4330 END IF;
4331
4332 -- call update cont attributes to update grouping attr.
4333 --
4334 IF l_debug_on THEN
4335 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
4336 END IF;
4337 --
4338 WSH_CONTAINER_UTILITIES.Update_Child_Containers (
4339 p_det_cont_inst_id,
4340 l_master_cont_id,
4341 l_master_serial_number,
4342 x_return_status);
4343 IF l_debug_on THEN
4344 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4345 END IF;
4346
4347 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4348 --
4349 IF l_debug_on THEN
4350 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4351 END IF;
4352 --
4353 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4354 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4355 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4356 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4357 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4358 --
4359 IF l_debug_on THEN
4360 WSH_DEBUG_SV.pop(l_module_name);
4361 END IF;
4362 --
4363 return;
4364 END IF;
4365
4366
4367 END IF;
4368
4369 --BUG#12904248
4370 Get_Deliver_To_Location(
4371 p_container_id => p_par_cont_inst_id,
4372 x_deliver_to_location_id => l_deliver_to_location_id,
4373 x_return_status => l_return_status);
4374
4375 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4376
4377 UPDATE wsh_delivery_details
4378 SET deliver_to_location_id = l_deliver_to_location_id
4379 WHERE delivery_detail_id = p_par_cont_inst_id;
4380
4381 END IF;
4382
4383 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4384
4385 --
4386 IF l_debug_on THEN
4387 WSH_DEBUG_SV.pop(l_module_name);
4388 END IF;
4389 --
4390 EXCEPTION
4391
4392 WHEN Others THEN
4393 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Assign_To_Container',l_module_name);
4394 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4395
4396 --
4397 IF l_debug_on THEN
4398 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4399 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4400 END IF;
4401 --
4402 END Assign_To_Container;
4403
4404 /*
4405 -----------------------------------------------------------------------------
4406 PROCEDURE : Get_Cont_Load_Vol_info
4407 PARAMETERS : p_container_item_id - Item Id of the Container
4408 p_organization_id - Organization Id of the item
4409 p_w_v_both - W (Find Weight), V (Find Volume),
4410 B (Find Weight and Volume)
4411 x_return_status - Return Status of the API
4412 x_error_cnt - Count of errors encountered
4413 x_max_load - Max Load Weight of the container
4414 x_max_vol - Internal Volume of the container
4415 x_wt_uom - Weight UOM of the container
4416 x_vol_uom - Volume UOM of the container
4417 DESCRIPTION : This procedure finds Container Weight/Volume attributes
4418 either from database or from cached PL/SQL table and caches
4419 the info if fetched from database.
4420 ------------------------------------------------------------------------------
4421 */
4422
4423 PROCEDURE Get_Cont_Load_Vol_info(
4424 p_container_item_id IN NUMBER,
4425 p_organization_id IN NUMBER,
4426 p_w_v_both IN VARCHAR2,
4427 x_max_load OUT NOCOPY NUMBER,
4428 x_max_vol OUT NOCOPY NUMBER,
4429 x_wt_uom OUT NOCOPY VARCHAR2,
4430 x_vol_uom OUT NOCOPY VARCHAR2,
4431 -- x_inventory_item_status_code OUT VARCHAR2,
4432 x_return_status OUT NOCOPY VARCHAR2,
4433 x_error_cnt OUT NOCOPY NUMBER) IS
4434 -- in this cursor we can add filters as required in 2428050
4435 CURSOR Get_Cont_Msi (v_cont_item_id NUMBER, v_org_id NUMBER) IS
4436 SELECT maximum_load_weight, internal_volume,
4437 weight_uom_code, volume_uom_code
4438 FROM MTL_SYSTEM_ITEMS
4439 WHERE inventory_item_id = v_cont_item_id
4440 AND organization_id = v_org_id
4441 -- bug 2828591 - remove the condition since it will prevent user to create container with other status
4442 -- AND inventory_item_status_code = 'Active'
4443 AND container_item_flag = 'Y'
4444 AND nvl(vehicle_item_flag,'N') = 'N'
4445 AND shippable_item_flag = 'Y' ;
4446
4447 l_mtl_max_load NUMBER;
4448 l_mtl_max_vol NUMBER;
4449 l_mtl_wt_uom VARCHAR2(3);
4450 l_mtl_vol_uom VARCHAR2(3);
4451 l_inv_item_status_code VARCHAR2(10);
4452 l_flag VARCHAR2(1);
4453 l_item_name VARCHAR2(2000);
4454
4455 --
4456 l_debug_on BOOLEAN;
4457 --
4458 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'GET_CONT_LOAD_VOL_INFO';
4459 --
4460 BEGIN
4461 --
4462 --
4463 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4464 --
4465 IF l_debug_on IS NULL
4466 THEN
4467 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4468 END IF;
4469 --
4470 IF l_debug_on THEN
4471 WSH_DEBUG_SV.push(l_module_name);
4472 --
4473 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_ITEM_ID',P_CONTAINER_ITEM_ID);
4474 WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
4475 WSH_DEBUG_SV.log(l_module_name,'P_W_V_BOTH',P_W_V_BOTH);
4476 END IF;
4477 --
4478 x_error_cnt := 0;
4479 x_return_status := C_SUCCESS_STATUS;
4480 --dbms_output.put_line('Get_Cont_Load_Vol_info: p_container_item_id '||p_container_item_id||' p_w_v_both '||p_w_v_both);
4481 IF ((g_cont_msi_tab.COUNT > 0) AND (g_cont_msi_tab.EXISTS(p_container_item_id))) THEN
4482
4483 -- added for valid flag in PL SQL table
4484 IF g_cont_msi_tab(p_container_item_id).valid_flag = 'Y' THEN
4485 NULL;
4486 ELSE
4487 --
4488 IF l_debug_on THEN
4489 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4490 END IF;
4491 --
4492 l_item_name := WSH_UTIL_CORE.Get_Item_Name(p_container_item_id, p_organization_id);
4493 --dbms_output.put_line('Container '||p_container_item_id||' not found in Org '||p_organization_id);
4494 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_INV_ITEM');
4495 FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
4496 CLOSE Get_Cont_Msi;
4497 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4498 x_return_status := C_ERROR_STATUS;
4499 x_error_cnt := x_error_cnt + 1;
4500
4501 END IF;
4502 -- end of for valid flag
4503
4504 --dbms_output.put_line('Using Cached Cont/Msi Info');
4505 ELSE
4506 l_mtl_max_load := NULL;
4507 l_mtl_max_vol := NULL;
4508 l_mtl_wt_uom := NULL;
4509 l_mtl_vol_uom := NULL;
4510
4511 l_flag := 'Y';
4512
4513 OPEN Get_Cont_Msi(p_container_item_id, p_organization_id);
4514 FETCH Get_Cont_Msi
4515 INTO l_mtl_max_load,
4516 l_mtl_max_vol,
4517 l_mtl_wt_uom,
4518 l_mtl_vol_uom;
4519
4520 IF Get_Cont_Msi%NOTFOUND THEN
4521 --
4522 IF l_debug_on THEN
4523 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4524 END IF;
4525 --
4526 l_item_name := WSH_UTIL_CORE.Get_Item_Name(p_container_item_id, p_organization_id);
4527 --dbms_output.put_line('Container '||p_container_item_id||' not found in Org '||p_organization_id);
4528 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_INV_ITEM');
4529 FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
4530 CLOSE Get_Cont_Msi;
4531 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4532 x_return_status := C_ERROR_STATUS;
4533 x_error_cnt := x_error_cnt + 1;
4534 ELSE
4535
4536 --dbms_output.put_line('IN ELSE CLAUSE'||l_flag);
4537 CLOSE Get_Cont_Msi;
4538
4539
4540 IF ((NVL(l_mtl_max_load,0) <= 0) AND (p_w_v_both in ('W','B'))) THEN
4541 --dbms_output.put_line('Preferred Container Weight is <= 0');
4542 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_LOAD_ERROR');
4543 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4544 x_return_status := C_ERROR_STATUS;
4545 x_error_cnt := x_error_cnt + 1;
4546 l_flag := 'N';
4547 END IF;
4548
4549 IF ((NVL(l_mtl_max_vol,0) <= 0) AND (p_w_v_both in ('V','B'))) THEN
4550 --dbms_output.put_line('Preferred Container Volume is <= 0');
4551 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_VOL_ERROR');
4552 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4553 x_return_status := C_ERROR_STATUS;
4554 x_error_cnt := x_error_cnt + 1;
4555 l_flag := 'N';
4556 END IF;
4557
4558 IF (l_flag IS NULL OR l_flag <> 'N') THEN
4559 l_flag := 'Y';
4560 END IF;
4561
4562 END IF;
4563
4564 --dbms_output.put_line('Caching Cont/Msi Info'||l_flag);
4565 g_cont_msi_tab(p_container_item_id).mtl_max_load := l_mtl_max_load;
4566 g_cont_msi_tab(p_container_item_id).mtl_max_vol := l_mtl_max_vol;
4567 g_cont_msi_tab(p_container_item_id).mtl_wt_uom := l_mtl_wt_uom;
4568 g_cont_msi_tab(p_container_item_id).mtl_vol_uom := l_mtl_vol_uom;
4569 g_cont_msi_tab(p_container_item_id).valid_flag := l_flag;
4570 END IF;
4571
4572 x_max_load := g_cont_msi_tab(p_container_item_id).mtl_max_load;
4573 x_max_vol := g_cont_msi_tab(p_container_item_id).mtl_max_vol;
4574 x_wt_uom := g_cont_msi_tab(p_container_item_id).mtl_wt_uom;
4575 x_vol_uom := g_cont_msi_tab(p_container_item_id).mtl_vol_uom;
4576 --x_inventory_item_status_code := g_cont_msi_tab(p_container_item_id).inventory_item_status_code;
4577 --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Get_Cont_Load_Vol_info returned '||x_return_status||' with error count '||x_error_cnt);
4578
4579 --
4580 IF l_debug_on THEN
4581 WSH_DEBUG_SV.log(l_module_name,'MAX LOAD',x_max_load);
4582 WSH_DEBUG_SV.log(l_module_name,'MAX VOLUME',x_max_vol);
4583 WSH_DEBUG_SV.pop(l_module_name);
4584 END IF;
4585 --
4586 RETURN;
4587
4588 EXCEPTION
4589 WHEN Others THEN
4590 IF (Get_Cont_Msi%ISOPEN) THEN
4591 CLOSE Get_Cont_Msi;
4592 END IF;
4593 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Get_Cont_Load_Vol_info',l_module_name);
4594 x_return_status := C_UNEXP_ERROR_STATUS;
4595
4596 --
4597 IF l_debug_on THEN
4598 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4599 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4600 END IF;
4601 --
4602 END Get_Cont_Load_Vol_info;
4603
4604 /*
4605 -----------------------------------------------------------------------------
4606 PROCEDURE : Calc_Fill_Basis_and_Proc_Flag
4607 PARAMETERS : p_organization_id - Organization Id for which Fill Basis and
4608 Process Flag is to be determined
4609 x_return_status - Return Status of the API
4610 x_error_cnt - Count of errors encountered
4611 x_fill_basis - Fill Basis for the organization
4612 x_process_flag - Discrete/Process Organization
4613 DESCRIPTION : This procedure finds Fill Basis for organization and determines
4614 whether organization uses Process or Discrete Manufacturing
4615 either from database or from cached PL/SQL table and caches
4616 the info if fetched from database.
4617 ------------------------------------------------------------------------------
4618 */
4619
4620 PROCEDURE Calc_Fill_Basis_and_Proc_Flag(
4621 p_organization_id IN NUMBER,
4622 x_return_status OUT NOCOPY VARCHAR2,
4623 x_fill_basis OUT NOCOPY VARCHAR2,
4624 x_process_flag OUT NOCOPY VARCHAR2) IS
4625
4626 l_param_info WSH_SHIPPING_PARAMS_PVT.Parameter_Rec_Typ;
4627
4628 --
4629 l_debug_on BOOLEAN;
4630 --
4631 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CALC_FILL_BASIS_AND_PROC_FLAG';
4632 --
4633 BEGIN
4634
4635 --
4636 --
4637 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4638 --
4639 IF l_debug_on IS NULL
4640 THEN
4641 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4642 END IF;
4643 --
4644 IF l_debug_on THEN
4645 WSH_DEBUG_SV.push(l_module_name);
4646 --
4647 WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
4648 END IF;
4649 --
4650 --
4651 IF l_debug_on THEN
4652 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_SHIPPING_PARAMS_PVT.GET',WSH_DEBUG_SV.C_PROC_LEVEL);
4653 END IF;
4654 --
4655 WSH_SHIPPING_PARAMS_PVT.Get(
4656 p_organization_id => p_organization_id,
4657 x_param_info => l_param_info,
4658 x_return_status => x_return_status);
4659
4660 IF l_debug_on THEN
4661 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4662 END IF;
4663 IF (x_return_status = C_SUCCESS_STATUS) THEN
4664 x_fill_basis := l_param_info.percent_fill_basis_flag;
4665 -- HW OPMCONV - No need to populate this value
4666 -- x_process_flag := l_param_info.process_flag;
4667 END IF;
4668
4669 --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Calc_Fill_Basis_and_proc_flag returned '||x_return_status);
4670
4671 --
4672 IF l_debug_on THEN
4673 WSH_DEBUG_SV.pop(l_module_name);
4674 END IF;
4675 --
4676 RETURN;
4677
4678 --
4679 IF l_debug_on THEN
4680 WSH_DEBUG_SV.pop(l_module_name);
4681 END IF;
4682 --
4683 EXCEPTION
4684 WHEN Others THEN
4685 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Calc_Fill_Basis_and_proc_flag',l_module_name);
4686 x_return_status := C_UNEXP_ERROR_STATUS;
4687 --
4688 IF l_debug_on THEN
4689 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4690 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4691 END IF;
4692 --
4693 END Calc_Fill_Basis_and_proc_flag;
4694
4695 /*
4696 -----------------------------------------------------------------------------
4697 PROCEDURE : Calc_Pref_Container
4698 PARAMETERS : p_organization_id - Organization Id of the Item for which
4699 Preferred Container is to be determined
4700 p_inventory_item_id - Item for which Preferred Container is to
4701 be determined
4702 p_fill_pc_basis - Fill Basis for the organization
4703 x_return_status - Return Status of the API
4704 x_error_cnt - Count of errors encountered
4705 x_cont_item_id - Preferred Container Item Id
4706 x_max_load_qty - Max Load Qty of the Preferred Container
4707 DESCRIPTION : This procedure finds preferred container for item-organization
4708 combination either from database or from cached PL/SQL table
4709 and caches the info if fetched from database.
4710 This procedure also finds and caches the Max Load qty a
4711 preferred container can hold if fill basis is Quantity.
4712 ------------------------------------------------------------------------------
4713 */
4714
4715 PROCEDURE Calc_Pref_Container(
4716 p_organization_id IN NUMBER,
4717 p_inventory_item_id IN NUMBER,
4718 p_fill_pc_basis IN VARCHAR2,
4719 x_return_status OUT NOCOPY VARCHAR2,
4720 x_error_cnt OUT NOCOPY NUMBER,
4721 x_cont_item_id OUT NOCOPY NUMBER,
4722 x_max_load_qty OUT NOCOPY NUMBER) IS
4723
4724 CURSOR Get_Cont_Load (v_inv_item_id NUMBER, v_organization_id NUMBER) IS
4725 SELECT container_item_id,
4726 max_load_quantity
4727 FROM WSH_CONTAINER_ITEMS
4728 WHERE load_item_id = v_inv_item_id
4729 AND master_organization_id = v_organization_id
4730 AND preferred_flag = 'Y';
4731
4732 l_wcl_cont_item_id NUMBER;
4733 l_max_load_qty NUMBER;
4734 l_item_name VARCHAR2(2000);
4735 l_org_name VARCHAR2(240);
4736
4737
4738 --
4739 l_debug_on BOOLEAN;
4740 --
4741 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CALC_PREF_CONTAINER';
4742 --
4743 BEGIN
4744 --
4745 --
4746 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4747 --
4748 IF l_debug_on IS NULL
4749 THEN
4750 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4751 END IF;
4752 --
4753 IF l_debug_on THEN
4754 WSH_DEBUG_SV.push(l_module_name);
4755 --
4756 WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
4757 WSH_DEBUG_SV.log(l_module_name,'P_INVENTORY_ITEM_ID',P_INVENTORY_ITEM_ID);
4758 WSH_DEBUG_SV.log(l_module_name,'P_FILL_PC_BASIS',P_FILL_PC_BASIS);
4759 END IF;
4760 --
4761 x_error_cnt := 0;
4762 x_return_status := C_SUCCESS_STATUS;
4763
4764 IF ((g_cache_cont_load_info_tab.COUNT > 0) AND (g_cache_cont_load_info_tab.EXISTS(p_inventory_item_id))) THEN
4765 NULL;
4766 --dbms_output.put_line('Using Cached Cont/Load info');
4767 ELSE
4768 l_wcl_cont_item_id := NULL;
4769 l_max_load_qty := NULL;
4770
4771 OPEN Get_Cont_Load (p_inventory_item_id, p_organization_id);
4772
4773 FETCH Get_Cont_Load
4774 INTO l_wcl_cont_item_id,
4775 l_max_load_qty;
4776
4777 IF Get_Cont_Load%NOTFOUND THEN
4778 CLOSE Get_Cont_Load;
4779 --
4780 IF l_debug_on THEN
4781 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4782 END IF;
4783 --
4784 l_item_name := WSH_UTIL_CORE.Get_Item_Name(p_inventory_item_id, p_organization_id);
4785 --
4786 IF l_debug_on THEN
4787 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ORG_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4788 END IF;
4789 --
4790 l_org_name := WSH_UTIL_CORE.Get_Org_Name(p_organization_id);
4791 --dbms_output.put_line('Error: Cont/Load Relationship does not exist for Item '||l_item_name||' Org '||l_org_name);
4792 --dbms_output.put_line('p_inventory_item_id '||p_inventory_item_id||' p_organization_id '||p_organization_id);
4793 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONT_LOAD');
4794 FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
4795 FND_MESSAGE.SET_TOKEN('ORG_NAME',l_org_name);
4796 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4797 x_return_status := C_ERROR_STATUS;
4798 x_error_cnt := x_error_cnt + 1;
4799 ELSE
4800 CLOSE Get_Cont_Load;
4801 IF ((l_max_load_qty = 0) AND (p_fill_pc_basis = 'Q')) THEN
4802 --dbms_output.put_line('Error: Max Load qty for Preferred Container is 0');
4803 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_LOAD_QTY_ERROR');
4804 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4805 x_error_cnt := x_error_cnt + 1;
4806 x_return_status := C_ERROR_STATUS;
4807 l_wcl_cont_item_id := NULL;
4808 END IF;
4809 END IF;
4810
4811 g_cache_cont_load_info_tab(p_inventory_item_id).cont_item_id := l_wcl_cont_item_id;
4812 g_cache_cont_load_info_tab(p_inventory_item_id).max_load_qty := l_max_load_qty;
4813 --dbms_output.put_line('Caching Cont/Load info');
4814 END IF;
4815 x_cont_item_id := g_cache_cont_load_info_tab(p_inventory_item_id).cont_item_id;
4816 x_max_load_qty := g_cache_cont_load_info_tab(p_inventory_item_id).max_load_qty;
4817 --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Calc_Pref_Container returned '||x_return_status||' with error count '||x_error_cnt);
4818
4819 --
4820 IF l_debug_on THEN
4821 WSH_DEBUG_SV.pop(l_module_name);
4822 END IF;
4823 --
4824 RETURN;
4825
4826 --
4827 IF l_debug_on THEN
4828 WSH_DEBUG_SV.pop(l_module_name);
4829 END IF;
4830 --
4831 EXCEPTION
4832 WHEN Others THEN
4833 IF (Get_Cont_Load%ISOPEN) THEN
4834 CLOSE Get_Cont_Load;
4835 END IF;
4836 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Calc_Pref_Container',l_module_name);
4837 x_return_status := C_UNEXP_ERROR_STATUS;
4838
4839 --
4840 IF l_debug_on THEN
4841 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4842 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4843 END IF;
4844 --
4845 END Calc_Pref_Container;
4846
4847 /*
4848 -----------------------------------------------------------------------------
4849 PROCEDURE : Pack_Delivery_Detail
4850 PARAMETERS : p_line_cont_rec - Dd info which needs to be autopacked
4851 x_return_status - Return Status of the API
4852 DESCRIPTION : This procedure packs a delivery detail into Container either
4853 by creating a new one or by packing it into one created for
4854 previous delivery details (created in the same run)
4855 ------------------------------------------------------------------------------
4856 */
4857
4858 PROCEDURE Pack_Delivery_Detail(
4859 p_line_cont_rec IN wsh_container_actions.line_cont_info,
4860 x_return_status OUT NOCOPY VARCHAR2) IS
4861
4862 l_mtl_max_load NUMBER;
4863 l_mtl_max_vol NUMBER;
4864 l_item_name VARCHAR2(2000);
4865 l_weight_per_pc NUMBER;
4866 l_volume_per_pc NUMBER;
4867 l_volume_per_pc2 NUMBER;
4868 l_equal_distribution BOOLEAN;
4869 l_wt_left NUMBER;
4870 l_vol_left NUMBER;
4871 l_original_qty NUMBER;
4872 l_quantity_left NUMBER;
4873 l_tmp_split_qty NUMBER;
4874 l_tmp_split_qty2 NUMBER;
4875 l_split_qty NUMBER;
4876 l_split_qty2 NUMBER;
4877 l_split_del_detail_id NUMBER;
4878 l_return_status VARCHAR2(1) := C_SUCCESS_STATUS;
4879 l_output_qty NUMBER;
4880 l_discard_message VARCHAR2(2000);
4881 l_max_load_qty NUMBER;
4882 l_tot_gross_wt NUMBER;
4883 l_tot_net_wt NUMBER;
4884 l_tot_vol NUMBER;
4885 l_dd_wt_per_pc NUMBER;
4886 l_dd_gross_wt_left NUMBER;
4887 l_dd_net_wt_left NUMBER;
4888 l_dd_vol_per_pc NUMBER;
4889 l_dd_vol_left NUMBER;
4890
4891 i NUMBER;
4892 j NUMBER;
4893 gcdvalue NUMBER;
4894
4895 l_count_container NUMBER;
4896 l_container_item_id NUMBER;
4897 l_container_org_id NUMBER;
4898 l_num_of_split NUMBER;
4899 l_dd_id_tab WSH_UTIL_CORE.id_tab_type;
4900
4901 --
4902 l_debug_on BOOLEAN;
4903 --
4904 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'PACK_DELIVERY_DETAIL';
4905 --
4906 BEGIN
4907 --
4908 --
4909 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4910 --
4911 IF l_debug_on IS NULL
4912 THEN
4913 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4914 END IF;
4915 --
4916 IF l_debug_on THEN
4917 WSH_DEBUG_SV.push(l_module_name);
4918 WSH_DEBUG_SV.log(l_module_name,'In Pack_Delivery_Detail API, Packing wdd '||p_line_cont_rec.delivery_detail_id||' div flag '||p_line_cont_rec.indivisible_flag||' Process Flag '||p_line_cont_rec.process_flag);
4919 WSH_DEBUG_SV.log(l_module_name,'Fill Pc Basis '||p_line_cont_rec.fill_pc_basis||' G Wt '||p_line_cont_rec.gross_weight||' N Wt '||p_line_cont_rec.net_weight||' Vol '||p_line_cont_rec.volume );
4920 END IF;
4921 --
4922 l_dd_gross_wt_left := ROUND(p_line_cont_rec.gross_weight,LIMITED_PRECISION);
4923 l_dd_net_wt_left := ROUND(p_line_cont_rec.net_weight,LIMITED_PRECISION);
4924 l_dd_vol_left := ROUND(p_line_cont_rec.volume,LIMITED_PRECISION);
4925
4926 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
4927 l_max_load_qty := p_line_cont_rec.max_load_qty;
4928 --dbms_output.put_line('Max Load qty is '||p_line_cont_rec.max_load_qty);
4929 ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
4930
4931 l_mtl_max_load := p_line_cont_rec.cont_wt;
4932
4933 -- Calculate Wt per Piece. We pack based on converted Container UOM weight
4934 l_weight_per_pc := TRUNC(p_line_cont_rec.converted_wt/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
4935 l_wt_left := p_line_cont_rec.converted_wt;
4936 -- Bug 2786021
4937 IF (nvl(l_mtl_max_load,0) = 0 OR nvl(l_weight_per_pc,0) = 0)THEN
4938 x_return_status := C_ERROR_STATUS;
4939 IF nvl(l_mtl_max_load,0) = 0 THEN
4940 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_LOAD_ERROR');
4941 ELSIF nvl(l_weight_per_pc,0) = 0 THEN
4942 FND_MESSAGE.SET_NAME('WSH','WSH_NULL_WEIGHT_VOLUME');
4943 FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL',p_line_cont_rec.delivery_detail_id);
4944 END IF;
4945 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4946 IF l_debug_on THEN
4947 WSH_DEBUG_SV.pop(l_module_name);
4948 END IF;
4949 RETURN;
4950 END IF;
4951 -- Bug 2786021
4952
4953 ELSE
4954 l_mtl_max_vol := p_line_cont_rec.cont_vol;
4955
4956 -- Calculate Vol per Piece. We pack based on converted Container UOM volume
4957 l_volume_per_pc := TRUNC(p_line_cont_rec.converted_vol/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
4958 l_vol_left := p_line_cont_rec.converted_vol;
4959 -- Bug 2786021
4960 IF (nvl(l_mtl_max_vol,0) = 0 OR nvl(l_volume_per_pc,0) = 0) THEN
4961 x_return_status := C_ERROR_STATUS;
4962 IF nvl(l_mtl_max_vol,0) = 0 THEN
4963 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_VOL_ERROR');
4964 ELSIF nvl(l_volume_per_pc,0) = 0 THEN
4965 FND_MESSAGE.SET_NAME('WSH','WSH_NULL_WEIGHT_VOLUME');
4966 FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL',p_line_cont_rec.delivery_detail_id);
4967 END IF;
4968 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4969 IF l_debug_on THEN
4970 WSH_DEBUG_SV.pop(l_module_name);
4971 END IF;
4972 RETURN;
4973 END IF;
4974 -- Bug 2786021
4975 END IF;
4976
4977 IF l_debug_on THEN
4978 WSH_DEBUG_SV.log(l_module_name,'Wt per pc-',l_weight_per_pc);
4979 WSH_DEBUG_SV.log(l_module_name,'Vol per pc-',l_volume_per_pc);
4980 WSH_DEBUG_SV.log(l_module_name,'Cont max load-',l_mtl_max_load);
4981 WSH_DEBUG_SV.log(l_module_name,'Cont max vol-',l_mtl_max_vol);
4982 END IF;
4983
4984 l_original_qty := p_line_cont_rec.shp_qty;
4985 l_quantity_left := p_line_cont_rec.shp_qty;
4986
4987 -- Check Empty Containers first
4988 IF (g_empty_cont_tab.COUNT > 0 ) THEN
4989 --dbms_output.put_line('There are containers with empty space'||to_char(sysdate,'HH24:MI:SS'));
4990
4991 i := g_empty_cont_tab.FIRST;
4992 WHILE i <= g_empty_cont_tab.LAST LOOP
4993 IF p_line_cont_rec.preferred_container <> g_empty_cont_tab(i).container_item_Id OR
4994 p_line_cont_rec.organization_id <> g_empty_cont_tab(i).organization_id OR
4995 p_line_cont_rec.group_id <> g_empty_cont_tab(i).group_id OR
4996 (NVL(p_line_cont_rec.master_cont_item_id,NVL(g_empty_cont_tab(i).mast_cont_item_id,-99)) <> NVL(g_empty_cont_tab(i).mast_cont_item_id,-99)) OR
4997 g_empty_cont_tab(i).empty <= 0 THEN
4998 GOTO next_cont;
4999 END IF;
5000
5001 -- Got a Match in empty container table
5002
5003 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
5004 --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty numerator '||g_empty_cont_tab(i).numerator||' denominator '||g_empty_cont_tab(i).denominator);
5005 -- Calculate qty than can fit in 'empty' space
5006 -- Bug 2733274
5007 l_tmp_split_qty := TRUNC((p_line_cont_rec.max_load_qty*g_empty_cont_tab(i).numerator)/g_empty_cont_tab(i).denominator,LIMITED_PRECISION);
5008
5009 ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
5010 --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty weight '||g_empty_cont_tab(i).empty);
5011 -- Calculate qty than can fit in 'empty' space
5012 l_tmp_split_qty := TRUNC(g_empty_cont_tab(i).empty/l_weight_per_pc,LIMITED_PRECISION);
5013 ELSE
5014 --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty volume '||g_empty_cont_tab(i).empty);
5015 -- Calculate qty than can fit in 'empty' space
5016 l_tmp_split_qty := TRUNC(g_empty_cont_tab(i).empty/l_volume_per_pc,LIMITED_PRECISION);
5017 END IF;
5018 -- l_tmp_split_qty is qty, in fraction, that can fit into empty container
5019 --dbms_output.put_line('l_tmp_split_qty '||l_tmp_split_qty||' l_tmp_split_qty2 '||l_tmp_split_qty2);
5020
5021 -- Per Pushkar,OPM: Call Check_Decimal_Quantity for both OPM and Discrete for primary quantity
5022 --
5023 IF l_debug_on THEN
5024 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
5025 END IF;
5026 --
5027 WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
5028 p_line_cont_rec.inventory_item_id,
5029 p_line_cont_rec.organization_id,
5030 l_tmp_split_qty,
5031 p_line_cont_rec.req_qty_uom,
5032 l_output_qty,
5033 l_return_status);
5034
5035 IF l_debug_on THEN
5036 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5037 END IF;
5038 IF (l_return_status <> C_SUCCESS_STATUS OR
5039 p_line_cont_rec.indivisible_flag = 'Y')THEN
5040 -- Fractional qtys not allowed
5041 --dbms_output.put_line('WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity returned '||l_return_status);
5042 l_discard_message := FND_MESSAGE.GET;
5043 l_tmp_split_qty := FLOOR(l_tmp_split_qty);
5044 END IF;
5045 -- HW OPMCONV - 1) No need to check for process
5046 -- - 2) Changed code to handle qty2
5047 -- - 3) Remove OPM specific precision to 9
5048
5049 IF ( p_line_cont_rec.shp_qty2 IS NOT NULL ) THEN
5050 l_tmp_split_qty2 := (l_tmp_split_qty * p_line_cont_rec.shp_qty2)/p_line_cont_rec.shp_qty;
5051 ELSE
5052 l_tmp_split_qty2 := NULL;
5053 END IF;
5054 --dbms_output.put_line('l_tmp_split_qty '||l_tmp_split_qty||' l_tmp_split_qty2 '||l_tmp_split_qty2||' l_quantity_left '||l_quantity_left);
5055
5056 IF (l_tmp_split_qty <= 0) THEN
5057 -- Container insufficient, skip this
5058 --dbms_output.put_line('Container Insufficient. Skipping this');
5059 GOTO next_cont;
5060 ELSE
5061 IF (l_tmp_split_qty >= l_quantity_left) THEN
5062 -- all left can be packed into the empty container
5063 l_tmp_split_qty := l_quantity_left;
5064 l_quantity_left := 0;
5065
5066 -- Assign the dd to container
5067 g_assign_detail_index := g_assign_detail_index + 1;
5068 g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := p_line_cont_rec.delivery_detail_id;
5069 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5070 g_assign_detail_tab(g_assign_detail_index).container_index := g_empty_cont_tab(i).container_index;
5071 g_assign_detail_tab(g_assign_detail_index).gross_weight := l_dd_gross_wt_left;
5072 g_assign_detail_tab(g_assign_detail_index).net_weight := l_dd_net_wt_left;
5073 g_assign_detail_tab(g_assign_detail_index).volume := l_dd_vol_left;
5074 -- J: W/V Changes
5075 g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5076 g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5077 g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5078 -- K LPN CONV. rv
5079 g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5080 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5081
5082 --dbms_output.put_line('Assigning '||g_assign_detail_tab(g_assign_detail_index).delivery_detail_id||' to Cont index '||g_assign_detail_tab(g_assign_detail_index).container_index);
5083
5084 ELSIF (l_tmp_split_qty < l_quantity_left) THEN
5085 -- Some qty will be left out
5086 --- HW OPM BUG#3011758
5087 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
5088 -- - 2) Changed check condition for lot divisible from 1 to 'N'
5089 IF( p_line_cont_rec.lot_divisible_flag = 'N') THEN
5090 goto next_cont;
5091 END IF;
5092
5093 l_quantity_left := l_quantity_left - l_tmp_split_qty;
5094
5095 --dbms_output.put_line('Splitting dd '||p_line_cont_rec.delivery_detail_id||' with qty '||l_tmp_split_qty);
5096 --
5097 IF l_debug_on THEN
5098 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
5099 WSH_DEBUG_SV.logmsg(l_module_name,'SPLIT QTY IS'||l_tmp_split_qty);
5100 END IF;
5101 --
5102
5103 -- added l_dd_id_tab for Bulk call
5104 -- empty container logic, need to test and modify this
5105 -- the value for p_num_of_split is passed as 1
5106 -- so that split occurs once
5107
5108 WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details_bulk (
5109 p_from_detail_id => p_line_cont_rec.delivery_detail_id,
5110 p_req_quantity => l_tmp_split_qty,
5111 p_req_quantity2 => l_tmp_split_qty2,
5112 p_manual_split => 'C',
5113 p_num_of_split => 1,
5114 x_new_detail_id => l_split_del_detail_id,
5115 x_dd_id_tab => l_dd_id_tab,
5116 x_return_status => l_return_status
5117 );
5118
5119 IF l_debug_on THEN
5120 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5121 END IF;
5122 --dbms_output.put_line('STATUS after SPLITDD in empty'||l_return_status||l_dd_id_tab.count);
5123
5124 IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
5125 WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
5126 --dbms_output.put_line('WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details returned '|| l_return_status);
5127 x_return_status := C_ERROR_STATUS;
5128 --dbms_output.put_line('WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details returned '||x_return_status);
5129 FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
5130 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_line_cont_rec.delivery_detail_id);
5131 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5132 --
5133 IF l_debug_on THEN
5134 WSH_DEBUG_SV.pop(l_module_name);
5135 END IF;
5136 --
5137 return;
5138 END IF;
5139
5140 IF l_debug_on THEN
5141 WSH_DEBUG_SV.logmsg(l_module_name,'COUNT OF WDD RECORDS IS'||l_dd_id_tab.count);
5142 END IF;
5143
5144 --dbms_output.put_line('Created new dd '||l_split_del_detail_id);
5145
5146 -- Calculate distributed wt/vol for the new dd
5147 l_tot_gross_wt := ROUND((l_tmp_split_qty * p_line_cont_rec.gross_weight)/p_line_cont_rec.shp_qty, LIMITED_PRECISION);
5148 l_tot_net_wt := ROUND((l_tmp_split_qty * p_line_cont_rec.net_weight)/p_line_cont_rec.shp_qty, LIMITED_PRECISION);
5149 l_tot_vol := ROUND((l_tmp_split_qty * p_line_cont_rec.volume)/p_line_cont_rec.shp_qty, LIMITED_PRECISION);
5150 l_dd_gross_wt_left := l_dd_gross_wt_left - l_tot_gross_wt;
5151 l_dd_net_wt_left := l_dd_net_wt_left - l_tot_net_wt;
5152 l_dd_vol_left := l_dd_vol_left - l_tot_vol;
5153
5154 -- Use Bulk assignment into this PL SQL table
5155 -- from the returned PL SQL table
5156 -- weight volume will be same
5157 -- Look for empty container population in record, is this correct???
5158
5159 FOR j in 1..l_dd_id_tab.count
5160 LOOP
5161 -- Assign the newly created dd
5162 --dbms_output.put_line('Value of j is'||j);
5163 g_assign_detail_index := g_assign_detail_index + 1;
5164 --g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_split_del_detail_id;
5165 g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_dd_id_tab(j);
5166 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5167 g_assign_detail_tab(g_assign_detail_index).container_index := g_empty_cont_tab(i).container_index;
5168 g_assign_detail_tab(g_assign_detail_index).gross_weight := l_tot_gross_wt;
5169 g_assign_detail_tab(g_assign_detail_index).net_weight := l_tot_net_wt;
5170 g_assign_detail_tab(g_assign_detail_index).volume := l_tot_vol;
5171 -- J: W/V Changes
5172 g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5173 g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5174 g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5175 -- K LPN CONV. rv
5176 g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5177 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5178 --dbms_output.put_line('Assigning '||g_assign_detail_tab(g_assign_detail_index).delivery_detail_id||' to Cont index '||g_assign_detail_tab(g_assign_detail_index).container_index);
5179
5180 -- j := j + 1;
5181
5182 END LOOP;
5183 l_dd_id_tab.DELETE;
5184 END IF;
5185
5186 -- Calcualte space left and see if container needs to be deleted from empty cont PL/SQL table
5187 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
5188 g_empty_cont_tab(i).numerator := (g_empty_cont_tab(i).numerator * l_max_load_qty) - (g_empty_cont_tab(i).denominator * l_tmp_split_qty);
5189 g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator * l_max_load_qty;
5190
5191 /* Bug # 3005780 : Added GCD just to reduce the numerator and denominator values
5192 Example : When packing 100 LPNs into a master container (Where Max load QTY is 100) , after some iterations the numerator and denominator values exceeding the maximum
5193 allowable value in NUMBER data type. to overcome that problem using the Get_Gcd function which limit the both numerator and denominator */
5194 IF (g_empty_cont_tab(i).numerator <> 0 ) AND (g_empty_cont_tab(i).denominator <> 0 ) THEN
5195 gcdvalue := Get_Gcd(g_empty_cont_tab(i).numerator , g_empty_cont_tab(i).denominator);
5196 --dbms_output.put_line('Get_Gcd return value is '||gcdvalue');
5197 IF (gcdvalue > 1) THEN
5198 g_empty_cont_tab(i).numerator := g_empty_cont_tab(i).numerator / gcdvalue;
5199 g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator / gcdvalue ;
5200 END IF;
5201 END IF;
5202 IF ((g_empty_cont_tab(i).numerator <= 0) OR
5203 (g_empty_cont_tab(i).numerator >= g_empty_cont_tab(i).denominator)) THEN
5204 --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
5205 g_empty_cont_tab.DELETE(i);
5206 END IF;
5207 ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
5208 l_wt_left := l_wt_left - ROUND(l_tmp_split_qty*l_weight_per_pc,LIMITED_PRECISION);
5209 g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - (l_tmp_split_qty * l_weight_per_pc);
5210 IF (g_empty_cont_tab(i).empty <= 0) THEN
5211 --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
5212 g_empty_cont_tab.DELETE(i);
5213 END IF;
5214 ELSE
5215 l_vol_left := l_vol_left - ROUND(l_tmp_split_qty*l_volume_per_pc,LIMITED_PRECISION);
5216 g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - (l_tmp_split_qty * l_volume_per_pc);
5217 IF (g_empty_cont_tab(i).empty <= 0) THEN
5218 --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
5219 g_empty_cont_tab.DELETE(i);
5220 END IF;
5221 END IF;
5222
5223 END IF; -- l_tmp_split_qty <= 0
5224
5225 -- If the whole qty is packed then exit the loop
5226 IF (l_quantity_left <= 0) THEN
5227 EXIT;
5228 END IF;
5229
5230 <<next_cont>>
5231 i := g_empty_cont_tab.NEXT(i);
5232 END LOOP;
5233 END IF; -- g_empty_cont_tab > 0
5234
5235 --dbms_output.put_line('AFter EMPTY containers with empty space'||to_char(sysdate,'HH24:MI:SS'));
5236
5237 --dbms_output.put_line(' *** Looping empty cont tab is Over and Quantity Left is '||l_quantity_left||' ***');
5238 IF (l_quantity_left > 0) THEN
5239 -- Some qty is left out
5240
5241 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
5242
5243 l_tmp_split_qty := l_max_load_qty;
5244 l_split_qty := l_tmp_split_qty;
5245
5246 ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
5247
5248 -- Need to do TRUNC instead of ROUND because of following case
5249 -- Ex: If we try to pack qty 4(wt per 3Lbs) into Cont with wt 2LB the value of l_tmp_split_qty(after ROUND) is 0.66667
5250 -- Total wt of split dd will be 0.66667 * 3 = 2.00001 which is > Cont capacity
5251 l_tmp_split_qty := TRUNC((l_quantity_left*l_mtl_max_load)/l_wt_left,LIMITED_PRECISION);
5252 l_split_qty := l_tmp_split_qty;
5253 --dbms_output.put_line('l_quantity_left '||l_quantity_left||' l_wt_left '||l_wt_left||' l_mtl_max_load '||l_mtl_max_load);
5254
5255 ELSE
5256
5257 l_tmp_split_qty := TRUNC((l_quantity_left*l_mtl_max_vol)/l_vol_left,LIMITED_PRECISION);
5258 l_split_qty := l_tmp_split_qty;
5259 --dbms_output.put_line('l_quantity_left '||l_quantity_left||' l_vol_left '||l_vol_left||' l_mtl_max_vol '||l_mtl_max_vol);
5260
5261 END IF;
5262 -- l_tmp_split_qty holds max that can be packed into a new container
5263 --dbms_output.put_line(' l_tmp_split_qty '||l_tmp_split_qty);
5264
5265 -- Per Pushkar,OPM: Call Check_Decimal_Quantity for both OPM and Discrete for primary quantity
5266 --
5267 IF l_debug_on THEN
5268 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
5269 END IF;
5270 --
5271 WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
5272 p_line_cont_rec.inventory_item_id,
5273 p_line_cont_rec.organization_id,
5274 l_tmp_split_qty,
5275 p_line_cont_rec.req_qty_uom,
5276 l_output_qty,
5277 l_return_status);
5278
5279 IF l_debug_on THEN
5280 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5281 END IF;
5282 IF (l_return_status <> C_SUCCESS_STATUS OR
5283 p_line_cont_rec.indivisible_flag = 'Y')THEN
5284 -- Fractional qtys not allowed
5285 --dbms_output.put_line('WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity returned '||l_return_status);
5286 l_discard_message := FND_MESSAGE.GET;
5287 l_split_qty := FLOOR(l_tmp_split_qty);
5288 END IF;
5289
5290 -- HW OPMCONV - 1) No need to check for process
5291 -- - 2) Changed code to handle qty2
5292
5293 IF ( p_line_cont_rec.shp_qty2 IS NOT NULL ) THEN
5294 l_split_qty2 := (l_split_qty * p_line_cont_rec.shp_qty2)/p_line_cont_rec.shp_qty;
5295 ELSE
5296 l_split_qty2 := NULL;
5297 END IF;
5298 -- Split Qty holds quantity that can be packed into a container
5299
5300 --dbms_output.put_line('l_split_qty '||l_split_qty||' l_split_qty2 '||l_split_qty2);
5301 -- initialize the variables
5302 l_count_container := 0;
5303 l_container_item_id := -99;
5304 l_container_org_id := -99;
5305
5306 --dbms_output.put_line('Before LOOP in pack DD'||to_char(sysdate,'HH24:MI:SS'));
5307 WHILE (l_quantity_left > 0) LOOP
5308
5309 -- Create new container index
5310 --g_new_cont_index := g_new_cont_index + 1;
5311
5312 -- added code here
5313 IF (p_line_cont_rec.preferred_container = l_container_item_id
5314 AND p_line_cont_rec.organization_id = l_container_org_id)
5315 THEN
5316 -- keep appending this logic is moved to the end
5317 null;
5318 ELSE
5319 -- reset counter
5320 l_count_container := 0;
5321 END IF;
5322
5323 l_container_item_id := p_line_cont_rec.preferred_container;
5324 l_container_org_id := p_line_cont_rec.organization_id;
5325
5326 --dbms_output.put_line('Created Container index '||g_new_cont_index);
5327 --dbms_output.put_line('l_tmp_split_qty '||l_tmp_split_qty||' l_split_qty '||l_split_qty);
5328
5329 IF (l_split_qty < l_quantity_left
5330 AND l_split_qty > 0
5331 ) THEN
5332 -- Quantity left is > Split qty
5333 l_num_of_split := CEIL(l_quantity_left/l_split_qty) -1;
5334
5335 -- Start BugFix#3475352
5336 IF (l_num_of_split + 1) > 100000 THEN
5337 x_return_status := C_ERROR_STATUS;
5338 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONT_COUNT');
5339 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_line_cont_rec.delivery_detail_id);
5340 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5341 return;
5342 END IF;
5343 -- End BugFix#3475352
5344
5345 --dbms_output.put_line('Splitting dd '||p_line_cont_rec.delivery_detail_id||' with qty '||l_split_qty);
5346 IF l_debug_on THEN
5347 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
5348 WSH_DEBUG_SV.logmsg(l_module_name,'Split Qty is'||l_split_qty);
5349 WSH_DEBUG_SV.logmsg(l_module_name,'Number of split is'||l_num_of_split);
5350 END IF;
5351
5352 --this is in Main Loop
5353 -- Call BULK Split API
5354
5355 --dbms_output.put_line('======BEFORE SPLIT'||l_dd_id_tab.count||'<'||l_num_of_split);
5356
5357 WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details_bulk (
5358 p_from_detail_id => p_line_cont_rec.delivery_detail_id,
5359 p_req_quantity => l_split_qty,
5360 p_req_quantity2 => l_split_qty2,
5361 p_manual_split => 'C',
5362 p_num_of_split => l_num_of_split,
5363 x_new_detail_id => l_split_del_detail_id,
5364 x_dd_id_tab => l_dd_id_tab,
5365 x_return_status => l_return_status
5366 );
5367
5368 IF l_debug_on THEN
5369 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5370 END IF;
5371
5372 IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
5373 WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
5374 --dbms_output.put_line('WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details returned '|| l_return_status);
5375 x_return_status := C_ERROR_STATUS;
5376 FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
5377 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_line_cont_rec.delivery_detail_id);
5378 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5379
5380 IF l_debug_on THEN
5381 WSH_DEBUG_SV.pop(l_module_name);
5382 END IF;
5383
5384 return;
5385 END IF;
5386 --dbms_output.put_line('======AFTER SPLIT'||l_dd_id_tab.count);
5387
5388 ELSE -- (l_split_qty < l_quantity_left)
5389 -- l_quantity_left <= l_split_qty which means there is no more qty left
5390
5391 l_split_qty := l_quantity_left;
5392 l_split_del_detail_id := p_line_cont_rec.delivery_detail_id;
5393 l_dd_id_tab(l_dd_id_tab.count + 1) := p_line_cont_rec.delivery_detail_id;
5394 END IF;
5395 --dbms_output.put_line('l_tmp_split_qty '||l_tmp_split_qty||' l_split_qty '||l_split_qty);
5396
5397 -- Insert the new container into empty PL/SQL cont table only if l_tmp_split_qty > l_split_qty
5398 -- Otherwise Container is full
5399 IF ((l_tmp_split_qty - l_split_qty) > 0) THEN
5400 -- l_tmp_split_qty > l_split_qty means container is not full and
5401 -- we need to calculate how much empty space is left
5402 IF (g_empty_cont_tab.COUNT = 0) THEN
5403 j := 1;
5404 ELSE
5405 j:= g_empty_cont_tab.LAST + 1;
5406 END IF;
5407 --g_empty_cont_tab(j).container_index := g_new_cont_index;
5408 -- changed this part
5409 g_empty_cont_tab(j).container_index := g_new_cont_index + 1;
5410 g_empty_cont_tab(j).container_item_id := p_line_cont_rec.preferred_container;
5411 g_empty_cont_tab(j).organization_id := p_line_cont_rec.organization_id;
5412 g_empty_cont_tab(j).group_id := p_line_cont_rec.group_id;
5413 g_empty_cont_tab(j).mast_cont_item_id := p_line_cont_rec.master_cont_item_id;
5414
5415 -- Calculate Empty Space
5416 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
5417 g_empty_cont_tab(j).numerator := l_max_load_qty - l_split_qty;
5418 g_empty_cont_tab(j).denominator := l_max_load_qty;
5419 --dbms_output.put_line('Inserted Container '||j||' with numerator '||g_empty_cont_tab(j).numerator||' and denominator '||g_empty_cont_tab(j).denominator);
5420 ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
5421 g_empty_cont_tab(j).empty := l_mtl_max_load - (l_split_qty * l_weight_per_pc);
5422 --dbms_output.put_line('Inserted Container '||j||' with empty weight '||g_empty_cont_tab(j).empty||' into empty cont');
5423 ELSE
5424 g_empty_cont_tab(j).empty := l_mtl_max_vol - ROUND(l_split_qty * l_volume_per_pc,LIMITED_PRECISION);
5425 --dbms_output.put_line('Inserted Container '||j||' with empty volume '||g_empty_cont_tab(j).empty||' into empty cont');
5426 END IF;
5427 END IF;
5428
5429 -- Calculate distributed wt/vol for the new dd
5430 l_tot_gross_wt := ROUND((l_split_qty * p_line_cont_rec.gross_weight)/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
5431 l_tot_net_wt := ROUND((l_split_qty * p_line_cont_rec.net_weight)/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
5432 l_tot_vol := ROUND((l_split_qty * p_line_cont_rec.volume)/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
5433 --dbms_output.put_line('l_tot_vol '||l_tot_vol||' l_dd_vol_left '||l_dd_vol_left);
5434
5435 -- Assign the split dd/existing dd
5436 -- changed the call to populate the PL SQL table
5437
5438 IF l_dd_id_tab.count > 0 THEN
5439 FOR j in 1..l_dd_id_tab.count
5440 LOOP
5441 IF l_count_container > 0 THEN
5442 l_count_container := l_count_container + 1;
5443 g_new_container_tab(g_num_cont_index).number_of_containers := l_count_container;
5444 g_new_cont_index := g_new_cont_index + 1;
5445 ELSE
5446 l_count_container := 1;
5447 g_num_cont_index := g_num_cont_index + 1;
5448 g_new_cont_index := g_new_cont_index + 1;
5449 g_new_container_tab(g_num_cont_index).container_item_id := p_line_cont_rec.preferred_container;
5450 g_new_container_tab(g_num_cont_index).organization_id := p_line_cont_rec.organization_id;
5451 g_new_container_tab(g_num_cont_index).mast_cont_item_id := p_line_cont_rec.master_cont_item_id;
5452 g_new_container_tab(g_num_cont_index).number_of_containers := l_count_container;
5453
5454 END IF;
5455
5456 g_assign_detail_index := g_assign_detail_index + 1;
5457 g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_dd_id_tab(j);
5458 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5459 g_assign_detail_tab(g_assign_detail_index).container_index := g_new_cont_index;
5460 g_assign_detail_tab(g_assign_detail_index).gross_weight := l_tot_gross_wt;
5461 g_assign_detail_tab(g_assign_detail_index).net_weight := l_tot_net_wt;
5462 g_assign_detail_tab(g_assign_detail_index).volume := l_tot_vol;
5463 -- J: W/V Changes
5464 g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5465 g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5466 g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5467 -- K LPN CONV. rv
5468 g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5469 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5470 -- K LPN CONV. rv
5471
5472 l_quantity_left := l_quantity_left - l_split_qty;
5473 l_dd_gross_wt_left := l_dd_gross_wt_left - l_tot_gross_wt;
5474 l_dd_net_wt_left := l_dd_net_wt_left - l_tot_net_wt;
5475 l_dd_vol_left := l_dd_vol_left - l_tot_vol;
5476
5477 END LOOP;
5478
5479 l_dd_id_tab.DELETE;
5480
5481 -- so that this table is not read later,
5482 -- we continue in the LOOP even if qty_left = 1, so in that case
5483 -- should not reach here
5484
5485 -- commented this and put it in the LOOP above
5486 -- l_quantity_left := GREATEST(l_quantity_left - (FLOOR(l_quantity_left/l_split_qty) *l_split_qty),0);
5487 ELSE
5488 g_assign_detail_index := g_assign_detail_index + 1;
5489 g_new_cont_index := g_new_cont_index + 1;
5490 g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_split_del_detail_id;
5491 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5492 g_assign_detail_tab(g_assign_detail_index).container_index := g_new_cont_index;
5493 g_assign_detail_tab(g_assign_detail_index).gross_weight := l_tot_gross_wt;
5494 g_assign_detail_tab(g_assign_detail_index).net_weight := l_tot_net_wt;
5495 g_assign_detail_tab(g_assign_detail_index).volume := l_tot_vol;
5496 -- J: W/V Changes
5497 g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5498 g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5499 g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5500 -- K LPN CONV. rv
5501 g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5502 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5503 -- K LPN CONV. rv
5504 --dbms_output.put_line('Assigning '||g_assign_detail_tab(g_assign_detail_index).delivery_detail_id||' to Cont index '||g_assign_detail_tab(g_assign_detail_index).container_index);
5505
5506 l_quantity_left := l_quantity_left - l_split_qty;
5507
5508 END IF;
5509
5510
5511 -- If there is no more qty left, then adjust any wt/vol left on last dd
5512 IF (l_quantity_left <= 0) THEN
5513 --dbms_output.put_line('Assigning the left over Weight');
5514 g_assign_detail_tab(g_assign_detail_index).gross_weight := g_assign_detail_tab(g_assign_detail_index).gross_weight + l_dd_gross_wt_left;
5515 g_assign_detail_tab(g_assign_detail_index).net_weight := g_assign_detail_tab(g_assign_detail_index).net_weight + l_dd_net_wt_left;
5516 g_assign_detail_tab(g_assign_detail_index).volume := g_assign_detail_tab(g_assign_detail_index).volume + l_dd_vol_left;
5517 END IF;
5518 --dbms_output.put_line('l_quantity_left '||l_quantity_left);
5519
5520 END LOOP;
5521
5522 --dbms_output.put_line('End of Pack DD, Count is '||l_count_container||to_char(sysdate,'HH24:MI:SS'));
5523
5524 END IF;
5525 x_return_status := C_SUCCESS_STATUS;
5526 --
5527 IF l_debug_on THEN
5528 WSH_DEBUG_SV.pop(l_module_name);
5529 END IF;
5530 --
5531 RETURN;
5532
5533 EXCEPTION
5534 WHEN Others THEN
5535 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Pack_Delivery_Detail',l_module_name);
5536 x_return_status := C_UNEXP_ERROR_STATUS;
5537
5538 --
5539 IF l_debug_on THEN
5540 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
5541 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
5542 END IF;
5543 --
5544 END Pack_Delivery_Detail;
5545
5546 /*
5547 -----------------------------------------------------------------------------
5548 PROCEDURE : Validate_Dd_for_Pack
5549 PARAMETERS : p_group_id_tab_id - table of group ids for lines that need to
5550 be autopacked.
5551 p_del_detail_tab - table of delivery detail ids
5552 x_line_cont_tab - Delivery Details along with other info
5553 which passed validations
5554 x_error_cnt - Count of errors encountered during validation
5555 x_warn_cnt - Count of warnings encountered during validation
5556 x_fill_pc_warn_cnt - Count of Fill Percent Basis 'None' dds.
5557 x_fill_pc_warn_cnt - Count of details with Fill Percent Basis 'None'.
5558 x_release_warn_cnt - Count of 'Released to Warehouse' dds.
5559 DESCRIPTION : This procedure takes a list of delivery details and does all
5560 validations and returns a list of delivery details which passed
5561 validations
5562 ------------------------------------------------------------------------------
5563 */
5564
5565 PROCEDURE Validate_Dd_for_Pack(
5566 p_group_id_tab IN WSH_UTIL_CORE.id_tab_type,
5567 p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
5568 x_line_cont_tab OUT NOCOPY wsh_container_actions.line_cont_info_tab,
5569 x_error_cnt OUT NOCOPY NUMBER,
5570 x_warn_cnt OUT NOCOPY NUMBER,
5571 x_fill_pc_warn_cnt OUT NOCOPY NUMBER, -- bug 3562797 jckwok
5572 x_release_warn_cnt OUT NOCOPY NUMBER) IS
5573
5574 CURSOR Get_dd_Detail IS
5575 SELECT wdd.inventory_item_id inventory_item_id,
5576 NVL(wdd.shipped_quantity, NVL(wdd.picked_quantity, wdd.requested_quantity)) packed_quantity,
5577 NVL(wdd.shipped_quantity2, NVL(wdd.picked_quantity2, wdd.requested_quantity2)) packed_quantity2,
5578 NVL(wdd.picked_quantity, wdd.requested_quantity) picked_quantity,
5579 NVL(wdd.picked_quantity2, wdd.requested_quantity2) picked_quantity2,
5580 wdd.requested_quantity_uom requested_quantity_uom,
5581 nvl(wdd.wv_frozen_flag,'Y') wv_frozen_flag,
5582 wdd.gross_weight gross_weight,
5583 wdd.net_weight net_weight,
5584 wdd.weight_uom_code weight_uom_code,
5585 wdd.volume volume,
5586 wdd.volume_uom_code volume_uom_code,
5587 wdd.detail_container_item_id detail_container_item_id,
5588 wdd.master_container_item_id master_container_item_id,
5589 wdd.organization_id organization_id,
5590 wdd.source_line_id source_line_id,
5591 wdd.delivery_detail_id delivery_detail_id,
5592 wdd.released_status,
5593 wdd.source_code,
5594 wda.parent_delivery_detail_id parent_delivery_detail_id,
5595 wda.delivery_id delivery_id, -- added delivery id
5596 msi.indivisible_flag indivisible_flag
5597 FROM WSH_DELIVERY_DETAILS wdd,
5598 wsh_delivery_assignments_v wda,
5599 MTL_SYSTEM_ITEMS msi,
5600 WSH_TMP wt
5601 WHERE wdd.delivery_detail_id = wt.id
5602 AND wdd.delivery_detail_id = wda.delivery_detail_id
5603 AND wdd.container_flag = 'N'
5604 AND wdd.inventory_item_id = msi.inventory_item_id
5605 AND wdd.organization_id = msi.organization_id
5606 ORDER BY wdd.organization_id,wdd.inventory_item_id,source_line_id;
5607
5608 CURSOR Get_Cont_Item_Load (v_inv_item_id NUMBER, v_cont_item_id NUMBER, v_organization_id NUMBER) IS
5609 SELECT max_load_quantity
5610 FROM WSH_CONTAINER_ITEMS
5611 WHERE load_item_id = v_inv_item_id
5612 AND container_item_id = v_cont_item_id
5613 AND master_organization_id = v_organization_id;
5614
5615 line_cont_rec line_cont_info;
5616 line_cont_tab line_cont_info_tab;
5617
5618 l_dd_count NUMBER;
5619 l_group_id NUMBER;
5620 l_wcl_cont_item_id NUMBER;
5621 l_fill_pc_basis VARCHAR2(1);
5622 l_max_load_qty NUMBER;
5623 l_item_load_found BOOLEAN;
5624
5625 l_return_status VARCHAR2(1);
5626
5627 l_dd_gross_wt NUMBER;
5628 l_dd_net_wt NUMBER;
5629 l_dd_volume NUMBER;
5630 l_mtl_max_load NUMBER;
5631 l_mtl_max_vol NUMBER;
5632 l_mtl_wt_uom VARCHAR2(3);
5633 l_mtl_vol_uom VARCHAR2(3);
5634 l_tmp_num_cont NUMBER;
5635 l_discard_message VARCHAR2(2000);
5636 l_output_qty NUMBER;
5637 l_process_flag VARCHAR2(1);
5638 l_last_organization_id NUMBER;
5639 l_error_cnt NUMBER := 0;
5640
5641 warn_cnt NUMBER := 0;
5642 error_cnt NUMBER := 0;
5643 release_warn_cnt NUMBER := 0;
5644 fill_pc_warn_cnt NUMBER := 0; -- bug 3562797 jckwok
5645 --
5646 l_debug_on BOOLEAN;
5647 --
5648 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'VALIDATE_DD_FOR_PACK';
5649 --
5650
5651 -- HW OPMCONV - New variable to hold item info
5652 l_item_info WSH_DELIVERY_DETAILS_INV.mtl_system_items_rec;
5653 -- HW OPM BUG# 3011758
5654 -- HW OPMCONV - Removed opm variables
5655
5656 -- HW OPMCONV - Renamed variable from lot_indivisible to l_lot_divisible_flag
5657 l_lot_divisible_flag VARCHAR2(1);
5658
5659 -- HW OPMCONV - New variables to hold warnings and errors
5660 l_num_warnings NUMBER :=0;
5661 l_num_errors NUMBER := 0;
5662 x_return_status VARCHAR2(5);
5663 BEGIN
5664
5665 --dbms_output.put_line('---------------------------');
5666 --dbms_output.put_line('In Validate_Dd_for_Pack ...');
5667 --dbms_output.put_line('---------------------------');
5668
5669 -- 10. Delete and Bulk Insert into the wsh_tmp table
5670 --
5671 --
5672 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
5673 --
5674 IF l_debug_on IS NULL
5675 THEN
5676 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
5677 END IF;
5678 --
5679 IF l_debug_on THEN
5680 WSH_DEBUG_SV.push(l_module_name);
5681 END IF;
5682 --
5683 DELETE FROM wsh_tmp;
5684
5685 FORALL i IN 1..p_del_detail_tab.count
5686 INSERT INTO wsh_tmp (id) VALUES(p_del_detail_tab(i));
5687
5688 -- 20. Populate detail dd info into line_cont_tab PL/SQL table
5689 l_last_organization_id := NULL;
5690 l_dd_count := 0;
5691
5692 FOR rec in get_dd_detail
5693 LOOP
5694 --dbms_output.put_line('Processing dd '||rec.delivery_detail_id||' Org '||rec.organization_id);
5695
5696 -- 20.10 Delete Organization Specfic Cached Tables if organization_id changes
5697 IF ((l_last_organization_id IS NULL) OR (rec.organization_id <> l_last_organization_id)) THEN
5698 g_cache_cont_load_info_tab.DELETE;
5699 g_cont_msi_tab.DELETE;
5700
5701 l_last_organization_id := rec.organization_id;
5702 END IF;
5703
5704
5705 /* grouping API will return a number = negative delivery_id if the line is
5706 already assigned to a delivery. So, check for negative numbers and if number
5707 < 0, then convert it to a postive number = delivery_id.
5708 */
5709 l_group_id := ABS(p_group_id_tab(rec.delivery_detail_id));
5710 --dbms_output.put_line('l_group_id '||l_group_id);
5711
5712 -- 20.12 Populate line_cont_tab PL/SQL table now
5713 IF ((rec.packed_quantity <> 0) AND (rec.released_status NOT IN ('C','D'))) THEN
5714 line_cont_rec.group_id := l_group_id;
5715 line_cont_rec.delivery_detail_id := rec.delivery_detail_id;
5716 line_cont_rec.inventory_item_id := rec.inventory_item_id;
5717 line_cont_rec.shp_qty := rec.packed_quantity;
5718 line_cont_rec.shp_qty2 := rec.packed_quantity2;
5719 line_cont_rec.req_qty := rec.picked_quantity;
5720 line_cont_rec.req_qty2 := rec.picked_quantity2;
5721 line_cont_rec.req_qty_uom := rec.requested_quantity_uom;
5722 line_cont_rec.detail_cont_item_id := rec.detail_container_item_id;
5723 line_cont_rec.master_cont_item_id := rec.master_container_item_id;
5724 line_cont_rec.gross_weight := rec.gross_weight;
5725 line_cont_rec.net_weight := rec.net_weight;
5726 line_cont_rec.weight_uom := rec.weight_uom_code;
5727 line_cont_rec.volume := rec.volume;
5728 line_cont_rec.volume_uom := rec.volume_uom_code;
5729 line_cont_rec.organization_id := rec.organization_id;
5730 line_cont_rec.source_line_id := rec.source_line_id;
5731 line_cont_rec.indivisible_flag := rec.indivisible_flag;
5732 line_cont_rec.delivery_id := rec.delivery_id;
5733 ELSE
5734 goto next_detail;
5735 END IF;
5736
5737 -- 20.20 Check if the detail is already packed
5738 IF (rec.parent_delivery_detail_id IS NOT NULL) THEN
5739 --dbms_output.put_line('Warning: dd already packed');
5740 warn_cnt := warn_cnt + 1;
5741 goto next_detail;
5742 END IF;
5743
5744 -- 20.30 Ignore dds with status 'Released to Warehouse'
5745 IF (rec.released_status = 'S') THEN
5746 release_warn_cnt := release_warn_cnt + 1;
5747 goto next_detail;
5748 END IF;
5749
5750 --dbms_output.put_line('Before calc_fill_basis');
5751
5752 -- 20.40 Determine Fill PC Basis from shipping parameters and Process Flag
5753 Calc_Fill_Basis_and_Proc_Flag(
5754 p_organization_id => rec.organization_id,
5755 x_return_status => l_return_status,
5756 x_fill_basis => l_fill_pc_basis,
5757 x_process_flag => l_process_flag);
5758
5759
5760 IF (l_return_status <> C_SUCCESS_STATUS) THEN
5761 error_cnt := error_cnt + 1;
5762 goto next_detail;
5763 END IF;
5764 --
5765 -- bug 3562797 jckwok - Ignore dds with 'Shipping Parameter' percent fill basis as None.
5766 -- Increment fill_pc_warn_cnt so that the caller know how many had fill basis of None.
5767 --
5768 IF (l_fill_pc_basis = 'N') THEN
5769 fill_pc_warn_cnt := fill_pc_warn_cnt + 1;
5770 goto next_detail;
5771 END IF;
5772 -- end bug
5773
5774 line_cont_rec.fill_pc_basis := l_fill_pc_basis;
5775 -- HW OPMCONV - No need to populate this value
5776 -- line_cont_rec.process_flag := l_process_flag;
5777
5778 -- HW OPM BUG#:3011758 Retrieve OPM item information
5779 -- HW OPMCONV - 1)Change the call from OPM API to get item info
5780 -- to a new WSH API
5781 -- - 2) Remove checking for process
5782
5783 WSH_DELIVERY_DETAILS_INV.Get_item_information
5784 (
5785 p_organization_id => rec.organization_id
5786 , p_inventory_item_id => rec.inventory_item_id
5787 , x_mtl_system_items_rec => l_item_info
5788 , x_return_status => l_return_status
5789 );
5790
5791
5792 IF l_debug_on THEN
5793 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5794 END IF;
5795
5796 wsh_util_core.api_post_call
5797 (
5798 p_return_status => l_return_status,
5799 x_num_warnings => l_num_warnings,
5800 x_num_errors => l_num_errors
5801 );
5802
5803 IF ( l_item_info.lot_divisible_flag = 'N' AND
5804 l_item_info.lot_control_code= 2) THEN
5805 line_cont_rec.lot_divisible_flag := 'N';
5806 ELSE
5807 line_cont_rec.lot_divisible_flag := 'Y';
5808 END IF;
5809
5810
5811 -- HW OPMCONV - No need to check for process_flag. Removed OR condition
5812 IF (line_cont_rec.fill_pc_basis IS NULL) THEN
5813 --dbms_output.put_line('Skipping dd');
5814
5815 goto next_detail;
5816 END IF;
5817
5818 -- 20.50 Determine Preferred Container
5819 line_cont_rec.preferred_container := nvl(rec.detail_container_item_id,rec.master_container_item_id);
5820 line_cont_rec.max_load_qty := NULL;
5821
5822 --dbms_output.put_line('Before calc_pref_cont');
5823
5824 IF (line_cont_rec.preferred_container IS NULL) THEN
5825
5826 Calc_Pref_Container(
5827 p_organization_id => rec.organization_id,
5828 p_inventory_item_id => rec.inventory_item_id,
5829 p_fill_pc_basis => line_cont_rec.fill_pc_basis,
5830 x_return_status => l_return_status,
5831 x_error_cnt => l_error_cnt,
5832 x_cont_item_id => l_wcl_cont_item_id,
5833 x_max_load_qty => l_max_load_qty);
5834
5835 IF l_debug_on THEN
5836 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5837 END IF;
5838
5839 IF (l_return_status = C_ERROR_STATUS) THEN
5840 error_cnt := error_cnt + l_error_cnt;
5841 END IF;
5842
5843 line_cont_rec.preferred_container := l_wcl_cont_item_id;
5844 line_cont_rec.max_load_qty := l_max_load_qty;
5845 END IF;
5846
5847 -- bug 3440811
5848 validate_container(
5849 p_organization_id => rec.organization_id,
5850 p_cont_item_id => line_cont_rec.preferred_container,
5851 x_return_status => l_return_status);
5852
5853 IF (l_return_status IN (C_UNEXP_ERROR_STATUS,C_ERROR_STATUS)) THEN
5854 line_cont_rec.preferred_container := null;
5855 line_cont_rec.max_load_qty := null;
5856 l_error_cnt := l_error_cnt + 1;
5857 error_cnt := error_cnt + l_error_cnt;
5858 END IF;
5859 -- bug 3440811
5860
5861
5862 IF (line_cont_rec.preferred_container is NULL) THEN
5863 --dbms_output.put_line('Skipping dd');
5864 goto next_detail;
5865 END IF;
5866
5867
5868 -- 20.60 Calculate Max Load/Converted wt/Converted Vol depending on fill basis
5869 line_cont_rec.converted_wt := NULL;
5870 line_cont_rec.converted_vol := NULL;
5871
5872 --dbms_output.put_line('FILL BASIS'||line_cont_rec.fill_pc_basis||line_cont_rec.max_load_qty);
5873 IF (line_cont_rec.fill_pc_basis = 'Q') THEN
5874 IF (line_cont_rec.max_load_qty IS NULL) THEN
5875 OPEN Get_Cont_Item_Load (rec.inventory_item_id,line_cont_rec.preferred_container, rec.organization_id);
5876
5877 FETCH Get_Cont_Item_Load
5878 INTO l_max_load_qty;
5879
5880 l_item_load_found := FALSE;
5881 IF Get_Cont_Item_Load%NOTFOUND THEN
5882 l_item_load_found := TRUE;
5883 END IF;
5884 CLOSE Get_Cont_Item_Load;
5885
5886 IF (l_item_load_found) THEN
5887 --dbms_output.put_line('Could not find max load qty for Item '||rec.inventory_item_id||' Cont '||line_cont_rec.preferred_container||' Org '||rec.organization_id);
5888
5889 -- Calculate max load qty depending on Weight/Volume
5890 IF (rec.net_weight IS NULL OR rec.volume IS NULL) THEN
5891 --
5892 IF rec.wv_frozen_flag = 'N' THEN
5893
5894 IF l_debug_on THEN
5895 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DETAIL_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
5896 END IF;
5897 --
5898 WSH_WV_UTILS.Detail_Weight_Volume(
5899 p_delivery_detail_id => rec.delivery_detail_id,
5900 -- J: W/V Changes
5901 p_update_flag => 'Y',
5902 p_post_process_flag => 'Y',
5903 p_calc_wv_if_frozen => 'N',
5904 x_net_weight => l_dd_net_wt,
5905 x_volume => l_dd_volume ,
5906 x_return_status => l_return_status);
5907 IF l_debug_on THEN
5908 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5909 END IF;
5910
5911 IF (l_return_status <> C_SUCCESS_STATUS) THEN
5912 --dbms_output.put_line('WSH_WV_UTILS.Detail_Weight_Volume did not return success');
5913 FND_MESSAGE.SET_NAME('WSH','WSH_DET_WT_VOL_FAILED');
5914 FND_MESSAGE.SET_TOKEN('DETAIL_ID',rec.delivery_detail_id);
5915 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
5916 error_cnt := error_cnt + 1;
5917 --dbms_output.put_line('Skipping this dd');
5918 goto next_detail;
5919 END IF;
5920
5921 rec.gross_weight := NVL(rec.gross_weight,l_dd_net_wt);
5922 rec.net_weight := NVL(rec.net_weight,l_dd_net_wt);
5923 rec.volume := NVL(rec.volume,l_dd_volume);
5924
5925 END IF;
5926
5927 IF ((NVL(rec.net_weight,0) = 0) OR
5928 (NVL(rec.volume,0) = 0)) THEN
5929 --dbms_output.put_line('Weight or Volume is NULL or 0');
5930 FND_MESSAGE.SET_NAME('WSH', 'WSH_NULL_WEIGHT_VOLUME');
5931 FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL', rec.delivery_detail_id);
5932 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5933 error_cnt := error_cnt + 1;
5934 --dbms_output.put_line('Skipping this dd');
5935 goto next_detail;
5936 END IF;
5937 END IF;
5938
5939 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 4');
5940 Get_Cont_Load_Vol_info(
5941 p_container_item_id => line_cont_rec.preferred_container,
5942 p_organization_id => line_cont_rec.organization_id,
5943 p_w_v_both => 'B',
5944 x_max_load => l_mtl_max_load,
5945 x_max_vol => l_mtl_max_vol,
5946 x_wt_uom => l_mtl_wt_uom,
5947 x_vol_uom => l_mtl_vol_uom,
5948 x_return_status => l_return_status,
5949 x_error_cnt => l_error_cnt);
5950
5951 IF l_debug_on THEN
5952 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5953 END IF;
5954 IF (l_return_status IN (C_ERROR_STATUS,C_UNEXP_ERROR_STATUS)
5955 ) THEN
5956 error_cnt := error_cnt + l_error_cnt;
5957 END IF;
5958
5959 -- Bug 2786021
5960 IF (nvl(l_mtl_max_load,0) = 0) OR
5961 (nvl(l_mtl_max_vol,0) = 0) THEN
5962 IF l_debug_on THEN
5963 WSH_DEBUG_SV.log(l_module_name,'fill pc is Q,but use Wt or Vol');
5964 WSH_DEBUG_SV.log(l_module_name,'Wt-'||l_mtl_max_load);
5965 WSH_DEBUG_SV.log(l_module_name,'Vol-'||l_mtl_max_vol);
5966 END IF;
5967 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_MAX_WT_ERROR');
5968 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5969 error_cnt := error_cnt + l_error_cnt;
5970 goto next_detail;
5971 END IF;
5972 -- Bug 2786021
5973
5974 IF ((NVL(l_mtl_max_load,0) <= 0) OR (NVL(l_mtl_max_vol,0) <= 0)) THEN
5975 --dbms_output.put_line('Skipping this dd');
5976 goto next_detail;
5977 END IF;
5978
5979 IF (l_mtl_wt_uom <> rec.weight_uom_code) THEN
5980 --
5981 IF l_debug_on THEN
5982 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
5983 END IF;
5984 --
5985 l_dd_gross_wt := WSH_WV_UTILS.Convert_Uom (
5986 from_uom => rec.weight_uom_code,
5987 to_uom => l_mtl_wt_uom,
5988 quantity => rec.gross_weight,
5989 item_id => rec.inventory_item_id);
5990 ELSE
5991 l_dd_gross_wt := rec.gross_weight;
5992 END IF;
5993
5994 IF (l_mtl_vol_uom <> rec.volume_uom_code) THEN
5995 --
5996 IF l_debug_on THEN
5997 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
5998 END IF;
5999 --
6000 l_dd_volume := WSH_WV_UTILS.Convert_Uom (
6001 from_uom => rec.volume_uom_code,
6002 to_uom => l_mtl_vol_uom,
6003 quantity => rec.volume,
6004 item_id => rec.inventory_item_id);
6005 ELSE
6006 l_dd_volume:= rec.volume;
6007 END IF;
6008
6009 IF ((l_dd_gross_wt/l_mtl_max_load) >= (l_dd_volume/l_mtl_max_vol)) THEN
6010 l_max_load_qty := (l_dd_gross_wt/l_mtl_max_load);
6011 ELSE
6012 l_max_load_qty := (l_dd_volume/l_mtl_max_vol);
6013 END IF;
6014 --dbms_output.put_line('l_dd_gross_wt '||l_dd_gross_wt||' l_dd_volume '||l_dd_volume ||' l_mtl_max_load '||l_mtl_max_load||' l_mtl_max_vol '||l_mtl_max_vol || ' l_max_load_qty '||l_max_load_qty);
6015
6016 --
6017 IF l_debug_on THEN
6018 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
6019 END IF;
6020 --
6021 WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
6022 p_item_id => rec.inventory_item_id,
6023 p_organization_id => rec.organization_id,
6024 p_input_quantity => ROUND((rec.packed_quantity/l_max_load_qty),LIMITED_PRECISION),
6025 p_uom_code => rec.requested_quantity_uom,
6026 x_output_quantity => l_output_qty,
6027 x_return_status => l_return_status);
6028
6029 IF l_debug_on THEN
6030 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6031 END IF;
6032 IF l_return_status <> C_SUCCESS_STATUS THEN
6033 --dbms_output.put_line('WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity returned '||l_return_status);
6034 l_discard_message := FND_MESSAGE.GET;
6035 l_tmp_num_cont := FLOOR(rec.packed_quantity/l_max_load_qty);
6036
6037 IF (l_tmp_num_cont = 0) THEN
6038 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
6039 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6040 error_cnt := error_cnt + 1;
6041 goto next_detail;
6042 ELSE
6043 --l_max_load_qty := (rec.packed_quantity/l_tmp_num_cont);
6044 l_max_load_qty := l_tmp_num_cont;
6045 END IF;
6046 ELSE
6047 l_max_load_qty := ROUND((rec.packed_quantity/l_max_load_qty),LIMITED_PRECISION);
6048 END IF;
6049 END IF; -- l_item_load_found
6050 line_cont_rec.max_load_qty := l_max_load_qty;
6051
6052 IF (NVL(line_cont_rec.max_load_qty,0) <= 0) THEN
6053 --dbms_output.put_line('Max Load Qty is NULL or <= 0. Skipping this dd');
6054 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
6055 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6056 error_cnt := error_cnt + 1;
6057 goto next_detail;
6058 END IF;
6059
6060 END IF; -- line_cont_rec.max_load_qty IS NULL
6061 --dbms_output.put_line('line_cont_rec.max_load_qty '||line_cont_rec.max_load_qty);
6062
6063 ELSIF (line_cont_rec.fill_pc_basis in ('W','V')) THEN
6064 -- Calculate max load qty depending on Weight/Volume
6065 IF ((rec.gross_weight IS NULL AND line_cont_rec.fill_pc_basis = 'W') OR
6066 (rec.volume IS NULL) AND (line_cont_rec.fill_pc_basis = 'V')) THEN
6067 --
6068 IF rec.wv_frozen_flag = 'N' THEN
6069
6070 IF l_debug_on THEN
6071 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DETAIL_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
6072 END IF;
6073 --
6074 WSH_WV_UTILS.Detail_Weight_Volume(
6075 p_delivery_detail_id => rec.delivery_detail_id,
6076 -- J: W/V Changes
6077 p_update_flag => 'Y',
6078 p_post_process_flag => 'Y',
6079 p_calc_wv_if_frozen => 'N',
6080 x_net_weight => l_dd_net_wt,
6081 x_volume => l_dd_volume ,
6082 x_return_status => l_return_status);
6083
6084 IF l_debug_on THEN
6085 WSH_DEBUG_SV.log(l_module_name,'return status -,wt,vol',l_return_status||l_dd_net_wt||','||l_dd_volume);
6086 END IF;
6087
6088 IF (l_return_status <> C_SUCCESS_STATUS) THEN
6089 --dbms_output.put_line('WSH_WV_UTILS.Detail_Weight_Volume did not return success');
6090 FND_MESSAGE.SET_NAME('WSH','WSH_DET_WT_VOL_FAILED');
6091 FND_MESSAGE.SET_TOKEN('DETAIL_ID',rec.delivery_detail_id);
6092 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6093 error_cnt := error_cnt + 1;
6094 --dbms_output.put_line('Skipping this dd');
6095 goto next_detail;
6096 END IF;
6097
6098 IF (line_cont_rec.fill_pc_basis = 'W') THEN
6099 rec.gross_weight := NVL(rec.gross_weight,l_dd_net_wt);
6100 rec.net_weight := NVL(rec.net_weight,l_dd_net_wt);
6101 ELSE
6102 rec.volume := NVL(rec.volume,l_dd_volume);
6103 END IF;
6104
6105 END IF;
6106
6107 IF (line_cont_rec.fill_pc_basis = 'W') THEN
6108
6109 IF (NVL(rec.gross_weight,0) = 0) THEN
6110 --dbms_output.put_line('Weight is NULL or 0');
6111 FND_MESSAGE.SET_NAME('WSH', 'WSH_NULL_WEIGHT_VOLUME');
6112 FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL', rec.delivery_detail_id);
6113 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6114 error_cnt := error_cnt + 1;
6115 --dbms_output.put_line('Skipping this dd');
6116 goto next_detail;
6117 END IF;
6118 ELSE
6119
6120 IF (NVL(rec.volume,0) = 0) THEN
6121 --dbms_output.put_line('Volume is NULL or 0');
6122 FND_MESSAGE.SET_NAME('WSH', 'WSH_NULL_WEIGHT_VOLUME');
6123 FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL', rec.delivery_detail_id);
6124 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6125 error_cnt := error_cnt + 1;
6126 --dbms_output.put_line('Skipping this dd');
6127 goto next_detail;
6128 END IF;
6129 END IF;
6130
6131 END IF;
6132
6133 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 3');
6134 Get_Cont_Load_Vol_info(
6135 p_container_item_id => line_cont_rec.preferred_container,
6136 p_organization_id => line_cont_rec.organization_id,
6137 p_w_v_both => line_cont_rec.fill_pc_basis,
6138 x_max_load => l_mtl_max_load,
6139 x_max_vol => l_mtl_max_vol,
6140 x_wt_uom => l_mtl_wt_uom,
6141 x_vol_uom => l_mtl_vol_uom,
6142 x_return_status => l_return_status,
6143 x_error_cnt => l_error_cnt);
6144
6145 IF l_debug_on THEN
6146 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6147 END IF;
6148 IF (l_return_status = C_ERROR_STATUS) THEN
6149 error_cnt := error_cnt + l_error_cnt;
6150 END IF;
6151
6152 IF (line_cont_rec.fill_pc_basis = 'W') THEN
6153 IF (NVL(l_mtl_max_load,0) <= 0) THEN
6154 --dbms_output.put_line('Skipping this dd');
6155 goto next_detail;
6156 END IF;
6157
6158 line_cont_rec.cont_wt := l_mtl_max_load;
6159
6160 IF (l_mtl_wt_uom <> rec.weight_uom_code) THEN
6161 --
6162 IF l_debug_on THEN
6163 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
6164 END IF;
6165 --
6166 l_dd_gross_wt := WSH_WV_UTILS.Convert_Uom (
6167 from_uom => rec.weight_uom_code,
6168 to_uom => l_mtl_wt_uom,
6169 quantity => rec.gross_weight,
6170 item_id => rec.inventory_item_id);
6171 ELSE
6172 l_dd_gross_wt := rec.gross_weight;
6173 END IF;
6174 line_cont_rec.converted_wt := l_dd_gross_wt;
6175 --dbms_output.put_line('line_cont_rec.converted_wt '||line_cont_rec.converted_wt);
6176 ELSE
6177 IF (NVL(l_mtl_max_vol,0) <= 0) THEN
6178 --dbms_output.put_line('Skipping this dd');
6179 goto next_detail;
6180 END IF;
6181
6182 line_cont_rec.cont_vol := l_mtl_max_vol;
6183
6184 IF (l_mtl_vol_uom <> rec.volume_uom_code) THEN
6185 --
6186 IF l_debug_on THEN
6187 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
6188 END IF;
6189 --
6190 l_dd_volume := WSH_WV_UTILS.Convert_Uom (
6191 from_uom => rec.volume_uom_code,
6192 to_uom => l_mtl_vol_uom,
6193 quantity => rec.volume,
6194 item_id => rec.inventory_item_id);
6195 ELSE
6196 l_dd_volume := rec.volume;
6197 END IF;
6198 line_cont_rec.converted_vol := l_dd_volume;
6199 --dbms_output.put_line('line_cont_rec.converted_vol '||line_cont_rec.converted_vol);
6200 END IF;
6201
6202 -- Check if the container can hold atleast 1 piece if the item is indivisible
6203 IF (line_cont_rec.indivisible_flag = 'Y' AND
6204 ((line_cont_rec.fill_pc_basis = 'W' AND ((line_cont_rec.converted_wt/line_cont_rec.shp_qty) > l_mtl_max_load)) OR
6205 (line_cont_rec.fill_pc_basis = 'V' AND ((line_cont_rec.converted_vol/line_cont_rec.shp_qty) > l_mtl_max_vol)))) THEN
6206 --dbms_output.put_line('Indivisible flag is Y and Preferred Cont cannot hold atleast 1 piece');
6207 -- Bug#: 2503937 - New Error Message
6208 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_VOL_ERROR');
6209 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6210 error_cnt := error_cnt + 1;
6211 --dbms_output.put_line('Skipping this dd');
6212 goto next_detail;
6213 END IF;
6214
6215 END IF;
6216
6217
6218
6219 -- HW OPM BUG#: 3011758 For debugging purposes.
6220 -- HW OPMCONV - 1) Removed all GMI print msgs
6221
6222 -- HW OPM BUG#:3011758 Check if OPM lot indivisible and check percent fill basis
6223 -- If 'Q', compare the delivery line qty shipped against the max_load
6224 -- If 'W, compare the delivery line net weight against the container's net weight
6225 -- If 'V', compare the delivery line volume against the container's volume
6226 -- If any of the above exceeds the max allowed, an error is raised
6227 -- because it will not fit into the container without splitting
6228 -- OPM item that are lot indivisible should not split
6229
6230 -- HW OPMCONV - 1) Renamed lot_divisible_flag
6231 -- - 2) Changed checking value of visible flag from 1 to 'N'
6232 IF ( line_cont_rec.lot_divisible_flag = 'N' AND
6233 ((line_cont_rec.fill_pc_basis = 'Q' AND (line_cont_rec.shp_qty > line_cont_rec.max_load_qty ))
6234 OR (line_cont_rec.fill_pc_basis = 'W' AND (l_dd_gross_wt > line_cont_rec.cont_wt) )
6235 OR (line_cont_rec.fill_pc_basis = 'V' AND (l_dd_volume> line_cont_rec.cont_vol) ) ) ) THEN
6236
6237 FND_MESSAGE.SET_NAME('WSH','WSH_OPM_IND_SPLIT_PACK');
6238 FND_MESSAGE.SET_TOKEN('DETAIL_ID',rec.delivery_detail_id);
6239 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6240 WSH_UTIL_CORE.Add_Message(l_return_status);
6241 error_cnt := error_cnt + 1;
6242 goto next_detail;
6243 END IF;-- end of 3011758
6244
6245 -- 20.70 Do Credit Check
6246 --dbms_output.put_line('Doing Credit Check');
6247 --
6248 IF l_debug_on THEN
6249 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_CREDIT_HOLDS',WSH_DEBUG_SV.C_PROC_LEVEL);
6250 END IF;
6251 --
6252 WSH_DETAILS_VALIDATIONS.Check_Credit_Holds (
6253 p_detail_id => rec.delivery_detail_id,
6254 p_activity_type => 'PACK',
6255 p_source_line_id => NULL,
6256 p_source_header_id => NULL,
6257 p_source_code => rec.source_code,
6258 p_init_flag => 'Y',
6259 x_return_status => l_return_status);
6260
6261 IF l_debug_on THEN
6262 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6263 END IF;
6264 -- Bug 2847515
6265 -- Error was being treated as warning
6266 IF l_return_status <> C_SUCCESS_STATUS THEN
6267 IF l_return_status IN (C_ERROR_STATUS,C_UNEXP_ERROR_STATUS) THEN
6268 error_cnt := error_cnt + 1;
6269 ELSIF l_return_status = C_WARNING_STATUS THEN
6270 --dbms_output.put_line('Credit Check Failed. Warning: Skipping dd');
6271 warn_cnt := warn_cnt + 1;
6272 END IF;
6273 goto next_detail;
6274 END IF;
6275
6276 l_dd_count := l_dd_count + 1;
6277 line_cont_tab(l_dd_count) := line_cont_rec;
6278
6279 <<next_detail>>
6280 null;
6281
6282 END LOOP;
6283
6284 DELETE FROM wsh_tmp;
6285
6286 x_error_cnt := error_cnt;
6287 x_warn_cnt := warn_cnt;
6288 x_fill_pc_warn_cnt := fill_pc_warn_cnt; -- bug 3562797 jckwok
6289 x_release_warn_cnt := release_warn_cnt;
6290 x_line_cont_tab := line_cont_tab;
6291
6292 --dbms_output.put_line('Exiting Validate_Dd_for_Pack');
6293
6294 --
6295 IF l_debug_on THEN
6296 WSH_DEBUG_SV.log(l_module_name,'p_del_detail_tab count->'||p_del_detail_tab.count||' x_line_cont_tab count->'||x_line_cont_tab.count);
6297 WSH_DEBUG_SV.log(l_module_name,'Error Count '|| x_error_cnt||' Warning Count '|| x_warn_cnt||' Release Warn Count '|| x_release_warn_cnt);
6298 WSH_DEBUG_SV.pop(l_module_name);
6299 END IF;
6300 --
6301 RETURN;
6302
6303 --
6304 IF l_debug_on THEN
6305 WSH_DEBUG_SV.pop(l_module_name);
6306 END IF;
6307 --
6308 EXCEPTION
6309 WHEN Others THEN
6310 IF (Get_dd_Detail%ISOPEN) THEN
6311 CLOSE Get_dd_Detail;
6312 END IF;
6313 IF (Get_Cont_Item_Load%ISOPEN) THEN
6314 CLOSE Get_Cont_Item_Load;
6315 END IF;
6316 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Validate_Dd_For_Pack',l_module_name);
6317 --
6318 IF l_debug_on THEN
6319 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
6320 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
6321 END IF;
6322 --
6323 raise;
6324
6325 --
6326 IF l_debug_on THEN
6327 WSH_DEBUG_SV.pop(l_module_name);
6328 END IF;
6329 --
6330 END Validate_Dd_For_Pack;
6331
6332
6333 /*
6334 -----------------------------------------------------------------------------
6335 PROCEDURE : Auto_Pack_Lines
6336 PARAMETERS : p_group_id_tab_id - table of group ids for lines that need to
6337 be autopacked.
6338 p_del_detail_tab - table of delivery detail ids
6339 p_pack_cont_flag - 'Y' or 'N' to determine whether to try and
6340 autopack the detail containers into master containers.
6341 x_cont_instance_id - table of container instance ids that were
6342 created during the autopacking.
6343 x_pack_status - indicates whether containers overpacked or not
6344 x_return_status - return status of API.
6345 DESCRIPTION : This procedure takes the number of lines and groups them by
6346 common grouping attributes - similar to grouping attributes of
6347 delivery. If a group id table is specified it uses the
6348 group ids in the table to decided which lines can be grouped
6349 into the same container. If a group id table is not specified,
6350 it creates the group id table before autopacking. It creates
6351 the required number and type of containers per line and keeps
6352 track of all partially filled containers in the empty
6353 containers table. Before creating new container instances, it
6354 searches for available space using the empty container table
6355 and after filling up a container, it creates a new one if
6356 there are no empty containers of the same type.
6357 ------------------------------------------------------------------------------
6358 */
6359
6360 PROCEDURE Auto_Pack_Lines (
6361 p_group_id_tab IN WSH_UTIL_CORE.id_tab_type,
6362 p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
6363 p_pack_cont_flag IN VARCHAR2,
6364 x_cont_instance_tab IN OUT NOCOPY WSH_UTIL_CORE.id_tab_type,
6365 x_return_status OUT NOCOPY VARCHAR2) IS
6366
6367 CURSOR c_get_attributes(v_delivery_detail_id IN NUMBER) IS
6368 SELECT customer_id,ship_to_location_id,
6369 intmed_ship_to_location_id,
6370 fob_code,freight_terms_code,ship_method_code,
6371 mode_of_transport, carrier_id, service_level,
6372 deliver_to_location_id,
6373 NVL(line_direction,'O') line_direction, -- J-IB-NPARIKH
6374 shipping_control, -- J-IB-NPARIKH
6375 NVL(ignore_for_planning,'N') ignore_for_planning,
6376 client_id -- LSP PROJECT
6377 FROM wsh_delivery_details
6378 WHERE delivery_detail_id = v_delivery_detail_id;
6379
6380 -- OTM R12 : assign delivery detail
6381 CURSOR c_get_tare_weight(v_detail_id NUMBER) IS
6382 SELECT nvl(unit_weight, 0)
6383 FROM wsh_delivery_details
6384 WHERE delivery_detail_id = v_detail_id;
6385
6386 CURSOR c_get_plan_and_tms_flag(v_delivery_id NUMBER) IS
6387 SELECT nvl(ignore_for_planning, 'N'),
6388 nvl(tms_interface_flag, WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT)
6389 FROM wsh_new_deliveries
6390 WHERE delivery_id = v_delivery_id;
6391
6392 TYPE Boolean_Tab_Type IS TABLE OF BOOLEAN INDEX BY BINARY_INTEGER;
6393
6394 -- OTM R12 : assign delivery detail
6395
6396 TYPE tab_varchar IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
6397
6398 l_tab_cust_id wsh_util_core.id_tab_type;
6399 l_tab_ship_location_id wsh_util_core.id_tab_type;
6400 l_tab_intmed_location_id wsh_util_core.id_tab_type;
6401 l_tab_deliver_location_id wsh_util_core.id_tab_type;
6402 l_tab_carrier_id wsh_util_core.id_tab_type;
6403 l_tab_fob_code tab_varchar;
6404 l_tab_freight_terms_code tab_varchar;
6405 l_tab_ship_method_code tab_varchar;
6406 l_tab_mode_of_transport tab_varchar;
6407 l_tab_service_level tab_varchar;
6408 l_tab_line_direction tab_varchar;
6409 l_tab_shipping_control tab_varchar;
6410 l_tab_ignore_for_planning tab_varchar;
6411 --
6412 l_tab_client_id wsh_util_core.id_tab_type; -- LSP PROJECT :
6413 --
6414
6415 line_cont_tab line_cont_info_tab;
6416
6417 l_group_id_temp_tab WSH_UTIL_CORE.id_tab_type;
6418 l_group_id_tab WSH_UTIL_CORE.id_tab_type;
6419 l_del_row_tab WSH_UTIL_CORE.id_tab_type;
6420 l_mast_cont_tab WSH_UTIL_CORE.id_tab_type;
6421 l_tmp_detail_tab WSH_UTIL_CORE.id_tab_type;
6422 l_detail_cont_rec empty_cont_info;
6423 l_detail_cont_tab empty_cont_info_tab;
6424
6425 l_return_status VARCHAR2(1);
6426 l_cont_instance_id NUMBER;
6427 l_cont_name VARCHAR2(30);
6428 l_row_id VARCHAR2(30);
6429 l_pack_status VARCHAR2(30);
6430
6431 l_net_weight NUMBER;
6432 l_cont_fill_pc NUMBER;
6433 l_err_cont_name VARCHAR2(30);
6434 l_last_organization_id NUMBER;
6435
6436 i NUMBER;
6437 j NUMBER;
6438 cnt NUMBER;
6439 l_cont_instance_cnt NUMBER;
6440
6441 warn_cnt NUMBER := 0;
6442 error_cnt NUMBER := 0;
6443 succ_cnt NUMBER := 0;
6444 cont_warn NUMBER := 0;
6445 l_release_warn_count NUMBER := 0;
6446 l_fill_pc_warn_count NUMBER := 0; -- bug 3562797 jckwok
6447 l_error_cnt NUMBER := 0;
6448
6449 l_new_contid_count NUMBER := 0;
6450 --l_cont_tab wsh_container_actions.cont_inst_tab;
6451 l_cont_tab WSH_UTIL_CORE.id_tab_type;
6452
6453 TYPE NumList IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
6454 TYPE CharList IS TABLE OF VARCHAR2(3) INDEX BY BINARY_INTEGER;
6455 l_GrossWtlist NumList;
6456 l_NetWtlist NumList;
6457 l_Vollist NumList;
6458 l_ddlist NumList;
6459 l_dellist NumList; -- for delivery id
6460 l_contlist NumList; -- containers for delivery detail id
6461 l_contlist1 NumList; -- containers and delivery id
6462 --l_dellist1 NumList; -- containers and delivery id Commented by adagur for bug 16397445
6463 m NUMBER;
6464 l_del_tab WSH_UTIL_CORE.id_tab_type;
6465 l_exists_flag VARCHAR2(1);
6466 l_duplicate_flag VARCHAR2(1); -- for checking record
6467
6468 -- J: W/V Changes
6469 l_prev_del_id NUMBER;
6470 l_prev_dd_id NUMBER;
6471 l_prev_cont_id NUMBER;
6472 l_unit_weight NUMBER;
6473 l_unit_volume NUMBER;
6474 l_weight_uom_code VARCHAR2(3);
6475 l_volume_uom_code VARCHAR2(3);
6476 l_cont_Wtlist NumList;
6477 l_cont_Vollist NumList;
6478 l_WtUOMlist CharList;
6479 l_VolUOMlist CharList;
6480 l_InvItemlist NumList;
6481 l_cont_InvItemlist NumList;
6482 l_cont_WtUOMlist CharList;
6483 l_cont_VolUOMlist CharList;
6484 l_tot_dd_gross_wt NUMBER;
6485 l_tot_dd_net_wt NUMBER;
6486 l_tot_dd_vol NUMBER;
6487 /*
6488 l_tot_cont_gross_wt NUMBER;
6489 l_tot_cont_vol NUMBER;
6490 */
6491 l_tot_del_vol NUMBER;
6492 TYPE del_wv_adjust_info IS RECORD (
6493 dd_id NUMBER,
6494 gross_wt NUMBER,
6495 net_wt NUMBER,
6496 vol NUMBER);
6497 TYPE del_wv_adjust_tab IS TABLE OF del_wv_adjust_info INDEX BY BINARY_INTEGER;
6498 l_tmp_dd1list del_wv_adjust_tab;
6499 l_tmp_dd2list del_wv_adjust_tab;
6500 del_index NUMBER;
6501 i1 NUMBER := 0;
6502 j1 NUMBER := 0;
6503 k1 NUMBER := 0;
6504 l_prev_wt_uom VARCHAR2(3);
6505 l_prev_vol_uom VARCHAR2(3);
6506 l_item_changed BOOLEAN;
6507 l_cont_item_changed BOOLEAN;
6508 l_prev_item NUMBER;
6509
6510 l_attr_tab wsh_delivery_autocreate.grp_attr_tab_type;
6511 l_group_tab wsh_delivery_autocreate.grp_attr_tab_type;
6512 l_action_rec wsh_delivery_autocreate.action_rec_type;
6513 l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
6514 l_matched_entities wsh_util_core.id_tab_type;
6515 l_out_rec wsh_delivery_autocreate.out_rec_type;
6516
6517 mark_reprice_error EXCEPTION;
6518
6519 -- OTM R12 : assign delivery detail
6520 l_gc3_is_installed VARCHAR2(1);
6521 l_is_delivery_empty VARCHAR2(1);
6522 l_index NUMBER;
6523 l_index_update NUMBER;
6524 l_tare_weight WSH_DELIVERY_DETAILS.UNIT_WEIGHT%TYPE;
6525 l_ignore_for_planning_tab WSH_UTIL_CORE.COLUMN_TAB_TYPE;
6526 l_tms_interface_flag_tab WSH_UTIL_CORE.COLUMN_TAB_TYPE;
6527 l_delivery_was_empty_tab BOOLEAN_TAB_TYPE;
6528 l_delivery_id_tab WSH_UTIL_CORE.ID_TAB_TYPE;
6529 l_interface_flag_tab WSH_UTIL_CORE.COLUMN_TAB_TYPE;
6530 -- End of OTM R12 : assign delivery detail
6531
6532 -- K LPN CONV. rv
6533 l_wms_org VARCHAR2(10) := 'N';
6534 l_sync_tmp_wms_ddlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6535 l_sync_tmp_inv_ddlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6536 l_wms_ddtlist_cnt NUMBER;
6537 l_inv_ddtlist_cnt NUMBER;
6538 l_sync_tmp_wms_contlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6539 l_sync_tmp_inv_contlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6540 l_wms_contlist_cnt NUMBER;
6541 l_inv_contlist_cnt NUMBER;
6542 l_sync_tmp_wms_contlist1 wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6543 l_sync_tmp_inv_contlist1 wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6544 l_wms_contlist1_cnt NUMBER;
6545 l_inv_contlist1_cnt NUMBER;
6546 -- K LPN CONV. rv
6547 l_mdc_id_tab wsh_util_core.id_tab_type;
6548 l_mdc_index_i NUMBER;
6549 l_mdc_index_j NUMBER;
6550
6551 --BUG#12904248
6552 l_deliver_to_location_id1 NUMBER;
6553 l_deliver_to_location_id NUMBER;
6554 l_container_id NUMBER;
6555
6556 CURSOR c_get_deliver_to_location_id(v_delivery_detail_id number) IS
6557 SELECT deliver_to_location_id
6558 FROM wsh_delivery_details
6559 WHERE delivery_detail_id = v_delivery_detail_id;
6560
6561 --
6562 l_debug_on BOOLEAN;
6563 --
6564 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'AUTO_PACK_LINES';
6565 --
6566 BEGIN
6567
6568 --dbms_output.put_line('==================================================');
6569 --dbms_output.put_line(' AUTO PACK LINES ');
6570 --dbms_output.put_line('==================================================');
6571
6572 --dbms_output.put_line('Start of WSH_CONTAINER_ACTIONS.Auto_Pack_Lines...');
6573 -- Delete all Global PL/SQL tables to start with
6574 --
6575 --
6576
6577 -- OTM R12 : assign delivery detail
6578 l_gc3_is_installed := WSH_UTIL_CORE.G_GC3_IS_INSTALLED;
6579
6580 IF (l_gc3_is_installed IS NULL) THEN
6581 l_gc3_is_installed := WSH_UTIL_CORE.GC3_IS_INSTALLED;
6582 END IF;
6583
6584 -- End of OTM R12 : assign delivery detail
6585
6586 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
6587 --
6588 IF l_debug_on IS NULL
6589 THEN
6590 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
6591 END IF;
6592 --
6593 IF l_debug_on THEN
6594 WSH_DEBUG_SV.push(l_module_name);
6595 --
6596 WSH_DEBUG_SV.log(l_module_name,'P_PACK_CONT_FLAG',P_PACK_CONT_FLAG);
6597 WSH_DEBUG_SV.log(l_module_name,'l_gc3_is_installed', l_gc3_is_installed); -- OTM R12 : assign delivery detail
6598 END IF;
6599 --
6600 g_empty_cont_tab.DELETE;
6601 g_assign_detail_tab.DELETE;
6602 g_new_container_tab.DELETE;
6603 g_cache_organization_info_tab.DELETE;
6604 g_cont_msi_tab.DELETE;
6605 g_new_contid_tab.DELETE;
6606 g_new_cont_index := 0;
6607 g_num_cont_index := 0;
6608 g_assign_detail_index := 0;
6609
6610 -- 10. Check if Count of p_del_detail_tab table is 0
6611 IF p_del_detail_tab.count = 0 THEN
6612 --dbms_output.put_line('p_del_detail_tab count is 0');
6613 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_ASSG_NULL');
6614 x_return_status := C_ERROR_STATUS;
6615 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6616 --
6617 IF l_debug_on THEN
6618 WSH_DEBUG_SV.pop(l_module_name);
6619 END IF;
6620 --
6621 return;
6622 END IF;
6623 --dbms_output.put_line('Before Autocreate Del'||to_char(sysdate,'HH24:MI:SS'));
6624 -- 20. Generate Grouping Ids
6625 IF p_group_id_tab.COUNT = 0 THEN
6626
6627 -- call autocreate delivery API with a check flag set to 'Y' and
6628 -- container flag set to 'Y' to fetch group id table for delivery lines
6629
6630 --dbms_output.put_line('Calling WSH_DELIVERY_AUTOCREATE.autocreate_deliveries to generate group_ids');
6631 --
6632 IF l_debug_on THEN
6633 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
6634 END IF;
6635 --
6636
6637 l_attr_tab.delete;
6638
6639 FOR i in 1..p_del_detail_tab.count LOOP
6640
6641 l_attr_tab(i).entity_id := p_del_detail_tab(i);
6642 l_attr_tab(i).entity_type := 'DELIVERY_DETAIL';
6643
6644 END LOOP;
6645
6646 l_action_rec.action := 'MATCH_GROUPS';
6647
6648
6649
6650 WSH_Delivery_AutoCreate.Find_Matching_Groups(p_attr_tab => l_attr_tab,
6651 p_action_rec => l_action_rec,
6652 p_target_rec => l_target_rec,
6653 p_group_tab => l_group_tab,
6654 x_matched_entities => l_matched_entities,
6655 x_out_rec => l_out_rec,
6656 x_return_status => l_return_status);
6657
6658 IF l_debug_on THEN
6659 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6660 END IF;
6661 IF (l_return_status = C_ERROR_STATUS) OR
6662 (l_return_status = C_UNEXP_ERROR_STATUS) THEN
6663 --dbms_output.put_line('***WSH_DELIVERY_AUTOCREATE.autocreate_deliveries returned '||l_return_status);
6664 FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
6665 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
6666 x_return_status := l_return_status;
6667 --
6668 IF l_debug_on THEN
6669 WSH_DEBUG_SV.pop(l_module_name);
6670 END IF;
6671 --
6672 return;
6673 END IF;
6674 FOR i in 1..l_attr_tab.COUNT LOOP
6675 l_group_id_tab(l_attr_tab(i).entity_id) := l_attr_tab(i).group_id;
6676 END LOOP;
6677 ELSE
6678 cnt := p_group_id_tab.FIRST;
6679
6680 IF ((cnt IS NULL) OR (p_group_id_tab.COUNT <> p_del_detail_tab.count)) THEN
6681 x_return_status := C_ERROR_STATUS;
6682 FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
6683 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6684 --
6685 IF l_debug_on THEN
6686 WSH_DEBUG_SV.pop(l_module_name);
6687 END IF;
6688 --
6689 return;
6690 ELSE
6691
6692 FOR i in 1..p_group_id_tab.COUNT LOOP
6693 l_group_id_tab(p_del_detail_tab(i)) := p_group_id_tab(i);
6694 END LOOP;
6695
6696 END IF;
6697 END IF;
6698
6699
6700 --dbms_output.put_line('Before Validate DD for Pack'||to_char(sysdate,'HH24:MI:SS'));
6701 Validate_Dd_for_Pack(
6702 p_group_id_tab => l_group_id_tab,
6703 p_del_detail_tab => p_del_detail_tab,
6704 x_line_cont_tab => line_cont_tab,
6705 x_error_cnt => error_cnt,
6706 x_warn_cnt => warn_cnt,
6707 x_fill_pc_warn_cnt => l_fill_pc_warn_count, -- bug 3562797 jckwok
6708 x_release_warn_cnt => l_release_warn_count);
6709
6710 IF l_debug_on THEN
6711 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6712 WSH_DEBUG_SV.log(l_module_name,'line cont tab count -',line_cont_tab.count);
6713 END IF;
6714 --dbms_output.put_line(p_del_detail_tab.count||'<CALL TO VALIDATE DD FOR PACK>'||l_release_warn_count||'>'||line_cont_tab.count);
6715
6716 -- Raise warning if we found some delivery details with status 'S'
6717 -- Raise Error if all lines are with status 'S'
6718 IF (l_release_warn_count = p_del_detail_tab.count) THEN
6719 x_return_status := C_ERROR_STATUS;
6720 FND_MESSAGE.SET_NAME('WSH','WSH_DEL_RELEASED_STATUS');
6721 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6722 -- Bug 3337629 : Added the following return statement.
6723 IF l_debug_on THEN
6724 WSH_DEBUG_SV.pop(l_module_name);
6725 END IF;
6726 RETURN;
6727 ELSIF (l_release_warn_count > 0) THEN
6728 -- Bug 3337629 - x_return_status does not hold any value.
6729 -- Compare it with l_return_status.
6730 -- Also increment the warn_cnt.
6731
6732 --IF (x_return_status <> C_ERROR_STATUS) THEN
6733 IF (l_return_status <> C_ERROR_STATUS) THEN
6734 x_return_status := C_WARNING_STATUS;
6735 warn_cnt := warn_cnt + 1;
6736 FND_MESSAGE.SET_NAME('WSH','WSH_DEL_REL_STATUS_WARN');
6737 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6738 END IF;
6739 END IF;
6740 --
6741 -- bug 3562797 jckwok
6742 -- Raise Error if all dds have 'Shipping Parameter' percent fill basis as None
6743 -- Raise warning if only some of the dds have 'Shipping Parameter' percent fill basis as None
6744 --
6745 IF (l_fill_pc_warn_count = p_del_detail_tab.count) THEN
6746 x_return_status := C_ERROR_STATUS;
6747 FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
6748 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6749 IF l_debug_on THEN
6750 WSH_DEBUG_SV.pop(l_module_name);
6751 END IF;
6752 RETURN;
6753 ELSIF (l_fill_pc_warn_count > 0) THEN
6754 IF (l_return_status <> C_ERROR_STATUS) THEN
6755 x_return_status := C_WARNING_STATUS;
6756 warn_cnt := warn_cnt + 1;
6757 FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
6758 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6759 END IF;
6760 END IF;
6761 -- end of bug 3562797 jckwok
6762
6763 --dbms_output.put_line('Before 50'||to_char(sysdate,'HH24:MI:SS'));
6764 IF (line_cont_tab.COUNT > 0) THEN
6765 -- 50. Loop through all lines that need to be Auto-Packed
6766 cnt := 1;
6767 l_last_organization_id := NULL;
6768 WHILE (cnt <= line_cont_tab.COUNT) LOOP
6769
6770 IF l_debug_on THEN
6771 WSH_DEBUG_SV.log(l_module_name,'======================================================');
6772 WSH_DEBUG_SV.log(l_module_name,'auto-packing line ' || line_cont_tab(cnt).delivery_detail_id||'Org id'||line_cont_tab(cnt).organization_id);
6773 END IF;
6774
6775 IF (l_last_organization_id is NULL) THEN
6776 l_last_organization_id := line_cont_tab(cnt).organization_id;
6777 ELSIF (l_last_organization_id <> line_cont_tab(cnt).organization_id) THEN
6778 l_last_organization_id := line_cont_tab(cnt).organization_id;
6779
6780 -- Delete the empty PL/SQL cont table if organization_id changes
6781 g_empty_cont_tab.DELETE;
6782 END IF;
6783
6784 Pack_Delivery_Detail(
6785 p_line_cont_rec => line_cont_tab(cnt),
6786 x_return_status => l_return_status);
6787 -- Bug 2786021 handle unexpected error
6788 IF (l_return_status = C_ERROR_STATUS OR
6789 l_return_status = C_UNEXP_ERROR_STATUS
6790 ) THEN
6791 error_cnt := error_cnt + 1;
6792 ELSE
6793 succ_cnt := succ_cnt + 1;
6794 END IF;
6795 cnt := cnt + 1;
6796
6797 END LOOP;
6798 --dbms_output.put_line('Error Count '|| error_cnt||' Success Count '||succ_cnt);
6799 --dbms_output.put_line('Before Create'||to_char(sysdate,'HH24:MI:SS')||'g_new_container_tab.count'||g_new_container_tab.COUNT);
6800
6801 -- 60.1 Create Containers from g_new_container_tab PL/SQL table
6802 --dbms_output.put_line('*** Creating Actual Containers ***');
6803 cnt := 1;
6804 l_cont_instance_cnt := 1;
6805 WHILE (cnt <= g_new_container_tab.COUNT) LOOP
6806 l_cont_name := null;
6807
6808 --
6809 IF l_debug_on THEN
6810 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CREATE_CONT_INSTANCE_MULTI',WSH_DEBUG_SV.C_PROC_LEVEL);
6811 WSH_DEBUG_SV.logmsg(l_module_name,'Number of Containers'||g_new_container_tab(cnt).number_of_containers);
6812 WSH_DEBUG_SV.log(l_module_name,'Create Container'||g_new_container_tab(cnt).container_item_id||'<'||g_new_container_tab(cnt).organization_id||'>'||g_new_container_tab(cnt).number_of_containers);
6813 END IF;
6814 --
6815 wsh_container_actions.Create_Cont_Instance_Multi (
6816 x_cont_name => l_cont_name,
6817 p_cont_item_id => g_new_container_tab(cnt).container_item_id,
6818 x_cont_instance_id => l_cont_instance_id,
6819 p_par_detail_id => NULL,
6820 p_organization_id => g_new_container_tab(cnt).organization_id,
6821 p_container_type_code => NULL,
6822 p_num_of_containers => g_new_container_tab(cnt).number_of_containers,
6823 x_row_id => l_row_id,
6824 x_return_status => l_return_status,
6825 x_cont_tab => l_cont_tab,
6826 -- J: W/V Changes
6827 x_unit_weight => l_unit_weight,
6828 x_unit_volume => l_unit_volume,
6829 x_weight_uom_code => l_weight_uom_code,
6830 x_volume_uom_code => l_volume_uom_code,
6831 p_lpn_id => NULL,
6832 p_ignore_for_planning => NULL,
6833 p_caller => 'WSH'
6834 );
6835 IF l_debug_on THEN
6836 WSH_DEBUG_SV.log(l_module_name,'return status ,cont tab count -',l_return_status||l_cont_tab.count);
6837 END IF;
6838
6839 IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
6840 ) THEN
6841 --dbms_output.put_line('Container Creation failed for index '|| cnt);
6842 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
6843 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6844 error_cnt := error_cnt + 1;
6845 ELSE
6846
6847 IF l_debug_on THEN
6848 WSH_DEBUG_SV.logmsg(l_module_name,'Created Containers'||l_cont_tab.count);
6849 END IF;
6850 -- do not use this container instance id
6851 g_new_container_tab(cnt).cont_instance_id := l_cont_instance_id;
6852
6853 -- This new PL SQL table will have mapping records to g_new_container_tab
6854 -- where count of g_new_container_tab will have records here
6855 -- Example if l_new_contid_count is 1 and in g_new_container_tab, the
6856 -- number of containers is 10, then those 10 container instance id can be
6857 -- extracted from this new PL SQL table
6858 IF l_new_contid_count IS NULL THEN
6859 l_new_contid_count := 0;
6860 ELSE
6861 l_new_contid_count := g_new_contid_tab.count;
6862 END IF;
6863
6864 -- can replace l_new_contid_count with g_new_contid_tab.count
6865 FOR j in 1..l_cont_tab.count
6866 LOOP
6867 l_new_contid_count := l_new_contid_count + 1;
6868 g_new_contid_tab(l_new_contid_count).match_id := cnt;
6869 g_new_contid_tab(l_new_contid_count).cont_instance_id := l_cont_tab(j);
6870 -- J: W/V Changes
6871 g_new_contid_tab(l_new_contid_count).unit_weight := l_unit_weight;
6872 g_new_contid_tab(l_new_contid_count).unit_volume := l_unit_volume;
6873 g_new_contid_tab(l_new_contid_count).weight_uom := l_weight_uom_code;
6874 g_new_contid_tab(l_new_contid_count).volume_uom := l_volume_uom_code;
6875 g_new_contid_tab(l_new_contid_count).item_id := g_new_container_tab(cnt).container_item_id;
6876
6877 -- K LPN CONV. rv
6878 g_new_contid_tab(l_new_contid_count).organization_id := g_new_container_tab(cnt).organization_id;
6879
6880 x_cont_instance_tab(l_new_contid_count) := l_cont_tab(j);
6881 -- Bug 3570364 : Adding the Master container item id of the line to all it's
6882 -- container LPN's. This information is passed to Auto_pack_conts.
6883 l_detail_cont_rec.container_instance_id := l_cont_tab(j);
6884 l_detail_cont_rec.container_item_id := g_new_container_tab(cnt).mast_cont_item_id;
6885 l_detail_cont_tab(l_new_contid_count) := l_detail_cont_rec;
6886
6887 --g_new_contid_tab(l_new_contid_count).cont_instance_id := l_cont_tab(j).cont_instance_id;
6888 --x_cont_instance_tab(l_new_contid_count) := l_cont_tab(j).cont_instance_id;
6889 END LOOP;
6890
6891 --dbms_output.put_line('COUNT in new tab'||g_new_contid_tab.count||'<'||x_cont_instance_tab.count);
6892
6893 -- End of PL SQL table usage
6894 -- move this call of x_cont_instance_tab to within the above LOOP
6895 --x_cont_instance_tab(l_cont_instance_cnt) := l_cont_instance_id;
6896
6897 -- Bug 3570364 : Move following stmt's to within the above LOOP
6898 -- which stores the master container item id for each LPN
6899 /*{ l_detail_cont_rec.container_instance_id := l_cont_instance_id;
6900 l_detail_cont_rec.container_item_id := g_new_container_tab(cnt).mast_cont_item_id;
6901 l_detail_cont_tab(l_cont_instance_cnt) := l_detail_cont_rec;
6902 l_cont_instance_cnt := l_cont_instance_cnt + 1; } */
6903
6904 --dbms_output.put_line('Container dd id '||l_cont_instance_id||' for index '|| cnt);
6905 END IF;
6906 cnt := cnt + 1;
6907 END LOOP;
6908 --dbms_output.put_line('Error Count after CREATE CONTAINER'|| error_cnt);
6909
6910
6911 -- 70.1 Assign Details to Actual Containers created
6912 IF l_debug_on THEN
6913
6914 WSH_DEBUG_SV.log(l_module_name,'*** Assigning Details to Containers Created ***'||g_assign_detail_tab.count);
6915 WSH_DEBUG_SV.log(l_module_name,'*** COUNT ***'||g_new_contid_tab.count||'<'||g_new_container_tab.count||to_char(sysdate,'HH24:MI:SS'));
6916 END IF;
6917
6918 -- doing BULK UPDATE here
6919 -- First Update WDA for each delivey detail to have parent_delivery_detail populated
6920 -- correctly
6921
6922 m := 0;
6923 l_wms_ddtlist_cnt :=1;
6924 l_inv_ddtlist_cnt :=1;
6925 FOR cnt in 1..g_assign_detail_tab.COUNT
6926 LOOP
6927 l_GrossWtlist(cnt) := g_assign_detail_tab(cnt).gross_weight;
6928 l_NetWtlist(cnt) := g_assign_detail_tab(cnt).net_weight;
6929 l_WtUOMlist(cnt) := g_assign_detail_tab(cnt).weight_uom;
6930 l_Vollist(cnt) := g_assign_detail_tab(cnt).volume;
6931 l_VolUOMlist(cnt) := g_assign_detail_tab(cnt).volume_uom;
6932 l_InvItemlist(cnt) := g_assign_detail_tab(cnt).inventory_item_id;
6933 l_ddlist(cnt) := g_assign_detail_tab(cnt).delivery_detail_id;
6934 l_dellist(cnt) := g_assign_detail_tab(cnt).delivery_id;
6935 l_wms_org := 'N';
6936 -- K LPN CONV. rv
6937 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
6938 --{
6939 l_wms_org := wsh_util_validate.check_wms_org(g_assign_detail_tab(cnt).organization_id);
6940 IF (l_wms_org = 'Y') THEN
6941 l_sync_tmp_wms_ddlist.delivery_detail_id_tbl(l_wms_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_detail_id;
6942 l_sync_tmp_wms_ddlist.delivery_id_tbl(l_wms_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_id;
6943 l_sync_tmp_wms_ddlist.parent_detail_id_tbl(l_wms_ddtlist_cnt) := NULL;
6944 l_sync_tmp_wms_ddlist.operation_type_tbl(l_wms_ddtlist_cnt) := 'PRIOR';
6945 l_wms_ddtlist_cnt := l_wms_ddtlist_cnt + 1;
6946 ELSE
6947 l_sync_tmp_inv_ddlist.delivery_detail_id_tbl(l_inv_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_detail_id;
6948 l_sync_tmp_inv_ddlist.delivery_id_tbl(l_inv_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_id;
6949 l_sync_tmp_inv_ddlist.parent_detail_id_tbl(l_inv_ddtlist_cnt) := NULL;
6950 l_sync_tmp_inv_ddlist.operation_type_tbl(l_inv_ddtlist_cnt) := 'PRIOR';
6951 l_inv_ddtlist_cnt := l_inv_ddtlist_cnt + 1;
6952 END IF;
6953 --}
6954 END IF;
6955 -- K LPN CONV. rv
6956 IF l_dellist(cnt) IS NOT NULL THEN
6957 -- no check for distinct was there earlier, added the check
6958 IF l_del_tab.count > 0 THEN
6959 FOR j in 1..l_del_tab.COUNT
6960 LOOP
6961 IF (l_dellist(cnt) IS NOT NULL
6962 AND l_dellist(cnt) = l_del_tab(j)
6963 ) THEN
6964
6965 l_exists_flag := 'Y';
6966 EXIT;
6967 ELSE
6968 l_exists_flag := 'N';
6969
6970 END IF;
6971 END LOOP;
6972 ELSE
6973 l_exists_flag := 'N';
6974 END IF;
6975
6976 IF l_exists_flag = 'N' THEN
6977 m := m + 1;
6978 l_del_tab(m) := l_dellist(cnt);
6979 END IF;
6980 END IF;
6981 END LOOP;
6982 -- the number of records should be same
6983 -- when Empty Container logic is used, then there can be a record in
6984 -- assign table with no one to one mapping in new container table
6985 -- so use container index to find that container
6986
6987 m := 0;
6988 -- K LPN CONV. rv
6989 l_wms_contlist_cnt := 1;
6990 l_inv_contlist_cnt := 1;
6991
6992 l_wms_contlist1_cnt := 1;
6993 l_inv_contlist1_cnt := 1;
6994 -- K LPN CONV. rv
6995 FOR cnt in 1..g_assign_detail_tab.COUNT
6996 LOOP
6997
6998 l_contlist(cnt) :=
6999 g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id;
7000 -- K LPN CONV. rv
7001 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
7002 --{
7003 l_wms_org := 'N';
7004 l_wms_org := wsh_util_validate.check_wms_org(g_new_contid_tab(g_assign_detail_tab(cnt).container_index).organization_id);
7005 IF (l_wms_org = 'Y') THEN
7006 l_sync_tmp_wms_contlist.delivery_detail_id_tbl(l_wms_contlist_cnt) := l_contlist(cnt);
7007 l_sync_tmp_wms_contlist.operation_type_tbl(l_wms_contlist_cnt) := 'UPDATE';
7008 l_wms_contlist_cnt := l_wms_contlist_cnt + 1;
7009 ELSE
7010 l_sync_tmp_inv_contlist.delivery_detail_id_tbl(l_inv_contlist_cnt) := l_contlist(cnt);
7011 l_sync_tmp_inv_contlist.operation_type_tbl(l_inv_contlist_cnt) := 'UPDATE';
7012 l_inv_contlist_cnt := l_inv_contlist_cnt + 1;
7013 END IF;
7014 --}
7015 END IF;
7016 -- K LPN CONV. rv
7017
7018 IF ((cnt = 1)
7019 OR
7020 (cnt > 1
7021 AND l_contlist1(m) <>
7022 g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id)
7023 )THEN
7024
7025 IF l_contlist1.count > 0 THEN
7026 FOR j in l_contlist1.FIRST..l_contlist1.LAST
7027 LOOP
7028 IF l_contlist1(j) =
7029 g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id
7030 THEN
7031 l_duplicate_flag := 'Y';
7032 EXIT; -- out of the loop
7033 ELSE
7034 l_duplicate_flag := 'N';
7035 END IF;
7036 END LOOP;
7037 ELSE
7038 l_duplicate_flag := 'N';
7039 END IF;
7040 IF l_duplicate_flag = 'N' THEN
7041 m := m + 1;
7042 l_contlist1(m) :=
7043 g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id;
7044 -- J: W/V Changes
7045 l_cont_Wtlist(m) :=
7046 g_new_contid_tab(g_assign_detail_tab(cnt).container_index).unit_weight;
7047 l_cont_Vollist(m) :=
7048 g_new_contid_tab(g_assign_detail_tab(cnt).container_index).unit_volume;
7049 --l_dellist1(m) := g_assign_detail_tab(cnt).delivery_id; Commented by adagur for bug 16397445
7050 -- K LPN CONV. rv
7051 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
7052 --{
7053 IF (l_wms_org = 'Y') THEN
7054 l_sync_tmp_wms_contlist1.delivery_detail_id_tbl(l_wms_contlist1_cnt) := l_contlist1(m);
7055 l_sync_tmp_wms_contlist1.delivery_id_tbl(l_wms_contlist1_cnt) := NULL;
7056 l_sync_tmp_wms_contlist1.parent_detail_id_tbl(l_wms_contlist1_cnt) := NULL;
7057 l_sync_tmp_wms_contlist1.operation_type_tbl(l_wms_contlist1_cnt) := 'PRIOR';
7058 l_wms_contlist1_cnt := l_wms_contlist1_cnt + 1;
7059 ELSE
7060 l_sync_tmp_inv_contlist1.delivery_detail_id_tbl(l_inv_contlist1_cnt) := l_contlist1(m);
7061 l_sync_tmp_inv_contlist1.delivery_id_tbl(l_inv_contlist1_cnt) := NULL;
7062 l_sync_tmp_inv_contlist1.parent_detail_id_tbl(l_inv_contlist1_cnt) := NULL;
7063 l_sync_tmp_inv_contlist1.operation_type_tbl(l_inv_contlist1_cnt) := 'PRIOR';
7064 l_inv_contlist1_cnt := l_inv_contlist1_cnt + 1;
7065 END IF;
7066 --}
7067 END IF;
7068 -- K LPN CONV. rv
7069 END IF;
7070 END IF;
7071 END LOOP; -- g_assign_detail_tab Loop
7072
7073 IF l_debug_on THEN
7074 WSH_DEBUG_SV.logmsg(l_module_name,'Count-g_assign_detail_tab'||g_assign_detail_tab.COUNT);
7075 WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_contlist'||l_contlist.COUNT);
7076 WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_dellist>'||l_dellist.COUNT);
7077 WSH_DEBUG_SV.logmsg(l_module_name,'Count-g_new_contid>'||g_new_contid_tab.COUNT);
7078 WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_contlist1>'||l_contlist1.COUNT);
7079 --WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_dellist1>'||l_dellist1.COUNT); Commented by adagur for bug 16397445
7080 END IF;
7081
7082 -- J: W/V Changes
7083 -- 70.2 Accumulate the W/V to be adjusted by delivery and container for perf reasons. After the following loop
7084 -- l_tmp_dd1list will have W/V that needs to be reduced from deliveries (if the lines are already assigned to a delivery)
7085 -- l_tmp_dd2list will have W/V that needs to be propogated to container only.
7086 -- The W/V is accumulated and stored in the above tables whenever item,W/V uom change in container and delivery
7087 -- For Ex: Say a dd with Wt 10 Lbs and Vol 20 Cu. Ft is assigned to a delivery (which has Wt 10 Lbs and Vol 20 Cu. Ft)
7088 -- and say the line got auto-packed into a container with tare wt. 2 Lbs and Vol. 100 Cu. Ft
7089 -- Then after the following loop, l_tmp_dd1list will have dd with vol -20. l_tmp_dd2list will have
7090 -- gross wt. 10 Lbs and Vol 20 Cu. Ft.
7091
7092 IF l_debug_on THEN
7093 WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7094 END IF;
7095 l_prev_del_id := NULL;
7096 l_prev_dd_id := NULL;
7097 l_prev_cont_id := NULL;
7098 l_tot_dd_gross_wt := 0;
7099 l_tot_dd_net_wt := 0;
7100 l_tot_dd_vol := 0;
7101 l_tot_del_vol := 0;
7102 i := 0;
7103 l_item_changed := FALSE;
7104
7105 LOOP
7106 i := i + 1;
7107
7108 IF l_debug_on THEN
7109 IF i <= l_dellist.COUNT THEN
7110 WSH_DEBUG_SV.logmsg(l_module_name,'Del '||l_dellist(i)||' Cont '||l_contlist(i)||' DD '||l_ddlist(i)||' l_prev_dd_id '||l_prev_dd_id||' l_prev_cont_id '||l_prev_cont_id||' l_prev_del_id '||l_prev_del_id);
7111 END IF;
7112 END IF;
7113
7114 IF (i > l_dellist.COUNT OR l_contlist(i) is NOT NULL) THEN
7115
7116 IF (i > 1) AND (i <= l_dellist.COUNT) THEN
7117 IF (l_prev_item <> l_InvItemlist(i)) OR
7118 (NVL(l_prev_wt_uom,'-99') <> NVL(l_WtUOMlist(i),'-99')) OR
7119 (NVL(l_prev_vol_uom,'-99') <> NVL(l_VolUOMlist(i),'-99')) THEN
7120 l_item_changed := TRUE;
7121 END IF;
7122
7123 END IF;
7124
7125 IF (i > l_dellist.COUNT) OR
7126 (l_prev_del_id is NOT NULL AND (NVL(l_dellist(i),-99) <> l_prev_del_id)) OR
7127 l_item_changed THEN
7128 i1 := i1 + 1;
7129 l_tmp_dd1list(i1).dd_id := l_prev_dd_id;
7130 l_tmp_dd1list(i1).vol := -1 * l_tot_del_vol;
7131 l_tot_del_vol := 0;
7132 END IF;
7133
7134 IF i > l_dellist.COUNT OR
7135 (l_prev_cont_id is NOT NULL AND (l_contlist(i) <> l_prev_cont_id)) OR
7136 l_item_changed THEN
7137
7138 k1 := k1 + 1;
7139 l_tmp_dd2list(k1).dd_id := l_prev_dd_id;
7140 l_tmp_dd2list(k1).gross_wt := l_tot_dd_gross_wt;
7141 l_tmp_dd2list(k1).net_wt := l_tot_dd_net_wt;
7142 l_tmp_dd2list(k1).vol := l_tot_dd_vol;
7143
7144 l_tot_dd_gross_wt := 0;
7145 l_tot_dd_net_wt := 0;
7146 l_tot_dd_vol := 0;
7147 END IF;
7148
7149 IF i > l_dellist.COUNT THEN
7150 EXIT;
7151 END IF;
7152
7153 l_tot_dd_gross_wt := l_tot_dd_gross_wt + NVL(l_GrossWtlist(i),0);
7154 l_tot_dd_net_wt := l_tot_dd_net_wt + NVL(l_NetWtlist(i),0);
7155 l_tot_dd_vol := l_tot_dd_vol + NVL(l_Vollist(i),0);
7156 IF l_dellist(i) is not null THEN
7157 l_tot_del_vol := l_tot_del_vol + NVL(l_Vollist(i),0);
7158 END IF;
7159 l_prev_dd_id := l_ddlist(i);
7160 l_prev_cont_id := l_contlist(i);
7161 l_prev_wt_uom := l_WtUOMlist(i);
7162 l_prev_vol_uom := l_VolUOMlist(i);
7163 l_prev_item := l_InvItemlist(i);
7164 l_prev_del_id := l_dellist(i);
7165
7166 END IF;
7167 END LOOP;
7168 IF l_debug_on THEN
7169 WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7170 --WSH_DEBUG_SV.log(l_module_name,'l_tmp_dd1list.COUNT '||l_tmp_dd1list.COUNT||' l_tmp_dd2list.COUNT '||l_tmp_dd2list.COUNT||' l_tmp_contlist.COUNT '||l_tmp_contlist.COUNT);
7171 WSH_DEBUG_SV.log(l_module_name,'l_tmp_dd1list.COUNT '||l_tmp_dd1list.COUNT||' l_tmp_dd2list.COUNT '||l_tmp_dd2list.COUNT);
7172 WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment 1 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7173 END IF;
7174
7175 -- J: W/V Changes
7176 FOR i in 1..l_tmp_dd1list.COUNT LOOP
7177 IF l_debug_on THEN
7178 WSH_DEBUG_SV.logmsg(l_module_name,'Del1:Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
7179 END IF;
7180
7181 WSH_WV_UTILS.DD_WV_Post_Process(
7182 p_delivery_detail_id => l_tmp_dd1list(i).dd_id,
7183 p_diff_gross_wt => l_tmp_dd1list(i).gross_wt,
7184 p_diff_net_wt => NULL,
7185 p_diff_volume => l_tmp_dd1list(i).vol,
7186 p_diff_fill_volume => l_tmp_dd1list(i).vol,
7187 x_return_status => l_return_status);
7188
7189 IF (l_return_status <> C_SUCCESS_STATUS) THEN
7190 --
7191 IF (l_return_status = C_ERROR_STATUS OR
7192 l_return_status = C_UNEXP_ERROR_STATUS) THEN
7193 error_cnt := error_cnt + 1;
7194 ELSE
7195 cont_warn := cont_warn + 1;
7196 END IF;
7197
7198 END IF;
7199 END LOOP;
7200 IF l_debug_on THEN
7201 WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment 1 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7202 END IF;
7203
7204 -- changes to add l_dellist1 and add new messages
7205 --
7206 -- K LPN CONV. rv
7207 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7208 THEN
7209 --{
7210 IF (WSH_WMS_LPN_GRP.GK_WMS_PACK and l_sync_tmp_wms_ddlist.delivery_detail_id_tbl.count > 0)
7211 THEN
7212 --{
7213 WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7214 (
7215 p_sync_tmp_recTbl => l_sync_tmp_wms_ddlist,
7216 x_return_status => l_return_status
7217 );
7218
7219 IF l_debug_on THEN
7220 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7221 END IF;
7222 --
7223 IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7224 x_return_status := l_return_status;
7225 --
7226 IF l_debug_on THEN
7227 WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7228 WSH_DEBUG_SV.pop(l_module_name);
7229 END IF;
7230 --
7231 RETURN;
7232 ELSE
7233 IF l_return_status <> C_SUCCESS_STATUS THEN
7234 x_return_status := C_WARNING_STATUS;
7235 END IF;
7236 END IF;
7237 --}
7238 ELSIF (WSH_WMS_LPN_GRP.GK_INV_PACK and l_sync_tmp_inv_ddlist.delivery_detail_id_tbl.count > 0)
7239 THEN
7240 --{
7241 WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7242 (
7243 p_sync_tmp_recTbl => l_sync_tmp_inv_ddlist,
7244 x_return_status => l_return_status
7245 );
7246
7247 IF l_debug_on THEN
7248 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7249 END IF;
7250 --
7251 IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7252 x_return_status := l_return_status;
7253 --
7254 IF l_debug_on THEN
7255 WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7256 WSH_DEBUG_SV.pop(l_module_name);
7257 END IF;
7258 --
7259 RETURN;
7260 ELSE
7261 IF l_return_status <> C_SUCCESS_STATUS THEN
7262 x_return_status := C_WARNING_STATUS;
7263 END IF;
7264 END IF;
7265 --}
7266 END IF;
7267 --}
7268 END IF;
7269 -- K LPN CONV. rv
7270
7271 FORALL cnt IN 1..g_assign_detail_tab.COUNT
7272 UPDATE wsh_delivery_assignments_v
7273 SET PARENT_DELIVERY_DETAIL_ID = l_contlist(cnt),
7274 last_update_date = SYSDATE,
7275 last_updated_by = FND_GLOBAL.USER_ID,
7276 last_update_login = FND_GLOBAL.LOGIN_ID
7277 WHERE DELIVERY_DETAIL_ID = l_ddlist(cnt);
7278 l_mdc_id_tab.delete;
7279 l_mdc_index_i := l_ddlist.FIRST;
7280 l_mdc_index_j := 0;
7281 WHILE l_mdc_index_i IS NOT NULL LOOP
7282 l_mdc_index_j := l_mdc_index_j + 1;
7283 l_mdc_id_tab(l_mdc_index_j) := l_ddlist(l_mdc_index_i);
7284 l_mdc_index_i := l_ddlist.next(l_mdc_index_i);
7285
7286 END LOOP;
7287 WSH_DELIVERY_DETAILS_ACTIONS.Delete_Consol_Record(
7288 p_detail_id_tab => l_mdc_id_tab,
7289 x_return_status => x_return_status);
7290
7291 IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7292 IF l_debug_on THEN
7293 WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
7294 WSH_DEBUG_SV.pop(l_module_name);
7295 END IF;
7296 RETURN;
7297 END IF;
7298
7299
7300 -- J: W/V Changes
7301 IF l_debug_on THEN
7302 WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment 2 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7303 END IF;
7304 FOR i in 1..l_tmp_dd2list.COUNT LOOP
7305 IF l_debug_on THEN
7306 WSH_DEBUG_SV.logmsg(l_module_name,'Del2:Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
7307 END IF;
7308
7309 WSH_WV_UTILS.DD_WV_Post_Process(
7310 p_delivery_detail_id => l_tmp_dd2list(i).dd_id,
7311 p_diff_gross_wt => l_tmp_dd2list(i).gross_wt,
7312 p_diff_net_wt => l_tmp_dd2list(i).net_wt,
7313 p_diff_volume => l_tmp_dd2list(i).vol,
7314 p_diff_fill_volume => l_tmp_dd2list(i).vol,
7315 x_return_status => l_return_status);
7316
7317 IF (l_return_status <> C_SUCCESS_STATUS) THEN
7318 --
7319 IF (l_return_status = C_ERROR_STATUS OR
7320 l_return_status = C_UNEXP_ERROR_STATUS) THEN
7321 error_cnt := error_cnt + 1;
7322 ELSE
7323 cont_warn := cont_warn + 1;
7324 END IF;
7325
7326 END IF;
7327 END LOOP;
7328 IF l_debug_on THEN
7329 WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment 2 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7330 END IF;
7331
7332 -- fetch all the attributes for the delivery line
7333 cnt := 0;
7334 FOR i in 1..l_ddlist.count
7335 LOOP
7336 -- the inner loop will process one record at a time
7337 FOR rec in c_get_attributes(l_ddlist(i))
7338 LOOP
7339 cnt := cnt + 1;
7340 l_tab_cust_id(cnt) := rec.customer_id;
7341 l_tab_ship_location_id(cnt) := rec.ship_to_location_id;
7342 l_tab_intmed_location_id(cnt) := rec.intmed_ship_to_location_id;
7343 l_tab_fob_code(cnt) := rec.fob_code;
7344 l_tab_freight_terms_code(cnt) := rec.freight_terms_code;
7345 l_tab_ship_method_code(cnt) := rec.ship_method_code;
7346 l_tab_carrier_id(cnt) := rec.carrier_id;
7347 l_tab_mode_of_transport(cnt) := rec.mode_of_transport;
7348 l_tab_service_level(cnt) := rec.service_level;
7349 l_tab_deliver_location_id(cnt) := rec.deliver_to_location_id;
7350 l_tab_line_direction(cnt) := rec.line_direction; -- J-IB-NPARIKH
7351 l_tab_shipping_control(cnt) := rec.shipping_control; -- J-IB-NPARIKH
7352 l_tab_ignore_for_planning(cnt) := rec.ignore_for_planning;
7353 l_tab_client_id(cnt) := rec.client_id; -- LSP PROJECT
7354 END LOOP;
7355
7356 END LOOP;
7357
7358 --
7359 -- K LPN CONV. rv
7360 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7361 THEN
7362 --{
7363 IF (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_sync_tmp_wms_contlist.delivery_detail_id_tbl.count > 0)
7364 THEN
7365 --{
7366 WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7367 (
7368 p_sync_tmp_recTbl => l_sync_tmp_wms_contlist,
7369 x_return_status => l_return_status
7370 );
7371
7372 IF l_debug_on THEN
7373 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7374 END IF;
7375 --
7376 IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7377 x_return_status := l_return_status;
7378 --
7379 IF l_debug_on THEN
7380 WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7381 WSH_DEBUG_SV.pop(l_module_name);
7382 END IF;
7383 --
7384 RETURN;
7385 ELSE
7386 IF l_return_status <> C_SUCCESS_STATUS THEN
7387 x_return_status := C_WARNING_STATUS;
7388 END IF;
7389 END IF;
7390 --}
7391 ELSIF (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_sync_tmp_inv_contlist.delivery_detail_id_tbl.count > 0)
7392 THEN
7393 --{
7394 WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7395 (
7396 p_sync_tmp_recTbl => l_sync_tmp_inv_contlist,
7397 x_return_status => l_return_status
7398 );
7399
7400 IF l_debug_on THEN
7401 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7402 END IF;
7403 --
7404 IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7405 x_return_status := l_return_status;
7406 --
7407 IF l_debug_on THEN
7408 WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7409 WSH_DEBUG_SV.pop(l_module_name);
7410 END IF;
7411 --
7412 RETURN;
7413 ELSE
7414 IF l_return_status <> C_SUCCESS_STATUS THEN
7415 x_return_status := C_WARNING_STATUS;
7416 END IF;
7417 END IF;
7418 --}
7419 END IF;
7420 --}
7421 END IF;
7422 -- K LPN CONV. rv
7423 -- update container with all the attributes
7424 --BUG#12904248
7425 FOR cnt IN 1..g_assign_detail_tab.COUNT
7426 LOOP
7427
7428 OPEN c_get_deliver_to_location_id(l_contlist(cnt));
7429 FETCH c_get_deliver_to_location_id into l_deliver_to_location_id;
7430 IF c_get_deliver_to_location_id%notfound THEN
7431 l_deliver_to_location_id:=null;
7432 END IF;
7433
7434 CLOSE c_get_deliver_to_location_id;
7435
7436 IF l_debug_on THEN
7437 WSH_DEBUG_SV.log(l_module_name,'cnt ',cnt);
7438 WSH_DEBUG_SV.log(l_module_name,'l_deliver_to_location_id ',l_deliver_to_location_id);
7439 WSH_DEBUG_SV.log(l_module_name,'l_tab_deliver_location_id(cnt) ',l_tab_deliver_location_id(cnt));
7440 END IF;
7441
7442 -- If conatiner deliver to location id is null
7443 IF l_deliver_to_location_id is null THEN
7444 -- if this is first record and conatiner in last record is different from current record container then assign delivery detail
7445 -- deliver to location to conatiner else make conatiner deliver to location as NULL
7446 IF cnt =1 or l_container_id <>l_contlist(cnt) THEN
7447 l_deliver_to_location_id1 :=l_tab_deliver_location_id(cnt);
7448 ELSE
7449 l_deliver_to_location_id1 := null;
7450 END IF;
7451 ELSE
7452 IF l_deliver_to_location_id = l_tab_deliver_location_id(cnt) THEN
7453 l_deliver_to_location_id1 := l_tab_deliver_location_id(cnt);
7454 ELSE
7455 l_deliver_to_location_id1 := null;
7456 END IF;
7457
7458 END IF;
7459
7460 l_container_id := l_contlist(cnt);
7461
7462 IF l_debug_on THEN
7463 WSH_DEBUG_SV.log(l_module_name,'l_deliver_to_location_id1 ', l_deliver_to_location_id1);
7464 END IF;
7465
7466 UPDATE WSH_DELIVERY_DETAILS
7467 SET customer_id = l_tab_cust_id(cnt),
7468 ship_to_location_id = l_tab_ship_location_id(cnt),
7469 intmed_ship_to_location_id = l_tab_intmed_location_id(cnt),
7470 fob_code = l_tab_fob_code(cnt),
7471 freight_terms_code = l_tab_freight_terms_code(cnt),
7472 ship_method_code = l_tab_ship_method_code(cnt),
7473 carrier_id = l_tab_carrier_id(cnt),
7474 service_level = l_tab_service_level(cnt),
7475 mode_of_transport = l_tab_mode_of_transport(cnt),
7476 deliver_to_location_id = l_deliver_to_location_id1,
7477 line_direction = l_tab_line_direction(cnt),
7478 shipping_control = l_tab_shipping_control(cnt),
7479 ignore_for_planning = l_tab_ignore_for_planning(cnt),
7480 client_id = l_tab_client_id(cnt) -- LSP PROJECT
7481 WHERE DELIVERY_DETAIL_ID = l_contlist(cnt);
7482 END LOOP;
7483
7484
7485 -- then if the delivery detail has a delivery assigned, update the container records
7486 -- in WDA to indicate delivery id
7487 --
7488 -- K LPN CONV. rv
7489 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7490 THEN
7491 --{
7492 IF (WSH_WMS_LPN_GRP.GK_WMS_ASSIGN_DLVY and l_sync_tmp_wms_contlist1.delivery_detail_id_tbl.count > 0)
7493 THEN
7494 --{
7495 WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7496 (
7497 p_sync_tmp_recTbl => l_sync_tmp_wms_contlist1,
7498 x_return_status => l_return_status
7499 );
7500
7501 IF l_debug_on THEN
7502 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7503 END IF;
7504 --
7505 IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7506 x_return_status := l_return_status;
7507 --
7508 IF l_debug_on THEN
7509 WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7510 WSH_DEBUG_SV.pop(l_module_name);
7511 END IF;
7512 --
7513 RETURN;
7514 ELSE
7515 IF l_return_status <> C_SUCCESS_STATUS THEN
7516 x_return_status := C_WARNING_STATUS;
7517 END IF;
7518 END IF;
7519 --}
7520 ELSIF (WSH_WMS_LPN_GRP.GK_INV_ASSIGN_DLVY and l_sync_tmp_inv_contlist1.delivery_detail_id_tbl.count > 0)
7521 THEN
7522 --{
7523 WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7524 (
7525 p_sync_tmp_recTbl => l_sync_tmp_inv_contlist1,
7526 x_return_status => l_return_status
7527 );
7528
7529 IF l_debug_on THEN
7530 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7531 END IF;
7532 --
7533 IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7534 x_return_status := l_return_status;
7535 --
7536 IF l_debug_on THEN
7537 WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7538 WSH_DEBUG_SV.pop(l_module_name);
7539 END IF;
7540 --
7541 RETURN;
7542 ELSE
7543 IF l_return_status <> C_SUCCESS_STATUS THEN
7544 x_return_status := C_WARNING_STATUS;
7545 END IF;
7546 END IF;
7547 --}
7548 END IF;
7549 --}
7550 END IF;
7551 -- K LPN CONV. rv
7552
7553 -- OTM R12 : assign delivery detail
7554 /*Commented by adagur for bug 16397445
7555 IF (l_gc3_is_installed = 'Y') THEN
7556 -- loop through the deliveries in l_dellist1,
7557 -- and get ignore_for_planning and tms_interface_flag tab,
7558 -- for ignore_for_planning delivery, check whether it's empty
7559 l_index := l_dellist1.FIRST;
7560 WHILE (l_index IS NOT NULL) LOOP
7561 -- l_dellist1(l_index) might be null if the container is not assigned
7562 -- to a delivery
7563 IF (l_dellist1(l_index) IS NOT NULL) THEN
7564 OPEN c_get_plan_and_tms_flag(l_dellist1(l_index));
7565 FETCH c_get_plan_and_tms_flag INTO l_ignore_for_planning_tab(l_index),
7566 l_tms_interface_flag_tab(l_index);
7567 IF c_get_plan_and_tms_flag%NOTFOUND THEN
7568 --{
7569 IF l_debug_on THEN
7570 WSH_DEBUG_SV.log(l_module_name,'No data for c_get_plan_and_tms_flag', l_dellist1(l_index));
7571 END IF;
7572 CLOSE c_get_plan_and_tms_flag;
7573 raise FND_API.G_EXC_ERROR;
7574 END IF;
7575
7576 CLOSE c_get_plan_and_tms_flag;
7577
7578 l_delivery_was_empty_tab(l_index) := FALSE;
7579 IF (l_ignore_for_planning_tab(l_index) = 'N') THEN
7580 l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(l_dellist1(l_index));
7581 IF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
7582 IF l_debug_on THEN
7583 WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
7584 END IF;
7585 raise FND_API.G_EXC_ERROR;
7586 ELSIF (l_is_delivery_empty = 'Y') THEN
7587 l_delivery_was_empty_tab(l_index) := TRUE;
7588 END IF;
7589 END IF;
7590 IF l_debug_on THEN
7591 WSH_DEBUG_SV.log(l_module_name,'l_dellist1('||l_index||')', l_dellist1(l_index));
7592 WSH_DEBUG_SV.log(l_module_name,'l_contlist1('||l_index||')', l_contlist1(l_index));
7593 WSH_DEBUG_SV.log(l_module_name,'l_ignore_for_planning_tab('||l_index||')', l_ignore_for_planning_tab(l_index));
7594 WSH_DEBUG_SV.log(l_module_name,'l_tms_interface_flag_tab('||l_index||')', l_tms_interface_flag_tab(l_index));
7595 END IF;
7596 ELSE
7597 l_ignore_for_planning_tab(l_index) := NULL;
7598 l_tms_interface_flag_tab(l_index) := NULL;
7599 l_delivery_was_empty_tab(l_index) := NULL;
7600 IF l_debug_on THEN
7601 WSH_DEBUG_SV.log(l_module_name, 'l_dellist1 is null for ', l_contlist1(l_index));
7602 END IF;
7603 END IF;
7604
7605 l_index := l_dellist1.NEXT(l_index);
7606 END LOOP;
7607 END IF;
7608 -- End of OTM R12 : assign delivery detail
7609
7610 FORALL cnt IN 1..g_new_contid_tab.COUNT
7611 UPDATE wsh_delivery_assignments_v
7612 SET delivery_id = l_dellist1(cnt),
7613 last_update_date = SYSDATE,
7614 last_updated_by = FND_GLOBAL.USER_ID,
7615 last_update_login = FND_GLOBAL.LOGIN_ID
7616 WHERE DELIVERY_DETAIL_ID = l_contlist1(cnt);
7617
7618
7619 --
7620 -- OTM R12 : assign delivery detail
7621 IF (l_gc3_is_installed = 'Y') THEN
7622
7623 l_index := l_dellist1.FIRST;
7624 l_index_update := 0;
7625 WHILE (l_index IS NOT NULL) LOOP
7626 IF (l_dellist1(l_index) IS NOT NULL AND
7627 l_ignore_for_planning_tab(l_index) = 'N') THEN
7628
7629 IF (l_delivery_was_empty_tab(l_index)) THEN
7630 l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(l_dellist1(l_index));
7631
7632 IF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
7633 --handle the error approriately to the procedure this code is in
7634 IF l_debug_on THEN
7635 WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
7636 END IF;
7637 raise FND_API.G_EXC_ERROR;
7638 ELSIF (l_is_delivery_empty = 'N') THEN
7639 IF (l_tms_interface_flag_tab(l_index) = WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT) THEN
7640 l_index_update := l_index_update + 1;
7641 l_delivery_id_tab(l_index_update) := l_dellist1(l_index);
7642 l_interface_flag_tab(l_index_update) := WSH_NEW_DELIVERIES_PVT.C_TMS_CREATE_REQUIRED;
7643
7644 IF (l_debug_on) THEN
7645 WSH_DEBUG_SV.logmsg(l_module_name, 'Delivery is not empty');
7646 WSH_DEBUG_SV.log(l_module_name,'l_dellist1', l_dellist1(l_index));
7647 WSH_DEBUG_SV.log(l_module_name,'l_interface_flag_tab', l_interface_flag_tab(l_index_update));
7648 END IF;
7649 ELSIF (l_tms_interface_flag_tab(l_index) in
7650 (WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_REQUIRED,
7651 WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_IN_PROCESS)) THEN
7652 l_index_update := l_index_update + 1;
7653 l_delivery_id_tab(l_index_update) := l_dellist1(l_index);
7654 l_interface_flag_tab(l_index_update) := WSH_NEW_DELIVERIES_PVT.C_TMS_UPDATE_REQUIRED;
7655 IF (l_debug_on) THEN
7656 WSH_DEBUG_SV.logmsg(l_module_name, 'Delivery is not empty');
7657 WSH_DEBUG_SV.log(l_module_name,'l_dellist1', l_dellist1(l_index));
7658 WSH_DEBUG_SV.log(l_module_name,'l_interface_flag_tab', l_interface_flag_tab(l_index_update));
7659 END IF;
7660 END IF;
7661 END IF;
7662 ELSE -- (NOT l_delivery_was_empty)
7663
7664 OPEN c_get_tare_weight(l_contlist1(l_index));
7665 FETCH c_get_tare_weight INTO l_tare_weight;
7666
7667 IF c_get_tare_weight%NOTFOUND THEN
7668 --{
7669 IF l_debug_on THEN
7670 WSH_DEBUG_SV.log(l_module_name,'No data for c_get_tare_weight', l_contlist1(l_index));
7671 END IF;
7672 CLOSE c_get_tare_weight;
7673 raise FND_API.G_EXC_ERROR;
7674 END IF;
7675 CLOSE c_get_tare_weight;
7676
7677 IF (l_debug_on) THEN
7678 WSH_DEBUG_SV.logmsg(l_module_name, 'Delivery was not empty');
7679 WSH_DEBUG_SV.log(l_module_name,'l_dellist1', l_dellist1(l_index));
7680 WSH_DEBUG_SV.log(l_module_name,'l_contlist1', l_contlist1(l_index));
7681 WSH_DEBUG_SV.log(l_module_name,'l_tare_weight', l_tare_weight);
7682 END IF;
7683 l_index_update := l_index_update + 1;
7684 l_delivery_id_tab(l_index_update) := l_dellist1(l_index);
7685 l_interface_flag_tab(l_index_update) := NULL;
7686 --Bug7608629
7687 --removed code which checked for gross weight
7688 --now irrespective of tare weight UPDATE_TMS_INTERFACE_FLAG will be called
7689 END IF;
7690 END IF;
7691 l_index := l_dellist1.NEXT(l_index);
7692 END LOOP;
7693
7694 IF (l_index_update > 0) THEN
7695 WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG(
7696 p_delivery_id_tab => l_delivery_id_tab,
7697 p_tms_interface_flag_tab => l_interface_flag_tab,
7698 x_return_status => l_return_status);
7699
7700 IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
7701 IF l_debug_on THEN
7702 WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG '||l_return_status);
7703 END IF;
7704 raise FND_API.G_EXC_ERROR;
7705 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
7706 IF l_debug_on THEN
7707 WSH_DEBUG_SV.logmsg(l_module_name,'Warning in WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG '||l_return_status);
7708 END IF;
7709 cont_warn := cont_warn + 1;
7710 END IF;
7711
7712 END IF;
7713 END IF;
7714 -- End of OTM R12 : assign delivery detail
7715 End of Comment by adagur for bug 16397445 */
7716
7717 l_mdc_id_tab.delete;
7718 l_mdc_index_i := l_contlist1.FIRST;
7719 l_mdc_index_j := 0;
7720 WHILE l_mdc_index_i IS NOT NULL LOOP
7721 l_mdc_index_j := l_mdc_index_j + 1;
7722 l_mdc_id_tab(l_mdc_index_j) := l_contlist1(l_mdc_index_i);
7723 l_mdc_index_i := l_contlist1.next(l_mdc_index_i);
7724
7725 END LOOP;
7726
7727 WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
7728 p_detail_id_tab => l_mdc_id_tab,
7729 x_return_status => x_return_status);
7730
7731 IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7732 IF l_debug_on THEN
7733 WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
7734 WSH_DEBUG_SV.pop(l_module_name);
7735 END IF;
7736 RETURN;
7737 END IF;
7738
7739 -- J: W/V Changes
7740 IF l_debug_on THEN
7741 WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment 3 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7742 END IF;
7743 FOR i in 1..l_contlist1.COUNT LOOP
7744 IF l_debug_on THEN
7745 WSH_DEBUG_SV.logmsg(l_module_name,'Cont:Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
7746 END IF;
7747
7748 WSH_WV_UTILS.DD_WV_Post_Process(
7749 p_delivery_detail_id => l_contlist1(i),
7750 p_diff_gross_wt => l_cont_Wtlist(i),
7751 p_diff_net_wt => NULL,
7752 p_diff_volume => l_cont_Vollist(i),
7753 p_diff_fill_volume => l_cont_Vollist(i),
7754 x_return_status => l_return_status);
7755
7756 IF (l_return_status <> C_SUCCESS_STATUS) THEN
7757 --
7758 IF (l_return_status = C_ERROR_STATUS OR
7759 l_return_status = C_UNEXP_ERROR_STATUS) THEN
7760 error_cnt := error_cnt + 1;
7761 ELSE
7762 cont_warn := cont_warn + 1;
7763 END IF;
7764
7765 END IF;
7766 END LOOP;
7767 IF l_debug_on THEN
7768 WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment 3 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7769 END IF;
7770
7771 -- 75.1 Bulk Update Weight/Volume on packed delivery details
7772 -- added the WHO columns in the UPDATE
7773 -- in WSHWVUTB.pls , update_container_wt there are no WHO columns
7774 FORALL cnt IN 1..g_assign_detail_tab.COUNT
7775 UPDATE WSH_DELIVERY_DETAILS
7776 SET NET_WEIGHT = l_NetWtlist(cnt),
7777 GROSS_WEIGHT = l_GrossWtlist(cnt),
7778 VOLUME = l_Vollist(cnt),
7779 last_update_date = SYSDATE,
7780 last_updated_by = FND_GLOBAL.USER_ID,
7781 last_update_login = FND_GLOBAL.LOGIN_ID
7782 WHERE DELIVERY_DETAIL_ID = l_ddlist(cnt);
7783
7784 END IF; -- line_cont_tab.COUNT > 0
7785
7786 --H integration : Pricing Integration
7787 IF l_del_tab.count > 0 THEN
7788 IF l_debug_on THEN
7789 WSH_DEBUG_SV.logmsg(l_module_name,'Calling Program Unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
7790 END IF;
7791 WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required
7792 (p_entity_type => 'DELIVERY',
7793 p_entity_ids => l_del_tab,
7794 x_return_status => l_return_status
7795 );
7796 IF l_debug_on THEN
7797 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
7798 END IF;
7799 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
7800 RAISE mark_reprice_error;
7801 END IF;
7802 END IF;
7803 -- End of H integration : Pricing Integration
7804
7805 --dbms_output.put_line('AFTER CONT WT'||to_char(sysdate,'HH24:MI:SS'));
7806 -- 90.1 Summarize errors/warnings
7807
7808 IF l_debug_on THEN
7809 WSH_DEBUG_SV.logmsg(l_module_name,'Error, warn,success Count -'||error_cnt||','||warn_cnt||','||succ_cnt);
7810 END IF;
7811 IF (warn_cnt > 0 OR cont_warn > 0) THEN
7812 x_return_status := C_WARNING_STATUS;
7813 IF cont_warn > 0 THEN
7814 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_PACK_WARN');
7815 FND_MESSAGE.SET_TOKEN('CONT_WARN',cont_warn);
7816 FND_MESSAGE.SET_TOKEN('CONT_ERR',0);
7817 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7818 END IF;
7819 ELSIF (error_cnt > 0) THEN
7820 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_PACK_ERROR');
7821 FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
7822 FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
7823 FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
7824 IF succ_cnt > 0 THEN
7825 x_return_status := C_WARNING_STATUS;
7826 ELSE
7827 x_return_status := C_ERROR_STATUS;
7828 END IF;
7829 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7830 ELSE
7831 x_return_status := C_SUCCESS_STATUS;
7832 END IF;
7833
7834 IF l_debug_on THEN
7835 WSH_DEBUG_SV.logmsg(l_module_name,'L ret status -'||l_return_status);
7836 WSH_DEBUG_SV.logmsg(l_module_name,'X ret status -'||x_return_status);
7837 END IF;
7838 IF x_return_status = C_ERROR_STATUS THEN
7839 IF p_pack_cont_flag = 'Y' THEN
7840 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MASTER_NOT_PACK');
7841 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7842 END IF;
7843 --
7844 IF l_debug_on THEN
7845 WSH_DEBUG_SV.pop(l_module_name);
7846 END IF;
7847 --
7848 return;
7849 ELSE
7850 l_return_status := x_return_status;
7851 END IF;
7852
7853 IF l_debug_on THEN
7854 WSH_DEBUG_SV.logmsg(l_module_name,'2L ret status -'||l_return_status);
7855 WSH_DEBUG_SV.logmsg(l_module_name,'2X ret status -'||x_return_status);
7856 END IF;
7857 -- 100.1 Call WSH_CONTAINER_ACTIONS.Auto_Pack_Conts depending on
7858 -- p_pack_cont_flag and if new detail containers are created
7859 IF l_detail_cont_tab.count > 0 AND p_pack_cont_flag = 'Y' THEN
7860
7861 l_group_id_tab.delete;
7862
7863 --dbms_output.put_line('Calling AUTO PACK CONTS With x_cont_instance count of ' || x_cont_instance_tab.count);
7864 --
7865 IF l_debug_on THEN
7866 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.AUTO_PACK_CONTS',WSH_DEBUG_SV.C_PROC_LEVEL);
7867 END IF;
7868 --
7869 wsh_container_actions.Auto_Pack_Conts (
7870 l_group_id_tab,
7871 l_detail_cont_tab,
7872 x_cont_instance_tab,
7873 l_mast_cont_tab,
7874 l_return_status);
7875
7876 IF l_debug_on THEN
7877 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
7878 END IF;
7879 IF l_return_status = C_UNEXP_ERROR_STATUS THEN
7880 --dbms_output.put_line('Returned from autopack conts with unexpected error');
7881 /* No message WSH_CONT_CONT_AUTOPACK_ERR
7882 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CONT_AUTOPACK_ERR');
7883 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7884 IF l_return_status <> C_ERROR_STATUS THEN
7885 l_return_status := C_WARNING_STATUS;
7886 END IF;
7887 */
7888 x_return_status := l_return_status;
7889 --
7890 IF l_debug_on THEN
7891 WSH_DEBUG_SV.pop(l_module_name);
7892 END IF;
7893 --
7894 RETURN;
7895 ELSE
7896 IF l_return_status <> C_SUCCESS_STATUS THEN
7897 x_return_status := C_WARNING_STATUS;
7898 END IF;
7899 END IF;
7900
7901 --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Auto_Pack_Conts created '||l_mast_cont_tab.COUNT||' Master Containers');
7902 IF l_mast_cont_tab.COUNT > 0 THEN
7903 i := 1;
7904 cnt := x_cont_instance_tab.COUNT;
7905 WHILE i <= l_mast_cont_tab.COUNT LOOP
7906 cnt := cnt + 1;
7907 x_cont_instance_tab(cnt) := l_mast_cont_tab(i);
7908 i := i + 1;
7909 END LOOP;
7910 END IF;
7911
7912 END IF;
7913
7914 IF l_debug_on THEN
7915 WSH_DEBUG_SV.logmsg(l_module_name,'3L ret status -'||l_return_status);
7916 WSH_DEBUG_SV.logmsg(l_module_name,'3X ret status -'||x_return_status);
7917 END IF;
7918 IF l_debug_on THEN
7919 WSH_DEBUG_SV.pop(l_module_name);
7920 END IF;
7921 --
7922 EXCEPTION
7923
7924 WHEN mark_reprice_error THEN
7925 FND_MESSAGE.Set_Name('WSH','WSH_REPRICE_REQD_ERR');
7926 x_return_status := l_return_status;
7927 WSH_UTIL_CORE.add_message(x_return_status,l_module_name);
7928 IF l_debug_on THEN
7929 WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7930 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
7931 END IF;
7932
7933 -- OTM R12 : assign delivery detail
7934 WHEN FND_API.G_EXC_ERROR THEN
7935 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7936 IF c_get_plan_and_tms_flag%ISOPEN THEN
7937 CLOSE c_get_plan_and_tms_flag;
7938 END IF;
7939 IF c_get_tare_weight%ISOPEN THEN
7940 CLOSE c_get_tare_weight;
7941 END IF;
7942
7943 --
7944 IF l_debug_on THEN
7945 WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
7946 WSH_DEBUG_SV.pop(l_module_name);
7947 END IF;
7948 --
7949 RETURN;
7950 -- End of OTM R12 : assign delivery detail
7951
7952 WHEN Others THEN
7953 -- OTM R12 : assign delivery detail
7954 IF c_get_plan_and_tms_flag%ISOPEN THEN
7955 CLOSE c_get_plan_and_tms_flag;
7956 END IF;
7957 IF c_get_tare_weight%ISOPEN THEN
7958 CLOSE c_get_tare_weight;
7959 END IF;
7960 -- End of OTM R12 : assign delivery detail
7961
7962 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Auto_Pack_Lines',l_module_name);
7963 x_return_status := C_UNEXP_ERROR_STATUS;
7964
7965 --
7966 IF l_debug_on THEN
7967 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
7968 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
7969 END IF;
7970 --
7971 END Auto_Pack_Lines;
7972
7973 /*
7974 -----------------------------------------------------------------------------
7975 PROCEDURE : Auto_Pack_Delivery
7976 PARAMETERS : p_delivery_tab - table of delivery ids that need to be
7977 autopacked.
7978 x_cont_instance_tab - table of container instance ids that were
7979 created during the autopacking.
7980 x_return_status - return status of API.
7981 DESCRIPTION : This procedure takes a table of deliveries that need to be
7982 autopacked and checks for all unpacked lines in each of the
7983 deliveries. After fetching all unpacked lines in each delivery,
7984 it calls the Auto_Pack_Lines with the table of unpacked lines.
7985 After autopacking the lines, it recalculates the weight and
7986 volume of the delivery.
7987 ------------------------------------------------------------------------------
7988 */
7989
7990
7991 PROCEDURE Auto_Pack_Delivery (
7992 p_delivery_tab IN WSH_UTIL_CORE.id_tab_type,
7993 p_pack_cont_flag IN VARCHAR2,
7994 x_cont_instance_tab OUT NOCOPY WSH_UTIL_CORE.id_tab_type,
7995 x_return_status OUT NOCOPY VARCHAR2) IS
7996
7997 CURSOR get_delivery_wms(x_delivery_id NUMBER) IS
7998 SELECT mp.wms_enabled_flag
7999 FROM wsh_new_deliveries wnd,
8000 mtl_parameters mp
8001 WHERE wnd.delivery_id = x_delivery_id
8002 AND mp.organization_id = wnd.organization_id;
8003
8004
8005 CURSOR Get_Delivery_Lines (v_delivery_id NUMBER) IS
8006 SELECT wda.delivery_detail_id
8007 FROM wsh_delivery_assignments_v wda,
8008 WSH_DELIVERY_DETAILS wdd
8009 WHERE wda.delivery_id = v_delivery_id
8010 AND wda.delivery_id IS NOT NULL
8011 AND wda.parent_delivery_detail_id IS NULL
8012 AND wda.delivery_detail_id = wdd.delivery_detail_id
8013 AND wdd.container_flag = 'N';
8014
8015 l_del_detail_tab WSH_UTIL_CORE.id_tab_type;
8016 l_group_id_tab WSH_UTIL_CORE.id_tab_type;
8017
8018 l_gross_weight NUMBER;
8019 l_volume NUMBER;
8020
8021 l_cont_instance_tab WSH_UTIL_CORE.id_tab_type;
8022
8023 l_ret_sts VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8024 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8025
8026 error_cnt NUMBER := 0;
8027 warn_cnt NUMBER := 0;
8028 succ_cnt NUMBER := 0;
8029
8030 i NUMBER;
8031 m NUMBER := 0;
8032 l_del_rows WSH_UTIL_CORE.id_tab_type;
8033
8034 l_del_name VARCHAR2(30);
8035 l_wms_count NUMBER := 0;
8036 l_wms_enabled_flag VARCHAR2(1);
8037
8038 -- LPN CONV. rv
8039 l_lpn_in_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_in_rec_type;
8040 l_lpn_out_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_out_rec_type;
8041 l_msg_count NUMBER;
8042 l_msg_data VARCHAR2(32767);
8043 e_return_excp EXCEPTION;
8044 -- LPN CONV. rv
8045
8046
8047 --
8048 l_debug_on BOOLEAN;
8049 --
8050 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'AUTO_PACK_DELIVERY';
8051 --
8052 BEGIN
8053 --
8054 --
8055 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
8056 --
8057 IF l_debug_on IS NULL
8058 THEN
8059 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
8060 END IF;
8061 --
8062 IF l_debug_on THEN
8063 WSH_DEBUG_SV.push(l_module_name);
8064 --
8065 WSH_DEBUG_SV.log(l_module_name,'P_PACK_CONT_FLAG',P_PACK_CONT_FLAG);
8066 END IF;
8067 --
8068 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8069
8070 l_del_rows.delete;
8071
8072 FOR j IN 1..p_delivery_tab.count LOOP
8073
8074 i := 1;
8075 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8076 l_del_detail_tab.delete;
8077
8078 IF l_debug_on THEN
8079 WSH_DEBUG_SV.log(l_module_name,'Auto pack delivery ', p_delivery_tab(j));
8080 END IF;
8081 -- bug 1578527: disallow packing actions in WMS
8082
8083 OPEN get_delivery_wms(p_delivery_tab(j));
8084 FETCH get_delivery_wms INTO l_wms_enabled_flag;
8085 IF get_delivery_wms%NOTFOUND THEN
8086 CLOSE get_delivery_wms;
8087 FND_MESSAGE.SET_NAME('WSH', 'WSH_NO_DATA_FOUND');
8088 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8089 --
8090 --IF l_debug_on THEN
8091 --WSH_DEBUG_SV.pop(l_module_name);
8092 --END IF;
8093 --
8094 --RETURN; LPN CONV. rv
8095 raise e_return_excp; -- LPN CONV. rv
8096 END IF;
8097 CLOSE get_delivery_wms;
8098
8099 IF l_wms_enabled_flag = 'Y' THEN
8100 l_wms_count := l_wms_count + 1;
8101 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
8102 goto next_delivery_to_autopack;
8103 END IF;
8104
8105 FOR d IN Get_Delivery_Lines (p_delivery_tab(j)) LOOP
8106
8107 l_del_detail_tab(i) := d.delivery_detail_id;
8108 IF l_debug_on THEN
8109 WSH_DEBUG_SV.log(l_module_name,'pupulate delivery detail id ', d.delivery_detail_id );
8110 END IF;
8111 i := i + 1;
8112
8113 END LOOP;
8114
8115 IF Get_Delivery_Lines%ISOPEN THEN
8116 CLOSE Get_Delivery_Lines;
8117 END IF;
8118 IF l_debug_on THEN
8119 WSH_DEBUG_SV.log(l_module_name,'l_del_detail_tab.count: ', l_del_detail_tab.count );
8120 END IF;
8121 IF l_del_detail_tab.count = 0 THEN
8122
8123 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
8124
8125 FND_MESSAGE.SET_NAME('WSH','WSH_DEL_AUTOPACK_NULL');
8126 --
8127 IF l_debug_on THEN
8128 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.GET_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
8129 END IF;
8130 --
8131 l_del_name := WSH_NEW_DELIVERIES_PVT.Get_Name(p_delivery_tab(j));
8132 FND_MESSAGE.SET_TOKEN('DEL_NAME',l_del_name);
8133 WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
8134 ELSE
8135
8136 --
8137 IF l_debug_on THEN
8138 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.AUTO_PACK_LINES',WSH_DEBUG_SV.C_PROC_LEVEL);
8139 END IF;
8140 --
8141
8142 wsh_container_actions.Auto_Pack_Lines (
8143 l_group_id_tab,
8144 l_del_detail_tab,
8145 p_pack_cont_flag,
8146 l_cont_instance_tab,
8147 l_return_status);
8148
8149 IF l_debug_on THEN
8150 WSH_DEBUG_SV.log(l_module_name,'Return status from wsh_container_actions.Auto_Pack_Lines -',l_return_status);
8151 END IF;
8152 IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR OR l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
8153 --dbms_output.put_line('autopack lines failed');
8154 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
8155 ELSE
8156 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
8157 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
8158 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN -- Bug#2903864 - Start
8159 IF (x_cont_instance_tab IS NULL) THEN
8160 x_cont_instance_tab := l_cont_instance_tab;
8161 ELSE
8162 FOR i in 1..l_cont_instance_tab.count LOOP
8163 x_cont_instance_tab(x_cont_instance_tab.count + 1) := l_cont_instance_tab(i);
8164 END LOOP;
8165 END IF; -- Bug#2903864 - End
8166
8167 END IF;
8168
8169 END IF;
8170
8171 END IF;
8172 <<next_delivery_to_autopack>>
8173 IF l_debug_on THEN
8174 WSH_DEBUG_SV.log(l_module_name,'return status for delivery '|| p_delivery_tab(j), l_ret_sts );
8175 END IF;
8176 IF l_ret_sts = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8177 succ_cnt := succ_cnt + 1;
8178 ELSIF l_ret_sts = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
8179 warn_cnt := warn_cnt + 1;
8180 ELSE
8181 error_cnt := error_cnt + 1;
8182 END IF;
8183 END LOOP;
8184
8185 -- bug 1578527: disallow packing actions in WMS
8186 IF l_wms_count > 0 THEN
8187 IF l_wms_count = p_delivery_tab.count THEN
8188 FND_MESSAGE.SET_NAME('WSH', 'WSH_WMS_PACK_NOT_ALLOWED');
8189 WSH_UTIL_CORE.Add_message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
8190 ELSE
8191 FND_MESSAGE.SET_NAME('WSH', 'WSH_WMS_RECORDS_NOT_PACKED');
8192 FND_MESSAGE.SET_TOKEN('COUNT', l_wms_count);
8193 WSH_UTIL_CORE.Add_message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
8194 END IF;
8195 END IF;
8196
8197 /* H integration: Pricing integration csun
8198 when plan a delivery
8199 */
8200 IF l_del_rows.count > 0 THEN
8201 --
8202 IF l_debug_on THEN
8203 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
8204 END IF;
8205 --
8206 WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
8207 p_entity_type => 'DELIVERY',
8208 p_entity_ids => l_del_rows,
8209 x_return_status => l_return_status);
8210
8211 IF l_debug_on THEN
8212 WSH_DEBUG_SV.log(l_module_name,'Return status from WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required -',l_return_status);
8213 END IF;
8214 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR
8215 l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
8216 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8217 FND_MESSAGE.SET_NAME('WSH', 'WSH_REPRICE_REQUIRED_ERR');
8218 WSH_UTIL_CORE.add_message(x_return_status,l_module_name);
8219 --IF l_debug_on THEN
8220 -- WSH_DEBUG_SV.pop(l_module_name);
8221 --END IF;
8222 --return; LPN CONV. rv
8223 raise e_return_excp; -- LPN CONV. rv
8224 END IF;
8225 END IF;
8226
8227 -- LPN CONV. rv
8228 --
8229 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8230 THEN
8231 --{
8232
8233 IF l_debug_on THEN
8234 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
8235 END IF;
8236 --
8237 WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8238 (
8239 p_in_rec => l_lpn_in_sync_comm_rec,
8240 x_return_status => l_return_status,
8241 x_out_rec => l_lpn_out_sync_comm_rec
8242 );
8243 --
8244 IF l_debug_on THEN
8245 WSH_DEBUG_SV.log(l_module_name, 'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
8246 END IF;
8247 --
8248 WSH_UTIL_CORE.API_POST_CALL
8249 (
8250 p_return_status => l_return_status,
8251 x_num_warnings => warn_cnt,
8252 x_num_errors => error_cnt,
8253 p_raise_error_flag => false
8254 );
8255 --}
8256 END IF;
8257 -- LPN CONV. rv
8258 --
8259
8260 IF warn_cnt > 0 THEN
8261 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8262 FND_MESSAGE.SET_NAME('WSH','WSH_DEL_PACK_WARN');
8263 FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
8264 FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
8265 FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
8266 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8267
8268 ELSIF error_cnt > 0 THEN
8269 IF succ_cnt > 0 THEN
8270 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8271 FND_MESSAGE.SET_NAME('WSH','WSH_DEL_PACK_WARN');
8272 FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
8273 FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
8274 FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
8275 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8276 ELSE
8277 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8278 FND_MESSAGE.SET_NAME('WSH','WSH_DEL_PACK_ERROR');
8279 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8280 END IF;
8281 ELSIF succ_cnt > 0 THEN
8282 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8283 ELSE
8284 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8285 END IF;
8286
8287 IF l_debug_on THEN
8288 WSH_DEBUG_SV.pop(l_module_name);
8289 END IF;
8290
8291 EXCEPTION
8292 -- LPN CONV. rv
8293 WHEN e_return_excp THEN
8294 --
8295 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8296 THEN
8297 --{
8298 --
8299 IF l_debug_on THEN
8300 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
8301 END IF;
8302 --
8303 WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8304 (
8305 p_in_rec => l_lpn_in_sync_comm_rec,
8306 x_return_status => l_return_status,
8307 x_out_rec => l_lpn_out_sync_comm_rec
8308 );
8309 --
8310 IF l_debug_on THEN
8311 WSH_DEBUG_SV.log(l_module_name, 'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
8312 END IF;
8313 IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR,WSH_UTIL_CORE.G_RET_STS_ERROR) AND x_return_status <> WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
8314 x_return_status := l_return_status;
8315 END IF;
8316 --}
8317 END IF;
8318 --
8319 -- LPN CONV. rv
8320 --
8321 IF l_debug_on THEN
8322 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:E_RETURN_EXCP');
8323 END IF;
8324
8325 WHEN Others THEN
8326 --
8327 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Auto_Pack_Delivery',l_module_name);
8328 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8329
8330 IF l_debug_on THEN
8331 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS FROM WHEN OTHERS',WSH_DEBUG_SV.C_PROC_LEVEL);
8332 END IF;
8333 --
8334 IF l_debug_on THEN
8335 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS FROM WHEN OTHERS',WSH_DEBUG_SV.C_PROC_LEVEL);
8336 END IF;
8337 --
8338 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8339 THEN
8340 --{
8341 --
8342 IF l_debug_on THEN
8343 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
8344 END IF;
8345 --
8346 WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8347 (
8348 p_in_rec => l_lpn_in_sync_comm_rec,
8349 x_return_status => l_return_status,
8350 x_out_rec => l_lpn_out_sync_comm_rec
8351 );
8352 --
8353 IF l_debug_on THEN
8354 WSH_DEBUG_SV.log(l_module_name, 'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
8355 END IF;
8356 --}
8357 END IF;
8358 --
8359 -- LPN CONV. rv
8360 --
8361 IF l_debug_on THEN
8362 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
8363 END IF;
8364 END Auto_Pack_Delivery;
8365
8366
8367 /*
8368 -----------------------------------------------------------------------------
8369 PROCEDURE : Pack_Multi
8370 PARAMETERS : p_cont_tab - table of container instance ids that are being
8371 packed.
8372 p_del_detail_tab - table of unpacked delivery detail ids.
8373 p_pack_mode - indicates whether containers are packed in
8374 equal/proportional mode ('E') or in full/sequential mode ('F')
8375 p_split_pc - the percentage by which each line is going to be
8376 split in the case of equal packing mode.
8377 x_pack_status - the packed status of containers after the multi
8378 pack is performed - indicates whether any underpacked or
8379 overpacked containers.
8380 x_return_status - return status of API.
8381 DESCRIPTION : This procedure takes the specified delivery detail ids and
8382 packs them into the selected containers in either the full mode
8383 or equal mode. In the full mode, it packs the first container
8384 fully before packing the next. In the equal mode, all lines
8385 are split equally between all the containers and packed
8386 equally between them.
8387 ------------------------------------------------------------------------------
8388 */
8389
8390
8391 PROCEDURE Pack_Multi (
8392 p_cont_tab IN WSH_UTIL_CORE.id_tab_type,
8393 p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
8394 p_pack_mode IN VARCHAR2,
8395 p_split_pc IN NUMBER,
8396 x_pack_status OUT NOCOPY VARCHAR2,
8397 x_return_status OUT NOCOPY VARCHAR2) IS
8398
8399
8400 CURSOR Get_Cont_Info (v_cont_instance_id NUMBER) IS
8401 SELECT inventory_item_id, organization_id, gross_weight, net_weight,
8402 volume, weight_uom_code, volume_uom_code, fill_percent,
8403 minimum_fill_percent, maximum_load_weight, maximum_volume
8404 FROM wsh_delivery_details
8405 WHERE delivery_detail_id = v_cont_instance_id
8406 AND container_flag = 'Y';
8407
8408 CURSOR Get_Detail_Info (v_del_detail_id NUMBER) IS
8409 SELECT inventory_item_id, nvl(shipped_quantity, NVL(picked_quantity, requested_quantity)) pack_qty,
8410 requested_quantity_uom, net_weight, volume,
8411 weight_uom_code, volume_uom_code, organization_id,
8412 nvl(detail_container_item_id, master_container_item_id) cont_item_id,
8413 nvl(shipped_quantity2, NVL(picked_quantity2, requested_quantity2)) pack_qty2
8414 FROM wsh_delivery_details
8415 WHERE delivery_detail_id = v_del_detail_id
8416 AND container_flag = 'N';
8417
8418 TYPE Cont_Rec IS RECORD (container_instance_id NUMBER, pack_status VARCHAR2(30));
8419
8420 TYPE Detail_Rec IS RECORD (delivery_detail_id NUMBER, pack_status VARCHAR2(30));
8421
8422 TYPE Cont_Rec_Table IS TABLE OF Cont_Rec INDEX BY BINARY_INTEGER;
8423 TYPE Detail_Rec_Table IS TABLE OF Detail_Rec INDEX BY BINARY_INTEGER;
8424
8425 l_cont_item_id NUMBER;
8426 l_cont_org_id NUMBER;
8427 l_cont_gross NUMBER;
8428 l_cont_net NUMBER;
8429 l_cont_volume NUMBER;
8430 l_cont_wt_uom VARCHAR2(3);
8431 l_cont_vol_uom VARCHAR2(3);
8432 l_cont_fill_pc NUMBER;
8433 l_cont_min_fill_pc NUMBER;
8434 l_cont_max_load_wt NUMBER;
8435 l_cont_max_vol NUMBER;
8436
8437 l_det_inv_item_id NUMBER;
8438 l_det_pack_qty NUMBER;
8439 l_det_pack_qty2 NUMBER;
8440 l_det_qty_uom VARCHAR2(3);
8441 l_det_net NUMBER;
8442 l_det_volume NUMBER;
8443 l_det_wt_uom VARCHAR2(3);
8444 l_det_vol_uom VARCHAR2(3);
8445 l_det_org_id NUMBER;
8446 l_det_cont_item_id NUMBER;
8447
8448 l_split_det_id NUMBER;
8449 i NUMBER;
8450 j NUMBER;
8451 cont_count NUMBER;
8452 det_count NUMBER;
8453 l_req_cont_num NUMBER;
8454 l_cont_avail_pc NUMBER;
8455 l_cont_self_tare NUMBER;
8456 l_split_qty NUMBER;
8457 l_split_qty2 NUMBER;
8458 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8459
8460 l_tmp_cont_gr NUMBER;
8461 l_tmp_cont_net NUMBER;
8462 l_tmp_cont_vol NUMBER;
8463 l_tmp_fill_pc NUMBER;
8464 l_pack_status VARCHAR2(30);
8465
8466 l_tmp_split_qty NUMBER;
8467
8468 l_tmp_det_net NUMBER;
8469 l_tmp_det_vol NUMBER;
8470
8471 l_det_pack_sts VARCHAR2(30);
8472
8473 l_tmp_det_tab WSH_UTIL_CORE.id_tab_type;
8474
8475 l_cont_tab Cont_Rec_Table;
8476 l_det_tab Detail_Rec_Table;
8477
8478 l_split_pc NUMBER;
8479
8480 l_tmp_det_qty NUMBER;
8481 l_tmp_det_count NUMBER;
8482
8483 l_tmp_delta NUMBER;
8484
8485 l_cont_name VARCHAR2(30);
8486
8487 warn_cnt NUMBER := 0;
8488 succ_cnt NUMBER := 0;
8489 error_cnt NUMBER := 0;
8490
8491 cont_warn NUMBER := 0;
8492 cont_err NUMBER := 0;
8493 cont_succ NUMBER := 0;
8494 l_tmp_return_status varchar2(1);
8495
8496 l_tmp_status VARCHAR2(30) := 'OK';
8497 l_discard_status VARCHAR2(1);
8498 l_discard_message VARCHAR2(2000);
8499 -- J: W/V Changes
8500 l_fill_status VARCHAR2(1);
8501
8502 /* H projects: pricing integration csun */
8503 m NUMBER := 0;
8504 l_detail_rows WSH_UTIL_CORE.id_tab_type;
8505
8506 -- for Load Tender
8507 l_trip_id_tab wsh_util_core.id_tab_type;
8508
8509 -- bug 3562797 jckwok
8510 l_process_flag VARCHAR2(1);
8511 l_fill_pc_basis VARCHAR2(1);
8512 -- end bug 3562797 jckwok
8513
8514 --
8515 l_debug_on BOOLEAN;
8516 --
8517 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'PACK_MULTI';
8518 --Bugfix 4070732
8519 l_api_session_name CONSTANT VARCHAR2(150) := G_PKG_NAME ||'.' || l_module_name;
8520 l_reset_flags BOOLEAN;
8521 l_num_errors NUMBER;
8522 --
8523 --
8524 l_num_warnings NUMBER;
8525 --
8526
8527 -- HW OPM BUG# 3011758
8528 --HW OPMCONV - Removed OPM local variables
8529
8530 -- HW OPMCONV - Renamed variable to l_lot_divisible_flag
8531 l_lot_divisible_flag VARCHAR2(1);
8532 -- HW OPMCONV - New variable to hold item info
8533 l_item_info WSH_DELIVERY_DETAILS_INV.mtl_system_items_rec;
8534
8535 -- LPN CONV. rv
8536 l_lpn_in_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_in_rec_type;
8537 l_lpn_out_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_out_rec_type;
8538 l_msg_count NUMBER;
8539 l_msg_data VARCHAR2(32767);
8540 e_return_excp EXCEPTION;
8541 -- LPN CONV. rv
8542
8543 BEGIN
8544 IF WSH_UTIL_CORE.G_START_OF_SESSION_API is null THEN --Bugfix 4070732
8545 WSH_UTIL_CORE.G_START_OF_SESSION_API := l_api_session_name;
8546 WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API := FALSE;
8547 END IF;
8548 --
8549 --
8550 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
8551 --
8552 IF l_debug_on IS NULL
8553 THEN
8554 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
8555 END IF;
8556 --
8557 IF l_debug_on THEN
8558 WSH_DEBUG_SV.push(l_module_name);
8559 --
8560 WSH_DEBUG_SV.log(l_module_name,'P_PACK_MODE',P_PACK_MODE);
8561 WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_PC',P_SPLIT_PC);
8562 END IF;
8563 --
8564 IF p_cont_tab.count = 0 OR p_del_detail_tab.count = 0 THEN
8565 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_ASSG_NULL');
8566 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8567 x_pack_status := 'Error';
8568 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8569 --
8570 --Bugfix 4070732 {
8571 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
8572 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
8573 IF l_debug_on THEN
8574 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
8575 END IF;
8576
8577 WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags => TRUE,
8578 x_return_status => l_tmp_return_status);
8579
8580
8581 IF l_debug_on THEN
8582 WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
8583 END IF;
8584 /*wsh_util_core.api_post_call
8585 (
8586 p_return_status => l_return_status,
8587 x_num_warnings => l_num_warnings,
8588 x_num_errors => l_num_errors
8589 );
8590 */
8591 IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
8592 X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8593 END IF;
8594 END IF;
8595 END IF;
8596 --}
8597 --IF l_debug_on THEN
8598 -- WSH_DEBUG_SV.pop(l_module_name);
8599 --END IF;
8600 --
8601 --return; LPN CONV. rv
8602 raise e_return_excp; -- LPN CONV. rv
8603 END IF;
8604
8605 cont_count := p_cont_tab.count;
8606 det_count := p_del_detail_tab.count;
8607
8608 --dbms_output.put_line('in pack multi conts are ' || cont_count || ' details are ' || det_count);
8609
8610 FOR i IN 1..cont_count LOOP
8611
8612 l_cont_tab(i).container_instance_id := p_cont_tab(i);
8613 l_cont_tab(i).pack_status := 'Unpacked';
8614
8615 END LOOP;
8616
8617 --
8618 --
8619 -- added to fix bug 1818233.
8620 -- pack_multi performs most of time doing this check, especially
8621 -- when a single delivery line is being split into multiple due to
8622 -- container-load relationship.
8623 -- This check will be made only once for a delivery line in place of
8624 -- doing it every time we assign a split delivery line to a container.
8625 -- Thus, auto-pack lines will always call assign_detail procedure
8626 -- with parameter p_check_credit_holds = FALSE.
8627 -- pack_multi lines will explicitly call the procedure (as follows)
8628 -- WSH_DETAILS_VALIDATIONS.Check_Credit_Holds only once for a delivery
8629 -- line . If any of the delivery lines fails this check, API will
8630 -- return with error.
8631 --
8632
8633 FOR j IN 1..det_count LOOP
8634
8635 l_det_tab(j).delivery_detail_id := p_del_detail_tab(j);
8636 l_det_tab(j).pack_status := 'Unpacked';
8637
8638 --
8639 IF l_debug_on THEN
8640 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_CREDIT_HOLDS',WSH_DEBUG_SV.C_PROC_LEVEL);
8641 END IF;
8642 --
8643 WSH_DETAILS_VALIDATIONS.Check_Credit_Holds (
8644 l_det_tab(j).delivery_detail_id,
8645 'PACK',
8646 NULL,
8647 NULL,
8648 NULL,
8649 'Y',
8650 x_return_status);
8651 IF l_debug_on THEN
8652 WSH_DEBUG_SV.log(l_module_name,'return status-', x_return_status);
8653 END IF;
8654
8655 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8656 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8657 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DETAIL_NOT_ASSIGNED');
8658 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
8659 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
8660 x_pack_status := 'Error';
8661 END IF;
8662
8663 END LOOP;
8664
8665 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR
8666 THEN
8667 --Bugfix 4070732 {
8668 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
8669 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
8670 IF l_debug_on THEN
8671 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
8672 END IF;
8673
8674 WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags => TRUE,
8675 x_return_status => l_tmp_return_status);
8676
8677 IF l_debug_on THEN
8678 WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
8679 END IF;
8680
8681 /* wsh_util_core.api_post_call
8682 (
8683 p_return_status => l_return_status,
8684 x_num_warnings => l_num_warnings,
8685 x_num_errors => l_num_errors
8686 );
8687 */
8688
8689 IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
8690 X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8691 END IF;
8692 END IF;
8693 END IF;
8694 --}
8695 --
8696 --IF l_debug_on THEN
8697 -- WSH_DEBUG_SV.pop(l_module_name);
8698 --END IF;
8699 --
8700 --RETURN; LPN CONV. rv
8701 raise e_return_excp; -- LPN CONV. rv
8702 END IF;
8703
8704 i := 1;
8705 j := 1;
8706
8707 IF p_pack_mode = 'F' THEN
8708 -- packing mode is full - each container is filled before packing the next
8709
8710 WHILE j <= det_count LOOP
8711
8712 --dbms_output.put_line('j = ' || j);
8713 l_det_pack_sts := 'Unpacked';
8714 i := 1;
8715
8716 IF l_debug_on THEN
8717 WSH_DEBUG_SV.log(l_module_name,'processing line ' || j || ' detail is ' || l_det_tab(j).delivery_detail_id);
8718 END IF;
8719
8720 WHILE i <= cont_count LOOP
8721 IF l_cont_tab(i).pack_status = 'Skipped' THEN
8722 l_cont_tab(i).pack_status := 'Unpacked';
8723 END IF;
8724 i := i + 1;
8725 END LOOP;
8726
8727 i := 1;
8728
8729 WHILE (i <= cont_count AND l_det_pack_sts = 'Unpacked') LOOP
8730
8731 /*
8732 if i <= 0 or i > 10 then
8733 exit;
8734 end if;
8735 */
8736
8737 OPEN Get_Detail_Info (l_det_tab(j).delivery_detail_id);
8738
8739 FETCH Get_Detail_Info INTO
8740 l_det_inv_item_id,
8741 l_det_pack_qty,
8742 l_det_qty_uom,
8743 l_det_net,
8744 l_det_volume,
8745 l_det_wt_uom,
8746 l_det_vol_uom,
8747 l_det_org_id,
8748 l_det_cont_item_id,
8749 l_det_pack_qty2;
8750
8751 IF Get_Detail_Info%NOTFOUND THEN
8752 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
8753 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
8754 x_pack_status := 'Error';
8755 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8756 CLOSE Get_Detail_Info;
8757 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
8758 error_cnt := error_cnt + 1;
8759 l_det_tab(j).pack_status := 'Error';
8760 exit;
8761 END IF;
8762
8763 IF Get_Detail_Info%ISOPEN THEN
8764 CLOSE Get_Detail_Info;
8765 END IF;
8766
8767 -- bug 3562797 jckwok
8768 -- when percent fill basis flag is None and packing mode as Full,
8769 -- packing workbench raises error.
8770 Calc_Fill_Basis_and_Proc_Flag(
8771 p_organization_id => l_det_org_id,
8772 x_return_status => x_return_status,
8773 x_fill_basis => l_fill_pc_basis,
8774 x_process_flag => l_process_flag);
8775
8776 IF l_debug_on THEN
8777 WSH_DEBUG_SV.log(l_module_name,'return status -',x_return_status);
8778 END IF;
8779
8780 IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
8781 --Bugfix 4070732 {
8782 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
8783 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
8784 IF l_debug_on THEN
8785 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
8786 END IF;
8787
8788 WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags => TRUE,
8789 x_return_status => l_tmp_return_status);
8790
8791
8792 IF l_debug_on THEN
8793 WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
8794 END IF;
8795
8796 /*wsh_util_core.api_post_call
8797 (
8798 p_return_status => l_return_status,
8799 x_num_warnings => l_num_warnings,
8800 x_num_errors => l_num_errors
8801 );
8802 */
8803
8804 IF
8805 (l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
8806 OR
8807 (x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
8808 THEN --{
8809 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8810 ELSIF x_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR
8811 THEN
8812 IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR
8813 THEN
8814 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8815 ELSIF l_tmp_return_status =
8816 WSH_UTIL_CORE.G_RET_STS_WARNING THEN
8817 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8818 END IF;
8819 END IF; --}
8820
8821 END IF;
8822 END IF;
8823 --}
8824 --IF l_debug_on THEN
8825 -- WSH_DEBUG_SV.pop(l_module_name);
8826 --END IF;
8827 --RETURN;
8828 raise e_return_excp; -- LPN CONV. rv
8829 END IF;
8830 IF (l_fill_pc_basis = 'N') THEN
8831 FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
8832 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8833 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
8834 x_pack_status := 'Error';
8835 error_cnt := error_cnt + 1;
8836 l_det_tab(j).pack_status := 'Error';
8837 exit;
8838 END IF;
8839 -- end bug 3562797 jckwok
8840 --- HW OPM BUG# 3011758
8841 -- HW OPMCONV - 1) Removed branching code
8842 -- - 2) Removed call to OPM API to get item info
8843 -- - 3) New WSH API call to get item info
8844
8845 WSH_DELIVERY_DETAILS_INV.Get_item_information
8846 (
8847 p_organization_id =>l_det_org_id
8848 , p_inventory_item_id => l_det_inv_item_id
8849 , x_mtl_system_items_rec => l_item_info
8850 , x_return_status => l_return_status
8851 );
8852
8853 wsh_util_core.api_post_call
8854 (
8855 p_return_status => l_return_status,
8856 x_num_warnings => l_num_warnings,
8857 x_num_errors => l_num_errors
8858 );
8859
8860 -- HW OPMCONV - Get flag from correct record
8861 IF ( l_item_info.lot_divisible_flag = 'N' AND
8862 l_item_info.lot_control_code = 2 ) THEN
8863 l_lot_divisible_flag := 'N';
8864 ELSE
8865 l_lot_divisible_flag := 'Y';
8866 END IF;
8867
8868 --dbms_output.put_line('before checking for unpacked conts ' || i || l_cont_tab(i).pack_status);
8869
8870
8871 WHILE (i <= cont_count and l_cont_tab(i).pack_status <> 'Unpacked') LOOP
8872 i := i + 1;
8873
8874 END LOOP;
8875
8876 --dbms_output.put_line('after looping for unpacked conts i = ' || i);
8877
8878 IF i > cont_count THEN
8879 exit;
8880 END IF;
8881
8882 OPEN Get_Cont_Info (l_cont_tab(i).container_instance_id);
8883
8884 FETCH Get_Cont_Info INTO
8885 l_cont_item_id,
8886 l_cont_org_id,
8887 l_cont_gross,
8888 l_cont_net,
8889 l_cont_volume,
8890 l_cont_wt_uom,
8891 l_cont_vol_uom,
8892 l_cont_fill_pc,
8893 l_cont_min_fill_pc,
8894 l_cont_max_load_wt,
8895 l_cont_max_vol;
8896
8897 IF Get_Cont_Info%NOTFOUND THEN
8898 --
8899 IF l_debug_on THEN
8900 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
8901 END IF;
8902 --
8903 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
8904 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
8905 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
8906 x_pack_status := 'Error';
8907 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8908 CLOSE Get_Cont_Info;
8909 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
8910 cont_err := cont_err + 1;
8911 l_cont_tab(i).pack_status := 'Error';
8912 l_tmp_status := 'Error';
8913 GOTO new_container;
8914 END IF;
8915
8916 CLOSE Get_Cont_Info;
8917
8918 --dbms_output.put_line('processing container ' || i || ' id is ' || l_cont_tab(i).container_instance_id);
8919
8920 /*
8921 -- WSH_WV_UTILS.Container_Weight_Volume (
8922 -- replacing with TPA enabled API..
8923
8924 --
8925 IF l_debug_on THEN
8926 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
8927 END IF;
8928 --
8929 WSH_TPA_CONTAINER_PKG.Container_Weight_Volume (
8930 l_cont_tab(i).container_instance_id,
8931 'Y',
8932 l_tmp_cont_gr,
8933 l_tmp_cont_net,
8934 l_tmp_cont_vol,
8935 'Y',
8936 l_tmp_fill_pc,
8937 x_return_status);
8938 IF l_debug_on THEN
8939 WSH_DEBUG_SV.log(l_module_name,'return status ' ,x_return_status);
8940 END IF;
8941
8942 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8943 --dbms_output.put_line('container wt vol error');
8944
8945 l_cont_tab(i).pack_status := 'Warning';
8946 --
8947 IF l_debug_on THEN
8948 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
8949 END IF;
8950 --
8951 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
8952 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
8953 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
8954
8955
8956 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
8957 cont_warn := cont_warn + 1;
8958 l_tmp_status := 'Error';
8959 GOTO new_container;
8960 END IF;
8961
8962 IF (l_tmp_fill_pc > 100) THEN
8963 */
8964 IF (l_cont_fill_pc > 100) THEN
8965
8966 --dbms_output.put_line('cont overpacked');
8967
8968 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
8969 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8970 END IF;
8971
8972 l_cont_tab(i).pack_status := 'Overpacked';
8973 cont_warn := cont_warn + 1;
8974 l_tmp_status := 'Error';
8975 GOTO new_container;
8976 END IF;
8977
8978 -- bug 4642837 l_tmp_fill_pc --> l_cont_fill_pc
8979
8980 l_cont_avail_pc := 1 - (nvl(l_cont_fill_pc,0)/100);
8981
8982 IF (l_cont_org_id = l_det_org_id) THEN
8983
8984 -- WSH_CONTAINER_UTILITIES.Estimate_Detail_Containers (
8985 -- replacing with TPA enabled API..
8986
8987 --
8988 IF l_debug_on THEN
8989 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.ESTIMATE_DETAIL_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
8990 END IF;
8991 --
8992 WSH_TPA_CONTAINER_PKG.Estimate_Detail_Containers (
8993 l_cont_tab(i).container_instance_id,
8994 l_cont_item_id,
8995 l_det_tab(j).delivery_detail_id,
8996 l_det_org_id,
8997 l_req_cont_num,
8998 x_return_status);
8999
9000 IF l_debug_on THEN
9001 WSH_DEBUG_SV.log(l_module_name,'return status ' ,x_return_status);
9002 END IF;
9003 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9004 l_cont_tab(i).pack_status := 'Skipped';
9005 l_det_tab(j).pack_status := 'Error';
9006 error_cnt := error_cnt + 1;
9007 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9008 l_tmp_status := 'Error';
9009 GOTO new_container;
9010 END IF;
9011
9012 --dbms_output.put_line('req cont is ' || l_req_cont_num);
9013 --dbms_output.put_line(' cont avail pc is ' || l_cont_avail_pc);
9014
9015 IF l_req_cont_num <= l_cont_avail_pc THEN
9016
9017 l_tmp_det_tab(1) := l_det_tab(j).delivery_detail_id;
9018
9019 IF l_debug_on THEN
9020 WSH_DEBUG_SV.log(l_module_name,'assigning detail ' || l_tmp_det_tab(1) || ' to container ' || l_cont_tab(i).container_instance_id);
9021 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
9022 END IF;
9023
9024 --
9025 wsh_container_actions.Assign_Detail (
9026 l_cont_tab(i).container_instance_id,
9027 l_tmp_det_tab,
9028 l_pack_status,
9029 x_return_status,FALSE);
9030 IF l_debug_on THEN
9031 WSH_DEBUG_SV.log(l_module_name,'return status ' ,x_return_status);
9032 END IF;
9033 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9034 --dbms_output.put_line('could not assign');
9035 l_cont_tab(i).pack_status := 'Skipped';
9036 l_det_tab(j).pack_status := 'Error';
9037 error_cnt := error_cnt + 1;
9038 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9039 l_return_status := x_return_status;
9040 END IF;
9041
9042 ELSIF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9043 l_det_tab(j).pack_status := 'Packed';
9044 l_det_pack_sts := 'Packed';
9045 -- J: W/V Changes
9046 WSH_WV_UTILS.Check_Fill_Pc (
9047 p_container_instance_id => l_cont_tab(i).container_instance_id,
9048 x_fill_status => l_fill_status,
9049 x_return_status => l_return_status);
9050
9051 IF l_fill_status = 'O' THEN
9052 --
9053 IF l_debug_on THEN
9054 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9055 END IF;
9056 --
9057 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9058
9059 --dbms_output.put_line('container ' || l_cont_name || ' overpacked ');
9060
9061
9062 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9063 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9064 END IF;
9065
9066 l_cont_tab(i).pack_status := 'Overpacked';
9067 cont_warn := cont_warn + 1;
9068 l_tmp_status := 'Error';
9069 END IF;
9070
9071 l_det_pack_sts := 'Packed';
9072
9073 IF l_req_cont_num = l_cont_avail_pc THEN
9074 l_cont_tab(i).pack_status := 'Packed';
9075 i := i + 1;
9076 END IF;
9077
9078
9079 END IF;
9080
9081 ELSE -- if line needs to be split
9082
9083 l_tmp_split_qty := ROUND(((l_det_pack_qty*l_cont_avail_pc)/l_req_cont_num),LIMITED_PRECISION);
9084
9085 --
9086 IF l_debug_on THEN
9087 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
9088 END IF;
9089 --
9090 WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
9091 l_det_inv_item_id,
9092 l_det_org_id,
9093 l_tmp_split_qty,
9094 l_det_qty_uom,
9095 l_split_qty,
9096 l_discard_status);
9097 IF l_debug_on THEN
9098 WSH_DEBUG_SV.log(l_module_name,'return status ' ,l_discard_status);
9099 END IF;
9100
9101 -- bug 1716136: errors likely mean integers are safe values.
9102 IF l_discard_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9103 l_discard_message := FND_MESSAGE.GET;
9104 l_split_qty := FLOOR(l_tmp_split_qty);
9105 END IF;
9106
9107 IF l_split_qty IS NULL THEN
9108 l_split_qty := l_tmp_split_qty;
9109 END IF;
9110
9111 IF (l_split_qty < 0 OR l_split_qty > l_det_pack_qty) THEN
9112 FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
9113 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9114 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9115 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9116 l_det_tab(j).pack_status := 'Error';
9117 error_cnt := error_cnt + 1;
9118 exit;
9119 END IF;
9120
9121 IF l_split_qty >= 1 THEN
9122
9123 IF l_det_pack_qty = l_split_qty THEN
9124 IF l_debug_on THEN
9125 WSH_DEBUG_SV.log(l_module_name,'In IF of equal-');
9126 END IF;
9127 l_split_det_id := l_det_tab(j).delivery_detail_id;
9128 IF l_debug_on THEN
9129 WSH_DEBUG_SV.log(l_module_name,'DELIVERY DETAIL id'||l_split_det_id);
9130 END IF;
9131 l_tmp_det_tab(1) := l_split_det_id;
9132 l_tmp_det_count := j;
9133 l_det_pack_sts := 'Packed';
9134
9135 ELSIF l_det_pack_qty > l_split_qty THEN
9136
9137 --- HW OPM BUG# 3011758
9138 -- if lot indivisbile and last container, raise an error
9139 -- else go to the next container
9140 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9141 -- - 2) Changed check condition for lot divisible from 1 to 'N'
9142 IF ( l_lot_divisible_flag = 'N' AND i = cont_count AND l_det_pack_sts = 'Unpacked') THEN
9143 FND_MESSAGE.SET_NAME('WSH','WSH_OPM_IND_SPLIT_PACK');
9144 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9145 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9146 WSH_UTIL_CORE.Add_Message(l_return_status);
9147 l_det_tab(j).pack_status := 'Error';
9148 error_cnt := error_cnt + 1;
9149 exit;
9150 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9151 -- - 2) Changed check condition for lot divisible from 1 to 'N'
9152 ELSIF ( l_lot_divisible_flag = 'N' AND i < cont_count AND l_det_pack_sts = 'Unpacked') THEN
9153 goto new_container;
9154 --dbms_output.put_line('calling split details');
9155
9156 --
9157 ELSE -- non divisible
9158
9159 l_split_qty2 := (l_split_qty * l_det_pack_qty2)/l_det_pack_qty;
9160 IF l_debug_on THEN
9161 WSH_DEBUG_SV.log(l_module_name,'l_split_qty',l_split_qty);
9162 WSH_DEBUG_SV.log(l_module_name,'l_split_qty2',l_split_qty2);
9163 WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty2',l_det_pack_qty2);
9164 WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty',l_det_pack_qty);
9165 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
9166 END IF;
9167 --
9168
9169 WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details (
9170 p_from_detail_id => l_det_tab(j).delivery_detail_id,
9171 p_req_quantity => l_split_qty,
9172 p_req_quantity2 => l_split_qty2,
9173 x_new_detail_id => l_split_det_id,
9174 x_return_status =>x_return_status,
9175 p_manual_split => 'C'
9176 );
9177 --dbms_output.put_line('...split detail id ' || l_split_det_id);
9178 IF l_debug_on THEN
9179 WSH_DEBUG_SV.log(l_module_name,'return status,split det id -',x_return_status||l_split_det_id);
9180 END IF;
9181
9182 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9183 --dbms_output.put_line('error in splitting');
9184 FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
9185 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9186 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9187 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9188 l_det_tab(j).pack_status := 'Error';
9189 error_cnt := error_cnt + 1;
9190 exit;
9191 END IF;
9192
9193 --dbms_output.put_line('after splitting lines');
9194
9195 -- update detail attributes by decrementing shipped quantity
9196 -- (if not null) by the split quantity and updating the shipped
9197 -- quantity of the new line to be eqaul to the split quantity
9198
9199 l_tmp_det_tab(1) := l_split_det_id;
9200 l_tmp_det_count := l_det_tab.count + 1;
9201 l_det_tab(l_tmp_det_count).delivery_detail_id := l_split_det_id;
9202
9203 END IF;
9204 --
9205 IF l_debug_on THEN
9206 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
9207 END IF;
9208 --
9209 wsh_container_actions.Assign_Detail (
9210 l_cont_tab(i).container_instance_id,
9211 l_tmp_det_tab,
9212 l_pack_status,
9213 x_return_status,FALSE);
9214
9215 IF l_debug_on THEN
9216 WSH_DEBUG_SV.log(l_module_name,'return status -',x_return_status);
9217 END IF;
9218
9219 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9220 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9221 l_return_status := x_return_status;
9222 END IF;
9223
9224 l_det_tab(l_tmp_det_count).pack_status := 'Error';
9225 l_cont_tab(i).pack_status := 'Skipped';
9226 error_cnt := error_cnt + 1;
9227
9228 END IF;
9229
9230 IF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9231 l_det_tab(l_tmp_det_count).pack_status := 'Packed';
9232 l_cont_tab(i).pack_status := 'Packed';
9233 -- J: W/V Changes
9234
9235 WSH_WV_UTILS.Check_Fill_Pc (
9236 p_container_instance_id => l_cont_tab(i).container_instance_id,
9237 x_fill_status => l_fill_status,
9238 x_return_status => l_return_status);
9239
9240 IF l_fill_status = 'O' THEN
9241 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9242 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9243 END IF;
9244
9245 l_cont_tab(i).pack_status := 'Overpacked';
9246 cont_warn := cont_warn + 1;
9247 l_tmp_status := 'Error';
9248 GOTO new_container;
9249 END IF;
9250
9251 l_cont_tab(i).pack_status := 'Packed';
9252
9253 END IF; -- if packing successful
9254 END IF; --- of of 3011758
9255 ELSE -- split qty < 1 means cannot split - so try next cont
9256
9257 i := i + 1;
9258
9259 END IF; -- if split qty >= 1
9260
9261 END IF; -- if l_req_cont_num < = l_cont_avail_pc
9262
9263 ELSE -- means org ids don't match and so try next container.
9264
9265 i := i + 1;
9266
9267 END IF; -- if l_cont_org_id = l_det_org_id
9268
9269 <<new_container>>
9270 i := i + 1;
9271 l_tmp_status := 'OK';
9272
9273 END LOOP; -- inner loop of containers
9274
9275 j := j + 1;
9276
9277 END LOOP; -- outer loop of lines
9278
9279 -- at end of loop, if all containers had been used, cont_count should be 0
9280 -- and if all lines had been used, j should be > det_count.
9281 -- if j <= det_count, then it implies that some lines were unpacked so
9282 -- issue a warning.
9283
9284 ELSIF p_pack_mode = 'E' THEN
9285 -- packing mode is equal - each line is split equally between all containers
9286 -- and each split line is packed into each container. Packs even if
9287 -- container is overpacked/underpacked and returns with a warning.
9288
9289 IF (p_split_pc IS NULL OR p_split_pc = 0) THEN
9290 l_split_pc := 100/(p_cont_tab.count);
9291 ELSE
9292 l_split_pc := p_split_pc;
9293 END IF;
9294
9295 FOR j IN 1..det_count LOOP
9296
9297 IF l_debug_on THEN
9298 WSH_DEBUG_SV.log(l_module_name,'===========================================');
9299 WSH_DEBUG_SV.log(l_module_name,'pack mode E: processing detail ' || l_det_tab(j).delivery_detail_id);
9300 END IF;
9301
9302 OPEN Get_Detail_Info (l_det_tab(j).delivery_detail_id);
9303
9304 FETCH Get_Detail_Info INTO
9305 l_det_inv_item_id,
9306 l_det_pack_qty,
9307 l_det_qty_uom,
9308 l_det_net,
9309 l_det_volume,
9310 l_det_wt_uom,
9311 l_det_vol_uom,
9312 l_det_org_id,
9313 l_det_cont_item_id,
9314 l_det_pack_qty2;
9315
9316 IF Get_Detail_Info%NOTFOUND THEN
9317 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
9318 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9319 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9320 CLOSE Get_Detail_Info;
9321 --dbms_output.put_line('error in fetching details for ' || l_det_tab(j).delivery_detail_id);
9322 l_det_tab(j).pack_status := 'Error';
9323 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9324 l_tmp_status := 'Error';
9325 GOTO next_detail;
9326 END IF;
9327
9328 CLOSE Get_Detail_Info;
9329
9330
9331 -- HW OPM BUG#:3011758. get OPM item information
9332 -- HW OPMCONV - 1)Change the call from OPM API to get item info
9333 -- to a new WSH API
9334 -- - 2) Remove checking for process
9335
9336 WSH_DELIVERY_DETAILS_INV.Get_item_information
9337 (
9338 p_organization_id => l_det_org_id
9339 , p_inventory_item_id => l_det_inv_item_id
9340 , x_mtl_system_items_rec => l_item_info
9341 , x_return_status => l_return_status
9342 );
9343
9344 wsh_util_core.api_post_call
9345 (
9346 p_return_status => l_return_status,
9347 x_num_warnings => l_num_warnings,
9348 x_num_errors => l_num_errors
9349 );
9350
9351
9352 IF ( l_item_info.lot_divisible_flag = 'N' AND
9353 l_item_info.lot_control_code = 2 ) THEN
9354 l_lot_divisible_flag := 'N';
9355 ELSE
9356 l_lot_divisible_flag := 'Y';
9357 END IF;
9358
9359 l_tmp_split_qty := ROUND((l_split_pc*l_det_pack_qty/100),LIMITED_PRECISION);
9360
9361 --
9362 IF l_debug_on THEN
9363 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
9364 END IF;
9365 --
9366 WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
9367 l_det_inv_item_id,
9368 l_det_org_id,
9369 l_tmp_split_qty,
9370 l_det_qty_uom,
9371 l_split_qty,
9372 l_discard_status);
9373
9374 IF l_debug_on THEN
9375 WSH_DEBUG_SV.log(l_module_name,'return status-',l_discard_status);
9376 END IF;
9377
9378 -- bug 1716136: errors likely mean integers are safe values.
9379 IF l_discard_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9380 l_discard_message := FND_MESSAGE.GET;
9381 l_split_qty := FLOOR(l_tmp_split_qty);
9382 END IF;
9383 /* Bug 2173615 - added l_split_qty = 0,in case of fractional split example = 0.3 */
9384 IF (l_split_qty IS NULL OR l_split_qty = 0) THEN
9385 l_split_qty := l_tmp_split_qty;
9386 END IF;
9387
9388 --dbms_output.put_line('l_split_qty = ' || l_split_qty);
9389 /* Bug 2173615 ,changed 1 to zero */
9390 IF l_split_qty < 0 THEN
9391 l_split_qty := 1;
9392 --dbms_output.put_line('because < 1, l_split_qty now = ' || l_split_qty);
9393 END IF;
9394
9395 l_tmp_det_qty := 0;
9396
9397 FOR i IN 1..cont_count LOOP
9398
9399 IF l_debug_on THEN
9400 WSH_DEBUG_SV.log(l_module_name,'----- packing into container ' || l_cont_tab(i).container_instance_id);
9401 WSH_DEBUG_SV.log(l_module_name,'Tmp Det Qty,Det Pack Qty,split qty',l_tmp_det_qty||l_det_pack_qty||l_split_qty);
9402 END IF;
9403 --dbms_output.put_line('l_tmp_det_qty = ' || l_tmp_det_qty);
9404 --dbms_output.put_line('l_det_pack_qty = ' || l_det_pack_qty);
9405 --dbms_output.put_line('l_split_qty = ' || l_split_qty);
9406
9407 IF l_tmp_det_qty <= l_det_pack_qty THEN
9408
9409 OPEN Get_Cont_Info (l_cont_tab(i).container_instance_id);
9410
9411 FETCH Get_Cont_Info INTO
9412 l_cont_item_id,
9413 l_cont_org_id,
9414 l_cont_gross,
9415 l_cont_net,
9416 l_cont_volume,
9417 l_cont_wt_uom,
9418 l_cont_vol_uom,
9419 l_cont_fill_pc,
9420 l_cont_min_fill_pc,
9421 l_cont_max_load_wt,
9422 l_cont_max_vol;
9423
9424 IF Get_Cont_Info%NOTFOUND THEN
9425 --
9426 IF l_debug_on THEN
9427 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9428 END IF;
9429 --
9430 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9431 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
9432 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9433 -- x_pack_status := 'Error';
9434 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9435 l_cont_tab(i).pack_status := 'Error';
9436 CLOSE Get_Cont_Info;
9437 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9438 cont_err := cont_err + 1;
9439 l_tmp_status := 'Error';
9440 GOTO next_container;
9441 END IF;
9442
9443 CLOSE Get_Cont_Info;
9444
9445 IF l_cont_org_id = l_det_org_id THEN
9446
9447 --dbms_output.put_line('Decision point: compare ' || (l_tmp_det_qty + l_split_qty) || ' with ' || l_det_pack_qty);
9448
9449 -- bug 1367540:
9450 -- due to round-off errors in calculating floating-point values (e.g., 1/3 = 0.33333...)
9451 -- avoid exact comparisons
9452
9453 l_tmp_delta := l_det_pack_qty - (l_tmp_det_qty + l_split_qty);
9454
9455 IF l_tmp_delta > 0.00001 THEN -- if (l_tmp_det_qty + l_split_qty) < l_det_pack_qty) then
9456
9457 --dbms_output.put_line('SPLITTING line ' || l_det_tab(j).delivery_detail_id || ' by ' || l_split_qty);
9458 --
9459
9460 --- HW OPM BUG# 3011758
9461 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9462 -- - 2) Changed check condition for lot divisible from 1 to 'N'
9463 IF ( l_lot_divisible_flag = 'N' AND i = cont_count AND l_det_pack_sts = 'Unpacked') THEN
9464 FND_MESSAGE.SET_NAME('WSH','WSH_OPM_IND_SPLIT_PACK');
9465 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9466 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9467 WSH_UTIL_CORE.Add_Message(l_return_status);
9468 l_det_tab(j).pack_status := 'Error';
9469 error_cnt := error_cnt + 1;
9470 exit;
9471 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9472 -- - 2) Changed check condition for lot divisible from 1 to 'N'
9473 ELSIF ( l_lot_divisible_flag = 'N' AND i < cont_count AND l_det_pack_sts = 'Unpacked') THEN
9474 goto next_container;
9475
9476 ELSE -- non divisible
9477 l_split_qty2 := (l_split_qty * l_det_pack_qty2)/l_det_pack_qty;
9478
9479 IF l_debug_on THEN
9480 WSH_DEBUG_SV.log(l_module_name,'l_split_qty',l_split_qty);
9481 WSH_DEBUG_SV.log(l_module_name,'l_split_qty2',l_split_qty2);
9482 WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty2',l_det_pack_qty2);
9483 WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty',l_det_pack_qty);
9484 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
9485 END IF;
9486
9487 WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details (
9488 p_from_detail_id => l_det_tab(j).delivery_detail_id,
9489 p_req_quantity => l_split_qty,
9490 p_req_quantity2 => l_split_qty2,
9491 x_new_detail_id => l_split_det_id,
9492 x_return_status => x_return_status,
9493 p_manual_split => 'C'
9494 );
9495 IF l_debug_on THEN
9496 WSH_DEBUG_SV.log(l_module_name,'return status',x_return_status);
9497 END IF;
9498 --dbms_output.put_line('...split detail id ' || l_split_det_id);
9499
9500 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9501 FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
9502 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9503 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9504 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9505 --dbms_output.put_line('error in splitting details for ' || l_det_tab(j).delivery_detail_id);
9506 error_cnt := error_cnt + 1;
9507 l_det_tab(j).pack_status := 'Error';
9508 exit;
9509 END IF;
9510 END IF; -- end of 3011758
9511
9512 -- update detail attributes by decrementing shipped quantity
9513 -- (if not null) by the split quantity and updating the shipped
9514 -- quantity of the new line to be eqaul to the split quantity
9515
9516 l_tmp_det_tab(1) := l_split_det_id;
9517 l_tmp_det_count := l_det_tab.count + 1;
9518 l_det_tab(l_tmp_det_count).delivery_detail_id := l_split_det_id;
9519 --dbms_output.put_line('split line is ' || l_split_det_id);
9520
9521 ELSIF l_tmp_delta >= -0.00001 THEN -- elsif (l_tmp_det_qty + l_split_qty) = l_det_pack_qty then
9522 -- Here, l_tmp_delta is between -0.00001 and 0.00001 (see the first IF condition).
9523
9524 l_split_det_id := l_det_tab(j).delivery_detail_id;
9525 l_tmp_det_tab(1) := l_det_tab(j).delivery_detail_id;
9526 l_tmp_det_count := j;
9527 --dbms_output.put_line('NO SPLIT and line is ' || l_split_det_id);
9528 ELSE
9529 -- bug 1367540: this case had not been handled before,
9530 -- so when neither condition above was met, the last split detail was reassigned.
9531 -- The API will return a warning if the container turns out to be overpacked.
9532 l_split_det_id := l_det_tab(j).delivery_detail_id;
9533 l_tmp_det_tab(1) := l_det_tab(j).delivery_detail_id;
9534 l_tmp_det_count := j;
9535 --dbms_output.put_line('NO SPLIT, POSSIBLE OVERPACK and line ' || l_split_det_id || ' will be assigned.');
9536 END IF;
9537
9538 --dbms_output.put_line('* * * ASSIGNING detail ' || l_tmp_det_tab(1) || ' to container ' || l_cont_tab(i).container_instance_id);
9539
9540 --
9541 IF l_debug_on THEN
9542 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
9543 END IF;
9544 --
9545 wsh_container_actions.Assign_Detail (
9546 l_cont_tab(i).container_instance_id,
9547 l_tmp_det_tab,
9548 l_pack_status,
9549 x_return_status,FALSE);
9550
9551 IF l_debug_on THEN
9552 WSH_DEBUG_SV.log(l_module_name,'return status',x_return_status);
9553 END IF;
9554
9555 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9556 --dbms_output.put_line('error in assigning details for ' || l_tmp_det_tab(1));
9557 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9558 l_return_status := x_return_status;
9559 END IF;
9560 error_cnt := error_cnt + 1;
9561 l_det_tab(l_tmp_det_count).pack_status := 'Error';
9562
9563 ELSIF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9564 --dbms_output.put_line('assigned line ' || l_tmp_det_tab(1));
9565 l_det_tab(l_tmp_det_count).pack_status := 'Packed';
9566 l_cont_tab(i).pack_status := 'Packed';
9567
9568 -- J: W/V Changes
9569 WSH_WV_UTILS.Check_Fill_Pc (
9570 p_container_instance_id => l_cont_tab(i).container_instance_id,
9571 x_fill_status => l_fill_status,
9572 x_return_status => l_return_status);
9573
9574 IF (l_fill_status = 'O' AND l_cont_item_id IS NOT NULL) THEN
9575
9576 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9577 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9578 END IF;
9579
9580 cont_warn := cont_warn + 1;
9581 l_cont_tab(i).pack_status := 'Overpacked';
9582 ELSIF (l_fill_status = 'U'
9583 AND l_cont_item_id IS NOT NULL ) THEN
9584
9585 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9586 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9587 END IF;
9588
9589 cont_warn := cont_warn + 1;
9590 l_cont_tab(i).pack_status := 'Underpacked';
9591 ELSE
9592 l_cont_tab(i).pack_status := 'Packed';
9593 END IF;
9594
9595 END IF; -- if assign was successful
9596
9597 l_tmp_det_qty := l_tmp_det_qty + l_split_qty;
9598 ELSE
9599 --dbms_output.put_line('orgs dont match for detail ' || l_det_tab(j).delivery_detail_id || ' and container ' || l_cont_tab(i).container_instance_id);
9600 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NO_MATCH');
9601 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9602 --
9603 IF l_debug_on THEN
9604 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9605 END IF;
9606 --
9607 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9608 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9609
9610 END IF; -- cont org and det org id check
9611
9612 END IF; -- if l_tmp_det_qty < l_det_pack_qty
9613
9614 <<next_container>>
9615 null;
9616
9617 END LOOP; -- looping though containers - inner loop
9618
9619 IF (l_tmp_det_qty = l_det_pack_qty) AND (l_det_tab(j).pack_status <> 'Error' ) THEN
9620 l_det_tab(j).pack_status := 'Packed';
9621 END IF;
9622
9623 l_tmp_det_qty := 0;
9624
9625 <<next_detail>>
9626 null;
9627
9628 END LOOP; -- looping through lines - outer loop
9629
9630 ELSE
9631 -- packing mode is invalid - did not pack
9632
9633 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_INVALID_PACK_MODE');
9634 x_pack_status := 'Error';
9635 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9636 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
9637 --Bugfix 4070732 {
9638 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
9639 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9640 IF l_debug_on THEN
9641 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9642 END IF;
9643
9644 WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags => TRUE,
9645 x_return_status => l_tmp_return_status);
9646
9647
9648 IF l_debug_on THEN
9649 WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9650 END IF;
9651
9652 /*wsh_util_core.api_post_call
9653 (
9654 p_return_status => l_return_status,
9655 x_num_warnings => l_num_warnings,
9656 x_num_errors => l_num_errors
9657 );
9658 */
9659 IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
9660 X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9661 END IF;
9662 END IF;
9663 END IF;
9664 --}
9665 --
9666 --IF l_debug_on THEN
9667 -- WSH_DEBUG_SV.pop(l_module_name);
9668 --END IF;
9669 --
9670 --return;
9671 raise e_return_excp; -- LPN CONV. rv
9672 END IF;
9673
9674
9675 error_cnt := 0;
9676 warn_cnt := 0;
9677 succ_cnt := 0;
9678
9679 cont_warn := 0;
9680 cont_err := 0;
9681 x_pack_status := NULL;
9682
9683 --dbms_output.put_line('l_return_status = ' || l_return_status);
9684
9685 FOR i IN 1..l_det_tab.count LOOP
9686 --dbms_output.put_line('detail ' || l_det_tab(i).delivery_detail_id || ' status is ' || l_det_tab(i).pack_status);
9687 IF l_det_tab(i).pack_status <> 'Packed' THEN
9688 IF l_det_tab(i).pack_status = 'Error' THEN
9689 error_cnt := error_cnt + 1;
9690 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DETAIL_NOT_ASSIGNED');
9691 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(i).delivery_detail_id);
9692 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
9693 ELSE
9694 IF l_det_tab(i).pack_status = 'Unpacked' THEN
9695 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_IGNORED');
9696 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(i).delivery_detail_id);
9697 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9698 END IF;
9699 warn_cnt := warn_cnt + 1;
9700 END IF;
9701 ELSE
9702 succ_cnt := succ_cnt + 1;
9703 /* H projects: pricing integration csun */
9704 m := m+1;
9705 l_detail_rows(m) := l_det_tab(i).delivery_detail_id;
9706 END IF;
9707
9708 END LOOP;
9709
9710 IF error_cnt > 0 or warn_cnt > 0 THEN
9711 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_PACK_ERROR');
9712 FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
9713 FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
9714 FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
9715 IF error_cnt > 0 THEN
9716 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9717 ELSIF warn_cnt > 0 THEN
9718 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9719 END IF;
9720
9721 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9722
9723 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9724 x_return_status := l_return_status;
9725 x_pack_status := 'Error';
9726 --Bugfix 4070732 {
9727 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
9728 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9729 IF l_debug_on THEN
9730 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9731 END IF;
9732
9733 WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags => TRUE,
9734 x_return_status => l_tmp_return_status);
9735
9736
9737 IF l_debug_on THEN
9738 WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9739 END IF;
9740
9741 /*wsh_util_core.api_post_call
9742 (
9743 p_return_status => l_return_status,
9744 x_num_warnings => l_num_warnings,
9745 x_num_errors => l_num_errors
9746 );
9747 */
9748 IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
9749 X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9750 END IF;
9751 END IF;
9752 END IF;
9753 --}
9754 --
9755 --IF l_debug_on THEN
9756 -- WSH_DEBUG_SV.pop(l_module_name);
9757 --END IF;
9758 --
9759 --return;
9760 raise e_return_excp; -- LPN CONV. rv
9761 END IF;
9762
9763 END IF;
9764
9765 /* H integration: Pricing integration csun
9766 */
9767 IF l_detail_rows.count > 0 THEN
9768 --
9769 IF l_debug_on THEN
9770 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
9771 END IF;
9772 --
9773 WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
9774 p_entity_type => 'DELIVERY_DETAIL',
9775 p_entity_ids => l_detail_rows,
9776 x_return_status => l_return_status);
9777
9778 IF l_debug_on THEN
9779 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
9780 END IF;
9781 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9782 x_return_status := l_return_status;
9783 FND_MESSAGE.SET_NAME('WSH', 'WSH_REPRICE_REQUIRED_ERR');
9784 WSH_UTIL_CORE.add_message(x_return_status,l_module_name);
9785 --
9786 --Bugfix 4070732 {
9787 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
9788 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9789 IF l_debug_on THEN
9790 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9791 END IF;
9792
9793 WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags => TRUE,
9794 x_return_status => l_tmp_return_status);
9795
9796
9797 IF l_debug_on THEN
9798 WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9799 END IF;
9800
9801 /*wsh_util_core.api_post_call
9802 (
9803 p_return_status => l_return_status,
9804 x_num_warnings => l_num_warnings,
9805 x_num_errors => l_num_errors
9806 );
9807 */
9808 IF
9809 (l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9810 OR
9811 (x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9812 THEN --{
9813 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9814 ELSIF x_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR
9815 THEN
9816 IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR
9817 THEN
9818 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9819 ELSIF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING
9820 THEN
9821 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9822 END IF;
9823 END IF; --}
9824 END IF;
9825 END IF;
9826 --}
9827 --IF l_debug_on THEN
9828 -- WSH_DEBUG_SV.pop(l_module_name);
9829 --END IF;
9830 --
9831 --return;
9832 raise e_return_excp; -- LPN CONV. rv
9833 END IF;
9834 END IF;
9835
9836
9837
9838 FOR i IN 1..l_cont_tab.count LOOP
9839 --dbms_output.put_line('container ' || l_cont_tab(i).container_instance_id || ' is ' || l_cont_tab(i).pack_status);
9840 IF l_cont_tab(i).pack_status <> 'Packed' THEN
9841 IF l_cont_tab(i).pack_status = 'Error' THEN
9842 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9843 cont_err := cont_err + 1;
9844 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NOT_PACKED');
9845 --
9846 IF l_debug_on THEN
9847 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9848 END IF;
9849 --
9850 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9851 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9852 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9853 ELSIF l_cont_tab(i).pack_status = 'Overpacked' THEN
9854 cont_warn := cont_warn + 1;
9855 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_OVERPACKED');
9856 --
9857 IF l_debug_on THEN
9858 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9859 END IF;
9860 --
9861 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9862 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9863 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9864 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9865 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9866 END IF;
9867 ELSIF l_cont_tab(i).pack_status = 'Underpacked' THEN
9868 cont_warn := cont_warn + 1;
9869 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UNDERPACKED');
9870 --
9871 IF l_debug_on THEN
9872 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9873 END IF;
9874 --
9875 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9876 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9877 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9878 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9879 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9880 END IF;
9881 ELSIF l_cont_tab(i).pack_status = 'Warning' THEN
9882 cont_warn := cont_warn + 1;
9883 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
9884 --
9885 IF l_debug_on THEN
9886 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9887 END IF;
9888 --
9889 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9890 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9891 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9892
9893 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9894 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9895 END IF;
9896 END IF;
9897 END IF;
9898
9899 END LOOP;
9900
9901
9902 -- LPN CONV. rv
9903 --
9904 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
9905 THEN
9906 --{
9907
9908 IF l_debug_on THEN
9909 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
9910 END IF;
9911 --
9912 WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
9913 (
9914 p_in_rec => l_lpn_in_sync_comm_rec,
9915 x_return_status => l_return_status,
9916 x_out_rec => l_lpn_out_sync_comm_rec
9917 );
9918 --
9919 IF l_debug_on THEN
9920 WSH_DEBUG_SV.log(l_module_name, 'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
9921 END IF;
9922 --
9923 WSH_UTIL_CORE.API_POST_CALL
9924 (
9925 p_return_status => l_return_status,
9926 x_num_warnings => cont_warn,
9927 x_num_errors => cont_err,
9928 p_raise_error_flag => false
9929 );
9930 --}
9931 END IF;
9932 -- LPN CONV. rv
9933 --
9934
9935 IF cont_err > 0 OR cont_warn > 0 THEN
9936 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_PACK_WARN');
9937 FND_MESSAGE.SET_TOKEN('CONT_WARN',cont_warn);
9938 FND_MESSAGE.SET_TOKEN('CONT_ERR',cont_err);
9939 IF cont_err > 0 THEN
9940 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9941 ELSE
9942 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9943 END IF;
9944 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9945 END IF;
9946
9947 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9948 x_return_status := l_return_status;
9949 ELSE
9950 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
9951 END IF;
9952
9953 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9954 x_pack_status := 'Success';
9955 ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9956 x_pack_status := 'Error';
9957 ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9958 x_pack_status := 'Warning';
9959 l_num_warnings := nvl(l_num_warnings,0 ) + 1;
9960 END IF;
9961
9962
9963 IF x_pack_status IS NULL THEN
9964 x_pack_status := 'Success';
9965 END IF;
9966
9967 --Bugfix 4070732 {
9968 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
9969 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9970 IF l_debug_on THEN
9971 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Process_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9972 END IF;
9973
9974 WSH_UTIL_CORE.Process_stops_for_load_tender(p_reset_flags => TRUE,
9975 x_return_status => l_tmp_return_status);
9976 IF l_debug_on THEN
9977 WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9978 END IF;
9979
9980 /*wsh_util_core.api_post_call
9981 (
9982 p_return_status => l_return_status,
9983 x_num_warnings => l_num_warnings,
9984 x_num_errors => l_num_errors
9985 );
9986 */
9987 IF (l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9988 OR (x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9989 THEN --{
9990 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9991 x_pack_status := 'Error';
9992 ELSIF x_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR
9993 THEN
9994 IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9995 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9996 x_pack_status := 'Error';
9997 ELSIF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING
9998 THEN
9999 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
10000 x_pack_status := 'Warning';
10001 END IF;
10002 END IF; --}
10003
10004 END IF;
10005 END IF;
10006 --}
10007
10008 --
10009 IF l_debug_on THEN
10010 WSH_DEBUG_SV.pop(l_module_name);
10011 END IF;
10012 --
10013 EXCEPTION
10014 -- LPN CONV. rv
10015 WHEN e_return_excp THEN
10016 --
10017 --
10018 IF l_debug_on THEN
10019 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
10020 END IF;
10021 --
10022 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
10023 THEN
10024 --{
10025 --
10026 IF l_debug_on THEN
10027 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
10028 END IF;
10029 --
10030 WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
10031 (
10032 p_in_rec => l_lpn_in_sync_comm_rec,
10033 x_return_status => l_return_status,
10034 x_out_rec => l_lpn_out_sync_comm_rec
10035 );
10036 --
10037 IF l_debug_on THEN
10038 WSH_DEBUG_SV.log(l_module_name, 'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
10039 END IF;
10040 --
10041 IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR,WSH_UTIL_CORE.G_RET_STS_ERROR) AND x_return_status <> WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
10042 x_return_status := l_return_status;
10043 END IF;
10044 --}
10045 END IF;
10046 --
10047 -- LPN CONV. rv
10048 --
10049 --
10050 IF l_debug_on THEN
10051 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:E_RETURN_EXCP');
10052 END IF;
10053 WHEN Others THEN
10054 --
10055 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Pack_Multi',l_module_name);
10056 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
10057 --
10058 IF l_debug_on THEN
10059 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
10060 END IF;
10061 --
10062 -- LPN CONV. rv
10063 IF l_debug_on THEN
10064 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
10065 END IF;
10066 --
10067 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
10068 THEN
10069 --{
10070 --
10071 IF l_debug_on THEN
10072 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
10073 END IF;
10074 --
10075 WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
10076 (
10077 p_in_rec => l_lpn_in_sync_comm_rec,
10078 x_return_status => l_return_status,
10079 x_out_rec => l_lpn_out_sync_comm_rec
10080 );
10081 --
10082 IF l_debug_on THEN
10083 WSH_DEBUG_SV.log(l_module_name, 'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
10084 END IF;
10085 --}
10086 END IF;
10087 --
10088 -- LPN CONV. rv
10089 --
10090
10091 --Bugfix 4070732 {
10092 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
10093 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
10094 IF l_debug_on THEN
10095 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
10096 END IF;
10097
10098 WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags => TRUE,
10099 x_return_status => l_return_status);
10100
10101
10102 IF l_debug_on THEN
10103 WSH_DEBUG_SV.log(l_module_name,'l_return_status',l_return_status);
10104 END IF;
10105
10106 /*wsh_util_core.api_post_call
10107 (
10108 p_return_status => l_return_status,
10109 x_num_warnings => l_num_warnings,
10110 x_num_errors => l_num_errors
10111 );
10112 */
10113 END IF;
10114 END IF;
10115 --}
10116 --
10117 IF l_debug_on THEN
10118 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
10119 END IF;
10120 --
10121 END Pack_Multi;
10122
10123
10124 /*
10125 -----------------------------------------------------------------------------
10126 PROCEDURE : Update_Shipped_Qty
10127 PARAMETERS : p_delivery_detail_id - delivery detail id of the original line
10128 that was split
10129 p_split_detail_id - delivery detail id of the newly created
10130 split line
10131 p_split_qty - quantity used to split original delivery line
10132 x_return_status - return status of API
10133 DESCRIPTION : This procedure updates the shipped quantities of the original
10134 delivery line that was split and the new line that was created
10135 due to the split. The shipped quantity of the original line is
10136 decremented by split qty and that of the new line is increased
10137 to be equal to the split qty. The updating is done only if the
10138 original shipped quantity is not null.
10139 ------------------------------------------------------------------------------
10140 */
10141
10142
10143
10144 PROCEDURE Update_Shipped_Qty(
10145 p_delivery_detail_id IN NUMBER,
10146 p_split_detail_id IN NUMBER,
10147 p_split_qty IN NUMBER,
10148 x_return_status OUT NOCOPY VARCHAR2) IS
10149
10150 CURSOR Get_Ship_Qty (v_det_id NUMBER) IS
10151 SELECT nvl(shipped_quantity,-99)
10152 FROM WSH_DELIVERY_DETAILS
10153 WHERE delivery_detail_id = v_det_id
10154 AND nvl(line_direction,'O') IN ('O','IO')
10155 AND container_flag = 'N';
10156
10157 l_shp_qty NUMBER;
10158 l_db_split_shp_qty NUMBER;
10159
10160 --
10161 l_debug_on BOOLEAN;
10162 --
10163 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_SHIPPED_QTY';
10164 --
10165 BEGIN
10166
10167 --
10168 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10169 --
10170 IF l_debug_on IS NULL
10171 THEN
10172 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10173 END IF;
10174 --
10175 IF l_debug_on THEN
10176 WSH_DEBUG_SV.push(l_module_name);
10177 --
10178 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_DETAIL_ID',P_DELIVERY_DETAIL_ID);
10179 WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_DETAIL_ID',P_SPLIT_DETAIL_ID);
10180 WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_QTY',P_SPLIT_QTY);
10181 END IF;
10182 --
10183 IF p_split_detail_id IS NULL THEN
10184 -- nothing split, ergo nothing to update...
10185 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10186 --
10187 IF l_debug_on THEN
10188 WSH_DEBUG_SV.pop(l_module_name);
10189 END IF;
10190 --
10191 return;
10192 END IF;
10193
10194 OPEN Get_Ship_Qty (p_delivery_detail_id);
10195
10196 FETCH Get_Ship_Qty INTO l_shp_qty;
10197
10198 IF Get_Ship_Qty%NOTFOUND THEN
10199 CLOSE Get_Ship_Qty;
10200 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10201 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_detail_id);
10202 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10203 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10204 --
10205 IF l_debug_on THEN
10206 WSH_DEBUG_SV.pop(l_module_name);
10207 END IF;
10208 --
10209 return;
10210 END IF;
10211
10212 IF Get_Ship_Qty%ISOPEN THEN
10213 CLOSE Get_Ship_Qty;
10214 END IF;
10215
10216 IF l_shp_qty = -99 THEN
10217 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10218 --
10219 IF l_debug_on THEN
10220 WSH_DEBUG_SV.pop(l_module_name);
10221 END IF;
10222 --
10223 return;
10224 END IF;
10225
10226
10227 -- need to look up the split detail's shipped quantity
10228 -- so that we can correctly adjust the original detail's shipped quantity
10229
10230 OPEN Get_Ship_Qty(p_split_detail_id);
10231 FETCH Get_Ship_Qty into l_db_split_shp_qty;
10232
10233 IF Get_Ship_Qty%NOTFOUND THEN
10234 CLOSE Get_Ship_Qty;
10235 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10236 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_split_detail_id);
10237 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10238 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10239 --
10240 IF l_debug_on THEN
10241 WSH_DEBUG_SV.pop(l_module_name);
10242 END IF;
10243 --
10244 return;
10245 END IF;
10246
10247 CLOSE Get_Ship_Qty;
10248
10249 IF l_db_split_shp_qty = -99 THEN
10250 l_db_split_shp_qty := 0;
10251 END IF;
10252 --dbms_output.put_line('l_db_split_shp_qty = ' || l_db_split_shp_qty);
10253
10254 l_shp_qty := l_shp_qty - nvl(p_split_qty,0) + l_db_split_shp_qty;
10255 --dbms_output.put_line('new l_shp_qty = ' || l_shp_qty);
10256
10257 UPDATE WSH_DELIVERY_DETAILS
10258 SET shipped_quantity = l_shp_qty
10259 WHERE delivery_detail_id = p_delivery_detail_id;
10260
10261 IF SQL%NOTFOUND THEN
10262 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10263 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_detail_id);
10264 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10265 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10266 --
10267 IF l_debug_on THEN
10268 WSH_DEBUG_SV.pop(l_module_name);
10269 END IF;
10270 --
10271 return;
10272 END IF;
10273
10274 UPDATE WSH_DELIVERY_DETAILS
10275 SET shipped_quantity = p_split_qty
10276 WHERE delivery_detail_id = p_split_detail_id;
10277
10278 IF SQL%NOTFOUND THEN
10279 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10280 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_split_detail_id);
10281 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10282 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10283 --
10284 IF l_debug_on THEN
10285 WSH_DEBUG_SV.pop(l_module_name);
10286 END IF;
10287 --
10288 return;
10289 END IF;
10290
10291 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10292
10293
10294 --
10295 IF l_debug_on THEN
10296 WSH_DEBUG_SV.pop(l_module_name);
10297 END IF;
10298 --
10299 EXCEPTION
10300
10301 WHEN Others THEN
10302 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_Shipped_Qty',l_module_name);
10303 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
10304
10305 --
10306 IF l_debug_on THEN
10307 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
10308 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
10309 END IF;
10310 --
10311 END Update_Shipped_Qty;
10312
10313 /*
10314 -----------------------------------------------------------------------------
10315 PROCEDURE : Pack_Container
10316 PARAMETERS : p_line_cont_rec - Container info which needs to be autopacked
10317 x_return_status - Return Status of the API
10318 DESCRIPTION : This procedure packs a container into Master Container either
10319 by creating a new one or by packing it into one created for
10320 previous containers (created in the same run)
10321 ------------------------------------------------------------------------------
10322 */
10323
10324 PROCEDURE Pack_Container(
10325 p_line_cont_rec IN cont_info,
10326 x_return_status OUT NOCOPY VARCHAR2) IS
10327
10328 l_quantity_left NUMBER;
10329 l_tmp_split_qty NUMBER;
10330
10331 i NUMBER;
10332 j NUMBER;
10333 gcdvalue NUMBER;
10334
10335 --
10336 l_debug_on BOOLEAN;
10337 --
10338 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'PACK_CONTAINER';
10339 --
10340 BEGIN
10341
10342 --
10343 --
10344 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10345 --
10346 IF l_debug_on IS NULL
10347 THEN
10348 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10349 END IF;
10350 --
10351 IF l_debug_on THEN
10352 WSH_DEBUG_SV.push(l_module_name);
10353 WSH_DEBUG_SV.log(l_module_name,'shp_qty',p_line_cont_rec.shp_qty);
10354 WSH_DEBUG_SV.log(l_module_name,'preferred_container',p_line_cont_rec.preferred_container);
10355 WSH_DEBUG_SV.log(l_module_name,'organization_id',p_line_cont_rec.organization_id);
10356 WSH_DEBUG_SV.log(l_module_name,'group_id',p_line_cont_rec.group_id);
10357 END IF;
10358 --
10359 l_quantity_left := p_line_cont_rec.shp_qty;
10360
10361 -- Check Empty Containers first
10362 IF (g_empty_cont_tab.COUNT > 0 ) THEN
10363 --dbms_output.put_line('There are containers with empty space');
10364
10365 i := g_empty_cont_tab.FIRST;
10366 WHILE i <= g_empty_cont_tab.LAST LOOP
10367 IF p_line_cont_rec.preferred_container <> g_empty_cont_tab(i).container_item_Id OR
10368 p_line_cont_rec.organization_id <> g_empty_cont_tab(i).organization_id OR
10369 p_line_cont_rec.group_id <> g_empty_cont_tab(i).group_id OR
10370 g_empty_cont_tab(i).empty <= 0 THEN
10371 GOTO next_cont;
10372 END IF;
10373
10374 -- Got a Match in empty container table
10375 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
10376 --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty numerator '||g_empty_cont_tab(i).numerator||' denominator '||g_empty_cont_tab(i).denominator);
10377 -- Calculate qty than can fit in 'empty' space
10378 l_tmp_split_qty := TRUNC((p_line_cont_rec.max_load_qty*g_empty_cont_tab(i).numerator)/g_empty_cont_tab(i).denominator,LIMITED_PRECISION);
10379 IF (l_tmp_split_qty < 1) THEN
10380 GOTO next_cont;
10381 END IF;
10382
10383 ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
10384 --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty weight '||g_empty_cont_tab(i).empty);
10385 -- Calculate qty than can fit in 'empty' space
10386 IF (p_line_cont_rec.converted_wt > g_empty_cont_tab(i).empty) THEN
10387 GOTO next_cont;
10388 END IF;
10389 ELSE
10390 --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty volume '||g_empty_cont_tab(i).empty);
10391 -- Calculate qty than can fit in 'empty' space
10392 IF (p_line_cont_rec.converted_vol > g_empty_cont_tab(i).empty) THEN
10393 GOTO next_cont;
10394 END IF;
10395 END IF;
10396
10397 -- Assign the dd to container
10398 g_assign_detail_index := g_assign_detail_index + 1;
10399 g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := p_line_cont_rec.delivery_detail_id;
10400 g_assign_detail_tab(g_assign_detail_index).container_index := g_empty_cont_tab(i).container_index;
10401 l_quantity_left := l_quantity_left - p_line_cont_rec.shp_qty;
10402
10403 --dbms_output.put_line('Assigning '||g_assign_detail_tab(g_assign_detail_index).delivery_detail_id||' to Cont index '||g_assign_detail_tab(g_assign_detail_index).container_index);
10404
10405 -- Calcualte space left and see if container needs to be deleted from empty cont PL/SQL table
10406 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
10407 g_empty_cont_tab(i).numerator := (g_empty_cont_tab(i).numerator * p_line_cont_rec.max_load_qty) - (g_empty_cont_tab(i).denominator * p_line_cont_rec.shp_qty);
10408 g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator * p_line_cont_rec.max_load_qty;
10409
10410 -- Bug # 3005780 : Added GCD just to reduce the numerator and denominator values
10411 IF (g_empty_cont_tab(i).numerator <> 0 ) AND (g_empty_cont_tab(i).denominator <> 0 ) THEN
10412 gcdvalue := Get_Gcd(g_empty_cont_tab(i).numerator , g_empty_cont_tab(i).denominator);
10413 --dbms_output.put_line('Get_Gcd return value is '||gcdvalue');
10414 IF (gcdvalue > 1) THEN
10415 g_empty_cont_tab(i).numerator := g_empty_cont_tab(i).numerator / gcdvalue;
10416 g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator / gcdvalue ;
10417 END IF;
10418 END IF;
10419 IF ((g_empty_cont_tab(i).numerator <= 0) OR
10420 (g_empty_cont_tab(i).numerator >= g_empty_cont_tab(i).denominator)) THEN
10421 --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
10422 g_empty_cont_tab.DELETE(i);
10423 END IF;
10424 ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
10425 g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - p_line_cont_rec.gross_weight;
10426 IF (g_empty_cont_tab(i).empty <= 0) THEN
10427 --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
10428 g_empty_cont_tab.DELETE(i);
10429 END IF;
10430 ELSE
10431 g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - p_line_cont_rec.volume;
10432 IF (g_empty_cont_tab(i).empty <= 0) THEN
10433 --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
10434 g_empty_cont_tab.DELETE(i);
10435 END IF;
10436 END IF;
10437
10438 -- If the whole qty is packed then exit the loop
10439 IF (l_quantity_left <= 0) THEN
10440 EXIT;
10441 END IF;
10442
10443 <<next_cont>>
10444 i := g_empty_cont_tab.NEXT(i);
10445 END LOOP;
10446 END IF; -- g_empty_cont_tab > 0
10447
10448 --dbms_output.put_line(' *** Looping empty cont tab is Over and Quantity Left is '||l_quantity_left||' ***');
10449 IF (l_quantity_left > 0) THEN
10450
10451 -- Create new container index
10452 g_new_cont_index := g_new_cont_index + 1;
10453 g_new_container_tab(g_new_cont_index).container_item_id := p_line_cont_rec.preferred_container;
10454 g_new_container_tab(g_new_cont_index).organization_id := p_line_cont_rec.organization_id;
10455 --dbms_output.put_line('Created Container index '||g_new_cont_index);
10456
10457 -- Assign the split dd/existing dd
10458 g_assign_detail_index := g_assign_detail_index + 1;
10459 g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := p_line_cont_rec.delivery_detail_id;
10460 g_assign_detail_tab(g_assign_detail_index).container_index := g_new_cont_index;
10461 --dbms_output.put_line('Assigning '||g_assign_detail_tab(g_assign_detail_index).delivery_detail_id||' to Cont index '||g_assign_detail_tab(g_assign_detail_index).container_index);
10462
10463
10464 IF (g_empty_cont_tab.COUNT = 0) THEN
10465 j := 1;
10466 ELSE
10467 j:= g_empty_cont_tab.LAST + 1;
10468 END IF;
10469
10470 -- Calculate Empty Space
10471 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
10472 IF (l_quantity_left < p_line_cont_rec.max_load_qty) THEN
10473 g_empty_cont_tab(j).container_index := g_new_cont_index;
10474 g_empty_cont_tab(j).container_item_id := p_line_cont_rec.preferred_container;
10475 g_empty_cont_tab(j).organization_id := p_line_cont_rec.organization_id;
10476 g_empty_cont_tab(j).group_id := p_line_cont_rec.group_id;
10477 g_empty_cont_tab(j).numerator := p_line_cont_rec.max_load_qty - l_quantity_left;
10478 g_empty_cont_tab(j).denominator := p_line_cont_rec.max_load_qty;
10479 --dbms_output.put_line('Inserted Container '||j||' with numerator '||g_empty_cont_tab(j).numerator||' and denominator '||g_empty_cont_tab(j).denominator);
10480 END IF;
10481 ELSIF (p_line_cont_rec.fill_pc_basis in ('W','V')) THEN
10482 IF ((p_line_cont_rec.converted_wt < p_line_cont_rec.cont_wt AND p_line_cont_rec.fill_pc_basis = 'W') OR
10483 (p_line_cont_rec.converted_vol < p_line_cont_rec.cont_vol AND p_line_cont_rec.fill_pc_basis = 'V')) THEN
10484 g_empty_cont_tab(j).container_index := g_new_cont_index;
10485 g_empty_cont_tab(j).container_item_id := p_line_cont_rec.preferred_container;
10486 g_empty_cont_tab(j).organization_id := p_line_cont_rec.organization_id;
10487 g_empty_cont_tab(j).group_id := p_line_cont_rec.group_id;
10488
10489 IF (p_line_cont_rec.fill_pc_basis = 'W') THEN
10490 g_empty_cont_tab(j).empty := p_line_cont_rec.cont_wt - p_line_cont_rec.converted_wt;
10491 --dbms_output.put_line('Inserted Container '||j||' with empty weight '||g_empty_cont_tab(j).empty||' into empty cont');
10492 ELSE
10493 g_empty_cont_tab(j).empty := p_line_cont_rec.cont_vol - p_line_cont_rec.converted_vol;
10494 --dbms_output.put_line('Inserted Container '||j||' with empty volume '||g_empty_cont_tab(j).empty||' into empty cont');
10495 END IF;
10496
10497 END IF;
10498 END IF;
10499
10500 END IF;
10501 x_return_status := C_SUCCESS_STATUS;
10502 --
10503 IF l_debug_on THEN
10504 WSH_DEBUG_SV.pop(l_module_name);
10505 END IF;
10506 --
10507 RETURN;
10508
10509 --
10510 IF l_debug_on THEN
10511 WSH_DEBUG_SV.pop(l_module_name);
10512 END IF;
10513 --
10514 EXCEPTION
10515 WHEN Others THEN
10516 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Pack_Container',l_module_name);
10517 x_return_status := C_UNEXP_ERROR_STATUS;
10518
10519 --
10520 IF l_debug_on THEN
10521 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
10522 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
10523 END IF;
10524 --
10525 END Pack_Container;
10526
10527 /*
10528 -----------------------------------------------------------------------------
10529 PROCEDURE : Validate_Container_For_Pack
10530 PARAMETERS : p_group_id_tab_id - table of group ids for lines that need to
10531 be autopacked.
10532 p_cont_info_tab - table of Container ids
10533 x_line_cont_tab - Delivery Detail(Cont)s along with other info
10534 which passed validations
10535 x_error_cnt - Count of errors encountered during validation
10536 x_warn_cnt - Count of warnings encountered during validation
10537 DESCRIPTION : This procedure takes a list of containers and does all
10538 validations and returns a list of containers which passed
10539 validations
10540 ------------------------------------------------------------------------------
10541 */
10542 -- Bug 3570364 : Added new parameter p_mast_cont_info_tab which contains the
10543 -- Master container informations which is used when Auto_pack Master
10544 -- action performed on delivery detail lines
10545
10546 PROCEDURE Validate_Container_For_Pack(
10547 p_group_id_tab IN WSH_UTIL_CORE.id_tab_type,
10548 p_cont_info_tab IN wsh_util_core.id_tab_type,
10549 p_mast_cont_info_tab IN wsh_container_actions.empty_cont_info_tab,
10550 x_line_cont_tab OUT NOCOPY wsh_container_actions.cont_info_tab,
10551 x_error_cnt OUT NOCOPY NUMBER,
10552 x_warn_cnt OUT NOCOPY NUMBER,
10553 x_fill_pc_warn_cnt OUT NOCOPY NUMBER -- bug 3421823
10554 ) IS
10555
10556 --Bug 3405853 : Added detail_container_item_id in the select clause
10557 CURSOR Get_dd_Detail(c_dd_id NUMBER) IS
10558 SELECT wdd.inventory_item_id inventory_item_id,
10559 wdd.gross_weight gross_weight,
10560 wdd.weight_uom_code weight_uom,
10561 wdd.volume volume,
10562 wdd.volume_uom_code volume_uom,
10563 wdd.organization_id organization_id,
10564 wdd.delivery_detail_id,
10565 wda.parent_delivery_detail_id parent_delivery_detail_id,
10566 nvl(wdd.detail_container_item_id,wdd.master_container_item_id) detail_container_item_id
10567 FROM wsh_delivery_details wdd,
10568 wsh_delivery_assignments_v wda
10569 WHERE wdd.delivery_detail_id = c_dd_id
10570 AND wdd.delivery_detail_id = wda.delivery_detail_id
10571 AND source_code = 'WSH';
10572
10573 CURSOR Get_Cont_Item_Load (v_inv_item_id NUMBER, v_cont_item_id NUMBER, v_organization_id NUMBER) IS
10574 SELECT max_load_quantity
10575 FROM WSH_CONTAINER_ITEMS
10576 WHERE load_item_id = v_inv_item_id
10577 AND container_item_id = v_cont_item_id
10578 AND master_organization_id = v_organization_id;
10579
10580 line_cont_rec wsh_container_actions.cont_info;
10581 line_cont_tab wsh_container_actions.cont_info_tab;
10582
10583 l_return_status VARCHAR2(1);
10584 l_last_organization_id NUMBER;
10585 l_dd_count NUMBER;
10586 l_group_id_cnt NUMBER;
10587 l_group_id NUMBER;
10588 l_parent_delivery_detail_id NUMBER;
10589 l_error_cnt NUMBER;
10590 l_process_flag VARCHAR2(1);
10591 l_fill_pc_basis VARCHAR2(1);
10592 l_wcl_cont_item_id NUMBER;
10593 l_max_load_qty NUMBER;
10594 l_dd_gross_wt NUMBER;
10595 l_dd_net_wt NUMBER;
10596 l_dd_volume NUMBER;
10597 l_cont_fill_pc NUMBER;
10598 l_cont_name VARCHAR2(30);
10599 l_mtl_max_load NUMBER;
10600 l_mtl_max_vol NUMBER;
10601 l_mtl_wt_uom VARCHAR2(3);
10602 l_mtl_vol_uom VARCHAR2(3);
10603 l_item_name VARCHAR2(2000); -- <-- for Bug 3577115
10604 --Bug #3405853
10605 l_detail_container_item_id NUMBER;
10606
10607
10608 error_cnt NUMBER := 0;
10609 warn_cnt NUMBER := 0;
10610
10611 fill_pc_warn_cnt NUMBER := 0; -- 3562797 jckwok
10612 --
10613 l_debug_on BOOLEAN;
10614 --
10615 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'VALIDATE_CONTAINER_FOR_PACK';
10616 --
10617 BEGIN
10618
10619
10620 -- 10. Populate detail dd info into line_cont_tab PL/SQL table
10621 --
10622 --
10623 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10624 --
10625 IF l_debug_on IS NULL
10626 THEN
10627 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10628 END IF;
10629 --
10630 IF l_debug_on THEN
10631 WSH_DEBUG_SV.push(l_module_name);
10632 WSH_DEBUG_SV.log(l_module_name,'---------------------------------');
10633 WSH_DEBUG_SV.log(l_module_name,'In Validate_Container_For_Pack...');
10634 WSH_DEBUG_SV.log(l_module_name,'---------------------------------');
10635 END IF;
10636 --
10637 l_last_organization_id := NULL;
10638 l_dd_count := 0;
10639 l_group_id_cnt := 1;
10640
10641 WHILE ( l_group_id_cnt <= p_cont_info_tab.COUNT )
10642 LOOP
10643 --dbms_output.put_line('Processing dd '||p_cont_info_tab(l_group_id_cnt));
10644
10645 OPEN get_dd_detail(p_cont_info_tab(l_group_id_cnt));
10646
10647 FETCH get_dd_detail
10648 INTO line_cont_rec.inventory_item_id,
10649 line_cont_rec.gross_weight,
10650 line_cont_rec.weight_uom,
10651 line_cont_rec.volume,
10652 line_cont_rec.volume_uom,
10653 line_cont_rec.organization_id,
10654 line_cont_rec.delivery_detail_id,
10655 l_parent_delivery_detail_id,
10656 l_detail_container_item_id;
10657 IF (get_dd_detail%NOTFOUND) THEN
10658 CLOSE get_dd_detail;
10659 goto next_cont;
10660 END IF;
10661
10662 CLOSE get_dd_detail;
10663
10664 -- 10.10 Delete Organization Specfic Cached Tables if organization_id changes
10665 IF ((l_last_organization_id IS NULL) OR (line_cont_rec.organization_id <> l_last_organization_id)) THEN
10666 g_cache_cont_load_info_tab.DELETE;
10667 g_cont_msi_tab.DELETE;
10668
10669 l_last_organization_id := line_cont_rec.organization_id;
10670 END IF;
10671
10672 /* grouping API will return a number = negative delivery_id if the line is
10673 already assigned to a delivery. So, check for negative numbers and if number
10674 < 0, then convert it to a postive number = delivery_id.
10675 */
10676 l_group_id := ABS(p_group_id_tab(p_cont_info_tab(l_group_id_cnt)));
10677 --dbms_output.put_line('l_group_id '||l_group_id);
10678
10679 -- 10.20 Check if the detail is already packed
10680 IF (l_parent_delivery_detail_id IS NOT NULL) THEN
10681 --dbms_output.put_line('Warning: cont already packed');
10682 warn_cnt := warn_cnt + 1;
10683 goto next_cont;
10684 END IF;
10685
10686 -- 10.30 Determine Fill PC Basis from shipping parameters
10687 Calc_Fill_Basis_and_Proc_Flag(
10688 p_organization_id => line_cont_rec.organization_id,
10689 x_return_status => l_return_status,
10690 x_fill_basis => l_fill_pc_basis,
10691 x_process_flag => l_process_flag);
10692 IF l_debug_on THEN
10693 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10694 END IF;
10695 IF (l_return_status <> C_SUCCESS_STATUS) THEN
10696 error_cnt := error_cnt + 1;
10697 goto next_cont;
10698 END IF;
10699
10700 line_cont_rec.fill_pc_basis := l_fill_pc_basis;
10701 IF (line_cont_rec.fill_pc_basis IS NULL) THEN
10702 --dbms_output.put_line('Skipping cont');
10703 goto next_cont;
10704 --
10705 -- bug 3562797 jckwok
10706 -- check Shipping Parameter Fill Percent Basis.
10707 --
10708 ELSIF line_cont_rec.fill_pc_basis='N' THEN
10709 fill_pc_warn_cnt := fill_pc_warn_cnt + 1;
10710 goto next_cont;
10711 END IF;
10712 -- end of bug 3562797
10713 -- 10.40 Determine Preferred Container
10714 -- Bug 3405853 : First check the detail lpn entered if it is null
10715 -- then consider the preferred container.
10716 -- Bug 3570364 : First check the master container item for the line ( Auto Pack Master action on Lines)
10717 -- If it is NULL then check for the Detail container item for the
10718 -- LPN ( Auto Pack Action on LPN's)
10719 IF p_mast_cont_info_tab.exists(l_group_id_cnt) THEN
10720 line_cont_rec.preferred_container := nvl(p_mast_cont_info_tab(l_group_id_cnt).container_item_id,l_detail_container_item_id);
10721 ELSE
10722 line_cont_rec.preferred_container := l_detail_container_item_id;
10723 END IF;
10724 line_cont_rec.max_load_qty := NULL;
10725
10726 IF (line_cont_rec.preferred_container IS NULL) THEN
10727 Calc_Pref_Container(
10728 p_organization_id => line_cont_rec.organization_id,
10729 p_inventory_item_id => line_cont_rec.inventory_item_id,
10730 p_fill_pc_basis => line_cont_rec.fill_pc_basis,
10731 x_return_status => l_return_status,
10732 x_error_cnt => l_error_cnt,
10733 x_cont_item_id => l_wcl_cont_item_id,
10734 x_max_load_qty => l_max_load_qty);
10735 IF l_debug_on THEN
10736 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10737 END IF;
10738 IF (l_return_status = C_ERROR_STATUS) THEN
10739 error_cnt := error_cnt + l_error_cnt;
10740 END IF;
10741
10742 line_cont_rec.preferred_container := l_wcl_cont_item_id;
10743 line_cont_rec.max_load_qty := l_max_load_qty;
10744 END IF;
10745
10746 -- bug 3440811
10747 validate_container(
10748 p_organization_id => line_cont_rec.organization_id,
10749 p_cont_item_id => line_cont_rec.preferred_container,
10750 x_return_status => l_return_status);
10751
10752 IF (l_return_status IN (C_UNEXP_ERROR_STATUS,C_ERROR_STATUS)) THEN
10753 line_cont_rec.preferred_container := null;
10754 line_cont_rec.max_load_qty := null;
10755 l_error_cnt := l_error_cnt + 1;
10756 error_cnt := error_cnt + l_error_cnt;
10757 END IF;
10758 -- bug 3440811
10759
10760 IF (line_cont_rec.preferred_container is NULL) THEN
10761 --dbms_output.put_line('Skipping cont');
10762 goto next_cont;
10763 END IF;
10764
10765 -- 10.50 Calculate Max Load/Converted wt/Converted Vol depending on fill basis
10766 line_cont_rec.converted_wt := NULL;
10767 line_cont_rec.converted_vol := NULL;
10768
10769 IF (line_cont_rec.fill_pc_basis = 'Q') THEN
10770 IF (line_cont_rec.max_load_qty IS NULL) THEN
10771 OPEN Get_Cont_Item_Load (line_cont_rec.inventory_item_id,line_cont_rec.preferred_container, line_cont_rec.organization_id);
10772
10773 FETCH Get_Cont_Item_Load
10774 INTO l_max_load_qty;
10775
10776 IF Get_Cont_Item_Load%NOTFOUND THEN
10777 --dbms_output.put_line('Could not find max load qty for Item'||line_cont_rec.inventory_item_id||' Cont '||line_cont_rec.preferred_container||' Org '||line_cont_rec.organization_id);
10778 CLOSE Get_Cont_Item_Load;
10779
10780 -- Calculate max load qty depending on Weight/Volume
10781 IF (line_cont_rec.gross_weight IS NULL OR line_cont_rec.volume IS NULL) THEN
10782 --
10783 IF l_debug_on THEN
10784 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
10785 END IF;
10786 --
10787 -- J: W/V Changes
10788 WSH_WV_UTILS.Container_Weight_Volume(
10789 p_container_instance_id => line_cont_rec.delivery_detail_id,
10790 p_override_flag => 'Y',
10791 p_post_process_flag => 'Y',
10792 p_calc_wv_if_frozen => 'N',
10793 x_gross_weight => l_dd_gross_wt,
10794 x_net_weight => l_dd_net_wt,
10795 x_volume => l_dd_volume ,
10796 p_fill_pc_flag => 'N',
10797 x_cont_fill_pc => l_cont_fill_pc,
10798 x_return_status => l_return_status);
10799
10800 IF l_debug_on THEN
10801 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10802 END IF;
10803 IF (l_return_status <> C_SUCCESS_STATUS) THEN
10804 --dbms_output.put_line('WSH_TPA_CONTAINER_PKG.Container_Weight_Volume did not return success');
10805 --
10806 IF l_debug_on THEN
10807 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
10808 END IF;
10809 --
10810 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(line_cont_rec.delivery_detail_id);
10811 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
10812 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
10813 IF l_return_status = C_WARNING_STATUS THEN
10814 warn_cnt := warn_cnt + 1;
10815 ELSE
10816 error_cnt := error_cnt + 1;
10817 END IF;
10818 --dbms_output.put_line('Skipping this cont');
10819 goto next_cont;
10820 END IF;
10821
10822 line_cont_rec.gross_weight := NVL(line_cont_rec.gross_weight,l_dd_gross_wt);
10823 line_cont_rec.volume := NVL(line_cont_rec.volume,l_dd_volume);
10824
10825 IF ((NVL(line_cont_rec.gross_weight,0) = 0) OR
10826 (NVL(line_cont_rec.volume,0) = 0)) THEN
10827 --dbms_output.put_line('Weight or Volume is NULL or 0');
10828 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
10829 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10830 error_cnt := error_cnt + 1;
10831 --dbms_output.put_line('Skipping this cont');
10832 goto next_cont;
10833 END IF;
10834 END IF;
10835
10836 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 2');
10837 Get_Cont_Load_Vol_info(
10838 p_container_item_id => line_cont_rec.preferred_container,
10839 p_organization_id => line_cont_rec.organization_id,
10840 p_w_v_both => 'B',
10841 x_max_load => l_mtl_max_load,
10842 x_max_vol => l_mtl_max_vol,
10843 x_wt_uom => l_mtl_wt_uom,
10844 x_vol_uom => l_mtl_vol_uom,
10845 x_return_status => l_return_status,
10846 x_error_cnt => l_error_cnt);
10847 IF l_debug_on THEN
10848 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10849 END IF;
10850 IF (l_return_status = C_ERROR_STATUS) THEN
10851 error_cnt := error_cnt + l_error_cnt;
10852 END IF;
10853
10854 IF ((NVL(l_mtl_max_load,0) <= 0) OR (NVL(l_mtl_max_vol,0) <= 0)) THEN
10855 --dbms_output.put_line('Skipping this Cont');
10856 goto next_cont;
10857 END IF;
10858
10859 IF (l_mtl_wt_uom <> line_cont_rec.weight_uom) THEN
10860 --
10861 IF l_debug_on THEN
10862 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
10863 END IF;
10864 --
10865 l_dd_gross_wt := WSH_WV_UTILS.Convert_Uom (
10866 from_uom => line_cont_rec.weight_uom,
10867 to_uom => l_mtl_wt_uom,
10868 quantity => line_cont_rec.gross_weight,
10869 item_id => line_cont_rec.inventory_item_id);
10870 ELSE
10871 l_dd_gross_wt := line_cont_rec.gross_weight;
10872 END IF;
10873
10874 IF (l_mtl_vol_uom <> line_cont_rec.volume_uom) THEN
10875 --
10876 IF l_debug_on THEN
10877 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
10878 END IF;
10879 --
10880 l_dd_volume := WSH_WV_UTILS.Convert_Uom (
10881 from_uom => line_cont_rec.volume_uom,
10882 to_uom => l_mtl_vol_uom,
10883 quantity => line_cont_rec.volume,
10884 item_id => line_cont_rec.inventory_item_id);
10885 ELSE
10886 l_dd_volume:= line_cont_rec.volume;
10887 END IF;
10888
10889 IF ((l_mtl_max_load/l_dd_gross_wt) >= (l_mtl_max_vol/l_dd_volume)) THEN
10890 l_max_load_qty := l_mtl_max_load/l_dd_gross_wt;
10891 ELSE
10892 l_max_load_qty := l_mtl_max_vol/l_dd_volume;
10893 END IF;
10894 --dbms_output.put_line('l_dd_gross_wt '||l_dd_gross_wt||' l_dd_volume '||l_dd_volume ||' l_mtl_max_load '||l_mtl_max_load||' l_mtl_max_vol '||l_mtl_max_vol || ' l_max_load_qty '||l_max_load_qty);
10895
10896 -- Containers cannot be split. So take FLOOR of l_max_load_qty
10897 l_max_load_qty := FLOOR(l_max_load_qty);
10898
10899 ELSE -- Get_Cont_Item_Load%NOTFOUND
10900 CLOSE Get_Cont_Item_Load;
10901 END IF;
10902 line_cont_rec.max_load_qty := l_max_load_qty;
10903
10904 IF (NVL(line_cont_rec.max_load_qty,0) <= 0) THEN
10905 --dbms_output.put_line('Max Load Qty is null or <= 0. Skipping this container');
10906 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
10907 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10908 error_cnt := error_cnt + 1;
10909 goto next_cont;
10910 END IF;
10911
10912 END IF; -- line_cont_rec.max_load_qty IS NULL
10913 --dbms_output.put_line('line_cont_rec.max_load_qty '||line_cont_rec.max_load_qty);
10914 ELSIF (line_cont_rec.fill_pc_basis in ('W','V')) THEN
10915 -- Calculate max load qty depending on Weight
10916 IF ((line_cont_rec.gross_weight IS NULL AND line_cont_rec.fill_pc_basis = 'W') OR
10917 (line_cont_rec.volume IS NULL AND line_cont_rec.fill_pc_basis = 'V')) THEN
10918 --
10919 IF l_debug_on THEN
10920 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
10921 END IF;
10922 --
10923 -- J: W/V Changes
10924 WSH_WV_UTILS.Container_Weight_Volume(
10925 p_container_instance_id => line_cont_rec.delivery_detail_id,
10926 p_override_flag => 'Y',
10927 p_post_process_flag => 'Y',
10928 p_calc_wv_if_frozen => 'N',
10929 x_gross_weight => l_dd_gross_wt,
10930 x_net_weight => l_dd_net_wt,
10931 x_volume => l_dd_volume ,
10932 p_fill_pc_flag => 'N',
10933 x_cont_fill_pc => l_cont_fill_pc,
10934 x_return_status => l_return_status);
10935
10936 IF l_debug_on THEN
10937 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10938 END IF;
10939 IF (l_return_status <> C_SUCCESS_STATUS) THEN
10940 --dbms_output.put_line('WSH_TPA_CONTAINER_PKG.Container_Weight_Volume did not return success');
10941 --
10942 IF l_debug_on THEN
10943 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
10944 END IF;
10945 --
10946 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(line_cont_rec.delivery_detail_id);
10947 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
10948 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
10949 IF l_return_status = C_WARNING_STATUS THEN
10950 warn_cnt := warn_cnt + 1;
10951 ELSE
10952 error_cnt := error_cnt + 1;
10953 END IF;
10954 error_cnt := error_cnt + 1;
10955 --dbms_output.put_line('Skipping this cont');
10956 goto next_cont;
10957 END IF;
10958
10959 IF (line_cont_rec.fill_pc_basis = 'W') THEN
10960 line_cont_rec.gross_weight := NVL(line_cont_rec.gross_weight,l_dd_gross_wt);
10961
10962 IF (NVL(line_cont_rec.gross_weight,0) = 0) THEN
10963 --dbms_output.put_line('Weight is NULL or 0');
10964 --BUG 3577115
10965 --FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
10966 l_item_name := WSH_UTIL_CORE.Get_Item_Name(line_cont_rec.inventory_item_id, line_cont_rec.organization_id);
10967 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NULL_WEIGHT_VOLUME');
10968 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_item_name);
10969 --BUG 3577115
10970 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10971 error_cnt := error_cnt + 1;
10972 --dbms_output.put_line('Skipping this Cont');
10973 goto next_cont;
10974 END IF;
10975 ELSE
10976 line_cont_rec.volume := NVL(line_cont_rec.volume,l_dd_volume);
10977
10978 IF (NVL(line_cont_rec.volume,0) = 0) THEN
10979 --dbms_output.put_line('Volume is NULL or 0');
10980 --BUG 3577115
10981 --FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_VOL_ERROR');
10982 l_item_name := WSH_UTIL_CORE.Get_Item_Name(line_cont_rec.inventory_item_id, line_cont_rec.organization_id);
10983 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NULL_WEIGHT_VOLUME');
10984 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_item_name);
10985 --BUG 3577115
10986 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10987 error_cnt := error_cnt + 1;
10988 --dbms_output.put_line('Skipping this Cont');
10989 goto next_cont;
10990 END IF;
10991 END IF;
10992 END IF;
10993 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 1');
10994 Get_Cont_Load_Vol_info(
10995 p_container_item_id => line_cont_rec.preferred_container,
10996 p_organization_id => line_cont_rec.organization_id,
10997 p_w_v_both => line_cont_rec.fill_pc_basis,
10998 x_max_load => l_mtl_max_load,
10999 x_max_vol => l_mtl_max_vol,
11000 x_wt_uom => l_mtl_wt_uom,
11001 x_vol_uom => l_mtl_vol_uom,
11002 x_return_status => l_return_status,
11003 x_error_cnt => l_error_cnt);
11004 IF l_debug_on THEN
11005 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
11006 END IF;
11007 IF (l_return_status = C_ERROR_STATUS) THEN
11008 error_cnt := error_cnt + l_error_cnt;
11009 END IF;
11010
11011 IF (line_cont_rec.fill_pc_basis = 'W') THEN
11012 IF (NVL(l_mtl_max_load,0) <= 0) THEN
11013 --dbms_output.put_line('Skipping this Cont');
11014 goto next_cont;
11015 END IF;
11016
11017 line_cont_rec.cont_wt := l_mtl_max_load;
11018
11019 IF (l_mtl_wt_uom <> line_cont_rec.weight_uom) THEN
11020 --
11021 IF l_debug_on THEN
11022 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
11023 END IF;
11024 --
11025 l_dd_net_wt := WSH_WV_UTILS.Convert_Uom (
11026 from_uom => line_cont_rec.weight_uom,
11027 to_uom => l_mtl_wt_uom,
11028 quantity => line_cont_rec.gross_weight,
11029 item_id => line_cont_rec.inventory_item_id);
11030 ELSE
11031 l_dd_net_wt := line_cont_rec.gross_weight;
11032 END IF;
11033
11034
11035 line_cont_rec.converted_wt := l_dd_net_wt;
11036 --dbms_output.put_line('line_cont_rec.converted_wt '||line_cont_rec.converted_wt);
11037 ELSE
11038 IF (NVL(l_mtl_max_vol,0) <= 0) THEN
11039 --dbms_output.put_line('Skipping this Cont');
11040 goto next_cont;
11041 END IF;
11042
11043 line_cont_rec.cont_vol := l_mtl_max_vol;
11044
11045 IF (l_mtl_vol_uom <> line_cont_rec.volume_uom) THEN
11046 --
11047 IF l_debug_on THEN
11048 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
11049 END IF;
11050 --
11051 l_dd_volume := WSH_WV_UTILS.Convert_Uom (
11052 from_uom => line_cont_rec.volume_uom,
11053 to_uom => l_mtl_vol_uom,
11054 quantity => line_cont_rec.volume,
11055 item_id => line_cont_rec.inventory_item_id);
11056 ELSE
11057 l_dd_volume := line_cont_rec.volume;
11058 END IF;
11059 line_cont_rec.converted_vol := l_dd_volume;
11060 --dbms_output.put_line('line_cont_rec.converted_vol '||line_cont_rec.converted_vol);
11061 END IF;
11062
11063 -- Check if the Master container can hold atleast 1 piece of the Detail Container
11064 IF ((line_cont_rec.fill_pc_basis = 'W' AND (line_cont_rec.converted_wt > l_mtl_max_load)) OR
11065 (line_cont_rec.fill_pc_basis = 'V' AND (line_cont_rec.converted_vol > l_mtl_max_vol))) THEN
11066 --dbms_output.put_line('Indivisible flag is Y and Preferred Mast Cont cannot hold atleast 1 piece');
11067 -- Bug#: 2503937 - New Error Message
11068 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_VOL_ERROR');
11069 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
11070 error_cnt := error_cnt + 1;
11071 --dbms_output.put_line('Skipping this Cont');
11072 goto next_cont;
11073 END IF;
11074 END IF;
11075
11076 -- 10.60 Populate line_cont_tab PL/SQL table now
11077 line_cont_rec.group_id := l_group_id;
11078 line_cont_rec.shp_qty := 1;
11079 line_cont_rec.req_qty := 1;
11080
11081 l_dd_count := l_dd_count + 1;
11082 line_cont_tab(l_dd_count) := line_cont_rec;
11083
11084 <<next_cont>>
11085 l_group_id_cnt := l_group_id_cnt + 1;
11086
11087 END LOOP;
11088
11089 x_error_cnt := error_cnt;
11090 x_warn_cnt := warn_cnt;
11091 x_line_cont_tab := line_cont_tab;
11092 x_fill_pc_warn_cnt := fill_pc_warn_cnt; -- bug 3562797 jckwok
11093
11094 IF l_debug_on THEN
11095 WSH_DEBUG_SV.log(l_module_name,'p_cont_info_tab count->'||p_cont_info_tab.count||' x_line_cont_tab count->'||x_line_cont_tab.count);
11096 WSH_DEBUG_SV.log(l_module_name,'Error Count '|| error_cnt||' Warning Count '|| warn_cnt);
11097 WSH_DEBUG_SV.pop(l_module_name);
11098 END IF;
11099
11100 RETURN;
11101
11102 EXCEPTION
11103 WHEN Others THEN
11104 IF (Get_dd_Detail%ISOPEN) THEN
11105 CLOSE Get_dd_Detail;
11106 END IF;
11107 IF (Get_Cont_Item_Load%ISOPEN) THEN
11108 CLOSE Get_Cont_Item_Load;
11109 END IF;
11110 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Validate_Container_For_Pack',l_module_name);
11111 --
11112 IF l_debug_on THEN
11113 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11114 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11115 END IF;
11116 --
11117 raise;
11118
11119 END Validate_Container_For_Pack;
11120
11121
11122 /*
11123 -----------------------------------------------------------------------------
11124 PROCEDURE : Auto_Pack_Conts
11125 PARAMETERS : p_group_id_tab_id - table of group ids for containers that need
11126 to be autopacked.
11127 p_det_cont_info - table of detail containers created during the
11128 autopack process consisting of container instances, master
11129 container item ids and percentage empty.
11130 p_cont_detail_tab - table of container delivery detail ids that
11131 were created during the autopacking of lines.
11132 x_cont_instance_id - table of container instance ids that were
11133 created during the autopacking.
11134 x_return_status - return status of API.
11135 DESCRIPTION : This procedure takes the number of containers and groups them
11136 by common grouping attributes - similar to grouping attributes
11137 of delivery. If a group id table is specified it uses the
11138 group ids in the table to decided which container can be
11139 grouped into the same parent container. If a group id table is
11140 not specified, it creates the group id table before autopacking
11141 It creates the required number and type of parent containers
11142 per detail container and keeps track of all partially filled
11143 containers in the empty containers table. Before creating new
11144 container instances, it searches for available space using the
11145 empty container table and after filling up a container, it
11146 creates a new one if there are no empty containers of the same
11147 type. The difference between this API and the autopack lines is
11148 that this API does not split containers if they don't fit
11149 entirely into a parent container.
11150 ------------------------------------------------------------------------------
11151 */
11152
11153 PROCEDURE Auto_Pack_Conts (
11154 p_group_id_tab IN WSH_UTIL_CORE.id_tab_type,
11155 p_cont_info_tab IN wsh_container_actions.empty_cont_info_tab,
11156 p_cont_detail_tab IN WSH_UTIL_CORE.id_tab_type,
11157 x_cont_instance_tab IN OUT NOCOPY WSH_UTIL_CORE.id_tab_type,
11158 x_return_status OUT NOCOPY VARCHAR2) IS
11159
11160 line_cont_rec wsh_container_actions.cont_info;
11161 line_cont_tab wsh_container_actions.cont_info_tab;
11162
11163 l_group_id_temp_tab WSH_UTIL_CORE.id_tab_type;
11164 l_group_id_tab WSH_UTIL_CORE.id_tab_type;
11165 l_del_row_tab WSH_UTIL_CORE.id_tab_type;
11166 l_return_status VARCHAR2(1);
11167 l_cont_instance_id NUMBER;
11168 l_row_id VARCHAR2(30);
11169 l_gross_weight NUMBER;
11170 l_net_weight NUMBER;
11171 l_volume NUMBER;
11172 l_err_cont_name VARCHAR2(30);
11173 l_cont_instance_cnt NUMBER;
11174 l_last_organization_id NUMBER;
11175 l_cont_fill_pc NUMBER;
11176 l_cont_name VARCHAR2(30);
11177
11178
11179 l_attr_tab wsh_delivery_autocreate.grp_attr_tab_type;
11180 l_group_tab wsh_delivery_autocreate.grp_attr_tab_type;
11181 l_action_rec wsh_delivery_autocreate.action_rec_type;
11182 l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
11183 l_matched_entities wsh_util_core.id_tab_type;
11184 l_out_rec wsh_delivery_autocreate.out_rec_type;
11185
11186
11187 i NUMBER;
11188 cnt NUMBER;
11189
11190 error_cnt NUMBER := 0;
11191 succ_cnt NUMBER := 0;
11192 warn_cnt NUMBER := 0;
11193 cont_warn NUMBER := 0;
11194
11195 l_fill_pc_warn_count NUMBER := 0; -- bug 3562797 jckwok
11196
11197 CURSOR c_get_detail(p_del_det_id NUMBER) IS
11198 SELECT nvl(ignore_for_planning, 'N') ignore_for_planning,
11199 organization_id, -- K LPN CON. rv
11200 nvl(line_direction,'O') line_direction -- K LPN CONV. rv
11201 FROM wsh_delivery_details
11202 WHERE delivery_detail_id=p_del_det_id;
11203
11204 -- K LPN CONV. rv
11205 l_wms_org VARCHAR2(10) := 'N';
11206 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
11207 l_cont_tab wsh_util_core.id_tab_type;
11208 l_lpn_unit_weight NUMBER;
11209 l_lpn_unit_volume NUMBER;
11210 l_lpn_weight_uom_code VARCHAR2(100);
11211 l_lpn_volume_uom_code VARCHAR2(100);
11212 l_cnt_orgn_id NUMBER;
11213 l_cnt_line_dir VARCHAR2(10);
11214 l_cnt_ignore_plan_flag VARCHAR2(10);
11215 -- K LPN CONV. rv
11216 --
11217 l_debug_on BOOLEAN;
11218 --
11219 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'AUTO_PACK_CONTS';
11220 --
11221 BEGIN
11222
11223 --dbms_output.put_line('==================================================');
11224 --dbms_output.put_line('Start of WSH_CONTAINER_ACTIONS.Auto_Pack_Conts...');
11225 --dbms_output.put_line('==================================================');
11226
11227 -- Delete all Global PL/SQL tables to start with
11228 --
11229 --
11230 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
11231 --
11232 IF l_debug_on IS NULL
11233 THEN
11234 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
11235 END IF;
11236 --
11237 IF l_debug_on THEN
11238 WSH_DEBUG_SV.push(l_module_name);
11239 END IF;
11240 --
11241 g_empty_cont_tab.DELETE;
11242 g_assign_detail_tab.DELETE;
11243 g_new_container_tab.DELETE;
11244 g_cache_organization_info_tab.DELETE;
11245 g_cont_msi_tab.DELETE;
11246 g_new_cont_index := 0;
11247 g_assign_detail_index := 0;
11248
11249 -- 10. Check if Count of p_del_detail_tab table is 0
11250 --IF (p_cont_detail_tab.COUNT = 0 OR p_cont_info_tab.COUNT = 0) THEN
11251 IF (p_cont_detail_tab.COUNT = 0) THEN
11252 --dbms_output.put_line('p_cont_detail_tab count is 0');
11253 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CONT_ASSG_NULL');
11254 x_return_status := C_ERROR_STATUS;
11255 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11256 --
11257 IF l_debug_on THEN
11258 WSH_DEBUG_SV.pop(l_module_name);
11259 END IF;
11260 --
11261 return;
11262 END IF;
11263
11264 -- 20. Generate Grouping Ids
11265 IF p_group_id_tab.COUNT = 0 THEN
11266
11267 -- call autocreate delivery API with a check flag set to 'Y' and
11268 -- container flag set to 'Y' to fetch group id table for delivery lines
11269
11270 --dbms_output.put_line('Calling WSH_DELIVERY_AUTOCREATE.autocreate_deliveries to generate group_ids');
11271 --
11272 IF l_debug_on THEN
11273 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
11274 END IF;
11275 --
11276 l_attr_tab.delete;
11277 FOR i in 1..p_cont_detail_tab.count LOOP
11278
11279 l_attr_tab(i).entity_id := p_cont_detail_tab(i);
11280 l_attr_tab(i).entity_type := 'DELIVERY_DETAIL';
11281
11282 END LOOP;
11283
11284 l_action_rec.action := 'MATCH_GROUPS';
11285
11286
11287
11288 WSH_Delivery_AutoCreate.Find_Matching_Groups(p_attr_tab => l_attr_tab,
11289 p_action_rec => l_action_rec,
11290 p_target_rec => l_target_rec,
11291 p_group_tab => l_group_tab,
11292 x_matched_entities => l_matched_entities,
11293 x_out_rec => l_out_rec,
11294 x_return_status => l_return_status);
11295
11296
11297
11298 IF l_debug_on THEN
11299 WSH_DEBUG_SV.log(l_module_name,'return status', l_return_status);
11300 END IF;
11301 IF (l_return_status = C_ERROR_STATUS) OR
11302 (l_return_status = C_UNEXP_ERROR_STATUS) THEN
11303 --dbms_output.put_line('WSH_DELIVERY_AUTOCREATE.autocreate_deliveries returned '||l_return_status);
11304 FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
11305 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
11306 x_return_status := l_return_status;
11307 --
11308 IF l_debug_on THEN
11309 WSH_DEBUG_SV.pop(l_module_name);
11310 END IF;
11311 --
11312 return;
11313 END IF;
11314 FOR i in 1..l_attr_tab.COUNT LOOP
11315 l_group_id_tab(l_attr_tab(i).entity_id) := l_attr_tab(i).group_id;
11316 END LOOP;
11317 ELSE
11318 cnt := p_group_id_tab.FIRST;
11319 IF ((cnt IS NULL) OR (p_group_id_tab.COUNT <> p_cont_detail_tab.count)) THEN
11320 x_return_status := C_ERROR_STATUS;
11321 FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
11322 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11323 --
11324 IF l_debug_on THEN
11325 WSH_DEBUG_SV.pop(l_module_name);
11326 END IF;
11327 --
11328 return;
11329 ELSE
11330 FOR i in 1..l_group_id_tab.COUNT LOOP
11331 l_group_id_tab(p_cont_detail_tab(i)) := p_group_id_tab(i);
11332 END LOOP;
11333 END IF;
11334 END IF;
11335
11336 --dbms_output.put_line('Checking group_ids is over');
11337
11338 -- 40. Call Validate_Container_For_Pack to validate detail info in p_cont_detail_tab
11339 -- Bug 3570364 : Passing the parameter p_cont_info_tab which contains the
11340 -- master container item id's for all LPN's( For Auto_pack Master Action on Lines).
11341 Validate_Container_For_Pack(
11342 p_group_id_tab => l_group_id_tab,
11343 p_cont_info_tab => p_cont_detail_tab,
11344 p_mast_cont_info_tab => p_cont_info_tab,
11345 x_line_cont_tab => line_cont_tab,
11346 x_error_cnt => error_cnt,
11347 x_warn_cnt => warn_cnt,
11348 x_fill_pc_warn_cnt => l_fill_pc_warn_count -- bug 3562797 jckwok
11349 );
11350
11351 IF l_debug_on THEN
11352 WSH_DEBUG_SV.log(l_module_name,'after validate container for pack-error,warning', error_cnt||','||warn_cnt);
11353 END IF;
11354 --
11355 -- bug 3562797 jckwok
11356 -- Raise Error if all containers have 'Shipping Parameter' percent fill basis as None
11357 -- Raise warning if found some of the containers with 'Shipping Parameter'
11358 -- percent fill basis as None.
11359 --
11360 IF (l_fill_pc_warn_count = p_cont_detail_tab.count) THEN
11361 x_return_status := C_ERROR_STATUS;
11362 FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
11363 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11364 IF l_debug_on THEN
11365 WSH_DEBUG_SV.pop(l_module_name);
11366 END IF;
11367 RETURN;
11368 ELSIF (l_fill_pc_warn_count > 0) THEN
11369 IF (l_return_status <> C_ERROR_STATUS) THEN
11370 x_return_status := C_WARNING_STATUS;
11371 warn_cnt := warn_cnt + 1;
11372 FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
11373 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11374 END IF;
11375 END IF;
11376 -- end of bug 3562797 jckwok
11377
11378 IF (line_cont_tab.COUNT > 0) THEN
11379 -- 50. Loop through all Containers that need to be Auto-Packed
11380 cnt := 1;
11381 succ_cnt := 0;
11382 l_last_organization_id := NULL;
11383 WHILE (cnt <= line_cont_tab.COUNT) LOOP
11384
11385 --dbms_output.put_line('======================================================');
11386 IF l_debug_on THEN
11387 WSH_DEBUG_SV.log(l_module_name,'auto-packing Container ' || line_cont_tab(cnt).delivery_detail_id||' Organization id '||line_cont_tab(cnt).organization_id);
11388 END IF;
11389
11390 IF (l_last_organization_id is NULL) THEN
11391 l_last_organization_id := line_cont_tab(cnt).organization_id;
11392 ELSIF (l_last_organization_id <> line_cont_tab(cnt).organization_id) THEN
11393 l_last_organization_id := line_cont_tab(cnt).organization_id;
11394
11395 -- Delete the empty PL/SQL cont table if organization_id changes
11396 g_empty_cont_tab.DELETE;
11397 END IF;
11398
11399 Pack_Container(
11400 p_line_cont_rec => line_cont_tab(cnt),
11401 x_return_status => l_return_status);
11402
11403 IF l_return_status = C_ERROR_STATUS THEN
11404 error_cnt := error_cnt + 1;
11405 ELSE
11406 succ_cnt := succ_cnt + 1;
11407 END IF;
11408 cnt := cnt + 1;
11409
11410 END LOOP;
11411
11412 -- 60.1 Create Containers from g_new_container_tab PL/SQL table
11413 --dbms_output.put_line('*** Creating Actual Containers ***');
11414 cnt := 1;
11415 l_cont_instance_cnt := 1;
11416 WHILE (cnt <= g_new_container_tab.COUNT) LOOP
11417 l_cont_name := null;
11418
11419 --
11420 -- K LPN CONV. rv
11421 IF l_debug_on THEN
11422 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CREATE_CONT_INSTANCE_MULTI',WSH_DEBUG_SV.C_PROC_LEVEL);
11423 END IF;
11424 --
11425 WSH_CONTAINER_ACTIONS.Create_Cont_Instance_Multi(
11426 x_cont_name => l_cont_name,
11427 p_cont_item_id => g_new_container_tab(cnt).container_item_id,
11428 x_cont_instance_id => l_cont_instance_id,
11429 p_par_detail_id => NULL,
11430 p_organization_id => g_new_container_tab(cnt).organization_id,
11431 p_container_type_code => NULL,
11432 p_num_of_containers => 1,
11433 x_row_id => l_row_id,
11434 x_return_status => l_return_status,
11435 x_cont_tab => l_cont_tab,
11436 x_unit_weight => l_lpn_unit_weight,
11437 x_unit_volume => l_lpn_unit_volume,
11438 x_weight_uom_code => l_lpn_weight_uom_code,
11439 x_volume_uom_code => l_lpn_volume_uom_code,
11440 p_lpn_id => NULL,
11441 p_ignore_for_planning => NULL,
11442 p_caller => 'WSH_AUTO_PACK_CONTS');
11443 IF l_debug_on THEN
11444 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
11445 WSH_DEBUG_SV.log(l_module_name,'count of l_cont_tab',l_cont_tab.count);
11446 END IF;
11447 -- K LPN CONV. rv
11448
11449 IF l_return_status <> C_SUCCESS_STATUS THEN
11450 --dbms_output.put_line('Container Creation failed for index '|| cnt);
11451 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
11452 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
11453 error_cnt := error_cnt + 1;
11454 ELSE
11455 l_cont_instance_id := l_cont_tab(1);
11456 g_new_container_tab(cnt).cont_instance_id := l_cont_instance_id;
11457 x_cont_instance_tab(l_cont_instance_cnt) := l_cont_instance_id;
11458 l_cont_instance_cnt := l_cont_instance_cnt + 1;
11459 --dbms_output.put_line('Container dd id '||l_cont_instance_id||' for index '|| cnt);
11460 END IF;
11461 cnt := cnt + 1;
11462 END LOOP;
11463
11464
11465 -- 70.1 Assign Details to Actual Containers created
11466 --dbms_output.put_line('*** Assigning Containers to Containers Created ***');
11467 cnt := 1;
11468 WHILE (cnt <= g_assign_detail_tab.COUNT) LOOP
11469 l_cont_instance_id := g_new_container_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id;
11470 IF l_debug_on THEN
11471 WSH_DEBUG_SV.log(l_module_name,'DD '||g_assign_detail_tab(cnt).delivery_detail_id||' Index '||g_assign_detail_tab(cnt).container_index||' Cont '||l_cont_instance_id);
11472 END IF;
11473
11474 --
11475 -- K LPN CONV. rv
11476 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
11477 --{
11478 open c_get_detail(l_cont_instance_id);
11479 fetch c_get_detail into l_cnt_ignore_plan_flag, l_cnt_orgn_id, l_cnt_line_dir;
11480 close c_get_detail;
11481
11482 l_wms_org := wsh_util_validate.check_wms_org(l_cnt_orgn_id);
11483 --}
11484 END IF;
11485 -- K LPN CONV. rv
11486 --
11487 -- J TP Release
11488 --update the container's ignore value with the first line's ignore
11489 --since grouping will have already sorted out lines with diff ignore, this shud be okay
11490 FOR cur IN c_get_detail(g_assign_detail_tab(cnt).delivery_detail_id) LOOP
11491 IF l_debug_on THEN
11492 WSH_DEBUG_SV.log(l_module_name,'ignore_for_planning',cur.ignore_for_planning);
11493 END IF;
11494 --
11495 -- K LPN CONV. rv
11496 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
11497 AND l_cnt_line_dir IN ('O','IO')
11498 AND
11499 (
11500 (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
11501 OR
11502 (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
11503 )
11504 THEN
11505 --{
11506 l_sync_tmp_rec.delivery_detail_id := l_cont_instance_id;
11507 l_sync_tmp_rec.operation_type := 'UPDATE';
11508 WSH_WMS_SYNC_TMP_PKG.MERGE
11509 (
11510 p_sync_tmp_rec => l_sync_tmp_rec,
11511 x_return_status => l_return_status
11512 );
11513
11514 IF l_debug_on THEN
11515 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
11516 END IF;
11517 --
11518 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11519 --
11520 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11521 warn_cnt := warn_cnt + 1;
11522 ELSE
11523 --
11524 error_cnt := error_cnt + 1;
11525 IF l_debug_on THEN
11526 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_WMS_SYNC_TMP_PKG.MERGE completed with an error');
11527 END IF;
11528 --
11529 END IF;
11530 --
11531 END IF;
11532 --}
11533 END IF;
11534 -- K LPN CONV. rv
11535 UPDATE wsh_delivery_details
11536 SET ignore_for_planning=cur.ignore_for_planning
11537 WHERE delivery_detail_id=l_cont_instance_id;
11538
11539 IF SQL%NOTFOUND THEN
11540 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
11541 IF l_debug_on THEN
11542 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
11543 END IF;
11544 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_instance_id);
11545 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
11546 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11547 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11548 IF l_debug_on THEN
11549 WSH_DEBUG_SV.pop(l_module_name);
11550 END IF;
11551 return;
11552 END IF;
11553 END LOOP;
11554
11555 IF (l_cont_instance_id is NOT NULL) THEN
11556 --
11557 IF l_debug_on THEN
11558 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_TO_CONTAINER',WSH_DEBUG_SV.C_PROC_LEVEL);
11559 END IF;
11560 --
11561 wsh_container_actions.Assign_To_Container (
11562 p_det_cont_inst_id => g_assign_detail_tab(cnt).delivery_detail_id,
11563 p_par_cont_inst_id => l_cont_instance_id,
11564 x_return_status => l_return_status);
11565 IF l_debug_on THEN
11566 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
11567 END IF;
11568
11569 --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Assign_To_Container returned '||l_return_status);
11570 IF l_return_status = C_ERROR_STATUS THEN
11571 error_cnt := error_cnt + 1;
11572 ELSIF l_return_status = C_WARNING_STATUS THEN
11573 warn_cnt := warn_cnt + 1;
11574 ELSE
11575 NULL;
11576 --dbms_output.put_line('Assigned dd '||g_assign_detail_tab(cnt).delivery_detail_id||' to Cont '||l_cont_instance_id);
11577 END IF;
11578 END IF;
11579
11580 cnt := cnt + 1;
11581 END LOOP;
11582
11583 END IF; -- line_cont_tab.COUNT > 0
11584
11585 IF l_debug_on THEN
11586 WSH_DEBUG_SV.log(l_module_name,'error cnt is ' || error_cnt || ' warn cnt is ' || warn_cnt|| ' succ cnt is ' || succ_cnt);
11587 END IF;
11588
11589 -- 90.1 Summarize errors/warnings
11590 IF (error_cnt > 0) THEN
11591 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CONT_PACK_ERROR');
11592 FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
11593 FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
11594 FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
11595 IF succ_cnt > 0 THEN
11596 x_return_status := C_WARNING_STATUS;
11597 ELSE
11598 x_return_status := C_ERROR_STATUS;
11599 END IF;
11600 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11601 ELSIF (warn_cnt > 0 OR cont_warn > 0) THEN
11602 x_return_status := C_WARNING_STATUS;
11603 IF cont_warn > 0 THEN
11604 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_PACK_WARN');
11605 FND_MESSAGE.SET_TOKEN('CONT_WARN',cont_warn);
11606 FND_MESSAGE.SET_TOKEN('CONT_ERR',0);
11607 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11608 END IF;
11609 ELSE
11610 x_return_status := C_SUCCESS_STATUS;
11611 END IF;
11612
11613 --
11614 IF l_debug_on THEN
11615 WSH_DEBUG_SV.pop(l_module_name);
11616 END IF;
11617 --
11618 RETURN;
11619
11620 --
11621 IF l_debug_on THEN
11622 WSH_DEBUG_SV.pop(l_module_name);
11623 END IF;
11624 --
11625 EXCEPTION
11626 WHEN Others THEN
11627 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Auto_Pack_conts',l_module_name);
11628 x_return_status := C_UNEXP_ERROR_STATUS;
11629
11630 --
11631 IF l_debug_on THEN
11632 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11633 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11634 END IF;
11635 --
11636 END Auto_Pack_conts;
11637
11638 /*
11639 -----------------------------------------------------------------------------
11640 PROCEDURE : Update_Cont_Attributes
11641 PARAMETERS : p_delivery_detail_id - delivery detail id
11642 p_delivery_id - delivery id if container assigned to delivery
11643 p_container_instance_id - delivery detail id for the container
11644 x_return_status - return status of API
11645 DESCRIPTION : This procedure updates the grouping attribute columns of the
11646 container with the grouping attribute values derived from the
11647 delivery line that is input.
11648 ------------------------------------------------------------------------------
11649 */
11650
11651 PROCEDURE Update_Cont_Attributes (
11652 p_delivery_detail_id IN NUMBER,
11653 p_delivery_id IN NUMBER,
11654 p_container_instance_id IN NUMBER,
11655 x_return_status OUT NOCOPY VARCHAR2) IS
11656
11657
11658 CURSOR Get_Detail_Attr (v_detail_id NUMBER) IS
11659 SELECT organization_id, customer_id, ship_to_location_id,
11660 intmed_ship_to_location_id,
11661 fob_code, freight_terms_code, ship_method_code,
11662 mode_of_transport, service_level, carrier_id,
11663 deliver_to_location_id,
11664 NVL(line_direction,'O') line_direction, -- J-IB-NPARIKH
11665 shipping_control, -- J-IB-NPARIKH
11666 vendor_id, -- J-IB-NPARIKH
11667 party_id, -- J-IB-NPARIKH
11668 nvl(ignore_for_planning, 'N') ignore_for_planning, --J TP Release
11669 client_id -- LSP PROJECT : ClientID needs to be updated on LPN
11670 FROM WSH_DELIVERY_DETAILS
11671 WHERE delivery_detail_id = v_detail_id;
11672
11673 CURSOR Get_Del_Attr (v_del_id NUMBER) IS
11674 SELECT organization_id, customer_id, ultimate_dropoff_location_id,
11675 intmed_ship_to_location_id,
11676 fob_code, freight_terms_code, ship_method_code,
11677 mode_of_transport, service_level, carrier_id,
11678 ultimate_dropoff_location_id deliver_to_location_id,
11679 NVL(shipment_direction,'O') line_direction, -- J-IB-NPARIKH
11680 shipping_control, -- J-IB-NPARIKH
11681 vendor_id, -- J-IB-NPARIKH
11682 party_id, -- J-IB-NPARIKH
11683 nvl(ignore_for_planning,'N') ignore_for_planning, --J TP Release
11684 client_id -- LSP PROJECT : ClientID needs to be updated on LPN
11685 FROM WSH_NEW_DELIVERIES
11686 WHERE delivery_id = v_del_id;
11687
11688 l_cont_name VARCHAR2(30);
11689
11690 l_org_id NUMBER;
11691 l_cust_id NUMBER;
11692 l_intmed_loc_id NUMBER;
11693 l_fob_code VARCHAR2(30);
11694 l_freight_terms_code VARCHAR2(30);
11695 l_ship_method_code VARCHAR2(30);
11696 l_carrier_id NUMBER;
11697 l_service_level VARCHAR2(30);
11698 l_mode_of_transport VARCHAR2(30);
11699 l_deliver_to_loc_id NUMBER;
11700 l_ship_to_loc_id NUMBER;
11701 l_line_direction VARCHAR2(30);
11702 l_shipping_control VARCHAR2(30);
11703 l_vendor_id NUMBER;
11704 l_party_id NUMBER;
11705 l_ignore_for_planning VARCHAR2(1);
11706 --
11707 l_client_id NUMBER; -- LSP PROJECT :
11708
11709 -- K LPN CONV. rv
11710 l_wms_org VARCHAR2(10) := 'N';
11711 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
11712 l_return_status VARCHAR2(1);
11713 l_num_warnings NUMBER := 0;
11714 l_cnt_line_dir VARCHAR2(10);
11715 -- K LPN CONV. rv
11716
11717 --BUG#12904248
11718 l_deliver_to_location_id NUMBER;
11719
11720 --
11721 l_debug_on BOOLEAN;
11722 --
11723 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_CONT_ATTRIBUTES';
11724 --
11725 BEGIN
11726
11727 --
11728 --
11729 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
11730 --
11731 IF l_debug_on IS NULL
11732 THEN
11733 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
11734 END IF;
11735 --
11736 IF l_debug_on THEN
11737 WSH_DEBUG_SV.push(l_module_name);
11738 --
11739 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_DETAIL_ID',P_DELIVERY_DETAIL_ID);
11740 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
11741 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
11742 END IF;
11743 --
11744 IF p_delivery_detail_id IS NOT NULL THEN
11745
11746 OPEN Get_Detail_Attr (p_delivery_detail_id);
11747
11748 FETCH Get_Detail_Attr INTO
11749 l_org_id,
11750 l_cust_id,
11751 l_ship_to_loc_id,
11752 l_intmed_loc_id,
11753 l_fob_code,
11754 l_freight_terms_code,
11755 l_ship_method_code,
11756 l_mode_of_transport,
11757 l_service_level,
11758 l_carrier_id,
11759 l_deliver_to_loc_id,
11760 l_line_direction,
11761 l_shipping_control,
11762 l_vendor_id,
11763 l_partY_id,
11764 l_ignore_for_planning,
11765 l_client_id -- LSP PROJECT
11766 ;
11767
11768 IF Get_Detail_Attr%NOTFOUND THEN
11769 --dbms_output.put_line('invalid detail id ' || p_delivery_detail_id);
11770 CLOSE Get_Detail_Attr;
11771 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
11772 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_detail_id);
11773 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11774 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11775 --
11776 IF l_debug_on THEN
11777 WSH_DEBUG_SV.pop(l_module_name);
11778 END IF;
11779 --
11780 return;
11781 END IF;
11782
11783 IF Get_Detail_Attr%ISOPEN THEN
11784 CLOSE Get_Detail_Attr;
11785 END IF;
11786
11787 ELSIF p_delivery_id IS NOT NULL THEN
11788
11789 OPEN Get_Del_Attr (p_delivery_id);
11790
11791 FETCH Get_Del_Attr INTO
11792 l_org_id,
11793 l_cust_id,
11794 l_ship_to_loc_id,
11795 l_intmed_loc_id,
11796 l_fob_code,
11797 l_freight_terms_code,
11798 l_ship_method_code,
11799 l_mode_of_transport,
11800 l_service_level,
11801 l_carrier_id,
11802 l_deliver_to_loc_id,
11803 l_line_direction,
11804 l_shipping_control,
11805 l_vendor_id,
11806 l_partY_id,
11807 l_ignore_for_planning,
11808 l_client_id -- LSP PROJECT
11809 ;
11810
11811 IF Get_Del_Attr%NOTFOUND THEN
11812 CLOSE Get_Del_Attr;
11813 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DELIVERY');
11814 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_id);
11815 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11816 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11817 --
11818 IF l_debug_on THEN
11819 WSH_DEBUG_SV.pop(l_module_name);
11820 END IF;
11821 --
11822 return;
11823 END IF;
11824
11825 IF Get_Del_Attr%ISOPEN THEN
11826 CLOSE Get_Del_Attr;
11827 END IF;
11828
11829 ELSE
11830 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NO_ATTR_ERROR');
11831 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11832 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11833 --
11834 IF l_debug_on THEN
11835 WSH_DEBUG_SV.pop(l_module_name);
11836 END IF;
11837 --
11838 return;
11839
11840 END IF;
11841
11842
11843 --dbms_output.put_line('calling update with customer id ' || l_cust_id || ' and ship to ' || l_ship_to_loc_id);
11844
11845 -- K LPN CONV. rv
11846 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
11847 FOR cnt_inst_rec in Get_Detail_Attr(p_container_instance_id) LOOP
11848 l_wms_org := wsh_util_validate.check_wms_org(cnt_inst_rec.organization_id);
11849 l_cnt_line_dir := cnt_inst_rec.line_direction;
11850 END LOOP;
11851 END IF;
11852 --
11853 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
11854 AND l_cnt_line_dir IN ('O','IO')
11855 AND
11856 (
11857 (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
11858 OR
11859 (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
11860 )
11861 THEN
11862 --{
11863 l_sync_tmp_rec.delivery_detail_id := p_container_instance_id;
11864 l_sync_tmp_rec.operation_type := 'UPDATE';
11865 WSH_WMS_SYNC_TMP_PKG.MERGE
11866 (
11867 p_sync_tmp_rec => l_sync_tmp_rec,
11868 x_return_status => l_return_status
11869 );
11870
11871 IF l_debug_on THEN
11872 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
11873 END IF;
11874 --
11875 IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
11876 --
11877 x_return_status := l_return_status;
11878 --
11879 IF l_debug_on THEN
11880 WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
11881 WSH_DEBUG_SV.pop(l_module_name);
11882 END IF;
11883 --
11884 return;
11885 --
11886 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
11887 --
11888 l_num_warnings := l_num_warnings + 1;
11889 --
11890 END IF;
11891 --
11892 --}
11893 END IF;
11894 -- K LPN CONV. rv
11895
11896 --BUG#12904248
11897 Get_Deliver_To_Location(
11898 p_container_id => p_container_instance_id,
11899 x_deliver_to_location_id => l_deliver_to_location_id,
11900 x_return_status => l_return_status);
11901
11902 IF NVL(l_deliver_to_location_id,-99) <> l_deliver_to_loc_id then
11903 l_deliver_to_loc_id:=NULL;
11904 END IF;
11905
11906 UPDATE WSH_DELIVERY_DETAILS SET
11907 customer_id = l_cust_id,
11908 ship_to_location_id = l_ship_to_loc_id,
11909 intmed_ship_to_location_id = l_intmed_loc_id,
11910 fob_code = l_fob_code,
11911 freight_terms_code = l_freight_terms_code,
11912 ship_method_code = l_ship_method_code,
11913 mode_of_transport = l_mode_of_transport,
11914 carrier_id = l_carrier_id,
11915 service_level = l_service_level,
11916 deliver_to_location_id = l_deliver_to_loc_id,
11917 line_direction = l_line_direction , -- J-IB-NPARIKH
11918 shipping_control = l_shipping_control, -- J-IB-NPARIKH
11919 --vendor_id = l_vendor_id, -- J-IB-NPARIKH
11920 --party_id = l_party_id -- J-IB-NPARIKH
11921 ignore_for_planning = l_ignore_for_planning,
11922 client_id = l_client_id -- LSP PROJECT : update clientId info on LPN Rec.
11923 WHERE delivery_detail_id = p_container_instance_id;
11924
11925 IF SQL%NOTFOUND THEN
11926 --dbms_output.put_line('could not update container ' || p_container_instance_id);
11927 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
11928 --
11929 IF l_debug_on THEN
11930 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
11931 END IF;
11932 --
11933 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
11934 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
11935 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11936 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11937 --
11938 IF l_debug_on THEN
11939 WSH_DEBUG_SV.pop(l_module_name);
11940 END IF;
11941 --
11942 return;
11943 END IF;
11944
11945 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11946
11947 IF l_num_warnings > 0 THEN
11948 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
11949 END IF;
11950
11951
11952 --
11953 IF l_debug_on THEN
11954 WSH_DEBUG_SV.pop(l_module_name);
11955 END IF;
11956 --
11957 EXCEPTION
11958
11959 WHEN Others THEN
11960 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_Cont_Attributes',l_module_name);
11961 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11962
11963 --
11964 IF l_debug_on THEN
11965 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11966 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11967 END IF;
11968 --
11969 END Update_Cont_Attributes;
11970
11971
11972
11973 /*
11974 -----------------------------------------------------------------------------
11975 PROCEDURE : Check_Cont_Attributes
11976 PARAMETERS : p_container_instance_id - delivery detail id for the container
11977 x_attr_flag - 'Y' or 'N' to determine if any of the grouping
11978 attributes other than org id and ship from has been populated.
11979 x_return_status - return status of API
11980 DESCRIPTION : This procedure fetched the grouping attribute columns of the
11981 container and checks to see if the columns are null or if they
11982 are populated. If any of the values are not null, then the API
11983 returns a x_attr_flag of 'Y' else it returns a 'N'.
11984 ------------------------------------------------------------------------------
11985 */
11986
11987 PROCEDURE Check_Cont_Attributes (
11988 p_container_instance_id IN NUMBER,
11989 x_attr_flag OUT NOCOPY VARCHAR2,
11990 x_return_status OUT NOCOPY VARCHAR2) IS
11991
11992 CURSOR Get_Detail_Attr (v_detail_id NUMBER) IS
11993 SELECT customer_id, intmed_ship_to_location_id,
11994 fob_code, freight_terms_code, ship_method_code,
11995 mode_of_transport, service_level, carrier_id,
11996 deliver_to_location_id
11997 FROM WSH_DELIVERY_DETAILS
11998 WHERE delivery_detail_id = v_detail_id;
11999
12000 l_cont_name VARCHAR2(30);
12001
12002 l_org_id NUMBER;
12003 l_cust_id NUMBER;
12004 l_intmed_loc_id NUMBER;
12005 l_fob_code VARCHAR2(30);
12006 l_freight_terms_code VARCHAR2(30);
12007 l_ship_method_code VARCHAR2(30);
12008 l_carrier_id NUMBER;
12009 l_mode_of_transport VARCHAR2(30);
12010 l_service_level VARCHAR2(30);
12011 l_deliver_to_loc_id NUMBER;
12012
12013 l_attr_flag VARCHAR2(1) := 'N';
12014
12015 --
12016 l_debug_on BOOLEAN;
12017 --
12018 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CHECK_CONT_ATTRIBUTES';
12019 --
12020 BEGIN
12021
12022 --dbms_output.put_line('in check cont attr with ' || p_container_instance_id);
12023
12024 --
12025 --
12026 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12027 --
12028 IF l_debug_on IS NULL
12029 THEN
12030 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12031 END IF;
12032 --
12033 IF l_debug_on THEN
12034 WSH_DEBUG_SV.push(l_module_name);
12035 --
12036 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
12037 END IF;
12038 --
12039 OPEN Get_Detail_Attr (p_container_instance_id);
12040
12041 FETCH Get_Detail_Attr INTO
12042 l_cust_id,
12043 l_intmed_loc_id,
12044 l_fob_code,
12045 l_freight_terms_code,
12046 l_ship_method_code,
12047 l_mode_of_transport,
12048 l_service_level,
12049 l_carrier_id,
12050 l_deliver_to_loc_id;
12051
12052 IF Get_Detail_Attr%NOTFOUND THEN
12053 CLOSE Get_Detail_Attr;
12054 --dbms_output.put_line('no detail found for ' || p_container_instance_id);
12055 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
12056 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12057 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
12058 x_attr_flag := 'N';
12059 --
12060 IF l_debug_on THEN
12061 WSH_DEBUG_SV.pop(l_module_name);
12062 END IF;
12063 --
12064 return;
12065 END IF;
12066
12067 IF Get_Detail_Attr%ISOPEN THEN
12068 CLOSE Get_Detail_Attr;
12069 END IF;
12070
12071 IF l_cust_id IS NOT NULL THEN
12072 l_attr_flag := 'Y';
12073 END IF;
12074
12075 IF l_intmed_loc_id IS NOT NULL THEN
12076 l_attr_flag := 'Y';
12077 END IF;
12078
12079 IF l_fob_code IS NOT NULL THEN
12080 l_attr_flag := 'Y';
12081 END IF;
12082
12083 IF l_freight_terms_code IS NOT NULL THEN
12084 l_attr_flag := 'Y';
12085 END IF;
12086
12087 IF l_service_level IS NOT NULL THEN
12088 l_attr_flag := 'Y';
12089 END IF;
12090 IF l_mode_of_transport IS NOT NULL THEN
12091 l_attr_flag := 'Y';
12092 END IF;
12093 IF l_carrier_id IS NOT NULL THEN
12094 l_attr_flag := 'Y';
12095 END IF;
12096 IF l_ship_method_code IS NOT NULL THEN
12097 l_attr_flag := 'Y';
12098 END IF;
12099
12100 IF l_deliver_to_loc_id IS NOT NULL THEN
12101 l_attr_flag := 'Y';
12102 END IF;
12103
12104 x_attr_flag := l_attr_flag;
12105
12106 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12107
12108 --
12109 IF l_debug_on THEN
12110 WSH_DEBUG_SV.pop(l_module_name);
12111 END IF;
12112 --
12113 EXCEPTION
12114
12115 WHEN Others THEN
12116 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Check_Cont_Attributes',l_module_name);
12117 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12118
12119 --
12120 IF l_debug_on THEN
12121 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12122 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12123 END IF;
12124 --
12125 END Check_Cont_Attributes;
12126
12127
12128 /*
12129 -----------------------------------------------------------------------------
12130 PROCEDURE : Update_Cont_Hierarchy
12131 PARAMETERS : p_delivery_detail_id - delivery detail id
12132 p_delivery_id - delivery id if container assigned to delivery
12133 p_container_instance_id - delivery detail id for the container
12134 x_return_status - return status of API
12135 DESCRIPTION : This procedure updates the grouping attribute columns of the
12136 the entire container hierarchy for the specified container
12137 with the grouping attribute values derived from the
12138 delivery line that is input.
12139 ------------------------------------------------------------------------------
12140 */
12141
12142 PROCEDURE Update_Cont_Hierarchy (
12143 p_del_detail_id IN NUMBER,
12144 p_delivery_id IN NUMBER,
12145 p_container_instance_id IN NUMBER,
12146 x_return_status OUT NOCOPY VARCHAR2) IS
12147
12148
12149 CURSOR Get_Child_Containers(v_cont_instance_id NUMBER) IS
12150 SELECT delivery_detail_id
12151 FROM wsh_delivery_assignments_v
12152 START WITH delivery_detail_id = v_cont_instance_id
12153 CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id;
12154
12155 CURSOR Get_Cont_Flag (v_detail_id NUMBER) IS
12156 SELECT container_flag
12157 FROM WSH_DELIVERY_DETAILS
12158 WHERE delivery_detail_id = v_detail_id;
12159
12160 l_master_cont_inst_id NUMBER;
12161 l_master_cont_name VARCHAR2(30);
12162
12163 l_cont_name VARCHAR2(30);
12164 l_cont_flag VARCHAR2(1);
12165
12166 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12167
12168 --
12169 l_debug_on BOOLEAN;
12170 --
12171 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_CONT_HIERARCHY';
12172 --
12173 BEGIN
12174
12175 --
12176 --
12177 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12178 --
12179 IF l_debug_on IS NULL
12180 THEN
12181 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12182 END IF;
12183 --
12184 IF l_debug_on THEN
12185 WSH_DEBUG_SV.push(l_module_name);
12186 --
12187 WSH_DEBUG_SV.log(l_module_name,'P_DEL_DETAIL_ID',P_DEL_DETAIL_ID);
12188 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
12189 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
12190 END IF;
12191 --
12192 --
12193 IF l_debug_on THEN
12194 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_CONT_ID',WSH_DEBUG_SV.C_PROC_LEVEL);
12195 END IF;
12196 --
12197 l_master_cont_inst_id := WSH_CONTAINER_UTILITIES.Get_Master_Cont_Id(p_container_instance_id);
12198
12199 IF l_master_cont_inst_id IS NULL THEN
12200 l_master_cont_inst_id := p_container_instance_id;
12201 END IF;
12202
12203 --dbms_output.put_line('calling get child containers with ' || l_master_cont_inst_id);
12204
12205 FOR cont IN Get_Child_Containers(l_master_cont_inst_id) LOOP
12206
12207 EXIT WHEN Get_Child_Containers%NOTFOUND;
12208
12209 --dbms_output.put_line('in loop with ' || cont.delivery_detail_id);
12210
12211 OPEN Get_Cont_Flag (cont.delivery_detail_id);
12212
12213 FETCH Get_Cont_Flag INTO l_cont_flag;
12214
12215 IF Get_Cont_Flag%NOTFOUND THEN
12216 --dbms_output.put_line('cont flag not found for ' || cont.delivery_detail_id);
12217 CLOSE Get_Cont_Flag;
12218 GOTO next_cont;
12219 END IF;
12220
12221 IF Get_Cont_Flag%ISOPEN THEN
12222 CLOSE Get_Cont_Flag;
12223 END IF;
12224
12225 --dbms_output.put_line('called get child containers with ' || cont.delivery_detail_id || ' and cont flag is ' || l_cont_flag);
12226
12227 IF (nvl(l_cont_flag,'N') = 'Y') THEN
12228
12229 --dbms_output.put_line('calling update cont attr with ' || cont.delivery_detail_id);
12230
12231 --
12232 IF l_debug_on THEN
12233 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
12234 END IF;
12235 --
12236 wsh_container_actions.Update_Cont_Attributes (
12237 p_del_detail_id,
12238 p_delivery_id,
12239 cont.delivery_detail_id,
12240 l_return_status);
12241 IF l_debug_on THEN
12242 WSH_DEBUG_SV.log(l_module_name,'return status-',l_return_status);
12243 END IF;
12244
12245 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12246 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
12247 --
12248 IF l_debug_on THEN
12249 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
12250 END IF;
12251 --
12252 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(cont.delivery_detail_id);
12253 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
12254 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12255 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
12256 END IF;
12257
12258 END IF;
12259
12260 <<next_cont>>
12261 null;
12262
12263 l_cont_flag := NULL;
12264
12265 END LOOP;
12266
12267 IF nvl(x_return_status,WSH_UTIL_CORE.G_RET_STS_SUCCESS) <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12268 --
12269 IF l_debug_on THEN
12270 WSH_DEBUG_SV.pop(l_module_name);
12271 END IF;
12272 --
12273 return;
12274 ELSE
12275 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12276 END IF;
12277
12278 --
12279 IF l_debug_on THEN
12280 WSH_DEBUG_SV.pop(l_module_name);
12281 END IF;
12282 --
12283 EXCEPTION
12284
12285 WHEN Others THEN
12286 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_Cont_Hierarchy',l_module_name);
12287 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12288
12289 --
12290 IF l_debug_on THEN
12291 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12292 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12293 END IF;
12294 --
12295 END Update_Cont_Hierarchy;
12296
12297
12298 /*
12299 -----------------------------------------------------------------------------
12300 PROCEDURE : Last_Assigned_Line
12301 PARAMETERS : p_delivery_detail_id - delivery detail id
12302 p_container_instance_id - delivery detail id for the container
12303 x_last_line_flag - 'Y' or 'N' depending on whether it is the
12304 last line in the container hierarchy or not.
12305 x_return_status - return status of API
12306 DESCRIPTION : This procedure checks to see if the delivery detail id is the
12307 last assigned line in the container hierarchy for the input
12308 container. If it is, x_last_line_flag is set to 'Y' else it is
12309 set to 'N'.
12310 ------------------------------------------------------------------------------
12311 */
12312
12313 PROCEDURE Last_Assigned_Line (
12314 p_del_detail_id IN NUMBER,
12315 p_container_instance_id IN NUMBER,
12316 x_last_line_flag OUT NOCOPY VARCHAR2,
12317 x_return_status OUT NOCOPY VARCHAR2) IS
12318
12319 CURSOR Get_Contents (v_detail_id NUMBER) IS
12320 SELECT count(*)
12321 FROM wsh_delivery_assignments_v
12322 START WITH delivery_detail_id = v_detail_id
12323 CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id;
12324
12325 CURSOR Get_Cont_Count (v_cont_id NUMBER) IS
12326 SELECT count(*)
12327 FROM wsh_delivery_assignments_v
12328 WHERE delivery_detail_id IN
12329 (SELECT delivery_detail_id
12330 FROM WSH_DELIVERY_DETAILS
12331 WHERE container_flag = 'Y')
12332 START WITH delivery_detail_id = v_cont_id
12333 CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id;
12334
12335 l_content_cnt NUMBER;
12336 l_cont_cnt NUMBER;
12337
12338 l_mast_cont_inst_id NUMBER;
12339
12340 --
12341 l_debug_on BOOLEAN;
12342 --
12343 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'LAST_ASSIGNED_LINE';
12344 --
12345 BEGIN
12346
12347 --
12348 --
12349 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12350 --
12351 IF l_debug_on IS NULL
12352 THEN
12353 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12354 END IF;
12355 --
12356 IF l_debug_on THEN
12357 WSH_DEBUG_SV.push(l_module_name);
12358 --
12359 WSH_DEBUG_SV.log(l_module_name,'P_DEL_DETAIL_ID',P_DEL_DETAIL_ID);
12360 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
12361 END IF;
12362 --
12363 --
12364 IF l_debug_on THEN
12365 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_CONT_ID',WSH_DEBUG_SV.C_PROC_LEVEL);
12366 END IF;
12367 --
12368 l_mast_cont_inst_id := WSH_CONTAINER_UTILITIES.Get_Master_Cont_Id (p_container_instance_id);
12369
12370 IF l_mast_cont_inst_id IS NULL THEN
12371 l_mast_cont_inst_id := p_container_instance_id;
12372 END IF;
12373
12374 OPEN Get_Contents (l_mast_cont_inst_id);
12375
12376 FETCH Get_Contents INTO l_content_cnt;
12377
12378 IF Get_Contents%NOTFOUND THEN
12379 CLOSE Get_Contents;
12380 x_last_line_flag := 'N';
12381 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
12382 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12383 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
12384 --
12385 IF l_debug_on THEN
12386 WSH_DEBUG_SV.pop(l_module_name);
12387 END IF;
12388 --
12389 return;
12390 END IF;
12391
12392 IF Get_Contents%ISOPEN THEN
12393 CLOSE Get_Contents;
12394 END IF;
12395
12396 OPEN Get_Cont_Count (l_mast_cont_inst_id);
12397
12398 FETCH Get_Cont_Count INTO l_cont_cnt;
12399
12400 IF Get_Cont_Count%NOTFOUND THEN
12401 CLOSE Get_Cont_Count;
12402 x_last_line_flag := 'N';
12403 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
12404 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12405 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
12406 --
12407 IF l_debug_on THEN
12408 WSH_DEBUG_SV.pop(l_module_name);
12409 END IF;
12410 --
12411 return;
12412 END IF;
12413
12414 IF Get_Cont_Count%ISOPEN THEN
12415 CLOSE Get_Cont_Count;
12416 END IF;
12417
12418 IF (l_content_cnt - l_cont_cnt) > 0 THEN
12419 x_last_line_flag := 'N';
12420 ELSE
12421 x_last_line_flag := 'Y';
12422 END IF;
12423
12424 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12425
12426 --
12427 IF l_debug_on THEN
12428 WSH_DEBUG_SV.pop(l_module_name);
12429 END IF;
12430 --
12431 EXCEPTION
12432
12433 WHEN Others THEN
12434 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Last_Assigned_Line',l_module_name);
12435 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12436
12437 --
12438 IF l_debug_on THEN
12439 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12440 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12441 END IF;
12442 --
12443 END Last_Assigned_Line;
12444
12445
12446
12447 -- J-IB-NPARIKH-{
12448 --
12449 --========================================================================
12450 -- PROCEDURE : pack_inbound_lines
12451 --
12452 -- PARAMETERS: p_lines_tbl Table of delivery lines to be packed
12453 -- p_lpn_id LPN ID
12454 -- p_lpn_name Container name as entered on ASN
12455 -- p_delivery_id Delivery ID for delivery, input lines belong to
12456 -- p_transactionType ASN/RECEIPT
12457 -- x_return_status Return status of the API
12458 --
12459 -- ASSUMPTION: All input lines belong to only one delivery, specified by p_delivery_id
12460 --
12461 -- COMMENT : This procedure is called only from the Inbound ASN/Receipt
12462 -- integration to pack delivery lines as per the ASN LPN
12463 -- Configuration.
12464 -- It performs the following steps:
12465 -- 01. Validate that input delivery id is not null and is a valid delivery.
12466 -- 02. Validate that input table of lines contain at least one record.
12467 -- 03. If input delivery is outbound, return with error.
12468 -- 04. Append LPN name with delivery name.
12469 -- 05. Create container instance
12470 -- 06. Update container delivery detail record with grouping attributes from delivery.
12471 -- 07. Assign container to delivery
12472 -- 08. Assign input lines to container
12473 -- 09. Calculate container dates
12474 -- 10. Calculate container weight/volume
12475 --
12476 --========================================================================
12477 --
12478 PROCEDURE pack_inbound_lines
12479 (
12480 p_lines_tbl IN WSH_UTIL_CORE.id_tab_type,
12481 p_lpn_id IN NUMBER,
12482 p_lpn_name IN VARCHAR2,
12483 p_delivery_id IN NUMBER,
12484 p_transactionType IN VARCHAR2 DEFAULT 'ASN',
12485 x_return_status OUT NOCOPY VARCHAR2,
12486 p_waybill_number IN VARCHAR2,
12487 p_caller IN VARCHAR2
12488 )
12489 IS
12490 --{
12491 --
12492 -- Get delivery information
12493 --
12494 CURSOR dlvy_csr (p_delivery_id IN NUMBER)
12495 IS
12496 SELECT organization_id,
12497 nvl(shipment_direction,'O') shipment_direction,
12498 initial_pickup_location_id,
12499 ultimate_dropoff_location_id,
12500 customer_id,
12501 intmed_ship_to_location_id,
12502 fob_code,
12503 freight_terms_code,
12504 ship_method_code,
12505 shipping_control,
12506 vendor_id,
12507 party_id,
12508 name,
12509 nvl(ignore_for_planning,'N') ignore_for_planning
12510 FROM wsh_new_deliveries wnd
12511 WHERE delivery_id = p_delivery_id;
12512 --
12513 --
12514 l_dlvy_rec dlvy_csr%ROWTYPE;
12515 --
12516 l_num_warnings NUMBER := 0;
12517 l_num_errors NUMBER := 0;
12518 l_return_status VARCHAR2(10);
12519 --
12520 l_cont_name VARCHAR2(100);
12521 l_container_instance_id NUMBER;
12522 l_rowid VARCHAR2(32767);
12523 l_cont_tbl WSH_UTIL_CORE.id_tab_type;
12524 --
12525 l_gross_weight NUMBER;
12526 l_net_weight NUMBER;
12527 l_volume NUMBER;
12528 l_cont_fill_pc NUMBER;
12529
12530 l_detail_tab WSH_UTIL_CORE.id_tab_type; -- DBI Project
12531 l_dbi_rs VARCHAR2(1); -- Return Status from DBI API
12532
12533 cursor l_dup_del_csr(p_lpn_name IN VARCHAR2)
12534 is
12535 select wnd.delivery_id,
12536 wnd.name,
12537 wnd.status_code,
12538 wda.delivery_detail_id
12539 from wsh_delivery_details wdd,
12540 wsh_delivery_assignments_v wda,
12541 wsh_new_deliveries wnd
12542 where wdd.container_name = p_lpn_name
12543 and wdd.container_flag = 'Y'
12544 and wda.delivery_detail_id = wdd.delivery_detail_id
12545 and wda.delivery_id = wnd.delivery_id(+);
12546
12547 l_dup_del_id NUMBER;
12548 l_dup_del_name VARCHAR2(32767);
12549 l_dup_del_status VARCHAR2(2);
12550 l_dup_cnt_id NUMBER;
12551 --
12552
12553 -- K LPN CONV. rv
12554 l_cont_tab wsh_util_core.id_tab_type;
12555 l_lpn_unit_weight NUMBER;
12556 l_lpn_unit_volume NUMBER;
12557 l_lpn_weight_uom_code VARCHAR2(100);
12558 l_lpn_volume_uom_code VARCHAR2(100);
12559 -- K LPN CONV. rv
12560 l_debug_on BOOLEAN;
12561 --
12562 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'pack_inbound_lines';
12563 --
12564 --}
12565 BEGIN
12566 --{
12567 SAVEPOINT pack_inbound_lines_sp;
12568 --
12569 l_debug_on := wsh_debug_interface.g_debug;
12570 --
12571 IF l_debug_on IS NULL THEN
12572 l_debug_on := wsh_debug_sv.is_debug_enabled;
12573 END IF;
12574 --
12575 IF l_debug_on THEN
12576 wsh_debug_sv.push(l_module_name);
12577 --
12578 wsh_debug_sv.LOG(l_module_name, 'p_lpn_id', p_lpn_id);
12579 wsh_debug_sv.LOG(l_module_name, 'p_delivery_id', p_delivery_id);
12580 wsh_debug_sv.LOG(l_module_name, 'p_transactionTYpe', p_transactionTYpe);
12581 END IF;
12582 --
12583 x_return_status := wsh_util_core.g_ret_sts_success;
12584 --
12585 --
12586 IF p_delivery_id IS NULL
12587 THEN
12588 --{
12589 --
12590 -- p_delivery_id is mandatory
12591 --
12592 FND_MESSAGE.SET_NAME('WSH', 'WSH_REQUIRED_FIELD_NULL');
12593 FND_MESSAGE.SET_TOKEN('FIELD_NAME', 'p_delivery_id');
12594 WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12595 --
12596 RAISE FND_API.G_EXC_ERROR;
12597 --}
12598 END IF;
12599 --
12600 IF p_lines_tbl.count = 0
12601 THEN
12602 --{
12603 --
12604 -- p_lines_tbl should have at least one record
12605 --
12606 FND_MESSAGE.SET_NAME('WSH', 'WSH_EMPTY_TABLE_ERROR');
12607 FND_MESSAGE.SET_TOKEN('TABLE_NAME', 'p_lines_tbl');
12608 WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12609 --
12610 RAISE FND_API.G_EXC_ERROR;
12611 --}
12612 END IF;
12613 --
12614 --
12615 OPEN dlvy_csr(p_delivery_id);
12616 FETCH dlvy_csr INTO l_dlvy_rec;
12617 CLOSE dlvy_csr;
12618 --
12619 IF l_dlvy_rec.initial_pickup_location_id IS NULL
12620 THEN
12621 --{
12622 FND_MESSAGE.SET_NAME('WSH','WSH_DLVY_NOT_EXIST');
12623 FND_MESSAGE.SET_TOKEN('DELIVERY_ID', p_delivery_id);
12624 WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12625 --
12626 RAISE FND_API.G_EXC_ERROR;
12627 --}
12628 END IF;
12629 --
12630 --
12631 IF l_dlvy_rec.shipment_direction IN ('O','IO')
12632 THEN
12633 --{
12634 --
12635 -- Invalid operation for outbound delivery
12636 --
12637 FND_MESSAGE.SET_NAME('WSH','WSH_NOT_IB_DLVY_ERROR');
12638 FND_MESSAGE.SET_TOKEN('DELIVERY_NAME', l_dlvy_rec.name);
12639 WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12640 --
12641 RAISE FND_API.G_EXC_ERROR;
12642 --}
12643 END IF;
12644 --
12645 --
12646 --l_cont_name := SUBSTRB(p_lpn_id || '.' || l_dlvy_rec.name,1,30);
12647 l_cont_name := p_lpn_name;
12648 --
12649 -- commented out the following code because this is not applicable anymore
12650 -- as container name is not unique in WSH. This check is not required.
12651 /*
12652 open l_dup_del_csr(p_lpn_name);
12653 fetch l_dup_del_csr into l_dup_del_id,l_dup_del_name, l_dup_del_status, l_dup_cnt_id;
12654 close l_dup_del_csr;
12655
12656 IF l_debug_on THEN
12657 WSH_DEBUG_SV.log(l_module_name,'l_dup_del_id', l_dup_del_id);
12658 WSH_DEBUG_SV.log(l_module_name,'l_dup_del_name', l_dup_del_name);
12659 WSH_DEBUG_SV.log(l_module_name,'l_dup_del_status', l_dup_del_status);
12660 WSH_DEBUG_SV.log(l_module_name,'l_dup_cnt_id', l_dup_cnt_id);
12661 END IF;
12662
12663 IF(l_dup_del_id is not null AND nvl(l_dup_del_status,'OP') = 'CL') THEN
12664 --{
12665 update wsh_delivery_details
12666 set container_name = SUBSTRB(p_lpn_name || '.' ||l_dup_del_name,1,50)
12667 where delivery_detail_id = l_dup_cnt_id;
12668 --}
12669 ELSIF(l_dup_cnt_id IS NOT NULL) THEN
12670 --{
12671 l_cont_name := SUBSTRB(p_lpn_name || '.' || l_dlvy_rec.name,1,50);
12672 --}
12673 END IF;
12674 */
12675 --l_cont_name := SUBSTRB(p_lpn_name || '.' || l_dlvy_rec.name,1,50);
12676 --
12677 --
12678 IF l_debug_on THEN
12679 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Create_Cont_Instance_Multi',WSH_DEBUG_SV.C_PROC_LEVEL);
12680 END IF;
12681 --
12682 G_CALLED_FROM_INBOUND := TRUE;
12683 --
12684 --
12685 -- K LPN CONV. rv
12686 --
12687 WSH_CONTAINER_ACTIONS.Create_Cont_Instance_Multi(
12688 x_cont_name => l_cont_name,
12689 p_cont_item_id => NULL,
12690 x_cont_instance_id => l_container_instance_id,
12691 p_par_detail_id => NULL,
12692 p_organization_id => l_dlvy_rec.organization_id,
12693 p_container_type_code => NULL,
12694 p_num_of_containers => 1,
12695 x_row_id => l_rowid,
12696 x_return_status => l_return_status,
12697 x_cont_tab => l_cont_tab,
12698 x_unit_weight => l_lpn_unit_weight,
12699 x_unit_volume => l_lpn_unit_volume,
12700 x_weight_uom_code => l_lpn_weight_uom_code,
12701 x_volume_uom_code => l_lpn_volume_uom_code,
12702 p_lpn_id => p_lpn_id,
12703 p_ignore_for_planning => l_dlvy_rec.ignore_for_planning,
12704 p_caller => 'WSH_IB_PACK');
12705 --
12706 IF l_debug_on THEN
12707 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
12708 WSH_DEBUG_SV.log(l_module_name,'count of l_cont_tab',l_cont_tab.count);
12709 END IF;
12710 l_container_instance_id := l_cont_tab(1);
12711 -- K LPN CONV. rv
12712 --
12713 --
12714 G_CALLED_FROM_INBOUND := FALSE;
12715 --
12716 wsh_util_core.api_post_call
12717 (
12718 p_return_status => l_return_status,
12719 x_num_warnings => l_num_warnings,
12720 x_num_errors => l_num_errors
12721 );
12722 --
12723 --
12724 -- Update Container record with delivery grouping attributes
12725 --
12726 UPDATE WSH_DELIVERY_DETAILS
12727 SET lpn_id = p_lpn_id,
12728 shipped_quantity = DECODE(p_transactionType,'ASN',1,shipped_quantity),
12729 received_quantity = DECODE(p_transactionType,'RECEIPT',1,received_quantity),
12730 released_status = DECODE(p_transactionType,'ASN','C','RECEIPT','L','C'),
12731 src_requested_quantity = requested_quantity,
12732 src_requested_quantity_uom = 'Ea' ,
12733 requested_quantity_uom = 'Ea' ,
12734 line_direction = l_dlvy_rec.shipment_direction,
12735 ship_from_location_id = l_dlvy_rec.initial_pickup_location_id,
12736 ship_to_location_id = l_dlvy_rec.ultimate_dropoff_location_id,
12737 customer_id = l_dlvy_rec.customer_id,
12738 intmed_ship_to_location_id = l_dlvy_rec.intmed_ship_to_location_id,
12739 fob_code = l_dlvy_rec.fob_code,
12740 freight_terms_code = l_dlvy_rec.freight_terms_code,
12741 ship_method_code = l_dlvy_rec.ship_method_code,
12742 shipping_control = l_dlvy_rec.shipping_control,
12743 vendor_id = l_dlvy_rec.vendor_id,
12744 party_id = l_dlvy_rec.party_id,
12745 ignore_for_planning = l_dlvy_rec.ignore_for_planning,
12746 tracking_number = NVL(p_waybill_number,tracking_number),
12747 last_update_date = SYSDATE,
12748 last_updated_by = FND_GLOBAL.USER_ID,
12749 last_update_login = FND_GLOBAL.LOGIN_ID
12750 WHERE rowid = l_rowid;
12751 --
12752 -- l_container_instance_id is the delivery_detail_id, use for DBI call
12753 -- DBI Project
12754 -- Update of wsh_delivery_details where requested_quantity/released_status
12755 -- are changed, call DBI API after the update.
12756 -- This API will also check for DBI Installed or not
12757 IF l_debug_on THEN
12758 WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail id-',l_container_instance_id);
12759 END IF;
12760 l_detail_tab(1) := l_container_instance_id;
12761 WSH_INTEGRATION.DBI_Update_Detail_Log
12762 (p_delivery_detail_id_tab => l_detail_tab,
12763 p_dml_type => 'UPDATE',
12764 x_return_status => l_dbi_rs);
12765
12766 IF l_debug_on THEN
12767 WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
12768 END IF;
12769
12770 IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
12771 x_return_status := l_dbi_rs;
12772 -- just pass this return status to caller API
12773 IF l_debug_on THEN
12774 WSH_DEBUG_SV.pop(l_module_name,'DBI API Returned Unexpected error '||x_return_status);
12775 WSH_DEBUG_SV.pop(l_module_name);
12776 END IF;
12777 return;
12778 END IF;
12779 -- treat all other return status as Success
12780 -- End of Code for DBI Project
12781 --
12782 -- Assign container to delivery
12783 --
12784 UPDATE wsh_delivery_assignments_v
12785 SET delivery_id = p_delivery_id,
12786 last_update_date = SYSDATE,
12787 last_updated_by = FND_GLOBAL.USER_ID,
12788 last_update_login = FND_GLOBAL.LOGIN_ID
12789 WHERE delivery_detail_id = l_container_instance_id;
12790 --
12791 --
12792 -- Assign lines to container
12793 --
12794 FORALL i IN p_lines_tbl.FIRST..p_lines_tbl.LAST
12795 UPDATE wsh_delivery_assignments_v
12796 SET parent_delivery_detail_id = l_container_instance_id,
12797 last_update_date = SYSDATE,
12798 last_updated_by = FND_GLOBAL.USER_ID,
12799 last_update_login = FND_GLOBAL.LOGIN_ID
12800 WHERE delivery_detail_id = p_lines_tbl(i);
12801 --
12802 --
12803 l_cont_tbl(1) := l_container_instance_id;
12804 --
12805 --
12806 --
12807 IF l_debug_on THEN
12808 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit wsh_tp_release.calculate_cont_del_tpdates',WSH_DEBUG_SV.C_PROC_LEVEL);
12809 END IF;
12810 --
12811 --
12812 -- Calculate container dates
12813 --
12814 wsh_tp_release.calculate_cont_del_tpdates
12815 (
12816 p_entity => 'LPN',
12817 p_entity_ids => l_cont_tbl,
12818 x_return_status => l_return_status
12819 );
12820 --
12821 wsh_util_core.api_post_call
12822 (
12823 p_return_status => l_return_status,
12824 x_num_warnings => l_num_warnings,
12825 x_num_errors => l_num_errors
12826 );
12827 --
12828 IF nvl(p_caller, '!!!!') <> 'WSH_VENDOR_MERGE' THEN
12829 --{
12830
12831 IF l_debug_on THEN
12832 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
12833 END IF;
12834 --
12835 --
12836 -- Calculate container weight and volume
12837 --
12838 WSH_TPA_CONTAINER_PKG.Container_Weight_Volume(
12839 p_container_instance_id => l_container_instance_id,
12840 p_override_flag => 'Y',
12841 p_calc_wv_if_frozen => 'N',
12842 x_gross_weight => l_gross_weight,
12843 x_net_weight => l_net_weight,
12844 x_volume => l_volume ,
12845 p_fill_pc_flag => 'Y',
12846 x_cont_fill_pc => l_cont_fill_pc,
12847 x_return_status => l_return_status);
12848 --
12849 IF l_debug_on THEN
12850 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
12851 END IF;
12852 --}
12853 END IF;
12854
12855 --
12856 --
12857 IF l_num_errors > 0
12858 THEN
12859 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12860 ELSIF l_num_warnings > 0
12861 THEN
12862 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12863 ELSE
12864 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12865 END IF;
12866 --
12867 IF l_debug_on THEN
12868 wsh_debug_sv.pop(l_module_name);
12869 END IF;
12870 --
12871 --}
12872 EXCEPTION
12873 --{
12874 --
12875 WHEN FND_API.G_EXC_ERROR THEN
12876
12877 G_CALLED_FROM_INBOUND := FALSE;
12878 ROLLBACK TO pack_inbound_lines_sp;
12879 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12880 --
12881 IF l_debug_on THEN
12882 WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
12883 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
12884 END IF;
12885 --
12886 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
12887
12888 G_CALLED_FROM_INBOUND := FALSE;
12889 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
12890 ROLLBACK TO pack_inbound_lines_sp;
12891 --
12892 IF l_debug_on THEN
12893 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12894 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
12895 END IF;
12896 --
12897 WHEN WSH_UTIL_CORE.G_EXC_WARNING THEN
12898
12899 G_CALLED_FROM_INBOUND := FALSE;
12900 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12901 --
12902 IF l_debug_on THEN
12903 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_UTIL_CORE.G_EXC_WARNING exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
12904 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_UTIL_CORE.G_EXC_WARNING');
12905 END IF;
12906 --
12907 WHEN OTHERS THEN
12908
12909 G_CALLED_FROM_INBOUND := FALSE;
12910 ROLLBACK TO pack_inbound_lines_sp;
12911 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
12912 wsh_util_core.default_handler('wsh_container_actions.pack_inbound_lines', l_module_name);
12913 IF l_debug_on THEN
12914 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12915 END IF;
12916 --
12917 --}
12918 END pack_inbound_lines;
12919 --
12920 --
12921 --
12922 --========================================================================
12923 -- PROCEDURE : unpack_inbound_delivery
12924 --
12925 -- PARAMETERS: p_delivery_id Delivery ID for delivery, input lines belong to
12926 -- x_return_status Return status of the API
12927 --
12928 --
12929 -- COMMENT : This procedure is called only from the cancel ASN/Revert ASN events
12930 -- It performs the following steps:
12931 -- 01. Validate that input delivery id is not null and is a valid delivery.
12932 -- 02. If input delivery is outbound, return with error.
12933 -- 03. Delete all containers within the delivery (WDD and WDA)
12934 -- 04. Unassign all lines (within delivery) from container.
12935 --
12936 --========================================================================
12937 --
12938 --
12939 PROCEDURE unpack_inbound_delivery
12940 (
12941 p_delivery_id IN NUMBER,
12942 x_return_status OUT NOCOPY VARCHAR2
12943 )
12944 IS
12945 --{
12946 CURSOR dlvy_csr (p_delivery_id IN NUMBER)
12947 IS
12948 SELECT nvl(shipment_direction,'O') shipment_direction,
12949 initial_pickup_location_id,
12950 name
12951 FROM wsh_new_deliveries wnd
12952 WHERE delivery_id = p_delivery_id;
12953 --
12954 l_dlvy_rec dlvy_csr%ROWTYPE;
12955 --
12956 --
12957 l_num_warnings NUMBER := 0;
12958 l_num_errors NUMBER := 0;
12959 l_return_status VARCHAR2(10);
12960 --
12961 l_lines_tbl WSH_UTIL_CORE.id_tab_type;
12962 --
12963 l_debug_on BOOLEAN;
12964 --
12965 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'unpack_inbound_delivery';
12966 --
12967 --}
12968 BEGIN
12969 --{
12970 SAVEPOINT unpack_inbound_delivery_sp;
12971 --
12972 l_debug_on := wsh_debug_interface.g_debug;
12973 --
12974 IF l_debug_on IS NULL THEN
12975 l_debug_on := wsh_debug_sv.is_debug_enabled;
12976 END IF;
12977 --
12978 IF l_debug_on THEN
12979 wsh_debug_sv.push(l_module_name);
12980 --
12981 wsh_debug_sv.LOG(l_module_name, 'p_delivery_id', p_delivery_id);
12982 END IF;
12983 --
12984 x_return_status := wsh_util_core.g_ret_sts_success;
12985 --
12986 --
12987 IF p_delivery_id IS NULL
12988 THEN
12989 --{
12990 --
12991 -- p_delivery_id is mandatory
12992 --
12993 FND_MESSAGE.SET_NAME('WSH', 'WSH_REQUIRED_FIELD_NULL');
12994 FND_MESSAGE.SET_TOKEN('FIELD_NAME', 'p_delivery_id');
12995 WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12996 --
12997 RAISE FND_API.G_EXC_ERROR;
12998 --}
12999 END IF;
13000 --
13001 --
13002 OPEN dlvy_csr(p_delivery_id);
13003 FETCH dlvy_csr INTO l_dlvy_rec;
13004 CLOSE dlvy_csr;
13005 --
13006 IF l_dlvy_rec.initial_pickup_location_id IS NULL
13007 THEN
13008 --{
13009 FND_MESSAGE.SET_NAME('WSH','WSH_DLVY_NOT_EXIST');
13010 FND_MESSAGE.SET_TOKEN('DELIVERY_ID', p_delivery_id);
13011 WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
13012 --
13013 RAISE FND_API.G_EXC_ERROR;
13014 --}
13015 END IF;
13016 --
13017 --
13018 IF l_dlvy_rec.shipment_direction IN ('O','IO')
13019 THEN
13020 --{
13021 --
13022 -- Invalid operation for outbound delivery
13023 --
13024 FND_MESSAGE.SET_NAME('WSH','WSH_NOT_IB_DLVY_ERROR');
13025 FND_MESSAGE.SET_TOKEN('DELIVERY_NAME', l_dlvy_rec.name);
13026 WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
13027 --
13028 RAISE FND_API.G_EXC_ERROR;
13029 --}
13030 END IF;
13031 --
13032 --
13033 -- Delete all containers within the delivery
13034 --
13035 DELETE WSH_DELIVERY_DETAILS
13036 WHERE DELIVERY_DETAIL_ID IN (
13037 SELECT wdd.delivery_detail_id
13038 FROM wsh_delivery_details wdd,
13039 wsh_delivery_assignments_v wda
13040 WHERE wda.delivery_id = p_delivery_id
13041 AND wda.delivery_detail_id = wdd.delivery_detail_id
13042 AND NVL(wdd.container_flag,'N') = 'Y'
13043 )
13044 RETURNING delivery_detail_id BULK COLLECT INTO l_lines_tbl;
13045 --
13046 --
13047 IF l_lines_tbl.COUNT > 0
13048 THEN
13049 --{
13050 FORALL i IN l_lines_tbl.FIRST..l_lines_tbl.LAST
13051 DELETE wsh_delivery_assignments_v
13052 WHERE delivery_detail_id = l_lines_tbl(i);
13053 --}
13054 END IF;
13055 --
13056 --
13057 --
13058 -- Unassign all lines from containers.
13059 --
13060 UPDATE wsh_delivery_assignments_v
13061 SET parent_delivery_detail_id = NULL,
13062 last_update_date = SYSDATE,
13063 last_updated_by = FND_GLOBAL.USER_ID,
13064 last_update_login = FND_GLOBAL.LOGIN_ID
13065 WHERE delivery_id = p_delivery_id;
13066 --
13067 --
13068 IF l_num_errors > 0
13069 THEN
13070 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13071 ELSIF l_num_warnings > 0
13072 THEN
13073 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
13074 ELSE
13075 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13076 END IF;
13077 --
13078 IF l_debug_on THEN
13079 wsh_debug_sv.pop(l_module_name);
13080 END IF;
13081 --
13082 --}
13083 EXCEPTION
13084 --{
13085 --
13086 WHEN FND_API.G_EXC_ERROR THEN
13087
13088 ROLLBACK TO unpack_inbound_delivery_sp;
13089 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13090 --
13091 IF l_debug_on THEN
13092 WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13093 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
13094 END IF;
13095 --
13096 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
13097
13098 ROLLBACK TO unpack_inbound_delivery_sp;
13099 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
13100 --
13101 IF l_debug_on THEN
13102 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13103 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
13104 END IF;
13105 --
13106 WHEN WSH_UTIL_CORE.G_EXC_WARNING THEN
13107 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
13108 --
13109 IF l_debug_on THEN
13110 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_UTIL_CORE.G_EXC_WARNING exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13111 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_UTIL_CORE.G_EXC_WARNING');
13112 END IF;
13113 --
13114 WHEN OTHERS THEN
13115
13116 ROLLBACK TO unpack_inbound_delivery_sp;
13117 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
13118 wsh_util_core.default_handler('wsh_container_actions.unpack_inbound_delivery', l_module_name);
13119 IF l_debug_on THEN
13120 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13121 END IF;
13122 --
13123 --}
13124 END unpack_inbound_delivery;
13125 --
13126 --
13127 -- J-IB-NPARIKH-}
13128 /* This procedure is a temporarily procedure that will create
13129 container names and will be deleted once WMS provides the functionality.
13130 lpn conv
13131 */
13132
13133 PROCEDURE Create_Multiple_Cont_name (
13134 p_cont_name IN VARCHAR2,
13135 p_cont_name_pre IN VARCHAR2,
13136 p_cont_name_suf IN VARCHAR2,
13137 p_cont_name_num IN NUMBER,
13138 p_cont_name_dig IN NUMBER,
13139 p_quantity IN NUMBER,
13140 x_cont_names OUT NOCOPY WSH_GLBL_VAR_STRCT_GRP.v50_Tbl_Type,
13141 x_return_status OUT NOCOPY VARCHAR2) IS
13142
13143 CURSOR Get_Exist_Cont(v_cont_name VARCHAR2) IS
13144 SELECT NVL(MAX(1),0) FROM DUAL
13145 WHERE EXISTS ( SELECT 1 FROM WSH_DELIVERY_DETAILS
13146 WHERE container_name = v_cont_name
13147 AND container_flag = 'Y');
13148
13149 l_cont_name VARCHAR2(30);
13150 l_cont_name_num NUMBER;
13151 l_cont_inst_id NUMBER;
13152 l_row_id VARCHAR2(30);
13153 l_cont_cnt NUMBER;
13154 l_all_null_flag VARCHAR2(1) := 'Y';
13155 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13156
13157 --
13158 l_debug_on BOOLEAN;
13159 --
13160 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CREATE_MULTIPLE_CONT_NAME';
13161 --
13162 BEGIN
13163
13164 --
13165 --
13166 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13167 --
13168 IF l_debug_on IS NULL
13169 THEN
13170 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13171 END IF;
13172 --
13173 IF l_debug_on THEN
13174 WSH_DEBUG_SV.push(l_module_name);
13175 --
13176 WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME',P_CONT_NAME);
13177 WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_PRE',P_CONT_NAME_PRE);
13178 WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_SUF',P_CONT_NAME_SUF);
13179 WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_NUM',P_CONT_NAME_NUM);
13180 WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_DIG',P_CONT_NAME_DIG);
13181 WSH_DEBUG_SV.log(l_module_name,'P_QUANTITY',P_QUANTITY);
13182 END IF;
13183 --
13184 IF ( NVL(p_quantity,0) <= 0 ) THEN
13185 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
13186 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13187 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
13188 --
13189 IF l_debug_on THEN
13190 WSH_DEBUG_SV.pop(l_module_name);
13191 END IF;
13192 --
13193 return;
13194 END IF;
13195
13196 IF p_cont_name_pre IS NULL AND p_cont_name_num IS NULL AND p_cont_name_dig IS NULL AND p_cont_name_suf IS NULL THEN
13197 l_all_null_flag := 'Y';
13198 ELSE
13199 l_all_null_flag := 'N';
13200 END IF;
13201
13202 l_cont_name_num := NVL(p_cont_name_num,0);
13203 FOR i IN 1..p_quantity LOOP
13204 IF p_quantity = 1 AND p_cont_name IS NOT NULL THEN
13205 l_cont_name := p_cont_name;
13206 ELSIF l_all_null_flag = 'Y' THEN
13207 l_cont_name := NULL;
13208 ELSE
13209 -- if p..dig is null don't do padding
13210 IF (p_cont_name_dig IS NOT NULL) THEN
13211 l_cont_name := p_cont_name_pre || LPAD(to_char(l_cont_name_num),p_cont_name_dig,'0') || p_cont_name_suf;
13212 ELSE
13213 l_cont_name := p_cont_name_pre || to_char(l_cont_name_num)|| p_cont_name_suf;
13214 END IF;
13215 END IF;
13216 l_cont_name_num := l_cont_name_num + 1;
13217
13218 OPEN Get_Exist_Cont(l_cont_name);
13219 FETCH Get_Exist_Cont INTO l_cont_cnt;
13220 CLOSE Get_Exist_Cont;
13221
13222 IF l_cont_cnt = 0 THEN
13223 --
13224 x_cont_names(x_cont_names.count+1) := l_cont_name;
13225 ELSE
13226 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13227 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NAME_DUPLICATE');
13228 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
13229 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
13230 END IF;
13231 END LOOP;
13232
13233 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
13234 x_return_status := l_return_status;
13235 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
13236 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
13237 --
13238 IF l_debug_on THEN
13239 WSH_DEBUG_SV.pop(l_module_name);
13240 END IF;
13241 --
13242 return;
13243 END IF;
13244
13245 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13246
13247 --
13248 IF l_debug_on THEN
13249 WSH_DEBUG_SV.pop(l_module_name);
13250 END IF;
13251 --
13252 EXCEPTION
13253
13254 WHEN Others THEN
13255 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Create_Multiple_Cont_names',l_module_name);
13256 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13257
13258
13259 IF l_debug_on THEN
13260 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13261 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13262 END IF;
13263 --
13264 END Create_Multiple_Cont_name;
13265
13266
13267 /* ----------------------------------------------------------------------
13268
13269 PROCEDURE Update_child_inv_info
13270 This procedure updates all the containers included in p_container_id
13271 with p_locator_id and p_subinventory (downward in hirearchy)
13272
13273 Prameters
13274 p_container_id
13275 p_locator_id
13276 p_subinventory
13277 x_return_status
13278
13279 ------------------------------------------------------------------------*/
13280
13281 --lpn conv
13282 PROCEDURE Update_child_inv_info(p_container_id IN NUMBER,
13283 P_locator_id IN NUMBER,
13284 P_subinventory IN VARCHAR2,
13285 X_return_status OUT NOCOPY VARCHAR2)
13286 IS
13287
13288
13289 --
13290 l_debug_on BOOLEAN;
13291 --
13292 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_CHILD_INV_INFO';
13293 --
13294 l_container_id NUMBER;
13295
13296 child_cont_locked EXCEPTION;
13297 PRAGMA EXCEPTION_INIT(child_cont_locked, -00054);
13298
13299 CURSOR lock_containers(v_container_id NUMBER) IS
13300 SELECT delivery_detail_id
13301 FROM wsh_delivery_details
13302 --WHERE container_flag = 'Y'
13303 WHERE delivery_detail_id IN
13304 (SELECT delivery_detail_id
13305 FROM wsh_delivery_assignments
13306 START WITH parent_delivery_detail_id = v_container_id
13307 CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id
13308 )
13309 FOR UPDATE NOWAIT;
13310
13311 BEGIN
13312
13313 --
13314 --
13315 SAVEPOINT s_Update_child_inv_info;
13316 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13317 --
13318 IF l_debug_on IS NULL
13319 THEN
13320 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13321 END IF;
13322 --
13323 IF l_debug_on THEN
13324 WSH_DEBUG_SV.push(l_module_name);
13325 --
13326 WSH_DEBUG_SV.log(l_module_name,'p_container_id',p_container_id);
13327 WSH_DEBUG_SV.log(l_module_name,'P_locator_id',P_locator_id);
13328 WSH_DEBUG_SV.log(l_module_name,'P_subinventory',P_subinventory);
13329 END IF;
13330 --
13331
13332
13333 OPEN lock_containers(p_container_id);
13334 LOOP --{
13335 FETCH lock_containers INTO l_container_id;
13336 EXIT WHEN lock_containers%NOTFOUND;
13337
13338 UPDATE wsh_delivery_details
13339 SET locator_id = p_locator_id,
13340 subinventory = p_subinventory
13341 WHERE delivery_detail_id = l_container_id;
13342
13343 END LOOP ; --}
13344
13345 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13346
13347 --
13348 IF l_debug_on THEN
13349 WSH_DEBUG_SV.pop(l_module_name);
13350 END IF;
13351 --
13352 EXCEPTION
13353
13354 WHEN child_cont_locked THEN
13355 rollback to s_Update_child_inv_info;
13356 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13357 --
13358 IF l_debug_on THEN
13359 WSH_DEBUG_SV.logmsg(l_module_name,'Could not lock record for the containers ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13360 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:child_cont_locked');
13361 END IF;
13362 --
13363 WHEN Others THEN
13364 rollback to s_Update_child_inv_info;
13365 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_child_inv_info',l_module_name);
13366 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13367
13368
13369 IF l_debug_on THEN
13370 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13371 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13372 END IF;
13373 --
13374 END Update_child_inv_info;
13375
13376 -----------------------------------------------------------------------------------------------------------------------
13377 --
13378 -- Name:
13379 -- Assign_Container_to_Consol
13380 --
13381 -- Purpose:
13382 -- This API will assign a content LPN to a consol LPN.
13383 -- If the parent LPN is not a consol LPN, we will convert it
13384 -- to a consol LPN and create the corresponding consol deliveries
13385 -- and trips.
13386 --
13387 -- Parameters:
13388 -- p_child_container_id: LPN that needs to be assigned.
13389 -- p_parent_container_id: LPN that will be assigned to
13390 -- p_caller: Calling entity/action
13391 -- x_return_status: status
13392
13393 PROCEDURE Assign_Container_to_Consol(
13394 p_child_container_id IN NUMBER,
13395 p_parent_container_id IN NUMBER,
13396 p_caller IN VARCHAR2,
13397 x_return_status OUT NOCOPY VARCHAR2) IS
13398
13399 cursor c_get_container_info(p_delivery_detail_id in number) is
13400 select d.container_flag, a.delivery_id, a.parent_delivery_id, d.inventory_item_id, d.organization_id
13401 from wsh_delivery_details d, wsh_delivery_assignments a
13402 where d.delivery_detail_id = p_delivery_detail_id
13403 and d.container_flag in ('Y', 'C')
13404 and a.type in ('C', 'S')
13405 and a.delivery_detail_id = d.delivery_detail_id
13406 and a.parent_delivery_detail_id is null
13407 and a.delivery_id is not null;
13408
13409
13410
13411 l_parent_container_info c_get_container_info%rowtype;
13412 l_child_container_info c_get_container_info%rowtype;
13413 l_new_parent_delivery_id NUMBER := NULL;
13414 l_del_tab wsh_util_core.id_tab_type;
13415
13416
13417 -- This cursor accepts a given delivery, p_del_id,
13418 -- and looks for consol deliveries that share the
13419 -- same trip as this delivery from the initial pickup location.
13420
13421 cursor c_get_trip_info(p_del_id in number) is
13422 select s.trip_id, d2.delivery_id
13423 from wsh_delivery_legs l1, wsh_delivery_legs l2,
13424 wsh_new_deliveries d1, wsh_new_deliveries d2,
13425 wsh_trip_stops s
13426 where l1.delivery_id = p_del_id
13427 and l1.delivery_id = d1.delivery_id -- bug 4891897
13428 and s.stop_id = l1.pick_up_stop_id
13429 and s.stop_location_id = d1.initial_pickup_location_id
13430 and l1.pick_up_stop_id = l2.pick_up_stop_id
13431 and l2.delivery_id = d2.delivery_id
13432 and d2.delivery_type = 'CONSOLIDATION';
13433
13434 cursor c_get_child_details(p_parent_detail_id in number) IS
13435 SELECT delivery_detail_id
13436 FROM wsh_delivery_assignments_v
13437 WHERE parent_delivery_detail_id = p_parent_detail_id;
13438
13439 /*CURSOR Get_Cont_Item_Info (v_cont_item_id NUMBER, v_org_id NUMBER) IS
13440 SELECT Container_Type_Code, weight_uom_code, volume_uom_code,
13441 minimum_fill_percent, maximum_load_weight, internal_volume, primary_uom_code,
13442 unit_weight, unit_volume
13443 FROM MTL_SYSTEM_ITEMS
13444 WHERE inventory_item_id = v_cont_item_id
13445 AND container_item_flag = 'Y'
13446 AND organization_id = v_org_id
13447 AND nvl(vehicle_item_flag,'N') = 'N'
13448 AND shippable_item_flag = 'Y';
13449
13450 */
13451
13452 CURSOR c_get_trip_id(p_delivery_id in number) IS
13453 SELECT trip_id
13454 FROM wsh_trip_stops s, wsh_delivery_legs l
13455 WHERE s.stop_id = l.pick_up_stop_id
13456 AND l.delivery_id = p_delivery_id;
13457
13458 l_assign_flag VARCHAR2(1);
13459 l_del_info_tab WSH_NEW_DELIVERIES_PVT.Delivery_Attr_Tbl_Type;
13460 l_parent_del_info_rec WSH_NEW_DELIVERIES_PVT.Delivery_Rec_Type;
13461 l_del_asg_info_rec WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_TYPE;
13462 l_child_details_tab wsh_util_core.id_tab_type;
13463 l_dummy_asg_tab wsh_util_core.id_tab_type;
13464 l_wv_delivery_tab wsh_util_core.id_tab_type;
13465 l_child_delivery_id NUMBER;
13466 l_trip_id NUMBER;
13467 l_parent_trip_id NUMBER;
13468 l_parent_consol_del_id NUMBER;
13469 l_child_trip_id NUMBER;
13470 l_child_consol_del_id NUMBER;
13471 l_unassign_dels wsh_util_core.id_tab_type;
13472 l_trip_id_tab wsh_util_core.id_tab_type;
13473
13474 l_cont_gross_weight NUMBER;
13475 l_cont_net_weight NUMBER;
13476 l_cont_volume NUMBER;
13477 l_cont_fill_pc NUMBER;
13478
13479 l_gross_wt NUMBER;
13480 l_net_wt NUMBER;
13481 l_volume NUMBER;
13482
13483 l_num_warnings NUMBER := 0;
13484 l_num_errors NUMBER := 0;
13485 l_return_status VARCHAR2(30);
13486
13487 CURSOR c_get_filled_vol(p_container_id NUMBER) IS
13488 SELECT filled_volume
13489 FROM WSH_DELIVERY_DETAILS
13490 WHERE delivery_detail_id = p_container_id;
13491
13492 l_filled_volume NUMBER;
13493
13494
13495 WSH_INVALID_CHILD EXCEPTION;
13496 WSH_INVALID_PARENT EXCEPTION;
13497 WSH_INVALID_CONSOL_ASSIGN EXCEPTION;
13498 WSH_ASSIGN_CONSOL_LPN_ERROR EXCEPTION;
13499 WSH_CONSOL_DEL_NO_MATCH EXCEPTION;
13500 WSH_NO_CHILD_LPNS EXCEPTION;
13501 WSH_INVALID_TRIPS EXCEPTION;
13502
13503 l_debug_on BOOLEAN;
13504 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'Assign_Container_to_Consol';
13505
13506 BEGIN
13507
13508 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13509 --
13510 IF l_debug_on IS NULL
13511 THEN
13512 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13513 END IF;
13514 --
13515 IF l_debug_on THEN
13516 WSH_DEBUG_SV.push(l_module_name);
13517 --
13518 WSH_DEBUG_SV.log(l_module_name,'p_caller',p_caller);
13519 WSH_DEBUG_SV.log(l_module_name,'p_child_container_id',p_child_container_id);
13520 WSH_DEBUG_SV.log(l_module_name,'p_parent_container_id',p_parent_container_id);
13521 END IF;
13522 -- Check if the parent lpn is a consol LPN
13523
13524 OPEN c_get_container_info(p_parent_container_id);
13525 FETCH c_get_container_info INTO l_parent_container_info;
13526 IF c_get_container_info%NOTFOUND THEN
13527 CLOSE c_get_container_info;
13528 RAISE WSH_INVALID_PARENT;
13529
13530 END IF;
13531 CLOSE c_get_container_info;
13532
13533 -- validate child LPN
13534
13535 OPEN c_get_container_info(p_child_container_id);
13536 FETCH c_get_container_info INTO l_child_container_info;
13537 IF c_get_container_info%NOTFOUND OR l_child_container_info.container_flag = 'C' THEN
13538 CLOSE c_get_container_info;
13539 RAISE WSH_INVALID_CHILD;
13540 END IF;
13541 CLOSE c_get_container_info;
13542
13543 IF l_child_container_info.delivery_id = l_parent_container_info.delivery_id THEN
13544
13545 -- Don't use this API!!!, use API's to pack into content LPNs.
13546 RAISE WSH_INVALID_CONSOL_ASSIGN;
13547
13548
13549 END IF;
13550
13551 IF l_debug_on THEN
13552 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13553 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13554 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.container_flag',l_parent_container_info.container_flag);
13555 END IF;
13556 IF l_parent_container_info.container_flag = 'Y' THEN
13557
13558 -- This is not a consol LPN, so we need to convert this to a consol before assignment.
13559 -- We consider the following cases:
13560 -- case 1. Neither the parent LPN nor the child LPN is attached to a consol delivery.
13561 -- We need to create a consolidation delivery for both.
13562 -- case 2. The parent LPN, even though not a consol LPN, is attached to
13563 -- a consol delivery, but the child is not.
13564 -- We need to assign the child container's delivery to the parent container's
13565 -- consol delivery.
13566 -- case 3. The child LPN is attached to a consol delivery, but the parent is not.
13567 -- We need to assign the parent container's delivery to the child
13568 -- container's consol delivery.
13569 -- case 4. Both the child and the parent containers have consolidation deliveries,
13570 -- but they do not match.
13571 -- Raise an exception since this is not a valid assignment.
13572 -- case 5. Both the child and the parent container have the same consol delivery.
13573 -- We do not need to do anything (this case is ignored) apart from converting the LPN.
13574
13575
13576
13577 IF l_parent_container_info.parent_delivery_id IS NULL
13578 AND l_child_container_info.parent_delivery_id IS NULL THEN
13579
13580 -- case 1. Neither the parent LPN nor the child LPN are attached to any consol deliveries.
13581 -- Check if the deliveries are assigned to trips. If they are assigned to
13582 -- the same trip, or if only one of the deliveries has a trip. Check if
13583 -- this trip has a consol delivery. If yes, we can use this consol delivery, else
13584 -- We need to create a consolidation delivery for both.
13585 IF l_debug_on THEN
13586 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13587 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13588 END IF;
13589
13590 -- Check if the trips have consolidation deliveries.
13591 -- Check trip for the parent lpn.
13592 OPEN c_get_trip_info(l_parent_container_info.delivery_id);
13593 FETCH c_get_trip_info INTO l_parent_trip_id, l_parent_consol_del_id;
13594 CLOSE c_get_trip_info;
13595
13596
13597 -- Check trip for the child lpn.
13598 OPEN c_get_trip_info(l_child_container_info.delivery_id);
13599 FETCH c_get_trip_info INTO l_child_trip_id, l_child_consol_del_id;
13600 CLOSE c_get_trip_info;
13601
13602 IF (l_child_trip_id <> l_parent_trip_id) THEN
13603
13604 RAISE WSH_INVALID_TRIPS;
13605
13606 END IF;
13607
13608 IF (l_child_trip_id IS NOT NULL) OR (l_parent_trip_id IS NOT NULL) THEN
13609
13610 -- Unassign the deliveries from the trip.
13611
13612 IF l_child_trip_id IS NOT NULL THEN
13613
13614 l_unassign_dels(1) := l_child_container_info.delivery_id;
13615
13616 END IF;
13617 IF l_parent_trip_id IS NOT NULL THEN
13618
13619 l_unassign_dels(l_unassign_dels.count + 1) := l_parent_container_info.delivery_id;
13620
13621 END IF;
13622
13623 l_child_trip_id := NVL(l_child_trip_id, l_parent_trip_id);
13624
13625
13626 IF l_debug_on THEN
13627 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TRIPS_ACTIONS.Unassign_Trip',WSH_DEBUG_SV.C_PROC_LEVEL);
13628 END IF;
13629
13630 WSH_TRIPS_ACTIONS.Unassign_Trip(p_del_rows => l_unassign_dels,
13631 p_trip_id => l_child_trip_id,
13632 x_return_status => l_return_status);
13633
13634 wsh_util_core.api_post_call
13635 (
13636 p_return_status => l_return_status,
13637 x_num_warnings => l_num_warnings,
13638 x_num_errors => l_num_errors
13639 );
13640
13641 l_assign_flag := 'Y';
13642 l_new_parent_delivery_id := NVL(l_parent_consol_del_id, l_child_consol_del_id);
13643 l_del_tab(1) := l_parent_container_info.delivery_id;
13644 l_del_tab(2) := l_child_container_info.delivery_id;
13645 END IF;
13646 IF l_new_parent_delivery_id IS NULL THEN
13647 -- Create a new consolidation delivery.
13648 IF l_debug_on THEN
13649 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13650 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13651 END IF;
13652
13653 FOR i in 1..2 LOOP
13654
13655 IF i = 1 THEN
13656 l_child_delivery_id := l_parent_container_info.delivery_id;
13657 ELSE
13658 l_child_delivery_id := l_child_container_info.delivery_id;
13659 END IF;
13660
13661 IF l_debug_on THEN
13662 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.Populate_Record',WSH_DEBUG_SV.C_PROC_LEVEL);
13663 END IF;
13664 WSH_NEW_DELIVERIES_PVT.Populate_Record(
13665 p_delivery_id => l_child_delivery_id,
13666 x_delivery_info => l_del_info_tab(i),
13667 x_return_status => l_return_status);
13668
13669 wsh_util_core.api_post_call
13670 (
13671 p_return_status => l_return_status,
13672 x_num_warnings => l_num_warnings,
13673 x_num_errors => l_num_errors
13674 );
13675 -- Handle return status
13676
13677 END LOOP;
13678
13679
13680 IF l_debug_on THEN
13681 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_Delivery_Autocreate.Autocreate_Consol_Delivery',WSH_DEBUG_SV.C_PROC_LEVEL);
13682 END IF;
13683 WSH_Delivery_Autocreate.Autocreate_Consol_Delivery(
13684 p_del_attributes_tab => l_del_info_tab,
13685 p_caller => p_caller,
13686 x_parent_del_id => l_new_parent_delivery_id,
13687 x_parent_trip_id => l_trip_id,
13688 x_return_status => l_return_status);
13689
13690 wsh_util_core.api_post_call
13691 (
13692 p_return_status => l_return_status,
13693 x_num_warnings => l_num_warnings,
13694 x_num_errors => l_num_errors
13695 );
13696 END IF;
13697
13698 ELSIF (l_parent_container_info.parent_delivery_id <> l_child_container_info.parent_delivery_id) OR
13699 (l_parent_container_info.parent_delivery_id IS NULL) OR
13700 (l_child_container_info.parent_delivery_id IS NULL) THEN
13701 IF l_debug_on THEN
13702 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13703 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13704 END IF;
13705
13706 IF l_parent_container_info.parent_delivery_id IS NOT NULL
13707 AND l_child_container_info.parent_delivery_id IS NULL THEN
13708 -- case 2. The parent LPN, even though not a consol LPN, is attached to
13709 -- a consol delivery, but the child is not.
13710 -- We need to assign the child containers delivery to the parent containers
13711 -- consol delivery.
13712 IF l_debug_on THEN
13713 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13714 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13715 END IF;
13716
13717 l_assign_flag := 'Y';
13718 l_new_parent_delivery_id := l_parent_container_info.parent_delivery_id;
13719 l_del_tab(1) := l_child_container_info.delivery_id;
13720
13721
13722 ELSIF l_parent_container_info.parent_delivery_id IS NULL
13723 AND l_child_container_info.parent_delivery_id IS NOT NULL THEN
13724 -- case 3. The child LPN is attached to a consol delivery, but the parent is not.
13725 -- We need to assign the parent container's delivery to the child
13726 -- containers consol delivery.
13727 IF l_debug_on THEN
13728 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13729 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13730 END IF;
13731
13732 l_assign_flag := 'Y';
13733 l_new_parent_delivery_id := l_child_container_info.parent_delivery_id;
13734 l_del_tab(1) := l_parent_container_info.delivery_id;
13735
13736
13737 ELSIF l_parent_container_info.parent_delivery_id <> l_child_container_info.parent_delivery_id THEN
13738 -- case 4. Both the child and the parent containers have consolidation deliveries
13739 -- but they do not match.
13740 -- Raise an exception since this is not a valid assignment.
13741
13742 IF l_debug_on THEN
13743 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13744 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13745 END IF;
13746 RAISE WSH_CONSOL_DEL_NO_MATCH;
13747
13748 END IF;
13749 ELSIF l_child_container_info.parent_delivery_id = l_parent_container_info.parent_delivery_id THEN
13750 IF l_debug_on THEN
13751 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13752 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13753 END IF;
13754
13755 l_new_parent_delivery_id := l_parent_container_info.parent_delivery_id;
13756
13757 END IF;
13758
13759 -- Convert the parent LPN to be a consol LPN.
13760
13761 -- Get the attributes of the parent delivery
13762 IF l_debug_on THEN
13763 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.Populate_Record',WSH_DEBUG_SV.C_PROC_LEVEL);
13764 END IF;
13765
13766 WSH_NEW_DELIVERIES_PVT.Populate_Record(
13767 p_delivery_id => l_new_parent_delivery_id,
13768 x_delivery_info => l_parent_del_info_rec,
13769 x_return_status => l_return_status);
13770
13771 wsh_util_core.api_post_call
13772 (
13773 p_return_status => l_return_status,
13774 x_num_warnings => l_num_warnings,
13775 x_num_errors => l_num_errors
13776 );
13777 -- update the LPN with the parents' attributes and set the container_flag to 'C'
13778
13779 -- Lock the delivery details and assignments.
13780
13781 BEGIN
13782 wsh_delivery_details_pkg.lock_detail_no_compare(p_delivery_detail_id => p_parent_container_id);
13783 wsh_delivery_details_pkg.lock_wda_no_compare(p_delivery_detail_id => p_parent_container_id);
13784 wsh_delivery_details_pkg.lock_wda_no_compare(p_delivery_detail_id => p_child_container_id);
13785 EXCEPTION
13786 WHEN OTHERS THEN
13787 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13788 FND_MESSAGE.SET_NAME('WSH','WSH_NO_LOCK');
13789 WSH_UTIL_CORE.Add_Message(x_return_status);
13790 --
13791 -- Debug Statements
13792 --
13793 IF l_debug_on THEN
13794 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_LOCK exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13795 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_LOCK');
13796 END IF;
13797 RETURN;
13798 --
13799 END;
13800
13801
13802 update wsh_delivery_details
13803 set container_flag = 'C',
13804 ship_to_location_id = l_parent_del_info_rec.ultimate_dropoff_location_id,
13805 intmed_ship_to_location_id = l_parent_del_info_rec.intmed_ship_to_location_id,
13806 customer_id = l_parent_del_info_rec.customer_id,
13807 fob_code = l_parent_del_info_rec.fob_code,
13808 freight_terms_code = l_parent_del_info_rec.freight_terms_code,
13809 ship_method_code = l_parent_del_info_rec.ship_method_code,
13810 carrier_id = l_parent_del_info_rec.carrier_id,
13811 mode_of_transport = l_parent_del_info_rec.mode_of_transport,
13812 service_level = l_parent_del_info_rec.service_level,
13813 deliver_to_location_id = l_parent_del_info_rec.ultimate_dropoff_location_id,
13814 line_direction = 'O'
13815 where delivery_detail_id = p_parent_container_id;
13816
13817
13818 -- Perform wda conversion.
13819 -- wda picture before conversion
13820
13821 -----------------------------------------------------------------------
13822 -- | del asg id| del det id| parent det id| del id| parent del id| type
13823 -----------------------------------------------------------------------
13824 -- | 1 | dd1 | lpn1 | d1 | NULL | S
13825 -----------------------------------------------------------------------
13826 -- | 2 | lpn1 | NULL | d1 | NULL | S
13827 -----------------------------------------------------------------------
13828
13829 -- wda picture after conversion
13830
13831 -----------------------------------------------------------------------
13832 -- | del asg id| del det id| parent det id| del id| parent del id| type
13833 -----------------------------------------------------------------------
13834 -- | 1 | dd1 | NULL | d1 | NULL | O
13835 -----------------------------------------------------------------------
13836 -- | 2 | lpn1 | NULL | pd1 | NULL | S
13837 -----------------------------------------------------------------------
13838 -- | 3 | dd1 | lpn1 | d1 | pd1 | C
13839 -----------------------------------------------------------------------
13840
13841 -- Here we are only converting the parent LPN into a consol LPN, we are not
13842 -- assigning any new children to the parent yet.
13843
13844 -- Parent container has a consolidation record. Since the parent
13845 -- is now a consol LPN, the consolidation record should be on the
13846 -- topmost children currently assigned to the parent, so we need
13847 -- to delete the parent's consolidation record.
13848
13849 delete from wsh_delivery_assignments
13850 where delivery_detail_id = p_parent_container_id
13851 and type = 'C';
13852
13853
13854 -- Get the current topmost children of the parent LPN.
13855 IF l_debug_on THEN
13856 WSH_DEBUG_SV.log(l_module_name,'p_parent_container_id',p_parent_container_id);
13857 END IF;
13858
13859 OPEN c_get_child_details(p_parent_container_id);
13860 FETCH c_get_child_details BULK COLLECT
13861 INTO l_child_details_tab;
13862 IF l_debug_on THEN
13863 WSH_DEBUG_SV.log(l_module_name,'l_child_details_tab.count',l_child_details_tab.count);
13864 END IF;
13865 CLOSE c_get_child_details;
13866
13867 -- lock the children.
13868
13869 BEGIN
13870 FOR i in 1..l_child_details_tab.count LOOP
13871 wsh_delivery_details_pkg.lock_wda_no_compare(p_delivery_detail_id => l_child_details_tab(i));
13872 END LOOP;
13873
13874 EXCEPTION
13875 WHEN OTHERS THEN
13876 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13877 FND_MESSAGE.SET_NAME('WSH','WSH_NO_LOCK');
13878 WSH_UTIL_CORE.Add_Message(x_return_status);
13879 --
13880 -- Debug Statements
13881 --
13882 IF l_debug_on THEN
13883 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_LOCK exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13884 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_LOCK');
13885 END IF;
13886 RETURN;
13887 --
13888 END;
13889
13890 -- Step 1.
13891 -- Update the outer assignment to be 'O', and null out
13892 -- its parent delivery detail id which is now a consolidation LPN.
13893
13894 FORALL i in 1..l_child_details_tab.count
13895 update wsh_delivery_assignments
13896 set parent_delivery_detail_id = NULL,
13897 type = 'O'
13898 where delivery_detail_id = l_child_details_tab(i)
13899 and NVL(type, 'S') = 'S';
13900
13901
13902
13903 -- Step 2.
13904 -- Now update the consol LPN's delivery assignment to be the consol delivery,
13905 -- and set its parent delivery id to be NULL.
13906
13907 update wsh_delivery_assignments
13908 set delivery_id = l_new_parent_delivery_id,
13909 parent_delivery_id = NULL,
13910 type = 'S'
13911 where delivery_detail_id = p_parent_container_id;
13912
13913 -- Step 3.
13914 -- Create new delivery assignments with type 'C' for all the topmost
13915 -- children of the parent.
13916
13917 l_del_asg_info_rec.parent_delivery_detail_id := p_parent_container_id;
13918 l_del_asg_info_rec.delivery_id := l_parent_container_info.delivery_id;
13919 l_del_asg_info_rec.parent_delivery_id := l_new_parent_delivery_id;
13920 l_del_asg_info_rec.type := 'C';
13921
13922 IF l_debug_on THEN
13923 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_Delivery_Details_PKG.Create_Deliv_Assignment_bulk',WSH_DEBUG_SV.C_PROC_LEVEL);
13924 END IF;
13925 WSH_Delivery_Details_PKG.Create_Deliv_Assignment_bulk(
13926 p_delivery_assignments_info => l_del_asg_info_rec,
13927 p_num_of_rec => l_child_details_tab.count,
13928 p_dd_id_tab => l_child_details_tab,
13929 x_da_id_tab => l_dummy_asg_tab,
13930 x_return_status => l_return_status);
13931
13932 wsh_util_core.api_post_call
13933 (
13934 p_return_status => l_return_status,
13935 x_num_warnings => l_num_warnings,
13936 x_num_errors => l_num_errors
13937 );
13938 -- Handle return status
13939
13940 ELSE -- if l_parent_container_info.container_flag = 'C'
13941
13942 -- The parent is already a consol LPN.
13943 -- this implies that the delivery id of the parent in wda
13944 -- is the consol delivery.
13945
13946 IF l_child_container_info.parent_delivery_id IS NULL THEN
13947
13948 -- Assign child delivery to parent's delivery.
13949 -- this will validate the constraints and the deconsol point.
13950
13951 l_assign_flag := 'Y';
13952 l_del_tab(1) := l_child_container_info.delivery_id;
13953 l_new_parent_delivery_id := l_parent_container_info.delivery_id;
13954
13955
13956 ELSIF l_child_container_info.parent_delivery_id <> l_parent_container_info.delivery_id THEN
13957
13958 -- Error! The child's parent delivery has to be the same as the consol delivery of the parent.
13959
13960 -- RAISE EXCEPTION;
13961 RAISE WSH_CONSOL_DEL_NO_MATCH;
13962 ELSE
13963
13964 l_new_parent_delivery_id := l_parent_container_info.delivery_id;
13965
13966 END IF;
13967
13968 END IF; -- if l_parent_container_info.container_flag = 'Y'
13969
13970 -- We now need to make the assignment of deliveries to consol deliveries where
13971 -- one delivery had a consol delivery and the other did not.
13972
13973 IF l_assign_flag = 'Y' THEN
13974
13975 -- Assign the unassigned delivery to the consol delivery.
13976 -- This will also validate constraints/deconsol point.
13977
13978
13979 FOR i in 1..l_del_tab.count LOOP
13980
13981 IF l_debug_on THEN
13982 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.Populate_Record',WSH_DEBUG_SV.C_PROC_LEVEL);
13983 END IF;
13984 WSH_NEW_DELIVERIES_PVT.Populate_Record(
13985 p_delivery_id => l_del_tab(i),
13986 x_delivery_info => l_del_info_tab(i),
13987 x_return_status => l_return_status);
13988
13989 wsh_util_core.api_post_call
13990 (
13991 p_return_status => l_return_status,
13992 x_num_warnings => l_num_warnings,
13993 x_num_errors => l_num_errors
13994 );
13995 -- Handle return status
13996
13997 END LOOP;
13998
13999
14000
14001
14002 IF l_debug_on THEN
14003 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_New_Delivery_Actions.Assign_Del_to_Consol_Del',WSH_DEBUG_SV.C_PROC_LEVEL);
14004 END IF;
14005 WSH_New_Delivery_Actions.Assign_Del_to_Consol_Del(
14006 p_del_tab => l_del_info_tab,
14007 p_parent_del_id => l_new_parent_delivery_id,
14008 p_caller => p_caller,
14009 x_return_status => l_return_status);
14010
14011 -- Handle return status.
14012
14013 wsh_util_core.api_post_call
14014 (
14015 p_return_status => l_return_status,
14016 x_num_warnings => l_num_warnings,
14017 x_num_errors => l_num_errors
14018 );
14019
14020 END IF;
14021
14022
14023 -- At this point the parent LPN is a consol LPN and is assigned to a
14024 -- consol delivery. The child LPN is also assigned to the same consol delivery.
14025 -- All we need to do now is to update the child's consolidation record to
14026 -- create the assignment.
14027
14028 update wsh_delivery_assignments
14029 set parent_delivery_detail_id = p_parent_container_id
14030 where delivery_detail_id = p_child_container_id
14031 and type = 'C';
14032
14033 -- Handle wt/vol for consol deliveries/LPNs.
14034 /***
14035 IF l_debug_on THEN
14036 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.Container_Weight_Volume',WSH_DEBUG_SV.C_PROC_LEVEL);
14037 END IF;
14038 WSH_WV_UTILS.Container_Weight_Volume (
14039 p_container_instance_id => p_parent_container_id,
14040 p_override_flag => 'Y',
14041 p_fill_pc_flag => 'Y',
14042 p_post_process_flag => 'N',
14043 p_calc_wv_if_frozen => 'N',
14044 x_gross_weight => l_cont_gross_weight,
14045 x_net_weight => l_cont_net_weight,
14046 x_volume => l_cont_volume,
14047 x_cont_fill_pc => l_cont_fill_pc,
14048 x_return_status => l_return_status);
14049
14050 wsh_util_core.api_post_call
14051 (
14052 p_return_status => l_return_status,
14053 x_num_warnings => l_num_warnings,
14054 x_num_errors => l_num_errors
14055 );
14056 ***/
14057 -- Need to recalculate the wt/vol for the releated entities.
14058 -- Calculating for the trips would drive all the way to the deliveries and lpns.
14059 IF l_debug_on THEN
14060 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TRIPS_ACTIONS.trip_weight_volume',WSH_DEBUG_SV.C_PROC_LEVEL);
14061 END IF;
14062 OPEN c_get_filled_vol(p_parent_container_id);
14063 FETCH c_get_filled_vol INTO l_filled_volume;
14064 CLOSE c_get_filled_vol;
14065
14066 OPEN c_get_trip_id(l_new_parent_delivery_id);
14067 FETCH c_get_trip_id INTO l_trip_id_tab(1);
14068 CLOSE c_get_trip_id;
14069 WSH_TRIPS_ACTIONS.trip_weight_volume(
14070 p_trip_rows => l_trip_id_tab,
14071 p_override_flag => 'Y',
14072 p_calc_wv_if_frozen => 'N',
14073 p_start_departure_date => to_date(NULL),
14074 p_calc_del_wv => 'Y',
14075 x_return_status => l_return_status,
14076 p_suppress_errors => 'N');
14077
14078 UPDATE wsh_delivery_details
14079 SET filled_volume = l_filled_volume
14080 WHERE delivery_detail_id = p_parent_container_id;
14081
14082 IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
14083 IF l_debug_on THEN
14084 WSH_DEBUG_SV.logmsg(l_module_name,'Error calculating trip wt/vol');
14085 END IF;
14086 END IF;
14087 /*
14088
14089 IF l_debug_on THEN
14090 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.Delivery_Weight_Volume',WSH_DEBUG_SV.C_PROC_LEVEL);
14091 END IF;
14092
14093 WSH_WV_UTILS.Delivery_Weight_Volume
14094 ( p_delivery_id => l_new_parent_delivery_id,
14095 p_update_flag => 'Y',
14096 p_calc_wv_if_frozen => 'N',
14097 x_gross_weight => l_gross_wt,
14098 x_net_weight => l_net_wt,
14099 x_volume => l_volume,
14100 x_return_status => l_return_status);
14101 */
14102 wsh_util_core.api_post_call
14103 (
14104 p_return_status => l_return_status,
14105 x_num_warnings => l_num_warnings,
14106 x_num_errors => l_num_errors);
14107
14108 IF l_num_errors > 0
14109 THEN
14110 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14111 ELSIF l_num_warnings > 0
14112 THEN
14113 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
14114 ELSE
14115 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
14116 END IF;
14117 --
14118 -- Debug Statements
14119 --
14120 IF l_debug_on THEN
14121 WSH_DEBUG_SV.pop(l_module_name);
14122 END IF;
14123 --
14124
14125 EXCEPTION
14126 WHEN FND_API.G_EXC_ERROR THEN
14127 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14128 --
14129 -- Debug Statements
14130 --
14131 IF l_debug_on THEN
14132 WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14133 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
14134 END IF;
14135
14136 WHEN WSH_INVALID_TRIPS THEN
14137 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14138 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_TRIPS');
14139 WSH_UTIL_CORE.Add_Message(x_return_status);
14140 --
14141 -- Debug Statements
14142 --
14143 IF l_debug_on THEN
14144 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_TRIPS exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14145
14146 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_TRIPS');
14147 END IF;
14148
14149 WHEN WSH_NO_CHILD_LPNS THEN
14150 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14151 FND_MESSAGE.SET_NAME('WSH','WSH_NO_CHILD_LPNS');
14152 WSH_UTIL_CORE.Add_Message(x_return_status);
14153 --
14154 -- Debug Statements
14155 --
14156 IF l_debug_on THEN
14157 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_CHILD_LPNS exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14158
14159 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_CHILD_LPNS');
14160 END IF;
14161
14162 WHEN WSH_CONSOL_DEL_NO_MATCH THEN
14163 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14164 FND_MESSAGE.SET_NAME('WSH','WSH_CONSOL_DEL_NO_MATCH');
14165 WSH_UTIL_CORE.Add_Message(x_return_status);
14166 --
14167 -- Debug Statements
14168 --
14169 IF l_debug_on THEN
14170 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_CONSOL_DEL_NO_MATCH exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14171
14172 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_CONSOL_DEL_NO_MATCH');
14173 END IF;
14174
14175 WHEN WSH_ASSIGN_CONSOL_LPN_ERROR THEN
14176 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14177 FND_MESSAGE.SET_NAME('WSH','WSH_ASSIGN_CONSOL_LPN_ERROR');
14178 WSH_UTIL_CORE.Add_Message(x_return_status);
14179 --
14180 -- Debug Statements
14181 --
14182 IF l_debug_on THEN
14183 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_ASSIGN_CONSOL_LPN_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14184
14185 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_ASSIGN_CONSOL_LPN_ERROR');
14186 END IF;
14187
14188 WHEN WSH_INVALID_CONSOL_ASSIGN THEN
14189 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14190 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONSOL_ASSIGN');
14191 WSH_UTIL_CORE.Add_Message(x_return_status);
14192 --
14193 -- Debug Statements
14194 --
14195 IF l_debug_on THEN
14196 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_CONSOL_ASSIGN exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14197
14198 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_CONSOL_ASSIGN');
14199 END IF;
14200
14201 WHEN WSH_INVALID_PARENT THEN
14202 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14203 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_PARENT');
14204 WSH_UTIL_CORE.Add_Message(x_return_status);
14205 --
14206 -- Debug Statements
14207 --
14208 IF l_debug_on THEN
14209 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_PARENT exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14210
14211 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_PARENT');
14212 END IF;
14213
14214 WHEN WSH_INVALID_CHILD THEN
14215 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14216 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CHILD');
14217 WSH_UTIL_CORE.Add_Message(x_return_status);
14218 --
14219 -- Debug Statements
14220 --
14221 IF l_debug_on THEN
14222 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_CHILD exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14223
14224 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_CHILD');
14225 END IF;
14226 --
14227
14228 WHEN OTHERS THEN
14229
14230 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
14231 wsh_util_core.default_handler('wsh_container_actions.Assign_Container_to_Consol', l_module_name);
14232 IF l_debug_on THEN
14233 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
14234 END IF;
14235
14236 END Assign_Container_to_Consol;
14237
14238 PROCEDURE Unpack_Details_from_Consol
14239 (p_delivery_details_tab IN WSH_UTIL_CORE.ID_TAB_TYPE,
14240 p_caller IN VARCHAR2,
14241 x_return_status OUT NOCOPY VARCHAR2) IS
14242
14243 cursor c_check_valid_combination(p_dd_id IN NUMBER) IS
14244 select wdd1.delivery_detail_id,
14245 wdd2.delivery_detail_id,
14246 wdd1.gross_weight,
14247 wdd1.net_weight,
14248 wdd1.volume,
14249 wdd1.weight_uom_code,
14250 wdd1.volume_uom_code,
14251 wdd1.inventory_item_id,
14252 wdd2.weight_uom_code,
14253 wdd2.volume_uom_code
14254 from wsh_delivery_details wdd1,
14255 wsh_delivery_details wdd2,
14256 wsh_delivery_assignments wda,
14257 wsh_new_deliveries wnd
14258 where wdd1.delivery_detail_id = p_dd_id
14259 and wda.delivery_detail_id = wdd1.delivery_detail_id
14260 and wda.type = 'C'
14261 and wda.delivery_id = wnd.delivery_id
14262 and wnd.status_code = 'OP'
14263 and wdd1.container_flag in ('Y', 'N')
14264 and wda.parent_delivery_detail_id = wdd2.delivery_detail_id
14265 and wdd2.container_flag = 'C'
14266 order by wdd2.delivery_detail_id;
14267
14268 cursor c_check_empty_consol(p_consol_lpn_id in number) is
14269 select delivery_detail_id
14270 from wsh_delivery_assignments
14271 where parent_delivery_detail_id = p_consol_lpn_id
14272 and type = 'C'
14273 and rownum = 1;
14274
14275
14276 l_consol_lpn_tab wsh_util_core.id_tab_type;
14277 l_empty_lpn_tab wsh_util_core.id_tab_type;
14278 l_rem_lpn_tab wsh_util_core.id_tab_type;
14279
14280 l_cont_gross_weight NUMBER;
14281 l_cont_net_weight NUMBER;
14282 l_cont_volume NUMBER;
14283 l_child_gross_weight NUMBER;
14284 l_child_net_weight NUMBER;
14285 l_child_volume NUMBER;
14286 l_child_inv_item_id NUMBER;
14287 l_child_weight_UOM VARCHAR2(30);
14288 l_child_volume_UOM VARCHAR2(30);
14289 l_parent_weight_UOM VARCHAR2(30);
14290 l_parent_volume_UOM VARCHAR2(30);
14291 l_cont_fill_pc NUMBER;
14292 l_child_dd_id NUMBER;
14293 l_parent_dd_id NUMBER;
14294 l_dummy_dd_id NUMBER;
14295 j NUMBER := 0;
14296 k NUMBER := 0;
14297 l NUMBER := 0;
14298
14299 l_num_warnings NUMBER := 0;
14300 l_num_errors NUMBER := 0;
14301 l_return_status VARCHAR2(30);
14302
14303 WSH_INVALID_COMBINATION EXCEPTION;
14304
14305 l_debug_on BOOLEAN;
14306 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'Unpack_Details_from_Consol';
14307
14308 BEGIN
14309
14310 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
14311 --
14312 IF l_debug_on IS NULL
14313 THEN
14314 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
14315 END IF;
14316 --
14317 IF l_debug_on THEN
14318 WSH_DEBUG_SV.push(l_module_name);
14319 --
14320 WSH_DEBUG_SV.log(l_module_name,'p_caller',p_caller);
14321 END IF;
14322 --
14323
14324
14325 FOR i in 1..p_delivery_details_tab.count LOOP
14326
14327 OPEN c_check_valid_combination(p_delivery_details_tab(i));
14328 FETCH c_check_valid_combination
14329 INTO l_child_dd_id,
14330 l_parent_dd_id,
14331 l_cont_gross_weight,
14332 l_cont_net_weight,
14333 l_cont_volume,
14334 l_child_weight_UOM,
14335 l_child_volume_UOM,
14336 l_child_inv_item_id,
14337 l_parent_weight_UOM,
14338 l_parent_volume_UOM;
14339 IF c_check_valid_combination%NOTFOUND THEN
14340 CLOSE c_check_valid_combination;
14341 RAISE WSH_INVALID_COMBINATION;
14342 END IF;
14343 CLOSE c_check_valid_combination;
14344
14345 IF i = 1 THEN
14346 j := 1;
14347 l_consol_lpn_tab(j) := l_parent_dd_id;
14348 ELSIF l_parent_dd_id <> l_consol_lpn_tab(j) THEN
14349 j := j +1;
14350 l_consol_lpn_tab(j) := l_parent_dd_id;
14351 END IF;
14352
14353 -- Lock the delivery assignments.
14354
14355 BEGIN
14356
14357 WSH_DELIVERY_DETAILS_PKG.lock_wda_no_compare(p_delivery_detail_id => p_delivery_details_tab(i));
14358
14359 EXCEPTION
14360 WHEN OTHERS THEN
14361 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14362 FND_MESSAGE.SET_NAME('WSH','WSH_NO_LOCK');
14363 WSH_UTIL_CORE.Add_Message(x_return_status);
14364 --
14365 -- Debug Statements
14366 --
14367 IF l_debug_on THEN
14368 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_LOCK exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14369 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_LOCK');
14370 END IF;
14371 RETURN;
14372 --
14373 END;
14374
14375
14376
14377 -- WMS will update the consol LPN with the decremented wt/vol (LPN convergence).
14378 -- This will also decrement the consol delivery wt/vol. However since the child
14379 -- LPN is still attached to the consol delivery, the consol delivery wt/vol should
14380 -- not change. So here we put back the child wt/vol onto the consol delivery in
14381 -- anticipation of it being decremented during the WMS call.
14382
14383
14384 IF l_debug_on THEN
14385 WSH_DEBUG_SV.log(l_module_name,'l_cont_gross_weight',l_cont_gross_weight);
14386 WSH_DEBUG_SV.log(l_module_name,'l_cont_net_weight',l_cont_net_weight);
14387 WSH_DEBUG_SV.log(l_module_name,'l_cont_volume',l_cont_volume);
14388 WSH_DEBUG_SV.log(l_module_name,'l_child_weight_UOM',l_child_weight_UOM);
14389 WSH_DEBUG_SV.log(l_module_name,'l_parent_weight_UOM',l_parent_weight_UOM);
14390 WSH_DEBUG_SV.log(l_module_name,'l_child_volume_UOM',l_child_volume_UOM);
14391 WSH_DEBUG_SV.log(l_module_name,'l_parent_volume_UOM',l_parent_volume_UOM);
14392 END IF;
14393
14394 -- convert the child UOM to the parent UOMs.
14395
14396 IF l_child_weight_UOM = l_parent_weight_UOM THEN
14397 l_child_gross_weight := l_cont_gross_weight;
14398 l_child_net_weight := l_cont_net_weight;
14399 ELSE
14400
14401 IF NVL(l_cont_gross_weight, 0) = 0 THEN
14402 l_child_gross_weight := 0;
14403 ELSE
14404 IF l_debug_on THEN
14405 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.convert_uom',WSH_DEBUG_SV.C_PROC_LEVEL);
14406 WSH_DEBUG_SV.log(l_module_name,'l_cont_gross_weight',l_cont_gross_weight);
14407 END IF;
14408 l_child_gross_weight :=
14409 WSH_WV_UTILS.convert_uom(l_child_weight_UOM, l_parent_weight_UOM, l_cont_gross_weight, l_child_inv_item_id);
14410 END IF;
14411 IF NVL(l_cont_net_weight, 0) = 0 THEN
14412 l_child_net_weight := 0;
14413 ELSE
14414 IF l_debug_on THEN
14415 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.convert_uom',WSH_DEBUG_SV.C_PROC_LEVEL);
14416 WSH_DEBUG_SV.log(l_module_name,'l_cont_net_weight',l_cont_net_weight);
14417 END IF;
14418 l_child_net_weight :=
14419 WSH_WV_UTILS.convert_uom(l_child_weight_UOM, l_parent_weight_UOM, l_cont_net_weight, l_child_inv_item_id);
14420 END IF;
14421
14422 END IF;
14423 IF l_child_volume_UOM = l_parent_volume_UOM THEN
14424 l_child_volume := l_cont_volume;
14425 ELSE
14426
14427 IF NVL(l_cont_volume, 0) = 0 THEN
14428 l_child_volume := 0;
14429 ELSE
14430 IF l_debug_on THEN
14431 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.convert_uom',WSH_DEBUG_SV.C_PROC_LEVEL);
14432 WSH_DEBUG_SV.log(l_module_name,'l_cont_volume',l_cont_volume);
14433 END IF;
14434 l_child_volume :=
14435 WSH_WV_UTILS.convert_uom(l_child_volume_UOM, l_parent_volume_UOM, l_cont_volume, l_child_inv_item_id);
14436 END IF;
14437
14438 END IF;
14439
14440 IF l_debug_on THEN
14441 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
14442 END IF;
14443
14444 WSH_WV_UTILS.DD_WV_Post_Process(
14445 p_delivery_detail_id => l_parent_dd_id,
14446 p_diff_gross_wt => l_child_gross_weight,
14447 p_diff_net_wt => l_child_net_weight,
14448 p_diff_volume => l_child_volume,
14449 p_diff_fill_volume => l_child_volume,
14450 x_return_status => l_return_status);
14451
14452 WSH_UTIL_CORE.API_Post_Call
14453 (
14454 p_return_status => l_return_status,
14455 x_num_warnings => l_num_warnings,
14456 x_num_errors => l_num_errors);
14457
14458
14459 END LOOP;
14460
14461 FORALL i in 1..p_delivery_details_tab.count
14462 update wsh_delivery_assignments
14463 set parent_delivery_detail_id = NULL
14464 where delivery_detail_id = p_delivery_details_tab(i)
14465 and type = 'C';
14466
14467
14468
14469 IF l_num_errors > 0
14470 THEN
14471 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14472 ELSIF l_num_warnings > 0
14473 THEN
14474 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
14475 ELSE
14476 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
14477 END IF;
14478 --
14479 -- Debug Statements
14480 --
14481 IF l_debug_on THEN
14482 WSH_DEBUG_SV.pop(l_module_name);
14483 END IF;
14484
14485
14486 EXCEPTION
14487 WHEN FND_API.G_EXC_ERROR THEN
14488 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14489 --
14490 -- Debug Statements
14491 --
14492 IF l_debug_on THEN
14493 WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14494 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
14495 END IF;
14496
14497
14498 WHEN WSH_INVALID_COMBINATION THEN
14499 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14500 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_COMBINATION');
14501 WSH_UTIL_CORE.Add_Message(x_return_status);
14502 --
14503 -- Debug Statements
14504 --
14505 IF l_debug_on THEN
14506 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_COMBINATION exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14507
14508 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_COMBINATION');
14509 END IF;
14510 --
14511
14512 WHEN OTHERS THEN
14513 wsh_util_core.default_handler('wsh_container_actions.unassign_detail_from_consol',l_module_name);
14514 --
14515 IF l_debug_on THEN
14516 wsh_debug_sv.pop(l_module_name, 'EXCEPTION:OTHERS');
14517 END IF;
14518
14519 END Unpack_Details_from_Consol;
14520
14521 --BUG#12904248
14522 /*
14523 -----------------------------------------------------------------------------
14524 PROCEDURE : Get_Deliver_To_Location
14525 PARAMETERS : p_container_id - Delivery detail id for the container
14526 x_deliver_to_location_id - Deliver to location id depending upon delivery details packed in container.
14527 x_return_status - return status of API
14528 DESCRIPTION : This procedure will return deliver to location id for conatiner
14529 if all the delivery details in container have same deliver to location id else
14530 this procedure will return NULL deliver to location id
14531
14532 As this procedure is only been called from inside the the package so this is
14533 only added to package body and not added to package spec
14534 ------------------------------------------------------------------------------
14535 */
14536
14537 PROCEDURE Get_Deliver_To_Location(
14538 p_container_id IN NUMBER,
14539 x_deliver_to_location_id OUT NOCOPY NUMBER,
14540 x_return_status OUT NOCOPY VARCHAR2) IS
14541
14542 CURSOR get_deliver_to_location_id (p_cont_id NUMBER) IS
14543 SELECT wdd.deliver_to_location_id
14544 FROM wsh_delivery_details wdd, wsh_delivery_assignments wda
14545 WHERE wda.delivery_detail_id = wdd.delivery_detail_id
14546 AND wda.parent_delivery_detail_id = p_cont_id;
14547
14548 cnt NUMBER := 0;
14549 l_deliver_to_location_id NUMBER :=NULL;
14550
14551 l_debug_on BOOLEAN;
14552
14553 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'GET_DELIVER_TO_LOCATION';
14554
14555 BEGIN
14556
14557 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
14558
14559 IF l_debug_on IS NULL
14560 THEN
14561 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
14562 END IF;
14563
14564 IF l_debug_on THEN
14565 WSH_DEBUG_SV.push(l_module_name);
14566 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_ID',p_container_id);
14567 END IF;
14568
14569
14570 FOR c1 in get_deliver_to_location_id(P_CONTAINER_ID) LOOP
14571 IF l_debug_on THEN
14572 WSH_DEBUG_SV.log(l_module_name,'cnt',cnt);
14573 WSH_DEBUG_SV.log(l_module_name,'c1.deliver_to_location_id',c1.deliver_to_location_id);
14574 END IF;
14575 IF cnt =0 THEN
14576 l_deliver_to_location_id := c1.deliver_to_location_id;
14577 ELSE
14578 IF l_deliver_to_location_id <> c1.deliver_to_location_id THEN
14579 l_deliver_to_location_id:= NULL;
14580 END IF;
14581 END IF;
14582 cnt:=cnt+1;
14583 END LOOP;
14584
14585 x_deliver_to_location_id :=l_deliver_to_location_id;
14586 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
14587
14588 IF l_debug_on THEN
14589 WSH_DEBUG_SV.pop(l_module_name);
14590 END IF;
14591
14592 EXCEPTION
14593
14594 WHEN Others THEN
14595 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Get_Deliver_To_Location',l_module_name);
14596 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
14597
14598 --
14599 IF l_debug_on THEN
14600 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
14601 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
14602 END IF;
14603
14604 END Get_Deliver_To_Location;
14605
14606 END wsh_container_actions;