[Home] [Help]
PACKAGE BODY: APPS.WSH_CONTAINER_ACTIONS
Source
1 PACKAGE BODY wsh_container_actions as
2 /* $Header: WSHCMACB.pls 120.19.12000000.4 2007/02/01 22:49:29 jishen ship $ */
3
4 LIMITED_PRECISION NUMBER := 5;
5 c_wms_code_present varchar2(2) := 'Y';
6 -- HW OPMCONV - Removed OPM variable
7
8 G_CALLED_FROM_INBOUND BOOLEAN := FALSE;
9
10 TYPE empty_container_info IS RECORD (
11 container_index NUMBER,
12 container_item_id WSH_DELIVERY_DETAILS.inventory_item_id%TYPE,
13 mast_cont_item_id WSH_DELIVERY_DETAILS.master_container_item_id%TYPE,
14 organization_id WSH_DELIVERY_DETAILS.organization_id%TYPE,
15 group_id NUMBER,
16 numerator NUMBER,
17 denominator NUMBER,
18 empty NUMBER);
19 TYPE empty_container_info_tab IS TABLE OF empty_container_info INDEX BY BINARY_INTEGER;
20 g_empty_cont_tab empty_container_info_tab;
21 g_new_cont_index NUMBER := 0;
22 g_num_cont_index NUMBER := 0;
23
24 TYPE assign_detail_info IS RECORD (
25 container_index NUMBER,
26 gross_weight WSH_DELIVERY_DETAILS.net_weight%TYPE,
27 net_weight WSH_DELIVERY_DETAILS.net_weight%TYPE,
28 volume WSH_DELIVERY_DETAILS.volume%TYPE,
29 delivery_id wsh_delivery_assignments_v.delivery_id%TYPE,
30 delivery_detail_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE,
31 -- J: W/V Changes
32 inventory_item_id WSH_DELIVERY_DETAILS.inventory_item_id%TYPE,
33 weight_uom WSH_DELIVERY_DETAILS.weight_uom_code%TYPE,
34 volume_uom WSH_DELIVERY_DETAILS.volume_uom_code%TYPE,
35 -- K LPN CONV
36 organization_id WSH_DELIVERY_DETAILS.organization_id%TYPE);
37 TYPE assign_detail_info_tab IS TABLE OF assign_detail_info INDEX BY BINARY_INTEGER;
38 g_assign_detail_tab assign_detail_info_tab;
39 g_assign_detail_index NUMBER := 0;
40
41 -- added number_of_containers to the record structure
42 TYPE new_container_info IS RECORD (
43 organization_id WSH_DELIVERY_DETAILS.organization_id%TYPE,
44 container_item_id WSH_DELIVERY_DETAILS.inventory_item_id%TYPE,
45 mast_cont_item_id WSH_DELIVERY_DETAILS.master_container_item_id%TYPE,
46 cont_instance_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE,
47 number_of_containers NUMBER
48 );
49 TYPE new_container_info_tab IS TABLE OF new_container_info INDEX BY BINARY_INTEGER;
50 g_new_container_tab new_container_info_tab;
51
52 -- another temp table to store id
53 -- Store container instance id after Bulk Insert
54 TYPE new_contid_rec IS RECORD (
55 match_id NUMBER,
56 cont_instance_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE,
57 -- J: W/V Changes
58 unit_weight NUMBER,
59 unit_volume NUMBER,
60 weight_uom VARCHAR2(3),
61 volume_uom VARCHAR2(3),
62 item_id NUMBER,
63 -- K LPN CONV
64 organization_id NUMBER
65 );
66 TYPE new_contid_info_tab IS TABLE OF new_contid_rec INDEX BY BINARY_INTEGER;
67 g_new_contid_tab new_contid_info_tab;
68
69 -- Cache Tables
70 TYPE organization_info IS RECORD (
71 process_flag VARCHAR2(1),
72 fill_pc_basis WSH_SHIPPING_PARAMETERS.percent_fill_basis_flag%TYPE);
73 TYPE organization_info_tab IS TABLE OF organization_info INDEX BY BINARY_INTEGER;
74 g_cache_organization_info_tab organization_info_tab;
75
76 /* Organization specific Cache Table */
77 TYPE container_load_info IS RECORD (
78 cont_item_id WSH_CONTAINER_ITEMS.container_item_id%TYPE,
79 max_load_qty WSH_CONTAINER_ITEMS.max_load_quantity%TYPE);
80 TYPE container_load_info_tab IS TABLE OF container_load_info INDEX BY BINARY_INTEGER;
81 g_cache_cont_load_info_tab container_load_info_tab;
82
83 /* Organization specific Cache Table */
84
85 -- valid_flag indicates if this container can be used for packing or not
86 -- inactive containers cannot be used
87 TYPE cont_msi_info IS RECORD (
88 mtl_max_load MTL_SYSTEM_ITEMS.maximum_load_weight%TYPE,
89 mtl_max_vol MTL_SYSTEM_ITEMS.internal_volume%TYPE,
90 mtl_wt_uom MTL_SYSTEM_ITEMS.weight_uom_code%TYPE,
91 mtl_vol_uom MTL_SYSTEM_ITEMS.volume_uom_code%TYPE,
92 valid_flag VARCHAR2(1)
93 );
94 TYPE cont_msi_tab IS TABLE OF cont_msi_info INDEX BY BINARY_INTEGER;
95 g_cont_msi_tab cont_msi_tab;
96
97 C_ERROR_STATUS CONSTANT VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_ERROR;
98 C_WARNING_STATUS CONSTANT VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_WARNING;
99 C_SUCCESS_STATUS CONSTANT VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
100 C_UNEXP_ERROR_STATUS CONSTANT VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
101
102 --
103 G_PKG_NAME CONSTANT VARCHAR2(50) := 'WSH_CONTAINER_ACTIONS';
104 --
105
106 --Bug #3005780 : Added the local function Get_Gcd
107 /*
108 -----------------------------------------------------------------------------
109 FUNCTION : Get_Gcd
110 PARAMETERS : num1 - First Number
111 num2 - Second Number
112 DESCRIPTION : This function finds greatest common devisor for the given
113 Two numbers num1 and num2. If one number is zero then it
114 returns other number as GCD value
115 ------------------------------------------------------------------------------
116 */
117
118 FUNCTION Get_Gcd (num1 IN NUMBER,
119 num2 IN NUMBER) RETURN NUMBER IS
120 temp_int NUMBER;
121 num1_int NUMBER := num1;
122 num2_int NUMBER := num2;
123 BEGIN
124 IF num1_int = 0 THEN return num2_int; END IF;
125 WHILE num2_int <> 0 LOOP
126 temp_int := mod(num1_int,num2_int);
127 num1_int := num2_int;
128 num2_int := temp_int;
129 END LOOP;
130 return num1_int;
131 END Get_Gcd;
132
133 -- bug 3440811
134 /*
135 -----------------------------------------------------------------------------
136 PROCEDURE : Validate_Container
137 PARAMETERS : p_organization_id - Organization Id
138 p_cont_item_id - Container Item Id
139
140 DESCRIPTION : This procedure takes the organization_id and the container's item_id
141 to check if the container is a valid container for packing or not.
142 ------------------------------------------------------------------------------
143 */
144
145 PROCEDURE Validate_Container(
146 p_organization_id IN NUMBER,
147 p_cont_item_id IN NUMBER,
148 x_return_status OUT NOCOPY VARCHAR2)
149 IS
150 CURSOR l_valid_cont_csr (p_cont_item_id NUMBER, p_org_id NUMBER) IS
151 SELECT 'X'
152 FROM MTL_SYSTEM_ITEMS
153 WHERE inventory_item_id = p_cont_item_id
154 AND container_item_flag = 'Y'
155 AND organization_id = p_org_id
156 AND nvl(vehicle_item_flag,'N') = 'N'
157 AND shippable_item_flag = 'Y';
158
159 l_valid_container VARCHAR2(1);
160 l_item_name VARCHAR2(32767);
161 --
162 l_debug_on BOOLEAN;
163 --
164 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'VALIDATE_CONTAINER';
165 --
166
167 BEGIN
168 --
169 --
170 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
171 --
172 IF l_debug_on IS NULL
173 THEN
174 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
175 END IF;
176 --
177 IF l_debug_on THEN
178 WSH_DEBUG_SV.push(l_module_name);
179 WSH_DEBUG_SV.log(l_module_name, 'p_cont_item_id', p_cont_item_id);
180 WSH_DEBUG_SV.log(l_module_name, 'p_organization_id', p_organization_id);
181 END IF;
182
183 x_return_status := wsh_util_core.g_ret_sts_success;
184 IF p_cont_item_id IS NOT NULL THEN
185 --{
186 OPEN l_valid_cont_csr (p_cont_item_id, p_organization_id);
187 FETCH l_valid_cont_csr INTO l_valid_container;
188 IF l_valid_cont_csr%NOTFOUND THEN
189 --{
190 IF l_debug_on THEN
191 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
192 END IF;
193 --
194 l_item_name := WSH_UTIL_CORE.Get_Item_Name(p_cont_item_id,p_organization_id);
195 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_INV_ITEM');
196 FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
197 CLOSE l_valid_cont_csr;
198 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
199
200 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
201 --}
202 ELSE
203 --{
204 CLOSE l_valid_cont_csr;
205 --}
206 END IF;
207 --}
208 END IF;
209
210 IF l_debug_on THEN
211 WSH_DEBUG_SV.pop(l_module_name);
212 END IF;
213 EXCEPTION
214 WHEN Others THEN
215 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Validate_Container',l_module_name);
216 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
217 --
218 IF l_debug_on THEN
219 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
220 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
221 END IF;
222 --
223 END Validate_Container;
224 -- bug 3440811
225
226 /* lpn conv
227 -----------------------------------------------------------------------------
228 PROCEDURE : default_container_attr
229 ------------------------------------------------------------------------------
230 */
231
232 PROCEDURE default_container_attr (
233 P_container_rec IN OUT NOCOPY
234 wsh_glbl_var_strct_grp.Delivery_Details_Rec_Type,
235 p_additional_cont_attr IN wsh_glbl_var_strct_grp.LPNRecordType,
236 p_caller IN VARCHAR2,
237 x_return_status OUT NOCOPY VARCHAR2
238
239 ) IS
240
241 l_wms_org VARCHAR2(5) := 'N';
242
243 CURSOR Get_Cont_Item_Info (v_cont_item_id NUMBER,
244 v_org_id NUMBER,
245 v_wms_org VARCHAR2 ) IS
246 SELECT Description, Container_Type_Code, weight_uom_code, volume_uom_code,
247 minimum_fill_percent, maximum_load_weight, internal_volume, primary_uom_code,
248 -- J: W/V Changes
249 unit_weight, unit_volume
250 FROM MTL_SYSTEM_ITEMS
251 WHERE inventory_item_id = v_cont_item_id
252 AND container_item_flag = 'Y'
253 AND organization_id = v_org_id
254 AND nvl(vehicle_item_flag,'N') = 'N'
255 AND ((shippable_item_flag = 'Y' AND v_wms_org = 'N')
256 OR v_wms_org = 'Y') ;
257
258 -- bug 2828591 - remove the condition since it will prevent user to create container with other status
259 -- AND inventory_item_status_code='Active';
260
261 l_cont_name VARCHAR2(50);
262 i NUMBER;
263 l_description VARCHAR2(240);
264 l_container_type_code VARCHAR2(30);
265 l_wt_uom VARCHAR2(3);
266 l_vol_uom VARCHAR2(3);
267 l_min_fill_pc NUMBER;
268 l_max_load_wt NUMBER;
269 l_max_vol NUMBER;
270 l_user_id NUMBER;
271 l_last_update_by NUMBER;
272 l_primary_uom VARCHAR2(3);
273 -- J: W/V Changes
274 l_unit_weight NUMBER;
275 l_unit_volume NUMBER;
276 l_row_id VARCHAR2(30);
277 l_org_name VARCHAR2(240);
278 l_item_name VARCHAR2(2000);
279 l_additional_cont_attr wsh_glbl_var_strct_grp.LPNRecordType;
280
281 i NUMBER;
282 j NUMBER;
283 l_return_status VARCHAR2(2);
284 l_num_warnings NUMBER := 0;
285 l_num_errors NUMBER := 0;
286
287 --
288 l_debug_on BOOLEAN;
289 --
290 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'DEFAULT_CONTAINER_ATTR';
291 --
292 BEGIN
293
294 --
295 --
296 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
297 --
298 IF l_debug_on IS NULL
299 THEN
300 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
301 END IF;
302 --
303 IF l_debug_on THEN
304 WSH_DEBUG_SV.push(l_module_name);
305 --
306 WSH_DEBUG_SV.log(l_module_name,'organization_id',P_container_rec.organization_id);
307 WSH_DEBUG_SV.log(l_module_name,'item_id',P_container_rec.inventory_item_id);
308 END IF;
309 --
310
311 -- If one of the wt/vol fields are negative, or if any wt/vol is give
312 -- without their uom, or if any wt/vol's uom is given without value then
313 -- error out.
314
315 l_additional_cont_attr := p_additional_cont_attr;
316
317 IF P_container_rec.volume < 0 OR P_container_rec.filled_volume < 0
318 OR P_container_rec.net_weight < 0 OR P_container_rec.gross_weight < 0
319 OR l_additional_cont_attr.tare_weight < 0
320 THEN --{
321
322 IF l_debug_on THEN --{
323
324 WSH_DEBUG_SV.log(l_module_name,'1 gross_weight',P_container_rec.gross_weight);
325 WSH_DEBUG_SV.log(l_module_name,'net_weight',P_container_rec.net_weight);
326 WSH_DEBUG_SV.log(l_module_name,'tare_weight',l_additional_cont_attr.tare_weight);
327 WSH_DEBUG_SV.log(l_module_name,'volume',P_container_rec.volume);
328 WSH_DEBUG_SV.log(l_module_name,'filled_volume',P_container_rec.filled_volume);
329 END IF; --}
330
331 RAISE FND_API.G_EXC_ERROR;
332
333 ELSIF (nvl(P_container_rec.volume,0) > 0
334 AND P_container_rec.volume_uom_code IS NULL)
335 --OR (P_container_rec.volume IS NULL
336 --AND P_container_rec.volume_uom_code IS NOT NULL )
337 OR (NVL(P_container_rec.filled_volume,0)> 0
338 AND l_additional_cont_attr.filled_volume_uom_code IS NULL )
339 --OR (P_container_rec.filled_volume IS NULL
340 --AND l_additional_cont_attr.filled_volume_uom_code IS NOT NULL )
341 OR (nvl(P_container_rec.gross_weight,0) > 0
342 AND P_container_rec.weight_uom_code IS NULL )
343 --OR (P_container_rec.gross_weight IS NULL
344 --AND P_container_rec.weight_uom_code IS NOT NULL )
345 OR (nvl(P_container_rec.net_weight,0) > 0
346 AND P_container_rec.weight_uom_code IS NULL )
347 --OR (P_container_rec.net_weight IS NULL
348 --AND P_container_rec.weight_uom_code IS NOT NULL )
349 OR (nvl(l_additional_cont_attr.tare_weight,0) > 0
350 AND l_additional_cont_attr.tare_weight_uom_code IS NULL )
351 --OR (l_additional_cont_attr.tare_weight IS NULL
352 --AND l_additional_cont_attr.tare_weight_uom_code IS NOT NULL )
353 THEN --}{
354 IF l_debug_on THEN --{
355
356 WSH_DEBUG_SV.log(l_module_name,'2 gross_weight',P_container_rec.gross_weight);
357 WSH_DEBUG_SV.log(l_module_name,'net_weight',P_container_rec.net_weight);
358 WSH_DEBUG_SV.log(l_module_name,'weight_uom_code',P_container_rec.weight_uom_code);
359 WSH_DEBUG_SV.log(l_module_name,'tare_weight',l_additional_cont_attr.tare_weight);
360 WSH_DEBUG_SV.log(l_module_name,'tare_weight_uom_code',l_additional_cont_attr.tare_weight_uom_code);
361 WSH_DEBUG_SV.log(l_module_name,'volume',P_container_rec.volume);
362 WSH_DEBUG_SV.log(l_module_name,'filled_volume',P_container_rec.filled_volume);
363 WSH_DEBUG_SV.log(l_module_name,'volume_uom_code',P_container_rec.volume_uom_code);
364 WSH_DEBUG_SV.log(l_module_name,'filled_volume_uom',l_additional_cont_attr.filled_volume_uom_code);
365 END IF; --}
366
367 RAISE FND_API.G_EXC_ERROR;
368
369 END IF; --}
370
371 l_wms_org := wsh_util_validate.check_wms_org(P_container_rec.organization_id);
372 IF l_debug_on THEN
373 WSH_DEBUG_SV.log(l_module_name,'l_wms_org',l_wms_org);
377 P_container_rec.organization_id,
374 END IF;
375
376 OPEN Get_Cont_Item_Info (P_container_rec.inventory_item_id,
378 l_wms_org);
379
380 --
381 IF l_debug_on THEN
382 WSH_DEBUG_SV.logmsg(l_module_name, 'GETTING CONTAINER ITEM INFO' );
383 END IF;
384 --
385 FETCH Get_Cont_Item_Info INTO
386 l_description,
387 l_container_type_code,
388 l_wt_uom,
389 l_vol_uom,
390 l_min_fill_pc,
391 l_max_load_wt,
392 l_max_vol,
393 l_primary_uom,
394 l_unit_weight,
395 l_unit_volume;
396
397 IF Get_Cont_Item_Info%NOTFOUND THEN --{
398 --
399 IF NVL(p_caller,'WSH') NOT IN ( 'WSH_PICK_RELEASE', 'WSH_IB_PACK')
400 AND NVL(p_caller,'WSH') NOT LIKE 'WMS%'
401 THEN
402
403 IF l_debug_on THEN
404 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
405 END IF;
406 --
407 l_item_name := WSH_UTIL_CORE.Get_Item_Name(P_container_rec.inventory_item_id,P_container_rec.organization_id);
408 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_INV_ITEM');
409 FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
410 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
411 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
412 END IF;
413
414 CLOSE Get_Cont_Item_Info;
415 -- Bug#: 3362895
416 IF P_container_rec.inventory_item_id IS NOT NULL THEN
417 IF l_debug_on THEN
418 WSH_DEBUG_SV.pop(l_module_name);
419 END IF;
420 --
421 return;
422 END IF;
423
424 -- return; Containers need not have an inventory item
425 -- associated with them. Cross-Docking requirements
426 ELSE --}{
427 CLOSE Get_Cont_Item_Info;
428 END IF; --}
429
430 --
431 IF l_debug_on THEN
432 WSH_DEBUG_SV.log(l_module_name, 'l_vol_uom',l_vol_uom );
433 WSH_DEBUG_SV.log(l_module_name, 'l_wt_uom',l_wt_uom );
434 END IF;
435 IF l_vol_uom IS NULL OR l_wt_uom IS NULL THEN --{
436 IF l_debug_on THEN
437 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.GET_DEFAULT_UOMS',WSH_DEBUG_SV.C_PROC_LEVEL);
438 END IF;
439 --
440 WSH_WV_UTILS.Get_Default_Uoms (
441 P_container_rec.organization_id,
442 l_wt_uom,
443 l_vol_uom,
444 l_return_status);
445
446 IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN --{
447 --
448 IF l_debug_on THEN
449 WSH_DEBUG_SV.logmsg(l_module_name, 'ERROR GETTING DEFFAULT UOMS' );
450 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ORG_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
451 END IF;
452 --
453 l_org_name := WSH_UTIL_CORE.Get_Org_Name(P_container_rec.organization_id);
454 FND_MESSAGE.SET_NAME('WSH','WSH_DEFAULT_UOM_ERROR');
455 FND_MESSAGE.SET_TOKEN('ORG_NAME',l_org_name);
456 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
457 --
458 IF l_debug_on THEN
459 WSH_DEBUG_SV.log(l_module_name,'Org Name is ',l_org_name);
460 END IF;
461 --
462 wsh_util_core.api_post_call
463 (
464 p_return_status => l_return_status,
465 x_num_warnings => l_num_warnings,
466 x_num_errors => l_num_errors
467 );
468 END IF; --}
469 --
470 IF l_debug_on THEN
471 WSH_DEBUG_SV.logmsg(l_module_name, 'NO ERRORS AFTER GETTING DEFAULT UOMS' );
472 WSH_DEBUG_SV.logmsg(l_module_name, 'CLOSED GET_CONT_ITEM_INFO' );
473 END IF;
474 --
475 END IF; --}
476
477 --converting the uoms
478 p_container_rec.volume_uom_code := NVL(p_container_rec.volume_uom_code,l_vol_uom);
479 l_additional_cont_attr.filled_volume_uom_code := NVL(l_additional_cont_attr.filled_volume_uom_code, l_vol_uom);
480
481 IF p_container_rec.volume_uom_code <> l_vol_uom THEN
482 p_container_rec.volume :=
483 WSH_WV_UTILS.Convert_Uom_core (
484 from_uom => p_container_rec.volume_uom_code,
485 to_uom => l_vol_uom,
486 quantity => p_container_rec.volume,
487 item_id => P_container_rec.inventory_item_id,
488 x_return_status => l_return_status
489 );
490 wsh_util_core.api_post_call
491 (
492 p_return_status => l_return_status,
493 x_num_warnings => l_num_warnings,
494 x_num_errors => l_num_errors
495 );
496 END IF;
497 p_container_rec.volume := NVL(p_container_rec.volume,l_unit_volume);
498 p_container_rec.volume_uom_code := l_vol_uom;
499
500 IF l_additional_cont_attr.filled_volume_uom_code <> l_vol_uom THEN
501 p_container_rec.filled_volume :=
502 WSH_WV_UTILS.Convert_Uom_core (
506 item_id =>P_container_rec.inventory_item_id,
503 from_uom =>l_additional_cont_attr.filled_volume_uom_code,
504 to_uom =>l_vol_uom,
505 quantity =>p_container_rec.filled_volume,
507 x_return_status => l_return_status );
508 wsh_util_core.api_post_call
509 (
510 p_return_status => l_return_status,
511 x_num_warnings => l_num_warnings,
512 x_num_errors => l_num_errors
513 );
514 END IF;
515 p_container_rec.unit_volume := l_unit_volume;
516 --p_container_rec.filled_volume := NVL(p_container_rec.filled_volume,l_unit_volume);
517
518 p_container_rec.weight_uom_code := NVL(p_container_rec.weight_uom_code,l_wt_uom);
519 IF p_container_rec.weight_uom_code <> l_wt_uom THEN
520 p_container_rec.gross_weight :=
521 WSH_WV_UTILS.Convert_Uom_core (
522 from_uom => p_container_rec.weight_uom_code,
523 to_uom => l_wt_uom,
524 quantity => p_container_rec.gross_weight,
525 item_id => P_container_rec.inventory_item_id,
526 x_return_status => l_return_status
527 );
528 wsh_util_core.api_post_call
529 (
530 p_return_status => l_return_status,
531 x_num_warnings => l_num_warnings,
532 x_num_errors => l_num_errors
533 );
534 IF p_container_rec.net_weight is not NULL THEN
535 p_container_rec.net_weight :=
536 WSH_WV_UTILS.Convert_Uom_core (
537 from_uom => p_container_rec.weight_uom_code,
538 to_uom => l_wt_uom,
539 quantity => p_container_rec.net_weight,
540 item_id =>P_container_rec.inventory_item_id,
541 x_return_status => l_return_status);
542 wsh_util_core.api_post_call
543 (
544 p_return_status => l_return_status,
545 x_num_warnings => l_num_warnings,
546 x_num_errors => l_num_errors
547 );
548 END IF;
549 END IF;
550 p_container_rec.weight_uom_code := l_wt_uom;
551
552 IF l_additional_cont_attr.tare_weight_uom_code <> l_wt_uom THEN
553 l_additional_cont_attr.tare_weight :=
554 WSH_WV_UTILS.Convert_Uom_core (
555 from_uom=>l_additional_cont_attr.tare_weight_uom_code,
556 to_uom => l_wt_uom,
557 quantity => l_additional_cont_attr.tare_weight,
558 item_id => P_container_rec.inventory_item_id,
559 x_return_status => l_return_status
560 );
561 wsh_util_core.api_post_call
562 (
563 p_return_status => l_return_status,
564 x_num_warnings => l_num_warnings,
565 x_num_errors => l_num_errors
566 );
567 END IF;
568
569 p_container_rec.gross_weight := NVL(p_container_rec.gross_weight,l_unit_weight);
570 IF p_container_rec.net_weight IS NULL AND l_additional_cont_attr.tare_weight IS NOT NULL THEN
571 p_container_rec.net_weight := p_container_rec.gross_weight
572 - l_additional_cont_attr.tare_weight;
573 END IF;
574
575 --
576 IF l_debug_on THEN
577 WSH_DEBUG_SV.log(l_module_name, 'gross weight', p_container_rec.gross_weight );
578 WSH_DEBUG_SV.log(l_module_name, 'volume', p_container_rec.volume );
579 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.ORG_TO_LOCATION',WSH_DEBUG_SV.C_PROC_LEVEL);
580 END IF;
581 --
582 p_container_rec.ship_from_location_id := WSH_UTIL_CORE.Org_To_Location(p_container_rec.organization_id,TRUE);
583 p_container_rec.container_type_code := NVL(p_container_rec.container_type_code,l_container_type_code);
584 p_container_rec.item_description := l_description;
585 p_container_rec.requested_quantity := 1;
586 p_container_rec.shipped_quantity := null;
587 --
588 IF l_debug_on THEN
589 WSH_DEBUG_SV.logmsg(l_module_name, 'ASSIGNING RQ_UOM' );
590 END IF;
591 --
592 p_container_rec.requested_quantity_uom := l_primary_uom;
593 p_container_rec.wv_frozen_flag := 'N';
594 p_container_rec.unit_weight := l_unit_weight;
595 p_container_rec.maximum_volume := l_max_vol;
596 p_container_rec.maximum_load_weight := l_max_load_wt;
597 --NVL(p_container_rec.maximum_load_weight, l_max_load_wt);
598 p_container_rec.minimum_fill_percent := l_min_fill_pc;
599 --NVL(p_container_rec.minimum_fill_percent,l_min_fill_pc);
600 p_container_rec.source_code := 'WSH';
601 p_container_rec.container_flag := 'Y';
602
603 -- Fix for Bug 1820376 : Containers should have release status as 'X'
604 p_container_rec.released_status := 'X';
605
606
607 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
608
609 --
613 --
610 IF l_debug_on THEN
611 WSH_DEBUG_SV.pop(l_module_name);
612 END IF;
614 EXCEPTION
615 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
616 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
617 IF l_debug_on THEN
618 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle
619 error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
620 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
621 END IF;
622 --
623 WHEN WSH_UTIL_CORE.G_EXC_WARNING THEN
624 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
625 --
626 IF l_debug_on THEN
627 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_UTIL_CORE.G_EXC_WARNING exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
628 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_UTIL_CORE.G_EXC_WARNING'); END IF;
629
630 WHEN FND_API.G_EXC_ERROR THEN
631
632 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
633 --
634 IF l_debug_on THEN
635 WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
636 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
637 END IF;
638 --
639
640 WHEN Others THEN
641 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.default_container_attr',l_module_name);
642 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
643
644 --
645 IF l_debug_on THEN
646 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
647 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
648 END IF;
649 --
650 END default_container_attr;
651
652
653 /*
654 -----------------------------------------------------------------------------
655 PROCEDURE : Create_Cont_Instance_Multi
656 -- This API has been created to Create Multiple Containers
657 -- while Auto Packing, p_num_of_containers specifies how
658 -- many containers need to be created
659 ------------------------------------------------------------------------------
660 */
661
662 PROCEDURE Create_Cont_Instance_Multi (
663 x_cont_name IN OUT NOCOPY VARCHAR2,
664 p_cont_item_id IN NUMBER,
665 x_cont_instance_id IN OUT NOCOPY NUMBER,
666 p_par_detail_id IN NUMBER,
667 p_organization_id IN NUMBER,
668 p_container_type_code IN VARCHAR2,
669 p_num_of_containers IN NUMBER,
670 x_row_id OUT NOCOPY VARCHAR2,
671 --x_row_id will containe the rowid of the first container created.
672 x_return_status OUT NOCOPY VARCHAR2,
673 x_cont_tab OUT NOCOPY WSH_UTIL_CORE.id_tab_type,
674 -- J: W/V Changes
675 x_unit_weight OUT NOCOPY NUMBER,
676 x_unit_volume OUT NOCOPY NUMBER,
677 x_weight_uom_code OUT NOCOPY VARCHAR2,
678 x_volume_uom_code OUT NOCOPY VARCHAR2,
679 p_lpn_id IN NUMBER DEFAULT NULL,
680 p_ignore_for_planning IN VARCHAR2 DEFAULT 'N',
681 p_caller IN VARCHAR2 DEFAULT 'WSH'
682 ) IS
683
684 CURSOR Get_Cont_Item_Info (v_cont_item_id NUMBER, v_org_id NUMBER) IS
685 SELECT Description, Container_Type_Code, weight_uom_code, volume_uom_code,
686 minimum_fill_percent, maximum_load_weight, internal_volume, primary_uom_code,
687 -- J: W/V Changes
688 unit_weight, unit_volume
689 FROM MTL_SYSTEM_ITEMS
690 WHERE inventory_item_id = v_cont_item_id
691 AND container_item_flag = 'Y'
692 AND organization_id = v_org_id
693 AND nvl(vehicle_item_flag,'N') = 'N'
694 AND shippable_item_flag = 'Y';
695 -- bug 2828591 - remove the condition since it will prevent user to create container with other status
696 -- AND inventory_item_status_code='Active';
697
698 CURSOR Get_Cont_Name (v_cont_inst_id NUMBER) IS
699 SELECT container_name
700 FROM WSH_DELIVERY_DETAILS
701 WHERE delivery_detail_id = v_cont_inst_id
702 AND container_flag = 'Y';
703
704 --added cursors
705 CURSOR Get_Wdd_Nextval IS
706 SELECT wsh_delivery_details_s.nextval
707 FROM sys.dual;
708
709 CURSOR Get_Wda_Nextval IS
710 SELECT wsh_delivery_assignments_s.nextval
711 FROM sys.dual;
712
713 l_cont_instance_id NUMBER;
714 l_cont_name VARCHAR2(50);
715 l_description VARCHAR2(240);
716 l_container_type_code VARCHAR2(30);
717 l_min_fill_pc NUMBER;
718 l_max_load_wt NUMBER;
719 l_max_vol NUMBER;
720 l_user_id NUMBER;
721 l_last_update_by NUMBER;
722 l_primary_uom VARCHAR2(3);
723 -- J: W/V Changes
724
725 l_container_rec WSH_GLBL_VAR_STRCT_GRP.Delivery_Details_Rec_Type;
726 l_del_assg_rec WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_Type;
727
728 l_row_id VARCHAR2(30);
729 l_del_assg_id NUMBER;
730
731 l_cont_name VARCHAR2(30);
732 l_org_name VARCHAR2(240);
733
734 l_item_name VARCHAR2(2000);
735 l_cont_rec wsh_container_actions.cont_inst_rec;
736 l_cont_tab wsh_container_actions.cont_inst_tab;
737 i NUMBER;
738 j NUMBER;
739 cnt NUMBER;
740 l_cont_dummy_tab WSH_UTIL_CORE.id_tab_type;
741 l_assignment_dummy_tab WSH_UTIL_CORE.id_tab_type;
742 l_delivery_detail_id NUMBER;
743 --lpn conv
744 l_orig_value VARCHAR2(2);
745 l_orig_update_cont_value VARCHAR2(2);
746 l_net_weight number;
747
748 l_LPN_PREFIX mtl_parameters.LPN_PREFIX%TYPE;
752 --l_cont_names WSH_GLBL_VAR_STRCT_GRP.v50_Tbl_Type;
749 l_LPN_SUFFIX mtl_parameters.LPN_SUFFIX%TYPE;
750 l_LPN_STARTING_NUMBER mtl_parameters.LPN_STARTING_NUMBER%TYPE;
751 l_TOTAL_LPN_LENGTH mtl_parameters.TOTAL_LPN_LENGTH%TYPE;
753 --l_lpn_ids WSH_UTIL_CORE.id_tab_type;
754 l_cont_name_dig number;
755 l_tare_wt NUMBER;
756 l_tare_wt_uom VARCHAR2(10);
757 l_msg_count NUMBER;
758 l_msg_data VARCHAR2(32767);
759 l_container_info_rec WSH_GLBL_VAR_STRCT_GRP.ContInfoRectype;
760 l_gen_lpn_rec WMS_Data_Type_Definitions_pub.AutoCreateLPNRecordType;
761 l_lpn_tbl WMS_Data_Type_Definitions_pub.LPNTableType;
762 l_num_warnings NUMBER := 0;
763 l_num_errors NUMBER := 0;
764 l_return_status VARCHAR2(10);
765 l_additional_cont_attr wsh_glbl_var_strct_grp.LPNRecordType;
766 l_organization_id NUMBER;
767 l_inventory_item_id NUMBER;
768 l_first number;
769 CURSOR c_get_default_parameters (v_organization_id NUMBER) IS
770 SELECT LPN_PREFIX,
771 LPN_SUFFIX,
772 LPN_STARTING_NUMBER ,
773 TOTAL_LPN_LENGTH
774 FROM mtl_parameters
775 WHERE ORGANIZATION_ID = v_organization_id;
776
777 CURSOR c_get_lpn_info(v_lpn_id NUMBER) IS
778 SELECT gross_weight ,
779 GROSS_WEIGHT_UOM_CODE,
780 TARE_WEIGHT_UOM_CODE,
781 TARE_WEIGHT,
782 --container_volume,
783 --CONTAINER_VOLUME_UOM,
784 content_volume, --filled volume
785 CONTENT_VOLUME_UOM_CODE ,
786 locator_id,
787 subinventory_code,
788 license_plate_number ,
789 organization_id,
790 inventory_item_id
791 FROM wms_license_plate_numbers
792 WHERE lpn_id = v_lpn_id;
793
794 CURSOR c_get_lpn_from_history (v_lpn_id number)IS
795 SELECT wlh.LICENSE_PLATE_NUMBER,
796 wlh.organization_id,
797 wlh.inventory_item_id
798 FROM wms_lpn_histories wlh
799 WHERE wlh.lpn_id = v_lpn_id
800 --AND wlh.OPERATION_MODE = 1
801 AND wlh.lpn_context = 7
802 AND wlh.SOURCE_TYPE_ID = 1;
803
804 CURSOR c_get_rowid (v_delivery_detail number) IS
805 SELECT rowid , container_name
806 from wsh_delivery_details
807 WHERE delivery_detail_id = v_delivery_detail;
808
809
810
811
812
813 --
814 l_debug_on BOOLEAN;
815 --
816 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CREATE_CONT_INSTANCE_MULTI';
817 --
818 BEGIN
819
820 --
821 --
822 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
823 --
824 IF l_debug_on IS NULL
825 THEN
826 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
827 END IF;
828 --
829 IF l_debug_on THEN
830 WSH_DEBUG_SV.push(l_module_name);
831 --
832 WSH_DEBUG_SV.log(l_module_name,'X_CONT_NAME',X_CONT_NAME);
833 WSH_DEBUG_SV.log(l_module_name,'P_CONT_ITEM_ID',P_CONT_ITEM_ID);
834 WSH_DEBUG_SV.log(l_module_name,'X_CONT_INSTANCE_ID',X_CONT_INSTANCE_ID);
835 WSH_DEBUG_SV.log(l_module_name,'P_PAR_DETAIL_ID',P_PAR_DETAIL_ID);
836 WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
837 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_TYPE_CODE',P_CONTAINER_TYPE_CODE);
838 END IF;
839 --
840 --
841 IF l_debug_on THEN
842 WSH_DEBUG_SV.logmsg(l_module_name, 'IN CREATE_CONT_INSTANCE_MULTI ' );
843 END IF;
844 --
845
846 l_orig_value := WSH_WMS_LPN_GRP.g_call_group_api;
847 l_orig_update_cont_value := WSH_WMS_LPN_GRP.g_update_to_container;
848 l_inventory_item_id := p_cont_item_id;
849
850 IF p_organization_id IS NULL AND p_lpn_id IS NULL THEN
851 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ORG_NULL');
852 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
853 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
854 --
855 IF l_debug_on THEN
856 WSH_DEBUG_SV.pop(l_module_name);
857 END IF;
858 --
859 return;
860 END IF;
861
862 --lpn conv
863 IF p_lpn_id IS NULL THEN --{
864
865 WSH_WMS_LPN_GRP.g_call_group_api := 'N';
866 WSH_WMS_LPN_GRP.g_update_to_container := 'N';
867
868 IF c_wms_code_present = 'Y' THEN --{
869
870 IF l_debug_on THEN
871 WSH_DEBUG_SV.logmsg(l_module_name,
872 'calling wms_container_grp.Auto_Create_LPNs' );
873 END IF;
874
875 l_gen_lpn_rec.container_item_id := l_inventory_item_id;
876 l_gen_lpn_rec.organization_id := p_organization_id;
877 --l_gen_lpn_rec.lpn_prefix:= l_LPN_PREFIX;
878 --l_gen_lpn_rec.lpn_suffix := l_LPN_SUFFIX;
879 --l_gen_lpn_rec.starting_num := l_LPN_STARTING_NUMBER;
880 --l_gen_lpn_rec.total_length := l_TOTAL_LPN_LENGTH;
881 l_gen_lpn_rec.quantity:= p_num_of_containers;
882
883 wms_container_grp.Auto_Create_LPNs (
884 p_api_version => 1.0
885 , p_init_msg_list => fnd_api.g_false
886 , p_commit => fnd_api.g_false
887 , x_return_status => l_return_status
888 , x_msg_count => l_msg_count
892 , p_lpn_table => l_lpn_tbl
889 , x_msg_data => l_msg_data
890 , p_caller => 'WSH_GENERATE'
891 , p_gen_lpn_rec => l_gen_lpn_rec
893 );
894 wsh_util_core.api_post_call
895 (
896 p_return_status => l_return_status,
897 x_num_warnings => l_num_warnings,
898 x_num_errors => l_num_errors,
899 p_msg_data => l_msg_data
900 );
901 WSH_WMS_LPN_GRP.g_call_group_api := l_orig_value;
902 WSH_WMS_LPN_GRP.g_update_to_container := l_orig_update_cont_value;
903
904 j := 1;
905 i := l_lpn_tbl.first;
906 WHILE i IS NOT NULL LOOP
907 IF l_debug_on THEN
908 WSH_DEBUG_SV.log(l_module_name,'container_name',
909 l_lpn_tbl(i).license_plate_number);
910 WSH_DEBUG_SV.log(l_module_name,'lpn_id',
911 l_lpn_tbl(i).lpn_id);
912 END IF;
913 l_container_info_rec.container_names(j)
914 := l_lpn_tbl(i).license_plate_number;
915 l_container_info_rec.lpn_ids(j) := l_lpn_tbl(i).lpn_id;
916
917 IF (l_container_info_rec.container_names(j) IS NULL) OR (l_container_info_rec.lpn_ids(j) IS NULL )THEN
918 RAISE FND_API.G_EXC_ERROR;
919 END IF;
920
921 i := l_lpn_tbl.NEXT(i);
922 j := J + 1;
923 END LOOP;
924
925 l_container_rec.weight_uom_code :=
926 l_lpn_tbl(1).GROSS_WEIGHT_UOM_CODE;
927 l_container_rec.gross_weight :=
928 l_lpn_tbl(1).GROSS_WEIGHT;
929 l_additional_cont_attr.tare_weight :=
930 l_lpn_tbl(1).TARE_WEIGHT;
931 l_additional_cont_attr.tare_weight_uom_code :=
932 l_lpn_tbl(1).TARE_WEIGHT_UOM_CODE;
933 l_container_rec.volume_uom_code :=
934 l_lpn_tbl(1).CONTAINER_VOLUME_UOM;
935 l_container_rec.volume := l_lpn_tbl(1).CONTAINER_VOLUME;
936 l_additional_cont_attr.filled_volume_uom_code :=
937 l_lpn_tbl(1).CONTENT_VOLUME_UOM_CODE;
938 l_container_rec.filled_volume := l_lpn_tbl(1).CONTENT_VOLUME;
939 l_container_rec.locator_id := l_lpn_tbl(1).locator_id;
940 l_container_rec.subinventory := l_lpn_tbl(1).SUBINVENTORY_CODE;
941
942 ELSE --}{
943 /* commment out this part once the wms code is ready*/
944 OPEN c_get_default_parameters(p_organization_id);
945 FETCH c_get_default_parameters INTO
946 l_LPN_PREFIX,
947 l_LPN_SUFFIX,
948 l_LPN_STARTING_NUMBER ,
949 l_TOTAL_LPN_LENGTH;
950 CLOSE c_get_default_parameters;
951 IF l_TOTAL_LPN_LENGTH IS NOT NULL THEN
952 l_cont_name_dig := length(l_TOTAL_LPN_LENGTH) -
953 nvl(length(l_LPN_SUFFIX),0) -
954 NVL(length(l_LPN_PREFIX),0);
955 IF l_cont_name_dig < 0 THEN
956 l_cont_name_dig := NULL;
957 END IF;
958 END IF;
959 Create_Multiple_Cont_name (
960 p_cont_name => NULL,
961 p_cont_name_pre => l_LPN_PREFIX,
962 p_cont_name_suf => l_LPN_SUFFIX,
963 p_cont_name_num => l_LPN_STARTING_NUMBER,
964 p_cont_name_dig => l_cont_name_dig,
965 p_quantity => p_num_of_containers,
966 x_cont_names => l_container_info_rec.container_names,
967 x_return_status => l_return_status
968 );
969 wsh_util_core.api_post_call
970 (
971 p_return_status => l_return_status,
972 x_num_warnings => l_num_warnings,
973 x_num_errors => l_num_errors
974 );
975 i := l_container_info_rec.container_names.FIRST;
976 WHILE i IS NOT NULL LOOP
977 IF l_debug_on THEN
978 WSH_DEBUG_SV.log(l_module_name,'container_name', l_container_info_rec.container_names(i));
979 END IF;
980 l_container_info_rec.lpn_ids(i) := NULL;
981 i := l_container_info_rec.container_names.NEXT(i);
982 END LOOP;
983 END IF ; --} bmso
984 ELSE --}{
985 IF p_caller LIKE 'WSH_IB%' THEN --{
986 l_container_rec.container_name := x_cont_name;
987 l_organization_id := p_organization_id;
988 l_inventory_item_id := NULL;
989 l_container_info_rec.container_names(1) := l_container_rec.container_name;
990 l_container_info_rec.lpn_ids(1) := p_lpn_id;
991 ELSE --}{
992 OPEN c_get_lpn_info(p_lpn_id);
993 FETCH c_get_lpn_info INTO
994 l_container_rec.gross_weight,
995 l_container_rec.weight_uom_code,
996 l_additional_cont_attr.tare_weight_uom_code,
997 l_additional_cont_attr.tare_weight,
998 --l_container_rec.volume,
999 --l_container_rec.volume_uom_code,
1000 l_container_rec.filled_volume,
1001 l_additional_cont_attr.filled_volume_uom_code,
1002 l_container_rec.locator_id,
1003 l_container_rec.subinventory,
1004 l_container_rec.container_name,
1005 l_organization_id,
1006 l_inventory_item_id;
1007
1008 IF c_get_lpn_info%NOTFOUND THEN
1009 IF l_debug_on THEN
1010 WSH_DEBUG_SV.log(l_module_name,'Error invalid Lpn_id ',
1014 END IF;
1011 p_lpn_id);
1012 END IF;
1013 RAISE FND_API.G_EXC_ERROR;
1015
1016 /*
1017 --compute the net weight
1018 IF (l_inventory_item_id IS NOT NULL)
1019 AND (l_tare_wt IS NOT NULL)
1020 AND (l_tare_wt_uom IS NOT NULL)
1021 AND (l_container_rec.weight_uom_code IS NOT NULL)
1022 AND (l_container_rec.gross_weight IS NOT NULL)
1023 THEN
1024 l_net_weight := l_container_rec.gross_weight
1025 - WSH_WV_UTILS.Convert_Uom (l_tare_wt_uom,
1026 l_container_rec.weight_uom_code,
1027 l_tare_wt,
1028 l_inventory_item_id);
1029 END IF;
1030 IF l_debug_on THEN
1031 WSH_DEBUG_SV.log(l_module_name,'l_net_weight ',l_net_weight);
1032 END IF;
1033 l_container_rec.net_weight:= l_net_weight;
1034 */
1035 l_container_info_rec.container_names(1) := l_container_rec.container_name;
1036 l_container_info_rec.lpn_ids(1) := p_lpn_id;
1037
1038 CLOSE c_get_lpn_info;
1039 END IF; --}
1040
1041 IF p_organization_id IS NULL AND l_organization_id IS NULL THEN
1042 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ORG_NULL');
1043 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1044 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1045 --
1046 IF l_debug_on THEN
1047 WSH_DEBUG_SV.pop(l_module_name);
1048 END IF;
1049 --
1050 return;
1051 END IF;
1052
1053 END IF; --}
1054
1055 l_container_rec.organization_id := NVL(p_organization_id,l_organization_id);
1056 l_container_rec.inventory_item_id := l_inventory_item_id;
1057 l_container_rec.container_type_code := p_container_type_code;
1058 l_container_rec.ignore_for_planning := p_ignore_for_planning;
1059
1060 default_container_attr(l_container_rec,
1061 l_additional_cont_attr ,
1062 p_caller,
1063 l_return_status);
1064
1065 wsh_util_core.api_post_call
1066 (
1067 p_return_status => l_return_status,
1068 x_num_warnings => l_num_warnings,
1069 x_num_errors => l_num_errors
1070 );
1071 --lpn conv
1072
1073
1074
1075 -- Populate Delivery Detail id and Delivery Assignment id
1076 -- within the Loop
1077
1078 IF l_debug_on THEN
1079 WSH_DEBUG_SV.logmsg(l_module_name, 'CREATING DELIVERY DETAIL'||p_num_of_containers );
1080 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.CREATE_DELIVERY_DETAILS_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
1081 END IF;
1082 --
1083
1084
1085 WSH_DELIVERY_DETAILS_PKG.create_delivery_details_bulk
1086 ( p_delivery_details_info => l_container_rec,
1087 p_num_of_rec => p_num_of_containers,
1088 p_container_info_rec => l_container_info_rec,
1089 x_return_status => x_return_status,
1090 x_dd_id_tab => l_cont_dummy_tab
1091 );
1092
1093 --
1094 IF l_debug_on THEN
1095 WSH_DEBUG_SV.logmsg(l_module_name, 'Return status ' || x_return_status);
1096 WSH_DEBUG_SV.logmsg(l_module_name, 'CREATED DELIVERY DETAIL ' || l_cont_dummy_tab.count);
1097 END IF;
1098 --
1099
1100 IF x_return_status IN
1101 (WSH_UTIL_CORE.G_RET_STS_ERROR,
1102 WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ) THEN
1103 --
1104 IF l_debug_on THEN
1105 WSH_DEBUG_SV.logmsg(l_module_name, 'ERROR CREATING CONTAINER' || TO_CHAR ( L_CONT_INSTANCE_ID ) );
1106 END IF;
1107 --
1108 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
1109 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1110 --
1111 IF l_debug_on THEN
1112 WSH_DEBUG_SV.pop(l_module_name);
1113 END IF;
1114 --
1115 return;
1116 END IF;
1117
1118 l_first := l_cont_dummy_tab.FIRST;
1119 OPEN c_get_rowid(l_cont_dummy_tab(l_first));
1120 FETCH c_get_rowid INTO x_row_id, x_cont_name;
1121 CLOSE c_get_rowid;
1122 --
1123 IF l_debug_on THEN
1124 WSH_DEBUG_SV.log(l_module_name, 'x_row_id',x_row_id);
1125 WSH_DEBUG_SV.log(l_module_name, 'x_cont_name',x_cont_name);
1126 WSH_DEBUG_SV.logmsg(l_module_name, 'CREATED CONTAINER DELIVERY DETAIL ');
1127 END IF;
1128 --
1129
1130 l_del_assg_rec.delivery_id := null;
1131 l_del_assg_rec.delivery_detail_id := l_cont_instance_id;
1132 l_del_assg_rec.parent_delivery_detail_id := null;
1133
1134 --
1135 IF l_debug_on THEN
1136 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.CREATE_DELIV_ASSIGNMENT_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
1137 --WSH_DEBUG_SV.logmsg(l_module_name,'NUMBER OF CONTS'||p_num_of_containers);
1138 WSH_DEBUG_SV.logmsg(l_module_name,'NUMBER OF RECORDS IN WDD '||l_cont_dummy_tab.count);
1139 END IF;
1140 --
1141
1142 WSH_DELIVERY_DETAILS_PKG.create_deliv_assignment_bulk
1143 ( p_delivery_assignments_info => l_del_assg_rec,
1144 p_num_of_rec => p_num_of_containers,
1148 );
1145 p_dd_id_tab => l_cont_dummy_tab,
1146 x_da_id_tab => l_assignment_dummy_tab,
1147 x_return_status => x_return_status
1149
1150 IF l_debug_on THEN
1151 WSH_DEBUG_SV.logmsg(l_module_name,'COUNT OF WDA RECORDS'||l_assignment_dummy_tab.count);
1152 WSH_DEBUG_SV.logmsg(l_module_name,'Create Delivery Assignment, Return Status'||x_return_status);
1153 END IF;
1154
1155 IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
1156 WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
1157 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
1158 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1159 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1160 --
1161 IF l_debug_on THEN
1162 WSH_DEBUG_SV.pop(l_module_name);
1163 END IF;
1164 --
1165 return;
1166 END IF;
1167
1168 --x_cont_instance_id := l_cont_instance_id; lpn conv
1169 l_first := l_cont_dummy_tab.FIRST;
1170 IF l_first IS NOT NULL THEN
1171 x_cont_instance_id := l_cont_dummy_tab(l_first);
1172 END IF;
1173 x_cont_tab := l_cont_dummy_tab;
1174 -- J: W/V Changes
1175 x_unit_weight := l_container_rec.unit_weight;
1176 x_unit_volume := l_container_rec.unit_volume;
1177 x_weight_uom_code := l_container_rec.weight_uom_code;
1178 x_volume_uom_code := l_container_rec.volume_uom_code;
1179
1180 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1181
1182 --
1183 IF l_debug_on THEN
1184 WSH_DEBUG_SV.pop(l_module_name);
1185 END IF;
1186 --
1187 EXCEPTION
1188 WHEN FND_API.G_EXC_ERROR THEN
1189 WSH_WMS_LPN_GRP.g_call_group_api := l_orig_value;
1190 WSH_WMS_LPN_GRP.g_update_to_container := l_orig_update_cont_value;
1191 IF c_get_lpn_info%ISOPEN THEN
1192 CLOSE c_get_lpn_info;
1193 END IF;
1194 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1195
1196 IF l_debug_on THEN
1197 WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1198 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
1199 END IF;
1200
1201 WHEN Others THEN
1202 WSH_WMS_LPN_GRP.g_call_group_api := l_orig_value;
1203 WSH_WMS_LPN_GRP.g_update_to_container := l_orig_update_cont_value;
1204 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Create_Cont_Instance_Multi',l_module_name);
1205 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1206
1207 --
1208 IF l_debug_on THEN
1209 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
1210 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
1211 END IF;
1212 --
1213 END Create_Cont_Instance_Multi;
1214
1215 --
1216 /*
1217 -----------------------------------------------------------------------------
1218 PROCEDURE : Create_Container_Instance
1219 PARAMETERS : p_cont_name - name for the container
1220 p_cont_item_id - container item id (containers inv item id)
1221 x_cont_instance_id - delivery_detail_id for new container - if
1222 null then it will return a new id
1223 p_par_detail_id - the parent detail id (parent container)
1224 p_organization_id - organization id
1225 p_container_type_code - the container type code of container
1226 x_row_id - rowid of the new container record
1227 x_return_status - return status of API
1228 DESCRIPTION : This procedure creates a new container and defaults some of the
1229 container item attributes. The container item id of the
1230 container that is being created is required. If the container
1231 name is not specified it defaults the name to be equal to the
1232 delivery detail id.
1233
1234 PLEASE DO NOT USE THIS PROCEDURE ANYMORE
1235
1236 ------------------------------------------------------------------------------
1237 */
1238 --
1239 --THIS PROCEDURE IS OBSOLETE
1240 PROCEDURE Create_Container_Instance (
1241 x_cont_name IN OUT NOCOPY VARCHAR2,
1242 p_cont_item_id IN NUMBER,
1243 x_cont_instance_id IN OUT NOCOPY NUMBER,
1244 p_par_detail_id IN NUMBER,
1245 p_organization_id IN NUMBER,
1246 p_container_type_code IN VARCHAR2,
1247 x_row_id OUT NOCOPY VARCHAR2,
1248 x_return_status OUT NOCOPY VARCHAR2) IS
1249
1250 BEGIN
1251
1252 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1253
1254 END Create_Container_Instance;
1255
1256
1257 /*
1258 -----------------------------------------------------------------------------
1259 PROCEDURE : Create_Multiple_Containers
1260 PARAMETERS : p_cont_item_id - container item id (containers inv item id)
1261 p_organization_id - organization id
1262 p_container_type_code - the container type code of container
1263 p_cont_name - name for the container if qty is 1 (mainly used
1264 by public APIs)
1265 p_cont_name_pre - prefix for container name
1266 p_cont_name_suf - suffix for container name
1267 p_cont_name_num - starting number for number part of container
1268 name
1269 p_cont_name_dig - number of digits to use for the number part
1270 of the container name
1271 p_quantity - number of containers to create
1272 x_cont_instance_tab - table of delivery_detail_ids for new
1273 containers - if null then it will return a
1274 table with new ids
1275 x_return_status - return status of API
1276 DESCRIPTION : This procedure creates a new container and defaults some of the
1277 container item attributes. The container item id of the
1281 ------------------------------------------------------------------------------
1278 container that is being created is required. If the container
1279 name is not specified it defaults the name to be equal to the
1280 delivery detail id.
1282 */
1283
1284 -- THIS PROCEDURE IS OBSOLETE
1285
1286 PROCEDURE Create_Multiple_Containers (
1287 p_cont_item_id IN NUMBER,
1288 p_organization_id IN NUMBER,
1289 p_container_type_code IN VARCHAR2,
1290 p_cont_name IN VARCHAR2,
1291 p_cont_name_pre IN VARCHAR2,
1292 p_cont_name_suf IN VARCHAR2,
1293 p_cont_name_num IN NUMBER,
1294 p_cont_name_dig IN NUMBER,
1295 p_quantity IN NUMBER,
1296 x_cont_instance_tab IN OUT NOCOPY WSH_UTIL_CORE.id_tab_type,
1297 x_return_status OUT NOCOPY VARCHAR2) IS
1298
1299 --
1300 BEGIN
1301
1302 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1303
1304 END Create_Multiple_Containers;
1305
1306
1307 /*
1308 -----------------------------------------------------------------------------
1309 PROCEDURE : Delete_Containers
1310 PARAMETERS : p_cont_tab - table of container instances to be deleted.
1311 x_return_status - return status of API
1312 DESCRIPTION : This procedure in a container instance and
1313 deletes the container. If the containers are not empty or
1314 they are assigned to deliveries that are not open, they will
1315 not be deleted. Also, if the containers are either assigned to
1316 or container other containers packed into it, they will not be
1317 deleted.
1318 ------------------------------------------------------------------------------
1319 */
1320
1321
1322 PROCEDURE Delete_Containers (
1323 p_container_id IN number,
1324 x_return_status OUT NOCOPY VARCHAR2) IS
1325
1326 CURSOR Check_Hierarchy (v_detail_id NUMBER) IS
1327 SELECT 'NOT EMPTY' FROM DUAL
1328 WHERE EXISTS (
1329 SELECT delivery_detail_id
1330 FROM wsh_delivery_assignments
1331 WHERE parent_delivery_detail_id = v_detail_id
1332 AND NVL(type, 'S') in ('C', 'S')
1333 AND rownum < 2
1334 UNION
1335 SELECT delivery_detail_id
1336 FROM wsh_delivery_assignments
1337 WHERE delivery_detail_id = v_detail_id
1338 AND parent_delivery_detail_id IS NOT NULL
1339 AND NVL(type, 'S') in ('C', 'S')
1340 AND rownum < 2);
1341
1342 CURSOR Check_Container (v_detail_id NUMBER) IS
1343 SELECT container_flag
1344 FROM WSH_DELIVERY_DETAILS
1345 WHERE delivery_detail_id = v_detail_id;
1346
1347
1348
1349 l_cont_status VARCHAR2(30) := 'EMPTY';
1350 l_container_flag VARCHAR2(1);
1351
1352 l_del_id NUMBER;
1353 l_del_sts VARCHAR2(10);
1354
1355 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1356
1357
1358 Invalid_Container EXCEPTION;
1359 Invalid_Delivery EXCEPTION;
1360 Invalid_Detail EXCEPTION;
1361 Delete_Det_Error EXCEPTION;
1362 Cont_Not_Empty EXCEPTION;
1363 Container_Error EXCEPTION;
1364 Unassign_Del_Error EXCEPTION;
1365
1366 --
1367 l_debug_on BOOLEAN;
1368 --
1369 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'DELETE_CONTAINERS';
1370 --
1371 BEGIN
1372 --
1373 --
1374 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
1375 --
1376 IF l_debug_on IS NULL
1377 THEN
1378 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
1379 END IF;
1380 --
1381 IF l_debug_on THEN
1382 WSH_DEBUG_SV.push(l_module_name);
1383 --
1384 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_ID',P_CONTAINER_ID);
1385 END IF;
1386 --
1387 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1388 SAVEPOINT Delete_Cont;
1389 IF (NVL(p_container_id,0) = 0) THEN
1390 raise Invalid_Container;
1391 ELSE
1392 OPEN Check_Container (p_container_id);
1393 IF Check_Container%NOTFOUND THEN
1394 raise Invalid_Detail;
1395 ELSE
1396 FETCH Check_Container INTO l_container_flag;
1397 IF l_container_flag = 'N' THEN
1398 raise Invalid_Detail;
1399 END IF;
1400 END IF;
1401 IF Check_Container%ISOPEN THEN
1402 CLOSE Check_Container;
1403 END IF;
1404 END IF;
1405 -- get the delivery status of the container and check if it is assigned
1406 -- to a closed or in-transit delivery (only open deliveries allowed)
1407
1408 --
1409 IF l_debug_on THEN
1410 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
1411 END IF;
1412 --
1413 WSH_CONTAINER_UTILITIES.Get_Delivery_Status (
1414 p_container_id,
1415 l_del_id,
1416 l_del_sts,
1417 x_return_status);
1418
1419 IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
1420 raise Container_Error;
1421 END IF;
1422 IF ((nvl(l_del_id,-99) <> -99) AND (nvl(l_del_sts,'N/A') <> 'OP')) THEN
1423 raise Invalid_Delivery;
1424 END IF;
1425 l_cont_status := 'EMPTY';
1426
1430
1427 OPEN Check_Hierarchy (p_container_id);
1428
1429 FETCH Check_Hierarchy INTO l_cont_status;
1431 IF Check_Hierarchy%NOTFOUND THEN
1432
1433
1434 --
1435 IF l_debug_on THEN
1436 WSH_DEBUG_SV.log(l_module_name,'Delivery Status',l_del_sts);
1437 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_PKG.DELETE_DELIVERY_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
1438 END IF;
1439 --
1440 WSH_DELIVERY_DETAILS_PKG.Delete_Delivery_Details (
1441 p_rowid => null,
1442 p_delivery_detail_id => p_container_id,
1443 x_return_status => x_return_status);
1444
1445 --
1446 IF l_debug_on THEN
1447 WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
1448 END IF;
1449 --
1450
1451 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1452 raise Container_Error;
1453 END IF;
1454
1455 ELSE
1456
1457 IF (nvl(l_cont_status,'EMPTY') <> 'EMPTY') THEN
1458 raise Cont_Not_Empty;
1459 ELSE
1460 raise Container_Error;
1461 END IF;
1462 END IF;
1463
1464 IF Check_Hierarchy%ISOPEN THEN
1465 CLOSE Check_Hierarchy;
1466 END IF;
1467
1468
1469 --
1470 IF l_debug_on THEN
1471 WSH_DEBUG_SV.pop(l_module_name);
1472 END IF;
1473 --
1474 EXCEPTION
1475
1476 WHEN Invalid_Container THEN
1477 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NULL_DELETE');
1478 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1479 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1480 --
1481 IF l_debug_on THEN
1482 WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_CONTAINER exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1483 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_CONTAINER');
1484 END IF;
1485 --
1486 WHEN Invalid_Delivery THEN
1487 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
1488 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1489 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1490 --
1491 IF l_debug_on THEN
1492 WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DELIVERY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1493 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_DELIVERY');
1494 END IF;
1495 --
1496 WHEN Invalid_Detail THEN
1497 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DELETE_NOT_CONT');
1498 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1499 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1500 --
1501 IF l_debug_on THEN
1502 WSH_DEBUG_SV.logmsg(l_module_name,'INVALID_DETAIL exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1503 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:INVALID_DETAIL');
1504 END IF;
1505 --
1506 WHEN Cont_Not_Empty THEN
1507 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DELETE_NOT_EMPTY');
1508 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1509 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
1510 --
1511 IF l_debug_on THEN
1512 WSH_DEBUG_SV.logmsg(l_module_name,'CONT_NOT_EMPTY exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1513 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CONT_NOT_EMPTY');
1514 END IF;
1515 --
1516 WHEN Container_Error THEN
1517 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1518 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DELETE_ERROR');
1519 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1520 --
1521 IF l_debug_on THEN
1522 WSH_DEBUG_SV.logmsg(l_module_name,'CONTAINER_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1523 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:CONTAINER_ERROR');
1524 END IF;
1525 --
1526 WHEN Unassign_Del_Error THEN
1527 ROLLBACK to Delete_Cont;
1528 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1529 FND_MESSAGE.SET_NAME('WSH','WSH_UNASSIGN_DEL_ERROR');
1530 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1531
1532 --
1533 IF l_debug_on THEN
1534 WSH_DEBUG_SV.logmsg(l_module_name,'UNASSIGN_DEL_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
1535 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:UNASSIGN_DEL_ERROR');
1536 END IF;
1537 --
1538 WHEN Others THEN
1539 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Delete_Containers',l_module_name);
1540 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1541
1542 --
1543 IF l_debug_on THEN
1544 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
1545 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
1546 END IF;
1547 --
1548 END Delete_Containers;
1549
1550 -- THIS PROCEDURE IS OBSOLETE
1551 /*
1552 -----------------------------------------------------------------------------
1553 PROCEDURE : Update_Container
1554 PARAMETERS : p_container_name - new container name that needs to be assigned
1555 to the existing container.
1559 to be used only if container instance id in the input parameter
1556 p_container_instance_id - the delivery detail id for the
1557 container that needs to be updated.
1558 p_old_cont_name - exisiting container name for the container,
1560 is null.
1561 x_return_status - return status of API
1562 DESCRIPTION : This procedure takes in a new container name and existing
1563 container information like the delivery detail id and existing
1564 container name that needs to be updated. The API checks to see
1565 if the container that is being updated is assigned to a closed,
1566 confirmed or in-transit delivery. If it is, no update is
1567 allowed - if not, only the container name can be updated.
1568 ------------------------------------------------------------------------------
1569 */
1570
1571
1572 --THIS PROCEDURE IS OBSOLETE
1573 PROCEDURE Update_Container (
1574 p_container_name IN VARCHAR2,
1575 p_container_instance_id IN NUMBER,
1576 p_old_cont_name IN VARCHAR2,
1577 x_return_status OUT NOCOPY VARCHAR2) IS
1578
1579 BEGIN
1580
1581 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1582
1583 END Update_Container;
1584
1585
1586
1587 /*
1588 -----------------------------------------------------------------------------
1589 PROCEDURE : Assign_Detail
1590 PARAMETERS : p_container_instance_id - container instance id of container
1591 p_del_detail_tab - table of delivery detail ids
1592 x_pack_status - status of container after packing the lines
1593 into it : underpacked or overpacked
1594 x_return_status - return status of API
1595 DESCRIPTION : This procedure assigns a number of lines to the specified
1596 container instance and returns a pack status of underpacked
1597 or overpacked or success.
1598 ------------------------------------------------------------------------------
1599 */
1600
1601
1602 PROCEDURE Assign_Detail(
1603 p_container_instance_id IN NUMBER,
1604 p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
1605 x_pack_status OUT NOCOPY VARCHAR2,
1606 x_return_status OUT NOCOPY VARCHAR2,
1607 p_check_credit_holds IN BOOLEAN) IS
1608
1609 CURSOR Get_First_Line (v_cont_instance_id NUMBER) IS
1610 SELECT delivery_detail_id
1611 FROM wsh_delivery_assignments_v
1612 WHERE parent_delivery_detail_id = v_cont_instance_id
1613 AND rownum < 2;
1614
1615 CURSOR Get_Cont_Item IS
1616 SELECT inventory_item_id, master_serial_number
1617 FROM WSH_DELIVERY_DETAILS
1618 WHERE delivery_detail_id = p_container_instance_id
1619 AND container_flag = 'Y';
1620
1621 CURSOR Get_Det_Cont_Item (v_detail_id NUMBER) IS
1622 SELECT nvl(detail_container_item_id, master_container_item_id),
1623 source_line_id, source_header_id,source_code
1624 FROM WSH_DELIVERY_DETAILS
1625 WHERE delivery_detail_id = v_detail_id
1626 AND container_flag = 'N';
1627
1628 l_del_detail_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
1629
1630 l_group_id_tab WSH_UTIL_CORE.id_tab_type;
1631 -- l_temp_detail_tab WSH_UTIL_CORE.id_tab_type;
1632
1633 l_src_line_id NUMBER;
1634 l_src_hdr_id NUMBER;
1635 l_source_code VARCHAR2(30);
1636
1637 cnt NUMBER;
1638 i NUMBER;
1639 l_group_id NUMBER;
1640
1641 l_del_rows WSH_UTIL_CORE.id_tab_type;
1642 l_ret_sts VARCHAR2(1);
1643
1644 l_cont_name VARCHAR2(30);
1645 l_delivery_id NUMBER;
1646 l_del_status VARCHAR2(10);
1647
1648 l_det_cont_item_id NUMBER;
1649 l_cont_item_id NUMBER;
1650
1651 l_tmp_status VARCHAR2(30) := 'OK';
1652
1653 l_attr_flag VARCHAR2(1) := 'N';
1654
1655 l_upd_flag BOOLEAN := FALSE;
1656
1657 l_master_serial_number VARCHAR2(30);
1658 l_master_cont_id NUMBER;
1659 l_master_cont_name VARCHAR2(30);
1660
1661 l_attr_tab wsh_delivery_autocreate.grp_attr_tab_type;
1662 l_group_tab wsh_delivery_autocreate.grp_attr_tab_type;
1663 l_action_rec wsh_delivery_autocreate.action_rec_type;
1664 l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
1665 l_matched_entities wsh_util_core.id_tab_type;
1666 l_out_rec wsh_delivery_autocreate.out_rec_type;
1667
1668
1669
1670 --
1671 l_debug_on BOOLEAN;
1672 --
1673 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'ASSIGN_DETAIL';
1674 --
1675 BEGIN
1676
1677 --
1678 --
1679 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
1680 --
1681 IF l_debug_on IS NULL
1682 THEN
1683 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
1684 END IF;
1685 --
1686 IF l_debug_on THEN
1687 WSH_DEBUG_SV.push(l_module_name);
1688 --
1689 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
1690 WSH_DEBUG_SV.log(l_module_name,'P_CHECK_CREDIT_HOLDS',P_CHECK_CREDIT_HOLDS);
1691 END IF;
1692 --
1693 IF p_del_detail_tab.COUNT = 0 THEN
1694 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1695 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_DET_ASSG_NULL');
1696 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1697 --
1698 IF l_debug_on THEN
1699 WSH_DEBUG_SV.pop(l_module_name);
1700 END IF;
1701 --
1702 return;
1703 END IF;
1704
1705 -- get the delivery status of the container and check if it is assigned
1706 -- to a closed or in-transit delivery (only open deliveries allowed)
1710 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
1707
1708 --
1709 IF l_debug_on THEN
1711 END IF;
1712 --
1713 WSH_CONTAINER_UTILITIES.Get_Delivery_Status ( p_container_instance_id,
1714 l_delivery_id,
1715 l_del_status,
1716 x_return_status);
1717
1718 IF l_debug_on THEN
1719 WSH_DEBUG_SV.log(l_module_name,'Delivery Status',l_del_status);
1720 WSH_DEBUG_SV.log(l_module_name,'x_return_status',x_return_status);
1721 END IF;
1722 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1723 --
1724 IF l_debug_on THEN
1725 WSH_DEBUG_SV.pop(l_module_name);
1726 END IF;
1727 --
1728 return;
1729 END IF;
1730
1731 IF (nvl(l_delivery_id,-99) <> -99) THEN
1732
1733 IF (nvl(l_del_status,'N/A') NOT IN ('OP','SA')) THEN
1734 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
1735 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1736 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1737 x_pack_status := 'Error';
1738 --
1739 IF l_debug_on THEN
1740 WSH_DEBUG_SV.pop(l_module_name);
1741 END IF;
1742 --
1743 return;
1744 END IF;
1745 END IF;
1746
1747
1748 -- check container attributes to see if the attr columns have been populated
1749 -- if they are not null - it implies that lines are already assigned to the
1750 -- container in the hierarchy. so call the autocreate deliveries API with the
1751 -- container as the first line..
1752
1753 --
1754 IF l_debug_on THEN
1755 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
1756 END IF;
1757 --
1758 wsh_container_actions.Check_Cont_Attributes (
1759 p_container_instance_id,
1760 l_attr_flag,
1761 x_return_status);
1762
1763 --
1764 IF l_debug_on THEN
1765 WSH_DEBUG_SV.log(l_module_name,' after CHECK_CONT_ATTRIBUTES, return status is',x_return_status);
1766 END IF;
1767
1768 --dbms_output.put_line('after check attr for ' || p_container_instance_id || ' attr flag is ' || l_attr_flag || ' and ret sts is ' || x_return_status);
1769
1770 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1771 --
1772 -- Debug Statements
1773 --
1774 IF l_debug_on THEN
1775 WSH_DEBUG_SV.pop(l_module_name);
1776 END IF;
1777 --
1778 return;
1779 END IF;
1780
1781 IF l_attr_flag = 'N' THEN
1782 i := 1;
1783 ELSE
1784 l_attr_tab(1).entity_id := p_container_instance_id;
1785 l_attr_tab(1).entity_type := 'DELIVERY_DETAIL';
1786 i := 2;
1787 END IF;
1788
1789
1790 FOR j IN 1.. p_del_detail_tab.COUNT LOOP
1791 l_attr_tab(i).entity_id := p_del_detail_tab(j);
1792 l_attr_tab(i).entity_type := 'DELIVERY_DETAIL';
1793 i := i + 1;
1794 END LOOP;
1795
1796 IF Get_First_Line%ISOPEN THEN
1797 CLOSE Get_First_Line;
1798 END IF;
1799
1800 -- call auto_create del grouping API with l_temp_detail_tab returning
1801 -- l_group_id_tab of type WSH_UTIL_CORE.id_tab_type;
1802
1803 --
1804 IF l_debug_on THEN
1805 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
1806 END IF;
1807 --
1808 l_action_rec.action := 'MATCH_GROUPS';
1809
1810
1811
1812 WSH_Delivery_AutoCreate.Find_Matching_Groups(p_attr_tab => l_attr_tab,
1813 p_action_rec => l_action_rec,
1814 p_target_rec => l_target_rec,
1815 p_group_tab => l_group_tab,
1816 x_matched_entities => l_matched_entities,
1817 x_out_rec => l_out_rec,
1818 x_return_status => x_return_status);
1819
1820 --
1821 IF (x_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
1822 --dbms_output.put_line('error in autocreate');
1823 FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
1824 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
1825 --
1826 END IF;
1827
1828 i := l_attr_tab.FIRST;
1829
1830 l_group_id := l_attr_tab(i).group_id;
1831
1832 -- if l_attr_flag = Y then it means that the first record in the PL/SQL table
1833 -- is the container itself and it should be ignored. so increment counters.
1834
1835 IF l_attr_flag = 'Y' THEN
1836 i := i + 1;
1837 END IF;
1838
1839 l_del_detail_id := l_attr_tab(i).entity_id;
1840 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1841
1842 OPEN Get_Cont_Item;
1843
1844 FETCH Get_Cont_Item INTO l_cont_item_id,l_master_serial_number;
1845
1846 IF Get_Cont_Item%NOTFOUND THEN
1847 CLOSE Get_Cont_Item;
1848 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
1849 --
1850 IF l_debug_on THEN
1851 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
1852 END IF;
1853 --
1854 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
1855 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
1859 x_pack_status := 'Error';
1856 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
1857 WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
1858 x_return_status := l_ret_sts;
1860 --
1861 IF l_debug_on THEN
1862 WSH_DEBUG_SV.pop(l_module_name);
1863 END IF;
1864 --
1865 return;
1866 END IF;
1867
1868 IF Get_Cont_Item%ISOPEN THEN
1869 CLOSE Get_Cont_Item;
1870 END IF;
1871
1872
1873 WHILE i <= l_attr_tab.COUNT LOOP
1874
1875 IF l_group_id = l_attr_tab(i).group_id THEN
1876
1877
1878 l_del_detail_id := l_attr_tab(i).entity_id;
1879 l_src_line_id := NULL;
1880 l_src_hdr_id := NULL;
1881
1882 -- check if the detail container item id on the line matches the
1883 -- container item id of the container that it is being assigned to
1884
1885 OPEN Get_Det_Cont_Item (l_del_detail_id);
1886
1887 FETCH Get_Det_Cont_Item INTO
1888 l_det_cont_item_id,
1889 l_src_line_id,
1890 l_src_hdr_id,l_source_code;
1891
1892 IF Get_Det_Cont_Item%NOTFOUND THEN
1893 CLOSE Get_Det_Cont_Item;
1894 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
1895 l_tmp_status := 'Error';
1896 GOTO next_line;
1897 END IF;
1898
1899 IF Get_Det_Cont_Item%ISOPEN THEN
1900 CLOSE Get_Det_Cont_Item;
1901 END IF;
1902
1903 IF l_cont_item_id <> nvl(l_det_cont_item_id,l_cont_item_id) THEN
1904 FND_MESSAGE.SET_NAME('WSH','WSH_DET_CONT_ITEM_DIFF');
1905 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
1906 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
1907 IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
1908 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
1909 END IF;
1910 END IF;
1911
1912 -- check if the line has any holds on it. IF yes ignore the line
1913 -- and set a warning and proceed to the next line.
1914
1915 --
1916 --
1917 -- added to fix bug 1818233.
1918 -- Auto-pack performs 90% of time doing this check, especially
1919 -- when a single delivery line is being split into multiple due to
1920 -- container-load relationship.
1921 -- This check will be made only once for a delivery line in place of
1922 -- doing it every time we assign a split delivery line to a container.
1923 -- Thus, auto-pack lines will always call assign_detail procedure
1924 -- with parameter p_check_credit_holds = FALSE.
1925 -- Auto-pack lines will explicitly call the procedure
1926 -- WSH_DETAILS_VALIDATIONS.Check_Credit_Holds only once for a delivery
1927 -- line
1928 --
1929 IF p_check_credit_holds
1930 THEN
1931 --
1932 IF l_debug_on THEN
1933 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_CREDIT_HOLDS',WSH_DEBUG_SV.C_PROC_LEVEL);
1934 END IF;
1935 --
1936 WSH_DETAILS_VALIDATIONS.Check_Credit_Holds (
1937 l_del_detail_id,
1938 'PACK',
1939 l_src_line_id,
1940 l_src_hdr_id,
1941 l_source_code,
1942 'Y',
1943 x_return_status);
1944
1945 --
1946 IF l_debug_on THEN
1947 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
1948 END IF;
1949 --
1950 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1951 IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
1952 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
1953 END IF;
1954 l_tmp_status := 'Error';
1955 GOTO next_line;
1956 END IF;
1957 END IF;
1958
1959 -- check if line has any invalid hazmat codes - either by itself
1960 -- or if there is any incompatability with any existing lines in
1961 -- the container.
1962
1963 -- currently there is no code for this and so the API returns a
1964 -- success always..
1965
1966 --
1967 IF l_debug_on THEN
1968 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.VALIDATE_HAZARD_CLASS',WSH_DEBUG_SV.C_PROC_LEVEL);
1969 END IF;
1970 --
1971 WSH_CONTAINER_UTILITIES.Validate_Hazard_Class (
1972 l_del_detail_id,
1973 p_container_instance_id,
1974 x_return_status);
1975
1976 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1977 IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
1978 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
1979 END IF;
1980 l_tmp_status := 'Error';
1981 GOTO next_line;
1982 END IF;
1983
1984 -- create assignment with l_del_detail_id and p_container_instance_id;
1985
1986 --
1987 IF l_debug_on THEN
1988 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_DETAIL_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
1989 END IF;
1990 --
1991 WSH_DELIVERY_DETAILS_ACTIONS.Assign_Detail_To_Cont (
1992 l_del_detail_id,
1993 p_container_instance_id,
1994 x_return_status);
1995
1996 --
1997 IF l_debug_on THEN
1998 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
1999 END IF;
2000 --
2001 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2002 IF x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
2003 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
2004 ELSE
2005 -- l_ret_sts := x_return_status;
2009 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
2006 --dbms_output.put_line('error assigning ' || l_del_detail_id);
2007 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
2008 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_DETAIL_NOT_ASSIGNED');
2010 WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
2011 END IF;
2012 END IF;
2013
2014 -- store group id to check for group id of next line
2015 -- l_group_id := l_group_id_tab(cnt);
2016
2017 -- now update the container grouping attribute columns with the
2018 -- attributes from the delivery details (only for first line).
2019 -- we need to do this regardless of the fact the the line may have
2020 -- grouping attributes populated as in the case of updating line direction
2021 -- of a container already assigned to a delivery.
2022
2023 IF NOT l_upd_flag THEN
2024
2025 --dbms_output.put_line('calling update cont hierarchy with ' || p_container_instance_id);
2026 --
2027 IF l_debug_on THEN
2028 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
2029 END IF;
2030 --
2031 wsh_container_actions.Update_Cont_Hierarchy (
2032 l_del_detail_id,
2033 NULL,
2034 p_container_instance_id,
2035 x_return_status);
2036 --
2037 IF l_debug_on THEN
2038 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2039 END IF;
2040 --
2041
2042 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2043 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
2044 --
2045 IF l_debug_on THEN
2046 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2047 END IF;
2048 --
2049 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
2050 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2051 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2052 END IF;
2053
2054 l_upd_flag := TRUE;
2055
2056
2057
2058 END IF;
2059
2060 UPDATE WSH_DELIVERY_DETAILS
2061 SET master_serial_number = l_master_serial_number
2062 WHERE delivery_detail_id = l_del_detail_id;
2063
2064 IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2065 --dbms_output.put_line('error updating master serial number for detail ' || l_del_detail_id);
2066
2067 FND_MESSAGE.SET_NAME('WSH','WSH_DET_UPD_SER_ERROR');
2068 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
2069 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2070 IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2071 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
2072 END IF;
2073 END IF;
2074 ELSE
2075
2076 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
2077 l_tmp_status := 'Error';
2078 GOTO next_line;
2079
2080 END IF;
2081
2082 <<next_line>>
2083 IF l_tmp_status = 'Error' THEN
2084 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_DETAIL_NOT_ASSIGNED');
2085 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_id);
2086 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2087 END IF;
2088
2089 i := i + 1;
2090 l_tmp_status := 'OK';
2091
2092 END LOOP;
2093
2094 x_return_status := l_ret_sts;
2095
2096 --
2097 IF l_debug_on THEN
2098 WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
2099 WSH_DEBUG_SV.pop(l_module_name);
2100 END IF;
2101 --
2102 EXCEPTION
2103
2104 WHEN Others THEN
2105 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Assign_Detail',l_module_name);
2106 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
2107
2108 --
2109 IF l_debug_on THEN
2110 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
2111 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
2112 END IF;
2113 --
2114 END Assign_Detail;
2115
2116
2117 /*
2118 -----------------------------------------------------------------------------
2119 PROCEDURE : Unassign_Detail
2120 PARAMETERS : p_container_instance_id - container instance id of container
2121 p_delivery_id - delivery id from which detail needs to be
2122 unassigned
2123 p_del_detail_tab - table of delivery detail ids
2124 p_cont_unassign - flag to determine whether to unassign from
2125 container or not.
2126 p_del_unassign - flag to determine whether to unassign from
2127 delivery or not
2128 x_pack_status - status of container after packing the lines
2129 into it : underpacked or overpacked
2130 x_return_status - return status of API
2131 DESCRIPTION : This procedure unassigns a number of lines from the specified
2132 container instance or delivery and returns a pack status of
2133 underpacked or overpacked or success. The unassigning is
2134 determined using the two unassign flags or by specific ids.
2135 ------------------------------------------------------------------------------
2136 */
2137
2138
2139
2140 PROCEDURE Unassign_Detail(
2141 p_container_instance_id IN NUMBER,
2142 p_delivery_id IN NUMBER,
2143 p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
2147 x_return_status OUT NOCOPY VARCHAR2,
2144 p_cont_unassign IN VARCHAR2,
2145 p_del_unassign IN VARCHAR2,
2146 x_pack_status OUT NOCOPY VARCHAR2,
2148 p_action_prms IN wsh_glbl_var_strct_grp.dd_action_parameters_rec_type
2149 ) IS
2150
2151 l_del_detail_rec WSH_UTIL_CORE.ID_TAB_TYPE;
2152
2153 l_gross NUMBER;
2154 l_net NUMBER;
2155 l_volume NUMBER;
2156 -- J: W/V Changes
2157 l_fill_status VARCHAR2(1);
2158
2159 l_rows NUMBER;
2160
2161 cnt NUMBER;
2162
2163 CURSOR Get_Min_Fill IS
2164 SELECT minimum_fill_percent
2165 FROM WSH_DELIVERY_DETAILS
2166 WHERE delivery_detail_id = p_container_instance_id
2167 AND container_flag = 'Y';
2168
2169 /* wms -change : Added inentory_item_id to later check (ignore) fill pc when LPN */
2170 CURSOR Is_Container (v_detail_id NUMBER) IS
2171 SELECT container_flag, serial_number, master_serial_number, inventory_item_id
2172 FROM WSH_DELIVERY_DETAILS
2173 WHERE delivery_detail_id = v_detail_id;
2174
2175 CURSOR Get_Cont (v_detail_id NUMBER) IS
2176 SELECT wda.parent_delivery_detail_id container_instance_id, wda.delivery_id,
2177 wddp.organization_id, nvl(wddp.line_direction,'O'), -- K LPN CONV. rv
2178 wddp.container_flag -- K: MDC
2179 FROM wsh_delivery_assignments wda,
2180 wsh_delivery_details wddp -- K LPN CONV. rv
2181 WHERE wda.delivery_detail_id = v_detail_id
2182 AND wda.parent_delivery_detail_id = wddp.delivery_detail_id(+)
2183 AND NVL(wda.type, 'S') in ('S', 'C');
2184
2185
2186 l_cont_flag VARCHAR2(1);
2187 l_serial_number VARCHAR2(30);
2188 l_master_serial_number VARCHAR2(30);
2189
2190 l_master_cont_id NUMBER;
2191 l_master_cont_name VARCHAR2(30);
2192
2193 l_cont_name VARCHAR2(30);
2194
2195 l_cont_instance_id NUMBER;
2196 l_cont_org_id NUMBER; -- K LPN CONV. rv
2197 l_cont_line_dir VARCHAR2(10); -- K LPN CONV. rv
2198 l_cnt_org_id NUMBER; -- K LPN CONV. rv
2199 l_delivery_id NUMBER;
2200 l_last_line_flag VARCHAR2(1);
2201 l_attr_flag VARCHAR2(1) := 'N';
2202
2203 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
2204
2205 l_del_status VARCHAR2(10);
2206
2207 l_cont_tab WSH_UTIL_CORE.id_tab_type;
2208 l_cont_org_tab WSH_UTIL_CORE.id_tab_type; -- K LPN CONV. rv
2209 l_cont_line_dir_tab WSH_UTIL_CORE.Column_Tab_Type; -- K LPN CONV. rv
2210
2211 -- K: MDC
2212 l_mdc_index NUMBER := 0;
2213 l_mdc_details WSH_UTIL_CORE.id_tab_type;
2214
2215
2216 l_cont_item_id NUMBER; -- wms change:
2217
2218 l_num_warnings number := 0;
2219
2220 -- K LPN CONV. rv
2221 l_wms_org VARCHAR2(10) := 'N';
2222 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
2223
2224 cursor l_get_cnt_org_csr (p_cnt_inst_id IN NUMBER) is
2225 select organization_id
2226 from wsh_delivery_details
2227 where delivery_detail_id = p_cnt_inst_id;
2228
2229 -- K LPN CONV. rv
2230
2231 --
2232 l_debug_on BOOLEAN;
2233 --
2234 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UNASSIGN_DETAIL';
2235 --
2236 BEGIN
2237
2238 --
2239 --
2240 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
2241 --
2242 IF l_debug_on IS NULL
2243 THEN
2244 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
2245 END IF;
2246 --
2247 IF l_debug_on THEN
2248 WSH_DEBUG_SV.push(l_module_name);
2249 --
2250 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
2251 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
2252 WSH_DEBUG_SV.log(l_module_name,'P_CONT_UNASSIGN',P_CONT_UNASSIGN);
2253 WSH_DEBUG_SV.log(l_module_name,'P_DEL_UNASSIGN',P_DEL_UNASSIGN);
2254 END IF;
2255 --
2256 IF p_del_detail_tab.count = 0 THEN
2257 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_ASSG_NULL');
2258 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2259 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2260 --
2261 IF l_debug_on THEN
2262 WSH_DEBUG_SV.pop(l_module_name);
2263 END IF;
2264 --
2265 return;
2266 END IF;
2267
2268 cnt := 0;
2269
2270 FOR i IN 1..p_del_detail_tab.count LOOP
2271
2272 -- get the delivery status of the container and check if it is assigned
2273 -- to a closed or in-transit delivery (only open deliveries allowed)
2274 OPEN Get_Cont (p_del_detail_tab(i));
2275 FETCH Get_Cont INTO l_cont_instance_id, l_delivery_id,
2276 l_cont_org_id, l_cont_line_dir, -- K LPN CONV. rv
2277 l_cont_flag; -- K: MDC
2278
2279 IF Get_Cont%NOTFOUND THEN
2280 CLOSE Get_Cont;
2281 GOTO next_detail;
2282 END IF;
2283 IF Get_Cont%ISOPEN THEN
2284 CLOSE Get_Cont;
2285 END IF;
2286
2287 --
2288 IF l_debug_on THEN
2289 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
2290 END IF;
2291 --
2292 WSH_CONTAINER_UTILITIES.Get_Delivery_Status (
2293 l_cont_instance_id,
2294 l_delivery_id,
2295 l_del_status,
2296 x_return_status);
2297
2298 --
2299 IF l_debug_on THEN
2300 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2301 END IF;
2305 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2302 --
2303 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2304 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2306 END IF;
2307 GOTO next_detail;
2308 END IF;
2309
2310 IF (nvl(l_delivery_id,-99) <> -99) THEN
2311
2312 IF (nvl(l_del_status,'N/A') <> 'OP')
2313 AND NVL(p_action_prms.caller,'!!!!') NOT LIKE '%' || WSH_UTIL_CORE.C_SPLIT_DLVY_SUFFIX -- J-IB-NPARIKH
2314 THEN
2315 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
2316 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2317 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2318 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2319 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2320 END IF;
2321 x_pack_status := 'Error';
2322 GOTO next_detail;
2323 END IF;
2324 END IF;
2325 IF l_cont_instance_id IS NOT NULL AND l_cont_flag = 'C' THEN
2326 l_mdc_index := l_mdc_index + 1;
2327 l_mdc_details(l_mdc_index) := p_del_detail_tab(i);
2328 ELSE
2329 cnt := cnt + 1;
2330 l_del_detail_rec(cnt) := p_del_detail_tab(i);
2331 l_cont_tab(cnt) := l_cont_instance_id; -- K LPN CONV. rv
2332 l_cont_org_tab(cnt) := l_cont_org_id; -- K LPN CONV. rv
2333 l_cont_line_dir_tab(cnt) := l_cont_line_dir; -- K LPN CONV. rv
2334 END IF;
2335 <<next_detail>>
2336 null;
2337
2338 END LOOP;
2339
2340 IF l_mdc_index > 0 THEN
2341 IF l_debug_on THEN
2342 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Unpack_Details_from_Consol',WSH_DEBUG_SV.C_PROC_LEVEL);
2343 END IF;
2344 Unpack_Details_from_Consol
2345 (p_delivery_details_tab => l_mdc_details,
2346 p_caller => 'WMS_UNASSIGN_CONSOL',
2347 x_return_status => x_return_status);
2348
2349 IF l_debug_on THEN
2350 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2351 END IF;
2352 --
2353 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2354 IF x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
2355 l_num_warnings := l_num_warnings + 1;
2356 ELSE
2357 --
2358 IF l_debug_on THEN
2359 WSH_DEBUG_SV.pop(l_module_name);
2360 END IF;
2361 --
2362 return;
2363 END IF;
2364 END IF;
2365
2366 IF cnt = 0 THEN
2367 return;
2368 END IF;
2369
2370 END IF;
2371 --
2372 IF l_debug_on THEN
2373 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_MULTIPLE_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
2374 END IF;
2375 --
2376 WSH_DELIVERY_DETAILS_ACTIONS.Unassign_Multiple_Details (
2377 l_del_detail_rec,
2378 p_del_unassign,
2379 p_cont_unassign,
2380 x_return_status,
2381 null,
2382 p_action_prms);
2383
2384 --
2385 IF l_debug_on THEN
2386 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2387 END IF;
2388 --
2389 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2390 IF x_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
2391 l_num_warnings := l_num_warnings + 1;
2392 ELSE
2393 -- FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_UNASSG_ERROR');
2394 -- WSH_UTIL_CORE.Add_Message(x_return_status);
2395 --
2396 IF l_debug_on THEN
2397 WSH_DEBUG_SV.pop(l_module_name);
2398 END IF;
2399 --
2400 return;
2401 END IF;
2402 END IF;
2403
2404 -- fetch the container for each line and update the attr columns if it is
2405 -- the last line in the container hierarchy..
2406
2407 FOR i IN 1..l_del_detail_rec.count LOOP
2408
2409 IF l_cont_tab(i) IS NULL THEN
2410 -- not assigned to a container.
2411 GOTO next_line;
2412 END IF;
2413
2414 -- K LPN CONV. rv
2415 l_wms_org := wsh_util_validate.check_wms_org(l_cont_org_tab(i));
2416 -- K LPN CONV. rv
2417
2418 IF l_debug_on THEN
2419 WSH_DEBUG_SV.log(l_module_name,'l_wms_org',l_wms_org);
2420 END IF;
2421 --dbms_output.put_line('calling last assigned line for ' || l_del_detail_rec(i));
2422
2423 --
2424 IF l_debug_on THEN
2425 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.LAST_ASSIGNED_LINE',WSH_DEBUG_SV.C_PROC_LEVEL);
2426 END IF;
2427 --
2428 wsh_container_actions.Last_Assigned_Line (
2429 l_del_detail_rec(i),
2430 l_cont_tab(i),
2431 l_last_line_flag,
2432 x_return_status);
2433
2434 --
2435 IF l_debug_on THEN
2436 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2437 END IF;
2438 --
2439 IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
2440 WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
2441 ) THEN
2442 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_LAST_LINE_ERROR');
2443 --
2444 IF l_debug_on THEN
2445 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2446 END IF;
2447 --
2451 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2448 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i));
2449 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2450 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2452 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2453 END IF;
2454 GOTO next_line;
2455 END IF;
2456
2457 --dbms_output.put_line('calling check cont attr with ' || l_cont_tab(i));
2458
2459 --
2460 IF l_debug_on THEN
2461 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
2462 END IF;
2463 --
2464 wsh_container_actions.Check_Cont_Attributes (
2465 l_cont_tab(i),
2466 l_attr_flag,
2467 x_return_status);
2468 --
2469 IF l_debug_on THEN
2470 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2471 END IF;
2472 --
2473
2474 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2475 --dbms_output.put_line('after check cont attr status is ' || x_return_status);
2476 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
2477 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2478 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2479 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2480 END IF;
2481 GOTO next_line;
2482 END IF;
2483
2484 --dbms_output.put_line(' last line flag is ' || l_last_line_flag || ' attr flag ' || l_attr_flag || ' and delivery_id ' || l_delivery_id || ' before updating cont ' || l_cont_tab(i));
2485
2486
2487 IF (nvl(l_last_line_flag,'N') = 'Y') AND (nvl(l_attr_flag,'N') = 'Y') AND (nvl(l_delivery_id,-99) = -99) THEN
2488
2489 --dbms_output.put_line('updating attr to null for ' || l_cont_tab(i));
2490
2491
2492 --
2493 -- K LPN CONV. rv
2494 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
2495 AND l_cont_line_dir_tab(i) IN ('O','IO')
2496 AND
2497 (
2498 (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
2499 OR
2500 (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
2501 )
2502 THEN
2503 --{
2504 l_sync_tmp_rec.delivery_detail_id := l_cont_tab(i);
2505 l_sync_tmp_rec.operation_type := 'UPDATE';
2506 WSH_WMS_SYNC_TMP_PKG.MERGE
2507 (
2508 p_sync_tmp_rec => l_sync_tmp_rec,
2509 x_return_status => l_return_status
2510 );
2511
2512 IF l_debug_on THEN
2513 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
2514 END IF;
2515 --
2516 --
2517 IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
2518 --
2519 GOTO next_line;
2520 --
2521 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
2522 --
2523 l_num_warnings := l_num_warnings + 1;
2524 --
2525 END IF;
2526 --
2527 --}
2528 END IF;
2529 -- K LPN CONV. rv
2530
2531 UPDATE WSH_DELIVERY_DETAILS
2532 SET customer_id = NULL,
2533 ship_to_location_id = NULL,
2534 intmed_ship_to_location_id = NULL,
2535 fob_code = NULL,
2536 freight_terms_code = NULL,
2537 ship_method_code = NULL,
2538 carrier_id = NULL,
2539 mode_of_transport = NULL,
2540 service_level = NULL,
2541 deliver_to_location_id = NULL,
2542 line_direction = DECODE(line_direction,'IO','O',line_direction) -- J-IB-NPARIKH
2543 WHERE delivery_detail_id = l_cont_tab(i);
2544
2545 IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2546 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
2547 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
2548 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2549 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2550 END IF;
2551 GOTO next_line;
2552 END IF;
2553
2554 --
2555 IF l_debug_on THEN
2556 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
2557 END IF;
2558 --
2559 wsh_container_actions.Update_Cont_Hierarchy (
2560 l_cont_tab(i),
2561 NULL,
2562 l_cont_tab(i),
2563 x_return_status);
2564 --
2565 IF l_debug_on THEN
2566 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2567 END IF;
2568 --
2569
2570 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2571 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
2572 --
2573 IF l_debug_on THEN
2574 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2575 END IF;
2576 --
2580 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2577 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i));
2578 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2579 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2581 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2582 END IF;
2583 GOTO next_line;
2584 END IF;
2585
2586 END IF;
2587
2588 OPEN Is_Container (l_del_detail_rec(i));
2589
2590 FETCH Is_Container INTO
2591 l_cont_flag,
2592 l_serial_number,
2593 l_master_serial_number,
2594 l_cont_item_id;
2595
2596 IF Is_Container%NOTFOUND THEN
2597 CLOSE Is_Container;
2598 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
2599 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_del_detail_rec(i));
2600 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
2601 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2602 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2603 END IF;
2604 GOTO next_line;
2605 END IF;
2606
2607 IF Is_Container%ISOPEN THEN
2608 CLOSE Is_Container;
2609 END IF;
2610
2611 IF l_cont_flag = 'N' THEN --{
2612 --
2613 IF l_debug_on THEN
2614 WSH_DEBUG_SV.log(l_module_name,'l_cont_flag',l_cont_flag);
2615 WSH_DEBUG_SV.log(l_module_name,'delivery_detail_id',l_del_detail_rec(i));
2616 END IF;
2617 --
2618 UPDATE wsh_delivery_details --bug 5165197
2619 SET master_serial_number = NULL
2620 WHERE delivery_detail_id = l_del_detail_rec(i);
2621 --
2622 ELSIF l_cont_flag = 'Y' THEN --}{
2623
2624 --
2625 IF l_debug_on THEN
2626 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
2627 END IF;
2628 --
2629 WSH_CONTAINER_UTILITIES.Get_Delivery_Status (
2630 l_del_detail_rec(i),
2631 l_delivery_id,
2632 l_del_status,
2633 x_return_status);
2634 --
2635 IF l_debug_on THEN
2636 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2637 END IF;
2638 --
2639
2640 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2641 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2642 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2643 END IF;
2644 GOTO next_line;
2645 END IF;
2646
2647 IF (nvl(l_delivery_id,-99) <> -99) THEN --{
2648
2649 IF (nvl(l_del_status,'N/A') <> 'OP') THEN
2650 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
2651 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2652 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2653 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2654 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2655 END IF;
2656 x_pack_status := 'Error';
2657 GOTO next_line;
2658 END IF;
2659 END IF; --}
2660
2661 IF (nvl(l_delivery_id,-99) <> -99) THEN
2662 GOTO next_line;
2663 END IF;
2664
2665 --
2666 IF l_debug_on THEN
2667 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.LAST_ASSIGNED_LINE',WSH_DEBUG_SV.C_PROC_LEVEL);
2668 END IF;
2669 --
2670 wsh_container_actions.Last_Assigned_Line (
2671 NULL,
2672 l_del_detail_rec(i),
2673 l_last_line_flag,
2674 x_return_status);
2675 --
2676 IF l_debug_on THEN
2677 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2678 END IF;
2679 --
2680
2681 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN --{
2682 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_LAST_LINE_ERROR');
2683 --
2684 IF l_debug_on THEN
2685 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2686 END IF;
2687 --
2688 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2689 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2690 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2691 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2692 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2693 END IF;
2694 GOTO next_line;
2695 END IF; --}
2696
2697 --dbms_output.put_line('calling check cont attr with ' || l_del_detail_rec(i));
2698
2699 --
2700 IF l_debug_on THEN
2701 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
2702 END IF;
2703 --
2704 wsh_container_actions.Check_Cont_Attributes (
2705 l_del_detail_rec(i),
2706 l_attr_flag,
2707 x_return_status);
2708 --
2709 IF l_debug_on THEN
2710 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2711 END IF;
2712 --
2713
2714 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN --{
2715 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
2716 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
2717 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2718 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2719 END IF;
2723
2720 GOTO next_line;
2721 END IF; --}
2722
2724 IF (nvl(l_last_line_flag,'N') = 'Y') AND (nvl(l_attr_flag,'N') = 'Y') AND (nvl(l_delivery_id,-99) = -99) THEN --{
2725 --
2726 -- K LPN CONV. rv
2727 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
2728 AND l_cont_line_dir_tab(i) IN ('O','IO')
2729 AND
2730 (
2731 (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
2732 OR
2733 (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
2734 )
2735 THEN
2736 --{
2737 l_sync_tmp_rec.delivery_detail_id := l_del_detail_rec(i);
2738 l_sync_tmp_rec.operation_type := 'UPDATE';
2739 WSH_WMS_SYNC_TMP_PKG.MERGE
2740 (
2741 p_sync_tmp_rec => l_sync_tmp_rec,
2742 x_return_status => l_return_status
2743 );
2744
2745 IF l_debug_on THEN
2746 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
2747 END IF;
2748 --
2749 --
2750 --
2751 IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
2752 --
2753 GOTO next_line;
2754 --
2755 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
2756 --
2757 l_num_warnings := l_num_warnings + 1;
2758 --
2759 END IF;
2760 --
2761 --}
2762 END IF;
2763 -- K LPN CONV. rv
2764
2765 UPDATE WSH_DELIVERY_DETAILS
2766 SET customer_id = NULL,
2767 ship_to_location_id = NULL,
2768 intmed_ship_to_location_id = NULL,
2769 fob_code = NULL,
2770 freight_terms_code = NULL,
2771 ship_method_code = NULL,
2772 service_level = NULL,
2773 carrier_id = NULL,
2774 mode_of_transport = NULL,
2775 deliver_to_location_id = NULL,
2776 line_direction = DECODE(line_direction,'IO','O',line_direction) -- J-IB-NPARIKH
2777 WHERE delivery_detail_id = l_del_detail_rec(i);
2778
2779 IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2780 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
2781 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
2782 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2783 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2784 END IF;
2785 GOTO next_line;
2786 END IF;
2787
2788 --
2789 IF l_debug_on THEN
2790 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
2791 END IF;
2792 --
2793 wsh_container_actions.Update_Cont_Hierarchy (
2794 l_del_detail_rec(i),
2795 NULL,
2796 l_del_detail_rec(i),
2797 x_return_status);
2798 --
2799 IF l_debug_on THEN
2800 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2801 END IF;
2802 --
2803
2804 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN --{
2805 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
2806 --
2807 IF l_debug_on THEN
2808 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2809 END IF;
2810 --
2811 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2812 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2813 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2814 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2815 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2816 END IF;
2817 GOTO next_line;
2818 END IF; --}
2819
2820 END IF;--}
2821
2822 -- update child containers of the current hierarchy that was
2823 -- unassigned with the serial number of the current top most
2824 -- container..
2825 --
2826 -- K LPN CONV. rv
2827 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
2828 AND l_cont_line_dir_tab(i) IN ('O','IO')
2829 AND
2830 (
2831 (WSH_WMS_LPN_GRP.GK_WMS_UPD_MISC and l_wms_org = 'Y')
2832 OR
2833 (WSH_WMS_LPN_GRP.GK_INV_UPD_MISC and l_wms_org = 'N')
2834 )
2835 THEN
2836 --{
2837 l_sync_tmp_rec.delivery_detail_id := l_del_detail_rec(i);
2838 l_sync_tmp_rec.operation_type := 'UPDATE';
2839 WSH_WMS_SYNC_TMP_PKG.MERGE
2840 (
2841 p_sync_tmp_rec => l_sync_tmp_rec,
2842 x_return_status => l_return_status
2843 );
2844
2848 --
2845 IF l_debug_on THEN
2846 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
2847 END IF;
2849 --
2850 --
2851 IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
2852 --
2853 GOTO next_line;
2854 --
2855 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
2856 --
2857 l_num_warnings := l_num_warnings + 1;
2858 --
2859 END IF;
2860 --
2861 --}
2862 END IF;
2863 -- K LPN CONV. rv
2864
2865 UPDATE WSH_DELIVERY_DETAILS
2866 SET master_serial_number = serial_number
2867 WHERE delivery_detail_id = l_del_detail_rec(i);
2868
2869 IF SQL%ROWCOUNT > 1 OR SQL%NOTFOUND THEN
2870 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CHILD_UPD_ERROR');
2871 --
2872 IF l_debug_on THEN
2873 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2874 END IF;
2875 --
2876 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2877 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2878 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2879 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2880 END IF;
2881 GOTO next_line;
2882 END IF;
2883
2884 --
2885 IF l_debug_on THEN
2886 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_SERIAL_NUMBER',WSH_DEBUG_SV.C_PROC_LEVEL);
2887 END IF;
2888 --
2889 WSH_CONTAINER_UTILITIES.Get_Master_Serial_Number (
2890 l_del_detail_rec(i),
2891 l_master_serial_number,
2892 x_return_status);
2893 --
2894 IF l_debug_on THEN
2895 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2896 END IF;
2897 --
2898
2899 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2900 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GET_SRL_ERROR');
2901 --
2902 IF l_debug_on THEN
2903 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2904 END IF;
2905 --
2906 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2907 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2908 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
2909 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2910 END IF;
2911 GOTO next_line;
2912 END IF;
2913
2914 --
2915 IF l_debug_on THEN
2916 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
2917 END IF;
2918 --
2919 WSH_CONTAINER_UTILITIES.Update_Child_Containers (
2920 l_del_detail_rec(i),
2921 l_master_cont_name,
2922 l_master_serial_number,
2923 x_return_status);
2924 --
2925 IF l_debug_on THEN
2926 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
2927 END IF;
2928 --
2929
2930 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2931 --
2932 IF l_debug_on THEN
2933 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2934 END IF;
2935 --
2936 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_del_detail_rec(i));
2937 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
2938 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2939 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2940 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
2941 --
2942 IF l_debug_on THEN
2943 WSH_DEBUG_SV.pop(l_module_name);
2944 END IF;
2945 --
2946 return;
2947 END IF;
2948
2949 END IF; --}
2950
2951 <<next_line>>
2952 null;
2953
2954 END LOOP;
2955
2956 -- J: W/V Changes
2957 IF (p_container_instance_id is not null and l_cont_item_id IS NOT NULL) THEN
2958
2959 -- LPN CONV. rv
2960 open l_get_cnt_org_csr(p_container_instance_id);
2961 fetch l_get_cnt_org_csr into l_cnt_org_id;
2962
2963 l_wms_org := 'N';
2964
2965 IF l_cnt_org_id is NOT NULL THEN
2966 l_wms_org := wsh_util_validate.check_wms_org(l_cnt_org_id);
2967 END IF;
2968 close l_get_cnt_org_csr;
2969
2970 -- LPN CONV. rv
2971 IF NOT(
2972 l_wms_org = 'Y' AND nvl(wsh_wms_lpn_grp.g_caller,'WSH') like 'WMS%'
2973 )
2974 THEN
2975 --{
2976 WSH_WV_UTILS.Check_Fill_Pc (
2977 p_container_instance_id => p_container_instance_id,
2978 x_fill_status => l_fill_status,
2979 x_return_status => l_return_status);
2980
2981 IF l_fill_status = 'O' THEN
2982
2983 IF l_debug_on THEN
2987 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
2984 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2985 END IF;
2986 --
2988 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_OVERPACKED');
2989 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
2990 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
2991 WSH_UTIL_CORE.Add_Message(l_return_status);
2992 x_pack_status := 'Overpacked';
2993
2994 ELSIF l_fill_status = 'U' THEN
2995 IF l_debug_on THEN
2996 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
2997 END IF;
2998 --
2999 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
3000 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UNDERPACKED');
3001 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3002 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
3003 WSH_UTIL_CORE.Add_Message(l_return_status);
3004 x_pack_status := 'Underpacked';
3005 ELSE
3006 x_pack_status := 'Success';
3007 END IF;
3008 --}
3009 END IF;
3010 END IF;
3011
3012 IF l_num_warnings > 0 THEN
3013 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
3014 ELSE
3015 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3016 END IF;
3017
3018 --
3019 IF l_debug_on THEN
3020 WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
3021 WSH_DEBUG_SV.pop(l_module_name);
3022 END IF;
3023 --
3024 EXCEPTION
3025
3026 WHEN Others THEN
3027 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Unassign_Detail',l_module_name);
3028 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3029
3030 --
3031 IF l_debug_on THEN
3032 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
3033 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3034 END IF;
3035 --
3036 END Unassign_Detail;
3037
3038 -------------------------------------------------------------------
3039 -- This procedure is only for backward compatibility. No one should call
3040 -- this procedure.
3041 -------------------------------------------------------------------
3042
3043 PROCEDURE Unassign_Detail(
3044 p_container_instance_id IN NUMBER,
3045 p_delivery_id IN NUMBER,
3046 p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
3047 p_cont_unassign IN VARCHAR2,
3048 p_del_unassign IN VARCHAR2,
3049 x_pack_status OUT NOCOPY VARCHAR2,
3050 x_return_status OUT NOCOPY VARCHAR2) IS
3051
3052
3053 --
3054 l_debug_on BOOLEAN;
3055 --
3056 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UNASSIGN_DETAIL';
3057 --
3058 l_action_prms wsh_glbl_var_strct_grp.dd_action_parameters_rec_type;
3059 BEGIN
3060
3061 --
3062 --
3063 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3064 --
3065 IF l_debug_on IS NULL
3066 THEN
3067 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3068 END IF;
3069 --
3070 IF l_debug_on THEN
3071 WSH_DEBUG_SV.push(l_module_name);
3072 --
3073 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3074 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3075 WSH_DEBUG_SV.log(l_module_name,'P_CONT_UNASSIGN',P_CONT_UNASSIGN);
3076 WSH_DEBUG_SV.log(l_module_name,'P_DEL_UNASSIGN',P_DEL_UNASSIGN);
3077 END IF;
3078 --
3079 --
3080 IF l_debug_on THEN
3081 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.Unassign_Detail',WSH_DEBUG_SV.C_PROC_LEVEL);
3082 END IF;
3083 --
3084 Unassign_Detail
3085 (
3086 p_container_instance_id,
3087 p_delivery_id,
3088 p_del_detail_tab,
3089 p_cont_unassign,
3090 p_del_unassign,
3091 x_pack_status,
3092 x_return_status,
3093 l_action_prms
3094 );
3095 --
3096 IF l_debug_on THEN
3097 WSH_DEBUG_SV.pop(l_module_name);
3098 END IF;
3099 --
3100 EXCEPTION
3101
3102 WHEN Others THEN
3103 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Unassign_Detail',l_module_name);
3104 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3105 --
3106 IF l_debug_on THEN
3107 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3108 END IF;
3109 --
3110 END Unassign_Detail;
3111 /*
3112 -----------------------------------------------------------------------------
3113 PROCEDURE : Assign_To_Delivery
3114 PARAMETERS : p_container_instance_id - container instance id of container
3115 p_delivery_id - delivery id
3116 x_return_status - return status of API
3117 -- x_dlvy_has_lines : 'Y' :delivery has non-container lines.
3118 -- 'N' : delivery does not have non-container lines
3119 -- x_dlvy_freight_Terms_code : Delivery's freight term code
3123 */
3120 DESCRIPTION : This procedure checks to see if a container can be assigned to
3121 the specified delivery and returns a success or failure.
3122 ------------------------------------------------------------------------------
3124
3125
3126 PROCEDURE Assign_To_Delivery(
3127 p_container_instance_id IN NUMBER,
3128 p_delivery_id IN NUMBER,
3129 x_return_status OUT NOCOPY VARCHAR2,
3130 x_dlvy_has_lines IN OUT NOCOPY VARCHAR2, -- J-IB-NPARIKH
3131 x_dlvy_freight_terms_code IN OUT NOCOPY VARCHAR2 -- J-IB-NPARIKH
3132 ) IS
3133
3134 -- remove this cursor for Bug
3135 CURSOR Get_First_Line (v_cont_instance_id NUMBER) IS
3136 SELECT delivery_detail_id
3137 FROM wsh_delivery_assignments_v
3138 WHERE parent_delivery_detail_id = v_cont_instance_id
3139 AND rownum < 2;
3140 -- remove this cursor for Bug
3141
3142 CURSOR Get_Cont_Org (v_cont_instance_id NUMBER) IS
3143 SELECT organization_id
3144 FROM WSH_DELIVERY_DETAILS
3145 WHERE delivery_detail_id = v_cont_instance_id
3146 AND container_flag = 'Y';
3147
3148 CURSOR Get_Del_Org (v_del_id NUMBER) IS
3149 SELECT organization_id, freight_terms_code
3150 FROM WSH_NEW_DELIVERIES
3151 WHERE delivery_id = v_del_id;
3152
3153 l_del_detail_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
3154
3155 l_cont_org NUMBER;
3156 l_del_org NUMBER;
3157
3158 l_cont_name VARCHAR2(30);
3159 l_del_name VARCHAR2(30);
3160 --
3161 --
3162 l_has_lines VARCHAR2(1);
3163 l_dlvy_freight_terms_code VARCHAR2(30);
3164 --
3165 --
3166 l_debug_on BOOLEAN;
3167 --
3168 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'ASSIGN_TO_DELIVERY';
3169 --
3170 BEGIN
3171
3172 --
3173 --
3174 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3175 --
3176 IF l_debug_on IS NULL
3177 THEN
3178 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3179 END IF;
3180 --
3181 IF l_debug_on THEN
3182 WSH_DEBUG_SV.push(l_module_name);
3183 --
3184 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3185 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3186 END IF;
3187 --
3188 OPEN Get_Cont_Org (p_container_instance_id);
3189
3190 FETCH Get_Cont_Org INTO l_cont_org;
3191
3192 IF Get_Cont_Org%NOTFOUND THEN
3193 CLOSE Get_Cont_Org;
3194 --
3195 IF l_debug_on THEN
3196 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3197 END IF;
3198 --
3199 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
3200 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
3201 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3202 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3203 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3204 --
3205 IF l_debug_on THEN
3206 WSH_DEBUG_SV.pop(l_module_name);
3207 END IF;
3208 --
3209 return;
3210 END IF;
3211
3212 CLOSE Get_Cont_Org;
3213
3214
3215 OPEN Get_Del_Org (p_delivery_id);
3216
3217 FETCH Get_Del_Org INTO l_del_org, l_dlvy_freight_terms_code;
3218
3219 IF Get_Del_Org%NOTFOUND THEN
3220 CLOSE Get_Del_Org;
3221 --
3222 IF l_debug_on THEN
3223 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.GET_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3224 END IF;
3225 --
3226 l_del_name := WSH_NEW_DELIVERIES_PVT.Get_Name(p_delivery_id);
3227 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DEL');
3228 FND_MESSAGE.SET_TOKEN('DEL_NAME',l_del_name);
3229 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3230 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3231 --
3232 IF l_debug_on THEN
3233 WSH_DEBUG_SV.pop(l_module_name);
3234 END IF;
3235 --
3236 return;
3237 END IF;
3238
3239 CLOSE Get_Del_Org;
3240
3241
3242 -- just check for organization id match and create assignment
3243 IF l_cont_org = l_del_org THEN
3244
3245 --
3246 IF l_debug_on THEN
3247 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CREATE_DELIVERY_ASSIGNMENT',WSH_DEBUG_SV.C_PROC_LEVEL);
3248 END IF;
3249 --
3250 wsh_container_actions.Create_Delivery_Assignment(
3251 p_container_instance_id,
3252 p_delivery_id,
3253 x_return_status,
3254 x_dlvy_has_lines,
3255 x_dlvy_freight_terms_code
3256 );
3257
3258 --
3259 IF l_debug_on THEN
3260 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3261 END IF;
3262 --
3263
3264 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3265 --
3266 IF l_debug_on THEN
3267 WSH_DEBUG_SV.pop(l_module_name);
3268 END IF;
3269 --
3270 return;
3271 END IF;
3272 ELSE
3273 --
3274 IF l_debug_on THEN
3275 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3276 END IF;
3277 --
3281 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.GET_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3278 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
3279 --
3280 IF l_debug_on THEN
3282 END IF;
3283 --
3284 l_del_name := WSH_NEW_DELIVERIES_PVT.Get_Name(p_delivery_id);
3285 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_ORG_DIFF');
3286 FND_MESSAGE.SET_TOKEN('ENTITY1',l_cont_name);
3287 FND_MESSAGE.SET_TOKEN('ENTITY2',l_del_name);
3288 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3289 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3290 --
3291 IF l_debug_on THEN
3292 WSH_DEBUG_SV.pop(l_module_name);
3293 END IF;
3294 --
3295 return;
3296 END IF;
3297
3298
3299 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3300
3301 --
3302 IF l_debug_on THEN
3303 WSH_DEBUG_SV.pop(l_module_name);
3304 END IF;
3305 --
3306 EXCEPTION
3307
3308 WHEN Others THEN
3309 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Assign_To_Delivery',l_module_name);
3310 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3311
3312 --
3313 IF l_debug_on THEN
3314 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
3315 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3316 END IF;
3317 --
3318 END Assign_To_Delivery;
3319
3320 -------------------------------------------------------------------
3321 -- This procedure is only for backward compatibility. No one should call
3322 -- this procedure.
3323 -------------------------------------------------------------------
3324
3325 PROCEDURE Assign_To_Delivery(
3326 p_container_instance_id IN NUMBER,
3327 p_delivery_id IN NUMBER,
3328 x_return_status OUT NOCOPY VARCHAR2
3329 ) IS
3330
3331 --
3332 l_debug_on BOOLEAN;
3333 --
3334 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'Assign_To_Delivery';
3335 --
3336 l_has_lines VARCHAR2(1);
3337 l_dlvy_freight_terms_code VARCHAR2(30);
3338 --
3339 BEGIN
3340 --
3341 --
3342 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3343 --
3344 IF l_debug_on IS NULL
3345 THEN
3346 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3347 END IF;
3348 --
3349 IF l_debug_on THEN
3350 WSH_DEBUG_SV.push(l_module_name);
3351 --
3352 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3353 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3354 END IF;
3355 --
3356 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3357 --
3358 l_has_lines := WSH_DELIVERY_VALIDATIONS.has_lines
3359 (
3360 p_delivery_id => p_delivery_id
3361 );
3362 --
3363 Assign_To_Delivery
3364 (
3365 P_CONTAINER_INSTANCE_ID => P_CONTAINER_INSTANCE_ID,
3366 p_delivery_id => p_delivery_id,
3367 x_dlvy_has_lines => l_has_lines,
3368 x_dlvy_freight_Terms_code => l_dlvy_freight_Terms_code,
3369 x_return_status => x_return_status
3370 );
3371 --
3372 IF l_debug_on THEN
3373 WSH_DEBUG_SV.pop(l_module_name);
3374 END IF;
3375 --
3376 EXCEPTION
3377 WHEN others THEN
3378 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3379 wsh_util_core.default_handler('WSH_CONTAINER_ACTIONS.Assign_To_Delivery',l_module_name);
3380 --
3381 IF l_debug_on THEN
3382 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3383 END IF;
3384 END Assign_To_Delivery;
3385
3386
3387 /*
3388 -----------------------------------------------------------------------------
3389 PROCEDURE : Create_Delivery_Assignment
3390 PARAMETERS : p_container_instance_id - container instance id of container
3391 p_delivery_id - delivery id
3392 x_return_status - return status of API.
3393 -- x_dlvy_has_lines : 'Y' :delivery has non-container lines.
3394 -- 'N' : delivery does not have non-container lines
3395 -- x_dlvy_freight_Terms_code : Delivery's freight term code
3396 DESCRIPTION : This procedure assigns a container to the specified delivery.
3397 ------------------------------------------------------------------------------
3398 */
3399
3400
3401 PROCEDURE Create_Delivery_Assignment (
3402 p_container_instance_id IN NUMBER,
3403 p_delivery_id IN NUMBER,
3404 x_return_status OUT NOCOPY VARCHAR2,
3405 x_dlvy_has_lines IN OUT NOCOPY VARCHAR2, -- J-IB-NPARIKH
3406 x_dlvy_freight_terms_code IN OUT NOCOPY VARCHAR2 -- J-IB-NPARIKH
3407 ) IS
3408
3409 --
3410 l_debug_on BOOLEAN;
3411 --
3412 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CREATE_DELIVERY_ASSIGNMENT';
3413 --
3414 BEGIN
3415
3416 /* instead of this entire stuff just call assign_detail_to_delivery in whcih call to check container attributes, all validations can be done*/
3417
3418 --
3419 --
3420 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3421 --
3422 IF l_debug_on IS NULL
3426 --
3423 THEN
3424 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3425 END IF;
3427 IF l_debug_on THEN
3428 WSH_DEBUG_SV.push(l_module_name);
3429 --
3430 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3431 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3432 END IF;
3433 --
3434 --
3435 IF l_debug_on THEN
3436 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_DETAIL_TO_DELIVERY',WSH_DEBUG_SV.C_PROC_LEVEL);
3437 END IF;
3438 --
3439 WSH_DELIVERY_DETAILS_ACTIONS.Assign_Detail_to_Delivery(
3440 P_DETAIL_ID =>p_container_instance_id ,
3441 P_DELIVERY_ID => p_delivery_id,
3442 X_RETURN_STATUS =>x_return_status,
3443 x_dlvy_has_lines => x_dlvy_has_lines,
3444 x_dlvy_freight_Terms_code => x_dlvy_freight_Terms_code
3445 );
3446
3447 IF l_debug_on THEN
3448 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3449 END IF;
3450 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3451 --set proper error message
3452 --
3453 IF l_debug_on THEN
3454 WSH_DEBUG_SV.pop(l_module_name);
3455 END IF;
3456 --
3457 return;
3458 END IF;
3459 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3460
3461 --
3462 IF l_debug_on THEN
3463 WSH_DEBUG_SV.pop(l_module_name);
3464 END IF;
3465 --
3466 EXCEPTION
3467 WHEN Others THEN
3468 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Create_Delivery_Assignment',l_module_name);
3469 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3470 --
3471 IF l_debug_on THEN
3472 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
3473 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3474 END IF;
3475 --
3476 END Create_Delivery_Assignment;
3477
3478 -------------------------------------------------------------------
3479 -- This procedure is only for backward compatibility. No one should call
3480 -- this procedure.
3481 -------------------------------------------------------------------
3482
3483 PROCEDURE Create_Delivery_Assignment(
3484 p_container_instance_id IN NUMBER,
3485 p_delivery_id IN NUMBER,
3486 x_return_status OUT NOCOPY VARCHAR2
3487 ) IS
3488
3489 --
3490 l_debug_on BOOLEAN;
3491 --
3492 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'Create_Delivery_Assignment';
3493 --
3494 l_has_lines VARCHAR2(1);
3495 l_dlvy_freight_terms_code VARCHAR2(30);
3496 --
3497 BEGIN
3498 --
3499 --
3500 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3501 --
3502 IF l_debug_on IS NULL
3503 THEN
3504 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3505 END IF;
3506 --
3507 IF l_debug_on THEN
3508 WSH_DEBUG_SV.push(l_module_name);
3509 --
3510 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
3511 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
3512 END IF;
3513 --
3514 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3515 --
3516 l_has_lines := WSH_DELIVERY_VALIDATIONS.has_lines
3517 (
3518 p_delivery_id => p_delivery_id
3519 );
3520 --
3521 Create_Delivery_Assignment
3522 (
3523 P_CONTAINER_INSTANCE_ID => P_CONTAINER_INSTANCE_ID,
3524 p_delivery_id => p_delivery_id,
3525 X_RETURN_STATUS => X_RETURN_STATUS,
3526 x_dlvy_has_lines => l_has_lines,
3527 x_dlvy_freight_Terms_code => l_dlvy_freight_Terms_code
3528 );
3529 --
3530 IF l_debug_on THEN
3531 WSH_DEBUG_SV.pop(l_module_name);
3532 END IF;
3533 --
3534 EXCEPTION
3535 WHEN others THEN
3536 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3537 wsh_util_core.default_handler('WSH_CONTAINER_ACTIONS.Create_Delivery_Assignment',l_module_name);
3538 --
3539 IF l_debug_on THEN
3540 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
3541 END IF;
3542 END Create_Delivery_Assignment;
3543
3544
3545 -- THIS IS OBSOLETED
3546 /*
3547 -----------------------------------------------------------------------------
3548 PROCEDURE : Unassign_Delivery
3549 PARAMETERS : p_container_instance_id - container instance id of container
3550 p_delivery_id - delivery id
3551 x_return_status - return status of API
3552 DESCRIPTION : This procedure checks unassigns a container from the specified
3553 delivery and returns a success or failure.
3554 ------------------------------------------------------------------------------
3555 */
3556 --THIS PROCEDURE IS OBSOLETE
3557 PROCEDURE Unassign_Delivery(
3558 p_container_instance_id IN NUMBER,
3559 p_delivery_id IN NUMBER,
3560 x_return_status OUT NOCOPY VARCHAR2) IS
3561
3562 BEGIN
3563
3564 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3565
3566 END Unassign_Delivery;
3567
3568
3569 /*
3573 p_par_cont_inst_id - container instance id of parent container
3570 -----------------------------------------------------------------------------
3571 PROCEDURE : Assign_To_Container
3572 PARAMETERS : p_det_cont_inst_id - container instance id of child container
3574 x_return_status - return status of API
3575 DESCRIPTION : This procedure checks to see if a container can be assigned to
3576 a specified parent container and returns a success or failure.
3577 ------------------------------------------------------------------------------
3578 */
3579
3580
3581 PROCEDURE Assign_To_Container(
3582 p_det_cont_inst_id IN NUMBER,
3583 p_par_cont_inst_id IN NUMBER,
3584 x_return_status OUT NOCOPY VARCHAR2) IS
3585
3586 -- remove this cursor
3587 CURSOR Get_First_Line (v_cont_instance_id NUMBER) IS
3588 SELECT delivery_detail_id
3589 FROM wsh_delivery_assignments_v
3590 WHERE parent_delivery_detail_id = v_cont_instance_id
3591 AND rownum < 2;
3592 -- remove this cursor
3593
3594 CURSOR Get_Cont_Org (v_cont_instance_id NUMBER) IS
3595 SELECT organization_id
3596 FROM WSH_DELIVERY_DETAILS
3597 WHERE delivery_detail_id = v_cont_instance_id
3598 AND container_flag in ('Y', 'C');
3599
3600 l_det_detail_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
3601 l_par_detail_id WSH_DELIVERY_DETAILS.delivery_detail_id%TYPE;
3602
3603 l_det_cont_org NUMBER;
3604 l_par_cont_org NUMBER;
3605
3606 l_temp_detail_tab WSH_UTIL_CORE.id_tab_type;
3607
3608 cnt NUMBER;
3609 l_del_rows WSH_UTIL_CORE.id_tab_type;
3610 l_group_id_tab WSH_UTIL_CORE.id_tab_type;
3611 l_ret_sts VARCHAR2(1);
3612
3613 l_cont_name VARCHAR2(30);
3614
3615 l_master_serial_number VARCHAR2(30);
3616 l_master_cont_id NUMBER;
3617 l_master_cont_name VARCHAR2(30);
3618
3619 l_det_attr_flag VARCHAR2(1);
3620 l_par_attr_flag VARCHAR2(1);
3621
3622 l_det_del_id NUMBER;
3623 l_par_del_id NUMBER;
3624 l_del_status VARCHAR2(10);
3625
3626 l_attr_tab wsh_delivery_autocreate.grp_attr_tab_type;
3627 l_group_tab wsh_delivery_autocreate.grp_attr_tab_type;
3628 l_action_rec wsh_delivery_autocreate.action_rec_type;
3629 l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
3630 l_matched_entities wsh_util_core.id_tab_type;
3631 l_out_rec wsh_delivery_autocreate.out_rec_type;
3632
3633
3634 --
3635 l_debug_on BOOLEAN;
3636 --
3637 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'ASSIGN_TO_CONTAINER';
3638 --
3639 BEGIN
3640
3641
3642 --
3643 --
3644 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
3645 --
3646 IF l_debug_on IS NULL
3647 THEN
3648 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
3649 END IF;
3650 --
3651 IF l_debug_on THEN
3652 WSH_DEBUG_SV.push(l_module_name);
3653 --
3654 WSH_DEBUG_SV.log(l_module_name,'P_DET_CONT_INST_ID',P_DET_CONT_INST_ID);
3655 WSH_DEBUG_SV.log(l_module_name,'P_PAR_CONT_INST_ID',P_PAR_CONT_INST_ID);
3656 END IF;
3657 --
3658 OPEN Get_Cont_Org (p_det_cont_inst_id);
3659
3660 FETCH Get_Cont_Org INTO l_det_cont_org;
3661
3662 IF Get_Cont_Org%NOTFOUND THEN
3663 CLOSE Get_Cont_Org;
3664 --
3665 IF l_debug_on THEN
3666 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3667 END IF;
3668 --
3669 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
3670 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
3671 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3672 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3673 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3674 --
3675 IF l_debug_on THEN
3676 WSH_DEBUG_SV.pop(l_module_name);
3677 END IF;
3678 --
3679 return;
3680 END IF;
3681
3682 IF Get_Cont_Org%ISOPEN THEN
3683 CLOSE Get_Cont_Org;
3684 END IF;
3685
3686 OPEN Get_Cont_Org (p_par_cont_inst_id);
3687
3688 FETCH Get_Cont_Org INTO l_par_cont_org;
3689
3690 IF Get_Cont_Org%NOTFOUND THEN
3691 CLOSE Get_Cont_Org;
3692 --
3693 IF l_debug_on THEN
3694 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3695 END IF;
3696 --
3697 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3698 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
3699 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3700 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3701 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3702 --
3703 IF l_debug_on THEN
3704 WSH_DEBUG_SV.pop(l_module_name);
3705 END IF;
3706 --
3707 return;
3708 END IF;
3709
3710 IF Get_Cont_Org%ISOPEN THEN
3711 CLOSE Get_Cont_Org;
3712 END IF;
3713
3714 IF l_det_cont_org <> l_par_cont_org THEN
3715 --
3716 IF l_debug_on THEN
3717 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3718 END IF;
3719 --
3723 --
3720 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
3721 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_ORG_DIFF');
3722 FND_MESSAGE.SET_TOKEN('ENTITY1',l_cont_name);
3724 IF l_debug_on THEN
3725 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3726 END IF;
3727 --
3728 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3729 FND_MESSAGE.SET_TOKEN('ENTITY2',l_cont_name);
3730 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3731 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3732 --
3733 IF l_debug_on THEN
3734 WSH_DEBUG_SV.pop(l_module_name);
3735 END IF;
3736 --
3737 return;
3738 END IF;
3739
3740 -- get the delivery status of the container and check if it is assigned
3741 -- to a closed or in-transit delivery (only open deliveries allowed)
3742
3743 --
3744 IF l_debug_on THEN
3745 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
3746 END IF;
3747 --
3748 WSH_CONTAINER_UTILITIES.Get_Delivery_Status ( p_par_cont_inst_id,
3749 l_par_del_id,
3750 l_del_status,
3751 x_return_status);
3752
3753 IF l_debug_on THEN
3754 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3755 END IF;
3756 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3757 --
3758 IF l_debug_on THEN
3759 WSH_DEBUG_SV.pop(l_module_name);
3760 END IF;
3761 --
3762 return;
3763 END IF;
3764
3765 IF (nvl(l_par_del_id,-99) <> -99) THEN
3766
3767 IF (nvl(l_del_status,'N/A') <> 'OP') THEN
3768 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
3769 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3770 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3771 --
3772 IF l_debug_on THEN
3773 WSH_DEBUG_SV.pop(l_module_name);
3774 END IF;
3775 --
3776 return;
3777 END IF;
3778 END IF;
3779
3780 -- get the delivery status of the container and check if it is assigned
3781 -- to a closed or in-transit delivery (only open deliveries allowed)
3782
3783 --
3784 IF l_debug_on THEN
3785 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_DELIVERY_STATUS',WSH_DEBUG_SV.C_PROC_LEVEL);
3786 END IF;
3787 --
3788 WSH_CONTAINER_UTILITIES.Get_Delivery_Status ( p_det_cont_inst_id,
3789 l_det_del_id,
3790 l_del_status,
3791 x_return_status);
3792
3793 IF l_debug_on THEN
3794 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3795 END IF;
3796 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3797 --
3798 IF l_debug_on THEN
3799 WSH_DEBUG_SV.pop(l_module_name);
3800 END IF;
3801 --
3802 return;
3803 END IF;
3804
3805 IF (nvl(l_det_del_id,-99) <> -99) THEN
3806
3807 IF (nvl(l_del_status,'N/A') <> 'OP') THEN
3808 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DEL_STS_INVALID');
3809 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3810 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3811 --
3812 IF l_debug_on THEN
3813 WSH_DEBUG_SV.pop(l_module_name);
3814 END IF;
3815 --
3816 return;
3817 END IF;
3818 END IF;
3819
3820 IF l_debug_on THEN
3821 WSH_DEBUG_SV.log(l_module_name,'l_det_del_id',l_det_del_id);
3822 WSH_DEBUG_SV.log(l_module_name,'l_par_del_id',l_par_del_id);
3823 END IF;
3824
3825 IF ((nvl(l_det_del_id,-99) <> -99) AND (nvl(l_par_del_id,-99) <> -99)) THEN
3826
3827 IF l_det_del_id <> l_par_del_id THEN
3828
3829
3830 -- R12: MDC: For WMS we can assign containers to parent containers on different deliveries.
3831 IF wsh_util_validate.check_wms_org(l_par_cont_org) = 'Y' THEN
3832
3833 IF l_debug_on THEN
3834 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Assign_Container_to_Consol',WSH_DEBUG_SV.C_PROC_LEVEL);
3835 END IF;
3836 Assign_Container_to_Consol(
3837 p_child_container_id => p_det_cont_inst_id,
3838 p_parent_container_id => p_par_cont_inst_id,
3839 p_caller => 'WMS_PACK_CONSOL',
3840 x_return_status => x_return_status);
3841
3842 IF l_debug_on THEN
3843 WSH_DEBUG_SV.log(l_module_name,'return status -',x_return_status);
3844 END IF;
3845
3846 return;
3847 ELSE
3848
3849
3850 --
3851 IF l_debug_on THEN
3852 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3853 END IF;
3854 --
3855 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
3856 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ASSG_DEL_DIFF');
3857 FND_MESSAGE.SET_TOKEN('ENTITY1',l_cont_name);
3858 --
3859 IF l_debug_on THEN
3860 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3861 END IF;
3862 --
3863 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3864 FND_MESSAGE.SET_TOKEN('ENTITY2',l_cont_name);
3865 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3869 WSH_DEBUG_SV.pop(l_module_name);
3866 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3867 --
3868 IF l_debug_on THEN
3870 END IF;
3871 --
3872 return;
3873
3874 END IF;
3875
3876 END IF;
3877 END IF;
3878
3879 --
3880 IF l_debug_on THEN
3881 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_CONT_SERIAL',WSH_DEBUG_SV.C_PROC_LEVEL);
3882 END IF;
3883 --
3884 WSH_CONTAINER_UTILITIES.Get_Master_Cont_Serial (
3885 p_par_cont_inst_id,
3886 l_master_cont_id,
3887 l_master_cont_name,
3888 l_master_serial_number,
3889 x_return_status);
3890 IF l_debug_on THEN
3891 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3892 END IF;
3893
3894 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3895 --dbms_output.put_line('error while getting master serial for parent ' || p_par_cont_inst_id);
3896 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GET_MASTER_ERROR');
3897 --
3898 IF l_debug_on THEN
3899 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
3900 END IF;
3901 --
3902 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_par_cont_inst_id);
3903 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
3904 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
3905 IF l_ret_sts <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
3906 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
3907 END IF;
3908 l_master_cont_id := NULL;
3909 l_master_serial_number := NULL;
3910 END IF;
3911
3912 --
3913 IF l_debug_on THEN
3914 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
3915 END IF;
3916 --
3917 wsh_container_actions.Check_Cont_Attributes (
3918 p_det_cont_inst_id,
3919 l_det_attr_flag,
3920 x_return_status);
3921
3922 IF l_debug_on THEN
3923 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3924 END IF;
3925
3926 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3927 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
3928 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3929 --
3930 IF l_debug_on THEN
3931 WSH_DEBUG_SV.pop(l_module_name);
3932 END IF;
3933 --
3934 return;
3935 END IF;
3936
3937
3938 --
3939 IF l_debug_on THEN
3940 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CHECK_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
3941 END IF;
3942 --
3943 wsh_container_actions.Check_Cont_Attributes (
3944 p_par_cont_inst_id,
3945 l_par_attr_flag,
3946 x_return_status);
3947
3948 IF l_debug_on THEN
3949 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3950 END IF;
3951
3952 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3953 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_ATTR_ERROR');
3954 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
3955 --
3956 IF l_debug_on THEN
3957 WSH_DEBUG_SV.pop(l_module_name);
3958 END IF;
3959 --
3960 return;
3961 END IF;
3962
3963 IF l_det_attr_flag = 'N' AND l_par_attr_flag = 'N' THEN
3964
3965 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
3966 -- just create assignment of child container to parent.
3967 --
3968 IF l_debug_on THEN
3969 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
3970 END IF;
3971 --
3972 WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
3973 p_det_cont_inst_id,
3974 p_par_cont_inst_id,
3975 x_return_status);
3976
3977 IF l_debug_on THEN
3978 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
3979 END IF;
3980
3981 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3982 --
3983 IF l_debug_on THEN
3984 WSH_DEBUG_SV.pop(l_module_name);
3985 END IF;
3986 --
3987 return;
3988 END IF;
3989
3990 -- l_master_cont_id := WSH_CONTAINER_UTILITIES.Get_Master_Cont_Id (p_det_cont_inst_id);
3991
3992
3993 --
3994 IF l_debug_on THEN
3995 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
3996 END IF;
3997 --
3998 WSH_CONTAINER_UTILITIES.Update_Child_Containers (
3999 p_det_cont_inst_id,
4000 l_master_cont_id,
4001 l_master_serial_number,
4002 x_return_status);
4003
4004 IF l_debug_on THEN
4005 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4006 END IF;
4007
4008 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4009 --
4010 IF l_debug_on THEN
4011 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4012 END IF;
4013 --
4014 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4015 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4016 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4020 IF l_debug_on THEN
4017 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4018 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4019 --
4021 WSH_DEBUG_SV.pop(l_module_name);
4022 END IF;
4023 --
4024 return;
4025 END IF;
4026
4027 ELSIF l_det_attr_flag = 'N' AND l_par_attr_flag = 'Y' THEN
4028
4029 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4030
4031 -- just create assignment of child container to parent.
4032 --
4033 IF l_debug_on THEN
4034 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
4035 END IF;
4036 --
4037 WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
4038 p_det_cont_inst_id,
4039 p_par_cont_inst_id,
4040 x_return_status);
4041
4042 IF l_debug_on THEN
4043 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4044 END IF;
4045 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4046 --
4047 IF l_debug_on THEN
4048 WSH_DEBUG_SV.pop(l_module_name);
4049 END IF;
4050 --
4051 return;
4052 END IF;
4053
4054 --
4055 -- Debug Statements
4056 --
4057 IF l_debug_on THEN
4058 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
4059 END IF;
4060 --
4061 wsh_container_actions.Update_Cont_Hierarchy (
4062 p_par_cont_inst_id,
4063 l_det_del_id,
4064 p_det_cont_inst_id,
4065 x_return_status );
4066 IF l_debug_on THEN
4067 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4068 END IF;
4069
4070 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4071 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GRP_ATTR_WARN');
4072 --
4073 IF l_debug_on THEN
4074 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4075 END IF;
4076 --
4077 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4078 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4079 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
4080 WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
4081 END IF;
4082
4083 --
4084 IF l_debug_on THEN
4085 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
4086 END IF;
4087 --
4088 WSH_CONTAINER_UTILITIES.Update_Child_Containers (
4089 p_det_cont_inst_id,
4090 l_master_cont_id,
4091 l_master_serial_number,
4092 x_return_status);
4093 IF l_debug_on THEN
4094 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4095 END IF;
4096
4097 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4098 --
4099 IF l_debug_on THEN
4100 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4101 END IF;
4102 --
4103 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4104 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4105 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4106 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4107 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4108 --
4109 IF l_debug_on THEN
4110 WSH_DEBUG_SV.pop(l_module_name);
4111 END IF;
4112 --
4113 return;
4114 END IF;
4115
4116 ELSIF l_det_attr_flag = 'Y' and l_par_attr_flag = 'N' THEN
4117
4118 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4119
4120 -- just create assignment of child container to parent.
4121 --
4122 IF l_debug_on THEN
4123 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
4124 END IF;
4125 --
4126 WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
4127 p_det_cont_inst_id,
4128 p_par_cont_inst_id,
4129 x_return_status);
4130
4131 IF l_debug_on THEN
4132 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4133 END IF;
4134 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4135 --dbms_output.put_line('cont not assigned');
4136 --
4137 IF l_debug_on THEN
4138 WSH_DEBUG_SV.pop(l_module_name);
4139 END IF;
4140 --
4141 return;
4142 END IF;
4143
4144 --
4145 IF l_debug_on THEN
4146 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_HIERARCHY',WSH_DEBUG_SV.C_PROC_LEVEL);
4147 END IF;
4148 --
4149 wsh_container_actions.Update_Cont_Hierarchy (
4150 p_det_cont_inst_id,
4151 l_par_del_id,
4152 p_par_cont_inst_id,
4153 x_return_status );
4154
4155 IF l_debug_on THEN
4156 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4157 END IF;
4158 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4159 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_GRP_ATTR_WARN');
4163 END IF;
4160 --
4161 IF l_debug_on THEN
4162 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4164 --
4165 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4166 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4167 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
4168 WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
4169 END IF;
4170
4171 --
4172 IF l_debug_on THEN
4173 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
4174 END IF;
4175 --
4176 WSH_CONTAINER_UTILITIES.Update_Child_Containers (
4177 p_det_cont_inst_id,
4178 l_master_cont_id,
4179 l_master_serial_number,
4180 x_return_status);
4181 IF l_debug_on THEN
4182 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4183 END IF;
4184
4185 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4186 --
4187 IF l_debug_on THEN
4188 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4189 END IF;
4190 --
4191 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4192 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4193 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4194 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4195 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4196 --
4197 IF l_debug_on THEN
4198 WSH_DEBUG_SV.pop(l_module_name);
4199 END IF;
4200 --
4201 return;
4202 END IF;
4203
4204 ELSIF l_det_attr_flag = 'Y' and l_par_attr_flag = 'Y' THEN
4205
4206 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4207
4208 -- check on using the container instance ids for grouping
4209 -- attribute comparisons instead of using the lines.
4210
4211 l_attr_tab(1).entity_id := p_det_cont_inst_id;
4212 l_attr_tab(1).entity_type := 'DELIVERY_DETAIL';
4213 l_attr_tab(2).entity_id := p_par_cont_inst_id;
4214 l_attr_tab(2).entity_type := 'DELIVERY_DETAIL';
4215
4216 --
4217 IF l_debug_on THEN
4218 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
4219 END IF;
4220
4221 l_action_rec.action := 'MATCH_GROUPS';
4222 l_action_rec.check_single_grp := 'Y';
4223
4224
4225 WSH_DELIVERY_AUTOCREATE.Find_Matching_Groups(p_attr_tab => l_attr_tab,
4226 p_action_rec => l_action_rec,
4227 p_target_rec => l_target_rec,
4228 p_group_tab => l_group_tab,
4229 x_matched_entities => l_matched_entities,
4230 x_out_rec => l_out_rec,
4231 x_return_status => x_return_status);
4232
4233 IF l_debug_on THEN
4234 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4235 END IF;
4236 IF (x_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
4237 OR NVL(l_out_rec.single_group, 'N') = 'N') THEN
4238 FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
4239 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4240 --
4241 IF l_debug_on THEN
4242 WSH_DEBUG_SV.pop(l_module_name);
4243 END IF;
4244 --
4245 return;
4246 END IF;
4247
4248 --dbms_output.put_line('creating assignment of cont ' || p_det_cont_inst_id || ' to container ' || p_par_cont_inst_id);
4249
4250 -- create assignment between child and parent container
4251 --
4252 IF l_debug_on THEN
4253 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.ASSIGN_CONT_TO_CONT',WSH_DEBUG_SV.C_PROC_LEVEL);
4254 END IF;
4255 --
4256 WSH_DELIVERY_DETAILS_ACTIONS.Assign_Cont_To_Cont (
4257 p_det_cont_inst_id,
4258 p_par_cont_inst_id,
4259 x_return_status);
4260
4261 IF l_debug_on THEN
4262 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4263 END IF;
4264 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4265 l_ret_sts := x_return_status;
4266 --
4267 IF l_debug_on THEN
4268 WSH_DEBUG_SV.pop(l_module_name);
4269 END IF;
4270 --
4271 return;
4272 END IF;
4273
4274 -- call update cont attributes to update grouping attr.
4275 --
4276 IF l_debug_on THEN
4277 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.UPDATE_CHILD_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
4278 END IF;
4279 --
4280 WSH_CONTAINER_UTILITIES.Update_Child_Containers (
4281 p_det_cont_inst_id,
4282 l_master_cont_id,
4283 l_master_serial_number,
4284 x_return_status);
4285 IF l_debug_on THEN
4286 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4287 END IF;
4288
4289 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4290 --
4291 IF l_debug_on THEN
4292 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4293 END IF;
4294 --
4298 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
4295 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_det_cont_inst_id);
4296 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_CHILD_UPD_ERROR');
4297 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
4299 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4300 --
4301 IF l_debug_on THEN
4302 WSH_DEBUG_SV.pop(l_module_name);
4303 END IF;
4304 --
4305 return;
4306 END IF;
4307
4308
4309 END IF;
4310
4311 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4312
4313 --
4314 IF l_debug_on THEN
4315 WSH_DEBUG_SV.pop(l_module_name);
4316 END IF;
4317 --
4318 EXCEPTION
4319
4320 WHEN Others THEN
4321 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Assign_To_Container',l_module_name);
4322 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4323
4324 --
4325 IF l_debug_on THEN
4326 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4327 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4328 END IF;
4329 --
4330 END Assign_To_Container;
4331
4332 /*
4333 -----------------------------------------------------------------------------
4334 PROCEDURE : Get_Cont_Load_Vol_info
4335 PARAMETERS : p_container_item_id - Item Id of the Container
4336 p_organization_id - Organization Id of the item
4337 p_w_v_both - W (Find Weight), V (Find Volume),
4338 B (Find Weight and Volume)
4339 x_return_status - Return Status of the API
4340 x_error_cnt - Count of errors encountered
4341 x_max_load - Max Load Weight of the container
4342 x_max_vol - Internal Volume of the container
4343 x_wt_uom - Weight UOM of the container
4344 x_vol_uom - Volume UOM of the container
4345 DESCRIPTION : This procedure finds Container Weight/Volume attributes
4346 either from database or from cached PL/SQL table and caches
4347 the info if fetched from database.
4348 ------------------------------------------------------------------------------
4349 */
4350
4351 PROCEDURE Get_Cont_Load_Vol_info(
4352 p_container_item_id IN NUMBER,
4353 p_organization_id IN NUMBER,
4354 p_w_v_both IN VARCHAR2,
4355 x_max_load OUT NOCOPY NUMBER,
4356 x_max_vol OUT NOCOPY NUMBER,
4357 x_wt_uom OUT NOCOPY VARCHAR2,
4358 x_vol_uom OUT NOCOPY VARCHAR2,
4359 -- x_inventory_item_status_code OUT VARCHAR2,
4360 x_return_status OUT NOCOPY VARCHAR2,
4361 x_error_cnt OUT NOCOPY NUMBER) IS
4362 -- in this cursor we can add filters as required in 2428050
4363 CURSOR Get_Cont_Msi (v_cont_item_id NUMBER, v_org_id NUMBER) IS
4364 SELECT maximum_load_weight, internal_volume,
4365 weight_uom_code, volume_uom_code
4366 FROM MTL_SYSTEM_ITEMS
4367 WHERE inventory_item_id = v_cont_item_id
4368 AND organization_id = v_org_id
4369 -- bug 2828591 - remove the condition since it will prevent user to create container with other status
4370 -- AND inventory_item_status_code = 'Active'
4371 AND container_item_flag = 'Y'
4372 AND nvl(vehicle_item_flag,'N') = 'N'
4373 AND shippable_item_flag = 'Y' ;
4374
4375 l_mtl_max_load NUMBER;
4376 l_mtl_max_vol NUMBER;
4377 l_mtl_wt_uom VARCHAR2(3);
4378 l_mtl_vol_uom VARCHAR2(3);
4379 l_inv_item_status_code VARCHAR2(10);
4380 l_flag VARCHAR2(1);
4381 l_item_name VARCHAR2(2000);
4382
4383 --
4384 l_debug_on BOOLEAN;
4385 --
4386 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'GET_CONT_LOAD_VOL_INFO';
4387 --
4388 BEGIN
4389 --
4390 --
4391 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4392 --
4393 IF l_debug_on IS NULL
4394 THEN
4395 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4396 END IF;
4397 --
4398 IF l_debug_on THEN
4399 WSH_DEBUG_SV.push(l_module_name);
4400 --
4401 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_ITEM_ID',P_CONTAINER_ITEM_ID);
4402 WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
4403 WSH_DEBUG_SV.log(l_module_name,'P_W_V_BOTH',P_W_V_BOTH);
4404 END IF;
4405 --
4406 x_error_cnt := 0;
4407 x_return_status := C_SUCCESS_STATUS;
4408 --dbms_output.put_line('Get_Cont_Load_Vol_info: p_container_item_id '||p_container_item_id||' p_w_v_both '||p_w_v_both);
4409 IF ((g_cont_msi_tab.COUNT > 0) AND (g_cont_msi_tab.EXISTS(p_container_item_id))) THEN
4410
4411 -- added for valid flag in PL SQL table
4412 IF g_cont_msi_tab(p_container_item_id).valid_flag = 'Y' THEN
4413 NULL;
4414 ELSE
4415 --
4416 IF l_debug_on THEN
4417 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4418 END IF;
4419 --
4420 l_item_name := WSH_UTIL_CORE.Get_Item_Name(p_container_item_id, p_organization_id);
4421 --dbms_output.put_line('Container '||p_container_item_id||' not found in Org '||p_organization_id);
4422 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_INV_ITEM');
4423 FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
4424 CLOSE Get_Cont_Msi;
4428
4425 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4426 x_return_status := C_ERROR_STATUS;
4427 x_error_cnt := x_error_cnt + 1;
4429 END IF;
4430 -- end of for valid flag
4431
4432 --dbms_output.put_line('Using Cached Cont/Msi Info');
4433 ELSE
4434 l_mtl_max_load := NULL;
4435 l_mtl_max_vol := NULL;
4436 l_mtl_wt_uom := NULL;
4437 l_mtl_vol_uom := NULL;
4438
4439 l_flag := 'Y';
4440
4441 OPEN Get_Cont_Msi(p_container_item_id, p_organization_id);
4442 FETCH Get_Cont_Msi
4443 INTO l_mtl_max_load,
4444 l_mtl_max_vol,
4445 l_mtl_wt_uom,
4446 l_mtl_vol_uom;
4447
4448 IF Get_Cont_Msi%NOTFOUND THEN
4449 --
4450 IF l_debug_on THEN
4451 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4452 END IF;
4453 --
4454 l_item_name := WSH_UTIL_CORE.Get_Item_Name(p_container_item_id, p_organization_id);
4455 --dbms_output.put_line('Container '||p_container_item_id||' not found in Org '||p_organization_id);
4456 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_INV_ITEM');
4457 FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
4458 CLOSE Get_Cont_Msi;
4459 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4460 x_return_status := C_ERROR_STATUS;
4461 x_error_cnt := x_error_cnt + 1;
4462 ELSE
4463
4464 --dbms_output.put_line('IN ELSE CLAUSE'||l_flag);
4465 CLOSE Get_Cont_Msi;
4466
4467
4468 IF ((NVL(l_mtl_max_load,0) <= 0) AND (p_w_v_both in ('W','B'))) THEN
4469 --dbms_output.put_line('Preferred Container Weight is <= 0');
4470 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_LOAD_ERROR');
4471 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4472 x_return_status := C_ERROR_STATUS;
4473 x_error_cnt := x_error_cnt + 1;
4474 l_flag := 'N';
4475 END IF;
4476
4477 IF ((NVL(l_mtl_max_vol,0) <= 0) AND (p_w_v_both in ('V','B'))) THEN
4478 --dbms_output.put_line('Preferred Container Volume is <= 0');
4479 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_VOL_ERROR');
4480 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4481 x_return_status := C_ERROR_STATUS;
4482 x_error_cnt := x_error_cnt + 1;
4483 l_flag := 'N';
4484 END IF;
4485
4486 IF (l_flag IS NULL OR l_flag <> 'N') THEN
4487 l_flag := 'Y';
4488 END IF;
4489
4490 END IF;
4491
4492 --dbms_output.put_line('Caching Cont/Msi Info'||l_flag);
4493 g_cont_msi_tab(p_container_item_id).mtl_max_load := l_mtl_max_load;
4494 g_cont_msi_tab(p_container_item_id).mtl_max_vol := l_mtl_max_vol;
4495 g_cont_msi_tab(p_container_item_id).mtl_wt_uom := l_mtl_wt_uom;
4496 g_cont_msi_tab(p_container_item_id).mtl_vol_uom := l_mtl_vol_uom;
4497 g_cont_msi_tab(p_container_item_id).valid_flag := l_flag;
4498 END IF;
4499
4500 x_max_load := g_cont_msi_tab(p_container_item_id).mtl_max_load;
4501 x_max_vol := g_cont_msi_tab(p_container_item_id).mtl_max_vol;
4502 x_wt_uom := g_cont_msi_tab(p_container_item_id).mtl_wt_uom;
4503 x_vol_uom := g_cont_msi_tab(p_container_item_id).mtl_vol_uom;
4504 --x_inventory_item_status_code := g_cont_msi_tab(p_container_item_id).inventory_item_status_code;
4505 --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Get_Cont_Load_Vol_info returned '||x_return_status||' with error count '||x_error_cnt);
4506
4507 --
4508 IF l_debug_on THEN
4509 WSH_DEBUG_SV.log(l_module_name,'MAX LOAD',x_max_load);
4510 WSH_DEBUG_SV.log(l_module_name,'MAX VOLUME',x_max_vol);
4511 WSH_DEBUG_SV.pop(l_module_name);
4512 END IF;
4513 --
4514 RETURN;
4515
4516 EXCEPTION
4517 WHEN Others THEN
4518 IF (Get_Cont_Msi%ISOPEN) THEN
4519 CLOSE Get_Cont_Msi;
4520 END IF;
4521 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Get_Cont_Load_Vol_info',l_module_name);
4522 x_return_status := C_UNEXP_ERROR_STATUS;
4523
4524 --
4525 IF l_debug_on THEN
4526 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4527 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4528 END IF;
4529 --
4530 END Get_Cont_Load_Vol_info;
4531
4532 /*
4533 -----------------------------------------------------------------------------
4534 PROCEDURE : Calc_Fill_Basis_and_Proc_Flag
4535 PARAMETERS : p_organization_id - Organization Id for which Fill Basis and
4536 Process Flag is to be determined
4537 x_return_status - Return Status of the API
4538 x_error_cnt - Count of errors encountered
4539 x_fill_basis - Fill Basis for the organization
4540 x_process_flag - Discrete/Process Organization
4541 DESCRIPTION : This procedure finds Fill Basis for organization and determines
4542 whether organization uses Process or Discrete Manufacturing
4543 either from database or from cached PL/SQL table and caches
4544 the info if fetched from database.
4545 ------------------------------------------------------------------------------
4546 */
4547
4548 PROCEDURE Calc_Fill_Basis_and_Proc_Flag(
4549 p_organization_id IN NUMBER,
4550 x_return_status OUT NOCOPY VARCHAR2,
4551 x_fill_basis OUT NOCOPY VARCHAR2,
4552 x_process_flag OUT NOCOPY VARCHAR2) IS
4556 --
4553
4554 l_param_info WSH_SHIPPING_PARAMS_PVT.Parameter_Rec_Typ;
4555
4557 l_debug_on BOOLEAN;
4558 --
4559 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CALC_FILL_BASIS_AND_PROC_FLAG';
4560 --
4561 BEGIN
4562
4563 --
4564 --
4565 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4566 --
4567 IF l_debug_on IS NULL
4568 THEN
4569 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4570 END IF;
4571 --
4572 IF l_debug_on THEN
4573 WSH_DEBUG_SV.push(l_module_name);
4574 --
4575 WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
4576 END IF;
4577 --
4578 --
4579 IF l_debug_on THEN
4580 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_SHIPPING_PARAMS_PVT.GET',WSH_DEBUG_SV.C_PROC_LEVEL);
4581 END IF;
4582 --
4583 WSH_SHIPPING_PARAMS_PVT.Get(
4584 p_organization_id => p_organization_id,
4585 x_param_info => l_param_info,
4586 x_return_status => x_return_status);
4587
4588 IF l_debug_on THEN
4589 WSH_DEBUG_SV.log(l_module_name,'return status - ',x_return_status);
4590 END IF;
4591 IF (x_return_status = C_SUCCESS_STATUS) THEN
4592 x_fill_basis := l_param_info.percent_fill_basis_flag;
4593 -- HW OPMCONV - No need to populate this value
4594 -- x_process_flag := l_param_info.process_flag;
4595 END IF;
4596
4597 --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Calc_Fill_Basis_and_proc_flag returned '||x_return_status);
4598
4599 --
4600 IF l_debug_on THEN
4601 WSH_DEBUG_SV.pop(l_module_name);
4602 END IF;
4603 --
4604 RETURN;
4605
4606 --
4607 IF l_debug_on THEN
4608 WSH_DEBUG_SV.pop(l_module_name);
4609 END IF;
4610 --
4611 EXCEPTION
4612 WHEN Others THEN
4613 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Calc_Fill_Basis_and_proc_flag',l_module_name);
4614 x_return_status := C_UNEXP_ERROR_STATUS;
4615 --
4616 IF l_debug_on THEN
4617 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4618 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4619 END IF;
4620 --
4621 END Calc_Fill_Basis_and_proc_flag;
4622
4623 /*
4624 -----------------------------------------------------------------------------
4625 PROCEDURE : Calc_Pref_Container
4626 PARAMETERS : p_organization_id - Organization Id of the Item for which
4627 Preferred Container is to be determined
4628 p_inventory_item_id - Item for which Preferred Container is to
4629 be determined
4630 p_fill_pc_basis - Fill Basis for the organization
4631 x_return_status - Return Status of the API
4632 x_error_cnt - Count of errors encountered
4633 x_cont_item_id - Preferred Container Item Id
4634 x_max_load_qty - Max Load Qty of the Preferred Container
4635 DESCRIPTION : This procedure finds preferred container for item-organization
4636 combination either from database or from cached PL/SQL table
4637 and caches the info if fetched from database.
4638 This procedure also finds and caches the Max Load qty a
4639 preferred container can hold if fill basis is Quantity.
4640 ------------------------------------------------------------------------------
4641 */
4642
4643 PROCEDURE Calc_Pref_Container(
4644 p_organization_id IN NUMBER,
4645 p_inventory_item_id IN NUMBER,
4646 p_fill_pc_basis IN VARCHAR2,
4647 x_return_status OUT NOCOPY VARCHAR2,
4648 x_error_cnt OUT NOCOPY NUMBER,
4649 x_cont_item_id OUT NOCOPY NUMBER,
4650 x_max_load_qty OUT NOCOPY NUMBER) IS
4651
4652 CURSOR Get_Cont_Load (v_inv_item_id NUMBER, v_organization_id NUMBER) IS
4653 SELECT container_item_id,
4654 max_load_quantity
4655 FROM WSH_CONTAINER_ITEMS
4656 WHERE load_item_id = v_inv_item_id
4657 AND master_organization_id = v_organization_id
4658 AND preferred_flag = 'Y';
4659
4660 l_wcl_cont_item_id NUMBER;
4661 l_max_load_qty NUMBER;
4662 l_item_name VARCHAR2(2000);
4663 l_org_name VARCHAR2(240);
4664
4665
4666 --
4667 l_debug_on BOOLEAN;
4668 --
4669 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CALC_PREF_CONTAINER';
4670 --
4671 BEGIN
4672 --
4673 --
4674 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4675 --
4676 IF l_debug_on IS NULL
4677 THEN
4678 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4679 END IF;
4680 --
4681 IF l_debug_on THEN
4682 WSH_DEBUG_SV.push(l_module_name);
4683 --
4684 WSH_DEBUG_SV.log(l_module_name,'P_ORGANIZATION_ID',P_ORGANIZATION_ID);
4685 WSH_DEBUG_SV.log(l_module_name,'P_INVENTORY_ITEM_ID',P_INVENTORY_ITEM_ID);
4686 WSH_DEBUG_SV.log(l_module_name,'P_FILL_PC_BASIS',P_FILL_PC_BASIS);
4687 END IF;
4688 --
4689 x_error_cnt := 0;
4690 x_return_status := C_SUCCESS_STATUS;
4691
4692 IF ((g_cache_cont_load_info_tab.COUNT > 0) AND (g_cache_cont_load_info_tab.EXISTS(p_inventory_item_id))) THEN
4693 NULL;
4694 --dbms_output.put_line('Using Cached Cont/Load info');
4695 ELSE
4696 l_wcl_cont_item_id := NULL;
4700
4697 l_max_load_qty := NULL;
4698
4699 OPEN Get_Cont_Load (p_inventory_item_id, p_organization_id);
4701 FETCH Get_Cont_Load
4702 INTO l_wcl_cont_item_id,
4703 l_max_load_qty;
4704
4705 IF Get_Cont_Load%NOTFOUND THEN
4706 CLOSE Get_Cont_Load;
4707 --
4708 IF l_debug_on THEN
4709 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ITEM_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4710 END IF;
4711 --
4712 l_item_name := WSH_UTIL_CORE.Get_Item_Name(p_inventory_item_id, p_organization_id);
4713 --
4714 IF l_debug_on THEN
4715 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.GET_ORG_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
4716 END IF;
4717 --
4718 l_org_name := WSH_UTIL_CORE.Get_Org_Name(p_organization_id);
4719 --dbms_output.put_line('Error: Cont/Load Relationship does not exist for Item '||l_item_name||' Org '||l_org_name);
4720 --dbms_output.put_line('p_inventory_item_id '||p_inventory_item_id||' p_organization_id '||p_organization_id);
4721 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONT_LOAD');
4722 FND_MESSAGE.SET_TOKEN('ITEM_NAME',l_item_name);
4723 FND_MESSAGE.SET_TOKEN('ORG_NAME',l_org_name);
4724 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4725 x_return_status := C_ERROR_STATUS;
4726 x_error_cnt := x_error_cnt + 1;
4727 ELSE
4728 CLOSE Get_Cont_Load;
4729 IF ((l_max_load_qty = 0) AND (p_fill_pc_basis = 'Q')) THEN
4730 --dbms_output.put_line('Error: Max Load qty for Preferred Container is 0');
4731 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_LOAD_QTY_ERROR');
4732 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
4733 x_error_cnt := x_error_cnt + 1;
4734 x_return_status := C_ERROR_STATUS;
4735 l_wcl_cont_item_id := NULL;
4736 END IF;
4737 END IF;
4738
4739 g_cache_cont_load_info_tab(p_inventory_item_id).cont_item_id := l_wcl_cont_item_id;
4740 g_cache_cont_load_info_tab(p_inventory_item_id).max_load_qty := l_max_load_qty;
4741 --dbms_output.put_line('Caching Cont/Load info');
4742 END IF;
4743 x_cont_item_id := g_cache_cont_load_info_tab(p_inventory_item_id).cont_item_id;
4744 x_max_load_qty := g_cache_cont_load_info_tab(p_inventory_item_id).max_load_qty;
4745 --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Calc_Pref_Container returned '||x_return_status||' with error count '||x_error_cnt);
4746
4747 --
4748 IF l_debug_on THEN
4749 WSH_DEBUG_SV.pop(l_module_name);
4750 END IF;
4751 --
4752 RETURN;
4753
4754 --
4755 IF l_debug_on THEN
4756 WSH_DEBUG_SV.pop(l_module_name);
4757 END IF;
4758 --
4759 EXCEPTION
4760 WHEN Others THEN
4761 IF (Get_Cont_Load%ISOPEN) THEN
4762 CLOSE Get_Cont_Load;
4763 END IF;
4764 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Calc_Pref_Container',l_module_name);
4765 x_return_status := C_UNEXP_ERROR_STATUS;
4766
4767 --
4768 IF l_debug_on THEN
4769 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
4770 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
4771 END IF;
4772 --
4773 END Calc_Pref_Container;
4774
4775 /*
4776 -----------------------------------------------------------------------------
4777 PROCEDURE : Pack_Delivery_Detail
4778 PARAMETERS : p_line_cont_rec - Dd info which needs to be autopacked
4779 x_return_status - Return Status of the API
4780 DESCRIPTION : This procedure packs a delivery detail into Container either
4781 by creating a new one or by packing it into one created for
4782 previous delivery details (created in the same run)
4783 ------------------------------------------------------------------------------
4784 */
4785
4786 PROCEDURE Pack_Delivery_Detail(
4787 p_line_cont_rec IN wsh_container_actions.line_cont_info,
4788 x_return_status OUT NOCOPY VARCHAR2) IS
4789
4790 l_mtl_max_load NUMBER;
4791 l_mtl_max_vol NUMBER;
4792 l_item_name VARCHAR2(2000);
4793 l_weight_per_pc NUMBER;
4794 l_volume_per_pc NUMBER;
4795 l_volume_per_pc2 NUMBER;
4796 l_equal_distribution BOOLEAN;
4797 l_wt_left NUMBER;
4798 l_vol_left NUMBER;
4799 l_original_qty NUMBER;
4800 l_quantity_left NUMBER;
4801 l_tmp_split_qty NUMBER;
4802 l_tmp_split_qty2 NUMBER;
4803 l_split_qty NUMBER;
4804 l_split_qty2 NUMBER;
4805 l_split_del_detail_id NUMBER;
4806 l_return_status VARCHAR2(1) := C_SUCCESS_STATUS;
4807 l_output_qty NUMBER;
4808 l_discard_message VARCHAR2(2000);
4809 l_max_load_qty NUMBER;
4810 l_tot_gross_wt NUMBER;
4811 l_tot_net_wt NUMBER;
4812 l_tot_vol NUMBER;
4813 l_dd_wt_per_pc NUMBER;
4814 l_dd_gross_wt_left NUMBER;
4815 l_dd_net_wt_left NUMBER;
4816 l_dd_vol_per_pc NUMBER;
4817 l_dd_vol_left NUMBER;
4818
4819 i NUMBER;
4820 j NUMBER;
4821 gcdvalue NUMBER;
4822
4823 l_count_container NUMBER;
4824 l_container_item_id NUMBER;
4825 l_container_org_id NUMBER;
4826 l_num_of_split NUMBER;
4830 l_debug_on BOOLEAN;
4827 l_dd_id_tab WSH_UTIL_CORE.id_tab_type;
4828
4829 --
4831 --
4832 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'PACK_DELIVERY_DETAIL';
4833 --
4834 BEGIN
4835 --
4836 --
4837 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
4838 --
4839 IF l_debug_on IS NULL
4840 THEN
4841 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
4842 END IF;
4843 --
4844 IF l_debug_on THEN
4845 WSH_DEBUG_SV.push(l_module_name);
4846 WSH_DEBUG_SV.log(l_module_name,'In Pack_Delivery_Detail API, Packing wdd '||p_line_cont_rec.delivery_detail_id||' div flag '||p_line_cont_rec.indivisible_flag||' Process Flag '||p_line_cont_rec.process_flag);
4847 WSH_DEBUG_SV.log(l_module_name,'Fill Pc Basis '||p_line_cont_rec.fill_pc_basis||' G Wt '||p_line_cont_rec.gross_weight||' N Wt '||p_line_cont_rec.net_weight||' Vol '||p_line_cont_rec.volume );
4848 END IF;
4849 --
4850 l_dd_gross_wt_left := ROUND(p_line_cont_rec.gross_weight,LIMITED_PRECISION);
4851 l_dd_net_wt_left := ROUND(p_line_cont_rec.net_weight,LIMITED_PRECISION);
4852 l_dd_vol_left := ROUND(p_line_cont_rec.volume,LIMITED_PRECISION);
4853
4854 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
4855 l_max_load_qty := p_line_cont_rec.max_load_qty;
4856 --dbms_output.put_line('Max Load qty is '||p_line_cont_rec.max_load_qty);
4857 ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
4858
4859 l_mtl_max_load := p_line_cont_rec.cont_wt;
4860
4861 -- Calculate Wt per Piece. We pack based on converted Container UOM weight
4862 l_weight_per_pc := TRUNC(p_line_cont_rec.converted_wt/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
4863 l_wt_left := p_line_cont_rec.converted_wt;
4864 -- Bug 2786021
4865 IF (nvl(l_mtl_max_load,0) = 0 OR nvl(l_weight_per_pc,0) = 0)THEN
4866 x_return_status := C_ERROR_STATUS;
4867 IF nvl(l_mtl_max_load,0) = 0 THEN
4868 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_LOAD_ERROR');
4869 ELSIF nvl(l_weight_per_pc,0) = 0 THEN
4870 FND_MESSAGE.SET_NAME('WSH','WSH_NULL_WEIGHT_VOLUME');
4871 FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL',p_line_cont_rec.delivery_detail_id);
4872 END IF;
4873 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4874 IF l_debug_on THEN
4875 WSH_DEBUG_SV.pop(l_module_name);
4876 END IF;
4877 RETURN;
4878 END IF;
4879 -- Bug 2786021
4880
4881 ELSE
4882 l_mtl_max_vol := p_line_cont_rec.cont_vol;
4883
4884 -- Calculate Vol per Piece. We pack based on converted Container UOM volume
4885 l_volume_per_pc := TRUNC(p_line_cont_rec.converted_vol/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
4886 l_vol_left := p_line_cont_rec.converted_vol;
4887 -- Bug 2786021
4888 IF (nvl(l_mtl_max_vol,0) = 0 OR nvl(l_volume_per_pc,0) = 0) THEN
4889 x_return_status := C_ERROR_STATUS;
4890 IF nvl(l_mtl_max_vol,0) = 0 THEN
4891 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_VOL_ERROR');
4892 ELSIF nvl(l_volume_per_pc,0) = 0 THEN
4893 FND_MESSAGE.SET_NAME('WSH','WSH_NULL_WEIGHT_VOLUME');
4894 FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL',p_line_cont_rec.delivery_detail_id);
4895 END IF;
4896 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
4897 IF l_debug_on THEN
4898 WSH_DEBUG_SV.pop(l_module_name);
4899 END IF;
4900 RETURN;
4901 END IF;
4902 -- Bug 2786021
4903 END IF;
4904
4905 IF l_debug_on THEN
4906 WSH_DEBUG_SV.log(l_module_name,'Wt per pc-',l_weight_per_pc);
4907 WSH_DEBUG_SV.log(l_module_name,'Vol per pc-',l_volume_per_pc);
4908 WSH_DEBUG_SV.log(l_module_name,'Cont max load-',l_mtl_max_load);
4909 WSH_DEBUG_SV.log(l_module_name,'Cont max vol-',l_mtl_max_vol);
4910 END IF;
4911
4912 l_original_qty := p_line_cont_rec.shp_qty;
4913 l_quantity_left := p_line_cont_rec.shp_qty;
4914
4915 -- Check Empty Containers first
4916 IF (g_empty_cont_tab.COUNT > 0 ) THEN
4917 --dbms_output.put_line('There are containers with empty space'||to_char(sysdate,'HH24:MI:SS'));
4918
4919 i := g_empty_cont_tab.FIRST;
4920 WHILE i <= g_empty_cont_tab.LAST LOOP
4921 IF p_line_cont_rec.preferred_container <> g_empty_cont_tab(i).container_item_Id OR
4922 p_line_cont_rec.organization_id <> g_empty_cont_tab(i).organization_id OR
4923 p_line_cont_rec.group_id <> g_empty_cont_tab(i).group_id OR
4924 (NVL(p_line_cont_rec.master_cont_item_id,NVL(g_empty_cont_tab(i).mast_cont_item_id,-99)) <> NVL(g_empty_cont_tab(i).mast_cont_item_id,-99)) OR
4925 g_empty_cont_tab(i).empty <= 0 THEN
4926 GOTO next_cont;
4927 END IF;
4928
4929 -- Got a Match in empty container table
4930
4931 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
4932 --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty numerator '||g_empty_cont_tab(i).numerator||' denominator '||g_empty_cont_tab(i).denominator);
4933 -- Calculate qty than can fit in 'empty' space
4934 -- Bug 2733274
4935 l_tmp_split_qty := TRUNC((p_line_cont_rec.max_load_qty*g_empty_cont_tab(i).numerator)/g_empty_cont_tab(i).denominator,LIMITED_PRECISION);
4936
4937 ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
4938 --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty weight '||g_empty_cont_tab(i).empty);
4939 -- Calculate qty than can fit in 'empty' space
4940 l_tmp_split_qty := TRUNC(g_empty_cont_tab(i).empty/l_weight_per_pc,LIMITED_PRECISION);
4941 ELSE
4945 END IF;
4942 --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty volume '||g_empty_cont_tab(i).empty);
4943 -- Calculate qty than can fit in 'empty' space
4944 l_tmp_split_qty := TRUNC(g_empty_cont_tab(i).empty/l_volume_per_pc,LIMITED_PRECISION);
4946 -- l_tmp_split_qty is qty, in fraction, that can fit into empty container
4947 --dbms_output.put_line('l_tmp_split_qty '||l_tmp_split_qty||' l_tmp_split_qty2 '||l_tmp_split_qty2);
4948
4949 -- Per Pushkar,OPM: Call Check_Decimal_Quantity for both OPM and Discrete for primary quantity
4950 --
4951 IF l_debug_on THEN
4952 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
4953 END IF;
4954 --
4955 WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
4956 p_line_cont_rec.inventory_item_id,
4957 p_line_cont_rec.organization_id,
4958 l_tmp_split_qty,
4959 p_line_cont_rec.req_qty_uom,
4960 l_output_qty,
4961 l_return_status);
4962
4963 IF l_debug_on THEN
4964 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
4965 END IF;
4966 IF (l_return_status <> C_SUCCESS_STATUS OR
4967 p_line_cont_rec.indivisible_flag = 'Y')THEN
4968 -- Fractional qtys not allowed
4969 --dbms_output.put_line('WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity returned '||l_return_status);
4970 l_discard_message := FND_MESSAGE.GET;
4971 l_tmp_split_qty := FLOOR(l_tmp_split_qty);
4972 END IF;
4973 -- HW OPMCONV - 1) No need to check for process
4974 -- - 2) Changed code to handle qty2
4975 -- - 3) Remove OPM specific precision to 9
4976
4977 IF ( p_line_cont_rec.shp_qty2 IS NOT NULL ) THEN
4978 l_tmp_split_qty2 := (l_tmp_split_qty * p_line_cont_rec.shp_qty2)/p_line_cont_rec.shp_qty;
4979 ELSE
4980 l_tmp_split_qty2 := NULL;
4981 END IF;
4982 --dbms_output.put_line('l_tmp_split_qty '||l_tmp_split_qty||' l_tmp_split_qty2 '||l_tmp_split_qty2||' l_quantity_left '||l_quantity_left);
4983
4984 IF (l_tmp_split_qty <= 0) THEN
4985 -- Container insufficient, skip this
4986 --dbms_output.put_line('Container Insufficient. Skipping this');
4987 GOTO next_cont;
4988 ELSE
4989 IF (l_tmp_split_qty >= l_quantity_left) THEN
4990 -- all left can be packed into the empty container
4991 l_tmp_split_qty := l_quantity_left;
4992 l_quantity_left := 0;
4993
4994 -- Assign the dd to container
4995 g_assign_detail_index := g_assign_detail_index + 1;
4996 g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := p_line_cont_rec.delivery_detail_id;
4997 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
4998 g_assign_detail_tab(g_assign_detail_index).container_index := g_empty_cont_tab(i).container_index;
4999 g_assign_detail_tab(g_assign_detail_index).gross_weight := l_dd_gross_wt_left;
5000 g_assign_detail_tab(g_assign_detail_index).net_weight := l_dd_net_wt_left;
5001 g_assign_detail_tab(g_assign_detail_index).volume := l_dd_vol_left;
5002 -- J: W/V Changes
5003 g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5004 g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5005 g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5006 -- K LPN CONV. rv
5007 g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5008 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5009
5010 --dbms_output.put_line('Assigning '||g_assign_detail_tab(g_assign_detail_index).delivery_detail_id||' to Cont index '||g_assign_detail_tab(g_assign_detail_index).container_index);
5011
5012 ELSIF (l_tmp_split_qty < l_quantity_left) THEN
5013 -- Some qty will be left out
5014 --- HW OPM BUG#3011758
5015 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
5016 -- - 2) Changed check condition for lot divisible from 1 to 'N'
5017 IF( p_line_cont_rec.lot_divisible_flag = 'N') THEN
5018 goto next_cont;
5019 END IF;
5020
5021 l_quantity_left := l_quantity_left - l_tmp_split_qty;
5022
5023 --dbms_output.put_line('Splitting dd '||p_line_cont_rec.delivery_detail_id||' with qty '||l_tmp_split_qty);
5024 --
5025 IF l_debug_on THEN
5026 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
5027 WSH_DEBUG_SV.logmsg(l_module_name,'SPLIT QTY IS'||l_tmp_split_qty);
5028 END IF;
5029 --
5030
5031 -- added l_dd_id_tab for Bulk call
5032 -- empty container logic, need to test and modify this
5033 -- the value for p_num_of_split is passed as 1
5034 -- so that split occurs once
5035
5036 WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details_bulk (
5037 p_from_detail_id => p_line_cont_rec.delivery_detail_id,
5038 p_req_quantity => l_tmp_split_qty,
5039 p_req_quantity2 => l_tmp_split_qty2,
5040 p_manual_split => 'C',
5041 p_num_of_split => 1,
5042 x_new_detail_id => l_split_del_detail_id,
5043 x_dd_id_tab => l_dd_id_tab,
5047 IF l_debug_on THEN
5044 x_return_status => l_return_status
5045 );
5046
5048 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5049 END IF;
5050 --dbms_output.put_line('STATUS after SPLITDD in empty'||l_return_status||l_dd_id_tab.count);
5051
5052 IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
5053 WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
5054 --dbms_output.put_line('WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details returned '|| l_return_status);
5055 x_return_status := C_ERROR_STATUS;
5056 --dbms_output.put_line('WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details returned '||x_return_status);
5057 FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
5058 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_line_cont_rec.delivery_detail_id);
5059 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5060 --
5061 IF l_debug_on THEN
5062 WSH_DEBUG_SV.pop(l_module_name);
5063 END IF;
5064 --
5065 return;
5066 END IF;
5067
5068 IF l_debug_on THEN
5069 WSH_DEBUG_SV.logmsg(l_module_name,'COUNT OF WDD RECORDS IS'||l_dd_id_tab.count);
5070 END IF;
5071
5072 --dbms_output.put_line('Created new dd '||l_split_del_detail_id);
5073
5074 -- Calculate distributed wt/vol for the new dd
5075 l_tot_gross_wt := ROUND((l_tmp_split_qty * p_line_cont_rec.gross_weight)/p_line_cont_rec.shp_qty, LIMITED_PRECISION);
5076 l_tot_net_wt := ROUND((l_tmp_split_qty * p_line_cont_rec.net_weight)/p_line_cont_rec.shp_qty, LIMITED_PRECISION);
5077 l_tot_vol := ROUND((l_tmp_split_qty * p_line_cont_rec.volume)/p_line_cont_rec.shp_qty, LIMITED_PRECISION);
5078 l_dd_gross_wt_left := l_dd_gross_wt_left - l_tot_gross_wt;
5079 l_dd_net_wt_left := l_dd_net_wt_left - l_tot_net_wt;
5080 l_dd_vol_left := l_dd_vol_left - l_tot_vol;
5081
5082 -- Use Bulk assignment into this PL SQL table
5083 -- from the returned PL SQL table
5084 -- weight volume will be same
5085 -- Look for empty container population in record, is this correct???
5086
5087 FOR j in 1..l_dd_id_tab.count
5088 LOOP
5089 -- Assign the newly created dd
5090 --dbms_output.put_line('Value of j is'||j);
5091 g_assign_detail_index := g_assign_detail_index + 1;
5092 --g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_split_del_detail_id;
5093 g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_dd_id_tab(j);
5094 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5095 g_assign_detail_tab(g_assign_detail_index).container_index := g_empty_cont_tab(i).container_index;
5096 g_assign_detail_tab(g_assign_detail_index).gross_weight := l_tot_gross_wt;
5097 g_assign_detail_tab(g_assign_detail_index).net_weight := l_tot_net_wt;
5098 g_assign_detail_tab(g_assign_detail_index).volume := l_tot_vol;
5099 -- J: W/V Changes
5100 g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5101 g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5102 g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5103 -- K LPN CONV. rv
5104 g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5105 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5106 --dbms_output.put_line('Assigning '||g_assign_detail_tab(g_assign_detail_index).delivery_detail_id||' to Cont index '||g_assign_detail_tab(g_assign_detail_index).container_index);
5107
5108 -- j := j + 1;
5109
5110 END LOOP;
5111 l_dd_id_tab.DELETE;
5112 END IF;
5113
5114 -- Calcualte space left and see if container needs to be deleted from empty cont PL/SQL table
5115 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
5116 g_empty_cont_tab(i).numerator := (g_empty_cont_tab(i).numerator * l_max_load_qty) - (g_empty_cont_tab(i).denominator * l_tmp_split_qty);
5117 g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator * l_max_load_qty;
5118
5119 /* Bug # 3005780 : Added GCD just to reduce the numerator and denominator values
5120 Example : When packing 100 LPNs into a master container (Where Max load QTY is 100) , after some iterations the numerator and denominator values exceeding the maximum
5121 allowable value in NUMBER data type. to overcome that problem using the Get_Gcd function which limit the both numerator and denominator */
5122 IF (g_empty_cont_tab(i).numerator <> 0 ) AND (g_empty_cont_tab(i).denominator <> 0 ) THEN
5123 gcdvalue := Get_Gcd(g_empty_cont_tab(i).numerator , g_empty_cont_tab(i).denominator);
5124 --dbms_output.put_line('Get_Gcd return value is '||gcdvalue');
5125 IF (gcdvalue > 1) THEN
5126 g_empty_cont_tab(i).numerator := g_empty_cont_tab(i).numerator / gcdvalue;
5127 g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator / gcdvalue ;
5128 END IF;
5129 END IF;
5130 IF ((g_empty_cont_tab(i).numerator <= 0) OR
5131 (g_empty_cont_tab(i).numerator >= g_empty_cont_tab(i).denominator)) THEN
5132 --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
5133 g_empty_cont_tab.DELETE(i);
5134 END IF;
5138 IF (g_empty_cont_tab(i).empty <= 0) THEN
5135 ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
5136 l_wt_left := l_wt_left - ROUND(l_tmp_split_qty*l_weight_per_pc,LIMITED_PRECISION);
5137 g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - (l_tmp_split_qty * l_weight_per_pc);
5139 --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
5140 g_empty_cont_tab.DELETE(i);
5141 END IF;
5142 ELSE
5143 l_vol_left := l_vol_left - ROUND(l_tmp_split_qty*l_volume_per_pc,LIMITED_PRECISION);
5144 g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - (l_tmp_split_qty * l_volume_per_pc);
5145 IF (g_empty_cont_tab(i).empty <= 0) THEN
5146 --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
5147 g_empty_cont_tab.DELETE(i);
5148 END IF;
5149 END IF;
5150
5151 END IF; -- l_tmp_split_qty <= 0
5152
5153 -- If the whole qty is packed then exit the loop
5154 IF (l_quantity_left <= 0) THEN
5155 EXIT;
5156 END IF;
5157
5158 <<next_cont>>
5159 i := g_empty_cont_tab.NEXT(i);
5160 END LOOP;
5161 END IF; -- g_empty_cont_tab > 0
5162
5163 --dbms_output.put_line('AFter EMPTY containers with empty space'||to_char(sysdate,'HH24:MI:SS'));
5164
5165 --dbms_output.put_line(' *** Looping empty cont tab is Over and Quantity Left is '||l_quantity_left||' ***');
5166 IF (l_quantity_left > 0) THEN
5167 -- Some qty is left out
5168
5169 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
5170
5171 l_tmp_split_qty := l_max_load_qty;
5172 l_split_qty := l_tmp_split_qty;
5173
5174 ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
5175
5176 -- Need to do TRUNC instead of ROUND because of following case
5177 -- Ex: If we try to pack qty 4(wt per 3Lbs) into Cont with wt 2LB the value of l_tmp_split_qty(after ROUND) is 0.66667
5178 -- Total wt of split dd will be 0.66667 * 3 = 2.00001 which is > Cont capacity
5179 l_tmp_split_qty := TRUNC((l_quantity_left*l_mtl_max_load)/l_wt_left,LIMITED_PRECISION);
5180 l_split_qty := l_tmp_split_qty;
5181 --dbms_output.put_line('l_quantity_left '||l_quantity_left||' l_wt_left '||l_wt_left||' l_mtl_max_load '||l_mtl_max_load);
5182
5183 ELSE
5184
5185 l_tmp_split_qty := TRUNC((l_quantity_left*l_mtl_max_vol)/l_vol_left,LIMITED_PRECISION);
5186 l_split_qty := l_tmp_split_qty;
5187 --dbms_output.put_line('l_quantity_left '||l_quantity_left||' l_vol_left '||l_vol_left||' l_mtl_max_vol '||l_mtl_max_vol);
5188
5189 END IF;
5190 -- l_tmp_split_qty holds max that can be packed into a new container
5191 --dbms_output.put_line(' l_tmp_split_qty '||l_tmp_split_qty);
5192
5193 -- Per Pushkar,OPM: Call Check_Decimal_Quantity for both OPM and Discrete for primary quantity
5194 --
5195 IF l_debug_on THEN
5196 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
5197 END IF;
5198 --
5199 WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
5200 p_line_cont_rec.inventory_item_id,
5201 p_line_cont_rec.organization_id,
5202 l_tmp_split_qty,
5203 p_line_cont_rec.req_qty_uom,
5204 l_output_qty,
5205 l_return_status);
5206
5207 IF l_debug_on THEN
5208 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5209 END IF;
5210 IF (l_return_status <> C_SUCCESS_STATUS OR
5211 p_line_cont_rec.indivisible_flag = 'Y')THEN
5212 -- Fractional qtys not allowed
5213 --dbms_output.put_line('WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity returned '||l_return_status);
5214 l_discard_message := FND_MESSAGE.GET;
5215 l_split_qty := FLOOR(l_tmp_split_qty);
5216 END IF;
5217
5218 -- HW OPMCONV - 1) No need to check for process
5219 -- - 2) Changed code to handle qty2
5220
5221 IF ( p_line_cont_rec.shp_qty2 IS NOT NULL ) THEN
5222 l_split_qty2 := (l_split_qty * p_line_cont_rec.shp_qty2)/p_line_cont_rec.shp_qty;
5223 ELSE
5224 l_split_qty2 := NULL;
5225 END IF;
5226 -- Split Qty holds quantity that can be packed into a container
5227
5228 --dbms_output.put_line('l_split_qty '||l_split_qty||' l_split_qty2 '||l_split_qty2);
5229 -- initialize the variables
5230 l_count_container := 0;
5231 l_container_item_id := -99;
5232 l_container_org_id := -99;
5233
5234 --dbms_output.put_line('Before LOOP in pack DD'||to_char(sysdate,'HH24:MI:SS'));
5235 WHILE (l_quantity_left > 0) LOOP
5236
5237 -- Create new container index
5238 --g_new_cont_index := g_new_cont_index + 1;
5239
5240 -- added code here
5241 IF (p_line_cont_rec.preferred_container = l_container_item_id
5242 AND p_line_cont_rec.organization_id = l_container_org_id)
5243 THEN
5244 -- keep appending this logic is moved to the end
5245 null;
5246 ELSE
5247 -- reset counter
5248 l_count_container := 0;
5249 END IF;
5250
5251 l_container_item_id := p_line_cont_rec.preferred_container;
5252 l_container_org_id := p_line_cont_rec.organization_id;
5253
5254 --dbms_output.put_line('Created Container index '||g_new_cont_index);
5255 --dbms_output.put_line('l_tmp_split_qty '||l_tmp_split_qty||' l_split_qty '||l_split_qty);
5256
5257 IF (l_split_qty < l_quantity_left
5258 AND l_split_qty > 0
5262
5259 ) THEN
5260 -- Quantity left is > Split qty
5261 l_num_of_split := CEIL(l_quantity_left/l_split_qty) -1;
5263 -- Start BugFix#3475352
5264 IF (l_num_of_split + 1) > 100000 THEN
5265 x_return_status := C_ERROR_STATUS;
5266 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONT_COUNT');
5267 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_line_cont_rec.delivery_detail_id);
5268 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5269 return;
5270 END IF;
5271 -- End BugFix#3475352
5272
5273 --dbms_output.put_line('Splitting dd '||p_line_cont_rec.delivery_detail_id||' with qty '||l_split_qty);
5274 IF l_debug_on THEN
5275 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS_BULK',WSH_DEBUG_SV.C_PROC_LEVEL);
5276 WSH_DEBUG_SV.logmsg(l_module_name,'Split Qty is'||l_split_qty);
5277 WSH_DEBUG_SV.logmsg(l_module_name,'Number of split is'||l_num_of_split);
5278 END IF;
5279
5280 --this is in Main Loop
5281 -- Call BULK Split API
5282
5283 --dbms_output.put_line('======BEFORE SPLIT'||l_dd_id_tab.count||'<'||l_num_of_split);
5284
5285 WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details_bulk (
5286 p_from_detail_id => p_line_cont_rec.delivery_detail_id,
5287 p_req_quantity => l_split_qty,
5288 p_req_quantity2 => l_split_qty2,
5289 p_manual_split => 'C',
5290 p_num_of_split => l_num_of_split,
5291 x_new_detail_id => l_split_del_detail_id,
5292 x_dd_id_tab => l_dd_id_tab,
5293 x_return_status => l_return_status
5294 );
5295
5296 IF l_debug_on THEN
5297 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5298 END IF;
5299
5300 IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
5301 WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
5302 --dbms_output.put_line('WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details returned '|| l_return_status);
5303 x_return_status := C_ERROR_STATUS;
5304 FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
5305 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_line_cont_rec.delivery_detail_id);
5306 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
5307
5308 IF l_debug_on THEN
5309 WSH_DEBUG_SV.pop(l_module_name);
5310 END IF;
5311
5312 return;
5313 END IF;
5314 --dbms_output.put_line('======AFTER SPLIT'||l_dd_id_tab.count);
5315
5316 ELSE -- (l_split_qty < l_quantity_left)
5317 -- l_quantity_left <= l_split_qty which means there is no more qty left
5318
5319 l_split_qty := l_quantity_left;
5320 l_split_del_detail_id := p_line_cont_rec.delivery_detail_id;
5321 l_dd_id_tab(l_dd_id_tab.count + 1) := p_line_cont_rec.delivery_detail_id;
5322 END IF;
5323 --dbms_output.put_line('l_tmp_split_qty '||l_tmp_split_qty||' l_split_qty '||l_split_qty);
5324
5325 -- Insert the new container into empty PL/SQL cont table only if l_tmp_split_qty > l_split_qty
5326 -- Otherwise Container is full
5327 IF ((l_tmp_split_qty - l_split_qty) > 0) THEN
5328 -- l_tmp_split_qty > l_split_qty means container is not full and
5329 -- we need to calculate how much empty space is left
5330 IF (g_empty_cont_tab.COUNT = 0) THEN
5331 j := 1;
5332 ELSE
5333 j:= g_empty_cont_tab.LAST + 1;
5334 END IF;
5335 --g_empty_cont_tab(j).container_index := g_new_cont_index;
5336 -- changed this part
5337 g_empty_cont_tab(j).container_index := g_new_cont_index + 1;
5338 g_empty_cont_tab(j).container_item_id := p_line_cont_rec.preferred_container;
5339 g_empty_cont_tab(j).organization_id := p_line_cont_rec.organization_id;
5340 g_empty_cont_tab(j).group_id := p_line_cont_rec.group_id;
5341 g_empty_cont_tab(j).mast_cont_item_id := p_line_cont_rec.master_cont_item_id;
5342
5343 -- Calculate Empty Space
5344 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
5345 g_empty_cont_tab(j).numerator := l_max_load_qty - l_split_qty;
5346 g_empty_cont_tab(j).denominator := l_max_load_qty;
5347 --dbms_output.put_line('Inserted Container '||j||' with numerator '||g_empty_cont_tab(j).numerator||' and denominator '||g_empty_cont_tab(j).denominator);
5348 ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
5349 g_empty_cont_tab(j).empty := l_mtl_max_load - (l_split_qty * l_weight_per_pc);
5350 --dbms_output.put_line('Inserted Container '||j||' with empty weight '||g_empty_cont_tab(j).empty||' into empty cont');
5351 ELSE
5352 g_empty_cont_tab(j).empty := l_mtl_max_vol - ROUND(l_split_qty * l_volume_per_pc,LIMITED_PRECISION);
5353 --dbms_output.put_line('Inserted Container '||j||' with empty volume '||g_empty_cont_tab(j).empty||' into empty cont');
5354 END IF;
5355 END IF;
5356
5357 -- Calculate distributed wt/vol for the new dd
5358 l_tot_gross_wt := ROUND((l_split_qty * p_line_cont_rec.gross_weight)/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
5359 l_tot_net_wt := ROUND((l_split_qty * p_line_cont_rec.net_weight)/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
5360 l_tot_vol := ROUND((l_split_qty * p_line_cont_rec.volume)/p_line_cont_rec.shp_qty,LIMITED_PRECISION);
5361 --dbms_output.put_line('l_tot_vol '||l_tot_vol||' l_dd_vol_left '||l_dd_vol_left);
5362
5363 -- Assign the split dd/existing dd
5367 FOR j in 1..l_dd_id_tab.count
5364 -- changed the call to populate the PL SQL table
5365
5366 IF l_dd_id_tab.count > 0 THEN
5368 LOOP
5369 IF l_count_container > 0 THEN
5370 l_count_container := l_count_container + 1;
5371 g_new_container_tab(g_num_cont_index).number_of_containers := l_count_container;
5372 g_new_cont_index := g_new_cont_index + 1;
5373 ELSE
5374 l_count_container := 1;
5375 g_num_cont_index := g_num_cont_index + 1;
5376 g_new_cont_index := g_new_cont_index + 1;
5377 g_new_container_tab(g_num_cont_index).container_item_id := p_line_cont_rec.preferred_container;
5378 g_new_container_tab(g_num_cont_index).organization_id := p_line_cont_rec.organization_id;
5379 g_new_container_tab(g_num_cont_index).mast_cont_item_id := p_line_cont_rec.master_cont_item_id;
5380 g_new_container_tab(g_num_cont_index).number_of_containers := l_count_container;
5381
5382 END IF;
5383
5384 g_assign_detail_index := g_assign_detail_index + 1;
5385 g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_dd_id_tab(j);
5386 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5387 g_assign_detail_tab(g_assign_detail_index).container_index := g_new_cont_index;
5388 g_assign_detail_tab(g_assign_detail_index).gross_weight := l_tot_gross_wt;
5389 g_assign_detail_tab(g_assign_detail_index).net_weight := l_tot_net_wt;
5390 g_assign_detail_tab(g_assign_detail_index).volume := l_tot_vol;
5391 -- J: W/V Changes
5392 g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5393 g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5394 g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5395 -- K LPN CONV. rv
5396 g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5397 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5398 -- K LPN CONV. rv
5399
5400 l_quantity_left := l_quantity_left - l_split_qty;
5401 l_dd_gross_wt_left := l_dd_gross_wt_left - l_tot_gross_wt;
5402 l_dd_net_wt_left := l_dd_net_wt_left - l_tot_net_wt;
5403 l_dd_vol_left := l_dd_vol_left - l_tot_vol;
5404
5405 END LOOP;
5406
5407 l_dd_id_tab.DELETE;
5408
5409 -- so that this table is not read later,
5410 -- we continue in the LOOP even if qty_left = 1, so in that case
5411 -- should not reach here
5412
5413 -- commented this and put it in the LOOP above
5414 -- l_quantity_left := GREATEST(l_quantity_left - (FLOOR(l_quantity_left/l_split_qty) *l_split_qty),0);
5415 ELSE
5416 g_assign_detail_index := g_assign_detail_index + 1;
5417 g_new_cont_index := g_new_cont_index + 1;
5418 g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := l_split_del_detail_id;
5419 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5420 g_assign_detail_tab(g_assign_detail_index).container_index := g_new_cont_index;
5421 g_assign_detail_tab(g_assign_detail_index).gross_weight := l_tot_gross_wt;
5422 g_assign_detail_tab(g_assign_detail_index).net_weight := l_tot_net_wt;
5423 g_assign_detail_tab(g_assign_detail_index).volume := l_tot_vol;
5424 -- J: W/V Changes
5425 g_assign_detail_tab(g_assign_detail_index).inventory_item_id := p_line_cont_rec.inventory_item_id;
5426 g_assign_detail_tab(g_assign_detail_index).weight_uom := p_line_cont_rec.weight_uom;
5427 g_assign_detail_tab(g_assign_detail_index).volume_uom := p_line_cont_rec.volume_uom;
5428 -- K LPN CONV. rv
5429 g_assign_detail_tab(g_assign_detail_index).organization_id := p_line_cont_rec.organization_id;
5430 g_assign_detail_tab(g_assign_detail_index).delivery_id := p_line_cont_rec.delivery_id;
5431 -- K LPN CONV. rv
5432 --dbms_output.put_line('Assigning '||g_assign_detail_tab(g_assign_detail_index).delivery_detail_id||' to Cont index '||g_assign_detail_tab(g_assign_detail_index).container_index);
5433
5434 l_quantity_left := l_quantity_left - l_split_qty;
5435
5436 END IF;
5437
5438
5439 -- If there is no more qty left, then adjust any wt/vol left on last dd
5440 IF (l_quantity_left <= 0) THEN
5441 --dbms_output.put_line('Assigning the left over Weight');
5442 g_assign_detail_tab(g_assign_detail_index).gross_weight := g_assign_detail_tab(g_assign_detail_index).gross_weight + l_dd_gross_wt_left;
5443 g_assign_detail_tab(g_assign_detail_index).net_weight := g_assign_detail_tab(g_assign_detail_index).net_weight + l_dd_net_wt_left;
5444 g_assign_detail_tab(g_assign_detail_index).volume := g_assign_detail_tab(g_assign_detail_index).volume + l_dd_vol_left;
5445 END IF;
5446 --dbms_output.put_line('l_quantity_left '||l_quantity_left);
5447
5448 END LOOP;
5449
5450 --dbms_output.put_line('End of Pack DD, Count is '||l_count_container||to_char(sysdate,'HH24:MI:SS'));
5451
5452 END IF;
5453 x_return_status := C_SUCCESS_STATUS;
5454 --
5455 IF l_debug_on THEN
5456 WSH_DEBUG_SV.pop(l_module_name);
5457 END IF;
5458 --
5459 RETURN;
5460
5461 EXCEPTION
5462 WHEN Others THEN
5463 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Pack_Delivery_Detail',l_module_name);
5464 x_return_status := C_UNEXP_ERROR_STATUS;
5465
5466 --
5470 END IF;
5467 IF l_debug_on THEN
5468 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
5469 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
5471 --
5472 END Pack_Delivery_Detail;
5473
5474 /*
5475 -----------------------------------------------------------------------------
5476 PROCEDURE : Validate_Dd_for_Pack
5477 PARAMETERS : p_group_id_tab_id - table of group ids for lines that need to
5478 be autopacked.
5479 p_del_detail_tab - table of delivery detail ids
5480 x_line_cont_tab - Delivery Details along with other info
5481 which passed validations
5482 x_error_cnt - Count of errors encountered during validation
5483 x_warn_cnt - Count of warnings encountered during validation
5484 x_fill_pc_warn_cnt - Count of Fill Percent Basis 'None' dds.
5485 x_fill_pc_warn_cnt - Count of details with Fill Percent Basis 'None'.
5486 x_release_warn_cnt - Count of 'Released to Warehouse' dds.
5487 DESCRIPTION : This procedure takes a list of delivery details and does all
5488 validations and returns a list of delivery details which passed
5489 validations
5490 ------------------------------------------------------------------------------
5491 */
5492
5493 PROCEDURE Validate_Dd_for_Pack(
5494 p_group_id_tab IN WSH_UTIL_CORE.id_tab_type,
5495 p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
5496 x_line_cont_tab OUT NOCOPY wsh_container_actions.line_cont_info_tab,
5497 x_error_cnt OUT NOCOPY NUMBER,
5498 x_warn_cnt OUT NOCOPY NUMBER,
5499 x_fill_pc_warn_cnt OUT NOCOPY NUMBER, -- bug 3562797 jckwok
5500 x_release_warn_cnt OUT NOCOPY NUMBER) IS
5501
5502 CURSOR Get_dd_Detail IS
5503 SELECT wdd.inventory_item_id inventory_item_id,
5504 NVL(wdd.shipped_quantity, NVL(wdd.picked_quantity, wdd.requested_quantity)) packed_quantity,
5505 NVL(wdd.shipped_quantity2, NVL(wdd.picked_quantity2, wdd.requested_quantity2)) packed_quantity2,
5506 NVL(wdd.picked_quantity, wdd.requested_quantity) picked_quantity,
5507 NVL(wdd.picked_quantity2, wdd.requested_quantity2) picked_quantity2,
5508 wdd.requested_quantity_uom requested_quantity_uom,
5509 nvl(wdd.wv_frozen_flag,'Y') wv_frozen_flag,
5510 wdd.gross_weight gross_weight,
5511 wdd.net_weight net_weight,
5512 wdd.weight_uom_code weight_uom_code,
5513 wdd.volume volume,
5514 wdd.volume_uom_code volume_uom_code,
5515 wdd.detail_container_item_id detail_container_item_id,
5516 wdd.master_container_item_id master_container_item_id,
5517 wdd.organization_id organization_id,
5518 wdd.source_line_id source_line_id,
5519 wdd.delivery_detail_id delivery_detail_id,
5520 wdd.released_status,
5521 wdd.source_code,
5522 wda.parent_delivery_detail_id parent_delivery_detail_id,
5523 wda.delivery_id delivery_id, -- added delivery id
5524 msi.indivisible_flag indivisible_flag
5525 FROM WSH_DELIVERY_DETAILS wdd,
5526 wsh_delivery_assignments_v wda,
5527 MTL_SYSTEM_ITEMS msi,
5528 WSH_TMP wt
5529 WHERE wdd.delivery_detail_id = wt.id
5530 AND wdd.delivery_detail_id = wda.delivery_detail_id
5531 AND wdd.container_flag = 'N'
5532 AND wdd.inventory_item_id = msi.inventory_item_id
5533 AND wdd.organization_id = msi.organization_id
5534 ORDER BY wdd.organization_id,wdd.inventory_item_id,source_line_id;
5535
5536 CURSOR Get_Cont_Item_Load (v_inv_item_id NUMBER, v_cont_item_id NUMBER, v_organization_id NUMBER) IS
5537 SELECT max_load_quantity
5538 FROM WSH_CONTAINER_ITEMS
5539 WHERE load_item_id = v_inv_item_id
5540 AND container_item_id = v_cont_item_id
5541 AND master_organization_id = v_organization_id;
5542
5543 line_cont_rec line_cont_info;
5544 line_cont_tab line_cont_info_tab;
5545
5546 l_dd_count NUMBER;
5547 l_group_id NUMBER;
5548 l_wcl_cont_item_id NUMBER;
5549 l_fill_pc_basis VARCHAR2(1);
5550 l_max_load_qty NUMBER;
5551 l_item_load_found BOOLEAN;
5552
5553 l_return_status VARCHAR2(1);
5554
5555 l_dd_gross_wt NUMBER;
5556 l_dd_net_wt NUMBER;
5557 l_dd_volume NUMBER;
5558 l_mtl_max_load NUMBER;
5559 l_mtl_max_vol NUMBER;
5560 l_mtl_wt_uom VARCHAR2(3);
5561 l_mtl_vol_uom VARCHAR2(3);
5562 l_tmp_num_cont NUMBER;
5563 l_discard_message VARCHAR2(2000);
5564 l_output_qty NUMBER;
5565 l_process_flag VARCHAR2(1);
5566 l_last_organization_id NUMBER;
5567 l_error_cnt NUMBER := 0;
5568
5569 warn_cnt NUMBER := 0;
5570 error_cnt NUMBER := 0;
5571 release_warn_cnt NUMBER := 0;
5572 fill_pc_warn_cnt NUMBER := 0; -- bug 3562797 jckwok
5573 --
5574 l_debug_on BOOLEAN;
5575 --
5576 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'VALIDATE_DD_FOR_PACK';
5577 --
5578
5579 -- HW OPMCONV - New variable to hold item info
5580 l_item_info WSH_DELIVERY_DETAILS_INV.mtl_system_items_rec;
5581 -- HW OPM BUG# 3011758
5582 -- HW OPMCONV - Removed opm variables
5583
5584 -- HW OPMCONV - Renamed variable from lot_indivisible to l_lot_divisible_flag
5585 l_lot_divisible_flag VARCHAR2(1);
5586
5587 -- HW OPMCONV - New variables to hold warnings and errors
5588 l_num_warnings NUMBER :=0;
5592
5589 l_num_errors NUMBER := 0;
5590 x_return_status VARCHAR2(5);
5591 BEGIN
5593 --dbms_output.put_line('---------------------------');
5594 --dbms_output.put_line('In Validate_Dd_for_Pack ...');
5595 --dbms_output.put_line('---------------------------');
5596
5597 -- 10. Delete and Bulk Insert into the wsh_tmp table
5598 --
5599 --
5600 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
5601 --
5602 IF l_debug_on IS NULL
5603 THEN
5604 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
5605 END IF;
5606 --
5607 IF l_debug_on THEN
5608 WSH_DEBUG_SV.push(l_module_name);
5609 END IF;
5610 --
5611 DELETE FROM wsh_tmp;
5612
5613 FORALL i IN 1..p_del_detail_tab.count
5614 INSERT INTO wsh_tmp (id) VALUES(p_del_detail_tab(i));
5615
5616 -- 20. Populate detail dd info into line_cont_tab PL/SQL table
5617 l_last_organization_id := NULL;
5618 l_dd_count := 0;
5619
5620 FOR rec in get_dd_detail
5621 LOOP
5622 --dbms_output.put_line('Processing dd '||rec.delivery_detail_id||' Org '||rec.organization_id);
5623
5624 -- 20.10 Delete Organization Specfic Cached Tables if organization_id changes
5625 IF ((l_last_organization_id IS NULL) OR (rec.organization_id <> l_last_organization_id)) THEN
5626 g_cache_cont_load_info_tab.DELETE;
5627 g_cont_msi_tab.DELETE;
5628
5629 l_last_organization_id := rec.organization_id;
5630 END IF;
5631
5632
5633 /* grouping API will return a number = negative delivery_id if the line is
5634 already assigned to a delivery. So, check for negative numbers and if number
5635 < 0, then convert it to a postive number = delivery_id.
5636 */
5637 l_group_id := ABS(p_group_id_tab(rec.delivery_detail_id));
5638 --dbms_output.put_line('l_group_id '||l_group_id);
5639
5640 -- 20.12 Populate line_cont_tab PL/SQL table now
5641 IF ((rec.packed_quantity <> 0) AND (rec.released_status NOT IN ('C','D'))) THEN
5642 line_cont_rec.group_id := l_group_id;
5643 line_cont_rec.delivery_detail_id := rec.delivery_detail_id;
5644 line_cont_rec.inventory_item_id := rec.inventory_item_id;
5645 line_cont_rec.shp_qty := rec.packed_quantity;
5646 line_cont_rec.shp_qty2 := rec.packed_quantity2;
5647 line_cont_rec.req_qty := rec.picked_quantity;
5648 line_cont_rec.req_qty2 := rec.picked_quantity2;
5649 line_cont_rec.req_qty_uom := rec.requested_quantity_uom;
5650 line_cont_rec.detail_cont_item_id := rec.detail_container_item_id;
5651 line_cont_rec.master_cont_item_id := rec.master_container_item_id;
5652 line_cont_rec.gross_weight := rec.gross_weight;
5653 line_cont_rec.net_weight := rec.net_weight;
5654 line_cont_rec.weight_uom := rec.weight_uom_code;
5655 line_cont_rec.volume := rec.volume;
5656 line_cont_rec.volume_uom := rec.volume_uom_code;
5657 line_cont_rec.organization_id := rec.organization_id;
5658 line_cont_rec.source_line_id := rec.source_line_id;
5659 line_cont_rec.indivisible_flag := rec.indivisible_flag;
5660 line_cont_rec.delivery_id := rec.delivery_id;
5661 ELSE
5662 goto next_detail;
5663 END IF;
5664
5665 -- 20.20 Check if the detail is already packed
5666 IF (rec.parent_delivery_detail_id IS NOT NULL) THEN
5667 --dbms_output.put_line('Warning: dd already packed');
5668 warn_cnt := warn_cnt + 1;
5669 goto next_detail;
5670 END IF;
5671
5672 -- 20.30 Ignore dds with status 'Released to Warehouse'
5673 IF (rec.released_status = 'S') THEN
5674 release_warn_cnt := release_warn_cnt + 1;
5675 goto next_detail;
5676 END IF;
5677
5678 --dbms_output.put_line('Before calc_fill_basis');
5679
5680 -- 20.40 Determine Fill PC Basis from shipping parameters and Process Flag
5681 Calc_Fill_Basis_and_Proc_Flag(
5682 p_organization_id => rec.organization_id,
5683 x_return_status => l_return_status,
5684 x_fill_basis => l_fill_pc_basis,
5685 x_process_flag => l_process_flag);
5686
5687
5688 IF (l_return_status <> C_SUCCESS_STATUS) THEN
5689 error_cnt := error_cnt + 1;
5690 goto next_detail;
5691 END IF;
5692 --
5693 -- bug 3562797 jckwok - Ignore dds with 'Shipping Parameter' percent fill basis as None.
5694 -- Increment fill_pc_warn_cnt so that the caller know how many had fill basis of None.
5695 --
5696 IF (l_fill_pc_basis = 'N') THEN
5697 fill_pc_warn_cnt := fill_pc_warn_cnt + 1;
5698 goto next_detail;
5699 END IF;
5700 -- end bug
5701
5702 line_cont_rec.fill_pc_basis := l_fill_pc_basis;
5703 -- HW OPMCONV - No need to populate this value
5704 -- line_cont_rec.process_flag := l_process_flag;
5705
5706 -- HW OPM BUG#:3011758 Retrieve OPM item information
5707 -- HW OPMCONV - 1)Change the call from OPM API to get item info
5708 -- to a new WSH API
5709 -- - 2) Remove checking for process
5710
5711 WSH_DELIVERY_DETAILS_INV.Get_item_information
5712 (
5713 p_organization_id => rec.organization_id
5714 , p_inventory_item_id => rec.inventory_item_id
5715 , x_mtl_system_items_rec => l_item_info
5716 , x_return_status => l_return_status
5717 );
5718
5719
5720 IF l_debug_on THEN
5724 wsh_util_core.api_post_call
5721 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5722 END IF;
5723
5725 (
5726 p_return_status => l_return_status,
5727 x_num_warnings => l_num_warnings,
5728 x_num_errors => l_num_errors
5729 );
5730
5731 IF ( l_item_info.lot_divisible_flag = 'N' AND
5732 l_item_info.lot_control_code= 2) THEN
5733 line_cont_rec.lot_divisible_flag := 'N';
5734 ELSE
5735 line_cont_rec.lot_divisible_flag := 'Y';
5736 END IF;
5737
5738
5739 -- HW OPMCONV - No need to check for process_flag. Removed OR condition
5740 IF (line_cont_rec.fill_pc_basis IS NULL) THEN
5741 --dbms_output.put_line('Skipping dd');
5742
5743 goto next_detail;
5744 END IF;
5745
5746 -- 20.50 Determine Preferred Container
5747 line_cont_rec.preferred_container := nvl(rec.detail_container_item_id,rec.master_container_item_id);
5748 line_cont_rec.max_load_qty := NULL;
5749
5750 --dbms_output.put_line('Before calc_pref_cont');
5751
5752 IF (line_cont_rec.preferred_container IS NULL) THEN
5753
5754 Calc_Pref_Container(
5755 p_organization_id => rec.organization_id,
5756 p_inventory_item_id => rec.inventory_item_id,
5757 p_fill_pc_basis => line_cont_rec.fill_pc_basis,
5758 x_return_status => l_return_status,
5759 x_error_cnt => l_error_cnt,
5760 x_cont_item_id => l_wcl_cont_item_id,
5761 x_max_load_qty => l_max_load_qty);
5762
5763 IF l_debug_on THEN
5764 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5765 END IF;
5766
5767 IF (l_return_status = C_ERROR_STATUS) THEN
5768 error_cnt := error_cnt + l_error_cnt;
5769 END IF;
5770
5771 line_cont_rec.preferred_container := l_wcl_cont_item_id;
5772 line_cont_rec.max_load_qty := l_max_load_qty;
5773 END IF;
5774
5775 -- bug 3440811
5776 validate_container(
5777 p_organization_id => rec.organization_id,
5778 p_cont_item_id => line_cont_rec.preferred_container,
5779 x_return_status => l_return_status);
5780
5781 IF (l_return_status IN (C_UNEXP_ERROR_STATUS,C_ERROR_STATUS)) THEN
5782 line_cont_rec.preferred_container := null;
5783 line_cont_rec.max_load_qty := null;
5784 l_error_cnt := l_error_cnt + 1;
5785 error_cnt := error_cnt + l_error_cnt;
5786 END IF;
5787 -- bug 3440811
5788
5789
5790 IF (line_cont_rec.preferred_container is NULL) THEN
5791 --dbms_output.put_line('Skipping dd');
5792 goto next_detail;
5793 END IF;
5794
5795
5796 -- 20.60 Calculate Max Load/Converted wt/Converted Vol depending on fill basis
5797 line_cont_rec.converted_wt := NULL;
5798 line_cont_rec.converted_vol := NULL;
5799
5800 --dbms_output.put_line('FILL BASIS'||line_cont_rec.fill_pc_basis||line_cont_rec.max_load_qty);
5801 IF (line_cont_rec.fill_pc_basis = 'Q') THEN
5802 IF (line_cont_rec.max_load_qty IS NULL) THEN
5803 OPEN Get_Cont_Item_Load (rec.inventory_item_id,line_cont_rec.preferred_container, rec.organization_id);
5804
5805 FETCH Get_Cont_Item_Load
5806 INTO l_max_load_qty;
5807
5808 l_item_load_found := FALSE;
5809 IF Get_Cont_Item_Load%NOTFOUND THEN
5810 l_item_load_found := TRUE;
5811 END IF;
5812 CLOSE Get_Cont_Item_Load;
5813
5814 IF (l_item_load_found) THEN
5815 --dbms_output.put_line('Could not find max load qty for Item '||rec.inventory_item_id||' Cont '||line_cont_rec.preferred_container||' Org '||rec.organization_id);
5816
5817 -- Calculate max load qty depending on Weight/Volume
5818 IF (rec.net_weight IS NULL OR rec.volume IS NULL) THEN
5819 --
5820 IF rec.wv_frozen_flag = 'N' THEN
5821
5822 IF l_debug_on THEN
5823 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DETAIL_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
5824 END IF;
5825 --
5826 WSH_WV_UTILS.Detail_Weight_Volume(
5827 p_delivery_detail_id => rec.delivery_detail_id,
5828 -- J: W/V Changes
5829 p_update_flag => 'Y',
5830 p_post_process_flag => 'Y',
5831 p_calc_wv_if_frozen => 'N',
5832 x_net_weight => l_dd_net_wt,
5833 x_volume => l_dd_volume ,
5834 x_return_status => l_return_status);
5835 IF l_debug_on THEN
5836 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5837 END IF;
5838
5839 IF (l_return_status <> C_SUCCESS_STATUS) THEN
5840 --dbms_output.put_line('WSH_WV_UTILS.Detail_Weight_Volume did not return success');
5841 FND_MESSAGE.SET_NAME('WSH','WSH_DET_WT_VOL_FAILED');
5842 FND_MESSAGE.SET_TOKEN('DETAIL_ID',rec.delivery_detail_id);
5843 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
5844 error_cnt := error_cnt + 1;
5845 --dbms_output.put_line('Skipping this dd');
5846 goto next_detail;
5847 END IF;
5848
5849 rec.gross_weight := NVL(rec.gross_weight,l_dd_net_wt);
5850 rec.net_weight := NVL(rec.net_weight,l_dd_net_wt);
5854
5851 rec.volume := NVL(rec.volume,l_dd_volume);
5852
5853 END IF;
5855 IF ((NVL(rec.net_weight,0) = 0) OR
5856 (NVL(rec.volume,0) = 0)) THEN
5857 --dbms_output.put_line('Weight or Volume is NULL or 0');
5858 FND_MESSAGE.SET_NAME('WSH', 'WSH_NULL_WEIGHT_VOLUME');
5859 FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL', rec.delivery_detail_id);
5860 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5861 error_cnt := error_cnt + 1;
5862 --dbms_output.put_line('Skipping this dd');
5863 goto next_detail;
5864 END IF;
5865 END IF;
5866
5867 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 4');
5868 Get_Cont_Load_Vol_info(
5869 p_container_item_id => line_cont_rec.preferred_container,
5870 p_organization_id => line_cont_rec.organization_id,
5871 p_w_v_both => 'B',
5872 x_max_load => l_mtl_max_load,
5873 x_max_vol => l_mtl_max_vol,
5874 x_wt_uom => l_mtl_wt_uom,
5875 x_vol_uom => l_mtl_vol_uom,
5876 x_return_status => l_return_status,
5877 x_error_cnt => l_error_cnt);
5878
5879 IF l_debug_on THEN
5880 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5881 END IF;
5882 IF (l_return_status IN (C_ERROR_STATUS,C_UNEXP_ERROR_STATUS)
5883 ) THEN
5884 error_cnt := error_cnt + l_error_cnt;
5885 END IF;
5886
5887 -- Bug 2786021
5888 IF (nvl(l_mtl_max_load,0) = 0) OR
5889 (nvl(l_mtl_max_vol,0) = 0) THEN
5890 IF l_debug_on THEN
5891 WSH_DEBUG_SV.log(l_module_name,'fill pc is Q,but use Wt or Vol');
5892 WSH_DEBUG_SV.log(l_module_name,'Wt-'||l_mtl_max_load);
5893 WSH_DEBUG_SV.log(l_module_name,'Vol-'||l_mtl_max_vol);
5894 END IF;
5895 FND_MESSAGE.SET_NAME('WSH', 'WSH_CONT_MAX_WT_ERROR');
5896 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5897 error_cnt := error_cnt + l_error_cnt;
5898 goto next_detail;
5899 END IF;
5900 -- Bug 2786021
5901
5902 IF ((NVL(l_mtl_max_load,0) <= 0) OR (NVL(l_mtl_max_vol,0) <= 0)) THEN
5903 --dbms_output.put_line('Skipping this dd');
5904 goto next_detail;
5905 END IF;
5906
5907 IF (l_mtl_wt_uom <> rec.weight_uom_code) THEN
5908 --
5909 IF l_debug_on THEN
5910 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
5911 END IF;
5912 --
5913 l_dd_gross_wt := WSH_WV_UTILS.Convert_Uom (
5914 from_uom => rec.weight_uom_code,
5915 to_uom => l_mtl_wt_uom,
5916 quantity => rec.gross_weight,
5917 item_id => rec.inventory_item_id);
5918 ELSE
5919 l_dd_gross_wt := rec.gross_weight;
5920 END IF;
5921
5922 IF (l_mtl_vol_uom <> rec.volume_uom_code) THEN
5923 --
5924 IF l_debug_on THEN
5925 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
5926 END IF;
5927 --
5928 l_dd_volume := WSH_WV_UTILS.Convert_Uom (
5929 from_uom => rec.volume_uom_code,
5930 to_uom => l_mtl_vol_uom,
5931 quantity => rec.volume,
5932 item_id => rec.inventory_item_id);
5933 ELSE
5934 l_dd_volume:= rec.volume;
5935 END IF;
5936
5937 IF ((l_dd_gross_wt/l_mtl_max_load) >= (l_dd_volume/l_mtl_max_vol)) THEN
5938 l_max_load_qty := (l_dd_gross_wt/l_mtl_max_load);
5939 ELSE
5940 l_max_load_qty := (l_dd_volume/l_mtl_max_vol);
5941 END IF;
5942 --dbms_output.put_line('l_dd_gross_wt '||l_dd_gross_wt||' l_dd_volume '||l_dd_volume ||' l_mtl_max_load '||l_mtl_max_load||' l_mtl_max_vol '||l_mtl_max_vol || ' l_max_load_qty '||l_max_load_qty);
5943
5944 --
5945 IF l_debug_on THEN
5946 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
5947 END IF;
5948 --
5949 WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
5950 p_item_id => rec.inventory_item_id,
5951 p_organization_id => rec.organization_id,
5952 p_input_quantity => ROUND((rec.packed_quantity/l_max_load_qty),LIMITED_PRECISION),
5953 p_uom_code => rec.requested_quantity_uom,
5954 x_output_quantity => l_output_qty,
5955 x_return_status => l_return_status);
5956
5957 IF l_debug_on THEN
5958 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
5959 END IF;
5960 IF l_return_status <> C_SUCCESS_STATUS THEN
5961 --dbms_output.put_line('WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity returned '||l_return_status);
5962 l_discard_message := FND_MESSAGE.GET;
5966 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
5963 l_tmp_num_cont := FLOOR(rec.packed_quantity/l_max_load_qty);
5964
5965 IF (l_tmp_num_cont = 0) THEN
5967 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5968 error_cnt := error_cnt + 1;
5969 goto next_detail;
5970 ELSE
5971 --l_max_load_qty := (rec.packed_quantity/l_tmp_num_cont);
5972 l_max_load_qty := l_tmp_num_cont;
5973 END IF;
5974 ELSE
5975 l_max_load_qty := ROUND((rec.packed_quantity/l_max_load_qty),LIMITED_PRECISION);
5976 END IF;
5977 END IF; -- l_item_load_found
5978 line_cont_rec.max_load_qty := l_max_load_qty;
5979
5980 IF (NVL(line_cont_rec.max_load_qty,0) <= 0) THEN
5981 --dbms_output.put_line('Max Load Qty is NULL or <= 0. Skipping this dd');
5982 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
5983 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
5984 error_cnt := error_cnt + 1;
5985 goto next_detail;
5986 END IF;
5987
5988 END IF; -- line_cont_rec.max_load_qty IS NULL
5989 --dbms_output.put_line('line_cont_rec.max_load_qty '||line_cont_rec.max_load_qty);
5990
5991 ELSIF (line_cont_rec.fill_pc_basis in ('W','V')) THEN
5992 -- Calculate max load qty depending on Weight/Volume
5993 IF ((rec.gross_weight IS NULL AND line_cont_rec.fill_pc_basis = 'W') OR
5994 (rec.volume IS NULL) AND (line_cont_rec.fill_pc_basis = 'V')) THEN
5995 --
5996 IF rec.wv_frozen_flag = 'N' THEN
5997
5998 IF l_debug_on THEN
5999 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DETAIL_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
6000 END IF;
6001 --
6002 WSH_WV_UTILS.Detail_Weight_Volume(
6003 p_delivery_detail_id => rec.delivery_detail_id,
6004 -- J: W/V Changes
6005 p_update_flag => 'Y',
6006 p_post_process_flag => 'Y',
6007 p_calc_wv_if_frozen => 'N',
6008 x_net_weight => l_dd_net_wt,
6009 x_volume => l_dd_volume ,
6010 x_return_status => l_return_status);
6011
6012 IF l_debug_on THEN
6013 WSH_DEBUG_SV.log(l_module_name,'return status -,wt,vol',l_return_status||l_dd_net_wt||','||l_dd_volume);
6014 END IF;
6015
6016 IF (l_return_status <> C_SUCCESS_STATUS) THEN
6017 --dbms_output.put_line('WSH_WV_UTILS.Detail_Weight_Volume did not return success');
6018 FND_MESSAGE.SET_NAME('WSH','WSH_DET_WT_VOL_FAILED');
6019 FND_MESSAGE.SET_TOKEN('DETAIL_ID',rec.delivery_detail_id);
6020 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6021 error_cnt := error_cnt + 1;
6022 --dbms_output.put_line('Skipping this dd');
6023 goto next_detail;
6024 END IF;
6025
6026 IF (line_cont_rec.fill_pc_basis = 'W') THEN
6027 rec.gross_weight := NVL(rec.gross_weight,l_dd_net_wt);
6028 rec.net_weight := NVL(rec.net_weight,l_dd_net_wt);
6029 ELSE
6030 rec.volume := NVL(rec.volume,l_dd_volume);
6031 END IF;
6032
6033 END IF;
6034
6035 IF (line_cont_rec.fill_pc_basis = 'W') THEN
6036
6037 IF (NVL(rec.gross_weight,0) = 0) THEN
6038 --dbms_output.put_line('Weight is NULL or 0');
6039 FND_MESSAGE.SET_NAME('WSH', 'WSH_NULL_WEIGHT_VOLUME');
6040 FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL', rec.delivery_detail_id);
6041 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6042 error_cnt := error_cnt + 1;
6043 --dbms_output.put_line('Skipping this dd');
6044 goto next_detail;
6045 END IF;
6046 ELSE
6047
6048 IF (NVL(rec.volume,0) = 0) THEN
6049 --dbms_output.put_line('Volume is NULL or 0');
6050 FND_MESSAGE.SET_NAME('WSH', 'WSH_NULL_WEIGHT_VOLUME');
6051 FND_MESSAGE.SET_TOKEN('DELIVERY_DETAIL', rec.delivery_detail_id);
6052 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6053 error_cnt := error_cnt + 1;
6054 --dbms_output.put_line('Skipping this dd');
6055 goto next_detail;
6056 END IF;
6057 END IF;
6058
6059 END IF;
6060
6061 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 3');
6062 Get_Cont_Load_Vol_info(
6063 p_container_item_id => line_cont_rec.preferred_container,
6064 p_organization_id => line_cont_rec.organization_id,
6065 p_w_v_both => line_cont_rec.fill_pc_basis,
6066 x_max_load => l_mtl_max_load,
6067 x_max_vol => l_mtl_max_vol,
6068 x_wt_uom => l_mtl_wt_uom,
6069 x_vol_uom => l_mtl_vol_uom,
6070 x_return_status => l_return_status,
6071 x_error_cnt => l_error_cnt);
6072
6073 IF l_debug_on THEN
6074 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6075 END IF;
6076 IF (l_return_status = C_ERROR_STATUS) THEN
6077 error_cnt := error_cnt + l_error_cnt;
6078 END IF;
6079
6080 IF (line_cont_rec.fill_pc_basis = 'W') THEN
6081 IF (NVL(l_mtl_max_load,0) <= 0) THEN
6085
6082 --dbms_output.put_line('Skipping this dd');
6083 goto next_detail;
6084 END IF;
6086 line_cont_rec.cont_wt := l_mtl_max_load;
6087
6088 IF (l_mtl_wt_uom <> rec.weight_uom_code) THEN
6089 --
6090 IF l_debug_on THEN
6091 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
6092 END IF;
6093 --
6094 l_dd_gross_wt := WSH_WV_UTILS.Convert_Uom (
6095 from_uom => rec.weight_uom_code,
6096 to_uom => l_mtl_wt_uom,
6097 quantity => rec.gross_weight,
6098 item_id => rec.inventory_item_id);
6099 ELSE
6100 l_dd_gross_wt := rec.gross_weight;
6101 END IF;
6102 line_cont_rec.converted_wt := l_dd_gross_wt;
6103 --dbms_output.put_line('line_cont_rec.converted_wt '||line_cont_rec.converted_wt);
6104 ELSE
6105 IF (NVL(l_mtl_max_vol,0) <= 0) THEN
6106 --dbms_output.put_line('Skipping this dd');
6107 goto next_detail;
6108 END IF;
6109
6110 line_cont_rec.cont_vol := l_mtl_max_vol;
6111
6112 IF (l_mtl_vol_uom <> rec.volume_uom_code) THEN
6113 --
6114 IF l_debug_on THEN
6115 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
6116 END IF;
6117 --
6118 l_dd_volume := WSH_WV_UTILS.Convert_Uom (
6119 from_uom => rec.volume_uom_code,
6120 to_uom => l_mtl_vol_uom,
6121 quantity => rec.volume,
6122 item_id => rec.inventory_item_id);
6123 ELSE
6124 l_dd_volume := rec.volume;
6125 END IF;
6126 line_cont_rec.converted_vol := l_dd_volume;
6127 --dbms_output.put_line('line_cont_rec.converted_vol '||line_cont_rec.converted_vol);
6128 END IF;
6129
6130 -- Check if the container can hold atleast 1 piece if the item is indivisible
6131 IF (line_cont_rec.indivisible_flag = 'Y' AND
6132 ((line_cont_rec.fill_pc_basis = 'W' AND ((line_cont_rec.converted_wt/line_cont_rec.shp_qty) > l_mtl_max_load)) OR
6133 (line_cont_rec.fill_pc_basis = 'V' AND ((line_cont_rec.converted_vol/line_cont_rec.shp_qty) > l_mtl_max_vol)))) THEN
6134 --dbms_output.put_line('Indivisible flag is Y and Preferred Cont cannot hold atleast 1 piece');
6135 -- Bug#: 2503937 - New Error Message
6136 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_VOL_ERROR');
6137 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6138 error_cnt := error_cnt + 1;
6139 --dbms_output.put_line('Skipping this dd');
6140 goto next_detail;
6141 END IF;
6142
6143 END IF;
6144
6145
6146
6147 -- HW OPM BUG#: 3011758 For debugging purposes.
6148 -- HW OPMCONV - 1) Removed all GMI print msgs
6149
6150 -- HW OPM BUG#:3011758 Check if OPM lot indivisible and check percent fill basis
6151 -- If 'Q', compare the delivery line qty shipped against the max_load
6152 -- If 'W, compare the delivery line net weight against the container's net weight
6153 -- If 'V', compare the delivery line volume against the container's volume
6154 -- If any of the above exceeds the max allowed, an error is raised
6155 -- because it will not fit into the container without splitting
6156 -- OPM item that are lot indivisible should not split
6157
6158 -- HW OPMCONV - 1) Renamed lot_divisible_flag
6159 -- - 2) Changed checking value of visible flag from 1 to 'N'
6160 IF ( line_cont_rec.lot_divisible_flag = 'N' AND
6161 ((line_cont_rec.fill_pc_basis = 'Q' AND (line_cont_rec.shp_qty > line_cont_rec.max_load_qty ))
6162 OR (line_cont_rec.fill_pc_basis = 'W' AND (l_dd_gross_wt > line_cont_rec.cont_wt) )
6163 OR (line_cont_rec.fill_pc_basis = 'V' AND (l_dd_volume> line_cont_rec.cont_vol) ) ) ) THEN
6164
6165 FND_MESSAGE.SET_NAME('WSH','WSH_OPM_IND_SPLIT_PACK');
6166 FND_MESSAGE.SET_TOKEN('DETAIL_ID',rec.delivery_detail_id);
6167 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
6168 WSH_UTIL_CORE.Add_Message(l_return_status);
6169 error_cnt := error_cnt + 1;
6170 goto next_detail;
6171 END IF;-- end of 3011758
6172
6173 -- 20.70 Do Credit Check
6174 --dbms_output.put_line('Doing Credit Check');
6175 --
6176 IF l_debug_on THEN
6177 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_CREDIT_HOLDS',WSH_DEBUG_SV.C_PROC_LEVEL);
6178 END IF;
6179 --
6180 WSH_DETAILS_VALIDATIONS.Check_Credit_Holds (
6181 p_detail_id => rec.delivery_detail_id,
6182 p_activity_type => 'PACK',
6183 p_source_line_id => NULL,
6184 p_source_header_id => NULL,
6185 p_source_code => rec.source_code,
6186 p_init_flag => 'Y',
6187 x_return_status => l_return_status);
6188
6189 IF l_debug_on THEN
6190 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6191 END IF;
6192 -- Bug 2847515
6193 -- Error was being treated as warning
6197 ELSIF l_return_status = C_WARNING_STATUS THEN
6194 IF l_return_status <> C_SUCCESS_STATUS THEN
6195 IF l_return_status IN (C_ERROR_STATUS,C_UNEXP_ERROR_STATUS) THEN
6196 error_cnt := error_cnt + 1;
6198 --dbms_output.put_line('Credit Check Failed. Warning: Skipping dd');
6199 warn_cnt := warn_cnt + 1;
6200 END IF;
6201 goto next_detail;
6202 END IF;
6203
6204 l_dd_count := l_dd_count + 1;
6205 line_cont_tab(l_dd_count) := line_cont_rec;
6206
6207 <<next_detail>>
6208 null;
6209
6210 END LOOP;
6211
6212 DELETE FROM wsh_tmp;
6213
6214 x_error_cnt := error_cnt;
6215 x_warn_cnt := warn_cnt;
6216 x_fill_pc_warn_cnt := fill_pc_warn_cnt; -- bug 3562797 jckwok
6217 x_release_warn_cnt := release_warn_cnt;
6218 x_line_cont_tab := line_cont_tab;
6219
6220 --dbms_output.put_line('Exiting Validate_Dd_for_Pack');
6221
6222 --
6223 IF l_debug_on THEN
6224 WSH_DEBUG_SV.log(l_module_name,'p_del_detail_tab count->'||p_del_detail_tab.count||' x_line_cont_tab count->'||x_line_cont_tab.count);
6225 WSH_DEBUG_SV.log(l_module_name,'Error Count '|| x_error_cnt||' Warning Count '|| x_warn_cnt||' Release Warn Count '|| x_release_warn_cnt);
6226 WSH_DEBUG_SV.pop(l_module_name);
6227 END IF;
6228 --
6229 RETURN;
6230
6231 --
6232 IF l_debug_on THEN
6233 WSH_DEBUG_SV.pop(l_module_name);
6234 END IF;
6235 --
6236 EXCEPTION
6237 WHEN Others THEN
6238 IF (Get_dd_Detail%ISOPEN) THEN
6239 CLOSE Get_dd_Detail;
6240 END IF;
6241 IF (Get_Cont_Item_Load%ISOPEN) THEN
6242 CLOSE Get_Cont_Item_Load;
6243 END IF;
6244 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Validate_Dd_For_Pack',l_module_name);
6245 --
6246 IF l_debug_on THEN
6247 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
6248 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
6249 END IF;
6250 --
6251 raise;
6252
6253 --
6254 IF l_debug_on THEN
6255 WSH_DEBUG_SV.pop(l_module_name);
6256 END IF;
6257 --
6258 END Validate_Dd_For_Pack;
6259
6260
6261 /*
6262 -----------------------------------------------------------------------------
6263 PROCEDURE : Auto_Pack_Lines
6264 PARAMETERS : p_group_id_tab_id - table of group ids for lines that need to
6265 be autopacked.
6266 p_del_detail_tab - table of delivery detail ids
6267 p_pack_cont_flag - 'Y' or 'N' to determine whether to try and
6268 autopack the detail containers into master containers.
6269 x_cont_instance_id - table of container instance ids that were
6270 created during the autopacking.
6271 x_pack_status - indicates whether containers overpacked or not
6272 x_return_status - return status of API.
6273 DESCRIPTION : This procedure takes the number of lines and groups them by
6274 common grouping attributes - similar to grouping attributes of
6275 delivery. If a group id table is specified it uses the
6276 group ids in the table to decided which lines can be grouped
6277 into the same container. If a group id table is not specified,
6278 it creates the group id table before autopacking. It creates
6279 the required number and type of containers per line and keeps
6280 track of all partially filled containers in the empty
6281 containers table. Before creating new container instances, it
6282 searches for available space using the empty container table
6283 and after filling up a container, it creates a new one if
6284 there are no empty containers of the same type.
6285 ------------------------------------------------------------------------------
6286 */
6287
6288 PROCEDURE Auto_Pack_Lines (
6289 p_group_id_tab IN WSH_UTIL_CORE.id_tab_type,
6290 p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
6291 p_pack_cont_flag IN VARCHAR2,
6292 x_cont_instance_tab IN OUT NOCOPY WSH_UTIL_CORE.id_tab_type,
6293 x_return_status OUT NOCOPY VARCHAR2) IS
6294
6295 CURSOR c_get_attributes(v_delivery_detail_id IN NUMBER) IS
6296 SELECT customer_id,ship_to_location_id,
6297 intmed_ship_to_location_id,
6298 fob_code,freight_terms_code,ship_method_code,
6299 mode_of_transport, carrier_id, service_level,
6300 deliver_to_location_id,
6301 NVL(line_direction,'O') line_direction, -- J-IB-NPARIKH
6302 shipping_control, -- J-IB-NPARIKH
6303 NVL(ignore_for_planning,'N') ignore_for_planning
6304 FROM wsh_delivery_details
6305 WHERE delivery_detail_id = v_delivery_detail_id;
6306
6307 -- OTM R12 : assign delivery detail
6308 CURSOR c_get_tare_weight(v_detail_id NUMBER) IS
6309 SELECT nvl(unit_weight, 0)
6310 FROM wsh_delivery_details
6311 WHERE delivery_detail_id = v_detail_id;
6312
6313 CURSOR c_get_plan_and_tms_flag(v_delivery_id NUMBER) IS
6314 SELECT nvl(ignore_for_planning, 'N'),
6315 nvl(tms_interface_flag, WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT)
6316 FROM wsh_new_deliveries
6317 WHERE delivery_id = v_delivery_id;
6318
6319 TYPE Boolean_Tab_Type IS TABLE OF BOOLEAN INDEX BY BINARY_INTEGER;
6320
6321 -- OTM R12 : assign delivery detail
6322
6323 TYPE tab_varchar IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
6324
6325 l_tab_cust_id wsh_util_core.id_tab_type;
6326 l_tab_ship_location_id wsh_util_core.id_tab_type;
6330 l_tab_fob_code tab_varchar;
6327 l_tab_intmed_location_id wsh_util_core.id_tab_type;
6328 l_tab_deliver_location_id wsh_util_core.id_tab_type;
6329 l_tab_carrier_id wsh_util_core.id_tab_type;
6331 l_tab_freight_terms_code tab_varchar;
6332 l_tab_ship_method_code tab_varchar;
6333 l_tab_mode_of_transport tab_varchar;
6334 l_tab_service_level tab_varchar;
6335 l_tab_line_direction tab_varchar;
6336 l_tab_shipping_control tab_varchar;
6337 l_tab_ignore_for_planning tab_varchar;
6338
6339 line_cont_tab line_cont_info_tab;
6340
6341 l_group_id_temp_tab WSH_UTIL_CORE.id_tab_type;
6342 l_group_id_tab WSH_UTIL_CORE.id_tab_type;
6343 l_del_row_tab WSH_UTIL_CORE.id_tab_type;
6344 l_mast_cont_tab WSH_UTIL_CORE.id_tab_type;
6345 l_tmp_detail_tab WSH_UTIL_CORE.id_tab_type;
6346 l_detail_cont_rec empty_cont_info;
6347 l_detail_cont_tab empty_cont_info_tab;
6348
6349 l_return_status VARCHAR2(1);
6350 l_cont_instance_id NUMBER;
6351 l_cont_name VARCHAR2(30);
6352 l_row_id VARCHAR2(30);
6353 l_pack_status VARCHAR2(30);
6354
6355 l_net_weight NUMBER;
6356 l_cont_fill_pc NUMBER;
6357 l_err_cont_name VARCHAR2(30);
6358 l_last_organization_id NUMBER;
6359
6360 i NUMBER;
6361 j NUMBER;
6362 cnt NUMBER;
6363 l_cont_instance_cnt NUMBER;
6364
6365 warn_cnt NUMBER := 0;
6366 error_cnt NUMBER := 0;
6367 succ_cnt NUMBER := 0;
6368 cont_warn NUMBER := 0;
6369 l_release_warn_count NUMBER := 0;
6370 l_fill_pc_warn_count NUMBER := 0; -- bug 3562797 jckwok
6371 l_error_cnt NUMBER := 0;
6372
6373 l_new_contid_count NUMBER := 0;
6374 --l_cont_tab wsh_container_actions.cont_inst_tab;
6375 l_cont_tab WSH_UTIL_CORE.id_tab_type;
6376
6377 TYPE NumList IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
6378 TYPE CharList IS TABLE OF VARCHAR2(3) INDEX BY BINARY_INTEGER;
6379 l_GrossWtlist NumList;
6380 l_NetWtlist NumList;
6381 l_Vollist NumList;
6382 l_ddlist NumList;
6383 l_dellist NumList; -- for delivery id
6384 l_contlist NumList; -- containers for delivery detail id
6385 l_contlist1 NumList; -- containers and delivery id
6386 l_dellist1 NumList; -- containers and delivery id
6387 m NUMBER;
6388 l_del_tab WSH_UTIL_CORE.id_tab_type;
6389 l_exists_flag VARCHAR2(1);
6390 l_duplicate_flag VARCHAR2(1); -- for checking record
6391
6392 -- J: W/V Changes
6393 l_prev_del_id NUMBER;
6394 l_prev_dd_id NUMBER;
6395 l_prev_cont_id NUMBER;
6396 l_unit_weight NUMBER;
6397 l_unit_volume NUMBER;
6398 l_weight_uom_code VARCHAR2(3);
6399 l_volume_uom_code VARCHAR2(3);
6400 l_cont_Wtlist NumList;
6401 l_cont_Vollist NumList;
6402 l_WtUOMlist CharList;
6403 l_VolUOMlist CharList;
6404 l_InvItemlist NumList;
6405 l_cont_InvItemlist NumList;
6406 l_cont_WtUOMlist CharList;
6407 l_cont_VolUOMlist CharList;
6408 l_tot_dd_gross_wt NUMBER;
6409 l_tot_dd_net_wt NUMBER;
6410 l_tot_dd_vol NUMBER;
6411 /*
6412 l_tot_cont_gross_wt NUMBER;
6413 l_tot_cont_vol NUMBER;
6414 */
6415 l_tot_del_vol NUMBER;
6416 TYPE del_wv_adjust_info IS RECORD (
6417 dd_id NUMBER,
6418 gross_wt NUMBER,
6419 net_wt NUMBER,
6420 vol NUMBER);
6421 TYPE del_wv_adjust_tab IS TABLE OF del_wv_adjust_info INDEX BY BINARY_INTEGER;
6422 l_tmp_dd1list del_wv_adjust_tab;
6423 l_tmp_dd2list del_wv_adjust_tab;
6424 del_index NUMBER;
6425 i1 NUMBER := 0;
6426 j1 NUMBER := 0;
6427 k1 NUMBER := 0;
6428 l_prev_wt_uom VARCHAR2(3);
6429 l_prev_vol_uom VARCHAR2(3);
6430 l_item_changed BOOLEAN;
6431 l_cont_item_changed BOOLEAN;
6432 l_prev_item NUMBER;
6433
6434 l_attr_tab wsh_delivery_autocreate.grp_attr_tab_type;
6435 l_group_tab wsh_delivery_autocreate.grp_attr_tab_type;
6436 l_action_rec wsh_delivery_autocreate.action_rec_type;
6437 l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
6438 l_matched_entities wsh_util_core.id_tab_type;
6439 l_out_rec wsh_delivery_autocreate.out_rec_type;
6440
6441 mark_reprice_error EXCEPTION;
6442
6443 -- OTM R12 : assign delivery detail
6444 l_gc3_is_installed VARCHAR2(1);
6445 l_is_delivery_empty VARCHAR2(1);
6446 l_index NUMBER;
6447 l_index_update NUMBER;
6448 l_tare_weight WSH_DELIVERY_DETAILS.UNIT_WEIGHT%TYPE;
6449 l_ignore_for_planning_tab WSH_UTIL_CORE.COLUMN_TAB_TYPE;
6450 l_tms_interface_flag_tab WSH_UTIL_CORE.COLUMN_TAB_TYPE;
6451 l_delivery_was_empty_tab BOOLEAN_TAB_TYPE;
6452 l_delivery_id_tab WSH_UTIL_CORE.ID_TAB_TYPE;
6453 l_interface_flag_tab WSH_UTIL_CORE.COLUMN_TAB_TYPE;
6454 -- End of OTM R12 : assign delivery detail
6455
6456 -- K LPN CONV. rv
6457 l_wms_org VARCHAR2(10) := 'N';
6458 l_sync_tmp_wms_ddlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6459 l_sync_tmp_inv_ddlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6460 l_wms_ddtlist_cnt NUMBER;
6461 l_inv_ddtlist_cnt NUMBER;
6462 l_sync_tmp_wms_contlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6463 l_sync_tmp_inv_contlist wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6464 l_wms_contlist_cnt NUMBER;
6465 l_inv_contlist_cnt NUMBER;
6469 l_inv_contlist1_cnt NUMBER;
6466 l_sync_tmp_wms_contlist1 wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6467 l_sync_tmp_inv_contlist1 wsh_glbl_var_strct_grp.sync_tmp_recTbl_type;
6468 l_wms_contlist1_cnt NUMBER;
6470 -- K LPN CONV. rv
6471 l_mdc_id_tab wsh_util_core.id_tab_type;
6472 l_mdc_index_i NUMBER;
6473 l_mdc_index_j NUMBER;
6474
6475 --
6476 l_debug_on BOOLEAN;
6477 --
6478 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'AUTO_PACK_LINES';
6479 --
6480 BEGIN
6481
6482 --dbms_output.put_line('==================================================');
6483 --dbms_output.put_line(' AUTO PACK LINES ');
6484 --dbms_output.put_line('==================================================');
6485
6486 --dbms_output.put_line('Start of WSH_CONTAINER_ACTIONS.Auto_Pack_Lines...');
6487 -- Delete all Global PL/SQL tables to start with
6488 --
6489 --
6490
6491 -- OTM R12 : assign delivery detail
6492 l_gc3_is_installed := WSH_UTIL_CORE.G_GC3_IS_INSTALLED;
6493
6494 IF (l_gc3_is_installed IS NULL) THEN
6495 l_gc3_is_installed := WSH_UTIL_CORE.GC3_IS_INSTALLED;
6496 END IF;
6497
6498 -- End of OTM R12 : assign delivery detail
6499
6500 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
6501 --
6502 IF l_debug_on IS NULL
6503 THEN
6504 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
6505 END IF;
6506 --
6507 IF l_debug_on THEN
6508 WSH_DEBUG_SV.push(l_module_name);
6509 --
6510 WSH_DEBUG_SV.log(l_module_name,'P_PACK_CONT_FLAG',P_PACK_CONT_FLAG);
6511 WSH_DEBUG_SV.log(l_module_name,'l_gc3_is_installed', l_gc3_is_installed); -- OTM R12 : assign delivery detail
6512 END IF;
6513 --
6514 g_empty_cont_tab.DELETE;
6515 g_assign_detail_tab.DELETE;
6516 g_new_container_tab.DELETE;
6517 g_cache_organization_info_tab.DELETE;
6518 g_cont_msi_tab.DELETE;
6519 g_new_contid_tab.DELETE;
6520 g_new_cont_index := 0;
6521 g_num_cont_index := 0;
6522 g_assign_detail_index := 0;
6523
6524 -- 10. Check if Count of p_del_detail_tab table is 0
6525 IF p_del_detail_tab.count = 0 THEN
6526 --dbms_output.put_line('p_del_detail_tab count is 0');
6527 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_ASSG_NULL');
6528 x_return_status := C_ERROR_STATUS;
6529 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6530 --
6531 IF l_debug_on THEN
6532 WSH_DEBUG_SV.pop(l_module_name);
6533 END IF;
6534 --
6535 return;
6536 END IF;
6537 --dbms_output.put_line('Before Autocreate Del'||to_char(sysdate,'HH24:MI:SS'));
6538 -- 20. Generate Grouping Ids
6539 IF p_group_id_tab.COUNT = 0 THEN
6540
6541 -- call autocreate delivery API with a check flag set to 'Y' and
6542 -- container flag set to 'Y' to fetch group id table for delivery lines
6543
6544 --dbms_output.put_line('Calling WSH_DELIVERY_AUTOCREATE.autocreate_deliveries to generate group_ids');
6545 --
6546 IF l_debug_on THEN
6547 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
6548 END IF;
6549 --
6550
6551 l_attr_tab.delete;
6552
6553 FOR i in 1..p_del_detail_tab.count LOOP
6554
6555 l_attr_tab(i).entity_id := p_del_detail_tab(i);
6556 l_attr_tab(i).entity_type := 'DELIVERY_DETAIL';
6557
6558 END LOOP;
6559
6560 l_action_rec.action := 'MATCH_GROUPS';
6561
6562
6563
6564 WSH_Delivery_AutoCreate.Find_Matching_Groups(p_attr_tab => l_attr_tab,
6565 p_action_rec => l_action_rec,
6566 p_target_rec => l_target_rec,
6567 p_group_tab => l_group_tab,
6568 x_matched_entities => l_matched_entities,
6569 x_out_rec => l_out_rec,
6570 x_return_status => l_return_status);
6571
6572 IF l_debug_on THEN
6573 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6574 END IF;
6575 IF (l_return_status = C_ERROR_STATUS) OR
6576 (l_return_status = C_UNEXP_ERROR_STATUS) THEN
6577 --dbms_output.put_line('***WSH_DELIVERY_AUTOCREATE.autocreate_deliveries returned '||l_return_status);
6578 FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
6579 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
6580 x_return_status := l_return_status;
6581 --
6582 IF l_debug_on THEN
6583 WSH_DEBUG_SV.pop(l_module_name);
6584 END IF;
6585 --
6586 return;
6587 END IF;
6588 FOR i in 1..l_attr_tab.COUNT LOOP
6589 l_group_id_tab(l_attr_tab(i).entity_id) := l_attr_tab(i).group_id;
6590 END LOOP;
6591 ELSE
6592 cnt := p_group_id_tab.FIRST;
6593
6594 IF ((cnt IS NULL) OR (p_group_id_tab.COUNT <> p_del_detail_tab.count)) THEN
6595 x_return_status := C_ERROR_STATUS;
6596 FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
6597 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6598 --
6599 IF l_debug_on THEN
6600 WSH_DEBUG_SV.pop(l_module_name);
6601 END IF;
6602 --
6603 return;
6604 ELSE
6605
6609
6606 FOR i in 1..p_group_id_tab.COUNT LOOP
6607 l_group_id_tab(p_del_detail_tab(i)) := p_group_id_tab(i);
6608 END LOOP;
6610 END IF;
6611 END IF;
6612
6613
6614 --dbms_output.put_line('Before Validate DD for Pack'||to_char(sysdate,'HH24:MI:SS'));
6615 Validate_Dd_for_Pack(
6616 p_group_id_tab => l_group_id_tab,
6617 p_del_detail_tab => p_del_detail_tab,
6618 x_line_cont_tab => line_cont_tab,
6619 x_error_cnt => error_cnt,
6620 x_warn_cnt => warn_cnt,
6621 x_fill_pc_warn_cnt => l_fill_pc_warn_count, -- bug 3562797 jckwok
6622 x_release_warn_cnt => l_release_warn_count);
6623
6624 IF l_debug_on THEN
6625 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
6626 WSH_DEBUG_SV.log(l_module_name,'line cont tab count -',line_cont_tab.count);
6627 END IF;
6628 --dbms_output.put_line(p_del_detail_tab.count||'<CALL TO VALIDATE DD FOR PACK>'||l_release_warn_count||'>'||line_cont_tab.count);
6629
6630 -- Raise warning if we found some delivery details with status 'S'
6631 -- Raise Error if all lines are with status 'S'
6632 IF (l_release_warn_count = p_del_detail_tab.count) THEN
6633 x_return_status := C_ERROR_STATUS;
6634 FND_MESSAGE.SET_NAME('WSH','WSH_DEL_RELEASED_STATUS');
6635 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6636 -- Bug 3337629 : Added the following return statement.
6637 IF l_debug_on THEN
6638 WSH_DEBUG_SV.pop(l_module_name);
6639 END IF;
6640 RETURN;
6641 ELSIF (l_release_warn_count > 0) THEN
6642 -- Bug 3337629 - x_return_status does not hold any value.
6643 -- Compare it with l_return_status.
6644 -- Also increment the warn_cnt.
6645
6646 --IF (x_return_status <> C_ERROR_STATUS) THEN
6647 IF (l_return_status <> C_ERROR_STATUS) THEN
6648 x_return_status := C_WARNING_STATUS;
6649 warn_cnt := warn_cnt + 1;
6650 FND_MESSAGE.SET_NAME('WSH','WSH_DEL_REL_STATUS_WARN');
6651 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6652 END IF;
6653 END IF;
6654 --
6655 -- bug 3562797 jckwok
6656 -- Raise Error if all dds have 'Shipping Parameter' percent fill basis as None
6657 -- Raise warning if only some of the dds have 'Shipping Parameter' percent fill basis as None
6658 --
6659 IF (l_fill_pc_warn_count = p_del_detail_tab.count) THEN
6660 x_return_status := C_ERROR_STATUS;
6661 FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
6662 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6663 IF l_debug_on THEN
6664 WSH_DEBUG_SV.pop(l_module_name);
6665 END IF;
6666 RETURN;
6667 ELSIF (l_fill_pc_warn_count > 0) THEN
6668 IF (l_return_status <> C_ERROR_STATUS) THEN
6669 x_return_status := C_WARNING_STATUS;
6670 warn_cnt := warn_cnt + 1;
6671 FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
6672 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
6673 END IF;
6674 END IF;
6675 -- end of bug 3562797 jckwok
6676
6677 --dbms_output.put_line('Before 50'||to_char(sysdate,'HH24:MI:SS'));
6678 IF (line_cont_tab.COUNT > 0) THEN
6679 -- 50. Loop through all lines that need to be Auto-Packed
6680 cnt := 1;
6681 l_last_organization_id := NULL;
6682 WHILE (cnt <= line_cont_tab.COUNT) LOOP
6683
6684 IF l_debug_on THEN
6685 WSH_DEBUG_SV.log(l_module_name,'======================================================');
6686 WSH_DEBUG_SV.log(l_module_name,'auto-packing line ' || line_cont_tab(cnt).delivery_detail_id||'Org id'||line_cont_tab(cnt).organization_id);
6687 END IF;
6688
6689 IF (l_last_organization_id is NULL) THEN
6690 l_last_organization_id := line_cont_tab(cnt).organization_id;
6691 ELSIF (l_last_organization_id <> line_cont_tab(cnt).organization_id) THEN
6692 l_last_organization_id := line_cont_tab(cnt).organization_id;
6693
6694 -- Delete the empty PL/SQL cont table if organization_id changes
6695 g_empty_cont_tab.DELETE;
6696 END IF;
6697
6698 Pack_Delivery_Detail(
6699 p_line_cont_rec => line_cont_tab(cnt),
6700 x_return_status => l_return_status);
6701 -- Bug 2786021 handle unexpected error
6702 IF (l_return_status = C_ERROR_STATUS OR
6703 l_return_status = C_UNEXP_ERROR_STATUS
6704 ) THEN
6705 error_cnt := error_cnt + 1;
6706 ELSE
6707 succ_cnt := succ_cnt + 1;
6708 END IF;
6709 cnt := cnt + 1;
6710
6711 END LOOP;
6712 --dbms_output.put_line('Error Count '|| error_cnt||' Success Count '||succ_cnt);
6713 --dbms_output.put_line('Before Create'||to_char(sysdate,'HH24:MI:SS')||'g_new_container_tab.count'||g_new_container_tab.COUNT);
6714
6715 -- 60.1 Create Containers from g_new_container_tab PL/SQL table
6716 --dbms_output.put_line('*** Creating Actual Containers ***');
6717 cnt := 1;
6718 l_cont_instance_cnt := 1;
6719 WHILE (cnt <= g_new_container_tab.COUNT) LOOP
6720 l_cont_name := null;
6721
6722 --
6723 IF l_debug_on THEN
6724 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CREATE_CONT_INSTANCE_MULTI',WSH_DEBUG_SV.C_PROC_LEVEL);
6725 WSH_DEBUG_SV.logmsg(l_module_name,'Number of Containers'||g_new_container_tab(cnt).number_of_containers);
6726 WSH_DEBUG_SV.log(l_module_name,'Create Container'||g_new_container_tab(cnt).container_item_id||'<'||g_new_container_tab(cnt).organization_id||'>'||g_new_container_tab(cnt).number_of_containers);
6727 END IF;
6728 --
6732 x_cont_instance_id => l_cont_instance_id,
6729 wsh_container_actions.Create_Cont_Instance_Multi (
6730 x_cont_name => l_cont_name,
6731 p_cont_item_id => g_new_container_tab(cnt).container_item_id,
6733 p_par_detail_id => NULL,
6734 p_organization_id => g_new_container_tab(cnt).organization_id,
6735 p_container_type_code => NULL,
6736 p_num_of_containers => g_new_container_tab(cnt).number_of_containers,
6737 x_row_id => l_row_id,
6738 x_return_status => l_return_status,
6739 x_cont_tab => l_cont_tab,
6740 -- J: W/V Changes
6741 x_unit_weight => l_unit_weight,
6742 x_unit_volume => l_unit_volume,
6743 x_weight_uom_code => l_weight_uom_code,
6744 x_volume_uom_code => l_volume_uom_code,
6745 p_lpn_id => NULL,
6746 p_ignore_for_planning => NULL,
6747 p_caller => 'WSH'
6748 );
6749 IF l_debug_on THEN
6750 WSH_DEBUG_SV.log(l_module_name,'return status ,cont tab count -',l_return_status||l_cont_tab.count);
6751 END IF;
6752
6753 IF l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
6754 ) THEN
6755 --dbms_output.put_line('Container Creation failed for index '|| cnt);
6756 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
6757 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
6758 error_cnt := error_cnt + 1;
6759 ELSE
6760
6761 IF l_debug_on THEN
6762 WSH_DEBUG_SV.logmsg(l_module_name,'Created Containers'||l_cont_tab.count);
6763 END IF;
6764 -- do not use this container instance id
6765 g_new_container_tab(cnt).cont_instance_id := l_cont_instance_id;
6766
6767 -- This new PL SQL table will have mapping records to g_new_container_tab
6768 -- where count of g_new_container_tab will have records here
6769 -- Example if l_new_contid_count is 1 and in g_new_container_tab, the
6770 -- number of containers is 10, then those 10 container instance id can be
6771 -- extracted from this new PL SQL table
6772 IF l_new_contid_count IS NULL THEN
6773 l_new_contid_count := 0;
6774 ELSE
6775 l_new_contid_count := g_new_contid_tab.count;
6776 END IF;
6777
6778 -- can replace l_new_contid_count with g_new_contid_tab.count
6779 FOR j in 1..l_cont_tab.count
6780 LOOP
6781 l_new_contid_count := l_new_contid_count + 1;
6782 g_new_contid_tab(l_new_contid_count).match_id := cnt;
6783 g_new_contid_tab(l_new_contid_count).cont_instance_id := l_cont_tab(j);
6784 -- J: W/V Changes
6785 g_new_contid_tab(l_new_contid_count).unit_weight := l_unit_weight;
6786 g_new_contid_tab(l_new_contid_count).unit_volume := l_unit_volume;
6787 g_new_contid_tab(l_new_contid_count).weight_uom := l_weight_uom_code;
6788 g_new_contid_tab(l_new_contid_count).volume_uom := l_volume_uom_code;
6789 g_new_contid_tab(l_new_contid_count).item_id := g_new_container_tab(cnt).container_item_id;
6790
6791 -- K LPN CONV. rv
6792 g_new_contid_tab(l_new_contid_count).organization_id := g_new_container_tab(cnt).organization_id;
6793
6794 x_cont_instance_tab(l_new_contid_count) := l_cont_tab(j);
6795 -- Bug 3570364 : Adding the Master container item id of the line to all it's
6796 -- container LPN's. This information is passed to Auto_pack_conts.
6797 l_detail_cont_rec.container_instance_id := l_cont_tab(j);
6798 l_detail_cont_rec.container_item_id := g_new_container_tab(cnt).mast_cont_item_id;
6799 l_detail_cont_tab(l_new_contid_count) := l_detail_cont_rec;
6800
6801 --g_new_contid_tab(l_new_contid_count).cont_instance_id := l_cont_tab(j).cont_instance_id;
6802 --x_cont_instance_tab(l_new_contid_count) := l_cont_tab(j).cont_instance_id;
6803 END LOOP;
6804
6805 --dbms_output.put_line('COUNT in new tab'||g_new_contid_tab.count||'<'||x_cont_instance_tab.count);
6806
6807 -- End of PL SQL table usage
6808 -- move this call of x_cont_instance_tab to within the above LOOP
6809 --x_cont_instance_tab(l_cont_instance_cnt) := l_cont_instance_id;
6810
6811 -- Bug 3570364 : Move following stmt's to within the above LOOP
6812 -- which stores the master container item id for each LPN
6813 /*{ l_detail_cont_rec.container_instance_id := l_cont_instance_id;
6814 l_detail_cont_rec.container_item_id := g_new_container_tab(cnt).mast_cont_item_id;
6815 l_detail_cont_tab(l_cont_instance_cnt) := l_detail_cont_rec;
6816 l_cont_instance_cnt := l_cont_instance_cnt + 1; } */
6817
6818 --dbms_output.put_line('Container dd id '||l_cont_instance_id||' for index '|| cnt);
6819 END IF;
6820 cnt := cnt + 1;
6821 END LOOP;
6822 --dbms_output.put_line('Error Count after CREATE CONTAINER'|| error_cnt);
6823
6824
6825 -- 70.1 Assign Details to Actual Containers created
6826 IF l_debug_on THEN
6827
6828 WSH_DEBUG_SV.log(l_module_name,'*** Assigning Details to Containers Created ***'||g_assign_detail_tab.count);
6829 WSH_DEBUG_SV.log(l_module_name,'*** COUNT ***'||g_new_contid_tab.count||'<'||g_new_container_tab.count||to_char(sysdate,'HH24:MI:SS'));
6830 END IF;
6831
6832 -- doing BULK UPDATE here
6833 -- First Update WDA for each delivey detail to have parent_delivery_detail populated
6834 -- correctly
6835
6839 FOR cnt in 1..g_assign_detail_tab.COUNT
6836 m := 0;
6837 l_wms_ddtlist_cnt :=1;
6838 l_inv_ddtlist_cnt :=1;
6840 LOOP
6841 l_GrossWtlist(cnt) := g_assign_detail_tab(cnt).gross_weight;
6842 l_NetWtlist(cnt) := g_assign_detail_tab(cnt).net_weight;
6843 l_WtUOMlist(cnt) := g_assign_detail_tab(cnt).weight_uom;
6844 l_Vollist(cnt) := g_assign_detail_tab(cnt).volume;
6845 l_VolUOMlist(cnt) := g_assign_detail_tab(cnt).volume_uom;
6846 l_InvItemlist(cnt) := g_assign_detail_tab(cnt).inventory_item_id;
6847 l_ddlist(cnt) := g_assign_detail_tab(cnt).delivery_detail_id;
6848 l_dellist(cnt) := g_assign_detail_tab(cnt).delivery_id;
6849 l_wms_org := 'N';
6850 -- K LPN CONV. rv
6851 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
6852 --{
6853 l_wms_org := wsh_util_validate.check_wms_org(g_assign_detail_tab(cnt).organization_id);
6854 IF (l_wms_org = 'Y') THEN
6855 l_sync_tmp_wms_ddlist.delivery_detail_id_tbl(l_wms_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_detail_id;
6856 l_sync_tmp_wms_ddlist.delivery_id_tbl(l_wms_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_id;
6857 l_sync_tmp_wms_ddlist.parent_detail_id_tbl(l_wms_ddtlist_cnt) := NULL;
6858 l_sync_tmp_wms_ddlist.operation_type_tbl(l_wms_ddtlist_cnt) := 'PRIOR';
6859 l_wms_ddtlist_cnt := l_wms_ddtlist_cnt + 1;
6860 ELSE
6861 l_sync_tmp_inv_ddlist.delivery_detail_id_tbl(l_inv_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_detail_id;
6862 l_sync_tmp_inv_ddlist.delivery_id_tbl(l_inv_ddtlist_cnt) := g_assign_detail_tab(cnt).delivery_id;
6863 l_sync_tmp_inv_ddlist.parent_detail_id_tbl(l_inv_ddtlist_cnt) := NULL;
6864 l_sync_tmp_inv_ddlist.operation_type_tbl(l_inv_ddtlist_cnt) := 'PRIOR';
6865 l_inv_ddtlist_cnt := l_inv_ddtlist_cnt + 1;
6866 END IF;
6867 --}
6868 END IF;
6869 -- K LPN CONV. rv
6870 IF l_dellist(cnt) IS NOT NULL THEN
6871 -- no check for distinct was there earlier, added the check
6872 IF l_del_tab.count > 0 THEN
6873 FOR j in 1..l_del_tab.COUNT
6874 LOOP
6875 IF (l_dellist(cnt) IS NOT NULL
6876 AND l_dellist(cnt) = l_del_tab(j)
6877 ) THEN
6878
6879 l_exists_flag := 'Y';
6880 EXIT;
6881 ELSE
6882 l_exists_flag := 'N';
6883
6884 END IF;
6885 END LOOP;
6886 ELSE
6887 l_exists_flag := 'N';
6888 END IF;
6889
6890 IF l_exists_flag = 'N' THEN
6891 m := m + 1;
6892 l_del_tab(m) := l_dellist(cnt);
6893 END IF;
6894 END IF;
6895 END LOOP;
6896 -- the number of records should be same
6897 -- when Empty Container logic is used, then there can be a record in
6898 -- assign table with no one to one mapping in new container table
6899 -- so use container index to find that container
6900
6901 m := 0;
6902 -- K LPN CONV. rv
6903 l_wms_contlist_cnt := 1;
6904 l_inv_contlist_cnt := 1;
6905
6906 l_wms_contlist1_cnt := 1;
6907 l_inv_contlist1_cnt := 1;
6908 -- K LPN CONV. rv
6909 FOR cnt in 1..g_assign_detail_tab.COUNT
6910 LOOP
6911
6912 l_contlist(cnt) :=
6913 g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id;
6914 -- K LPN CONV. rv
6915 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
6916 --{
6917 l_wms_org := 'N';
6918 l_wms_org := wsh_util_validate.check_wms_org(g_new_contid_tab(g_assign_detail_tab(cnt).container_index).organization_id);
6919 IF (l_wms_org = 'Y') THEN
6920 l_sync_tmp_wms_contlist.delivery_detail_id_tbl(l_wms_contlist_cnt) := l_contlist(cnt);
6921 l_sync_tmp_wms_contlist.operation_type_tbl(l_wms_contlist_cnt) := 'UPDATE';
6922 l_wms_contlist_cnt := l_wms_contlist_cnt + 1;
6923 ELSE
6924 l_sync_tmp_inv_contlist.delivery_detail_id_tbl(l_inv_contlist_cnt) := l_contlist(cnt);
6925 l_sync_tmp_inv_contlist.operation_type_tbl(l_inv_contlist_cnt) := 'UPDATE';
6926 l_inv_contlist_cnt := l_inv_contlist_cnt + 1;
6927 END IF;
6928 --}
6929 END IF;
6930 -- K LPN CONV. rv
6931
6932 IF ((cnt = 1)
6933 OR
6934 (cnt > 1
6935 AND l_contlist1(m) <>
6936 g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id)
6937 )THEN
6938
6939 IF l_contlist1.count > 0 THEN
6940 FOR j in l_contlist1.FIRST..l_contlist1.LAST
6941 LOOP
6942 IF l_contlist1(j) =
6943 g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id
6944 THEN
6945 l_duplicate_flag := 'Y';
6946 EXIT; -- out of the loop
6947 ELSE
6948 l_duplicate_flag := 'N';
6949 END IF;
6950 END LOOP;
6951 ELSE
6952 l_duplicate_flag := 'N';
6953 END IF;
6954 IF l_duplicate_flag = 'N' THEN
6955 m := m + 1;
6956 l_contlist1(m) :=
6957 g_new_contid_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id;
6958 -- J: W/V Changes
6959 l_cont_Wtlist(m) :=
6960 g_new_contid_tab(g_assign_detail_tab(cnt).container_index).unit_weight;
6961 l_cont_Vollist(m) :=
6965 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
6962 g_new_contid_tab(g_assign_detail_tab(cnt).container_index).unit_volume;
6963 l_dellist1(m) := g_assign_detail_tab(cnt).delivery_id;
6964 -- K LPN CONV. rv
6966 --{
6967 IF (l_wms_org = 'Y') THEN
6968 l_sync_tmp_wms_contlist1.delivery_detail_id_tbl(l_wms_contlist1_cnt) := l_contlist1(m);
6969 l_sync_tmp_wms_contlist1.delivery_id_tbl(l_wms_contlist1_cnt) := NULL;
6970 l_sync_tmp_wms_contlist1.parent_detail_id_tbl(l_wms_contlist1_cnt) := NULL;
6971 l_sync_tmp_wms_contlist1.operation_type_tbl(l_wms_contlist1_cnt) := 'PRIOR';
6972 l_wms_contlist1_cnt := l_wms_contlist1_cnt + 1;
6973 ELSE
6974 l_sync_tmp_inv_contlist1.delivery_detail_id_tbl(l_inv_contlist1_cnt) := l_contlist1(m);
6975 l_sync_tmp_inv_contlist1.delivery_id_tbl(l_inv_contlist1_cnt) := NULL;
6976 l_sync_tmp_inv_contlist1.parent_detail_id_tbl(l_inv_contlist1_cnt) := NULL;
6977 l_sync_tmp_inv_contlist1.operation_type_tbl(l_inv_contlist1_cnt) := 'PRIOR';
6978 l_inv_contlist1_cnt := l_inv_contlist1_cnt + 1;
6979 END IF;
6980 --}
6981 END IF;
6982 -- K LPN CONV. rv
6983 END IF;
6984 END IF;
6985 END LOOP; -- g_assign_detail_tab Loop
6986
6987 IF l_debug_on THEN
6988 WSH_DEBUG_SV.logmsg(l_module_name,'Count-g_assign_detail_tab'||g_assign_detail_tab.COUNT);
6989 WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_contlist'||l_contlist.COUNT);
6990 WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_dellist>'||l_dellist.COUNT);
6991 WSH_DEBUG_SV.logmsg(l_module_name,'Count-g_new_contid>'||g_new_contid_tab.COUNT);
6992 WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_contlist1>'||l_contlist1.COUNT);
6993 WSH_DEBUG_SV.logmsg(l_module_name,'Count-l_dellist1>'||l_dellist1.COUNT);
6994 END IF;
6995
6996 -- J: W/V Changes
6997 -- 70.2 Accumulate the W/V to be adjusted by delivery and container for perf reasons. After the following loop
6998 -- l_tmp_dd1list will have W/V that needs to be reduced from deliveries (if the lines are already assigned to a delivery)
6999 -- l_tmp_dd2list will have W/V that needs to be propogated to container only.
7000 -- The W/V is accumulated and stored in the above tables whenever item,W/V uom change in container and delivery
7001 -- For Ex: Say a dd with Wt 10 Lbs and Vol 20 Cu. Ft is assigned to a delivery (which has Wt 10 Lbs and Vol 20 Cu. Ft)
7002 -- and say the line got auto-packed into a container with tare wt. 2 Lbs and Vol. 100 Cu. Ft
7003 -- Then after the following loop, l_tmp_dd1list will have dd with vol -20. l_tmp_dd2list will have
7004 -- gross wt. 10 Lbs and Vol 20 Cu. Ft.
7005
7006 IF l_debug_on THEN
7007 WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7008 END IF;
7009 l_prev_del_id := NULL;
7010 l_prev_dd_id := NULL;
7011 l_prev_cont_id := NULL;
7012 l_tot_dd_gross_wt := 0;
7013 l_tot_dd_net_wt := 0;
7014 l_tot_dd_vol := 0;
7015 l_tot_del_vol := 0;
7016 i := 0;
7017 l_item_changed := FALSE;
7018
7019 LOOP
7020 i := i + 1;
7021
7022 IF l_debug_on THEN
7023 IF i <= l_dellist.COUNT THEN
7024 WSH_DEBUG_SV.logmsg(l_module_name,'Del '||l_dellist(i)||' Cont '||l_contlist(i)||' DD '||l_ddlist(i)||' l_prev_dd_id '||l_prev_dd_id||' l_prev_cont_id '||l_prev_cont_id||' l_prev_del_id '||l_prev_del_id);
7025 END IF;
7026 END IF;
7027
7028 IF (i > l_dellist.COUNT OR l_contlist(i) is NOT NULL) THEN
7029
7030 IF (i > 1) AND (i <= l_dellist.COUNT) THEN
7031 IF (l_prev_item <> l_InvItemlist(i)) OR
7032 (NVL(l_prev_wt_uom,'-99') <> NVL(l_WtUOMlist(i),'-99')) OR
7033 (NVL(l_prev_vol_uom,'-99') <> NVL(l_VolUOMlist(i),'-99')) THEN
7034 l_item_changed := TRUE;
7035 END IF;
7036
7037 END IF;
7038
7039 IF (i > l_dellist.COUNT) OR
7040 (l_prev_del_id is NOT NULL AND (NVL(l_dellist(i),-99) <> l_prev_del_id)) OR
7041 l_item_changed THEN
7042 i1 := i1 + 1;
7043 l_tmp_dd1list(i1).dd_id := l_prev_dd_id;
7044 l_tmp_dd1list(i1).vol := -1 * l_tot_del_vol;
7045 l_tot_del_vol := 0;
7046 END IF;
7047
7048 IF i > l_dellist.COUNT OR
7049 (l_prev_cont_id is NOT NULL AND (l_contlist(i) <> l_prev_cont_id)) OR
7050 l_item_changed THEN
7051
7052 k1 := k1 + 1;
7053 l_tmp_dd2list(k1).dd_id := l_prev_dd_id;
7054 l_tmp_dd2list(k1).gross_wt := l_tot_dd_gross_wt;
7055 l_tmp_dd2list(k1).net_wt := l_tot_dd_net_wt;
7056 l_tmp_dd2list(k1).vol := l_tot_dd_vol;
7057
7058 l_tot_dd_gross_wt := 0;
7059 l_tot_dd_net_wt := 0;
7060 l_tot_dd_vol := 0;
7061 END IF;
7062
7063 IF i > l_dellist.COUNT THEN
7064 EXIT;
7065 END IF;
7066
7067 l_tot_dd_gross_wt := l_tot_dd_gross_wt + NVL(l_GrossWtlist(i),0);
7068 l_tot_dd_net_wt := l_tot_dd_net_wt + NVL(l_NetWtlist(i),0);
7069 l_tot_dd_vol := l_tot_dd_vol + NVL(l_Vollist(i),0);
7070 IF l_dellist(i) is not null THEN
7071 l_tot_del_vol := l_tot_del_vol + NVL(l_Vollist(i),0);
7072 END IF;
7073 l_prev_dd_id := l_ddlist(i);
7077 l_prev_item := l_InvItemlist(i);
7074 l_prev_cont_id := l_contlist(i);
7075 l_prev_wt_uom := l_WtUOMlist(i);
7076 l_prev_vol_uom := l_VolUOMlist(i);
7078 l_prev_del_id := l_dellist(i);
7079
7080 END IF;
7081 END LOOP;
7082 IF l_debug_on THEN
7083 WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7084 --WSH_DEBUG_SV.log(l_module_name,'l_tmp_dd1list.COUNT '||l_tmp_dd1list.COUNT||' l_tmp_dd2list.COUNT '||l_tmp_dd2list.COUNT||' l_tmp_contlist.COUNT '||l_tmp_contlist.COUNT);
7085 WSH_DEBUG_SV.log(l_module_name,'l_tmp_dd1list.COUNT '||l_tmp_dd1list.COUNT||' l_tmp_dd2list.COUNT '||l_tmp_dd2list.COUNT);
7086 WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment 1 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7087 END IF;
7088
7089 -- J: W/V Changes
7090 FOR i in 1..l_tmp_dd1list.COUNT LOOP
7091 IF l_debug_on THEN
7092 WSH_DEBUG_SV.logmsg(l_module_name,'Del1:Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
7093 END IF;
7094
7095 WSH_WV_UTILS.DD_WV_Post_Process(
7096 p_delivery_detail_id => l_tmp_dd1list(i).dd_id,
7097 p_diff_gross_wt => l_tmp_dd1list(i).gross_wt,
7098 p_diff_net_wt => NULL,
7099 p_diff_volume => l_tmp_dd1list(i).vol,
7100 p_diff_fill_volume => l_tmp_dd1list(i).vol,
7101 x_return_status => l_return_status);
7102
7103 IF (l_return_status <> C_SUCCESS_STATUS) THEN
7104 --
7105 IF (l_return_status = C_ERROR_STATUS OR
7106 l_return_status = C_UNEXP_ERROR_STATUS) THEN
7107 error_cnt := error_cnt + 1;
7108 ELSE
7109 cont_warn := cont_warn + 1;
7110 END IF;
7111
7112 END IF;
7113 END LOOP;
7114 IF l_debug_on THEN
7115 WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment 1 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7116 END IF;
7117
7118 -- changes to add l_dellist1 and add new messages
7119 --
7120 -- K LPN CONV. rv
7121 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7122 THEN
7123 --{
7124 IF (WSH_WMS_LPN_GRP.GK_WMS_PACK and l_sync_tmp_wms_ddlist.delivery_detail_id_tbl.count > 0)
7125 THEN
7126 --{
7127 WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7128 (
7129 p_sync_tmp_recTbl => l_sync_tmp_wms_ddlist,
7130 x_return_status => l_return_status
7131 );
7132
7133 IF l_debug_on THEN
7134 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7135 END IF;
7136 --
7137 IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7138 x_return_status := l_return_status;
7139 --
7140 IF l_debug_on THEN
7141 WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7142 WSH_DEBUG_SV.pop(l_module_name);
7143 END IF;
7144 --
7145 RETURN;
7146 ELSE
7147 IF l_return_status <> C_SUCCESS_STATUS THEN
7148 x_return_status := C_WARNING_STATUS;
7149 END IF;
7150 END IF;
7151 --}
7152 ELSIF (WSH_WMS_LPN_GRP.GK_INV_PACK and l_sync_tmp_inv_ddlist.delivery_detail_id_tbl.count > 0)
7153 THEN
7154 --{
7155 WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7156 (
7157 p_sync_tmp_recTbl => l_sync_tmp_inv_ddlist,
7158 x_return_status => l_return_status
7159 );
7160
7161 IF l_debug_on THEN
7162 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7163 END IF;
7164 --
7165 IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7166 x_return_status := l_return_status;
7167 --
7168 IF l_debug_on THEN
7169 WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7170 WSH_DEBUG_SV.pop(l_module_name);
7171 END IF;
7172 --
7173 RETURN;
7174 ELSE
7175 IF l_return_status <> C_SUCCESS_STATUS THEN
7176 x_return_status := C_WARNING_STATUS;
7177 END IF;
7178 END IF;
7179 --}
7180 END IF;
7181 --}
7182 END IF;
7183 -- K LPN CONV. rv
7184
7185 FORALL cnt IN 1..g_assign_detail_tab.COUNT
7186 UPDATE wsh_delivery_assignments_v
7187 SET PARENT_DELIVERY_DETAIL_ID = l_contlist(cnt),
7188 last_update_date = SYSDATE,
7189 last_updated_by = FND_GLOBAL.USER_ID,
7190 last_update_login = FND_GLOBAL.LOGIN_ID
7191 WHERE DELIVERY_DETAIL_ID = l_ddlist(cnt);
7192 l_mdc_id_tab.delete;
7193 l_mdc_index_i := l_ddlist.FIRST;
7194 l_mdc_index_j := 0;
7195 WHILE l_mdc_index_i IS NOT NULL LOOP
7196 l_mdc_index_j := l_mdc_index_j + 1;
7197 l_mdc_id_tab(l_mdc_index_j) := l_ddlist(l_mdc_index_i);
7198 l_mdc_index_i := l_ddlist.next(l_mdc_index_i);
7199
7200 END LOOP;
7201 WSH_DELIVERY_DETAILS_ACTIONS.Delete_Consol_Record(
7202 p_detail_id_tab => l_mdc_id_tab,
7203 x_return_status => x_return_status);
7204
7208 WSH_DEBUG_SV.pop(l_module_name);
7205 IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7206 IF l_debug_on THEN
7207 WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
7209 END IF;
7210 RETURN;
7211 END IF;
7212
7213
7214 -- J: W/V Changes
7215 IF l_debug_on THEN
7216 WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment 2 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7217 END IF;
7218 FOR i in 1..l_tmp_dd2list.COUNT LOOP
7219 IF l_debug_on THEN
7220 WSH_DEBUG_SV.logmsg(l_module_name,'Del2:Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
7221 END IF;
7222
7223 WSH_WV_UTILS.DD_WV_Post_Process(
7224 p_delivery_detail_id => l_tmp_dd2list(i).dd_id,
7225 p_diff_gross_wt => l_tmp_dd2list(i).gross_wt,
7226 p_diff_net_wt => l_tmp_dd2list(i).net_wt,
7227 p_diff_volume => l_tmp_dd2list(i).vol,
7228 p_diff_fill_volume => l_tmp_dd2list(i).vol,
7229 x_return_status => l_return_status);
7230
7231 IF (l_return_status <> C_SUCCESS_STATUS) THEN
7232 --
7233 IF (l_return_status = C_ERROR_STATUS OR
7234 l_return_status = C_UNEXP_ERROR_STATUS) THEN
7235 error_cnt := error_cnt + 1;
7236 ELSE
7237 cont_warn := cont_warn + 1;
7238 END IF;
7239
7240 END IF;
7241 END LOOP;
7242 IF l_debug_on THEN
7243 WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment 2 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7244 END IF;
7245
7246 -- fetch all the attributes for the delivery line
7247 cnt := 0;
7248 FOR i in 1..l_ddlist.count
7249 LOOP
7250 -- the inner loop will process one record at a time
7251 FOR rec in c_get_attributes(l_ddlist(i))
7252 LOOP
7253 cnt := cnt + 1;
7254 l_tab_cust_id(cnt) := rec.customer_id;
7255 l_tab_ship_location_id(cnt) := rec.ship_to_location_id;
7256 l_tab_intmed_location_id(cnt) := rec.intmed_ship_to_location_id;
7257 l_tab_fob_code(cnt) := rec.fob_code;
7258 l_tab_freight_terms_code(cnt) := rec.freight_terms_code;
7259 l_tab_ship_method_code(cnt) := rec.ship_method_code;
7260 l_tab_carrier_id(cnt) := rec.carrier_id;
7261 l_tab_mode_of_transport(cnt) := rec.mode_of_transport;
7262 l_tab_service_level(cnt) := rec.service_level;
7263 l_tab_deliver_location_id(cnt) := rec.deliver_to_location_id;
7264 l_tab_line_direction(cnt) := rec.line_direction; -- J-IB-NPARIKH
7265 l_tab_shipping_control(cnt) := rec.shipping_control; -- J-IB-NPARIKH
7266 l_tab_ignore_for_planning(cnt) := rec.ignore_for_planning;
7267 END LOOP;
7268
7269 END LOOP;
7270
7271 --
7272 -- K LPN CONV. rv
7273 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7274 THEN
7275 --{
7276 IF (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_sync_tmp_wms_contlist.delivery_detail_id_tbl.count > 0)
7277 THEN
7278 --{
7279 WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7280 (
7281 p_sync_tmp_recTbl => l_sync_tmp_wms_contlist,
7282 x_return_status => l_return_status
7283 );
7284
7285 IF l_debug_on THEN
7286 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7287 END IF;
7288 --
7289 IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7290 x_return_status := l_return_status;
7291 --
7292 IF l_debug_on THEN
7293 WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7294 WSH_DEBUG_SV.pop(l_module_name);
7295 END IF;
7296 --
7297 RETURN;
7298 ELSE
7299 IF l_return_status <> C_SUCCESS_STATUS THEN
7300 x_return_status := C_WARNING_STATUS;
7301 END IF;
7302 END IF;
7303 --}
7304 ELSIF (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_sync_tmp_inv_contlist.delivery_detail_id_tbl.count > 0)
7305 THEN
7306 --{
7307 WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7308 (
7309 p_sync_tmp_recTbl => l_sync_tmp_inv_contlist,
7310 x_return_status => l_return_status
7311 );
7312
7313 IF l_debug_on THEN
7314 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7315 END IF;
7316 --
7317 IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7318 x_return_status := l_return_status;
7319 --
7320 IF l_debug_on THEN
7321 WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7322 WSH_DEBUG_SV.pop(l_module_name);
7323 END IF;
7324 --
7325 RETURN;
7326 ELSE
7327 IF l_return_status <> C_SUCCESS_STATUS THEN
7328 x_return_status := C_WARNING_STATUS;
7329 END IF;
7330 END IF;
7331 --}
7332 END IF;
7333 --}
7337 FORALL cnt IN 1..g_assign_detail_tab.COUNT
7334 END IF;
7335 -- K LPN CONV. rv
7336 -- update container with all the attributes
7338 UPDATE WSH_DELIVERY_DETAILS
7339 SET customer_id = l_tab_cust_id(cnt),
7340 ship_to_location_id = l_tab_ship_location_id(cnt),
7341 intmed_ship_to_location_id = l_tab_intmed_location_id(cnt),
7342 fob_code = l_tab_fob_code(cnt),
7343 freight_terms_code = l_tab_freight_terms_code(cnt),
7344 ship_method_code = l_tab_ship_method_code(cnt),
7345 carrier_id = l_tab_carrier_id(cnt),
7346 service_level = l_tab_service_level(cnt),
7347 mode_of_transport = l_tab_mode_of_transport(cnt),
7348 deliver_to_location_id = l_tab_deliver_location_id(cnt),
7349 line_direction = l_tab_line_direction(cnt),
7350 shipping_control = l_tab_shipping_control(cnt),
7351 ignore_for_planning = l_tab_ignore_for_planning(cnt)
7352 WHERE DELIVERY_DETAIL_ID = l_contlist(cnt);
7353
7354
7355 -- then if the delivery detail has a delivery assigned, update the container records
7356 -- in WDA to indicate delivery id
7357 --
7358 -- K LPN CONV. rv
7359 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
7360 THEN
7361 --{
7362 IF (WSH_WMS_LPN_GRP.GK_WMS_ASSIGN_DLVY and l_sync_tmp_wms_contlist1.delivery_detail_id_tbl.count > 0)
7363 THEN
7364 --{
7365 WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7366 (
7367 p_sync_tmp_recTbl => l_sync_tmp_wms_contlist1,
7368 x_return_status => l_return_status
7369 );
7370
7371 IF l_debug_on THEN
7372 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7373 END IF;
7374 --
7375 IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7376 x_return_status := l_return_status;
7377 --
7378 IF l_debug_on THEN
7379 WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7380 WSH_DEBUG_SV.pop(l_module_name);
7381 END IF;
7382 --
7383 RETURN;
7384 ELSE
7385 IF l_return_status <> C_SUCCESS_STATUS THEN
7386 x_return_status := C_WARNING_STATUS;
7387 END IF;
7388 END IF;
7389 --}
7390 ELSIF (WSH_WMS_LPN_GRP.GK_INV_ASSIGN_DLVY and l_sync_tmp_inv_contlist1.delivery_detail_id_tbl.count > 0)
7391 THEN
7392 --{
7393 WSH_WMS_SYNC_TMP_PKG.MERGE_BULK
7394 (
7395 p_sync_tmp_recTbl => l_sync_tmp_inv_contlist1,
7396 x_return_status => l_return_status
7397 );
7398
7399 IF l_debug_on THEN
7400 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
7401 END IF;
7402 --
7403 IF l_return_status IN (C_UNEXP_ERROR_STATUS, C_ERROR_STATUS) THEN
7404 x_return_status := l_return_status;
7405 --
7406 IF l_debug_on THEN
7407 WSH_DEBUG_SV.logmsg(l_module_name,'Error occured in WSH_WMS_SYNC_TMP_PKG.MERGE_BULK');
7408 WSH_DEBUG_SV.pop(l_module_name);
7409 END IF;
7410 --
7411 RETURN;
7412 ELSE
7413 IF l_return_status <> C_SUCCESS_STATUS THEN
7414 x_return_status := C_WARNING_STATUS;
7415 END IF;
7416 END IF;
7417 --}
7418 END IF;
7419 --}
7420 END IF;
7421 -- K LPN CONV. rv
7422
7423 -- OTM R12 : assign delivery detail
7424
7425 IF (l_gc3_is_installed = 'Y') THEN
7426 -- loop through the deliveries in l_dellist1,
7427 -- and get ignore_for_planning and tms_interface_flag tab,
7428 -- for ignore_for_planning delivery, check whether it's empty
7429 l_index := l_dellist1.FIRST;
7430 WHILE (l_index IS NOT NULL) LOOP
7431 -- l_dellist1(l_index) might be null if the container is not assigned
7432 -- to a delivery
7433 IF (l_dellist1(l_index) IS NOT NULL) THEN
7434 OPEN c_get_plan_and_tms_flag(l_dellist1(l_index));
7435 FETCH c_get_plan_and_tms_flag INTO l_ignore_for_planning_tab(l_index),
7436 l_tms_interface_flag_tab(l_index);
7437 IF c_get_plan_and_tms_flag%NOTFOUND THEN
7438 --{
7439 IF l_debug_on THEN
7440 WSH_DEBUG_SV.log(l_module_name,'No data for c_get_plan_and_tms_flag', l_dellist1(l_index));
7441 END IF;
7442 CLOSE c_get_plan_and_tms_flag;
7443 raise FND_API.G_EXC_ERROR;
7444 END IF;
7445
7446 CLOSE c_get_plan_and_tms_flag;
7447
7448 l_delivery_was_empty_tab(l_index) := FALSE;
7449 IF (l_ignore_for_planning_tab(l_index) = 'N') THEN
7450 l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(l_dellist1(l_index));
7451 IF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
7452 IF l_debug_on THEN
7453 WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
7454 END IF;
7458 END IF;
7455 raise FND_API.G_EXC_ERROR;
7456 ELSIF (l_is_delivery_empty = 'Y') THEN
7457 l_delivery_was_empty_tab(l_index) := TRUE;
7459 END IF;
7460 IF l_debug_on THEN
7461 WSH_DEBUG_SV.log(l_module_name,'l_dellist1('||l_index||')', l_dellist1(l_index));
7462 WSH_DEBUG_SV.log(l_module_name,'l_contlist1('||l_index||')', l_contlist1(l_index));
7463 WSH_DEBUG_SV.log(l_module_name,'l_ignore_for_planning_tab('||l_index||')', l_ignore_for_planning_tab(l_index));
7464 WSH_DEBUG_SV.log(l_module_name,'l_tms_interface_flag_tab('||l_index||')', l_tms_interface_flag_tab(l_index));
7465 END IF;
7466 ELSE
7467 l_ignore_for_planning_tab(l_index) := NULL;
7468 l_tms_interface_flag_tab(l_index) := NULL;
7469 l_delivery_was_empty_tab(l_index) := NULL;
7470 IF l_debug_on THEN
7471 WSH_DEBUG_SV.log(l_module_name, 'l_dellist1 is null for ', l_contlist1(l_index));
7472 END IF;
7473 END IF;
7474
7475 l_index := l_dellist1.NEXT(l_index);
7476 END LOOP;
7477 END IF;
7478 -- End of OTM R12 : assign delivery detail
7479
7480 FORALL cnt IN 1..g_new_contid_tab.COUNT
7481 UPDATE wsh_delivery_assignments_v
7482 SET delivery_id = l_dellist1(cnt),
7483 last_update_date = SYSDATE,
7484 last_updated_by = FND_GLOBAL.USER_ID,
7485 last_update_login = FND_GLOBAL.LOGIN_ID
7486 WHERE DELIVERY_DETAIL_ID = l_contlist1(cnt);
7487
7488 -- OTM R12 : assign delivery detail
7489 IF (l_gc3_is_installed = 'Y') THEN
7490
7491 l_index := l_dellist1.FIRST;
7492 l_index_update := 0;
7493 WHILE (l_index IS NOT NULL) LOOP
7494 IF (l_dellist1(l_index) IS NOT NULL AND
7495 l_ignore_for_planning_tab(l_index) = 'N') THEN
7496
7497 IF (l_delivery_was_empty_tab(l_index)) THEN
7498 l_is_delivery_empty := WSH_NEW_DELIVERY_ACTIONS.IS_DELIVERY_EMPTY(l_dellist1(l_index));
7499
7500 IF (l_is_delivery_empty = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
7501 --handle the error approriately to the procedure this code is in
7502 IF l_debug_on THEN
7503 WSH_DEBUG_SV.log(l_module_name,'error from wsh_new_delivery_actions.is_delivery_empty');
7504 END IF;
7505 raise FND_API.G_EXC_ERROR;
7506 ELSIF (l_is_delivery_empty = 'N') THEN
7507 IF (l_tms_interface_flag_tab(l_index) = WSH_NEW_DELIVERIES_PVT.C_TMS_NOT_TO_BE_SENT) THEN
7508 l_index_update := l_index_update + 1;
7509 l_delivery_id_tab(l_index_update) := l_dellist1(l_index);
7510 l_interface_flag_tab(l_index_update) := WSH_NEW_DELIVERIES_PVT.C_TMS_CREATE_REQUIRED;
7511
7512 IF (l_debug_on) THEN
7513 WSH_DEBUG_SV.logmsg(l_module_name, 'Delivery is not empty');
7514 WSH_DEBUG_SV.log(l_module_name,'l_dellist1', l_dellist1(l_index));
7515 WSH_DEBUG_SV.log(l_module_name,'l_interface_flag_tab', l_interface_flag_tab(l_index_update));
7516 END IF;
7517 ELSIF (l_tms_interface_flag_tab(l_index) in
7518 (WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_REQUIRED,
7519 WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_IN_PROCESS)) THEN
7520 l_index_update := l_index_update + 1;
7521 l_delivery_id_tab(l_index_update) := l_dellist1(l_index);
7522 l_interface_flag_tab(l_index_update) := WSH_NEW_DELIVERIES_PVT.C_TMS_UPDATE_REQUIRED;
7523 IF (l_debug_on) THEN
7524 WSH_DEBUG_SV.logmsg(l_module_name, 'Delivery is not empty');
7525 WSH_DEBUG_SV.log(l_module_name,'l_dellist1', l_dellist1(l_index));
7526 WSH_DEBUG_SV.log(l_module_name,'l_interface_flag_tab', l_interface_flag_tab(l_index_update));
7527 END IF;
7528 END IF;
7529 END IF;
7530 ELSE -- (NOT l_delivery_was_empty)
7531
7532 OPEN c_get_tare_weight(l_contlist1(l_index));
7533 FETCH c_get_tare_weight INTO l_tare_weight;
7534
7535 IF c_get_tare_weight%NOTFOUND THEN
7536 --{
7537 IF l_debug_on THEN
7538 WSH_DEBUG_SV.log(l_module_name,'No data for c_get_tare_weight', l_contlist1(l_index));
7539 END IF;
7540 CLOSE c_get_tare_weight;
7541 raise FND_API.G_EXC_ERROR;
7542 END IF;
7543 CLOSE c_get_tare_weight;
7544
7545 IF (l_debug_on) THEN
7546 WSH_DEBUG_SV.logmsg(l_module_name, 'Delivery was not empty');
7547 WSH_DEBUG_SV.log(l_module_name,'l_dellist1', l_dellist1(l_index));
7548 WSH_DEBUG_SV.log(l_module_name,'l_contlist1', l_contlist1(l_index));
7549 WSH_DEBUG_SV.log(l_module_name,'l_tare_weight', l_tare_weight);
7550 END IF;
7551
7552 IF (l_tare_weight <> 0) THEN
7553 -- do not update if assign/unassign 0/NULL
7554 -- weight line/LPN to nonempty delivery
7555 l_index_update := l_index_update + 1;
7556 l_delivery_id_tab(l_index_update) := l_dellist1(l_index);
7557 l_interface_flag_tab(l_index_update) := NULL;
7558 --setting this flag here to null so that
7559 -- the update_tms_interface_flag procedure will take care of it.
7560 END IF;
7561 END IF;
7562 END IF;
7563 l_index := l_dellist1.NEXT(l_index);
7567 WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG(
7564 END LOOP;
7565
7566 IF (l_index_update > 0) THEN
7568 p_delivery_id_tab => l_delivery_id_tab,
7569 p_tms_interface_flag_tab => l_interface_flag_tab,
7570 x_return_status => l_return_status);
7571
7572 IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR, WSH_UTIL_CORE.G_RET_STS_ERROR)) THEN
7573 IF l_debug_on THEN
7574 WSH_DEBUG_SV.logmsg(l_module_name,'Error in WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG '||l_return_status);
7575 END IF;
7576 raise FND_API.G_EXC_ERROR;
7577 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
7578 IF l_debug_on THEN
7579 WSH_DEBUG_SV.logmsg(l_module_name,'Warning in WSH_NEW_DELIVERIES_PVT.UPDATE_TMS_INTERFACE_FLAG '||l_return_status);
7580 END IF;
7581 cont_warn := cont_warn + 1;
7582 END IF;
7583
7584 END IF;
7585 END IF;
7586 -- End of OTM R12 : assign delivery detail
7587
7588 l_mdc_id_tab.delete;
7589 l_mdc_index_i := l_contlist1.FIRST;
7590 l_mdc_index_j := 0;
7591 WHILE l_mdc_index_i IS NOT NULL LOOP
7592 l_mdc_index_j := l_mdc_index_j + 1;
7593 l_mdc_id_tab(l_mdc_index_j) := l_contlist1(l_mdc_index_i);
7594 l_mdc_index_i := l_contlist1.next(l_mdc_index_i);
7595
7596 END LOOP;
7597
7598 WSH_DELIVERY_DETAILS_ACTIONS.Create_Consol_Record(
7599 p_detail_id_tab => l_mdc_id_tab,
7600 x_return_status => x_return_status);
7601
7602 IF (x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
7603 IF l_debug_on THEN
7604 WSH_DEBUG_SV.log(l_module_name,'Return Status',x_return_status);
7605 WSH_DEBUG_SV.pop(l_module_name);
7606 END IF;
7607 RETURN;
7608 END IF;
7609
7610 -- J: W/V Changes
7611 IF l_debug_on THEN
7612 WSH_DEBUG_SV.log(l_module_name,'before W/V adjustment 3 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7613 END IF;
7614 FOR i in 1..l_contlist1.COUNT LOOP
7615 IF l_debug_on THEN
7616 WSH_DEBUG_SV.logmsg(l_module_name,'Cont:Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
7617 END IF;
7618
7619 WSH_WV_UTILS.DD_WV_Post_Process(
7620 p_delivery_detail_id => l_contlist1(i),
7621 p_diff_gross_wt => l_cont_Wtlist(i),
7622 p_diff_net_wt => NULL,
7623 p_diff_volume => l_cont_Vollist(i),
7624 p_diff_fill_volume => l_cont_Vollist(i),
7625 x_return_status => l_return_status);
7626
7627 IF (l_return_status <> C_SUCCESS_STATUS) THEN
7628 --
7629 IF (l_return_status = C_ERROR_STATUS OR
7630 l_return_status = C_UNEXP_ERROR_STATUS) THEN
7631 error_cnt := error_cnt + 1;
7632 ELSE
7633 cont_warn := cont_warn + 1;
7634 END IF;
7635
7636 END IF;
7637 END LOOP;
7638 IF l_debug_on THEN
7639 WSH_DEBUG_SV.log(l_module_name,'after W/V adjustment 3 '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
7640 END IF;
7641
7642 -- 75.1 Bulk Update Weight/Volume on packed delivery details
7643 -- added the WHO columns in the UPDATE
7644 -- in WSHWVUTB.pls , update_container_wt there are no WHO columns
7645 FORALL cnt IN 1..g_assign_detail_tab.COUNT
7646 UPDATE WSH_DELIVERY_DETAILS
7647 SET NET_WEIGHT = l_NetWtlist(cnt),
7648 GROSS_WEIGHT = l_GrossWtlist(cnt),
7649 VOLUME = l_Vollist(cnt),
7650 last_update_date = SYSDATE,
7651 last_updated_by = FND_GLOBAL.USER_ID,
7652 last_update_login = FND_GLOBAL.LOGIN_ID
7653 WHERE DELIVERY_DETAIL_ID = l_ddlist(cnt);
7654
7655 END IF; -- line_cont_tab.COUNT > 0
7656
7657 --H integration : Pricing Integration
7658 IF l_del_tab.count > 0 THEN
7659 IF l_debug_on THEN
7660 WSH_DEBUG_SV.logmsg(l_module_name,'Calling Program Unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
7661 END IF;
7662 WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required
7663 (p_entity_type => 'DELIVERY',
7664 p_entity_ids => l_del_tab,
7665 x_return_status => l_return_status
7666 );
7667 IF l_debug_on THEN
7668 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
7669 END IF;
7670 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
7671 RAISE mark_reprice_error;
7672 END IF;
7673 END IF;
7674 -- End of H integration : Pricing Integration
7675
7676 --dbms_output.put_line('AFTER CONT WT'||to_char(sysdate,'HH24:MI:SS'));
7677 -- 90.1 Summarize errors/warnings
7678
7679 IF l_debug_on THEN
7680 WSH_DEBUG_SV.logmsg(l_module_name,'Error, warn,success Count -'||error_cnt||','||warn_cnt||','||succ_cnt);
7681 END IF;
7682 IF (warn_cnt > 0 OR cont_warn > 0) THEN
7683 x_return_status := C_WARNING_STATUS;
7684 IF cont_warn > 0 THEN
7685 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_PACK_WARN');
7686 FND_MESSAGE.SET_TOKEN('CONT_WARN',cont_warn);
7687 FND_MESSAGE.SET_TOKEN('CONT_ERR',0);
7688 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7689 END IF;
7690 ELSIF (error_cnt > 0) THEN
7691 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_PACK_ERROR');
7692 FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
7693 FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
7697 ELSE
7694 FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
7695 IF succ_cnt > 0 THEN
7696 x_return_status := C_WARNING_STATUS;
7698 x_return_status := C_ERROR_STATUS;
7699 END IF;
7700 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7701 ELSE
7702 x_return_status := C_SUCCESS_STATUS;
7703 END IF;
7704
7705 IF l_debug_on THEN
7706 WSH_DEBUG_SV.logmsg(l_module_name,'L ret status -'||l_return_status);
7707 WSH_DEBUG_SV.logmsg(l_module_name,'X ret status -'||x_return_status);
7708 END IF;
7709 IF x_return_status = C_ERROR_STATUS THEN
7710 IF p_pack_cont_flag = 'Y' THEN
7711 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MASTER_NOT_PACK');
7712 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7713 END IF;
7714 --
7715 IF l_debug_on THEN
7716 WSH_DEBUG_SV.pop(l_module_name);
7717 END IF;
7718 --
7719 return;
7720 ELSE
7721 l_return_status := x_return_status;
7722 END IF;
7723
7724 IF l_debug_on THEN
7725 WSH_DEBUG_SV.logmsg(l_module_name,'2L ret status -'||l_return_status);
7726 WSH_DEBUG_SV.logmsg(l_module_name,'2X ret status -'||x_return_status);
7727 END IF;
7728 -- 100.1 Call WSH_CONTAINER_ACTIONS.Auto_Pack_Conts depending on
7729 -- p_pack_cont_flag and if new detail containers are created
7730 IF l_detail_cont_tab.count > 0 AND p_pack_cont_flag = 'Y' THEN
7731
7732 l_group_id_tab.delete;
7733
7734 --dbms_output.put_line('Calling AUTO PACK CONTS With x_cont_instance count of ' || x_cont_instance_tab.count);
7735 --
7736 IF l_debug_on THEN
7737 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.AUTO_PACK_CONTS',WSH_DEBUG_SV.C_PROC_LEVEL);
7738 END IF;
7739 --
7740 wsh_container_actions.Auto_Pack_Conts (
7741 l_group_id_tab,
7742 l_detail_cont_tab,
7743 x_cont_instance_tab,
7744 l_mast_cont_tab,
7745 l_return_status);
7746
7747 IF l_debug_on THEN
7748 WSH_DEBUG_SV.log(l_module_name,'return status -',l_return_status);
7749 END IF;
7750 IF l_return_status = C_UNEXP_ERROR_STATUS THEN
7751 --dbms_output.put_line('Returned from autopack conts with unexpected error');
7752 /* No message WSH_CONT_CONT_AUTOPACK_ERR
7753 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CONT_AUTOPACK_ERR');
7754 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
7755 IF l_return_status <> C_ERROR_STATUS THEN
7756 l_return_status := C_WARNING_STATUS;
7757 END IF;
7758 */
7759 x_return_status := l_return_status;
7760 --
7761 IF l_debug_on THEN
7762 WSH_DEBUG_SV.pop(l_module_name);
7763 END IF;
7764 --
7765 RETURN;
7766 ELSE
7767 IF l_return_status <> C_SUCCESS_STATUS THEN
7768 x_return_status := C_WARNING_STATUS;
7769 END IF;
7770 END IF;
7771
7772 --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Auto_Pack_Conts created '||l_mast_cont_tab.COUNT||' Master Containers');
7773 IF l_mast_cont_tab.COUNT > 0 THEN
7774 i := 1;
7775 cnt := x_cont_instance_tab.COUNT;
7776 WHILE i <= l_mast_cont_tab.COUNT LOOP
7777 cnt := cnt + 1;
7778 x_cont_instance_tab(cnt) := l_mast_cont_tab(i);
7779 i := i + 1;
7780 END LOOP;
7781 END IF;
7782
7783 END IF;
7784
7785 IF l_debug_on THEN
7786 WSH_DEBUG_SV.logmsg(l_module_name,'3L ret status -'||l_return_status);
7787 WSH_DEBUG_SV.logmsg(l_module_name,'3X ret status -'||x_return_status);
7788 END IF;
7789 IF l_debug_on THEN
7790 WSH_DEBUG_SV.pop(l_module_name);
7791 END IF;
7792 --
7793 EXCEPTION
7794
7795 WHEN mark_reprice_error THEN
7796 FND_MESSAGE.Set_Name('WSH','WSH_REPRICE_REQD_ERR');
7797 x_return_status := l_return_status;
7798 WSH_UTIL_CORE.add_message(x_return_status,l_module_name);
7799 IF l_debug_on THEN
7800 WSH_DEBUG_SV.logmsg(l_module_name,'MARK_REPRICE_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
7801 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:MARK_REPRICE_ERROR');
7802 END IF;
7803
7804 -- OTM R12 : assign delivery detail
7805 WHEN FND_API.G_EXC_ERROR THEN
7806 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7807 IF c_get_plan_and_tms_flag%ISOPEN THEN
7808 CLOSE c_get_plan_and_tms_flag;
7809 END IF;
7810 IF c_get_tare_weight%ISOPEN THEN
7811 CLOSE c_get_tare_weight;
7812 END IF;
7813
7814 --
7815 IF l_debug_on THEN
7816 WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
7817 WSH_DEBUG_SV.pop(l_module_name);
7818 END IF;
7819 --
7820 RETURN;
7821 -- End of OTM R12 : assign delivery detail
7822
7823 WHEN Others THEN
7824 -- OTM R12 : assign delivery detail
7825 IF c_get_plan_and_tms_flag%ISOPEN THEN
7826 CLOSE c_get_plan_and_tms_flag;
7827 END IF;
7828 IF c_get_tare_weight%ISOPEN THEN
7829 CLOSE c_get_tare_weight;
7830 END IF;
7831 -- End of OTM R12 : assign delivery detail
7832
7833 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Auto_Pack_Lines',l_module_name);
7834 x_return_status := C_UNEXP_ERROR_STATUS;
7835
7836 --
7837 IF l_debug_on THEN
7841 --
7838 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
7839 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
7840 END IF;
7842 END Auto_Pack_Lines;
7843
7844 /*
7845 -----------------------------------------------------------------------------
7846 PROCEDURE : Auto_Pack_Delivery
7847 PARAMETERS : p_delivery_tab - table of delivery ids that need to be
7848 autopacked.
7849 x_cont_instance_tab - table of container instance ids that were
7850 created during the autopacking.
7851 x_return_status - return status of API.
7852 DESCRIPTION : This procedure takes a table of deliveries that need to be
7853 autopacked and checks for all unpacked lines in each of the
7854 deliveries. After fetching all unpacked lines in each delivery,
7855 it calls the Auto_Pack_Lines with the table of unpacked lines.
7856 After autopacking the lines, it recalculates the weight and
7857 volume of the delivery.
7858 ------------------------------------------------------------------------------
7859 */
7860
7861
7862 PROCEDURE Auto_Pack_Delivery (
7863 p_delivery_tab IN WSH_UTIL_CORE.id_tab_type,
7864 p_pack_cont_flag IN VARCHAR2,
7865 x_cont_instance_tab OUT NOCOPY WSH_UTIL_CORE.id_tab_type,
7866 x_return_status OUT NOCOPY VARCHAR2) IS
7867
7868 CURSOR get_delivery_wms(x_delivery_id NUMBER) IS
7869 SELECT mp.wms_enabled_flag
7870 FROM wsh_new_deliveries wnd,
7871 mtl_parameters mp
7872 WHERE wnd.delivery_id = x_delivery_id
7873 AND mp.organization_id = wnd.organization_id;
7874
7875
7876 CURSOR Get_Delivery_Lines (v_delivery_id NUMBER) IS
7877 SELECT wda.delivery_detail_id
7878 FROM wsh_delivery_assignments_v wda,
7879 WSH_DELIVERY_DETAILS wdd
7880 WHERE wda.delivery_id = v_delivery_id
7881 AND wda.delivery_id IS NOT NULL
7882 AND wda.parent_delivery_detail_id IS NULL
7883 AND wda.delivery_detail_id = wdd.delivery_detail_id
7884 AND wdd.container_flag = 'N';
7885
7886 l_del_detail_tab WSH_UTIL_CORE.id_tab_type;
7887 l_group_id_tab WSH_UTIL_CORE.id_tab_type;
7888
7889 l_gross_weight NUMBER;
7890 l_volume NUMBER;
7891
7892 l_cont_instance_tab WSH_UTIL_CORE.id_tab_type;
7893
7894 l_ret_sts VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
7895 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
7896
7897 error_cnt NUMBER := 0;
7898 warn_cnt NUMBER := 0;
7899 succ_cnt NUMBER := 0;
7900
7901 i NUMBER;
7902 m NUMBER := 0;
7903 l_del_rows WSH_UTIL_CORE.id_tab_type;
7904
7905 l_del_name VARCHAR2(30);
7906 l_wms_count NUMBER := 0;
7907 l_wms_enabled_flag VARCHAR2(1);
7908
7909 -- LPN CONV. rv
7910 l_lpn_in_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_in_rec_type;
7911 l_lpn_out_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_out_rec_type;
7912 l_msg_count NUMBER;
7913 l_msg_data VARCHAR2(32767);
7914 e_return_excp EXCEPTION;
7915 -- LPN CONV. rv
7916
7917
7918 --
7919 l_debug_on BOOLEAN;
7920 --
7921 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'AUTO_PACK_DELIVERY';
7922 --
7923 BEGIN
7924 --
7925 --
7926 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
7927 --
7928 IF l_debug_on IS NULL
7929 THEN
7930 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
7931 END IF;
7932 --
7933 IF l_debug_on THEN
7934 WSH_DEBUG_SV.push(l_module_name);
7935 --
7936 WSH_DEBUG_SV.log(l_module_name,'P_PACK_CONT_FLAG',P_PACK_CONT_FLAG);
7937 END IF;
7938 --
7939 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
7940
7941 l_del_rows.delete;
7942
7943 FOR j IN 1..p_delivery_tab.count LOOP
7944
7945 i := 1;
7946 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
7947 l_del_detail_tab.delete;
7948
7949 IF l_debug_on THEN
7950 WSH_DEBUG_SV.log(l_module_name,'Auto pack delivery ', p_delivery_tab(j));
7951 END IF;
7952 -- bug 1578527: disallow packing actions in WMS
7953
7954 OPEN get_delivery_wms(p_delivery_tab(j));
7955 FETCH get_delivery_wms INTO l_wms_enabled_flag;
7956 IF get_delivery_wms%NOTFOUND THEN
7957 CLOSE get_delivery_wms;
7958 FND_MESSAGE.SET_NAME('WSH', 'WSH_NO_DATA_FOUND');
7959 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7960 --
7961 --IF l_debug_on THEN
7962 --WSH_DEBUG_SV.pop(l_module_name);
7963 --END IF;
7964 --
7965 --RETURN; LPN CONV. rv
7966 raise e_return_excp; -- LPN CONV. rv
7967 END IF;
7968 CLOSE get_delivery_wms;
7969
7970 IF l_wms_enabled_flag = 'Y' THEN
7971 l_wms_count := l_wms_count + 1;
7972 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
7973 goto next_delivery_to_autopack;
7974 END IF;
7975
7976 FOR d IN Get_Delivery_Lines (p_delivery_tab(j)) LOOP
7977
7978 l_del_detail_tab(i) := d.delivery_detail_id;
7979 IF l_debug_on THEN
7980 WSH_DEBUG_SV.log(l_module_name,'pupulate delivery detail id ', d.delivery_detail_id );
7981 END IF;
7982 i := i + 1;
7983
7984 END LOOP;
7985
7986 IF Get_Delivery_Lines%ISOPEN THEN
7990 WSH_DEBUG_SV.log(l_module_name,'l_del_detail_tab.count: ', l_del_detail_tab.count );
7987 CLOSE Get_Delivery_Lines;
7988 END IF;
7989 IF l_debug_on THEN
7991 END IF;
7992 IF l_del_detail_tab.count = 0 THEN
7993
7994 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
7995
7996 FND_MESSAGE.SET_NAME('WSH','WSH_DEL_AUTOPACK_NULL');
7997 --
7998 IF l_debug_on THEN
7999 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.GET_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
8000 END IF;
8001 --
8002 l_del_name := WSH_NEW_DELIVERIES_PVT.Get_Name(p_delivery_tab(j));
8003 FND_MESSAGE.SET_TOKEN('DEL_NAME',l_del_name);
8004 WSH_UTIL_CORE.Add_Message(l_ret_sts,l_module_name);
8005 ELSE
8006
8007 --
8008 IF l_debug_on THEN
8009 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.AUTO_PACK_LINES',WSH_DEBUG_SV.C_PROC_LEVEL);
8010 END IF;
8011 --
8012
8013 wsh_container_actions.Auto_Pack_Lines (
8014 l_group_id_tab,
8015 l_del_detail_tab,
8016 p_pack_cont_flag,
8017 l_cont_instance_tab,
8018 l_return_status);
8019
8020 IF l_debug_on THEN
8021 WSH_DEBUG_SV.log(l_module_name,'Return status from wsh_container_actions.Auto_Pack_Lines -',l_return_status);
8022 END IF;
8023 IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR OR l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR) THEN
8024 --dbms_output.put_line('autopack lines failed');
8025 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_ERROR;
8026 ELSE
8027 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
8028 l_ret_sts := WSH_UTIL_CORE.G_RET_STS_WARNING;
8029 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN -- Bug#2903864 - Start
8030 IF (x_cont_instance_tab IS NULL) THEN
8031 x_cont_instance_tab := l_cont_instance_tab;
8032 ELSE
8033 FOR i in 1..l_cont_instance_tab.count LOOP
8034 x_cont_instance_tab(x_cont_instance_tab.count + 1) := l_cont_instance_tab(i);
8035 END LOOP;
8036 END IF; -- Bug#2903864 - End
8037
8038 END IF;
8039
8040 END IF;
8041
8042 END IF;
8043 <<next_delivery_to_autopack>>
8044 IF l_debug_on THEN
8045 WSH_DEBUG_SV.log(l_module_name,'return status for delivery '|| p_delivery_tab(j), l_ret_sts );
8046 END IF;
8047 IF l_ret_sts = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8048 succ_cnt := succ_cnt + 1;
8049 ELSIF l_ret_sts = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
8050 warn_cnt := warn_cnt + 1;
8051 ELSE
8052 error_cnt := error_cnt + 1;
8053 END IF;
8054 END LOOP;
8055
8056 -- bug 1578527: disallow packing actions in WMS
8057 IF l_wms_count > 0 THEN
8058 IF l_wms_count = p_delivery_tab.count THEN
8059 FND_MESSAGE.SET_NAME('WSH', 'WSH_WMS_PACK_NOT_ALLOWED');
8060 WSH_UTIL_CORE.Add_message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
8061 ELSE
8062 FND_MESSAGE.SET_NAME('WSH', 'WSH_WMS_RECORDS_NOT_PACKED');
8063 FND_MESSAGE.SET_TOKEN('COUNT', l_wms_count);
8064 WSH_UTIL_CORE.Add_message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
8065 END IF;
8066 END IF;
8067
8068 /* H integration: Pricing integration csun
8069 when plan a delivery
8070 */
8071 IF l_del_rows.count > 0 THEN
8072 --
8073 IF l_debug_on THEN
8074 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
8075 END IF;
8076 --
8077 WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
8078 p_entity_type => 'DELIVERY',
8079 p_entity_ids => l_del_rows,
8080 x_return_status => l_return_status);
8081
8082 IF l_debug_on THEN
8083 WSH_DEBUG_SV.log(l_module_name,'Return status from WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required -',l_return_status);
8084 END IF;
8085 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR OR
8086 l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
8087 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8088 FND_MESSAGE.SET_NAME('WSH', 'WSH_REPRICE_REQUIRED_ERR');
8089 WSH_UTIL_CORE.add_message(x_return_status,l_module_name);
8090 --IF l_debug_on THEN
8091 -- WSH_DEBUG_SV.pop(l_module_name);
8092 --END IF;
8093 --return; LPN CONV. rv
8094 raise e_return_excp; -- LPN CONV. rv
8095 END IF;
8096 END IF;
8097
8098 -- LPN CONV. rv
8099 --
8100 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8101 THEN
8102 --{
8103
8104 IF l_debug_on THEN
8105 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
8106 END IF;
8107 --
8108 WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8109 (
8110 p_in_rec => l_lpn_in_sync_comm_rec,
8111 x_return_status => l_return_status,
8112 x_out_rec => l_lpn_out_sync_comm_rec
8113 );
8114 --
8115 IF l_debug_on THEN
8116 WSH_DEBUG_SV.log(l_module_name, 'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
8117 END IF;
8118 --
8119 WSH_UTIL_CORE.API_POST_CALL
8120 (
8124 p_raise_error_flag => false
8121 p_return_status => l_return_status,
8122 x_num_warnings => warn_cnt,
8123 x_num_errors => error_cnt,
8125 );
8126 --}
8127 END IF;
8128 -- LPN CONV. rv
8129 --
8130
8131 IF warn_cnt > 0 THEN
8132 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8133 FND_MESSAGE.SET_NAME('WSH','WSH_DEL_PACK_WARN');
8134 FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
8135 FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
8136 FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
8137 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8138
8139 ELSIF error_cnt > 0 THEN
8140 IF succ_cnt > 0 THEN
8141 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8142 FND_MESSAGE.SET_NAME('WSH','WSH_DEL_PACK_WARN');
8143 FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
8144 FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
8145 FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
8146 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8147 ELSE
8148 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8149 FND_MESSAGE.SET_NAME('WSH','WSH_DEL_PACK_ERROR');
8150 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8151 END IF;
8152 ELSIF succ_cnt > 0 THEN
8153 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8154 ELSE
8155 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8156 END IF;
8157
8158 IF l_debug_on THEN
8159 WSH_DEBUG_SV.pop(l_module_name);
8160 END IF;
8161
8162 EXCEPTION
8163 -- LPN CONV. rv
8164 WHEN e_return_excp THEN
8165 --
8166 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8167 THEN
8168 --{
8169 --
8170 IF l_debug_on THEN
8171 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
8172 END IF;
8173 --
8174 WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8175 (
8176 p_in_rec => l_lpn_in_sync_comm_rec,
8177 x_return_status => l_return_status,
8178 x_out_rec => l_lpn_out_sync_comm_rec
8179 );
8180 --
8181 IF l_debug_on THEN
8182 WSH_DEBUG_SV.log(l_module_name, 'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
8183 END IF;
8184 IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR,WSH_UTIL_CORE.G_RET_STS_ERROR) AND x_return_status <> WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
8185 x_return_status := l_return_status;
8186 END IF;
8187 --}
8188 END IF;
8189 --
8190 -- LPN CONV. rv
8191 --
8192 IF l_debug_on THEN
8193 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:E_RETURN_EXCP');
8194 END IF;
8195
8196 WHEN Others THEN
8197 --
8198 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Auto_Pack_Delivery',l_module_name);
8199 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8200
8201 IF l_debug_on THEN
8202 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS FROM WHEN OTHERS',WSH_DEBUG_SV.C_PROC_LEVEL);
8203 END IF;
8204 --
8205 IF l_debug_on THEN
8206 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS FROM WHEN OTHERS',WSH_DEBUG_SV.C_PROC_LEVEL);
8207 END IF;
8208 --
8209 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
8210 THEN
8211 --{
8212 --
8213 IF l_debug_on THEN
8214 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
8215 END IF;
8216 --
8217 WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
8218 (
8219 p_in_rec => l_lpn_in_sync_comm_rec,
8220 x_return_status => l_return_status,
8221 x_out_rec => l_lpn_out_sync_comm_rec
8222 );
8223 --
8224 IF l_debug_on THEN
8225 WSH_DEBUG_SV.log(l_module_name, 'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
8226 END IF;
8227 --}
8228 END IF;
8229 --
8230 -- LPN CONV. rv
8231 --
8232 IF l_debug_on THEN
8233 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
8234 END IF;
8235 END Auto_Pack_Delivery;
8236
8237
8238 /*
8239 -----------------------------------------------------------------------------
8240 PROCEDURE : Pack_Multi
8241 PARAMETERS : p_cont_tab - table of container instance ids that are being
8242 packed.
8243 p_del_detail_tab - table of unpacked delivery detail ids.
8244 p_pack_mode - indicates whether containers are packed in
8245 equal/proportional mode ('E') or in full/sequential mode ('F')
8246 p_split_pc - the percentage by which each line is going to be
8247 split in the case of equal packing mode.
8251 x_return_status - return status of API.
8248 x_pack_status - the packed status of containers after the multi
8249 pack is performed - indicates whether any underpacked or
8250 overpacked containers.
8252 DESCRIPTION : This procedure takes the specified delivery detail ids and
8253 packs them into the selected containers in either the full mode
8254 or equal mode. In the full mode, it packs the first container
8255 fully before packing the next. In the equal mode, all lines
8256 are split equally between all the containers and packed
8257 equally between them.
8258 ------------------------------------------------------------------------------
8259 */
8260
8261
8262 PROCEDURE Pack_Multi (
8263 p_cont_tab IN WSH_UTIL_CORE.id_tab_type,
8264 p_del_detail_tab IN WSH_UTIL_CORE.id_tab_type,
8265 p_pack_mode IN VARCHAR2,
8266 p_split_pc IN NUMBER,
8267 x_pack_status OUT NOCOPY VARCHAR2,
8268 x_return_status OUT NOCOPY VARCHAR2) IS
8269
8270
8271 CURSOR Get_Cont_Info (v_cont_instance_id NUMBER) IS
8272 SELECT inventory_item_id, organization_id, gross_weight, net_weight,
8273 volume, weight_uom_code, volume_uom_code, fill_percent,
8274 minimum_fill_percent, maximum_load_weight, maximum_volume
8275 FROM wsh_delivery_details
8276 WHERE delivery_detail_id = v_cont_instance_id
8277 AND container_flag = 'Y';
8278
8279 CURSOR Get_Detail_Info (v_del_detail_id NUMBER) IS
8280 SELECT inventory_item_id, nvl(shipped_quantity, NVL(picked_quantity, requested_quantity)) pack_qty,
8281 requested_quantity_uom, net_weight, volume,
8282 weight_uom_code, volume_uom_code, organization_id,
8283 nvl(detail_container_item_id, master_container_item_id) cont_item_id,
8284 nvl(shipped_quantity2, NVL(picked_quantity2, requested_quantity2)) pack_qty2
8285 FROM wsh_delivery_details
8286 WHERE delivery_detail_id = v_del_detail_id
8287 AND container_flag = 'N';
8288
8289 TYPE Cont_Rec IS RECORD (container_instance_id NUMBER, pack_status VARCHAR2(30));
8290
8291 TYPE Detail_Rec IS RECORD (delivery_detail_id NUMBER, pack_status VARCHAR2(30));
8292
8293 TYPE Cont_Rec_Table IS TABLE OF Cont_Rec INDEX BY BINARY_INTEGER;
8294 TYPE Detail_Rec_Table IS TABLE OF Detail_Rec INDEX BY BINARY_INTEGER;
8295
8296 l_cont_item_id NUMBER;
8297 l_cont_org_id NUMBER;
8298 l_cont_gross NUMBER;
8299 l_cont_net NUMBER;
8300 l_cont_volume NUMBER;
8301 l_cont_wt_uom VARCHAR2(3);
8302 l_cont_vol_uom VARCHAR2(3);
8303 l_cont_fill_pc NUMBER;
8304 l_cont_min_fill_pc NUMBER;
8305 l_cont_max_load_wt NUMBER;
8306 l_cont_max_vol NUMBER;
8307
8308 l_det_inv_item_id NUMBER;
8309 l_det_pack_qty NUMBER;
8310 l_det_pack_qty2 NUMBER;
8311 l_det_qty_uom VARCHAR2(3);
8312 l_det_net NUMBER;
8313 l_det_volume NUMBER;
8314 l_det_wt_uom VARCHAR2(3);
8315 l_det_vol_uom VARCHAR2(3);
8316 l_det_org_id NUMBER;
8317 l_det_cont_item_id NUMBER;
8318
8319 l_split_det_id NUMBER;
8320 i NUMBER;
8321 j NUMBER;
8322 cont_count NUMBER;
8323 det_count NUMBER;
8324 l_req_cont_num NUMBER;
8325 l_cont_avail_pc NUMBER;
8326 l_cont_self_tare NUMBER;
8327 l_split_qty NUMBER;
8328 l_split_qty2 NUMBER;
8329 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8330
8331 l_tmp_cont_gr NUMBER;
8332 l_tmp_cont_net NUMBER;
8333 l_tmp_cont_vol NUMBER;
8334 l_tmp_fill_pc NUMBER;
8335 l_pack_status VARCHAR2(30);
8336
8337 l_tmp_split_qty NUMBER;
8338
8339 l_tmp_det_net NUMBER;
8340 l_tmp_det_vol NUMBER;
8341
8342 l_det_pack_sts VARCHAR2(30);
8343
8344 l_tmp_det_tab WSH_UTIL_CORE.id_tab_type;
8345
8346 l_cont_tab Cont_Rec_Table;
8347 l_det_tab Detail_Rec_Table;
8348
8349 l_split_pc NUMBER;
8350
8351 l_tmp_det_qty NUMBER;
8352 l_tmp_det_count NUMBER;
8353
8354 l_tmp_delta NUMBER;
8355
8356 l_cont_name VARCHAR2(30);
8357
8358 warn_cnt NUMBER := 0;
8359 succ_cnt NUMBER := 0;
8360 error_cnt NUMBER := 0;
8361
8362 cont_warn NUMBER := 0;
8363 cont_err NUMBER := 0;
8364 cont_succ NUMBER := 0;
8365 l_tmp_return_status varchar2(1);
8366
8367 l_tmp_status VARCHAR2(30) := 'OK';
8368 l_discard_status VARCHAR2(1);
8369 l_discard_message VARCHAR2(2000);
8370 -- J: W/V Changes
8371 l_fill_status VARCHAR2(1);
8372
8373 /* H projects: pricing integration csun */
8374 m NUMBER := 0;
8375 l_detail_rows WSH_UTIL_CORE.id_tab_type;
8376
8377 -- for Load Tender
8378 l_trip_id_tab wsh_util_core.id_tab_type;
8379
8380 -- bug 3562797 jckwok
8381 l_process_flag VARCHAR2(1);
8382 l_fill_pc_basis VARCHAR2(1);
8383 -- end bug 3562797 jckwok
8384
8385 --
8386 l_debug_on BOOLEAN;
8387 --
8388 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'PACK_MULTI';
8389 --Bugfix 4070732
8390 l_api_session_name CONSTANT VARCHAR2(150) := G_PKG_NAME ||'.' || l_module_name;
8391 l_reset_flags BOOLEAN;
8392 l_num_errors NUMBER;
8393 --
8394 --
8395 l_num_warnings NUMBER;
8396 --
8397
8398 -- HW OPM BUG# 3011758
8399 --HW OPMCONV - Removed OPM local variables
8400
8401 -- HW OPMCONV - Renamed variable to l_lot_divisible_flag
8405
8402 l_lot_divisible_flag VARCHAR2(1);
8403 -- HW OPMCONV - New variable to hold item info
8404 l_item_info WSH_DELIVERY_DETAILS_INV.mtl_system_items_rec;
8406 -- LPN CONV. rv
8407 l_lpn_in_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_in_rec_type;
8408 l_lpn_out_sync_comm_rec WSH_GLBL_VAR_STRCT_GRP.lpn_sync_comm_out_rec_type;
8409 l_msg_count NUMBER;
8410 l_msg_data VARCHAR2(32767);
8411 e_return_excp EXCEPTION;
8412 -- LPN CONV. rv
8413
8414 BEGIN
8415 IF WSH_UTIL_CORE.G_START_OF_SESSION_API is null THEN --Bugfix 4070732
8416 WSH_UTIL_CORE.G_START_OF_SESSION_API := l_api_session_name;
8417 WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API := FALSE;
8418 END IF;
8419 --
8420 --
8421 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
8422 --
8423 IF l_debug_on IS NULL
8424 THEN
8425 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
8426 END IF;
8427 --
8428 IF l_debug_on THEN
8429 WSH_DEBUG_SV.push(l_module_name);
8430 --
8431 WSH_DEBUG_SV.log(l_module_name,'P_PACK_MODE',P_PACK_MODE);
8432 WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_PC',P_SPLIT_PC);
8433 END IF;
8434 --
8435 IF p_cont_tab.count = 0 OR p_del_detail_tab.count = 0 THEN
8436 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_ASSG_NULL');
8437 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8438 x_pack_status := 'Error';
8439 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
8440 --
8441 --Bugfix 4070732 {
8442 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
8443 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
8444 IF l_debug_on THEN
8445 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
8446 END IF;
8447
8448 WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags => TRUE,
8449 x_return_status => l_tmp_return_status);
8450
8451
8452 IF l_debug_on THEN
8453 WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
8454 END IF;
8455 /*wsh_util_core.api_post_call
8456 (
8457 p_return_status => l_return_status,
8458 x_num_warnings => l_num_warnings,
8459 x_num_errors => l_num_errors
8460 );
8461 */
8462 IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
8463 X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8464 END IF;
8465 END IF;
8466 END IF;
8467 --}
8468 --IF l_debug_on THEN
8469 -- WSH_DEBUG_SV.pop(l_module_name);
8470 --END IF;
8471 --
8472 --return; LPN CONV. rv
8473 raise e_return_excp; -- LPN CONV. rv
8474 END IF;
8475
8476 cont_count := p_cont_tab.count;
8477 det_count := p_del_detail_tab.count;
8478
8479 --dbms_output.put_line('in pack multi conts are ' || cont_count || ' details are ' || det_count);
8480
8481 FOR i IN 1..cont_count LOOP
8482
8483 l_cont_tab(i).container_instance_id := p_cont_tab(i);
8484 l_cont_tab(i).pack_status := 'Unpacked';
8485
8486 END LOOP;
8487
8488 --
8489 --
8490 -- added to fix bug 1818233.
8491 -- pack_multi performs most of time doing this check, especially
8492 -- when a single delivery line is being split into multiple due to
8493 -- container-load relationship.
8494 -- This check will be made only once for a delivery line in place of
8495 -- doing it every time we assign a split delivery line to a container.
8496 -- Thus, auto-pack lines will always call assign_detail procedure
8497 -- with parameter p_check_credit_holds = FALSE.
8498 -- pack_multi lines will explicitly call the procedure (as follows)
8499 -- WSH_DETAILS_VALIDATIONS.Check_Credit_Holds only once for a delivery
8500 -- line . If any of the delivery lines fails this check, API will
8501 -- return with error.
8502 --
8503
8504 FOR j IN 1..det_count LOOP
8505
8506 l_det_tab(j).delivery_detail_id := p_del_detail_tab(j);
8507 l_det_tab(j).pack_status := 'Unpacked';
8508
8509 --
8510 IF l_debug_on THEN
8511 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_CREDIT_HOLDS',WSH_DEBUG_SV.C_PROC_LEVEL);
8512 END IF;
8513 --
8514 WSH_DETAILS_VALIDATIONS.Check_Credit_Holds (
8515 l_det_tab(j).delivery_detail_id,
8516 'PACK',
8517 NULL,
8518 NULL,
8519 NULL,
8520 'Y',
8521 x_return_status);
8522 IF l_debug_on THEN
8523 WSH_DEBUG_SV.log(l_module_name,'return status-', x_return_status);
8524 END IF;
8525
8526 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8527 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8528 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DETAIL_NOT_ASSIGNED');
8529 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
8533
8530 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
8531 x_pack_status := 'Error';
8532 END IF;
8534 END LOOP;
8535
8536 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR
8537 THEN
8538 --Bugfix 4070732 {
8539 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
8540 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
8541 IF l_debug_on THEN
8542 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
8543 END IF;
8544
8545 WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags => TRUE,
8546 x_return_status => l_tmp_return_status);
8547
8548 IF l_debug_on THEN
8549 WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
8550 END IF;
8551
8552 /* wsh_util_core.api_post_call
8553 (
8554 p_return_status => l_return_status,
8555 x_num_warnings => l_num_warnings,
8556 x_num_errors => l_num_errors
8557 );
8558 */
8559
8560 IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
8561 X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8562 END IF;
8563 END IF;
8564 END IF;
8565 --}
8566 --
8567 --IF l_debug_on THEN
8568 -- WSH_DEBUG_SV.pop(l_module_name);
8569 --END IF;
8570 --
8571 --RETURN; LPN CONV. rv
8572 raise e_return_excp; -- LPN CONV. rv
8573 END IF;
8574
8575 i := 1;
8576 j := 1;
8577
8578 IF p_pack_mode = 'F' THEN
8579 -- packing mode is full - each container is filled before packing the next
8580
8581 WHILE j <= det_count LOOP
8582
8583 --dbms_output.put_line('j = ' || j);
8584 l_det_pack_sts := 'Unpacked';
8585 i := 1;
8586
8587 IF l_debug_on THEN
8588 WSH_DEBUG_SV.log(l_module_name,'processing line ' || j || ' detail is ' || l_det_tab(j).delivery_detail_id);
8589 END IF;
8590
8591 WHILE i <= cont_count LOOP
8592 IF l_cont_tab(i).pack_status = 'Skipped' THEN
8593 l_cont_tab(i).pack_status := 'Unpacked';
8594 END IF;
8595 i := i + 1;
8596 END LOOP;
8597
8598 i := 1;
8599
8600 WHILE (i <= cont_count AND l_det_pack_sts = 'Unpacked') LOOP
8601
8602 /*
8603 if i <= 0 or i > 10 then
8604 exit;
8605 end if;
8606 */
8607
8608 OPEN Get_Detail_Info (l_det_tab(j).delivery_detail_id);
8609
8610 FETCH Get_Detail_Info INTO
8611 l_det_inv_item_id,
8612 l_det_pack_qty,
8613 l_det_qty_uom,
8614 l_det_net,
8615 l_det_volume,
8616 l_det_wt_uom,
8617 l_det_vol_uom,
8618 l_det_org_id,
8619 l_det_cont_item_id,
8620 l_det_pack_qty2;
8621
8622 IF Get_Detail_Info%NOTFOUND THEN
8623 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
8624 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
8625 x_pack_status := 'Error';
8626 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8627 CLOSE Get_Detail_Info;
8628 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
8629 error_cnt := error_cnt + 1;
8630 l_det_tab(j).pack_status := 'Error';
8631 exit;
8632 END IF;
8633
8634 IF Get_Detail_Info%ISOPEN THEN
8635 CLOSE Get_Detail_Info;
8636 END IF;
8637
8638 -- bug 3562797 jckwok
8639 -- when percent fill basis flag is None and packing mode as Full,
8640 -- packing workbench raises error.
8641 Calc_Fill_Basis_and_Proc_Flag(
8642 p_organization_id => l_det_org_id,
8643 x_return_status => x_return_status,
8644 x_fill_basis => l_fill_pc_basis,
8645 x_process_flag => l_process_flag);
8646
8647 IF l_debug_on THEN
8648 WSH_DEBUG_SV.log(l_module_name,'return status -',x_return_status);
8649 END IF;
8650
8651 IF (x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
8652 --Bugfix 4070732 {
8653 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
8654 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
8655 IF l_debug_on THEN
8656 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
8657 END IF;
8658
8659 WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags => TRUE,
8660 x_return_status => l_tmp_return_status);
8661
8662
8663 IF l_debug_on THEN
8664 WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
8665 END IF;
8666
8667 /*wsh_util_core.api_post_call
8668 (
8669 p_return_status => l_return_status,
8670 x_num_warnings => l_num_warnings,
8674
8671 x_num_errors => l_num_errors
8672 );
8673 */
8675 IF
8676 (l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
8677 OR
8678 (x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
8679 THEN --{
8680 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8681 ELSIF x_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR
8682 THEN
8683 IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR
8684 THEN
8685 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8686 ELSIF l_tmp_return_status =
8687 WSH_UTIL_CORE.G_RET_STS_WARNING THEN
8688 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8689 END IF;
8690 END IF; --}
8691
8692 END IF;
8693 END IF;
8694 --}
8695 --IF l_debug_on THEN
8696 -- WSH_DEBUG_SV.pop(l_module_name);
8697 --END IF;
8698 --RETURN;
8699 raise e_return_excp; -- LPN CONV. rv
8700 END IF;
8701 IF (l_fill_pc_basis = 'N') THEN
8702 FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
8703 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8704 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
8705 x_pack_status := 'Error';
8706 error_cnt := error_cnt + 1;
8707 l_det_tab(j).pack_status := 'Error';
8708 exit;
8709 END IF;
8710 -- end bug 3562797 jckwok
8711 --- HW OPM BUG# 3011758
8712 -- HW OPMCONV - 1) Removed branching code
8713 -- - 2) Removed call to OPM API to get item info
8714 -- - 3) New WSH API call to get item info
8715
8716 WSH_DELIVERY_DETAILS_INV.Get_item_information
8717 (
8718 p_organization_id =>l_det_org_id
8719 , p_inventory_item_id => l_det_inv_item_id
8720 , x_mtl_system_items_rec => l_item_info
8721 , x_return_status => l_return_status
8722 );
8723
8724 wsh_util_core.api_post_call
8725 (
8726 p_return_status => l_return_status,
8727 x_num_warnings => l_num_warnings,
8728 x_num_errors => l_num_errors
8729 );
8730
8731 -- HW OPMCONV - Get flag from correct record
8732 IF ( l_item_info.lot_divisible_flag = 'N' AND
8733 l_item_info.lot_control_code = 2 ) THEN
8734 l_lot_divisible_flag := 'N';
8735 ELSE
8736 l_lot_divisible_flag := 'Y';
8737 END IF;
8738
8739 --dbms_output.put_line('before checking for unpacked conts ' || i || l_cont_tab(i).pack_status);
8740
8741
8742 WHILE (i <= cont_count and l_cont_tab(i).pack_status <> 'Unpacked') LOOP
8743 i := i + 1;
8744
8745 END LOOP;
8746
8747 --dbms_output.put_line('after looping for unpacked conts i = ' || i);
8748
8749 IF i > cont_count THEN
8750 exit;
8751 END IF;
8752
8753 OPEN Get_Cont_Info (l_cont_tab(i).container_instance_id);
8754
8755 FETCH Get_Cont_Info INTO
8756 l_cont_item_id,
8757 l_cont_org_id,
8758 l_cont_gross,
8759 l_cont_net,
8760 l_cont_volume,
8761 l_cont_wt_uom,
8762 l_cont_vol_uom,
8763 l_cont_fill_pc,
8764 l_cont_min_fill_pc,
8765 l_cont_max_load_wt,
8766 l_cont_max_vol;
8767
8768 IF Get_Cont_Info%NOTFOUND THEN
8769 --
8770 IF l_debug_on THEN
8771 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
8772 END IF;
8773 --
8774 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
8775 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
8776 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
8777 x_pack_status := 'Error';
8778 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8779 CLOSE Get_Cont_Info;
8780 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
8781 cont_err := cont_err + 1;
8782 l_cont_tab(i).pack_status := 'Error';
8783 l_tmp_status := 'Error';
8784 GOTO new_container;
8785 END IF;
8786
8787 CLOSE Get_Cont_Info;
8788
8789 --dbms_output.put_line('processing container ' || i || ' id is ' || l_cont_tab(i).container_instance_id);
8790
8791 /*
8792 -- WSH_WV_UTILS.Container_Weight_Volume (
8793 -- replacing with TPA enabled API..
8794
8795 --
8796 IF l_debug_on THEN
8797 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
8798 END IF;
8799 --
8800 WSH_TPA_CONTAINER_PKG.Container_Weight_Volume (
8801 l_cont_tab(i).container_instance_id,
8802 'Y',
8803 l_tmp_cont_gr,
8804 l_tmp_cont_net,
8805 l_tmp_cont_vol,
8806 'Y',
8807 l_tmp_fill_pc,
8811 END IF;
8808 x_return_status);
8809 IF l_debug_on THEN
8810 WSH_DEBUG_SV.log(l_module_name,'return status ' ,x_return_status);
8812
8813 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8814 --dbms_output.put_line('container wt vol error');
8815
8816 l_cont_tab(i).pack_status := 'Warning';
8817 --
8818 IF l_debug_on THEN
8819 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
8820 END IF;
8821 --
8822 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
8823 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
8824 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
8825
8826
8827 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
8828 cont_warn := cont_warn + 1;
8829 l_tmp_status := 'Error';
8830 GOTO new_container;
8831 END IF;
8832
8833 IF (l_tmp_fill_pc > 100) THEN
8834 */
8835 IF (l_cont_fill_pc > 100) THEN
8836
8837 --dbms_output.put_line('cont overpacked');
8838
8839 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
8840 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8841 END IF;
8842
8843 l_cont_tab(i).pack_status := 'Overpacked';
8844 cont_warn := cont_warn + 1;
8845 l_tmp_status := 'Error';
8846 GOTO new_container;
8847 END IF;
8848
8849 -- bug 4642837 l_tmp_fill_pc --> l_cont_fill_pc
8850
8851 l_cont_avail_pc := 1 - (nvl(l_cont_fill_pc,0)/100);
8852
8853 IF (l_cont_org_id = l_det_org_id) THEN
8854
8855 -- WSH_CONTAINER_UTILITIES.Estimate_Detail_Containers (
8856 -- replacing with TPA enabled API..
8857
8858 --
8859 IF l_debug_on THEN
8860 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.ESTIMATE_DETAIL_CONTAINERS',WSH_DEBUG_SV.C_PROC_LEVEL);
8861 END IF;
8862 --
8863 WSH_TPA_CONTAINER_PKG.Estimate_Detail_Containers (
8864 l_cont_tab(i).container_instance_id,
8865 l_cont_item_id,
8866 l_det_tab(j).delivery_detail_id,
8867 l_det_org_id,
8868 l_req_cont_num,
8869 x_return_status);
8870
8871 IF l_debug_on THEN
8872 WSH_DEBUG_SV.log(l_module_name,'return status ' ,x_return_status);
8873 END IF;
8874 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8875 l_cont_tab(i).pack_status := 'Skipped';
8876 l_det_tab(j).pack_status := 'Error';
8877 error_cnt := error_cnt + 1;
8878 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8879 l_tmp_status := 'Error';
8880 GOTO new_container;
8881 END IF;
8882
8883 --dbms_output.put_line('req cont is ' || l_req_cont_num);
8884 --dbms_output.put_line(' cont avail pc is ' || l_cont_avail_pc);
8885
8886 IF l_req_cont_num <= l_cont_avail_pc THEN
8887
8888 l_tmp_det_tab(1) := l_det_tab(j).delivery_detail_id;
8889
8890 IF l_debug_on THEN
8891 WSH_DEBUG_SV.log(l_module_name,'assigning detail ' || l_tmp_det_tab(1) || ' to container ' || l_cont_tab(i).container_instance_id);
8892 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
8893 END IF;
8894
8895 --
8896 wsh_container_actions.Assign_Detail (
8897 l_cont_tab(i).container_instance_id,
8898 l_tmp_det_tab,
8899 l_pack_status,
8900 x_return_status,FALSE);
8901 IF l_debug_on THEN
8902 WSH_DEBUG_SV.log(l_module_name,'return status ' ,x_return_status);
8903 END IF;
8904 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8905 --dbms_output.put_line('could not assign');
8906 l_cont_tab(i).pack_status := 'Skipped';
8907 l_det_tab(j).pack_status := 'Error';
8908 error_cnt := error_cnt + 1;
8909 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
8910 l_return_status := x_return_status;
8911 END IF;
8912
8913 ELSIF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8914 l_det_tab(j).pack_status := 'Packed';
8915 l_det_pack_sts := 'Packed';
8916 -- J: W/V Changes
8917 WSH_WV_UTILS.Check_Fill_Pc (
8918 p_container_instance_id => l_cont_tab(i).container_instance_id,
8919 x_fill_status => l_fill_status,
8920 x_return_status => l_return_status);
8921
8922 IF l_fill_status = 'O' THEN
8923 --
8924 IF l_debug_on THEN
8925 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
8926 END IF;
8927 --
8928 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
8929
8930 --dbms_output.put_line('container ' || l_cont_name || ' overpacked ');
8931
8932
8933 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
8934 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
8935 END IF;
8939 l_tmp_status := 'Error';
8936
8937 l_cont_tab(i).pack_status := 'Overpacked';
8938 cont_warn := cont_warn + 1;
8940 END IF;
8941
8942 l_det_pack_sts := 'Packed';
8943
8944 IF l_req_cont_num = l_cont_avail_pc THEN
8945 l_cont_tab(i).pack_status := 'Packed';
8946 i := i + 1;
8947 END IF;
8948
8949
8950 END IF;
8951
8952 ELSE -- if line needs to be split
8953
8954 l_tmp_split_qty := ROUND(((l_det_pack_qty*l_cont_avail_pc)/l_req_cont_num),LIMITED_PRECISION);
8955
8956 --
8957 IF l_debug_on THEN
8958 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
8959 END IF;
8960 --
8961 WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
8962 l_det_inv_item_id,
8963 l_det_org_id,
8964 l_tmp_split_qty,
8965 l_det_qty_uom,
8966 l_split_qty,
8967 l_discard_status);
8968 IF l_debug_on THEN
8969 WSH_DEBUG_SV.log(l_module_name,'return status ' ,l_discard_status);
8970 END IF;
8971
8972 -- bug 1716136: errors likely mean integers are safe values.
8973 IF l_discard_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8974 l_discard_message := FND_MESSAGE.GET;
8975 l_split_qty := FLOOR(l_tmp_split_qty);
8976 END IF;
8977
8978 IF l_split_qty IS NULL THEN
8979 l_split_qty := l_tmp_split_qty;
8980 END IF;
8981
8982 IF (l_split_qty < 0 OR l_split_qty > l_det_pack_qty) THEN
8983 FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
8984 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
8985 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8986 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
8987 l_det_tab(j).pack_status := 'Error';
8988 error_cnt := error_cnt + 1;
8989 exit;
8990 END IF;
8991
8992 IF l_split_qty >= 1 THEN
8993
8994 IF l_det_pack_qty = l_split_qty THEN
8995 IF l_debug_on THEN
8996 WSH_DEBUG_SV.log(l_module_name,'In IF of equal-');
8997 END IF;
8998 l_split_det_id := l_det_tab(j).delivery_detail_id;
8999 IF l_debug_on THEN
9000 WSH_DEBUG_SV.log(l_module_name,'DELIVERY DETAIL id'||l_split_det_id);
9001 END IF;
9002 l_tmp_det_tab(1) := l_split_det_id;
9003 l_tmp_det_count := j;
9004 l_det_pack_sts := 'Packed';
9005
9006 ELSIF l_det_pack_qty > l_split_qty THEN
9007
9008 --- HW OPM BUG# 3011758
9009 -- if lot indivisbile and last container, raise an error
9010 -- else go to the next container
9011 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9012 -- - 2) Changed check condition for lot divisible from 1 to 'N'
9013 IF ( l_lot_divisible_flag = 'N' AND i = cont_count AND l_det_pack_sts = 'Unpacked') THEN
9014 FND_MESSAGE.SET_NAME('WSH','WSH_OPM_IND_SPLIT_PACK');
9015 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9016 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9017 WSH_UTIL_CORE.Add_Message(l_return_status);
9018 l_det_tab(j).pack_status := 'Error';
9019 error_cnt := error_cnt + 1;
9020 exit;
9021 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9022 -- - 2) Changed check condition for lot divisible from 1 to 'N'
9023 ELSIF ( l_lot_divisible_flag = 'N' AND i < cont_count AND l_det_pack_sts = 'Unpacked') THEN
9024 goto new_container;
9025 --dbms_output.put_line('calling split details');
9026
9027 --
9028 ELSE -- non divisible
9029
9030 l_split_qty2 := (l_split_qty * l_det_pack_qty2)/l_det_pack_qty;
9031 IF l_debug_on THEN
9032 WSH_DEBUG_SV.log(l_module_name,'l_split_qty',l_split_qty);
9033 WSH_DEBUG_SV.log(l_module_name,'l_split_qty2',l_split_qty2);
9034 WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty2',l_det_pack_qty2);
9035 WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty',l_det_pack_qty);
9036 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
9037 END IF;
9038 --
9039
9040 WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details (
9041 p_from_detail_id => l_det_tab(j).delivery_detail_id,
9042 p_req_quantity => l_split_qty,
9043 p_req_quantity2 => l_split_qty2,
9044 x_new_detail_id => l_split_det_id,
9045 x_return_status =>x_return_status,
9046 p_manual_split => 'C'
9047 );
9048 --dbms_output.put_line('...split detail id ' || l_split_det_id);
9049 IF l_debug_on THEN
9053 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9050 WSH_DEBUG_SV.log(l_module_name,'return status,split det id -',x_return_status||l_split_det_id);
9051 END IF;
9052
9054 --dbms_output.put_line('error in splitting');
9055 FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
9056 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9057 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9058 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9059 l_det_tab(j).pack_status := 'Error';
9060 error_cnt := error_cnt + 1;
9061 exit;
9062 END IF;
9063
9064 --dbms_output.put_line('after splitting lines');
9065
9066 -- update detail attributes by decrementing shipped quantity
9067 -- (if not null) by the split quantity and updating the shipped
9068 -- quantity of the new line to be eqaul to the split quantity
9069
9070 l_tmp_det_tab(1) := l_split_det_id;
9071 l_tmp_det_count := l_det_tab.count + 1;
9072 l_det_tab(l_tmp_det_count).delivery_detail_id := l_split_det_id;
9073
9074 END IF;
9075 --
9076 IF l_debug_on THEN
9077 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
9078 END IF;
9079 --
9080 wsh_container_actions.Assign_Detail (
9081 l_cont_tab(i).container_instance_id,
9082 l_tmp_det_tab,
9083 l_pack_status,
9084 x_return_status,FALSE);
9085
9086 IF l_debug_on THEN
9087 WSH_DEBUG_SV.log(l_module_name,'return status -',x_return_status);
9088 END IF;
9089
9090 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9091 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9092 l_return_status := x_return_status;
9093 END IF;
9094
9095 l_det_tab(l_tmp_det_count).pack_status := 'Error';
9096 l_cont_tab(i).pack_status := 'Skipped';
9097 error_cnt := error_cnt + 1;
9098
9099 END IF;
9100
9101 IF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9102 l_det_tab(l_tmp_det_count).pack_status := 'Packed';
9103 l_cont_tab(i).pack_status := 'Packed';
9104 -- J: W/V Changes
9105
9106 WSH_WV_UTILS.Check_Fill_Pc (
9107 p_container_instance_id => l_cont_tab(i).container_instance_id,
9108 x_fill_status => l_fill_status,
9109 x_return_status => l_return_status);
9110
9111 IF l_fill_status = 'O' THEN
9112 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9113 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9114 END IF;
9115
9116 l_cont_tab(i).pack_status := 'Overpacked';
9117 cont_warn := cont_warn + 1;
9118 l_tmp_status := 'Error';
9119 GOTO new_container;
9120 END IF;
9121
9122 l_cont_tab(i).pack_status := 'Packed';
9123
9124 END IF; -- if packing successful
9125 END IF; --- of of 3011758
9126 ELSE -- split qty < 1 means cannot split - so try next cont
9127
9128 i := i + 1;
9129
9130 END IF; -- if split qty >= 1
9131
9132 END IF; -- if l_req_cont_num < = l_cont_avail_pc
9133
9134 ELSE -- means org ids don't match and so try next container.
9135
9136 i := i + 1;
9137
9138 END IF; -- if l_cont_org_id = l_det_org_id
9139
9140 <<new_container>>
9141 i := i + 1;
9142 l_tmp_status := 'OK';
9143
9144 END LOOP; -- inner loop of containers
9145
9146 j := j + 1;
9147
9148 END LOOP; -- outer loop of lines
9149
9150 -- at end of loop, if all containers had been used, cont_count should be 0
9151 -- and if all lines had been used, j should be > det_count.
9152 -- if j <= det_count, then it implies that some lines were unpacked so
9153 -- issue a warning.
9154
9155 ELSIF p_pack_mode = 'E' THEN
9156 -- packing mode is equal - each line is split equally between all containers
9157 -- and each split line is packed into each container. Packs even if
9158 -- container is overpacked/underpacked and returns with a warning.
9159
9160 IF (p_split_pc IS NULL OR p_split_pc = 0) THEN
9161 l_split_pc := 100/(p_cont_tab.count);
9162 ELSE
9163 l_split_pc := p_split_pc;
9164 END IF;
9165
9166 FOR j IN 1..det_count LOOP
9167
9168 IF l_debug_on THEN
9169 WSH_DEBUG_SV.log(l_module_name,'===========================================');
9170 WSH_DEBUG_SV.log(l_module_name,'pack mode E: processing detail ' || l_det_tab(j).delivery_detail_id);
9171 END IF;
9172
9173 OPEN Get_Detail_Info (l_det_tab(j).delivery_detail_id);
9174
9175 FETCH Get_Detail_Info INTO
9176 l_det_inv_item_id,
9177 l_det_pack_qty,
9178 l_det_qty_uom,
9179 l_det_net,
9180 l_det_volume,
9181 l_det_wt_uom,
9182 l_det_vol_uom,
9183 l_det_org_id,
9184 l_det_cont_item_id,
9185 l_det_pack_qty2;
9186
9190 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9187 IF Get_Detail_Info%NOTFOUND THEN
9188 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
9189 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9191 CLOSE Get_Detail_Info;
9192 --dbms_output.put_line('error in fetching details for ' || l_det_tab(j).delivery_detail_id);
9193 l_det_tab(j).pack_status := 'Error';
9194 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9195 l_tmp_status := 'Error';
9196 GOTO next_detail;
9197 END IF;
9198
9199 CLOSE Get_Detail_Info;
9200
9201
9202 -- HW OPM BUG#:3011758. get OPM item information
9203 -- HW OPMCONV - 1)Change the call from OPM API to get item info
9204 -- to a new WSH API
9205 -- - 2) Remove checking for process
9206
9207 WSH_DELIVERY_DETAILS_INV.Get_item_information
9208 (
9209 p_organization_id => l_det_org_id
9210 , p_inventory_item_id => l_det_inv_item_id
9211 , x_mtl_system_items_rec => l_item_info
9212 , x_return_status => l_return_status
9213 );
9214
9215 wsh_util_core.api_post_call
9216 (
9217 p_return_status => l_return_status,
9218 x_num_warnings => l_num_warnings,
9219 x_num_errors => l_num_errors
9220 );
9221
9222
9223 IF ( l_item_info.lot_divisible_flag = 'N' AND
9224 l_item_info.lot_control_code = 2 ) THEN
9225 l_lot_divisible_flag := 'N';
9226 ELSE
9227 l_lot_divisible_flag := 'Y';
9228 END IF;
9229
9230 l_tmp_split_qty := ROUND((l_split_pc*l_det_pack_qty/100),LIMITED_PRECISION);
9231
9232 --
9233 IF l_debug_on THEN
9234 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DETAILS_VALIDATIONS.CHECK_DECIMAL_QUANTITY',WSH_DEBUG_SV.C_PROC_LEVEL);
9235 END IF;
9236 --
9237 WSH_DETAILS_VALIDATIONS.Check_Decimal_Quantity (
9238 l_det_inv_item_id,
9239 l_det_org_id,
9240 l_tmp_split_qty,
9241 l_det_qty_uom,
9242 l_split_qty,
9243 l_discard_status);
9244
9245 IF l_debug_on THEN
9246 WSH_DEBUG_SV.log(l_module_name,'return status-',l_discard_status);
9247 END IF;
9248
9249 -- bug 1716136: errors likely mean integers are safe values.
9250 IF l_discard_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9251 l_discard_message := FND_MESSAGE.GET;
9252 l_split_qty := FLOOR(l_tmp_split_qty);
9253 END IF;
9254 /* Bug 2173615 - added l_split_qty = 0,in case of fractional split example = 0.3 */
9255 IF (l_split_qty IS NULL OR l_split_qty = 0) THEN
9256 l_split_qty := l_tmp_split_qty;
9257 END IF;
9258
9259 --dbms_output.put_line('l_split_qty = ' || l_split_qty);
9260 /* Bug 2173615 ,changed 1 to zero */
9261 IF l_split_qty < 0 THEN
9262 l_split_qty := 1;
9263 --dbms_output.put_line('because < 1, l_split_qty now = ' || l_split_qty);
9264 END IF;
9265
9266 l_tmp_det_qty := 0;
9267
9268 FOR i IN 1..cont_count LOOP
9269
9270 IF l_debug_on THEN
9271 WSH_DEBUG_SV.log(l_module_name,'----- packing into container ' || l_cont_tab(i).container_instance_id);
9272 WSH_DEBUG_SV.log(l_module_name,'Tmp Det Qty,Det Pack Qty,split qty',l_tmp_det_qty||l_det_pack_qty||l_split_qty);
9273 END IF;
9274 --dbms_output.put_line('l_tmp_det_qty = ' || l_tmp_det_qty);
9275 --dbms_output.put_line('l_det_pack_qty = ' || l_det_pack_qty);
9276 --dbms_output.put_line('l_split_qty = ' || l_split_qty);
9277
9278 IF l_tmp_det_qty <= l_det_pack_qty THEN
9279
9280 OPEN Get_Cont_Info (l_cont_tab(i).container_instance_id);
9281
9282 FETCH Get_Cont_Info INTO
9283 l_cont_item_id,
9284 l_cont_org_id,
9285 l_cont_gross,
9286 l_cont_net,
9287 l_cont_volume,
9288 l_cont_wt_uom,
9289 l_cont_vol_uom,
9290 l_cont_fill_pc,
9291 l_cont_min_fill_pc,
9292 l_cont_max_load_wt,
9293 l_cont_max_vol;
9294
9295 IF Get_Cont_Info%NOTFOUND THEN
9296 --
9297 IF l_debug_on THEN
9298 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9299 END IF;
9300 --
9301 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9302 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
9303 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9304 -- x_pack_status := 'Error';
9305 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9306 l_cont_tab(i).pack_status := 'Error';
9307 CLOSE Get_Cont_Info;
9308 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9309 cont_err := cont_err + 1;
9310 l_tmp_status := 'Error';
9311 GOTO next_container;
9312 END IF;
9313
9314 CLOSE Get_Cont_Info;
9315
9316 IF l_cont_org_id = l_det_org_id THEN
9317
9318 --dbms_output.put_line('Decision point: compare ' || (l_tmp_det_qty + l_split_qty) || ' with ' || l_det_pack_qty);
9319
9320 -- bug 1367540:
9321 -- due to round-off errors in calculating floating-point values (e.g., 1/3 = 0.33333...)
9322 -- avoid exact comparisons
9323
9324 l_tmp_delta := l_det_pack_qty - (l_tmp_det_qty + l_split_qty);
9325
9329 --
9326 IF l_tmp_delta > 0.00001 THEN -- if (l_tmp_det_qty + l_split_qty) < l_det_pack_qty) then
9327
9328 --dbms_output.put_line('SPLITTING line ' || l_det_tab(j).delivery_detail_id || ' by ' || l_split_qty);
9330
9331 --- HW OPM BUG# 3011758
9332 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9333 -- - 2) Changed check condition for lot divisible from 1 to 'N'
9334 IF ( l_lot_divisible_flag = 'N' AND i = cont_count AND l_det_pack_sts = 'Unpacked') THEN
9335 FND_MESSAGE.SET_NAME('WSH','WSH_OPM_IND_SPLIT_PACK');
9336 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9337 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9338 WSH_UTIL_CORE.Add_Message(l_return_status);
9339 l_det_tab(j).pack_status := 'Error';
9340 error_cnt := error_cnt + 1;
9341 exit;
9342 -- HW OPMCONV - 1) Renamed lot_indivisible variable to lot_divisible_flag
9343 -- - 2) Changed check condition for lot divisible from 1 to 'N'
9344 ELSIF ( l_lot_divisible_flag = 'N' AND i < cont_count AND l_det_pack_sts = 'Unpacked') THEN
9345 goto next_container;
9346
9347 ELSE -- non divisible
9348 l_split_qty2 := (l_split_qty * l_det_pack_qty2)/l_det_pack_qty;
9349
9350 IF l_debug_on THEN
9351 WSH_DEBUG_SV.log(l_module_name,'l_split_qty',l_split_qty);
9352 WSH_DEBUG_SV.log(l_module_name,'l_split_qty2',l_split_qty2);
9353 WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty2',l_det_pack_qty2);
9354 WSH_DEBUG_SV.log(l_module_name,'l_det_pack_qty',l_det_pack_qty);
9355 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.SPLIT_DELIVERY_DETAILS',WSH_DEBUG_SV.C_PROC_LEVEL);
9356 END IF;
9357
9358 WSH_DELIVERY_DETAILS_ACTIONS.Split_Delivery_Details (
9359 p_from_detail_id => l_det_tab(j).delivery_detail_id,
9360 p_req_quantity => l_split_qty,
9361 p_req_quantity2 => l_split_qty2,
9362 x_new_detail_id => l_split_det_id,
9363 x_return_status => x_return_status,
9364 p_manual_split => 'C'
9365 );
9366 IF l_debug_on THEN
9367 WSH_DEBUG_SV.log(l_module_name,'return status',x_return_status);
9368 END IF;
9369 --dbms_output.put_line('...split detail id ' || l_split_det_id);
9370
9371 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9372 FND_MESSAGE.SET_NAME('WSH','WSH_DET_SPLIT_ERROR');
9373 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9374 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9375 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9376 --dbms_output.put_line('error in splitting details for ' || l_det_tab(j).delivery_detail_id);
9377 error_cnt := error_cnt + 1;
9378 l_det_tab(j).pack_status := 'Error';
9379 exit;
9380 END IF;
9381 END IF; -- end of 3011758
9382
9383 -- update detail attributes by decrementing shipped quantity
9384 -- (if not null) by the split quantity and updating the shipped
9385 -- quantity of the new line to be eqaul to the split quantity
9386
9387 l_tmp_det_tab(1) := l_split_det_id;
9388 l_tmp_det_count := l_det_tab.count + 1;
9389 l_det_tab(l_tmp_det_count).delivery_detail_id := l_split_det_id;
9390 --dbms_output.put_line('split line is ' || l_split_det_id);
9391
9392 ELSIF l_tmp_delta >= -0.00001 THEN -- elsif (l_tmp_det_qty + l_split_qty) = l_det_pack_qty then
9393 -- Here, l_tmp_delta is between -0.00001 and 0.00001 (see the first IF condition).
9394
9395 l_split_det_id := l_det_tab(j).delivery_detail_id;
9396 l_tmp_det_tab(1) := l_det_tab(j).delivery_detail_id;
9397 l_tmp_det_count := j;
9398 --dbms_output.put_line('NO SPLIT and line is ' || l_split_det_id);
9399 ELSE
9400 -- bug 1367540: this case had not been handled before,
9401 -- so when neither condition above was met, the last split detail was reassigned.
9402 -- The API will return a warning if the container turns out to be overpacked.
9403 l_split_det_id := l_det_tab(j).delivery_detail_id;
9404 l_tmp_det_tab(1) := l_det_tab(j).delivery_detail_id;
9405 l_tmp_det_count := j;
9406 --dbms_output.put_line('NO SPLIT, POSSIBLE OVERPACK and line ' || l_split_det_id || ' will be assigned.');
9407 END IF;
9408
9409 --dbms_output.put_line('* * * ASSIGNING detail ' || l_tmp_det_tab(1) || ' to container ' || l_cont_tab(i).container_instance_id);
9410
9411 --
9412 IF l_debug_on THEN
9413 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_DETAIL',WSH_DEBUG_SV.C_PROC_LEVEL);
9414 END IF;
9415 --
9416 wsh_container_actions.Assign_Detail (
9417 l_cont_tab(i).container_instance_id,
9418 l_tmp_det_tab,
9419 l_pack_status,
9420 x_return_status,FALSE);
9421
9422 IF l_debug_on THEN
9423 WSH_DEBUG_SV.log(l_module_name,'return status',x_return_status);
9424 END IF;
9425
9426 IF x_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9430 END IF;
9427 --dbms_output.put_line('error in assigning details for ' || l_tmp_det_tab(1));
9428 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9429 l_return_status := x_return_status;
9431 error_cnt := error_cnt + 1;
9432 l_det_tab(l_tmp_det_count).pack_status := 'Error';
9433
9434 ELSIF x_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9435 --dbms_output.put_line('assigned line ' || l_tmp_det_tab(1));
9436 l_det_tab(l_tmp_det_count).pack_status := 'Packed';
9437 l_cont_tab(i).pack_status := 'Packed';
9438
9439 -- J: W/V Changes
9440 WSH_WV_UTILS.Check_Fill_Pc (
9441 p_container_instance_id => l_cont_tab(i).container_instance_id,
9442 x_fill_status => l_fill_status,
9443 x_return_status => l_return_status);
9444
9445 IF (l_fill_status = 'O' AND l_cont_item_id IS NOT NULL) THEN
9446
9447 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9448 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9449 END IF;
9450
9451 cont_warn := cont_warn + 1;
9452 l_cont_tab(i).pack_status := 'Overpacked';
9453 ELSIF (l_fill_status = 'U'
9454 AND l_cont_item_id IS NOT NULL ) THEN
9455
9456 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9457 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9458 END IF;
9459
9460 cont_warn := cont_warn + 1;
9461 l_cont_tab(i).pack_status := 'Underpacked';
9462 ELSE
9463 l_cont_tab(i).pack_status := 'Packed';
9464 END IF;
9465
9466 END IF; -- if assign was successful
9467
9468 l_tmp_det_qty := l_tmp_det_qty + l_split_qty;
9469 ELSE
9470 --dbms_output.put_line('orgs dont match for detail ' || l_det_tab(j).delivery_detail_id || ' and container ' || l_cont_tab(i).container_instance_id);
9471 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_NO_MATCH');
9472 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(j).delivery_detail_id);
9473 --
9474 IF l_debug_on THEN
9475 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9476 END IF;
9477 --
9478 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9479 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9480
9481 END IF; -- cont org and det org id check
9482
9483 END IF; -- if l_tmp_det_qty < l_det_pack_qty
9484
9485 <<next_container>>
9486 null;
9487
9488 END LOOP; -- looping though containers - inner loop
9489
9490 IF (l_tmp_det_qty = l_det_pack_qty) AND (l_det_tab(j).pack_status <> 'Error' ) THEN
9491 l_det_tab(j).pack_status := 'Packed';
9492 END IF;
9493
9494 l_tmp_det_qty := 0;
9495
9496 <<next_detail>>
9497 null;
9498
9499 END LOOP; -- looping through lines - outer loop
9500
9501 ELSE
9502 -- packing mode is invalid - did not pack
9503
9504 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_INVALID_PACK_MODE');
9505 x_pack_status := 'Error';
9506 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9507 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
9508 --Bugfix 4070732 {
9509 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
9510 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9511 IF l_debug_on THEN
9512 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9513 END IF;
9514
9515 WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags => TRUE,
9516 x_return_status => l_tmp_return_status);
9517
9518
9519 IF l_debug_on THEN
9520 WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9521 END IF;
9522
9523 /*wsh_util_core.api_post_call
9524 (
9525 p_return_status => l_return_status,
9526 x_num_warnings => l_num_warnings,
9527 x_num_errors => l_num_errors
9528 );
9529 */
9530 IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
9531 X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9532 END IF;
9533 END IF;
9534 END IF;
9535 --}
9536 --
9537 --IF l_debug_on THEN
9538 -- WSH_DEBUG_SV.pop(l_module_name);
9539 --END IF;
9540 --
9541 --return;
9542 raise e_return_excp; -- LPN CONV. rv
9543 END IF;
9544
9545
9546 error_cnt := 0;
9547 warn_cnt := 0;
9548 succ_cnt := 0;
9549
9550 cont_warn := 0;
9551 cont_err := 0;
9552 x_pack_status := NULL;
9553
9554 --dbms_output.put_line('l_return_status = ' || l_return_status);
9555
9556 FOR i IN 1..l_det_tab.count LOOP
9557 --dbms_output.put_line('detail ' || l_det_tab(i).delivery_detail_id || ' status is ' || l_det_tab(i).pack_status);
9561 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DETAIL_NOT_ASSIGNED');
9558 IF l_det_tab(i).pack_status <> 'Packed' THEN
9559 IF l_det_tab(i).pack_status = 'Error' THEN
9560 error_cnt := error_cnt + 1;
9562 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(i).delivery_detail_id);
9563 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_ERROR,l_module_name);
9564 ELSE
9565 IF l_det_tab(i).pack_status = 'Unpacked' THEN
9566 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_IGNORED');
9567 FND_MESSAGE.SET_TOKEN('DETAIL_ID',l_det_tab(i).delivery_detail_id);
9568 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9569 END IF;
9570 warn_cnt := warn_cnt + 1;
9571 END IF;
9572 ELSE
9573 succ_cnt := succ_cnt + 1;
9574 /* H projects: pricing integration csun */
9575 m := m+1;
9576 l_detail_rows(m) := l_det_tab(i).delivery_detail_id;
9577 END IF;
9578
9579 END LOOP;
9580
9581 IF error_cnt > 0 or warn_cnt > 0 THEN
9582 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_DET_PACK_ERROR');
9583 FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
9584 FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
9585 FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
9586 IF error_cnt > 0 THEN
9587 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9588 ELSIF warn_cnt > 0 THEN
9589 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9590 END IF;
9591
9592 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9593
9594 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9595 x_return_status := l_return_status;
9596 x_pack_status := 'Error';
9597 --Bugfix 4070732 {
9598 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
9599 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9600 IF l_debug_on THEN
9601 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9602 END IF;
9603
9604 WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags => TRUE,
9605 x_return_status => l_tmp_return_status);
9606
9607
9608 IF l_debug_on THEN
9609 WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9610 END IF;
9611
9612 /*wsh_util_core.api_post_call
9613 (
9614 p_return_status => l_return_status,
9615 x_num_warnings => l_num_warnings,
9616 x_num_errors => l_num_errors
9617 );
9618 */
9619 IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
9620 X_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9621 END IF;
9622 END IF;
9623 END IF;
9624 --}
9625 --
9626 --IF l_debug_on THEN
9627 -- WSH_DEBUG_SV.pop(l_module_name);
9628 --END IF;
9629 --
9630 --return;
9631 raise e_return_excp; -- LPN CONV. rv
9632 END IF;
9633
9634 END IF;
9635
9636 /* H integration: Pricing integration csun
9637 */
9638 IF l_detail_rows.count > 0 THEN
9639 --
9640 IF l_debug_on THEN
9641 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_LEGS_ACTIONS.MARK_REPRICE_REQUIRED',WSH_DEBUG_SV.C_PROC_LEVEL);
9642 END IF;
9643 --
9644 WSH_DELIVERY_LEGS_ACTIONS.Mark_Reprice_Required(
9645 p_entity_type => 'DELIVERY_DETAIL',
9646 p_entity_ids => l_detail_rows,
9647 x_return_status => l_return_status);
9648
9649 IF l_debug_on THEN
9650 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
9651 END IF;
9652 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9653 x_return_status := l_return_status;
9654 FND_MESSAGE.SET_NAME('WSH', 'WSH_REPRICE_REQUIRED_ERR');
9655 WSH_UTIL_CORE.add_message(x_return_status,l_module_name);
9656 --
9657 --Bugfix 4070732 {
9658 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
9659 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9660 IF l_debug_on THEN
9661 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9662 END IF;
9663
9664 WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags => TRUE,
9665 x_return_status => l_tmp_return_status);
9666
9667
9668 IF l_debug_on THEN
9669 WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9670 END IF;
9671
9672 /*wsh_util_core.api_post_call
9673 (
9674 p_return_status => l_return_status,
9675 x_num_warnings => l_num_warnings,
9676 x_num_errors => l_num_errors
9677 );
9678 */
9679 IF
9680 (l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9681 OR
9685 ELSIF x_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR
9682 (x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9683 THEN --{
9684 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9686 THEN
9687 IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR
9688 THEN
9689 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9690 ELSIF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING
9691 THEN
9692 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9693 END IF;
9694 END IF; --}
9695 END IF;
9696 END IF;
9697 --}
9698 --IF l_debug_on THEN
9699 -- WSH_DEBUG_SV.pop(l_module_name);
9700 --END IF;
9701 --
9702 --return;
9703 raise e_return_excp; -- LPN CONV. rv
9704 END IF;
9705 END IF;
9706
9707
9708
9709 FOR i IN 1..l_cont_tab.count LOOP
9710 --dbms_output.put_line('container ' || l_cont_tab(i).container_instance_id || ' is ' || l_cont_tab(i).pack_status);
9711 IF l_cont_tab(i).pack_status <> 'Packed' THEN
9712 IF l_cont_tab(i).pack_status = 'Error' THEN
9713 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9714 cont_err := cont_err + 1;
9715 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NOT_PACKED');
9716 --
9717 IF l_debug_on THEN
9718 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9719 END IF;
9720 --
9721 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9722 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9723 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9724 ELSIF l_cont_tab(i).pack_status = 'Overpacked' THEN
9725 cont_warn := cont_warn + 1;
9726 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_OVERPACKED');
9727 --
9728 IF l_debug_on THEN
9729 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9730 END IF;
9731 --
9732 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9733 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9734 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9735 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9736 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9737 END IF;
9738 ELSIF l_cont_tab(i).pack_status = 'Underpacked' THEN
9739 cont_warn := cont_warn + 1;
9740 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UNDERPACKED');
9741 --
9742 IF l_debug_on THEN
9743 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9744 END IF;
9745 --
9746 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9747 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9748 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9749 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9750 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9751 END IF;
9752 ELSIF l_cont_tab(i).pack_status = 'Warning' THEN
9753 cont_warn := cont_warn + 1;
9754 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
9755 --
9756 IF l_debug_on THEN
9757 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
9758 END IF;
9759 --
9760 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_tab(i).container_instance_id);
9761 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
9762 WSH_UTIL_CORE.Add_Message(WSH_UTIL_CORE.G_RET_STS_WARNING,l_module_name);
9763
9764 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9765 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9766 END IF;
9767 END IF;
9768 END IF;
9769
9770 END LOOP;
9771
9772
9773 -- LPN CONV. rv
9774 --
9775 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
9776 THEN
9777 --{
9778
9779 IF l_debug_on THEN
9780 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
9781 END IF;
9782 --
9783 WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
9784 (
9785 p_in_rec => l_lpn_in_sync_comm_rec,
9786 x_return_status => l_return_status,
9787 x_out_rec => l_lpn_out_sync_comm_rec
9788 );
9789 --
9790 IF l_debug_on THEN
9791 WSH_DEBUG_SV.log(l_module_name, 'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
9792 END IF;
9793 --
9794 WSH_UTIL_CORE.API_POST_CALL
9795 (
9796 p_return_status => l_return_status,
9797 x_num_warnings => cont_warn,
9798 x_num_errors => cont_err,
9799 p_raise_error_flag => false
9800 );
9801 --}
9802 END IF;
9803 -- LPN CONV. rv
9804 --
9805
9806 IF cont_err > 0 OR cont_warn > 0 THEN
9807 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_PACK_WARN');
9808 FND_MESSAGE.SET_TOKEN('CONT_WARN',cont_warn);
9809 FND_MESSAGE.SET_TOKEN('CONT_ERR',cont_err);
9810 IF cont_err > 0 THEN
9814 END IF;
9811 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9812 ELSE
9813 l_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9815 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
9816 END IF;
9817
9818 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9819 x_return_status := l_return_status;
9820 ELSE
9821 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
9822 END IF;
9823
9824 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9825 x_pack_status := 'Success';
9826 ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9827 x_pack_status := 'Error';
9828 ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9829 x_pack_status := 'Warning';
9830 l_num_warnings := nvl(l_num_warnings,0 ) + 1;
9831 END IF;
9832
9833
9834 IF x_pack_status IS NULL THEN
9835 x_pack_status := 'Success';
9836 END IF;
9837
9838 --Bugfix 4070732 {
9839 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
9840 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9841 IF l_debug_on THEN
9842 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Process_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9843 END IF;
9844
9845 WSH_UTIL_CORE.Process_stops_for_load_tender(p_reset_flags => TRUE,
9846 x_return_status => l_tmp_return_status);
9847 IF l_debug_on THEN
9848 WSH_DEBUG_SV.log(l_module_name,'l_tmp_return_status',l_tmp_return_status);
9849 END IF;
9850
9851 /*wsh_util_core.api_post_call
9852 (
9853 p_return_status => l_return_status,
9854 x_num_warnings => l_num_warnings,
9855 x_num_errors => l_num_errors
9856 );
9857 */
9858 IF (l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9859 OR (x_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)
9860 THEN --{
9861 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9862 x_pack_status := 'Error';
9863 ELSIF x_return_status <> WSH_UTIL_CORE.G_RET_STS_ERROR
9864 THEN
9865 IF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR THEN
9866 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9867 x_pack_status := 'Error';
9868 ELSIF l_tmp_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING
9869 THEN
9870 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9871 x_pack_status := 'Warning';
9872 END IF;
9873 END IF; --}
9874
9875 END IF;
9876 END IF;
9877 --}
9878
9879 --
9880 IF l_debug_on THEN
9881 WSH_DEBUG_SV.pop(l_module_name);
9882 END IF;
9883 --
9884 EXCEPTION
9885 -- LPN CONV. rv
9886 WHEN e_return_excp THEN
9887 --
9888 --
9889 IF l_debug_on THEN
9890 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
9891 END IF;
9892 --
9893 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
9894 THEN
9895 --{
9896 --
9897 IF l_debug_on THEN
9898 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
9899 END IF;
9900 --
9901 WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
9902 (
9903 p_in_rec => l_lpn_in_sync_comm_rec,
9904 x_return_status => l_return_status,
9905 x_out_rec => l_lpn_out_sync_comm_rec
9906 );
9907 --
9908 IF l_debug_on THEN
9909 WSH_DEBUG_SV.log(l_module_name, 'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
9910 END IF;
9911 --
9912 IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR,WSH_UTIL_CORE.G_RET_STS_ERROR) AND x_return_status <> WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
9913 x_return_status := l_return_status;
9914 END IF;
9915 --}
9916 END IF;
9917 --
9918 -- LPN CONV. rv
9919 --
9920 --
9921 IF l_debug_on THEN
9922 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:E_RETURN_EXCP');
9923 END IF;
9924 WHEN Others THEN
9925 --
9926 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Pack_Multi',l_module_name);
9927 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9928 --
9929 IF l_debug_on THEN
9930 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
9931 END IF;
9932 --
9933 -- LPN CONV. rv
9934 IF l_debug_on THEN
9935 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
9936 END IF;
9937 --
9938 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
9939 THEN
9940 --{
9941 --
9942 IF l_debug_on THEN
9943 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS',WSH_DEBUG_SV.C_PROC_LEVEL);
9944 END IF;
9945 --
9949 x_return_status => l_return_status,
9946 WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS
9947 (
9948 p_in_rec => l_lpn_in_sync_comm_rec,
9950 x_out_rec => l_lpn_out_sync_comm_rec
9951 );
9952 --
9953 IF l_debug_on THEN
9954 WSH_DEBUG_SV.log(l_module_name, 'Return status after calling WSH_LPN_SYNC_COMM_PKG.SYNC_LPNS_TO_WMS', l_return_status);
9955 END IF;
9956 --}
9957 END IF;
9958 --
9959 -- LPN CONV. rv
9960 --
9961
9962 --Bugfix 4070732 {
9963 IF upper(WSH_UTIL_CORE.G_START_OF_SESSION_API) = upper(l_api_session_name) THEN
9964 IF NOT(WSH_UTIL_CORE.G_CALL_FTE_LOAD_TENDER_API) THEN
9965 IF l_debug_on THEN
9966 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_UTIL_CORE.Reset_stops_for_load_tender',WSH_DEBUG_SV.C_PROC_LEVEL);
9967 END IF;
9968
9969 WSH_UTIL_CORE.Reset_stops_for_load_tender(p_reset_flags => TRUE,
9970 x_return_status => l_return_status);
9971
9972
9973 IF l_debug_on THEN
9974 WSH_DEBUG_SV.log(l_module_name,'l_return_status',l_return_status);
9975 END IF;
9976
9977 /*wsh_util_core.api_post_call
9978 (
9979 p_return_status => l_return_status,
9980 x_num_warnings => l_num_warnings,
9981 x_num_errors => l_num_errors
9982 );
9983 */
9984 END IF;
9985 END IF;
9986 --}
9987 --
9988 IF l_debug_on THEN
9989 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
9990 END IF;
9991 --
9992 END Pack_Multi;
9993
9994
9995 /*
9996 -----------------------------------------------------------------------------
9997 PROCEDURE : Update_Shipped_Qty
9998 PARAMETERS : p_delivery_detail_id - delivery detail id of the original line
9999 that was split
10000 p_split_detail_id - delivery detail id of the newly created
10001 split line
10002 p_split_qty - quantity used to split original delivery line
10003 x_return_status - return status of API
10004 DESCRIPTION : This procedure updates the shipped quantities of the original
10005 delivery line that was split and the new line that was created
10006 due to the split. The shipped quantity of the original line is
10007 decremented by split qty and that of the new line is increased
10008 to be equal to the split qty. The updating is done only if the
10009 original shipped quantity is not null.
10010 ------------------------------------------------------------------------------
10011 */
10012
10013
10014
10015 PROCEDURE Update_Shipped_Qty(
10016 p_delivery_detail_id IN NUMBER,
10017 p_split_detail_id IN NUMBER,
10018 p_split_qty IN NUMBER,
10019 x_return_status OUT NOCOPY VARCHAR2) IS
10020
10021 CURSOR Get_Ship_Qty (v_det_id NUMBER) IS
10022 SELECT nvl(shipped_quantity,-99)
10023 FROM WSH_DELIVERY_DETAILS
10024 WHERE delivery_detail_id = v_det_id
10025 AND nvl(line_direction,'O') IN ('O','IO')
10026 AND container_flag = 'N';
10027
10028 l_shp_qty NUMBER;
10029 l_db_split_shp_qty NUMBER;
10030
10031 --
10032 l_debug_on BOOLEAN;
10033 --
10034 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_SHIPPED_QTY';
10035 --
10036 BEGIN
10037
10038 --
10039 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10040 --
10041 IF l_debug_on IS NULL
10042 THEN
10043 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10044 END IF;
10045 --
10046 IF l_debug_on THEN
10047 WSH_DEBUG_SV.push(l_module_name);
10048 --
10049 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_DETAIL_ID',P_DELIVERY_DETAIL_ID);
10050 WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_DETAIL_ID',P_SPLIT_DETAIL_ID);
10051 WSH_DEBUG_SV.log(l_module_name,'P_SPLIT_QTY',P_SPLIT_QTY);
10052 END IF;
10053 --
10054 IF p_split_detail_id IS NULL THEN
10055 -- nothing split, ergo nothing to update...
10056 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10057 --
10058 IF l_debug_on THEN
10059 WSH_DEBUG_SV.pop(l_module_name);
10060 END IF;
10061 --
10062 return;
10063 END IF;
10064
10065 OPEN Get_Ship_Qty (p_delivery_detail_id);
10066
10067 FETCH Get_Ship_Qty INTO l_shp_qty;
10068
10069 IF Get_Ship_Qty%NOTFOUND THEN
10070 CLOSE Get_Ship_Qty;
10071 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10072 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_detail_id);
10073 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10074 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10075 --
10076 IF l_debug_on THEN
10077 WSH_DEBUG_SV.pop(l_module_name);
10078 END IF;
10079 --
10080 return;
10081 END IF;
10082
10083 IF Get_Ship_Qty%ISOPEN THEN
10084 CLOSE Get_Ship_Qty;
10085 END IF;
10086
10087 IF l_shp_qty = -99 THEN
10088 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10089 --
10090 IF l_debug_on THEN
10091 WSH_DEBUG_SV.pop(l_module_name);
10092 END IF;
10096
10093 --
10094 return;
10095 END IF;
10097
10098 -- need to look up the split detail's shipped quantity
10099 -- so that we can correctly adjust the original detail's shipped quantity
10100
10101 OPEN Get_Ship_Qty(p_split_detail_id);
10102 FETCH Get_Ship_Qty into l_db_split_shp_qty;
10103
10104 IF Get_Ship_Qty%NOTFOUND THEN
10105 CLOSE Get_Ship_Qty;
10106 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10107 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_split_detail_id);
10108 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10109 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10110 --
10111 IF l_debug_on THEN
10112 WSH_DEBUG_SV.pop(l_module_name);
10113 END IF;
10114 --
10115 return;
10116 END IF;
10117
10118 CLOSE Get_Ship_Qty;
10119
10120 IF l_db_split_shp_qty = -99 THEN
10121 l_db_split_shp_qty := 0;
10122 END IF;
10123 --dbms_output.put_line('l_db_split_shp_qty = ' || l_db_split_shp_qty);
10124
10125 l_shp_qty := l_shp_qty - nvl(p_split_qty,0) + l_db_split_shp_qty;
10126 --dbms_output.put_line('new l_shp_qty = ' || l_shp_qty);
10127
10128 UPDATE WSH_DELIVERY_DETAILS
10129 SET shipped_quantity = l_shp_qty
10130 WHERE delivery_detail_id = p_delivery_detail_id;
10131
10132 IF SQL%NOTFOUND THEN
10133 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10134 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_detail_id);
10135 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10136 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10137 --
10138 IF l_debug_on THEN
10139 WSH_DEBUG_SV.pop(l_module_name);
10140 END IF;
10141 --
10142 return;
10143 END IF;
10144
10145 UPDATE WSH_DELIVERY_DETAILS
10146 SET shipped_quantity = p_split_qty
10147 WHERE delivery_detail_id = p_split_detail_id;
10148
10149 IF SQL%NOTFOUND THEN
10150 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
10151 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_split_detail_id);
10152 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10153 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
10154 --
10155 IF l_debug_on THEN
10156 WSH_DEBUG_SV.pop(l_module_name);
10157 END IF;
10158 --
10159 return;
10160 END IF;
10161
10162 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10163
10164
10165 --
10166 IF l_debug_on THEN
10167 WSH_DEBUG_SV.pop(l_module_name);
10168 END IF;
10169 --
10170 EXCEPTION
10171
10172 WHEN Others THEN
10173 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_Shipped_Qty',l_module_name);
10174 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
10175
10176 --
10177 IF l_debug_on THEN
10178 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
10179 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
10180 END IF;
10181 --
10182 END Update_Shipped_Qty;
10183
10184 /*
10185 -----------------------------------------------------------------------------
10186 PROCEDURE : Pack_Container
10187 PARAMETERS : p_line_cont_rec - Container info which needs to be autopacked
10188 x_return_status - Return Status of the API
10189 DESCRIPTION : This procedure packs a container into Master Container either
10190 by creating a new one or by packing it into one created for
10191 previous containers (created in the same run)
10192 ------------------------------------------------------------------------------
10193 */
10194
10195 PROCEDURE Pack_Container(
10196 p_line_cont_rec IN cont_info,
10197 x_return_status OUT NOCOPY VARCHAR2) IS
10198
10199 l_quantity_left NUMBER;
10200 l_tmp_split_qty NUMBER;
10201
10202 i NUMBER;
10203 j NUMBER;
10204 gcdvalue NUMBER;
10205
10206 --
10207 l_debug_on BOOLEAN;
10208 --
10209 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'PACK_CONTAINER';
10210 --
10211 BEGIN
10212
10213 --
10214 --
10215 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10216 --
10217 IF l_debug_on IS NULL
10218 THEN
10219 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10220 END IF;
10221 --
10222 IF l_debug_on THEN
10223 WSH_DEBUG_SV.push(l_module_name);
10224 WSH_DEBUG_SV.log(l_module_name,'shp_qty',p_line_cont_rec.shp_qty);
10225 WSH_DEBUG_SV.log(l_module_name,'preferred_container',p_line_cont_rec.preferred_container);
10226 WSH_DEBUG_SV.log(l_module_name,'organization_id',p_line_cont_rec.organization_id);
10227 WSH_DEBUG_SV.log(l_module_name,'group_id',p_line_cont_rec.group_id);
10228 END IF;
10229 --
10230 l_quantity_left := p_line_cont_rec.shp_qty;
10231
10232 -- Check Empty Containers first
10233 IF (g_empty_cont_tab.COUNT > 0 ) THEN
10234 --dbms_output.put_line('There are containers with empty space');
10235
10236 i := g_empty_cont_tab.FIRST;
10237 WHILE i <= g_empty_cont_tab.LAST LOOP
10238 IF p_line_cont_rec.preferred_container <> g_empty_cont_tab(i).container_item_Id OR
10239 p_line_cont_rec.organization_id <> g_empty_cont_tab(i).organization_id OR
10243 END IF;
10240 p_line_cont_rec.group_id <> g_empty_cont_tab(i).group_id OR
10241 g_empty_cont_tab(i).empty <= 0 THEN
10242 GOTO next_cont;
10244
10245 -- Got a Match in empty container table
10246 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
10247 --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty numerator '||g_empty_cont_tab(i).numerator||' denominator '||g_empty_cont_tab(i).denominator);
10248 -- Calculate qty than can fit in 'empty' space
10249 l_tmp_split_qty := TRUNC((p_line_cont_rec.max_load_qty*g_empty_cont_tab(i).numerator)/g_empty_cont_tab(i).denominator,LIMITED_PRECISION);
10250 IF (l_tmp_split_qty < 1) THEN
10251 GOTO next_cont;
10252 END IF;
10253
10254 ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
10255 --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty weight '||g_empty_cont_tab(i).empty);
10256 -- Calculate qty than can fit in 'empty' space
10257 IF (p_line_cont_rec.converted_wt > g_empty_cont_tab(i).empty) THEN
10258 GOTO next_cont;
10259 END IF;
10260 ELSE
10261 --dbms_output.put_line('Found Container '||g_empty_cont_tab(i).container_index||' with empty volume '||g_empty_cont_tab(i).empty);
10262 -- Calculate qty than can fit in 'empty' space
10263 IF (p_line_cont_rec.converted_vol > g_empty_cont_tab(i).empty) THEN
10264 GOTO next_cont;
10265 END IF;
10266 END IF;
10267
10268 -- Assign the dd to container
10269 g_assign_detail_index := g_assign_detail_index + 1;
10270 g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := p_line_cont_rec.delivery_detail_id;
10271 g_assign_detail_tab(g_assign_detail_index).container_index := g_empty_cont_tab(i).container_index;
10272 l_quantity_left := l_quantity_left - p_line_cont_rec.shp_qty;
10273
10274 --dbms_output.put_line('Assigning '||g_assign_detail_tab(g_assign_detail_index).delivery_detail_id||' to Cont index '||g_assign_detail_tab(g_assign_detail_index).container_index);
10275
10276 -- Calcualte space left and see if container needs to be deleted from empty cont PL/SQL table
10277 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
10278 g_empty_cont_tab(i).numerator := (g_empty_cont_tab(i).numerator * p_line_cont_rec.max_load_qty) - (g_empty_cont_tab(i).denominator * p_line_cont_rec.shp_qty);
10279 g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator * p_line_cont_rec.max_load_qty;
10280
10281 -- Bug # 3005780 : Added GCD just to reduce the numerator and denominator values
10282 IF (g_empty_cont_tab(i).numerator <> 0 ) AND (g_empty_cont_tab(i).denominator <> 0 ) THEN
10283 gcdvalue := Get_Gcd(g_empty_cont_tab(i).numerator , g_empty_cont_tab(i).denominator);
10284 --dbms_output.put_line('Get_Gcd return value is '||gcdvalue');
10285 IF (gcdvalue > 1) THEN
10286 g_empty_cont_tab(i).numerator := g_empty_cont_tab(i).numerator / gcdvalue;
10287 g_empty_cont_tab(i).denominator := g_empty_cont_tab(i).denominator / gcdvalue ;
10288 END IF;
10289 END IF;
10290 IF ((g_empty_cont_tab(i).numerator <= 0) OR
10291 (g_empty_cont_tab(i).numerator >= g_empty_cont_tab(i).denominator)) THEN
10292 --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
10293 g_empty_cont_tab.DELETE(i);
10294 END IF;
10295 ELSIF (p_line_cont_rec.fill_pc_basis = 'W') THEN
10296 g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - p_line_cont_rec.gross_weight;
10297 IF (g_empty_cont_tab(i).empty <= 0) THEN
10298 --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
10299 g_empty_cont_tab.DELETE(i);
10300 END IF;
10301 ELSE
10302 g_empty_cont_tab(i).empty := g_empty_cont_tab(i).empty - p_line_cont_rec.volume;
10303 IF (g_empty_cont_tab(i).empty <= 0) THEN
10304 --dbms_output.put_line('Deleting '||g_empty_cont_tab(i).container_index||' from empty cont table');
10305 g_empty_cont_tab.DELETE(i);
10306 END IF;
10307 END IF;
10308
10309 -- If the whole qty is packed then exit the loop
10310 IF (l_quantity_left <= 0) THEN
10311 EXIT;
10312 END IF;
10313
10314 <<next_cont>>
10315 i := g_empty_cont_tab.NEXT(i);
10316 END LOOP;
10317 END IF; -- g_empty_cont_tab > 0
10318
10319 --dbms_output.put_line(' *** Looping empty cont tab is Over and Quantity Left is '||l_quantity_left||' ***');
10320 IF (l_quantity_left > 0) THEN
10321
10322 -- Create new container index
10323 g_new_cont_index := g_new_cont_index + 1;
10324 g_new_container_tab(g_new_cont_index).container_item_id := p_line_cont_rec.preferred_container;
10325 g_new_container_tab(g_new_cont_index).organization_id := p_line_cont_rec.organization_id;
10326 --dbms_output.put_line('Created Container index '||g_new_cont_index);
10327
10328 -- Assign the split dd/existing dd
10329 g_assign_detail_index := g_assign_detail_index + 1;
10330 g_assign_detail_tab(g_assign_detail_index).delivery_detail_id := p_line_cont_rec.delivery_detail_id;
10331 g_assign_detail_tab(g_assign_detail_index).container_index := g_new_cont_index;
10332 --dbms_output.put_line('Assigning '||g_assign_detail_tab(g_assign_detail_index).delivery_detail_id||' to Cont index '||g_assign_detail_tab(g_assign_detail_index).container_index);
10336 j := 1;
10333
10334
10335 IF (g_empty_cont_tab.COUNT = 0) THEN
10337 ELSE
10338 j:= g_empty_cont_tab.LAST + 1;
10339 END IF;
10340
10341 -- Calculate Empty Space
10342 IF (p_line_cont_rec.fill_pc_basis = 'Q') THEN
10343 IF (l_quantity_left < p_line_cont_rec.max_load_qty) THEN
10344 g_empty_cont_tab(j).container_index := g_new_cont_index;
10345 g_empty_cont_tab(j).container_item_id := p_line_cont_rec.preferred_container;
10346 g_empty_cont_tab(j).organization_id := p_line_cont_rec.organization_id;
10347 g_empty_cont_tab(j).group_id := p_line_cont_rec.group_id;
10348 g_empty_cont_tab(j).numerator := p_line_cont_rec.max_load_qty - l_quantity_left;
10349 g_empty_cont_tab(j).denominator := p_line_cont_rec.max_load_qty;
10350 --dbms_output.put_line('Inserted Container '||j||' with numerator '||g_empty_cont_tab(j).numerator||' and denominator '||g_empty_cont_tab(j).denominator);
10351 END IF;
10352 ELSIF (p_line_cont_rec.fill_pc_basis in ('W','V')) THEN
10353 IF ((p_line_cont_rec.converted_wt < p_line_cont_rec.cont_wt AND p_line_cont_rec.fill_pc_basis = 'W') OR
10354 (p_line_cont_rec.converted_vol < p_line_cont_rec.cont_vol AND p_line_cont_rec.fill_pc_basis = 'V')) THEN
10355 g_empty_cont_tab(j).container_index := g_new_cont_index;
10356 g_empty_cont_tab(j).container_item_id := p_line_cont_rec.preferred_container;
10357 g_empty_cont_tab(j).organization_id := p_line_cont_rec.organization_id;
10358 g_empty_cont_tab(j).group_id := p_line_cont_rec.group_id;
10359
10360 IF (p_line_cont_rec.fill_pc_basis = 'W') THEN
10361 g_empty_cont_tab(j).empty := p_line_cont_rec.cont_wt - p_line_cont_rec.converted_wt;
10362 --dbms_output.put_line('Inserted Container '||j||' with empty weight '||g_empty_cont_tab(j).empty||' into empty cont');
10363 ELSE
10364 g_empty_cont_tab(j).empty := p_line_cont_rec.cont_vol - p_line_cont_rec.converted_vol;
10365 --dbms_output.put_line('Inserted Container '||j||' with empty volume '||g_empty_cont_tab(j).empty||' into empty cont');
10366 END IF;
10367
10368 END IF;
10369 END IF;
10370
10371 END IF;
10372 x_return_status := C_SUCCESS_STATUS;
10373 --
10374 IF l_debug_on THEN
10375 WSH_DEBUG_SV.pop(l_module_name);
10376 END IF;
10377 --
10378 RETURN;
10379
10380 --
10381 IF l_debug_on THEN
10382 WSH_DEBUG_SV.pop(l_module_name);
10383 END IF;
10384 --
10385 EXCEPTION
10386 WHEN Others THEN
10387 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Pack_Container',l_module_name);
10388 x_return_status := C_UNEXP_ERROR_STATUS;
10389
10390 --
10391 IF l_debug_on THEN
10392 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
10393 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
10394 END IF;
10395 --
10396 END Pack_Container;
10397
10398 /*
10399 -----------------------------------------------------------------------------
10400 PROCEDURE : Validate_Container_For_Pack
10401 PARAMETERS : p_group_id_tab_id - table of group ids for lines that need to
10402 be autopacked.
10403 p_cont_info_tab - table of Container ids
10404 x_line_cont_tab - Delivery Detail(Cont)s along with other info
10405 which passed validations
10406 x_error_cnt - Count of errors encountered during validation
10407 x_warn_cnt - Count of warnings encountered during validation
10408 DESCRIPTION : This procedure takes a list of containers and does all
10409 validations and returns a list of containers which passed
10410 validations
10411 ------------------------------------------------------------------------------
10412 */
10413 -- Bug 3570364 : Added new parameter p_mast_cont_info_tab which contains the
10414 -- Master container informations which is used when Auto_pack Master
10415 -- action performed on delivery detail lines
10416
10417 PROCEDURE Validate_Container_For_Pack(
10418 p_group_id_tab IN WSH_UTIL_CORE.id_tab_type,
10419 p_cont_info_tab IN wsh_util_core.id_tab_type,
10420 p_mast_cont_info_tab IN wsh_container_actions.empty_cont_info_tab,
10421 x_line_cont_tab OUT NOCOPY wsh_container_actions.cont_info_tab,
10422 x_error_cnt OUT NOCOPY NUMBER,
10423 x_warn_cnt OUT NOCOPY NUMBER,
10424 x_fill_pc_warn_cnt OUT NOCOPY NUMBER -- bug 3421823
10425 ) IS
10426
10427 --Bug 3405853 : Added detail_container_item_id in the select clause
10428 CURSOR Get_dd_Detail(c_dd_id NUMBER) IS
10429 SELECT wdd.inventory_item_id inventory_item_id,
10430 wdd.gross_weight gross_weight,
10431 wdd.weight_uom_code weight_uom,
10432 wdd.volume volume,
10433 wdd.volume_uom_code volume_uom,
10434 wdd.organization_id organization_id,
10435 wdd.delivery_detail_id,
10436 wda.parent_delivery_detail_id parent_delivery_detail_id,
10437 nvl(wdd.detail_container_item_id,wdd.master_container_item_id) detail_container_item_id
10438 FROM wsh_delivery_details wdd,
10439 wsh_delivery_assignments_v wda
10440 WHERE wdd.delivery_detail_id = c_dd_id
10441 AND wdd.delivery_detail_id = wda.delivery_detail_id
10442 AND source_code = 'WSH';
10443
10447 WHERE load_item_id = v_inv_item_id
10444 CURSOR Get_Cont_Item_Load (v_inv_item_id NUMBER, v_cont_item_id NUMBER, v_organization_id NUMBER) IS
10445 SELECT max_load_quantity
10446 FROM WSH_CONTAINER_ITEMS
10448 AND container_item_id = v_cont_item_id
10449 AND master_organization_id = v_organization_id;
10450
10451 line_cont_rec wsh_container_actions.cont_info;
10452 line_cont_tab wsh_container_actions.cont_info_tab;
10453
10454 l_return_status VARCHAR2(1);
10455 l_last_organization_id NUMBER;
10456 l_dd_count NUMBER;
10457 l_group_id_cnt NUMBER;
10458 l_group_id NUMBER;
10459 l_parent_delivery_detail_id NUMBER;
10460 l_error_cnt NUMBER;
10461 l_process_flag VARCHAR2(1);
10462 l_fill_pc_basis VARCHAR2(1);
10463 l_wcl_cont_item_id NUMBER;
10464 l_max_load_qty NUMBER;
10465 l_dd_gross_wt NUMBER;
10466 l_dd_net_wt NUMBER;
10467 l_dd_volume NUMBER;
10468 l_cont_fill_pc NUMBER;
10469 l_cont_name VARCHAR2(30);
10470 l_mtl_max_load NUMBER;
10471 l_mtl_max_vol NUMBER;
10472 l_mtl_wt_uom VARCHAR2(3);
10473 l_mtl_vol_uom VARCHAR2(3);
10474 l_item_name VARCHAR2(2000); -- <-- for Bug 3577115
10475 --Bug #3405853
10476 l_detail_container_item_id NUMBER;
10477
10478
10479 error_cnt NUMBER := 0;
10480 warn_cnt NUMBER := 0;
10481
10482 fill_pc_warn_cnt NUMBER := 0; -- 3562797 jckwok
10483 --
10484 l_debug_on BOOLEAN;
10485 --
10486 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'VALIDATE_CONTAINER_FOR_PACK';
10487 --
10488 BEGIN
10489
10490
10491 -- 10. Populate detail dd info into line_cont_tab PL/SQL table
10492 --
10493 --
10494 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
10495 --
10496 IF l_debug_on IS NULL
10497 THEN
10498 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
10499 END IF;
10500 --
10501 IF l_debug_on THEN
10502 WSH_DEBUG_SV.push(l_module_name);
10503 WSH_DEBUG_SV.log(l_module_name,'---------------------------------');
10504 WSH_DEBUG_SV.log(l_module_name,'In Validate_Container_For_Pack...');
10505 WSH_DEBUG_SV.log(l_module_name,'---------------------------------');
10506 END IF;
10507 --
10508 l_last_organization_id := NULL;
10509 l_dd_count := 0;
10510 l_group_id_cnt := 1;
10511
10512 WHILE ( l_group_id_cnt <= p_cont_info_tab.COUNT )
10513 LOOP
10514 --dbms_output.put_line('Processing dd '||p_cont_info_tab(l_group_id_cnt));
10515
10516 OPEN get_dd_detail(p_cont_info_tab(l_group_id_cnt));
10517
10518 FETCH get_dd_detail
10519 INTO line_cont_rec.inventory_item_id,
10520 line_cont_rec.gross_weight,
10521 line_cont_rec.weight_uom,
10522 line_cont_rec.volume,
10523 line_cont_rec.volume_uom,
10524 line_cont_rec.organization_id,
10525 line_cont_rec.delivery_detail_id,
10526 l_parent_delivery_detail_id,
10527 l_detail_container_item_id;
10528 IF (get_dd_detail%NOTFOUND) THEN
10529 CLOSE get_dd_detail;
10530 goto next_cont;
10531 END IF;
10532
10533 CLOSE get_dd_detail;
10534
10535 -- 10.10 Delete Organization Specfic Cached Tables if organization_id changes
10536 IF ((l_last_organization_id IS NULL) OR (line_cont_rec.organization_id <> l_last_organization_id)) THEN
10537 g_cache_cont_load_info_tab.DELETE;
10538 g_cont_msi_tab.DELETE;
10539
10540 l_last_organization_id := line_cont_rec.organization_id;
10541 END IF;
10542
10543 /* grouping API will return a number = negative delivery_id if the line is
10544 already assigned to a delivery. So, check for negative numbers and if number
10545 < 0, then convert it to a postive number = delivery_id.
10546 */
10547 l_group_id := ABS(p_group_id_tab(p_cont_info_tab(l_group_id_cnt)));
10548 --dbms_output.put_line('l_group_id '||l_group_id);
10549
10550 -- 10.20 Check if the detail is already packed
10551 IF (l_parent_delivery_detail_id IS NOT NULL) THEN
10552 --dbms_output.put_line('Warning: cont already packed');
10553 warn_cnt := warn_cnt + 1;
10554 goto next_cont;
10555 END IF;
10556
10557 -- 10.30 Determine Fill PC Basis from shipping parameters
10558 Calc_Fill_Basis_and_Proc_Flag(
10559 p_organization_id => line_cont_rec.organization_id,
10560 x_return_status => l_return_status,
10561 x_fill_basis => l_fill_pc_basis,
10562 x_process_flag => l_process_flag);
10563 IF l_debug_on THEN
10564 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10565 END IF;
10566 IF (l_return_status <> C_SUCCESS_STATUS) THEN
10567 error_cnt := error_cnt + 1;
10568 goto next_cont;
10569 END IF;
10570
10571 line_cont_rec.fill_pc_basis := l_fill_pc_basis;
10572 IF (line_cont_rec.fill_pc_basis IS NULL) THEN
10573 --dbms_output.put_line('Skipping cont');
10574 goto next_cont;
10575 --
10576 -- bug 3562797 jckwok
10577 -- check Shipping Parameter Fill Percent Basis.
10578 --
10579 ELSIF line_cont_rec.fill_pc_basis='N' THEN
10580 fill_pc_warn_cnt := fill_pc_warn_cnt + 1;
10584 -- 10.40 Determine Preferred Container
10581 goto next_cont;
10582 END IF;
10583 -- end of bug 3562797
10585 -- Bug 3405853 : First check the detail lpn entered if it is null
10586 -- then consider the preferred container.
10587 -- Bug 3570364 : First check the master container item for the line ( Auto Pack Master action on Lines)
10588 -- If it is NULL then check for the Detail container item for the
10589 -- LPN ( Auto Pack Action on LPN's)
10590 IF p_mast_cont_info_tab.exists(l_group_id_cnt) THEN
10591 line_cont_rec.preferred_container := nvl(p_mast_cont_info_tab(l_group_id_cnt).container_item_id,l_detail_container_item_id);
10592 ELSE
10593 line_cont_rec.preferred_container := l_detail_container_item_id;
10594 END IF;
10595 line_cont_rec.max_load_qty := NULL;
10596
10597 IF (line_cont_rec.preferred_container IS NULL) THEN
10598 Calc_Pref_Container(
10599 p_organization_id => line_cont_rec.organization_id,
10600 p_inventory_item_id => line_cont_rec.inventory_item_id,
10601 p_fill_pc_basis => line_cont_rec.fill_pc_basis,
10602 x_return_status => l_return_status,
10603 x_error_cnt => l_error_cnt,
10604 x_cont_item_id => l_wcl_cont_item_id,
10605 x_max_load_qty => l_max_load_qty);
10606 IF l_debug_on THEN
10607 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10608 END IF;
10609 IF (l_return_status = C_ERROR_STATUS) THEN
10610 error_cnt := error_cnt + l_error_cnt;
10611 END IF;
10612
10613 line_cont_rec.preferred_container := l_wcl_cont_item_id;
10614 line_cont_rec.max_load_qty := l_max_load_qty;
10615 END IF;
10616
10617 -- bug 3440811
10618 validate_container(
10619 p_organization_id => line_cont_rec.organization_id,
10620 p_cont_item_id => line_cont_rec.preferred_container,
10621 x_return_status => l_return_status);
10622
10623 IF (l_return_status IN (C_UNEXP_ERROR_STATUS,C_ERROR_STATUS)) THEN
10624 line_cont_rec.preferred_container := null;
10625 line_cont_rec.max_load_qty := null;
10626 l_error_cnt := l_error_cnt + 1;
10627 error_cnt := error_cnt + l_error_cnt;
10628 END IF;
10629 -- bug 3440811
10630
10631 IF (line_cont_rec.preferred_container is NULL) THEN
10632 --dbms_output.put_line('Skipping cont');
10633 goto next_cont;
10634 END IF;
10635
10636 -- 10.50 Calculate Max Load/Converted wt/Converted Vol depending on fill basis
10637 line_cont_rec.converted_wt := NULL;
10638 line_cont_rec.converted_vol := NULL;
10639
10640 IF (line_cont_rec.fill_pc_basis = 'Q') THEN
10641 IF (line_cont_rec.max_load_qty IS NULL) THEN
10642 OPEN Get_Cont_Item_Load (line_cont_rec.inventory_item_id,line_cont_rec.preferred_container, line_cont_rec.organization_id);
10643
10644 FETCH Get_Cont_Item_Load
10645 INTO l_max_load_qty;
10646
10647 IF Get_Cont_Item_Load%NOTFOUND THEN
10648 --dbms_output.put_line('Could not find max load qty for Item'||line_cont_rec.inventory_item_id||' Cont '||line_cont_rec.preferred_container||' Org '||line_cont_rec.organization_id);
10649 CLOSE Get_Cont_Item_Load;
10650
10651 -- Calculate max load qty depending on Weight/Volume
10652 IF (line_cont_rec.gross_weight IS NULL OR line_cont_rec.volume IS NULL) THEN
10653 --
10654 IF l_debug_on THEN
10655 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
10656 END IF;
10657 --
10658 -- J: W/V Changes
10659 WSH_WV_UTILS.Container_Weight_Volume(
10660 p_container_instance_id => line_cont_rec.delivery_detail_id,
10661 p_override_flag => 'Y',
10662 p_post_process_flag => 'Y',
10663 p_calc_wv_if_frozen => 'N',
10664 x_gross_weight => l_dd_gross_wt,
10665 x_net_weight => l_dd_net_wt,
10666 x_volume => l_dd_volume ,
10667 p_fill_pc_flag => 'N',
10668 x_cont_fill_pc => l_cont_fill_pc,
10669 x_return_status => l_return_status);
10670
10671 IF l_debug_on THEN
10672 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10673 END IF;
10674 IF (l_return_status <> C_SUCCESS_STATUS) THEN
10675 --dbms_output.put_line('WSH_TPA_CONTAINER_PKG.Container_Weight_Volume did not return success');
10676 --
10677 IF l_debug_on THEN
10678 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
10679 END IF;
10680 --
10681 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(line_cont_rec.delivery_detail_id);
10682 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
10683 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
10684 IF l_return_status = C_WARNING_STATUS THEN
10685 warn_cnt := warn_cnt + 1;
10686 ELSE
10687 error_cnt := error_cnt + 1;
10688 END IF;
10689 --dbms_output.put_line('Skipping this cont');
10690 goto next_cont;
10691 END IF;
10692
10696 IF ((NVL(line_cont_rec.gross_weight,0) = 0) OR
10693 line_cont_rec.gross_weight := NVL(line_cont_rec.gross_weight,l_dd_gross_wt);
10694 line_cont_rec.volume := NVL(line_cont_rec.volume,l_dd_volume);
10695
10697 (NVL(line_cont_rec.volume,0) = 0)) THEN
10698 --dbms_output.put_line('Weight or Volume is NULL or 0');
10699 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
10700 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10701 error_cnt := error_cnt + 1;
10702 --dbms_output.put_line('Skipping this cont');
10703 goto next_cont;
10704 END IF;
10705 END IF;
10706
10707 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 2');
10708 Get_Cont_Load_Vol_info(
10709 p_container_item_id => line_cont_rec.preferred_container,
10710 p_organization_id => line_cont_rec.organization_id,
10711 p_w_v_both => 'B',
10712 x_max_load => l_mtl_max_load,
10713 x_max_vol => l_mtl_max_vol,
10714 x_wt_uom => l_mtl_wt_uom,
10715 x_vol_uom => l_mtl_vol_uom,
10716 x_return_status => l_return_status,
10717 x_error_cnt => l_error_cnt);
10718 IF l_debug_on THEN
10719 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10720 END IF;
10721 IF (l_return_status = C_ERROR_STATUS) THEN
10722 error_cnt := error_cnt + l_error_cnt;
10723 END IF;
10724
10725 IF ((NVL(l_mtl_max_load,0) <= 0) OR (NVL(l_mtl_max_vol,0) <= 0)) THEN
10726 --dbms_output.put_line('Skipping this Cont');
10727 goto next_cont;
10728 END IF;
10729
10730 IF (l_mtl_wt_uom <> line_cont_rec.weight_uom) THEN
10731 --
10732 IF l_debug_on THEN
10733 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
10734 END IF;
10735 --
10736 l_dd_gross_wt := WSH_WV_UTILS.Convert_Uom (
10737 from_uom => line_cont_rec.weight_uom,
10738 to_uom => l_mtl_wt_uom,
10739 quantity => line_cont_rec.gross_weight,
10740 item_id => line_cont_rec.inventory_item_id);
10741 ELSE
10742 l_dd_gross_wt := line_cont_rec.gross_weight;
10743 END IF;
10744
10745 IF (l_mtl_vol_uom <> line_cont_rec.volume_uom) THEN
10746 --
10747 IF l_debug_on THEN
10748 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
10749 END IF;
10750 --
10751 l_dd_volume := WSH_WV_UTILS.Convert_Uom (
10752 from_uom => line_cont_rec.volume_uom,
10753 to_uom => l_mtl_vol_uom,
10754 quantity => line_cont_rec.volume,
10755 item_id => line_cont_rec.inventory_item_id);
10756 ELSE
10757 l_dd_volume:= line_cont_rec.volume;
10758 END IF;
10759
10760 IF ((l_mtl_max_load/l_dd_gross_wt) >= (l_mtl_max_vol/l_dd_volume)) THEN
10761 l_max_load_qty := l_mtl_max_load/l_dd_gross_wt;
10762 ELSE
10763 l_max_load_qty := l_mtl_max_vol/l_dd_volume;
10764 END IF;
10765 --dbms_output.put_line('l_dd_gross_wt '||l_dd_gross_wt||' l_dd_volume '||l_dd_volume ||' l_mtl_max_load '||l_mtl_max_load||' l_mtl_max_vol '||l_mtl_max_vol || ' l_max_load_qty '||l_max_load_qty);
10766
10767 -- Containers cannot be split. So take FLOOR of l_max_load_qty
10768 l_max_load_qty := FLOOR(l_max_load_qty);
10769
10770 ELSE -- Get_Cont_Item_Load%NOTFOUND
10771 CLOSE Get_Cont_Item_Load;
10772 END IF;
10773 line_cont_rec.max_load_qty := l_max_load_qty;
10774
10775 IF (NVL(line_cont_rec.max_load_qty,0) <= 0) THEN
10776 --dbms_output.put_line('Max Load Qty is null or <= 0. Skipping this container');
10777 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
10778 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10779 error_cnt := error_cnt + 1;
10780 goto next_cont;
10781 END IF;
10782
10783 END IF; -- line_cont_rec.max_load_qty IS NULL
10784 --dbms_output.put_line('line_cont_rec.max_load_qty '||line_cont_rec.max_load_qty);
10785 ELSIF (line_cont_rec.fill_pc_basis in ('W','V')) THEN
10786 -- Calculate max load qty depending on Weight
10787 IF ((line_cont_rec.gross_weight IS NULL AND line_cont_rec.fill_pc_basis = 'W') OR
10788 (line_cont_rec.volume IS NULL AND line_cont_rec.fill_pc_basis = 'V')) THEN
10789 --
10790 IF l_debug_on THEN
10791 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
10792 END IF;
10793 --
10794 -- J: W/V Changes
10795 WSH_WV_UTILS.Container_Weight_Volume(
10796 p_container_instance_id => line_cont_rec.delivery_detail_id,
10797 p_override_flag => 'Y',
10798 p_post_process_flag => 'Y',
10799 p_calc_wv_if_frozen => 'N',
10803 p_fill_pc_flag => 'N',
10800 x_gross_weight => l_dd_gross_wt,
10801 x_net_weight => l_dd_net_wt,
10802 x_volume => l_dd_volume ,
10804 x_cont_fill_pc => l_cont_fill_pc,
10805 x_return_status => l_return_status);
10806
10807 IF l_debug_on THEN
10808 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10809 END IF;
10810 IF (l_return_status <> C_SUCCESS_STATUS) THEN
10811 --dbms_output.put_line('WSH_TPA_CONTAINER_PKG.Container_Weight_Volume did not return success');
10812 --
10813 IF l_debug_on THEN
10814 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
10815 END IF;
10816 --
10817 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(line_cont_rec.delivery_detail_id);
10818 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_WT_VOL_FAILED');
10819 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
10820 IF l_return_status = C_WARNING_STATUS THEN
10821 warn_cnt := warn_cnt + 1;
10822 ELSE
10823 error_cnt := error_cnt + 1;
10824 END IF;
10825 error_cnt := error_cnt + 1;
10826 --dbms_output.put_line('Skipping this cont');
10827 goto next_cont;
10828 END IF;
10829
10830 IF (line_cont_rec.fill_pc_basis = 'W') THEN
10831 line_cont_rec.gross_weight := NVL(line_cont_rec.gross_weight,l_dd_gross_wt);
10832
10833 IF (NVL(line_cont_rec.gross_weight,0) = 0) THEN
10834 --dbms_output.put_line('Weight is NULL or 0');
10835 --BUG 3577115
10836 --FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_ERROR');
10837 l_item_name := WSH_UTIL_CORE.Get_Item_Name(line_cont_rec.inventory_item_id, line_cont_rec.organization_id);
10838 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NULL_WEIGHT_VOLUME');
10839 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_item_name);
10840 --BUG 3577115
10841 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10842 error_cnt := error_cnt + 1;
10843 --dbms_output.put_line('Skipping this Cont');
10844 goto next_cont;
10845 END IF;
10846 ELSE
10847 line_cont_rec.volume := NVL(line_cont_rec.volume,l_dd_volume);
10848
10849 IF (NVL(line_cont_rec.volume,0) = 0) THEN
10850 --dbms_output.put_line('Volume is NULL or 0');
10851 --BUG 3577115
10852 --FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_VOL_ERROR');
10853 l_item_name := WSH_UTIL_CORE.Get_Item_Name(line_cont_rec.inventory_item_id, line_cont_rec.organization_id);
10854 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NULL_WEIGHT_VOLUME');
10855 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_item_name);
10856 --BUG 3577115
10857 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10858 error_cnt := error_cnt + 1;
10859 --dbms_output.put_line('Skipping this Cont');
10860 goto next_cont;
10861 END IF;
10862 END IF;
10863 END IF;
10864 --dbms_output.put_line('Call to GET CONT LOAD VOL INFO 1');
10865 Get_Cont_Load_Vol_info(
10866 p_container_item_id => line_cont_rec.preferred_container,
10867 p_organization_id => line_cont_rec.organization_id,
10868 p_w_v_both => line_cont_rec.fill_pc_basis,
10869 x_max_load => l_mtl_max_load,
10870 x_max_vol => l_mtl_max_vol,
10871 x_wt_uom => l_mtl_wt_uom,
10872 x_vol_uom => l_mtl_vol_uom,
10873 x_return_status => l_return_status,
10874 x_error_cnt => l_error_cnt);
10875 IF l_debug_on THEN
10876 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
10877 END IF;
10878 IF (l_return_status = C_ERROR_STATUS) THEN
10879 error_cnt := error_cnt + l_error_cnt;
10880 END IF;
10881
10882 IF (line_cont_rec.fill_pc_basis = 'W') THEN
10883 IF (NVL(l_mtl_max_load,0) <= 0) THEN
10884 --dbms_output.put_line('Skipping this Cont');
10885 goto next_cont;
10886 END IF;
10887
10888 line_cont_rec.cont_wt := l_mtl_max_load;
10889
10890 IF (l_mtl_wt_uom <> line_cont_rec.weight_uom) THEN
10891 --
10892 IF l_debug_on THEN
10893 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
10894 END IF;
10895 --
10896 l_dd_net_wt := WSH_WV_UTILS.Convert_Uom (
10897 from_uom => line_cont_rec.weight_uom,
10898 to_uom => l_mtl_wt_uom,
10899 quantity => line_cont_rec.gross_weight,
10900 item_id => line_cont_rec.inventory_item_id);
10901 ELSE
10902 l_dd_net_wt := line_cont_rec.gross_weight;
10903 END IF;
10904
10905
10906 line_cont_rec.converted_wt := l_dd_net_wt;
10907 --dbms_output.put_line('line_cont_rec.converted_wt '||line_cont_rec.converted_wt);
10908 ELSE
10909 IF (NVL(l_mtl_max_vol,0) <= 0) THEN
10910 --dbms_output.put_line('Skipping this Cont');
10911 goto next_cont;
10912 END IF;
10913
10917 --
10914 line_cont_rec.cont_vol := l_mtl_max_vol;
10915
10916 IF (l_mtl_vol_uom <> line_cont_rec.volume_uom) THEN
10918 IF l_debug_on THEN
10919 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.CONVERT_UOM',WSH_DEBUG_SV.C_PROC_LEVEL);
10920 END IF;
10921 --
10922 l_dd_volume := WSH_WV_UTILS.Convert_Uom (
10923 from_uom => line_cont_rec.volume_uom,
10924 to_uom => l_mtl_vol_uom,
10925 quantity => line_cont_rec.volume,
10926 item_id => line_cont_rec.inventory_item_id);
10927 ELSE
10928 l_dd_volume := line_cont_rec.volume;
10929 END IF;
10930 line_cont_rec.converted_vol := l_dd_volume;
10931 --dbms_output.put_line('line_cont_rec.converted_vol '||line_cont_rec.converted_vol);
10932 END IF;
10933
10934 -- Check if the Master container can hold atleast 1 piece of the Detail Container
10935 IF ((line_cont_rec.fill_pc_basis = 'W' AND (line_cont_rec.converted_wt > l_mtl_max_load)) OR
10936 (line_cont_rec.fill_pc_basis = 'V' AND (line_cont_rec.converted_vol > l_mtl_max_vol))) THEN
10937 --dbms_output.put_line('Indivisible flag is Y and Preferred Mast Cont cannot hold atleast 1 piece');
10938 -- Bug#: 2503937 - New Error Message
10939 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_MAX_WT_VOL_ERROR');
10940 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
10941 error_cnt := error_cnt + 1;
10942 --dbms_output.put_line('Skipping this Cont');
10943 goto next_cont;
10944 END IF;
10945 END IF;
10946
10947 -- 10.60 Populate line_cont_tab PL/SQL table now
10948 line_cont_rec.group_id := l_group_id;
10949 line_cont_rec.shp_qty := 1;
10950 line_cont_rec.req_qty := 1;
10951
10952 l_dd_count := l_dd_count + 1;
10953 line_cont_tab(l_dd_count) := line_cont_rec;
10954
10955 <<next_cont>>
10956 l_group_id_cnt := l_group_id_cnt + 1;
10957
10958 END LOOP;
10959
10960 x_error_cnt := error_cnt;
10961 x_warn_cnt := warn_cnt;
10962 x_line_cont_tab := line_cont_tab;
10963 x_fill_pc_warn_cnt := fill_pc_warn_cnt; -- bug 3562797 jckwok
10964
10965 IF l_debug_on THEN
10966 WSH_DEBUG_SV.log(l_module_name,'p_cont_info_tab count->'||p_cont_info_tab.count||' x_line_cont_tab count->'||x_line_cont_tab.count);
10967 WSH_DEBUG_SV.log(l_module_name,'Error Count '|| error_cnt||' Warning Count '|| warn_cnt);
10968 WSH_DEBUG_SV.pop(l_module_name);
10969 END IF;
10970
10971 RETURN;
10972
10973 EXCEPTION
10974 WHEN Others THEN
10975 IF (Get_dd_Detail%ISOPEN) THEN
10976 CLOSE Get_dd_Detail;
10977 END IF;
10978 IF (Get_Cont_Item_Load%ISOPEN) THEN
10979 CLOSE Get_Cont_Item_Load;
10980 END IF;
10981 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Validate_Container_For_Pack',l_module_name);
10982 --
10983 IF l_debug_on THEN
10984 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
10985 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
10986 END IF;
10987 --
10988 raise;
10989
10990 END Validate_Container_For_Pack;
10991
10992
10993 /*
10994 -----------------------------------------------------------------------------
10995 PROCEDURE : Auto_Pack_Conts
10996 PARAMETERS : p_group_id_tab_id - table of group ids for containers that need
10997 to be autopacked.
10998 p_det_cont_info - table of detail containers created during the
10999 autopack process consisting of container instances, master
11000 container item ids and percentage empty.
11001 p_cont_detail_tab - table of container delivery detail ids that
11002 were created during the autopacking of lines.
11003 x_cont_instance_id - table of container instance ids that were
11004 created during the autopacking.
11005 x_return_status - return status of API.
11006 DESCRIPTION : This procedure takes the number of containers and groups them
11007 by common grouping attributes - similar to grouping attributes
11008 of delivery. If a group id table is specified it uses the
11009 group ids in the table to decided which container can be
11010 grouped into the same parent container. If a group id table is
11011 not specified, it creates the group id table before autopacking
11012 It creates the required number and type of parent containers
11013 per detail container and keeps track of all partially filled
11014 containers in the empty containers table. Before creating new
11015 container instances, it searches for available space using the
11016 empty container table and after filling up a container, it
11017 creates a new one if there are no empty containers of the same
11018 type. The difference between this API and the autopack lines is
11019 that this API does not split containers if they don't fit
11020 entirely into a parent container.
11021 ------------------------------------------------------------------------------
11022 */
11023
11024 PROCEDURE Auto_Pack_Conts (
11025 p_group_id_tab IN WSH_UTIL_CORE.id_tab_type,
11026 p_cont_info_tab IN wsh_container_actions.empty_cont_info_tab,
11027 p_cont_detail_tab IN WSH_UTIL_CORE.id_tab_type,
11028 x_cont_instance_tab IN OUT NOCOPY WSH_UTIL_CORE.id_tab_type,
11032 line_cont_tab wsh_container_actions.cont_info_tab;
11029 x_return_status OUT NOCOPY VARCHAR2) IS
11030
11031 line_cont_rec wsh_container_actions.cont_info;
11033
11034 l_group_id_temp_tab WSH_UTIL_CORE.id_tab_type;
11035 l_group_id_tab WSH_UTIL_CORE.id_tab_type;
11036 l_del_row_tab WSH_UTIL_CORE.id_tab_type;
11037 l_return_status VARCHAR2(1);
11038 l_cont_instance_id NUMBER;
11039 l_row_id VARCHAR2(30);
11040 l_gross_weight NUMBER;
11041 l_net_weight NUMBER;
11042 l_volume NUMBER;
11043 l_err_cont_name VARCHAR2(30);
11044 l_cont_instance_cnt NUMBER;
11045 l_last_organization_id NUMBER;
11046 l_cont_fill_pc NUMBER;
11047 l_cont_name VARCHAR2(30);
11048
11049
11050 l_attr_tab wsh_delivery_autocreate.grp_attr_tab_type;
11051 l_group_tab wsh_delivery_autocreate.grp_attr_tab_type;
11052 l_action_rec wsh_delivery_autocreate.action_rec_type;
11053 l_target_rec wsh_delivery_autocreate.grp_attr_rec_type;
11054 l_matched_entities wsh_util_core.id_tab_type;
11055 l_out_rec wsh_delivery_autocreate.out_rec_type;
11056
11057
11058 i NUMBER;
11059 cnt NUMBER;
11060
11061 error_cnt NUMBER := 0;
11062 succ_cnt NUMBER := 0;
11063 warn_cnt NUMBER := 0;
11064 cont_warn NUMBER := 0;
11065
11066 l_fill_pc_warn_count NUMBER := 0; -- bug 3562797 jckwok
11067
11068 CURSOR c_get_detail(p_del_det_id NUMBER) IS
11069 SELECT nvl(ignore_for_planning, 'N') ignore_for_planning,
11070 organization_id, -- K LPN CON. rv
11071 nvl(line_direction,'O') line_direction -- K LPN CONV. rv
11072 FROM wsh_delivery_details
11073 WHERE delivery_detail_id=p_del_det_id;
11074
11075 -- K LPN CONV. rv
11076 l_wms_org VARCHAR2(10) := 'N';
11077 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
11078 l_cont_tab wsh_util_core.id_tab_type;
11079 l_lpn_unit_weight NUMBER;
11080 l_lpn_unit_volume NUMBER;
11081 l_lpn_weight_uom_code VARCHAR2(100);
11082 l_lpn_volume_uom_code VARCHAR2(100);
11083 l_cnt_orgn_id NUMBER;
11084 l_cnt_line_dir VARCHAR2(10);
11085 l_cnt_ignore_plan_flag VARCHAR2(10);
11086 -- K LPN CONV. rv
11087 --
11088 l_debug_on BOOLEAN;
11089 --
11090 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'AUTO_PACK_CONTS';
11091 --
11092 BEGIN
11093
11094 --dbms_output.put_line('==================================================');
11095 --dbms_output.put_line('Start of WSH_CONTAINER_ACTIONS.Auto_Pack_Conts...');
11096 --dbms_output.put_line('==================================================');
11097
11098 -- Delete all Global PL/SQL tables to start with
11099 --
11100 --
11101 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
11102 --
11103 IF l_debug_on IS NULL
11104 THEN
11105 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
11106 END IF;
11107 --
11108 IF l_debug_on THEN
11109 WSH_DEBUG_SV.push(l_module_name);
11110 END IF;
11111 --
11112 g_empty_cont_tab.DELETE;
11113 g_assign_detail_tab.DELETE;
11114 g_new_container_tab.DELETE;
11115 g_cache_organization_info_tab.DELETE;
11116 g_cont_msi_tab.DELETE;
11117 g_new_cont_index := 0;
11118 g_assign_detail_index := 0;
11119
11120 -- 10. Check if Count of p_del_detail_tab table is 0
11121 --IF (p_cont_detail_tab.COUNT = 0 OR p_cont_info_tab.COUNT = 0) THEN
11122 IF (p_cont_detail_tab.COUNT = 0) THEN
11123 --dbms_output.put_line('p_cont_detail_tab count is 0');
11124 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CONT_ASSG_NULL');
11125 x_return_status := C_ERROR_STATUS;
11126 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11127 --
11128 IF l_debug_on THEN
11129 WSH_DEBUG_SV.pop(l_module_name);
11130 END IF;
11131 --
11132 return;
11133 END IF;
11134
11135 -- 20. Generate Grouping Ids
11136 IF p_group_id_tab.COUNT = 0 THEN
11137
11138 -- call autocreate delivery API with a check flag set to 'Y' and
11139 -- container flag set to 'Y' to fetch group id table for delivery lines
11140
11141 --dbms_output.put_line('Calling WSH_DELIVERY_AUTOCREATE.autocreate_deliveries to generate group_ids');
11142 --
11143 IF l_debug_on THEN
11144 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_AUTOCREATE.AUTOCREATE_DELIVERIES',WSH_DEBUG_SV.C_PROC_LEVEL);
11145 END IF;
11146 --
11147 l_attr_tab.delete;
11148 FOR i in 1..p_cont_detail_tab.count LOOP
11149
11150 l_attr_tab(i).entity_id := p_cont_detail_tab(i);
11151 l_attr_tab(i).entity_type := 'DELIVERY_DETAIL';
11152
11153 END LOOP;
11154
11155 l_action_rec.action := 'MATCH_GROUPS';
11156
11157
11158
11159 WSH_Delivery_AutoCreate.Find_Matching_Groups(p_attr_tab => l_attr_tab,
11160 p_action_rec => l_action_rec,
11161 p_target_rec => l_target_rec,
11162 p_group_tab => l_group_tab,
11163 x_matched_entities => l_matched_entities,
11164 x_out_rec => l_out_rec,
11165 x_return_status => l_return_status);
11166
11167
11168
11169 IF l_debug_on THEN
11173 (l_return_status = C_UNEXP_ERROR_STATUS) THEN
11170 WSH_DEBUG_SV.log(l_module_name,'return status', l_return_status);
11171 END IF;
11172 IF (l_return_status = C_ERROR_STATUS) OR
11174 --dbms_output.put_line('WSH_DELIVERY_AUTOCREATE.autocreate_deliveries returned '||l_return_status);
11175 FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
11176 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
11177 x_return_status := l_return_status;
11178 --
11179 IF l_debug_on THEN
11180 WSH_DEBUG_SV.pop(l_module_name);
11181 END IF;
11182 --
11183 return;
11184 END IF;
11185 FOR i in 1..l_attr_tab.COUNT LOOP
11186 l_group_id_tab(l_attr_tab(i).entity_id) := l_attr_tab(i).group_id;
11187 END LOOP;
11188 ELSE
11189 cnt := p_group_id_tab.FIRST;
11190 IF ((cnt IS NULL) OR (p_group_id_tab.COUNT <> p_cont_detail_tab.count)) THEN
11191 x_return_status := C_ERROR_STATUS;
11192 FND_MESSAGE.SET_NAME('WSH','WSH_GROUP_DETAILS_ERROR');
11193 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11194 --
11195 IF l_debug_on THEN
11196 WSH_DEBUG_SV.pop(l_module_name);
11197 END IF;
11198 --
11199 return;
11200 ELSE
11201 FOR i in 1..l_group_id_tab.COUNT LOOP
11202 l_group_id_tab(p_cont_detail_tab(i)) := p_group_id_tab(i);
11203 END LOOP;
11204 END IF;
11205 END IF;
11206
11207 --dbms_output.put_line('Checking group_ids is over');
11208
11209 -- 40. Call Validate_Container_For_Pack to validate detail info in p_cont_detail_tab
11210 -- Bug 3570364 : Passing the parameter p_cont_info_tab which contains the
11211 -- master container item id's for all LPN's( For Auto_pack Master Action on Lines).
11212 Validate_Container_For_Pack(
11213 p_group_id_tab => l_group_id_tab,
11214 p_cont_info_tab => p_cont_detail_tab,
11215 p_mast_cont_info_tab => p_cont_info_tab,
11216 x_line_cont_tab => line_cont_tab,
11217 x_error_cnt => error_cnt,
11218 x_warn_cnt => warn_cnt,
11219 x_fill_pc_warn_cnt => l_fill_pc_warn_count -- bug 3562797 jckwok
11220 );
11221
11222 IF l_debug_on THEN
11223 WSH_DEBUG_SV.log(l_module_name,'after validate container for pack-error,warning', error_cnt||','||warn_cnt);
11224 END IF;
11225 --
11226 -- bug 3562797 jckwok
11227 -- Raise Error if all containers have 'Shipping Parameter' percent fill basis as None
11228 -- Raise warning if found some of the containers with 'Shipping Parameter'
11229 -- percent fill basis as None.
11230 --
11231 IF (l_fill_pc_warn_count = p_cont_detail_tab.count) THEN
11232 x_return_status := C_ERROR_STATUS;
11233 FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
11234 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11235 IF l_debug_on THEN
11236 WSH_DEBUG_SV.pop(l_module_name);
11237 END IF;
11238 RETURN;
11239 ELSIF (l_fill_pc_warn_count > 0) THEN
11240 IF (l_return_status <> C_ERROR_STATUS) THEN
11241 x_return_status := C_WARNING_STATUS;
11242 warn_cnt := warn_cnt + 1;
11243 FND_MESSAGE.SET_NAME('WSH','WSH_FILL_BASIS_NONE');
11244 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11245 END IF;
11246 END IF;
11247 -- end of bug 3562797 jckwok
11248
11249 IF (line_cont_tab.COUNT > 0) THEN
11250 -- 50. Loop through all Containers that need to be Auto-Packed
11251 cnt := 1;
11252 succ_cnt := 0;
11253 l_last_organization_id := NULL;
11254 WHILE (cnt <= line_cont_tab.COUNT) LOOP
11255
11256 --dbms_output.put_line('======================================================');
11257 IF l_debug_on THEN
11258 WSH_DEBUG_SV.log(l_module_name,'auto-packing Container ' || line_cont_tab(cnt).delivery_detail_id||' Organization id '||line_cont_tab(cnt).organization_id);
11259 END IF;
11260
11261 IF (l_last_organization_id is NULL) THEN
11262 l_last_organization_id := line_cont_tab(cnt).organization_id;
11263 ELSIF (l_last_organization_id <> line_cont_tab(cnt).organization_id) THEN
11264 l_last_organization_id := line_cont_tab(cnt).organization_id;
11265
11266 -- Delete the empty PL/SQL cont table if organization_id changes
11267 g_empty_cont_tab.DELETE;
11268 END IF;
11269
11270 Pack_Container(
11271 p_line_cont_rec => line_cont_tab(cnt),
11272 x_return_status => l_return_status);
11273
11274 IF l_return_status = C_ERROR_STATUS THEN
11275 error_cnt := error_cnt + 1;
11276 ELSE
11277 succ_cnt := succ_cnt + 1;
11278 END IF;
11279 cnt := cnt + 1;
11280
11281 END LOOP;
11282
11283 -- 60.1 Create Containers from g_new_container_tab PL/SQL table
11284 --dbms_output.put_line('*** Creating Actual Containers ***');
11285 cnt := 1;
11286 l_cont_instance_cnt := 1;
11287 WHILE (cnt <= g_new_container_tab.COUNT) LOOP
11288 l_cont_name := null;
11289
11290 --
11291 -- K LPN CONV. rv
11292 IF l_debug_on THEN
11293 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.CREATE_CONT_INSTANCE_MULTI',WSH_DEBUG_SV.C_PROC_LEVEL);
11294 END IF;
11295 --
11296 WSH_CONTAINER_ACTIONS.Create_Cont_Instance_Multi(
11297 x_cont_name => l_cont_name,
11301 p_organization_id => g_new_container_tab(cnt).organization_id,
11298 p_cont_item_id => g_new_container_tab(cnt).container_item_id,
11299 x_cont_instance_id => l_cont_instance_id,
11300 p_par_detail_id => NULL,
11302 p_container_type_code => NULL,
11303 p_num_of_containers => 1,
11304 x_row_id => l_row_id,
11305 x_return_status => l_return_status,
11306 x_cont_tab => l_cont_tab,
11307 x_unit_weight => l_lpn_unit_weight,
11308 x_unit_volume => l_lpn_unit_volume,
11309 x_weight_uom_code => l_lpn_weight_uom_code,
11310 x_volume_uom_code => l_lpn_volume_uom_code,
11311 p_lpn_id => NULL,
11312 p_ignore_for_planning => NULL,
11313 p_caller => 'WSH_AUTO_PACK_CONTS');
11314 IF l_debug_on THEN
11315 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
11316 WSH_DEBUG_SV.log(l_module_name,'count of l_cont_tab',l_cont_tab.count);
11317 END IF;
11318 -- K LPN CONV. rv
11319
11320 IF l_return_status <> C_SUCCESS_STATUS THEN
11321 --dbms_output.put_line('Container Creation failed for index '|| cnt);
11322 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
11323 WSH_UTIL_CORE.Add_Message(C_ERROR_STATUS,l_module_name);
11324 error_cnt := error_cnt + 1;
11325 ELSE
11326 l_cont_instance_id := l_cont_tab(1);
11327 g_new_container_tab(cnt).cont_instance_id := l_cont_instance_id;
11328 x_cont_instance_tab(l_cont_instance_cnt) := l_cont_instance_id;
11329 l_cont_instance_cnt := l_cont_instance_cnt + 1;
11330 --dbms_output.put_line('Container dd id '||l_cont_instance_id||' for index '|| cnt);
11331 END IF;
11332 cnt := cnt + 1;
11333 END LOOP;
11334
11335
11336 -- 70.1 Assign Details to Actual Containers created
11337 --dbms_output.put_line('*** Assigning Containers to Containers Created ***');
11338 cnt := 1;
11339 WHILE (cnt <= g_assign_detail_tab.COUNT) LOOP
11340 l_cont_instance_id := g_new_container_tab(g_assign_detail_tab(cnt).container_index).cont_instance_id;
11341 IF l_debug_on THEN
11342 WSH_DEBUG_SV.log(l_module_name,'DD '||g_assign_detail_tab(cnt).delivery_detail_id||' Index '||g_assign_detail_tab(cnt).container_index||' Cont '||l_cont_instance_id);
11343 END IF;
11344
11345 --
11346 -- K LPN CONV. rv
11347 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
11348 --{
11349 open c_get_detail(l_cont_instance_id);
11350 fetch c_get_detail into l_cnt_ignore_plan_flag, l_cnt_orgn_id, l_cnt_line_dir;
11351 close c_get_detail;
11352
11353 l_wms_org := wsh_util_validate.check_wms_org(l_cnt_orgn_id);
11354 --}
11355 END IF;
11356 -- K LPN CONV. rv
11357 --
11358 -- J TP Release
11359 --update the container's ignore value with the first line's ignore
11360 --since grouping will have already sorted out lines with diff ignore, this shud be okay
11361 FOR cur IN c_get_detail(g_assign_detail_tab(cnt).delivery_detail_id) LOOP
11362 IF l_debug_on THEN
11363 WSH_DEBUG_SV.log(l_module_name,'ignore_for_planning',cur.ignore_for_planning);
11364 END IF;
11365 --
11366 -- K LPN CONV. rv
11367 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
11368 AND l_cnt_line_dir IN ('O','IO')
11369 AND
11370 (
11371 (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
11372 OR
11373 (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
11374 )
11375 THEN
11376 --{
11377 l_sync_tmp_rec.delivery_detail_id := l_cont_instance_id;
11378 l_sync_tmp_rec.operation_type := 'UPDATE';
11379 WSH_WMS_SYNC_TMP_PKG.MERGE
11380 (
11381 p_sync_tmp_rec => l_sync_tmp_rec,
11382 x_return_status => l_return_status
11383 );
11384
11385 IF l_debug_on THEN
11386 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
11387 END IF;
11388 --
11389 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11390 --
11391 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11392 warn_cnt := warn_cnt + 1;
11393 ELSE
11394 --
11395 error_cnt := error_cnt + 1;
11396 IF l_debug_on THEN
11397 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_WMS_SYNC_TMP_PKG.MERGE completed with an error');
11398 END IF;
11399 --
11400 END IF;
11401 --
11402 END IF;
11403 --}
11404 END IF;
11405 -- K LPN CONV. rv
11406 UPDATE wsh_delivery_details
11407 SET ignore_for_planning=cur.ignore_for_planning
11408 WHERE delivery_detail_id=l_cont_instance_id;
11409
11410 IF SQL%NOTFOUND THEN
11411 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
11412 IF l_debug_on THEN
11416 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
11413 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
11414 END IF;
11415 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(l_cont_instance_id);
11417 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11418 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11419 IF l_debug_on THEN
11420 WSH_DEBUG_SV.pop(l_module_name);
11421 END IF;
11422 return;
11423 END IF;
11424 END LOOP;
11425
11426 IF (l_cont_instance_id is NOT NULL) THEN
11427 --
11428 IF l_debug_on THEN
11429 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.ASSIGN_TO_CONTAINER',WSH_DEBUG_SV.C_PROC_LEVEL);
11430 END IF;
11431 --
11432 wsh_container_actions.Assign_To_Container (
11433 p_det_cont_inst_id => g_assign_detail_tab(cnt).delivery_detail_id,
11434 p_par_cont_inst_id => l_cont_instance_id,
11435 x_return_status => l_return_status);
11436 IF l_debug_on THEN
11437 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
11438 END IF;
11439
11440 --dbms_output.put_line('WSH_CONTAINER_ACTIONS.Assign_To_Container returned '||l_return_status);
11441 IF l_return_status = C_ERROR_STATUS THEN
11442 error_cnt := error_cnt + 1;
11443 ELSIF l_return_status = C_WARNING_STATUS THEN
11444 warn_cnt := warn_cnt + 1;
11445 ELSE
11446 NULL;
11447 --dbms_output.put_line('Assigned dd '||g_assign_detail_tab(cnt).delivery_detail_id||' to Cont '||l_cont_instance_id);
11448 END IF;
11449 END IF;
11450
11451 cnt := cnt + 1;
11452 END LOOP;
11453
11454 END IF; -- line_cont_tab.COUNT > 0
11455
11456 IF l_debug_on THEN
11457 WSH_DEBUG_SV.log(l_module_name,'error cnt is ' || error_cnt || ' warn cnt is ' || warn_cnt|| ' succ cnt is ' || succ_cnt);
11458 END IF;
11459
11460 -- 90.1 Summarize errors/warnings
11461 IF (error_cnt > 0) THEN
11462 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CONT_PACK_ERROR');
11463 FND_MESSAGE.SET_TOKEN('ERROR_COUNT',error_cnt);
11464 FND_MESSAGE.SET_TOKEN('WARN_COUNT',warn_cnt);
11465 FND_MESSAGE.SET_TOKEN('SUCC_COUNT',succ_cnt);
11466 IF succ_cnt > 0 THEN
11467 x_return_status := C_WARNING_STATUS;
11468 ELSE
11469 x_return_status := C_ERROR_STATUS;
11470 END IF;
11471 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11472 ELSIF (warn_cnt > 0 OR cont_warn > 0) THEN
11473 x_return_status := C_WARNING_STATUS;
11474 IF cont_warn > 0 THEN
11475 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_PACK_WARN');
11476 FND_MESSAGE.SET_TOKEN('CONT_WARN',cont_warn);
11477 FND_MESSAGE.SET_TOKEN('CONT_ERR',0);
11478 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11479 END IF;
11480 ELSE
11481 x_return_status := C_SUCCESS_STATUS;
11482 END IF;
11483
11484 --
11485 IF l_debug_on THEN
11486 WSH_DEBUG_SV.pop(l_module_name);
11487 END IF;
11488 --
11489 RETURN;
11490
11491 --
11492 IF l_debug_on THEN
11493 WSH_DEBUG_SV.pop(l_module_name);
11494 END IF;
11495 --
11496 EXCEPTION
11497 WHEN Others THEN
11498 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Auto_Pack_conts',l_module_name);
11499 x_return_status := C_UNEXP_ERROR_STATUS;
11500
11501 --
11502 IF l_debug_on THEN
11503 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11504 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11505 END IF;
11506 --
11507 END Auto_Pack_conts;
11508
11509 /*
11510 -----------------------------------------------------------------------------
11511 PROCEDURE : Update_Cont_Attributes
11512 PARAMETERS : p_delivery_detail_id - delivery detail id
11513 p_delivery_id - delivery id if container assigned to delivery
11514 p_container_instance_id - delivery detail id for the container
11515 x_return_status - return status of API
11516 DESCRIPTION : This procedure updates the grouping attribute columns of the
11517 container with the grouping attribute values derived from the
11518 delivery line that is input.
11519 ------------------------------------------------------------------------------
11520 */
11521
11522 PROCEDURE Update_Cont_Attributes (
11523 p_delivery_detail_id IN NUMBER,
11524 p_delivery_id IN NUMBER,
11525 p_container_instance_id IN NUMBER,
11526 x_return_status OUT NOCOPY VARCHAR2) IS
11527
11528
11529 CURSOR Get_Detail_Attr (v_detail_id NUMBER) IS
11530 SELECT organization_id, customer_id, ship_to_location_id,
11531 intmed_ship_to_location_id,
11532 fob_code, freight_terms_code, ship_method_code,
11533 mode_of_transport, service_level, carrier_id,
11534 deliver_to_location_id,
11535 NVL(line_direction,'O') line_direction, -- J-IB-NPARIKH
11536 shipping_control, -- J-IB-NPARIKH
11537 vendor_id, -- J-IB-NPARIKH
11538 party_id, -- J-IB-NPARIKH
11539 nvl(ignore_for_planning, 'N') ignore_for_planning --J TP Release
11540 FROM WSH_DELIVERY_DETAILS
11541 WHERE delivery_detail_id = v_detail_id;
11542
11543 CURSOR Get_Del_Attr (v_del_id NUMBER) IS
11544 SELECT organization_id, customer_id, ultimate_dropoff_location_id,
11548 ultimate_dropoff_location_id deliver_to_location_id,
11545 intmed_ship_to_location_id,
11546 fob_code, freight_terms_code, ship_method_code,
11547 mode_of_transport, service_level, carrier_id,
11549 NVL(shipment_direction,'O') line_direction, -- J-IB-NPARIKH
11550 shipping_control, -- J-IB-NPARIKH
11551 vendor_id, -- J-IB-NPARIKH
11552 party_id, -- J-IB-NPARIKH
11553 nvl(ignore_for_planning,'N') ignore_for_planning --J TP Release
11554 FROM WSH_NEW_DELIVERIES
11555 WHERE delivery_id = v_del_id;
11556
11557 l_cont_name VARCHAR2(30);
11558
11559 l_org_id NUMBER;
11560 l_cust_id NUMBER;
11561 l_intmed_loc_id NUMBER;
11562 l_fob_code VARCHAR2(30);
11563 l_freight_terms_code VARCHAR2(30);
11564 l_ship_method_code VARCHAR2(30);
11565 l_carrier_id NUMBER;
11566 l_service_level VARCHAR2(30);
11567 l_mode_of_transport VARCHAR2(30);
11568 l_deliver_to_loc_id NUMBER;
11569 l_ship_to_loc_id NUMBER;
11570 l_line_direction VARCHAR2(30);
11571 l_shipping_control VARCHAR2(30);
11572 l_vendor_id NUMBER;
11573 l_party_id NUMBER;
11574 l_ignore_for_planning VARCHAR2(1);
11575
11576 -- K LPN CONV. rv
11577 l_wms_org VARCHAR2(10) := 'N';
11578 l_sync_tmp_rec wsh_glbl_var_strct_grp.sync_tmp_rec_type;
11579 l_return_status VARCHAR2(1);
11580 l_num_warnings NUMBER := 0;
11581 l_cnt_line_dir VARCHAR2(10);
11582 -- K LPN CONV. rv
11583
11584 --
11585 l_debug_on BOOLEAN;
11586 --
11587 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_CONT_ATTRIBUTES';
11588 --
11589 BEGIN
11590
11591 --
11592 --
11593 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
11594 --
11595 IF l_debug_on IS NULL
11596 THEN
11597 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
11598 END IF;
11599 --
11600 IF l_debug_on THEN
11601 WSH_DEBUG_SV.push(l_module_name);
11602 --
11603 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_DETAIL_ID',P_DELIVERY_DETAIL_ID);
11604 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
11605 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
11606 END IF;
11607 --
11608 IF p_delivery_detail_id IS NOT NULL THEN
11609
11610 OPEN Get_Detail_Attr (p_delivery_detail_id);
11611
11612 FETCH Get_Detail_Attr INTO
11613 l_org_id,
11614 l_cust_id,
11615 l_ship_to_loc_id,
11616 l_intmed_loc_id,
11617 l_fob_code,
11618 l_freight_terms_code,
11619 l_ship_method_code,
11620 l_mode_of_transport,
11621 l_service_level,
11622 l_carrier_id,
11623 l_deliver_to_loc_id,
11624 l_line_direction,
11625 l_shipping_control,
11626 l_vendor_id,
11627 l_partY_id,
11628 l_ignore_for_planning
11629 ;
11630
11631 IF Get_Detail_Attr%NOTFOUND THEN
11632 --dbms_output.put_line('invalid detail id ' || p_delivery_detail_id);
11633 CLOSE Get_Detail_Attr;
11634 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DETAIL');
11635 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_detail_id);
11636 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11637 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11638 --
11639 IF l_debug_on THEN
11640 WSH_DEBUG_SV.pop(l_module_name);
11641 END IF;
11642 --
11643 return;
11644 END IF;
11645
11646 IF Get_Detail_Attr%ISOPEN THEN
11647 CLOSE Get_Detail_Attr;
11648 END IF;
11649
11650 ELSIF p_delivery_id IS NOT NULL THEN
11651
11652 OPEN Get_Del_Attr (p_delivery_id);
11653
11654 FETCH Get_Del_Attr INTO
11655 l_org_id,
11656 l_cust_id,
11657 l_ship_to_loc_id,
11658 l_intmed_loc_id,
11659 l_fob_code,
11660 l_freight_terms_code,
11661 l_ship_method_code,
11662 l_mode_of_transport,
11663 l_service_level,
11664 l_carrier_id,
11665 l_deliver_to_loc_id,
11666 l_line_direction,
11667 l_shipping_control,
11668 l_vendor_id,
11669 l_partY_id,
11670 l_ignore_for_planning
11671 ;
11672
11673 IF Get_Del_Attr%NOTFOUND THEN
11674 CLOSE Get_Del_Attr;
11675 FND_MESSAGE.SET_NAME('WSH','WSH_DET_INVALID_DELIVERY');
11676 FND_MESSAGE.SET_TOKEN('DETAIL_ID',p_delivery_id);
11677 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11678 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11679 --
11680 IF l_debug_on THEN
11681 WSH_DEBUG_SV.pop(l_module_name);
11682 END IF;
11683 --
11684 return;
11685 END IF;
11686
11687 IF Get_Del_Attr%ISOPEN THEN
11688 CLOSE Get_Del_Attr;
11689 END IF;
11690
11691 ELSE
11692 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NO_ATTR_ERROR');
11693 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11694 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11695 --
11696 IF l_debug_on THEN
11697 WSH_DEBUG_SV.pop(l_module_name);
11698 END IF;
11699 --
11700 return;
11701
11702 END IF;
11703
11704
11705 --dbms_output.put_line('calling update with customer id ' || l_cust_id || ' and ship to ' || l_ship_to_loc_id);
11706
11707 -- K LPN CONV. rv
11708 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y' THEN
11712 END LOOP;
11709 FOR cnt_inst_rec in Get_Detail_Attr(p_container_instance_id) LOOP
11710 l_wms_org := wsh_util_validate.check_wms_org(cnt_inst_rec.organization_id);
11711 l_cnt_line_dir := cnt_inst_rec.line_direction;
11713 END IF;
11714 --
11715 IF WSH_WMS_LPN_GRP.G_CALLBACK_REQUIRED = 'Y'
11716 AND l_cnt_line_dir IN ('O','IO')
11717 AND
11718 (
11719 (WSH_WMS_LPN_GRP.GK_WMS_UPD_GRP and l_wms_org = 'Y')
11720 OR
11721 (WSH_WMS_LPN_GRP.GK_INV_UPD_GRP and l_wms_org = 'N')
11722 )
11723 THEN
11724 --{
11725 l_sync_tmp_rec.delivery_detail_id := p_container_instance_id;
11726 l_sync_tmp_rec.operation_type := 'UPDATE';
11727 WSH_WMS_SYNC_TMP_PKG.MERGE
11728 (
11729 p_sync_tmp_rec => l_sync_tmp_rec,
11730 x_return_status => l_return_status
11731 );
11732
11733 IF l_debug_on THEN
11734 WSH_DEBUG_SV.log(l_module_name,'Return Status after calling WSH_WMS_SYNC_TMP_PKG.MERGE',l_return_status);
11735 END IF;
11736 --
11737 IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
11738 --
11739 x_return_status := l_return_status;
11740 --
11741 IF l_debug_on THEN
11742 WSH_DEBUG_SV.log(l_module_name,'Return Status',l_return_status);
11743 WSH_DEBUG_SV.pop(l_module_name);
11744 END IF;
11745 --
11746 return;
11747 --
11748 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
11749 --
11750 l_num_warnings := l_num_warnings + 1;
11751 --
11752 END IF;
11753 --
11754 --}
11755 END IF;
11756 -- K LPN CONV. rv
11757 UPDATE WSH_DELIVERY_DETAILS SET
11758 customer_id = l_cust_id,
11759 ship_to_location_id = l_ship_to_loc_id,
11760 intmed_ship_to_location_id = l_intmed_loc_id,
11761 fob_code = l_fob_code,
11762 freight_terms_code = l_freight_terms_code,
11763 ship_method_code = l_ship_method_code,
11764 mode_of_transport = l_mode_of_transport,
11765 carrier_id = l_carrier_id,
11766 service_level = l_service_level,
11767 deliver_to_location_id = l_deliver_to_loc_id,
11768 line_direction = l_line_direction , -- J-IB-NPARIKH
11769 shipping_control = l_shipping_control, -- J-IB-NPARIKH
11770 --vendor_id = l_vendor_id, -- J-IB-NPARIKH
11771 --party_id = l_party_id -- J-IB-NPARIKH
11772 ignore_for_planning = l_ignore_for_planning
11773 WHERE delivery_detail_id = p_container_instance_id;
11774
11775 IF SQL%NOTFOUND THEN
11776 --dbms_output.put_line('could not update container ' || p_container_instance_id);
11777 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
11778 --
11779 IF l_debug_on THEN
11780 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
11781 END IF;
11782 --
11783 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(p_container_instance_id);
11784 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
11785 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11786 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11787 --
11788 IF l_debug_on THEN
11789 WSH_DEBUG_SV.pop(l_module_name);
11790 END IF;
11791 --
11792 return;
11793 END IF;
11794
11795 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11796
11797 IF l_num_warnings > 0 THEN
11798 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
11799 END IF;
11800
11801
11802 --
11803 IF l_debug_on THEN
11804 WSH_DEBUG_SV.pop(l_module_name);
11805 END IF;
11806 --
11807 EXCEPTION
11808
11809 WHEN Others THEN
11810 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_Cont_Attributes',l_module_name);
11811 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11812
11813 --
11814 IF l_debug_on THEN
11815 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11816 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11817 END IF;
11818 --
11819 END Update_Cont_Attributes;
11820
11821
11822
11823 /*
11824 -----------------------------------------------------------------------------
11825 PROCEDURE : Check_Cont_Attributes
11826 PARAMETERS : p_container_instance_id - delivery detail id for the container
11827 x_attr_flag - 'Y' or 'N' to determine if any of the grouping
11828 attributes other than org id and ship from has been populated.
11829 x_return_status - return status of API
11830 DESCRIPTION : This procedure fetched the grouping attribute columns of the
11831 container and checks to see if the columns are null or if they
11832 are populated. If any of the values are not null, then the API
11833 returns a x_attr_flag of 'Y' else it returns a 'N'.
11834 ------------------------------------------------------------------------------
11835 */
11836
11837 PROCEDURE Check_Cont_Attributes (
11838 p_container_instance_id IN NUMBER,
11839 x_attr_flag OUT NOCOPY VARCHAR2,
11840 x_return_status OUT NOCOPY VARCHAR2) IS
11841
11842 CURSOR Get_Detail_Attr (v_detail_id NUMBER) IS
11843 SELECT customer_id, intmed_ship_to_location_id,
11844 fob_code, freight_terms_code, ship_method_code,
11845 mode_of_transport, service_level, carrier_id,
11846 deliver_to_location_id
11847 FROM WSH_DELIVERY_DETAILS
11851
11848 WHERE delivery_detail_id = v_detail_id;
11849
11850 l_cont_name VARCHAR2(30);
11852 l_org_id NUMBER;
11853 l_cust_id NUMBER;
11854 l_intmed_loc_id NUMBER;
11855 l_fob_code VARCHAR2(30);
11856 l_freight_terms_code VARCHAR2(30);
11857 l_ship_method_code VARCHAR2(30);
11858 l_carrier_id NUMBER;
11859 l_mode_of_transport VARCHAR2(30);
11860 l_service_level VARCHAR2(30);
11861 l_deliver_to_loc_id NUMBER;
11862
11863 l_attr_flag VARCHAR2(1) := 'N';
11864
11865 --
11866 l_debug_on BOOLEAN;
11867 --
11868 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CHECK_CONT_ATTRIBUTES';
11869 --
11870 BEGIN
11871
11872 --dbms_output.put_line('in check cont attr with ' || p_container_instance_id);
11873
11874 --
11875 --
11876 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
11877 --
11878 IF l_debug_on IS NULL
11879 THEN
11880 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
11881 END IF;
11882 --
11883 IF l_debug_on THEN
11884 WSH_DEBUG_SV.push(l_module_name);
11885 --
11886 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
11887 END IF;
11888 --
11889 OPEN Get_Detail_Attr (p_container_instance_id);
11890
11891 FETCH Get_Detail_Attr INTO
11892 l_cust_id,
11893 l_intmed_loc_id,
11894 l_fob_code,
11895 l_freight_terms_code,
11896 l_ship_method_code,
11897 l_mode_of_transport,
11898 l_service_level,
11899 l_carrier_id,
11900 l_deliver_to_loc_id;
11901
11902 IF Get_Detail_Attr%NOTFOUND THEN
11903 CLOSE Get_Detail_Attr;
11904 --dbms_output.put_line('no detail found for ' || p_container_instance_id);
11905 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
11906 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11907 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
11908 x_attr_flag := 'N';
11909 --
11910 IF l_debug_on THEN
11911 WSH_DEBUG_SV.pop(l_module_name);
11912 END IF;
11913 --
11914 return;
11915 END IF;
11916
11917 IF Get_Detail_Attr%ISOPEN THEN
11918 CLOSE Get_Detail_Attr;
11919 END IF;
11920
11921 IF l_cust_id IS NOT NULL THEN
11922 l_attr_flag := 'Y';
11923 END IF;
11924
11925 IF l_intmed_loc_id IS NOT NULL THEN
11926 l_attr_flag := 'Y';
11927 END IF;
11928
11929 IF l_fob_code IS NOT NULL THEN
11930 l_attr_flag := 'Y';
11931 END IF;
11932
11933 IF l_freight_terms_code IS NOT NULL THEN
11934 l_attr_flag := 'Y';
11935 END IF;
11936
11937 IF l_service_level IS NOT NULL THEN
11938 l_attr_flag := 'Y';
11939 END IF;
11940 IF l_mode_of_transport IS NOT NULL THEN
11941 l_attr_flag := 'Y';
11942 END IF;
11943 IF l_carrier_id IS NOT NULL THEN
11944 l_attr_flag := 'Y';
11945 END IF;
11946 IF l_ship_method_code IS NOT NULL THEN
11947 l_attr_flag := 'Y';
11948 END IF;
11949
11950 IF l_deliver_to_loc_id IS NOT NULL THEN
11951 l_attr_flag := 'Y';
11952 END IF;
11953
11954 x_attr_flag := l_attr_flag;
11955
11956 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11957
11958 --
11959 IF l_debug_on THEN
11960 WSH_DEBUG_SV.pop(l_module_name);
11961 END IF;
11962 --
11963 EXCEPTION
11964
11965 WHEN Others THEN
11966 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Check_Cont_Attributes',l_module_name);
11967 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11968
11969 --
11970 IF l_debug_on THEN
11971 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
11972 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
11973 END IF;
11974 --
11975 END Check_Cont_Attributes;
11976
11977
11978 /*
11979 -----------------------------------------------------------------------------
11980 PROCEDURE : Update_Cont_Hierarchy
11981 PARAMETERS : p_delivery_detail_id - delivery detail id
11982 p_delivery_id - delivery id if container assigned to delivery
11983 p_container_instance_id - delivery detail id for the container
11984 x_return_status - return status of API
11985 DESCRIPTION : This procedure updates the grouping attribute columns of the
11986 the entire container hierarchy for the specified container
11987 with the grouping attribute values derived from the
11988 delivery line that is input.
11989 ------------------------------------------------------------------------------
11990 */
11991
11992 PROCEDURE Update_Cont_Hierarchy (
11993 p_del_detail_id IN NUMBER,
11994 p_delivery_id IN NUMBER,
11995 p_container_instance_id IN NUMBER,
11996 x_return_status OUT NOCOPY VARCHAR2) IS
11997
11998
11999 CURSOR Get_Child_Containers(v_cont_instance_id NUMBER) IS
12000 SELECT delivery_detail_id
12001 FROM wsh_delivery_assignments_v
12002 START WITH delivery_detail_id = v_cont_instance_id
12003 CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id;
12004
12005 CURSOR Get_Cont_Flag (v_detail_id NUMBER) IS
12006 SELECT container_flag
12007 FROM WSH_DELIVERY_DETAILS
12008 WHERE delivery_detail_id = v_detail_id;
12009
12010 l_master_cont_inst_id NUMBER;
12011 l_master_cont_name VARCHAR2(30);
12012
12016 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12013 l_cont_name VARCHAR2(30);
12014 l_cont_flag VARCHAR2(1);
12015
12017
12018 --
12019 l_debug_on BOOLEAN;
12020 --
12021 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_CONT_HIERARCHY';
12022 --
12023 BEGIN
12024
12025 --
12026 --
12027 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12028 --
12029 IF l_debug_on IS NULL
12030 THEN
12031 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12032 END IF;
12033 --
12034 IF l_debug_on THEN
12035 WSH_DEBUG_SV.push(l_module_name);
12036 --
12037 WSH_DEBUG_SV.log(l_module_name,'P_DEL_DETAIL_ID',P_DEL_DETAIL_ID);
12038 WSH_DEBUG_SV.log(l_module_name,'P_DELIVERY_ID',P_DELIVERY_ID);
12039 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
12040 END IF;
12041 --
12042 --
12043 IF l_debug_on THEN
12044 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_CONT_ID',WSH_DEBUG_SV.C_PROC_LEVEL);
12045 END IF;
12046 --
12047 l_master_cont_inst_id := WSH_CONTAINER_UTILITIES.Get_Master_Cont_Id(p_container_instance_id);
12048
12049 IF l_master_cont_inst_id IS NULL THEN
12050 l_master_cont_inst_id := p_container_instance_id;
12051 END IF;
12052
12053 --dbms_output.put_line('calling get child containers with ' || l_master_cont_inst_id);
12054
12055 FOR cont IN Get_Child_Containers(l_master_cont_inst_id) LOOP
12056
12057 EXIT WHEN Get_Child_Containers%NOTFOUND;
12058
12059 --dbms_output.put_line('in loop with ' || cont.delivery_detail_id);
12060
12061 OPEN Get_Cont_Flag (cont.delivery_detail_id);
12062
12063 FETCH Get_Cont_Flag INTO l_cont_flag;
12064
12065 IF Get_Cont_Flag%NOTFOUND THEN
12066 --dbms_output.put_line('cont flag not found for ' || cont.delivery_detail_id);
12067 CLOSE Get_Cont_Flag;
12068 GOTO next_cont;
12069 END IF;
12070
12071 IF Get_Cont_Flag%ISOPEN THEN
12072 CLOSE Get_Cont_Flag;
12073 END IF;
12074
12075 --dbms_output.put_line('called get child containers with ' || cont.delivery_detail_id || ' and cont flag is ' || l_cont_flag);
12076
12077 IF (nvl(l_cont_flag,'N') = 'Y') THEN
12078
12079 --dbms_output.put_line('calling update cont attr with ' || cont.delivery_detail_id);
12080
12081 --
12082 IF l_debug_on THEN
12083 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_ACTIONS.UPDATE_CONT_ATTRIBUTES',WSH_DEBUG_SV.C_PROC_LEVEL);
12084 END IF;
12085 --
12086 wsh_container_actions.Update_Cont_Attributes (
12087 p_del_detail_id,
12088 p_delivery_id,
12089 cont.delivery_detail_id,
12090 l_return_status);
12091 IF l_debug_on THEN
12092 WSH_DEBUG_SV.log(l_module_name,'return status-',l_return_status);
12093 END IF;
12094
12095 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12096 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_UPD_ATTR_ERROR');
12097 --
12098 IF l_debug_on THEN
12099 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_CONT_NAME',WSH_DEBUG_SV.C_PROC_LEVEL);
12100 END IF;
12101 --
12102 l_cont_name := WSH_CONTAINER_UTILITIES.Get_Cont_Name(cont.delivery_detail_id);
12103 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
12104 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12105 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
12106 END IF;
12107
12108 END IF;
12109
12110 <<next_cont>>
12111 null;
12112
12113 l_cont_flag := NULL;
12114
12115 END LOOP;
12116
12117 IF nvl(x_return_status,WSH_UTIL_CORE.G_RET_STS_SUCCESS) <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12118 --
12119 IF l_debug_on THEN
12120 WSH_DEBUG_SV.pop(l_module_name);
12121 END IF;
12122 --
12123 return;
12124 ELSE
12125 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12126 END IF;
12127
12128 --
12129 IF l_debug_on THEN
12130 WSH_DEBUG_SV.pop(l_module_name);
12131 END IF;
12132 --
12133 EXCEPTION
12134
12135 WHEN Others THEN
12136 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_Cont_Hierarchy',l_module_name);
12137 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12138
12139 --
12140 IF l_debug_on THEN
12141 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12142 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12143 END IF;
12144 --
12145 END Update_Cont_Hierarchy;
12146
12147
12148 /*
12149 -----------------------------------------------------------------------------
12150 PROCEDURE : Last_Assigned_Line
12151 PARAMETERS : p_delivery_detail_id - delivery detail id
12152 p_container_instance_id - delivery detail id for the container
12153 x_last_line_flag - 'Y' or 'N' depending on whether it is the
12154 last line in the container hierarchy or not.
12155 x_return_status - return status of API
12156 DESCRIPTION : This procedure checks to see if the delivery detail id is the
12157 last assigned line in the container hierarchy for the input
12158 container. If it is, x_last_line_flag is set to 'Y' else it is
12159 set to 'N'.
12163 PROCEDURE Last_Assigned_Line (
12160 ------------------------------------------------------------------------------
12161 */
12162
12164 p_del_detail_id IN NUMBER,
12165 p_container_instance_id IN NUMBER,
12166 x_last_line_flag OUT NOCOPY VARCHAR2,
12167 x_return_status OUT NOCOPY VARCHAR2) IS
12168
12169 CURSOR Get_Contents (v_detail_id NUMBER) IS
12170 SELECT count(*)
12171 FROM wsh_delivery_assignments_v
12172 START WITH delivery_detail_id = v_detail_id
12173 CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id;
12174
12175 CURSOR Get_Cont_Count (v_cont_id NUMBER) IS
12176 SELECT count(*)
12177 FROM wsh_delivery_assignments_v
12178 WHERE delivery_detail_id IN
12179 (SELECT delivery_detail_id
12180 FROM WSH_DELIVERY_DETAILS
12181 WHERE container_flag = 'Y')
12182 START WITH delivery_detail_id = v_cont_id
12183 CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id;
12184
12185 l_content_cnt NUMBER;
12186 l_cont_cnt NUMBER;
12187
12188 l_mast_cont_inst_id NUMBER;
12189
12190 --
12191 l_debug_on BOOLEAN;
12192 --
12193 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'LAST_ASSIGNED_LINE';
12194 --
12195 BEGIN
12196
12197 --
12198 --
12199 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
12200 --
12201 IF l_debug_on IS NULL
12202 THEN
12203 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
12204 END IF;
12205 --
12206 IF l_debug_on THEN
12207 WSH_DEBUG_SV.push(l_module_name);
12208 --
12209 WSH_DEBUG_SV.log(l_module_name,'P_DEL_DETAIL_ID',P_DEL_DETAIL_ID);
12210 WSH_DEBUG_SV.log(l_module_name,'P_CONTAINER_INSTANCE_ID',P_CONTAINER_INSTANCE_ID);
12211 END IF;
12212 --
12213 --
12214 IF l_debug_on THEN
12215 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_CONTAINER_UTILITIES.GET_MASTER_CONT_ID',WSH_DEBUG_SV.C_PROC_LEVEL);
12216 END IF;
12217 --
12218 l_mast_cont_inst_id := WSH_CONTAINER_UTILITIES.Get_Master_Cont_Id (p_container_instance_id);
12219
12220 IF l_mast_cont_inst_id IS NULL THEN
12221 l_mast_cont_inst_id := p_container_instance_id;
12222 END IF;
12223
12224 OPEN Get_Contents (l_mast_cont_inst_id);
12225
12226 FETCH Get_Contents INTO l_content_cnt;
12227
12228 IF Get_Contents%NOTFOUND THEN
12229 CLOSE Get_Contents;
12230 x_last_line_flag := 'N';
12231 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
12232 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12233 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
12234 --
12235 IF l_debug_on THEN
12236 WSH_DEBUG_SV.pop(l_module_name);
12237 END IF;
12238 --
12239 return;
12240 END IF;
12241
12242 IF Get_Contents%ISOPEN THEN
12243 CLOSE Get_Contents;
12244 END IF;
12245
12246 OPEN Get_Cont_Count (l_mast_cont_inst_id);
12247
12248 FETCH Get_Cont_Count INTO l_cont_cnt;
12249
12250 IF Get_Cont_Count%NOTFOUND THEN
12251 CLOSE Get_Cont_Count;
12252 x_last_line_flag := 'N';
12253 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONTAINER');
12254 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12255 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
12256 --
12257 IF l_debug_on THEN
12258 WSH_DEBUG_SV.pop(l_module_name);
12259 END IF;
12260 --
12261 return;
12262 END IF;
12263
12264 IF Get_Cont_Count%ISOPEN THEN
12265 CLOSE Get_Cont_Count;
12266 END IF;
12267
12268 IF (l_content_cnt - l_cont_cnt) > 0 THEN
12269 x_last_line_flag := 'N';
12270 ELSE
12271 x_last_line_flag := 'Y';
12272 END IF;
12273
12274 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12275
12276 --
12277 IF l_debug_on THEN
12278 WSH_DEBUG_SV.pop(l_module_name);
12279 END IF;
12280 --
12281 EXCEPTION
12282
12283 WHEN Others THEN
12284 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Last_Assigned_Line',l_module_name);
12285 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12286
12287 --
12288 IF l_debug_on THEN
12289 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12290 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12291 END IF;
12292 --
12293 END Last_Assigned_Line;
12294
12295
12296
12297 -- J-IB-NPARIKH-{
12298 --
12299 --========================================================================
12300 -- PROCEDURE : pack_inbound_lines
12301 --
12302 -- PARAMETERS: p_lines_tbl Table of delivery lines to be packed
12303 -- p_lpn_id LPN ID
12304 -- p_lpn_name Container name as entered on ASN
12305 -- p_delivery_id Delivery ID for delivery, input lines belong to
12306 -- p_transactionType ASN/RECEIPT
12307 -- x_return_status Return status of the API
12308 --
12309 -- ASSUMPTION: All input lines belong to only one delivery, specified by p_delivery_id
12310 --
12311 -- COMMENT : This procedure is called only from the Inbound ASN/Receipt
12312 -- integration to pack delivery lines as per the ASN LPN
12313 -- Configuration.
12314 -- It performs the following steps:
12318 -- 04. Append LPN name with delivery name.
12315 -- 01. Validate that input delivery id is not null and is a valid delivery.
12316 -- 02. Validate that input table of lines contain at least one record.
12317 -- 03. If input delivery is outbound, return with error.
12319 -- 05. Create container instance
12320 -- 06. Update container delivery detail record with grouping attributes from delivery.
12321 -- 07. Assign container to delivery
12322 -- 08. Assign input lines to container
12323 -- 09. Calculate container dates
12324 -- 10. Calculate container weight/volume
12325 --
12326 --========================================================================
12327 --
12328 PROCEDURE pack_inbound_lines
12329 (
12330 p_lines_tbl IN WSH_UTIL_CORE.id_tab_type,
12331 p_lpn_id IN NUMBER,
12332 p_lpn_name IN VARCHAR2,
12333 p_delivery_id IN NUMBER,
12334 p_transactionType IN VARCHAR2 DEFAULT 'ASN',
12335 x_return_status OUT NOCOPY VARCHAR2,
12336 p_waybill_number IN VARCHAR2,
12337 p_caller IN VARCHAR2
12338 )
12339 IS
12340 --{
12341 --
12342 -- Get delivery information
12343 --
12344 CURSOR dlvy_csr (p_delivery_id IN NUMBER)
12345 IS
12346 SELECT organization_id,
12347 nvl(shipment_direction,'O') shipment_direction,
12348 initial_pickup_location_id,
12349 ultimate_dropoff_location_id,
12350 customer_id,
12351 intmed_ship_to_location_id,
12352 fob_code,
12353 freight_terms_code,
12354 ship_method_code,
12355 shipping_control,
12356 vendor_id,
12357 party_id,
12358 name,
12359 nvl(ignore_for_planning,'N') ignore_for_planning
12360 FROM wsh_new_deliveries wnd
12361 WHERE delivery_id = p_delivery_id;
12362 --
12363 --
12364 l_dlvy_rec dlvy_csr%ROWTYPE;
12365 --
12366 l_num_warnings NUMBER := 0;
12367 l_num_errors NUMBER := 0;
12368 l_return_status VARCHAR2(10);
12369 --
12370 l_cont_name VARCHAR2(100);
12371 l_container_instance_id NUMBER;
12372 l_rowid VARCHAR2(32767);
12373 l_cont_tbl WSH_UTIL_CORE.id_tab_type;
12374 --
12375 l_gross_weight NUMBER;
12376 l_net_weight NUMBER;
12377 l_volume NUMBER;
12378 l_cont_fill_pc NUMBER;
12379
12380 l_detail_tab WSH_UTIL_CORE.id_tab_type; -- DBI Project
12381 l_dbi_rs VARCHAR2(1); -- Return Status from DBI API
12382
12383 cursor l_dup_del_csr(p_lpn_name IN VARCHAR2)
12384 is
12385 select wnd.delivery_id,
12386 wnd.name,
12387 wnd.status_code,
12388 wda.delivery_detail_id
12389 from wsh_delivery_details wdd,
12390 wsh_delivery_assignments_v wda,
12391 wsh_new_deliveries wnd
12392 where wdd.container_name = p_lpn_name
12393 and wdd.container_flag = 'Y'
12394 and wda.delivery_detail_id = wdd.delivery_detail_id
12395 and wda.delivery_id = wnd.delivery_id(+);
12396
12397 l_dup_del_id NUMBER;
12398 l_dup_del_name VARCHAR2(32767);
12399 l_dup_del_status VARCHAR2(2);
12400 l_dup_cnt_id NUMBER;
12401 --
12402
12403 -- K LPN CONV. rv
12404 l_cont_tab wsh_util_core.id_tab_type;
12405 l_lpn_unit_weight NUMBER;
12406 l_lpn_unit_volume NUMBER;
12407 l_lpn_weight_uom_code VARCHAR2(100);
12408 l_lpn_volume_uom_code VARCHAR2(100);
12409 -- K LPN CONV. rv
12410 l_debug_on BOOLEAN;
12411 --
12412 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'pack_inbound_lines';
12413 --
12414 --}
12415 BEGIN
12416 --{
12417 SAVEPOINT pack_inbound_lines_sp;
12418 --
12419 l_debug_on := wsh_debug_interface.g_debug;
12420 --
12421 IF l_debug_on IS NULL THEN
12422 l_debug_on := wsh_debug_sv.is_debug_enabled;
12423 END IF;
12424 --
12425 IF l_debug_on THEN
12426 wsh_debug_sv.push(l_module_name);
12427 --
12428 wsh_debug_sv.LOG(l_module_name, 'p_lpn_id', p_lpn_id);
12429 wsh_debug_sv.LOG(l_module_name, 'p_delivery_id', p_delivery_id);
12430 wsh_debug_sv.LOG(l_module_name, 'p_transactionTYpe', p_transactionTYpe);
12431 END IF;
12432 --
12433 x_return_status := wsh_util_core.g_ret_sts_success;
12434 --
12435 --
12436 IF p_delivery_id IS NULL
12437 THEN
12438 --{
12439 --
12440 -- p_delivery_id is mandatory
12441 --
12442 FND_MESSAGE.SET_NAME('WSH', 'WSH_REQUIRED_FIELD_NULL');
12443 FND_MESSAGE.SET_TOKEN('FIELD_NAME', 'p_delivery_id');
12444 WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12445 --
12446 RAISE FND_API.G_EXC_ERROR;
12447 --}
12451 THEN
12448 END IF;
12449 --
12450 IF p_lines_tbl.count = 0
12452 --{
12453 --
12454 -- p_lines_tbl should have at least one record
12455 --
12456 FND_MESSAGE.SET_NAME('WSH', 'WSH_EMPTY_TABLE_ERROR');
12457 FND_MESSAGE.SET_TOKEN('TABLE_NAME', 'p_lines_tbl');
12458 WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12459 --
12460 RAISE FND_API.G_EXC_ERROR;
12461 --}
12462 END IF;
12463 --
12464 --
12465 OPEN dlvy_csr(p_delivery_id);
12466 FETCH dlvy_csr INTO l_dlvy_rec;
12467 CLOSE dlvy_csr;
12468 --
12469 IF l_dlvy_rec.initial_pickup_location_id IS NULL
12470 THEN
12471 --{
12472 FND_MESSAGE.SET_NAME('WSH','WSH_DLVY_NOT_EXIST');
12473 FND_MESSAGE.SET_TOKEN('DELIVERY_ID', p_delivery_id);
12474 WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12475 --
12476 RAISE FND_API.G_EXC_ERROR;
12477 --}
12478 END IF;
12479 --
12480 --
12481 IF l_dlvy_rec.shipment_direction IN ('O','IO')
12482 THEN
12483 --{
12484 --
12485 -- Invalid operation for outbound delivery
12486 --
12487 FND_MESSAGE.SET_NAME('WSH','WSH_NOT_IB_DLVY_ERROR');
12488 FND_MESSAGE.SET_TOKEN('DELIVERY_NAME', l_dlvy_rec.name);
12489 WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12490 --
12491 RAISE FND_API.G_EXC_ERROR;
12492 --}
12493 END IF;
12494 --
12495 --
12496 --l_cont_name := SUBSTRB(p_lpn_id || '.' || l_dlvy_rec.name,1,30);
12497 l_cont_name := p_lpn_name;
12498 --
12499 -- commented out the following code because this is not applicable anymore
12500 -- as container name is not unique in WSH. This check is not required.
12501 /*
12502 open l_dup_del_csr(p_lpn_name);
12503 fetch l_dup_del_csr into l_dup_del_id,l_dup_del_name, l_dup_del_status, l_dup_cnt_id;
12504 close l_dup_del_csr;
12505
12506 IF l_debug_on THEN
12507 WSH_DEBUG_SV.log(l_module_name,'l_dup_del_id', l_dup_del_id);
12508 WSH_DEBUG_SV.log(l_module_name,'l_dup_del_name', l_dup_del_name);
12509 WSH_DEBUG_SV.log(l_module_name,'l_dup_del_status', l_dup_del_status);
12510 WSH_DEBUG_SV.log(l_module_name,'l_dup_cnt_id', l_dup_cnt_id);
12511 END IF;
12512
12513 IF(l_dup_del_id is not null AND nvl(l_dup_del_status,'OP') = 'CL') THEN
12514 --{
12515 update wsh_delivery_details
12516 set container_name = SUBSTRB(p_lpn_name || '.' ||l_dup_del_name,1,50)
12517 where delivery_detail_id = l_dup_cnt_id;
12518 --}
12519 ELSIF(l_dup_cnt_id IS NOT NULL) THEN
12520 --{
12521 l_cont_name := SUBSTRB(p_lpn_name || '.' || l_dlvy_rec.name,1,50);
12522 --}
12523 END IF;
12524 */
12525 --l_cont_name := SUBSTRB(p_lpn_name || '.' || l_dlvy_rec.name,1,50);
12526 --
12527 --
12528 IF l_debug_on THEN
12529 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit Create_Cont_Instance_Multi',WSH_DEBUG_SV.C_PROC_LEVEL);
12530 END IF;
12531 --
12532 G_CALLED_FROM_INBOUND := TRUE;
12533 --
12534 --
12535 -- K LPN CONV. rv
12536 --
12537 WSH_CONTAINER_ACTIONS.Create_Cont_Instance_Multi(
12538 x_cont_name => l_cont_name,
12539 p_cont_item_id => NULL,
12540 x_cont_instance_id => l_container_instance_id,
12541 p_par_detail_id => NULL,
12542 p_organization_id => l_dlvy_rec.organization_id,
12543 p_container_type_code => NULL,
12544 p_num_of_containers => 1,
12545 x_row_id => l_rowid,
12546 x_return_status => l_return_status,
12547 x_cont_tab => l_cont_tab,
12548 x_unit_weight => l_lpn_unit_weight,
12549 x_unit_volume => l_lpn_unit_volume,
12550 x_weight_uom_code => l_lpn_weight_uom_code,
12551 x_volume_uom_code => l_lpn_volume_uom_code,
12552 p_lpn_id => p_lpn_id,
12553 p_ignore_for_planning => l_dlvy_rec.ignore_for_planning,
12554 p_caller => 'WSH_IB_PACK');
12555 --
12556 IF l_debug_on THEN
12557 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
12558 WSH_DEBUG_SV.log(l_module_name,'count of l_cont_tab',l_cont_tab.count);
12559 END IF;
12560 l_container_instance_id := l_cont_tab(1);
12561 -- K LPN CONV. rv
12562 --
12563 --
12564 G_CALLED_FROM_INBOUND := FALSE;
12565 --
12566 wsh_util_core.api_post_call
12567 (
12568 p_return_status => l_return_status,
12569 x_num_warnings => l_num_warnings,
12570 x_num_errors => l_num_errors
12571 );
12572 --
12573 --
12574 -- Update Container record with delivery grouping attributes
12575 --
12576 UPDATE WSH_DELIVERY_DETAILS
12577 SET lpn_id = p_lpn_id,
12578 shipped_quantity = DECODE(p_transactionType,'ASN',1,shipped_quantity),
12579 received_quantity = DECODE(p_transactionType,'RECEIPT',1,received_quantity),
12583 requested_quantity_uom = 'Ea' ,
12580 released_status = DECODE(p_transactionType,'ASN','C','RECEIPT','L','C'),
12581 src_requested_quantity = requested_quantity,
12582 src_requested_quantity_uom = 'Ea' ,
12584 line_direction = l_dlvy_rec.shipment_direction,
12585 ship_from_location_id = l_dlvy_rec.initial_pickup_location_id,
12586 ship_to_location_id = l_dlvy_rec.ultimate_dropoff_location_id,
12587 customer_id = l_dlvy_rec.customer_id,
12588 intmed_ship_to_location_id = l_dlvy_rec.intmed_ship_to_location_id,
12589 fob_code = l_dlvy_rec.fob_code,
12590 freight_terms_code = l_dlvy_rec.freight_terms_code,
12591 ship_method_code = l_dlvy_rec.ship_method_code,
12592 shipping_control = l_dlvy_rec.shipping_control,
12593 vendor_id = l_dlvy_rec.vendor_id,
12594 party_id = l_dlvy_rec.party_id,
12595 ignore_for_planning = l_dlvy_rec.ignore_for_planning,
12596 tracking_number = NVL(p_waybill_number,tracking_number),
12597 last_update_date = SYSDATE,
12598 last_updated_by = FND_GLOBAL.USER_ID,
12599 last_update_login = FND_GLOBAL.LOGIN_ID
12600 WHERE rowid = l_rowid;
12601 --
12602 -- l_container_instance_id is the delivery_detail_id, use for DBI call
12603 -- DBI Project
12604 -- Update of wsh_delivery_details where requested_quantity/released_status
12605 -- are changed, call DBI API after the update.
12606 -- This API will also check for DBI Installed or not
12607 IF l_debug_on THEN
12608 WSH_DEBUG_SV.log(l_module_name,'Calling DBI API.Detail id-',l_container_instance_id);
12609 END IF;
12610 l_detail_tab(1) := l_container_instance_id;
12611 WSH_INTEGRATION.DBI_Update_Detail_Log
12612 (p_delivery_detail_id_tab => l_detail_tab,
12613 p_dml_type => 'UPDATE',
12614 x_return_status => l_dbi_rs);
12615
12616 IF l_debug_on THEN
12617 WSH_DEBUG_SV.log(l_module_name,'Return Status after DBI Call-',l_dbi_rs);
12618 END IF;
12619
12620 IF l_dbi_rs = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR THEN
12621 x_return_status := l_dbi_rs;
12622 -- just pass this return status to caller API
12623 IF l_debug_on THEN
12624 WSH_DEBUG_SV.pop(l_module_name,'DBI API Returned Unexpected error '||x_return_status);
12625 WSH_DEBUG_SV.pop(l_module_name);
12626 END IF;
12627 return;
12628 END IF;
12629 -- treat all other return status as Success
12630 -- End of Code for DBI Project
12631 --
12632 -- Assign container to delivery
12633 --
12634 UPDATE wsh_delivery_assignments_v
12635 SET delivery_id = p_delivery_id,
12636 last_update_date = SYSDATE,
12637 last_updated_by = FND_GLOBAL.USER_ID,
12638 last_update_login = FND_GLOBAL.LOGIN_ID
12639 WHERE delivery_detail_id = l_container_instance_id;
12640 --
12641 --
12642 -- Assign lines to container
12643 --
12644 FORALL i IN p_lines_tbl.FIRST..p_lines_tbl.LAST
12645 UPDATE wsh_delivery_assignments_v
12646 SET parent_delivery_detail_id = l_container_instance_id,
12647 last_update_date = SYSDATE,
12648 last_updated_by = FND_GLOBAL.USER_ID,
12649 last_update_login = FND_GLOBAL.LOGIN_ID
12650 WHERE delivery_detail_id = p_lines_tbl(i);
12651 --
12652 --
12653 l_cont_tbl(1) := l_container_instance_id;
12654 --
12655 --
12656 --
12657 IF l_debug_on THEN
12658 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit wsh_tp_release.calculate_cont_del_tpdates',WSH_DEBUG_SV.C_PROC_LEVEL);
12659 END IF;
12660 --
12661 --
12662 -- Calculate container dates
12663 --
12664 wsh_tp_release.calculate_cont_del_tpdates
12665 (
12666 p_entity => 'LPN',
12667 p_entity_ids => l_cont_tbl,
12668 x_return_status => l_return_status
12669 );
12670 --
12671 wsh_util_core.api_post_call
12672 (
12673 p_return_status => l_return_status,
12674 x_num_warnings => l_num_warnings,
12675 x_num_errors => l_num_errors
12676 );
12677 --
12678 IF nvl(p_caller, '!!!!') <> 'WSH_VENDOR_MERGE' THEN
12679 --{
12680
12681 IF l_debug_on THEN
12682 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TPA_CONTAINER_PKG.CONTAINER_WEIGHT_VOLUME',WSH_DEBUG_SV.C_PROC_LEVEL);
12683 END IF;
12684 --
12685 --
12686 -- Calculate container weight and volume
12687 --
12688 WSH_TPA_CONTAINER_PKG.Container_Weight_Volume(
12689 p_container_instance_id => l_container_instance_id,
12690 p_override_flag => 'Y',
12691 p_calc_wv_if_frozen => 'N',
12692 x_gross_weight => l_gross_weight,
12693 x_net_weight => l_net_weight,
12694 x_volume => l_volume ,
12695 p_fill_pc_flag => 'Y',
12699 IF l_debug_on THEN
12696 x_cont_fill_pc => l_cont_fill_pc,
12697 x_return_status => l_return_status);
12698 --
12700 WSH_DEBUG_SV.log(l_module_name,'return status',l_return_status);
12701 END IF;
12702 --}
12703 END IF;
12704
12705 --
12706 --
12707 IF l_num_errors > 0
12708 THEN
12709 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12710 ELSIF l_num_warnings > 0
12711 THEN
12712 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12713 ELSE
12714 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12715 END IF;
12716 --
12717 IF l_debug_on THEN
12718 wsh_debug_sv.pop(l_module_name);
12719 END IF;
12720 --
12721 --}
12722 EXCEPTION
12723 --{
12724 --
12725 WHEN FND_API.G_EXC_ERROR THEN
12726
12727 G_CALLED_FROM_INBOUND := FALSE;
12728 ROLLBACK TO pack_inbound_lines_sp;
12729 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12730 --
12731 IF l_debug_on THEN
12732 WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
12733 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
12734 END IF;
12735 --
12736 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
12737
12738 G_CALLED_FROM_INBOUND := FALSE;
12739 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
12740 ROLLBACK TO pack_inbound_lines_sp;
12741 --
12742 IF l_debug_on THEN
12743 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12744 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
12745 END IF;
12746 --
12747 WHEN WSH_UTIL_CORE.G_EXC_WARNING THEN
12748
12749 G_CALLED_FROM_INBOUND := FALSE;
12750 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12751 --
12752 IF l_debug_on THEN
12753 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_UTIL_CORE.G_EXC_WARNING exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
12754 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_UTIL_CORE.G_EXC_WARNING');
12755 END IF;
12756 --
12757 WHEN OTHERS THEN
12758
12759 G_CALLED_FROM_INBOUND := FALSE;
12760 ROLLBACK TO pack_inbound_lines_sp;
12761 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
12762 wsh_util_core.default_handler('wsh_container_actions.pack_inbound_lines', l_module_name);
12763 IF l_debug_on THEN
12764 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12765 END IF;
12766 --
12767 --}
12768 END pack_inbound_lines;
12769 --
12770 --
12771 --
12772 --========================================================================
12773 -- PROCEDURE : unpack_inbound_delivery
12774 --
12775 -- PARAMETERS: p_delivery_id Delivery ID for delivery, input lines belong to
12776 -- x_return_status Return status of the API
12777 --
12778 --
12779 -- COMMENT : This procedure is called only from the cancel ASN/Revert ASN events
12780 -- It performs the following steps:
12781 -- 01. Validate that input delivery id is not null and is a valid delivery.
12782 -- 02. If input delivery is outbound, return with error.
12783 -- 03. Delete all containers within the delivery (WDD and WDA)
12784 -- 04. Unassign all lines (within delivery) from container.
12785 --
12786 --========================================================================
12787 --
12788 --
12789 PROCEDURE unpack_inbound_delivery
12790 (
12791 p_delivery_id IN NUMBER,
12792 x_return_status OUT NOCOPY VARCHAR2
12793 )
12794 IS
12795 --{
12796 CURSOR dlvy_csr (p_delivery_id IN NUMBER)
12797 IS
12798 SELECT nvl(shipment_direction,'O') shipment_direction,
12799 initial_pickup_location_id,
12800 name
12801 FROM wsh_new_deliveries wnd
12802 WHERE delivery_id = p_delivery_id;
12803 --
12804 l_dlvy_rec dlvy_csr%ROWTYPE;
12805 --
12806 --
12807 l_num_warnings NUMBER := 0;
12808 l_num_errors NUMBER := 0;
12809 l_return_status VARCHAR2(10);
12810 --
12811 l_lines_tbl WSH_UTIL_CORE.id_tab_type;
12812 --
12813 l_debug_on BOOLEAN;
12814 --
12815 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'unpack_inbound_delivery';
12816 --
12817 --}
12818 BEGIN
12819 --{
12820 SAVEPOINT unpack_inbound_delivery_sp;
12821 --
12822 l_debug_on := wsh_debug_interface.g_debug;
12823 --
12824 IF l_debug_on IS NULL THEN
12825 l_debug_on := wsh_debug_sv.is_debug_enabled;
12826 END IF;
12827 --
12828 IF l_debug_on THEN
12829 wsh_debug_sv.push(l_module_name);
12830 --
12831 wsh_debug_sv.LOG(l_module_name, 'p_delivery_id', p_delivery_id);
12832 END IF;
12833 --
12837 IF p_delivery_id IS NULL
12834 x_return_status := wsh_util_core.g_ret_sts_success;
12835 --
12836 --
12838 THEN
12839 --{
12840 --
12841 -- p_delivery_id is mandatory
12842 --
12843 FND_MESSAGE.SET_NAME('WSH', 'WSH_REQUIRED_FIELD_NULL');
12844 FND_MESSAGE.SET_TOKEN('FIELD_NAME', 'p_delivery_id');
12845 WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12846 --
12847 RAISE FND_API.G_EXC_ERROR;
12848 --}
12849 END IF;
12850 --
12851 --
12852 OPEN dlvy_csr(p_delivery_id);
12853 FETCH dlvy_csr INTO l_dlvy_rec;
12854 CLOSE dlvy_csr;
12855 --
12856 IF l_dlvy_rec.initial_pickup_location_id IS NULL
12857 THEN
12858 --{
12859 FND_MESSAGE.SET_NAME('WSH','WSH_DLVY_NOT_EXIST');
12860 FND_MESSAGE.SET_TOKEN('DELIVERY_ID', p_delivery_id);
12861 WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12862 --
12863 RAISE FND_API.G_EXC_ERROR;
12864 --}
12865 END IF;
12866 --
12867 --
12868 IF l_dlvy_rec.shipment_direction IN ('O','IO')
12869 THEN
12870 --{
12871 --
12872 -- Invalid operation for outbound delivery
12873 --
12874 FND_MESSAGE.SET_NAME('WSH','WSH_NOT_IB_DLVY_ERROR');
12875 FND_MESSAGE.SET_TOKEN('DELIVERY_NAME', l_dlvy_rec.name);
12876 WSH_UTIL_CORE.add_message (wsh_util_core.g_ret_sts_error,l_module_name);
12877 --
12878 RAISE FND_API.G_EXC_ERROR;
12879 --}
12880 END IF;
12881 --
12882 --
12883 -- Delete all containers within the delivery
12884 --
12885 DELETE WSH_DELIVERY_DETAILS
12886 WHERE DELIVERY_DETAIL_ID IN (
12887 SELECT wdd.delivery_detail_id
12888 FROM wsh_delivery_details wdd,
12889 wsh_delivery_assignments_v wda
12890 WHERE wda.delivery_id = p_delivery_id
12891 AND wda.delivery_detail_id = wdd.delivery_detail_id
12892 AND NVL(wdd.container_flag,'N') = 'Y'
12893 )
12894 RETURNING delivery_detail_id BULK COLLECT INTO l_lines_tbl;
12895 --
12896 --
12897 IF l_lines_tbl.COUNT > 0
12898 THEN
12899 --{
12900 FORALL i IN l_lines_tbl.FIRST..l_lines_tbl.LAST
12901 DELETE wsh_delivery_assignments_v
12902 WHERE delivery_detail_id = l_lines_tbl(i);
12903 --}
12904 END IF;
12905 --
12906 --
12907 --
12908 -- Unassign all lines from containers.
12909 --
12910 UPDATE wsh_delivery_assignments_v
12911 SET parent_delivery_detail_id = NULL,
12912 last_update_date = SYSDATE,
12913 last_updated_by = FND_GLOBAL.USER_ID,
12914 last_update_login = FND_GLOBAL.LOGIN_ID
12915 WHERE delivery_id = p_delivery_id;
12916 --
12917 --
12918 IF l_num_errors > 0
12919 THEN
12920 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12921 ELSIF l_num_warnings > 0
12922 THEN
12923 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12924 ELSE
12925 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12926 END IF;
12927 --
12928 IF l_debug_on THEN
12929 wsh_debug_sv.pop(l_module_name);
12930 END IF;
12931 --
12932 --}
12933 EXCEPTION
12934 --{
12935 --
12936 WHEN FND_API.G_EXC_ERROR THEN
12937
12938 ROLLBACK TO unpack_inbound_delivery_sp;
12939 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12940 --
12941 IF l_debug_on THEN
12942 WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
12943 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
12944 END IF;
12945 --
12946 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
12947
12948 ROLLBACK TO unpack_inbound_delivery_sp;
12949 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
12950 --
12951 IF l_debug_on THEN
12952 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
12953 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
12954 END IF;
12955 --
12956 WHEN WSH_UTIL_CORE.G_EXC_WARNING THEN
12957 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12958 --
12959 IF l_debug_on THEN
12960 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_UTIL_CORE.G_EXC_WARNING exception has occured ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
12961 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_UTIL_CORE.G_EXC_WARNING');
12962 END IF;
12963 --
12964 WHEN OTHERS THEN
12965
12966 ROLLBACK TO unpack_inbound_delivery_sp;
12967 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
12968 wsh_util_core.default_handler('wsh_container_actions.unpack_inbound_delivery', l_module_name);
12969 IF l_debug_on THEN
12970 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
12974 END unpack_inbound_delivery;
12971 END IF;
12972 --
12973 --}
12975 --
12976 --
12977 -- J-IB-NPARIKH-}
12978 /* This procedure is a temporarily procedure that will create
12979 container names and will be deleted once WMS provides the functionality.
12980 lpn conv
12981 */
12982
12983 PROCEDURE Create_Multiple_Cont_name (
12984 p_cont_name IN VARCHAR2,
12985 p_cont_name_pre IN VARCHAR2,
12986 p_cont_name_suf IN VARCHAR2,
12987 p_cont_name_num IN NUMBER,
12988 p_cont_name_dig IN NUMBER,
12989 p_quantity IN NUMBER,
12990 x_cont_names OUT NOCOPY WSH_GLBL_VAR_STRCT_GRP.v50_Tbl_Type,
12991 x_return_status OUT NOCOPY VARCHAR2) IS
12992
12993 CURSOR Get_Exist_Cont(v_cont_name VARCHAR2) IS
12994 SELECT NVL(MAX(1),0) FROM DUAL
12995 WHERE EXISTS ( SELECT 1 FROM WSH_DELIVERY_DETAILS
12996 WHERE container_name = v_cont_name
12997 AND container_flag = 'Y');
12998
12999 l_cont_name VARCHAR2(30);
13000 l_cont_name_num NUMBER;
13001 l_cont_inst_id NUMBER;
13002 l_row_id VARCHAR2(30);
13003 l_cont_cnt NUMBER;
13004 l_all_null_flag VARCHAR2(1) := 'Y';
13005 l_return_status VARCHAR2(1) := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13006
13007 --
13008 l_debug_on BOOLEAN;
13009 --
13010 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'CREATE_MULTIPLE_CONT_NAME';
13011 --
13012 BEGIN
13013
13014 --
13015 --
13016 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13017 --
13018 IF l_debug_on IS NULL
13019 THEN
13020 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13021 END IF;
13022 --
13023 IF l_debug_on THEN
13024 WSH_DEBUG_SV.push(l_module_name);
13025 --
13026 WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME',P_CONT_NAME);
13027 WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_PRE',P_CONT_NAME_PRE);
13028 WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_SUF',P_CONT_NAME_SUF);
13029 WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_NUM',P_CONT_NAME_NUM);
13030 WSH_DEBUG_SV.log(l_module_name,'P_CONT_NAME_DIG',P_CONT_NAME_DIG);
13031 WSH_DEBUG_SV.log(l_module_name,'P_QUANTITY',P_QUANTITY);
13032 END IF;
13033 --
13034 IF ( NVL(p_quantity,0) <= 0 ) THEN
13035 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
13036 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13037 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
13038 --
13039 IF l_debug_on THEN
13040 WSH_DEBUG_SV.pop(l_module_name);
13041 END IF;
13042 --
13043 return;
13044 END IF;
13045
13046 IF p_cont_name_pre IS NULL AND p_cont_name_num IS NULL AND p_cont_name_dig IS NULL AND p_cont_name_suf IS NULL THEN
13047 l_all_null_flag := 'Y';
13048 ELSE
13049 l_all_null_flag := 'N';
13050 END IF;
13051
13052 l_cont_name_num := NVL(p_cont_name_num,0);
13053 FOR i IN 1..p_quantity LOOP
13054 IF p_quantity = 1 AND p_cont_name IS NOT NULL THEN
13055 l_cont_name := p_cont_name;
13056 ELSIF l_all_null_flag = 'Y' THEN
13057 l_cont_name := NULL;
13058 ELSE
13059 -- if p..dig is null don't do padding
13060 IF (p_cont_name_dig IS NOT NULL) THEN
13061 l_cont_name := p_cont_name_pre || LPAD(to_char(l_cont_name_num),p_cont_name_dig,'0') || p_cont_name_suf;
13062 ELSE
13063 l_cont_name := p_cont_name_pre || to_char(l_cont_name_num)|| p_cont_name_suf;
13064 END IF;
13065 END IF;
13066 l_cont_name_num := l_cont_name_num + 1;
13067
13068 OPEN Get_Exist_Cont(l_cont_name);
13069 FETCH Get_Exist_Cont INTO l_cont_cnt;
13070 CLOSE Get_Exist_Cont;
13071
13072 IF l_cont_cnt = 0 THEN
13073 --
13074 x_cont_names(x_cont_names.count+1) := l_cont_name;
13075 ELSE
13076 l_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13077 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_NAME_DUPLICATE');
13078 FND_MESSAGE.SET_TOKEN('CONT_NAME',l_cont_name);
13079 WSH_UTIL_CORE.Add_Message(l_return_status,l_module_name);
13080 END IF;
13081 END LOOP;
13082
13083 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
13084 x_return_status := l_return_status;
13085 FND_MESSAGE.SET_NAME('WSH','WSH_CONT_CREATE_ERROR');
13086 WSH_UTIL_CORE.Add_Message(x_return_status,l_module_name);
13087 --
13088 IF l_debug_on THEN
13089 WSH_DEBUG_SV.pop(l_module_name);
13090 END IF;
13091 --
13092 return;
13093 END IF;
13094
13095 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13096
13097 --
13098 IF l_debug_on THEN
13099 WSH_DEBUG_SV.pop(l_module_name);
13100 END IF;
13101 --
13102 EXCEPTION
13103
13104 WHEN Others THEN
13105 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Create_Multiple_Cont_names',l_module_name);
13106 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13107
13108
13109 IF l_debug_on THEN
13110 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13111 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13112 END IF;
13113 --
13114 END Create_Multiple_Cont_name;
13115
13116
13120 This procedure updates all the containers included in p_container_id
13117 /* ----------------------------------------------------------------------
13118
13119 PROCEDURE Update_child_inv_info
13121 with p_locator_id and p_subinventory (downward in hirearchy)
13122
13123 Prameters
13124 p_container_id
13125 p_locator_id
13126 p_subinventory
13127 x_return_status
13128
13129 ------------------------------------------------------------------------*/
13130
13131 --lpn conv
13132 PROCEDURE Update_child_inv_info(p_container_id IN NUMBER,
13133 P_locator_id IN NUMBER,
13134 P_subinventory IN VARCHAR2,
13135 X_return_status OUT NOCOPY VARCHAR2)
13136 IS
13137
13138
13139 --
13140 l_debug_on BOOLEAN;
13141 --
13142 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || G_PKG_NAME || '.' || 'UPDATE_CHILD_INV_INFO';
13143 --
13144 l_container_id NUMBER;
13145
13146 child_cont_locked EXCEPTION;
13147 PRAGMA EXCEPTION_INIT(child_cont_locked, -00054);
13148
13149 CURSOR lock_containers(v_container_id NUMBER) IS
13150 SELECT delivery_detail_id
13151 FROM wsh_delivery_details
13152 --WHERE container_flag = 'Y'
13153 WHERE delivery_detail_id IN
13154 (SELECT delivery_detail_id
13155 FROM wsh_delivery_assignments
13156 START WITH parent_delivery_detail_id = v_container_id
13157 CONNECT BY PRIOR delivery_detail_id = parent_delivery_detail_id
13158 )
13159 FOR UPDATE NOWAIT;
13160
13161 BEGIN
13162
13163 --
13164 --
13165 SAVEPOINT s_Update_child_inv_info;
13166 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13167 --
13168 IF l_debug_on IS NULL
13169 THEN
13170 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13171 END IF;
13172 --
13173 IF l_debug_on THEN
13174 WSH_DEBUG_SV.push(l_module_name);
13175 --
13176 WSH_DEBUG_SV.log(l_module_name,'p_container_id',p_container_id);
13177 WSH_DEBUG_SV.log(l_module_name,'P_locator_id',P_locator_id);
13178 WSH_DEBUG_SV.log(l_module_name,'P_subinventory',P_subinventory);
13179 END IF;
13180 --
13181
13182
13183 OPEN lock_containers(p_container_id);
13184 LOOP --{
13185 FETCH lock_containers INTO l_container_id;
13186 EXIT WHEN lock_containers%NOTFOUND;
13187
13188 UPDATE wsh_delivery_details
13189 SET locator_id = p_locator_id,
13190 subinventory = p_subinventory
13191 WHERE delivery_detail_id = l_container_id;
13192
13193 END LOOP ; --}
13194
13195 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13196
13197 --
13198 IF l_debug_on THEN
13199 WSH_DEBUG_SV.pop(l_module_name);
13200 END IF;
13201 --
13202 EXCEPTION
13203
13204 WHEN child_cont_locked THEN
13205 rollback to s_Update_child_inv_info;
13206 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13207 --
13208 IF l_debug_on THEN
13209 WSH_DEBUG_SV.logmsg(l_module_name,'Could not lock record for the containers ',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13210 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:child_cont_locked');
13211 END IF;
13212 --
13213 WHEN Others THEN
13214 rollback to s_Update_child_inv_info;
13215 WSH_UTIL_CORE.Default_Handler('WSH_CONTAINER_ACTIONS.Update_child_inv_info',l_module_name);
13216 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13217
13218
13219 IF l_debug_on THEN
13220 WSH_DEBUG_SV.logmsg(l_module_name,'Unexpected error has occured. Oracle error message is '|| SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
13221 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
13222 END IF;
13223 --
13224 END Update_child_inv_info;
13225
13226 -----------------------------------------------------------------------------------------------------------------------
13227 --
13228 -- Name:
13229 -- Assign_Container_to_Consol
13230 --
13231 -- Purpose:
13232 -- This API will assign a content LPN to a consol LPN.
13233 -- If the parent LPN is not a consol LPN, we will convert it
13234 -- to a consol LPN and create the corresponding consol deliveries
13235 -- and trips.
13236 --
13237 -- Parameters:
13238 -- p_child_container_id: LPN that needs to be assigned.
13239 -- p_parent_container_id: LPN that will be assigned to
13240 -- p_caller: Calling entity/action
13241 -- x_return_status: status
13242
13243 PROCEDURE Assign_Container_to_Consol(
13244 p_child_container_id IN NUMBER,
13245 p_parent_container_id IN NUMBER,
13246 p_caller IN VARCHAR2,
13247 x_return_status OUT NOCOPY VARCHAR2) IS
13248
13249 cursor c_get_container_info(p_delivery_detail_id in number) is
13250 select d.container_flag, a.delivery_id, a.parent_delivery_id, d.inventory_item_id, d.organization_id
13251 from wsh_delivery_details d, wsh_delivery_assignments a
13252 where d.delivery_detail_id = p_delivery_detail_id
13253 and d.container_flag in ('Y', 'C')
13254 and a.type in ('C', 'S')
13255 and a.delivery_detail_id = d.delivery_detail_id
13256 and a.parent_delivery_detail_id is null
13257 and a.delivery_id is not null;
13258
13259
13260
13264 l_del_tab wsh_util_core.id_tab_type;
13261 l_parent_container_info c_get_container_info%rowtype;
13262 l_child_container_info c_get_container_info%rowtype;
13263 l_new_parent_delivery_id NUMBER := NULL;
13265
13266
13267 -- This cursor accepts a given delivery, p_del_id,
13268 -- and looks for consol deliveries that share the
13269 -- same trip as this delivery from the initial pickup location.
13270
13271 cursor c_get_trip_info(p_del_id in number) is
13272 select s.trip_id, d2.delivery_id
13273 from wsh_delivery_legs l1, wsh_delivery_legs l2,
13274 wsh_new_deliveries d1, wsh_new_deliveries d2,
13275 wsh_trip_stops s
13276 where l1.delivery_id = p_del_id
13277 and l1.delivery_id = d1.delivery_id -- bug 4891897
13278 and s.stop_id = l1.pick_up_stop_id
13279 and s.stop_location_id = d1.initial_pickup_location_id
13280 and l1.pick_up_stop_id = l2.pick_up_stop_id
13281 and l2.delivery_id = d2.delivery_id
13282 and d2.delivery_type = 'CONSOLIDATION';
13283
13284 cursor c_get_child_details(p_parent_detail_id in number) IS
13285 SELECT delivery_detail_id
13286 FROM wsh_delivery_assignments_v
13287 WHERE parent_delivery_detail_id = p_parent_detail_id;
13288
13289 /*CURSOR Get_Cont_Item_Info (v_cont_item_id NUMBER, v_org_id NUMBER) IS
13290 SELECT Container_Type_Code, weight_uom_code, volume_uom_code,
13291 minimum_fill_percent, maximum_load_weight, internal_volume, primary_uom_code,
13292 unit_weight, unit_volume
13293 FROM MTL_SYSTEM_ITEMS
13294 WHERE inventory_item_id = v_cont_item_id
13295 AND container_item_flag = 'Y'
13296 AND organization_id = v_org_id
13297 AND nvl(vehicle_item_flag,'N') = 'N'
13298 AND shippable_item_flag = 'Y';
13299
13300 */
13301
13302 CURSOR c_get_trip_id(p_delivery_id in number) IS
13303 SELECT trip_id
13304 FROM wsh_trip_stops s, wsh_delivery_legs l
13305 WHERE s.stop_id = l.pick_up_stop_id
13306 AND l.delivery_id = p_delivery_id;
13307
13308 l_assign_flag VARCHAR2(1);
13309 l_del_info_tab WSH_NEW_DELIVERIES_PVT.Delivery_Attr_Tbl_Type;
13310 l_parent_del_info_rec WSH_NEW_DELIVERIES_PVT.Delivery_Rec_Type;
13311 l_del_asg_info_rec WSH_DELIVERY_DETAILS_PKG.Delivery_Assignments_Rec_TYPE;
13312 l_child_details_tab wsh_util_core.id_tab_type;
13313 l_dummy_asg_tab wsh_util_core.id_tab_type;
13314 l_wv_delivery_tab wsh_util_core.id_tab_type;
13315 l_child_delivery_id NUMBER;
13316 l_trip_id NUMBER;
13317 l_parent_trip_id NUMBER;
13318 l_parent_consol_del_id NUMBER;
13319 l_child_trip_id NUMBER;
13320 l_child_consol_del_id NUMBER;
13321 l_unassign_dels wsh_util_core.id_tab_type;
13322 l_trip_id_tab wsh_util_core.id_tab_type;
13323
13324 l_cont_gross_weight NUMBER;
13325 l_cont_net_weight NUMBER;
13326 l_cont_volume NUMBER;
13327 l_cont_fill_pc NUMBER;
13328
13329 l_gross_wt NUMBER;
13330 l_net_wt NUMBER;
13331 l_volume NUMBER;
13332
13333 l_num_warnings NUMBER := 0;
13334 l_num_errors NUMBER := 0;
13335 l_return_status VARCHAR2(30);
13336
13337 CURSOR c_get_filled_vol(p_container_id NUMBER) IS
13338 SELECT filled_volume
13339 FROM WSH_DELIVERY_DETAILS
13340 WHERE delivery_detail_id = p_container_id;
13341
13342 l_filled_volume NUMBER;
13343
13344
13345 WSH_INVALID_CHILD EXCEPTION;
13346 WSH_INVALID_PARENT EXCEPTION;
13347 WSH_INVALID_CONSOL_ASSIGN EXCEPTION;
13348 WSH_ASSIGN_CONSOL_LPN_ERROR EXCEPTION;
13349 WSH_CONSOL_DEL_NO_MATCH EXCEPTION;
13350 WSH_NO_CHILD_LPNS EXCEPTION;
13351 WSH_INVALID_TRIPS EXCEPTION;
13352
13353 l_debug_on BOOLEAN;
13354 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'Assign_Container_to_Consol';
13355
13356 BEGIN
13357
13358 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
13359 --
13360 IF l_debug_on IS NULL
13361 THEN
13362 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
13363 END IF;
13364 --
13365 IF l_debug_on THEN
13366 WSH_DEBUG_SV.push(l_module_name);
13367 --
13368 WSH_DEBUG_SV.log(l_module_name,'p_caller',p_caller);
13369 WSH_DEBUG_SV.log(l_module_name,'p_child_container_id',p_child_container_id);
13370 WSH_DEBUG_SV.log(l_module_name,'p_parent_container_id',p_parent_container_id);
13371 END IF;
13372 -- Check if the parent lpn is a consol LPN
13373
13374 OPEN c_get_container_info(p_parent_container_id);
13375 FETCH c_get_container_info INTO l_parent_container_info;
13376 IF c_get_container_info%NOTFOUND THEN
13377 CLOSE c_get_container_info;
13378 RAISE WSH_INVALID_PARENT;
13379
13380 END IF;
13381 CLOSE c_get_container_info;
13382
13383 -- validate child LPN
13384
13385 OPEN c_get_container_info(p_child_container_id);
13386 FETCH c_get_container_info INTO l_child_container_info;
13387 IF c_get_container_info%NOTFOUND OR l_child_container_info.container_flag = 'C' THEN
13388 CLOSE c_get_container_info;
13389 RAISE WSH_INVALID_CHILD;
13390 END IF;
13391 CLOSE c_get_container_info;
13392
13393 IF l_child_container_info.delivery_id = l_parent_container_info.delivery_id THEN
13394
13395 -- Don't use this API!!!, use API's to pack into content LPNs.
13396 RAISE WSH_INVALID_CONSOL_ASSIGN;
13397
13398
13399 END IF;
13400
13404 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.container_flag',l_parent_container_info.container_flag);
13401 IF l_debug_on THEN
13402 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13403 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13405 END IF;
13406 IF l_parent_container_info.container_flag = 'Y' THEN
13407
13408 -- This is not a consol LPN, so we need to convert this to a consol before assignment.
13409 -- We consider the following cases:
13410 -- case 1. Neither the parent LPN nor the child LPN is attached to a consol delivery.
13411 -- We need to create a consolidation delivery for both.
13412 -- case 2. The parent LPN, even though not a consol LPN, is attached to
13413 -- a consol delivery, but the child is not.
13414 -- We need to assign the child container's delivery to the parent container's
13415 -- consol delivery.
13416 -- case 3. The child LPN is attached to a consol delivery, but the parent is not.
13417 -- We need to assign the parent container's delivery to the child
13418 -- container's consol delivery.
13419 -- case 4. Both the child and the parent containers have consolidation deliveries,
13420 -- but they do not match.
13421 -- Raise an exception since this is not a valid assignment.
13422 -- case 5. Both the child and the parent container have the same consol delivery.
13423 -- We do not need to do anything (this case is ignored) apart from converting the LPN.
13424
13425
13426
13427 IF l_parent_container_info.parent_delivery_id IS NULL
13428 AND l_child_container_info.parent_delivery_id IS NULL THEN
13429
13430 -- case 1. Neither the parent LPN nor the child LPN are attached to any consol deliveries.
13431 -- Check if the deliveries are assigned to trips. If they are assigned to
13432 -- the same trip, or if only one of the deliveries has a trip. Check if
13433 -- this trip has a consol delivery. If yes, we can use this consol delivery, else
13434 -- We need to create a consolidation delivery for both.
13435 IF l_debug_on THEN
13436 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13437 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13438 END IF;
13439
13440 -- Check if the trips have consolidation deliveries.
13441 -- Check trip for the parent lpn.
13442 OPEN c_get_trip_info(l_parent_container_info.delivery_id);
13443 FETCH c_get_trip_info INTO l_parent_trip_id, l_parent_consol_del_id;
13444 CLOSE c_get_trip_info;
13445
13446
13447 -- Check trip for the child lpn.
13448 OPEN c_get_trip_info(l_child_container_info.delivery_id);
13449 FETCH c_get_trip_info INTO l_child_trip_id, l_child_consol_del_id;
13450 CLOSE c_get_trip_info;
13451
13452 IF (l_child_trip_id <> l_parent_trip_id) THEN
13453
13454 RAISE WSH_INVALID_TRIPS;
13455
13456 END IF;
13457
13458 IF (l_child_trip_id IS NOT NULL) OR (l_parent_trip_id IS NOT NULL) THEN
13459
13460 -- Unassign the deliveries from the trip.
13461
13462 IF l_child_trip_id IS NOT NULL THEN
13463
13464 l_unassign_dels(1) := l_child_container_info.delivery_id;
13465
13466 END IF;
13467 IF l_parent_trip_id IS NOT NULL THEN
13468
13469 l_unassign_dels(l_unassign_dels.count + 1) := l_parent_container_info.delivery_id;
13470
13471 END IF;
13472
13473 l_child_trip_id := NVL(l_child_trip_id, l_parent_trip_id);
13474
13475
13476 IF l_debug_on THEN
13477 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TRIPS_ACTIONS.Unassign_Trip',WSH_DEBUG_SV.C_PROC_LEVEL);
13478 END IF;
13479
13480 WSH_TRIPS_ACTIONS.Unassign_Trip(p_del_rows => l_unassign_dels,
13481 p_trip_id => l_child_trip_id,
13482 x_return_status => l_return_status);
13483
13484 wsh_util_core.api_post_call
13485 (
13486 p_return_status => l_return_status,
13487 x_num_warnings => l_num_warnings,
13488 x_num_errors => l_num_errors
13489 );
13490
13491 l_assign_flag := 'Y';
13492 l_new_parent_delivery_id := NVL(l_parent_consol_del_id, l_child_consol_del_id);
13493 l_del_tab(1) := l_parent_container_info.delivery_id;
13494 l_del_tab(2) := l_child_container_info.delivery_id;
13495 END IF;
13496 IF l_new_parent_delivery_id IS NULL THEN
13497 -- Create a new consolidation delivery.
13498 IF l_debug_on THEN
13499 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13503 FOR i in 1..2 LOOP
13500 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13501 END IF;
13502
13504
13505 IF i = 1 THEN
13506 l_child_delivery_id := l_parent_container_info.delivery_id;
13507 ELSE
13508 l_child_delivery_id := l_child_container_info.delivery_id;
13509 END IF;
13510
13511 IF l_debug_on THEN
13512 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.Populate_Record',WSH_DEBUG_SV.C_PROC_LEVEL);
13513 END IF;
13514 WSH_NEW_DELIVERIES_PVT.Populate_Record(
13515 p_delivery_id => l_child_delivery_id,
13516 x_delivery_info => l_del_info_tab(i),
13517 x_return_status => l_return_status);
13518
13519 wsh_util_core.api_post_call
13520 (
13521 p_return_status => l_return_status,
13522 x_num_warnings => l_num_warnings,
13523 x_num_errors => l_num_errors
13524 );
13525 -- Handle return status
13526
13527 END LOOP;
13528
13529
13530 IF l_debug_on THEN
13531 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_Delivery_Autocreate.Autocreate_Consol_Delivery',WSH_DEBUG_SV.C_PROC_LEVEL);
13532 END IF;
13533 WSH_Delivery_Autocreate.Autocreate_Consol_Delivery(
13534 p_del_attributes_tab => l_del_info_tab,
13535 p_caller => p_caller,
13536 x_parent_del_id => l_new_parent_delivery_id,
13537 x_parent_trip_id => l_trip_id,
13538 x_return_status => l_return_status);
13539
13540 wsh_util_core.api_post_call
13541 (
13542 p_return_status => l_return_status,
13543 x_num_warnings => l_num_warnings,
13544 x_num_errors => l_num_errors
13545 );
13546 END IF;
13547
13548 ELSIF (l_parent_container_info.parent_delivery_id <> l_child_container_info.parent_delivery_id) OR
13549 (l_parent_container_info.parent_delivery_id IS NULL) OR
13550 (l_child_container_info.parent_delivery_id IS NULL) THEN
13551 IF l_debug_on THEN
13552 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13553 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13554 END IF;
13555
13556 IF l_parent_container_info.parent_delivery_id IS NOT NULL
13557 AND l_child_container_info.parent_delivery_id IS NULL THEN
13558 -- case 2. The parent LPN, even though not a consol LPN, is attached to
13559 -- a consol delivery, but the child is not.
13560 -- We need to assign the child containers delivery to the parent containers
13561 -- consol delivery.
13562 IF l_debug_on THEN
13563 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13564 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13565 END IF;
13566
13567 l_assign_flag := 'Y';
13568 l_new_parent_delivery_id := l_parent_container_info.parent_delivery_id;
13569 l_del_tab(1) := l_child_container_info.delivery_id;
13570
13571
13572 ELSIF l_parent_container_info.parent_delivery_id IS NULL
13573 AND l_child_container_info.parent_delivery_id IS NOT NULL THEN
13574 -- case 3. The child LPN is attached to a consol delivery, but the parent is not.
13575 -- We need to assign the parent container's delivery to the child
13576 -- containers consol delivery.
13577 IF l_debug_on THEN
13578 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13579 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13580 END IF;
13581
13582 l_assign_flag := 'Y';
13583 l_new_parent_delivery_id := l_child_container_info.parent_delivery_id;
13584 l_del_tab(1) := l_parent_container_info.delivery_id;
13585
13586
13587 ELSIF l_parent_container_info.parent_delivery_id <> l_child_container_info.parent_delivery_id THEN
13588 -- case 4. Both the child and the parent containers have consolidation deliveries
13589 -- but they do not match.
13590 -- Raise an exception since this is not a valid assignment.
13591
13592 IF l_debug_on THEN
13593 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13594 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13595 END IF;
13599 ELSIF l_child_container_info.parent_delivery_id = l_parent_container_info.parent_delivery_id THEN
13596 RAISE WSH_CONSOL_DEL_NO_MATCH;
13597
13598 END IF;
13600 IF l_debug_on THEN
13601 WSH_DEBUG_SV.log(l_module_name,'l_child_container_info.parent_delivery_id',l_child_container_info.parent_delivery_id);
13602 WSH_DEBUG_SV.log(l_module_name,'l_parent_container_info.parent_delivery_id',l_parent_container_info.parent_delivery_id);
13603 END IF;
13604
13605 l_new_parent_delivery_id := l_parent_container_info.parent_delivery_id;
13606
13607 END IF;
13608
13609 -- Convert the parent LPN to be a consol LPN.
13610
13611 -- Get the attributes of the parent delivery
13612 IF l_debug_on THEN
13613 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.Populate_Record',WSH_DEBUG_SV.C_PROC_LEVEL);
13614 END IF;
13615
13616 WSH_NEW_DELIVERIES_PVT.Populate_Record(
13617 p_delivery_id => l_new_parent_delivery_id,
13618 x_delivery_info => l_parent_del_info_rec,
13619 x_return_status => l_return_status);
13620
13621 wsh_util_core.api_post_call
13622 (
13623 p_return_status => l_return_status,
13624 x_num_warnings => l_num_warnings,
13625 x_num_errors => l_num_errors
13626 );
13627 -- update the LPN with the parents' attributes and set the container_flag to 'C'
13628
13629 -- Lock the delivery details and assignments.
13630
13631 BEGIN
13632 wsh_delivery_details_pkg.lock_detail_no_compare(p_delivery_detail_id => p_parent_container_id);
13633 wsh_delivery_details_pkg.lock_wda_no_compare(p_delivery_detail_id => p_parent_container_id);
13634 wsh_delivery_details_pkg.lock_wda_no_compare(p_delivery_detail_id => p_child_container_id);
13635 EXCEPTION
13636 WHEN OTHERS THEN
13637 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13638 FND_MESSAGE.SET_NAME('WSH','WSH_NO_LOCK');
13639 WSH_UTIL_CORE.Add_Message(x_return_status);
13640 --
13641 -- Debug Statements
13642 --
13643 IF l_debug_on THEN
13644 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_LOCK exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13645 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_LOCK');
13646 END IF;
13647 RETURN;
13648 --
13649 END;
13650
13651
13652 update wsh_delivery_details
13653 set container_flag = 'C',
13654 ship_to_location_id = l_parent_del_info_rec.ultimate_dropoff_location_id,
13655 intmed_ship_to_location_id = l_parent_del_info_rec.intmed_ship_to_location_id,
13656 customer_id = l_parent_del_info_rec.customer_id,
13657 fob_code = l_parent_del_info_rec.fob_code,
13658 freight_terms_code = l_parent_del_info_rec.freight_terms_code,
13659 ship_method_code = l_parent_del_info_rec.ship_method_code,
13660 carrier_id = l_parent_del_info_rec.carrier_id,
13661 mode_of_transport = l_parent_del_info_rec.mode_of_transport,
13662 service_level = l_parent_del_info_rec.service_level,
13663 deliver_to_location_id = l_parent_del_info_rec.ultimate_dropoff_location_id,
13664 line_direction = 'O'
13665 where delivery_detail_id = p_parent_container_id;
13666
13667
13668 -- Perform wda conversion.
13669 -- wda picture before conversion
13670
13671 -----------------------------------------------------------------------
13672 -- | del asg id| del det id| parent det id| del id| parent del id| type
13673 -----------------------------------------------------------------------
13674 -- | 1 | dd1 | lpn1 | d1 | NULL | S
13675 -----------------------------------------------------------------------
13676 -- | 2 | lpn1 | NULL | d1 | NULL | S
13677 -----------------------------------------------------------------------
13678
13679 -- wda picture after conversion
13680
13681 -----------------------------------------------------------------------
13682 -- | del asg id| del det id| parent det id| del id| parent del id| type
13683 -----------------------------------------------------------------------
13684 -- | 1 | dd1 | NULL | d1 | NULL | O
13685 -----------------------------------------------------------------------
13686 -- | 2 | lpn1 | NULL | pd1 | NULL | S
13687 -----------------------------------------------------------------------
13688 -- | 3 | dd1 | lpn1 | d1 | pd1 | C
13689 -----------------------------------------------------------------------
13690
13691 -- Here we are only converting the parent LPN into a consol LPN, we are not
13692 -- assigning any new children to the parent yet.
13693
13694 -- Parent container has a consolidation record. Since the parent
13695 -- is now a consol LPN, the consolidation record should be on the
13696 -- topmost children currently assigned to the parent, so we need
13697 -- to delete the parent's consolidation record.
13698
13699 delete from wsh_delivery_assignments
13700 where delivery_detail_id = p_parent_container_id
13701 and type = 'C';
13702
13703
13704 -- Get the current topmost children of the parent LPN.
13705 IF l_debug_on THEN
13709 OPEN c_get_child_details(p_parent_container_id);
13706 WSH_DEBUG_SV.log(l_module_name,'p_parent_container_id',p_parent_container_id);
13707 END IF;
13708
13710 FETCH c_get_child_details BULK COLLECT
13711 INTO l_child_details_tab;
13712 IF l_debug_on THEN
13713 WSH_DEBUG_SV.log(l_module_name,'l_child_details_tab.count',l_child_details_tab.count);
13714 END IF;
13715 CLOSE c_get_child_details;
13716
13717 -- lock the children.
13718
13719 BEGIN
13720 FOR i in 1..l_child_details_tab.count LOOP
13721 wsh_delivery_details_pkg.lock_wda_no_compare(p_delivery_detail_id => l_child_details_tab(i));
13722 END LOOP;
13723
13724 EXCEPTION
13725 WHEN OTHERS THEN
13726 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13727 FND_MESSAGE.SET_NAME('WSH','WSH_NO_LOCK');
13728 WSH_UTIL_CORE.Add_Message(x_return_status);
13729 --
13730 -- Debug Statements
13731 --
13732 IF l_debug_on THEN
13733 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_LOCK exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13734 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_LOCK');
13735 END IF;
13736 RETURN;
13737 --
13738 END;
13739
13740 -- Step 1.
13741 -- Update the outer assignment to be 'O', and null out
13742 -- its parent delivery detail id which is now a consolidation LPN.
13743
13744 FORALL i in 1..l_child_details_tab.count
13745 update wsh_delivery_assignments
13746 set parent_delivery_detail_id = NULL,
13747 type = 'O'
13748 where delivery_detail_id = l_child_details_tab(i)
13749 and NVL(type, 'S') = 'S';
13750
13751
13752
13753 -- Step 2.
13754 -- Now update the consol LPN's delivery assignment to be the consol delivery,
13755 -- and set its parent delivery id to be NULL.
13756
13757 update wsh_delivery_assignments
13758 set delivery_id = l_new_parent_delivery_id,
13759 parent_delivery_id = NULL,
13760 type = 'S'
13761 where delivery_detail_id = p_parent_container_id;
13762
13763 -- Step 3.
13764 -- Create new delivery assignments with type 'C' for all the topmost
13765 -- children of the parent.
13766
13767 l_del_asg_info_rec.parent_delivery_detail_id := p_parent_container_id;
13768 l_del_asg_info_rec.delivery_id := l_parent_container_info.delivery_id;
13769 l_del_asg_info_rec.parent_delivery_id := l_new_parent_delivery_id;
13770 l_del_asg_info_rec.type := 'C';
13771
13772 IF l_debug_on THEN
13773 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_Delivery_Details_PKG.Create_Deliv_Assignment_bulk',WSH_DEBUG_SV.C_PROC_LEVEL);
13774 END IF;
13775 WSH_Delivery_Details_PKG.Create_Deliv_Assignment_bulk(
13776 p_delivery_assignments_info => l_del_asg_info_rec,
13777 p_num_of_rec => l_child_details_tab.count,
13778 p_dd_id_tab => l_child_details_tab,
13779 x_da_id_tab => l_dummy_asg_tab,
13780 x_return_status => l_return_status);
13781
13782 wsh_util_core.api_post_call
13783 (
13784 p_return_status => l_return_status,
13785 x_num_warnings => l_num_warnings,
13786 x_num_errors => l_num_errors
13787 );
13788 -- Handle return status
13789
13790 ELSE -- if l_parent_container_info.container_flag = 'C'
13791
13792 -- The parent is already a consol LPN.
13793 -- this implies that the delivery id of the parent in wda
13794 -- is the consol delivery.
13795
13796 IF l_child_container_info.parent_delivery_id IS NULL THEN
13797
13798 -- Assign child delivery to parent's delivery.
13799 -- this will validate the constraints and the deconsol point.
13800
13801 l_assign_flag := 'Y';
13802 l_del_tab(1) := l_child_container_info.delivery_id;
13803 l_new_parent_delivery_id := l_parent_container_info.delivery_id;
13804
13805
13806 ELSIF l_child_container_info.parent_delivery_id <> l_parent_container_info.delivery_id THEN
13807
13808 -- Error! The child's parent delivery has to be the same as the consol delivery of the parent.
13809
13810 -- RAISE EXCEPTION;
13811 RAISE WSH_CONSOL_DEL_NO_MATCH;
13812 ELSE
13813
13814 l_new_parent_delivery_id := l_parent_container_info.delivery_id;
13815
13816 END IF;
13817
13818 END IF; -- if l_parent_container_info.container_flag = 'Y'
13819
13820 -- We now need to make the assignment of deliveries to consol deliveries where
13821 -- one delivery had a consol delivery and the other did not.
13822
13823 IF l_assign_flag = 'Y' THEN
13824
13825 -- Assign the unassigned delivery to the consol delivery.
13826 -- This will also validate constraints/deconsol point.
13827
13828
13829 FOR i in 1..l_del_tab.count LOOP
13830
13831 IF l_debug_on THEN
13832 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_NEW_DELIVERIES_PVT.Populate_Record',WSH_DEBUG_SV.C_PROC_LEVEL);
13833 END IF;
13834 WSH_NEW_DELIVERIES_PVT.Populate_Record(
13838
13835 p_delivery_id => l_del_tab(i),
13836 x_delivery_info => l_del_info_tab(i),
13837 x_return_status => l_return_status);
13839 wsh_util_core.api_post_call
13840 (
13841 p_return_status => l_return_status,
13842 x_num_warnings => l_num_warnings,
13843 x_num_errors => l_num_errors
13844 );
13845 -- Handle return status
13846
13847 END LOOP;
13848
13849
13850
13851
13852 IF l_debug_on THEN
13853 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_New_Delivery_Actions.Assign_Del_to_Consol_Del',WSH_DEBUG_SV.C_PROC_LEVEL);
13854 END IF;
13855 WSH_New_Delivery_Actions.Assign_Del_to_Consol_Del(
13856 p_del_tab => l_del_info_tab,
13857 p_parent_del_id => l_new_parent_delivery_id,
13858 p_caller => p_caller,
13859 x_return_status => l_return_status);
13860
13861 -- Handle return status.
13862
13863 wsh_util_core.api_post_call
13864 (
13865 p_return_status => l_return_status,
13866 x_num_warnings => l_num_warnings,
13867 x_num_errors => l_num_errors
13868 );
13869
13870 END IF;
13871
13872
13873 -- At this point the parent LPN is a consol LPN and is assigned to a
13874 -- consol delivery. The child LPN is also assigned to the same consol delivery.
13875 -- All we need to do now is to update the child's consolidation record to
13876 -- create the assignment.
13877
13878 update wsh_delivery_assignments
13879 set parent_delivery_detail_id = p_parent_container_id
13880 where delivery_detail_id = p_child_container_id
13881 and type = 'C';
13882
13883 -- Handle wt/vol for consol deliveries/LPNs.
13884 /***
13885 IF l_debug_on THEN
13886 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.Container_Weight_Volume',WSH_DEBUG_SV.C_PROC_LEVEL);
13887 END IF;
13888 WSH_WV_UTILS.Container_Weight_Volume (
13889 p_container_instance_id => p_parent_container_id,
13890 p_override_flag => 'Y',
13891 p_fill_pc_flag => 'Y',
13892 p_post_process_flag => 'N',
13893 p_calc_wv_if_frozen => 'N',
13894 x_gross_weight => l_cont_gross_weight,
13895 x_net_weight => l_cont_net_weight,
13896 x_volume => l_cont_volume,
13897 x_cont_fill_pc => l_cont_fill_pc,
13898 x_return_status => l_return_status);
13899
13900 wsh_util_core.api_post_call
13901 (
13902 p_return_status => l_return_status,
13903 x_num_warnings => l_num_warnings,
13904 x_num_errors => l_num_errors
13905 );
13906 ***/
13907 -- Need to recalculate the wt/vol for the releated entities.
13908 -- Calculating for the trips would drive all the way to the deliveries and lpns.
13909 IF l_debug_on THEN
13910 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_TRIPS_ACTIONS.trip_weight_volume',WSH_DEBUG_SV.C_PROC_LEVEL);
13911 END IF;
13912 OPEN c_get_filled_vol(p_parent_container_id);
13913 FETCH c_get_filled_vol INTO l_filled_volume;
13914 CLOSE c_get_filled_vol;
13915
13916 OPEN c_get_trip_id(l_new_parent_delivery_id);
13917 FETCH c_get_trip_id INTO l_trip_id_tab(1);
13918 CLOSE c_get_trip_id;
13919 WSH_TRIPS_ACTIONS.trip_weight_volume(
13920 p_trip_rows => l_trip_id_tab,
13921 p_override_flag => 'Y',
13922 p_calc_wv_if_frozen => 'N',
13923 p_start_departure_date => to_date(NULL),
13924 p_calc_del_wv => 'Y',
13925 x_return_status => l_return_status,
13926 p_suppress_errors => 'N');
13927
13928 UPDATE wsh_delivery_details
13929 SET filled_volume = l_filled_volume
13930 WHERE delivery_detail_id = p_parent_container_id;
13931
13932 IF x_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR) THEN
13933 IF l_debug_on THEN
13934 WSH_DEBUG_SV.logmsg(l_module_name,'Error calculating trip wt/vol');
13935 END IF;
13936 END IF;
13937 /*
13938
13939 IF l_debug_on THEN
13940 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.Delivery_Weight_Volume',WSH_DEBUG_SV.C_PROC_LEVEL);
13941 END IF;
13942
13943 WSH_WV_UTILS.Delivery_Weight_Volume
13944 ( p_delivery_id => l_new_parent_delivery_id,
13945 p_update_flag => 'Y',
13946 p_calc_wv_if_frozen => 'N',
13947 x_gross_weight => l_gross_wt,
13948 x_net_weight => l_net_wt,
13949 x_volume => l_volume,
13950 x_return_status => l_return_status);
13951 */
13952 wsh_util_core.api_post_call
13953 (
13954 p_return_status => l_return_status,
13955 x_num_warnings => l_num_warnings,
13959 THEN
13956 x_num_errors => l_num_errors);
13957
13958 IF l_num_errors > 0
13960 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13961 ELSIF l_num_warnings > 0
13962 THEN
13963 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
13964 ELSE
13965 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13966 END IF;
13967 --
13968 -- Debug Statements
13969 --
13970 IF l_debug_on THEN
13971 WSH_DEBUG_SV.pop(l_module_name);
13972 END IF;
13973 --
13974
13975 EXCEPTION
13976 WHEN FND_API.G_EXC_ERROR THEN
13977 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13978 --
13979 -- Debug Statements
13980 --
13981 IF l_debug_on THEN
13982 WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13983 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
13984 END IF;
13985
13986 WHEN WSH_INVALID_TRIPS THEN
13987 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13988 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_TRIPS');
13989 WSH_UTIL_CORE.Add_Message(x_return_status);
13990 --
13991 -- Debug Statements
13992 --
13993 IF l_debug_on THEN
13994 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_TRIPS exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
13995
13996 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_TRIPS');
13997 END IF;
13998
13999 WHEN WSH_NO_CHILD_LPNS THEN
14000 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14001 FND_MESSAGE.SET_NAME('WSH','WSH_NO_CHILD_LPNS');
14002 WSH_UTIL_CORE.Add_Message(x_return_status);
14003 --
14004 -- Debug Statements
14005 --
14006 IF l_debug_on THEN
14007 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_CHILD_LPNS exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14008
14009 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_CHILD_LPNS');
14010 END IF;
14011
14012 WHEN WSH_CONSOL_DEL_NO_MATCH THEN
14013 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14014 FND_MESSAGE.SET_NAME('WSH','WSH_CONSOL_DEL_NO_MATCH');
14015 WSH_UTIL_CORE.Add_Message(x_return_status);
14016 --
14017 -- Debug Statements
14018 --
14019 IF l_debug_on THEN
14020 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_CONSOL_DEL_NO_MATCH exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14021
14022 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_CONSOL_DEL_NO_MATCH');
14023 END IF;
14024
14025 WHEN WSH_ASSIGN_CONSOL_LPN_ERROR THEN
14026 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14027 FND_MESSAGE.SET_NAME('WSH','WSH_ASSIGN_CONSOL_LPN_ERROR');
14028 WSH_UTIL_CORE.Add_Message(x_return_status);
14029 --
14030 -- Debug Statements
14031 --
14032 IF l_debug_on THEN
14033 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_ASSIGN_CONSOL_LPN_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14034
14035 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_ASSIGN_CONSOL_LPN_ERROR');
14036 END IF;
14037
14038 WHEN WSH_INVALID_CONSOL_ASSIGN THEN
14039 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14040 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CONSOL_ASSIGN');
14041 WSH_UTIL_CORE.Add_Message(x_return_status);
14042 --
14043 -- Debug Statements
14044 --
14045 IF l_debug_on THEN
14046 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_CONSOL_ASSIGN exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14047
14048 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_CONSOL_ASSIGN');
14049 END IF;
14050
14051 WHEN WSH_INVALID_PARENT THEN
14052 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14053 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_PARENT');
14054 WSH_UTIL_CORE.Add_Message(x_return_status);
14055 --
14056 -- Debug Statements
14057 --
14058 IF l_debug_on THEN
14059 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_PARENT exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14060
14061 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_PARENT');
14062 END IF;
14063
14064 WHEN WSH_INVALID_CHILD THEN
14065 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14066 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_CHILD');
14067 WSH_UTIL_CORE.Add_Message(x_return_status);
14068 --
14069 -- Debug Statements
14070 --
14071 IF l_debug_on THEN
14072 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_CHILD exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14073
14074 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_CHILD');
14075 END IF;
14076 --
14077
14078 WHEN OTHERS THEN
14079
14080 x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
14081 wsh_util_core.default_handler('wsh_container_actions.Assign_Container_to_Consol', l_module_name);
14082 IF l_debug_on THEN
14083 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
14084 END IF;
14085
14086 END Assign_Container_to_Consol;
14087
14088 PROCEDURE Unpack_Details_from_Consol
14089 (p_delivery_details_tab IN WSH_UTIL_CORE.ID_TAB_TYPE,
14093 cursor c_check_valid_combination(p_dd_id IN NUMBER) IS
14090 p_caller IN VARCHAR2,
14091 x_return_status OUT NOCOPY VARCHAR2) IS
14092
14094 select wdd1.delivery_detail_id,
14095 wdd2.delivery_detail_id,
14096 wdd1.gross_weight,
14097 wdd1.net_weight,
14098 wdd1.volume,
14099 wdd1.weight_uom_code,
14100 wdd1.volume_uom_code,
14101 wdd1.inventory_item_id,
14102 wdd2.weight_uom_code,
14103 wdd2.volume_uom_code
14104 from wsh_delivery_details wdd1,
14105 wsh_delivery_details wdd2,
14106 wsh_delivery_assignments wda,
14107 wsh_new_deliveries wnd
14108 where wdd1.delivery_detail_id = p_dd_id
14109 and wda.delivery_detail_id = wdd1.delivery_detail_id
14110 and wda.type = 'C'
14111 and wda.delivery_id = wnd.delivery_id
14112 and wnd.status_code = 'OP'
14113 and wdd1.container_flag in ('Y', 'N')
14114 and wda.parent_delivery_detail_id = wdd2.delivery_detail_id
14115 and wdd2.container_flag = 'C'
14116 order by wdd2.delivery_detail_id;
14117
14118 cursor c_check_empty_consol(p_consol_lpn_id in number) is
14119 select delivery_detail_id
14120 from wsh_delivery_assignments
14121 where parent_delivery_detail_id = p_consol_lpn_id
14122 and type = 'C'
14123 and rownum = 1;
14124
14125
14126 l_consol_lpn_tab wsh_util_core.id_tab_type;
14127 l_empty_lpn_tab wsh_util_core.id_tab_type;
14128 l_rem_lpn_tab wsh_util_core.id_tab_type;
14129
14130 l_cont_gross_weight NUMBER;
14131 l_cont_net_weight NUMBER;
14132 l_cont_volume NUMBER;
14133 l_child_gross_weight NUMBER;
14134 l_child_net_weight NUMBER;
14135 l_child_volume NUMBER;
14136 l_child_inv_item_id NUMBER;
14137 l_child_weight_UOM VARCHAR2(30);
14138 l_child_volume_UOM VARCHAR2(30);
14139 l_parent_weight_UOM VARCHAR2(30);
14140 l_parent_volume_UOM VARCHAR2(30);
14141 l_cont_fill_pc NUMBER;
14142 l_child_dd_id NUMBER;
14143 l_parent_dd_id NUMBER;
14144 l_dummy_dd_id NUMBER;
14145 j NUMBER := 0;
14146 k NUMBER := 0;
14147 l NUMBER := 0;
14148
14149 l_num_warnings NUMBER := 0;
14150 l_num_errors NUMBER := 0;
14151 l_return_status VARCHAR2(30);
14152
14153 WSH_INVALID_COMBINATION EXCEPTION;
14154
14155 l_debug_on BOOLEAN;
14156 l_module_name CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name || '.' || 'Unpack_Details_from_Consol';
14157
14158 BEGIN
14159
14160 l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
14161 --
14162 IF l_debug_on IS NULL
14163 THEN
14164 l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
14165 END IF;
14166 --
14167 IF l_debug_on THEN
14168 WSH_DEBUG_SV.push(l_module_name);
14169 --
14170 WSH_DEBUG_SV.log(l_module_name,'p_caller',p_caller);
14171 END IF;
14172 --
14173
14174
14175 FOR i in 1..p_delivery_details_tab.count LOOP
14176
14177 OPEN c_check_valid_combination(p_delivery_details_tab(i));
14178 FETCH c_check_valid_combination
14179 INTO l_child_dd_id,
14180 l_parent_dd_id,
14181 l_cont_gross_weight,
14182 l_cont_net_weight,
14183 l_cont_volume,
14184 l_child_weight_UOM,
14185 l_child_volume_UOM,
14186 l_child_inv_item_id,
14187 l_parent_weight_UOM,
14188 l_parent_volume_UOM;
14189 IF c_check_valid_combination%NOTFOUND THEN
14190 CLOSE c_check_valid_combination;
14191 RAISE WSH_INVALID_COMBINATION;
14192 END IF;
14193 CLOSE c_check_valid_combination;
14194
14195 IF i = 1 THEN
14196 j := 1;
14197 l_consol_lpn_tab(j) := l_parent_dd_id;
14198 ELSIF l_parent_dd_id <> l_consol_lpn_tab(j) THEN
14199 j := j +1;
14200 l_consol_lpn_tab(j) := l_parent_dd_id;
14201 END IF;
14202
14203 -- Lock the delivery assignments.
14204
14205 BEGIN
14206
14207 WSH_DELIVERY_DETAILS_PKG.lock_wda_no_compare(p_delivery_detail_id => p_delivery_details_tab(i));
14208
14209 EXCEPTION
14210 WHEN OTHERS THEN
14211 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14212 FND_MESSAGE.SET_NAME('WSH','WSH_NO_LOCK');
14213 WSH_UTIL_CORE.Add_Message(x_return_status);
14214 --
14215 -- Debug Statements
14216 --
14217 IF l_debug_on THEN
14218 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_NO_LOCK exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14219 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_NO_LOCK');
14220 END IF;
14221 RETURN;
14222 --
14223 END;
14224
14225
14226
14227 -- WMS will update the consol LPN with the decremented wt/vol (LPN convergence).
14228 -- This will also decrement the consol delivery wt/vol. However since the child
14229 -- LPN is still attached to the consol delivery, the consol delivery wt/vol should
14233
14230 -- not change. So here we put back the child wt/vol onto the consol delivery in
14231 -- anticipation of it being decremented during the WMS call.
14232
14234 IF l_debug_on THEN
14235 WSH_DEBUG_SV.log(l_module_name,'l_cont_gross_weight',l_cont_gross_weight);
14236 WSH_DEBUG_SV.log(l_module_name,'l_cont_net_weight',l_cont_net_weight);
14237 WSH_DEBUG_SV.log(l_module_name,'l_cont_volume',l_cont_volume);
14238 WSH_DEBUG_SV.log(l_module_name,'l_child_weight_UOM',l_child_weight_UOM);
14239 WSH_DEBUG_SV.log(l_module_name,'l_parent_weight_UOM',l_parent_weight_UOM);
14240 WSH_DEBUG_SV.log(l_module_name,'l_child_volume_UOM',l_child_volume_UOM);
14241 WSH_DEBUG_SV.log(l_module_name,'l_parent_volume_UOM',l_parent_volume_UOM);
14242 END IF;
14243
14244 -- convert the child UOM to the parent UOMs.
14245
14246 IF l_child_weight_UOM = l_parent_weight_UOM THEN
14247 l_child_gross_weight := l_cont_gross_weight;
14248 l_child_net_weight := l_cont_net_weight;
14249 ELSE
14250
14251 IF NVL(l_cont_gross_weight, 0) = 0 THEN
14252 l_child_gross_weight := 0;
14253 ELSE
14254 IF l_debug_on THEN
14255 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.convert_uom',WSH_DEBUG_SV.C_PROC_LEVEL);
14256 WSH_DEBUG_SV.log(l_module_name,'l_cont_gross_weight',l_cont_gross_weight);
14257 END IF;
14258 l_child_gross_weight :=
14259 WSH_WV_UTILS.convert_uom(l_child_weight_UOM, l_parent_weight_UOM, l_cont_gross_weight, l_child_inv_item_id);
14260 END IF;
14261 IF NVL(l_cont_net_weight, 0) = 0 THEN
14262 l_child_net_weight := 0;
14263 ELSE
14264 IF l_debug_on THEN
14265 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.convert_uom',WSH_DEBUG_SV.C_PROC_LEVEL);
14266 WSH_DEBUG_SV.log(l_module_name,'l_cont_net_weight',l_cont_net_weight);
14267 END IF;
14268 l_child_net_weight :=
14269 WSH_WV_UTILS.convert_uom(l_child_weight_UOM, l_parent_weight_UOM, l_cont_net_weight, l_child_inv_item_id);
14270 END IF;
14271
14272 END IF;
14273 IF l_child_volume_UOM = l_parent_volume_UOM THEN
14274 l_child_volume := l_cont_volume;
14275 ELSE
14276
14277 IF NVL(l_cont_volume, 0) = 0 THEN
14278 l_child_volume := 0;
14279 ELSE
14280 IF l_debug_on THEN
14281 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.convert_uom',WSH_DEBUG_SV.C_PROC_LEVEL);
14282 WSH_DEBUG_SV.log(l_module_name,'l_cont_volume',l_cont_volume);
14283 END IF;
14284 l_child_volume :=
14285 WSH_WV_UTILS.convert_uom(l_child_volume_UOM, l_parent_volume_UOM, l_cont_volume, l_child_inv_item_id);
14286 END IF;
14287
14288 END IF;
14289
14290 IF l_debug_on THEN
14291 WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_WV_UTILS.DD_WV_Post_Process',WSH_DEBUG_SV.C_PROC_LEVEL);
14292 END IF;
14293
14294 WSH_WV_UTILS.DD_WV_Post_Process(
14295 p_delivery_detail_id => l_parent_dd_id,
14296 p_diff_gross_wt => l_child_gross_weight,
14297 p_diff_net_wt => l_child_net_weight,
14298 p_diff_volume => l_child_volume,
14299 p_diff_fill_volume => l_child_volume,
14300 x_return_status => l_return_status);
14301
14302 WSH_UTIL_CORE.API_Post_Call
14303 (
14304 p_return_status => l_return_status,
14305 x_num_warnings => l_num_warnings,
14306 x_num_errors => l_num_errors);
14307
14308
14309 END LOOP;
14310
14311 FORALL i in 1..p_delivery_details_tab.count
14312 update wsh_delivery_assignments
14313 set parent_delivery_detail_id = NULL
14314 where delivery_detail_id = p_delivery_details_tab(i)
14315 and type = 'C';
14316
14317
14318
14319 IF l_num_errors > 0
14320 THEN
14321 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14322 ELSIF l_num_warnings > 0
14323 THEN
14324 x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
14325 ELSE
14326 x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
14327 END IF;
14328 --
14329 -- Debug Statements
14330 --
14331 IF l_debug_on THEN
14332 WSH_DEBUG_SV.pop(l_module_name);
14333 END IF;
14334
14335
14336 EXCEPTION
14337 WHEN FND_API.G_EXC_ERROR THEN
14338 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14339 --
14340 -- Debug Statements
14341 --
14342 IF l_debug_on THEN
14343 WSH_DEBUG_SV.logmsg(l_module_name,'FND_API.G_EXC_ERROR exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14344 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
14345 END IF;
14346
14347
14348 WHEN WSH_INVALID_COMBINATION THEN
14349 x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
14350 FND_MESSAGE.SET_NAME('WSH','WSH_INVALID_COMBINATION');
14351 WSH_UTIL_CORE.Add_Message(x_return_status);
14352 --
14353 -- Debug Statements
14354 --
14355 IF l_debug_on THEN
14356 WSH_DEBUG_SV.logmsg(l_module_name,'WSH_INVALID_COMBINATION exception has occured.',WSH_DEBUG_SV.C_EXCEP_LEVEL);
14357
14358 WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:WSH_INVALID_COMBINATION');
14359 END IF;
14360 --
14361
14362 WHEN OTHERS THEN
14363 wsh_util_core.default_handler('wsh_container_actions.unassign_detail_from_consol',l_module_name);
14364 --
14365 IF l_debug_on THEN
14366 wsh_debug_sv.pop(l_module_name, 'EXCEPTION:OTHERS');
14367 END IF;
14368
14369 END Unpack_Details_from_Consol;
14370
14371 END wsh_container_actions;