DBA Data[Home] [Help]

PACKAGE BODY: APPS.WSH_DELIVERY_SPLITTER_PKG

Source


1 PACKAGE BODY WSH_DELIVERY_SPLITTER_PKG as
2 /* $Header: WSHDESPB.pls 120.4.12010000.2 2008/08/04 12:30:29 suppal ship $ */
3 
4   --
5   G_PKG_NAME CONSTANT VARCHAR2(50) := 'WSH_DELIVERY_SPLITTER_PKG';
6   --
7 
8   --OTM R12
9   ---------------------------------------------------------------------
10   -- PROCEDURE LOG_DEL_SPLITTER_EXCEPTION
11   --
12   -- parameters: p_delivery_rec	    record of delivery information containing
13   --				    id, gross weight, weight uom,
14   --				    pickup loc, org id
15   --		 p_content_weight   delivery's content's weight sum
16   --		 p_new_delivery_name  new delivery's name
17   --             p_exception_message  the exception message to log
18   --               this is included for complicated exception message
19   --             p_exception_name   name of the exception to log
20   --		 x_return_status    return status of the procedure
21   --
22   -- description: 	This procedure logs the exceptions for delivery splitting.
23   --                    The exception messge parameter is checked first.
24   --                    If not NULL then it's used, else generate the message
25   --                    depend on the exception name.
26   -- Prereq:     this procedure will raise unexpected error if delivery or exception
27   --             name passed in is NULL, so it's caller's responsibility.  For
28   --             DEL_SPLIT and DEL_SPLIT_LARGE, p_exception_message must be provided,
29   --             else the procedure will return with unexpected error.
30   ---------------------------------------------------------------------
31   PROCEDURE LOG_DEL_SPLITTER_EXCEPTION
32   (p_delivery_rec	IN WSH_ENTITY_INFO_REC,
33    p_content_weight	IN NUMBER,
34    p_weight_limit	IN NUMBER,
35    p_new_delivery_name	IN VARCHAR2 DEFAULT NULL,
36    p_new_delivery_id    IN NUMBER DEFAULT NULL,
37    p_exception_message	IN VARCHAR2 DEFAULT NULL,
38    p_exception_name	IN VARCHAR2,
39    x_return_status	OUT NOCOPY VARCHAR2) IS
40 
41   l_exception_id	WSH_EXCEPTIONS.EXCEPTION_ID%TYPE;
42   l_exception_message	WSH_EXCEPTIONS.MESSAGE%TYPE;
43   l_num_error           NUMBER;
44   l_num_warn            NUMBER;
45   l_return_status       VARCHAR2(1);
46   l_msg_count           NUMBER;
47   l_msg_data            VARCHAR2(32767);
48   l_delivery_id         WSH_NEW_DELIVERIES.DELIVERY_ID%TYPE;
49   unexp_error		EXCEPTION;
50 
51   l_debug_on       BOOLEAN;
52   --
53   l_module_name    CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name ||
54 						     '.' || 'LOG_DEL_SPLITTER_EXCEPTION';
55 
56   BEGIN
57 
58     --
59     l_debug_on := wsh_debug_interface.g_debug;
60     --
61     IF l_debug_on IS NULL THEN
62       l_debug_on := wsh_debug_sv.is_debug_enabled;
63     END IF;
64     --
65     IF l_debug_on THEN
66       wsh_debug_sv.push(l_module_name);
67       wsh_debug_sv.log(l_module_name, 'p_delivery_rec name',
68                                        p_delivery_rec.entity_name);
69       wsh_debug_sv.log(l_module_name, 'p_delivery_rec id',
70                                        p_delivery_rec.entity_id);
71       wsh_debug_sv.log(l_module_name, 'p_content_weight',
72                                        p_content_weight);
73       wsh_debug_sv.log(l_module_name, 'p_weight_limit',
74                                        p_weight_limit);
75       wsh_debug_sv.log(l_module_name, 'p_new_delivery_name',
76                                        p_new_delivery_name);
77       wsh_debug_sv.log(l_module_name, 'p_new_delivery_id',
78                                        p_new_delivery_id);
79       wsh_debug_sv.log(l_module_name, 'p_exception_message',
80                                        p_exception_message);
81       wsh_debug_sv.log(l_module_name, 'p_exception_name',
82                                        p_exception_name);
83 
84     END IF;
85 
86     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
87     l_num_error	:= 0;
88     l_num_warn 	:= 0;
89 
90     IF (p_exception_name IS NULL OR p_delivery_rec.entity_id IS NULL) THEN
91       IF l_debug_on THEN
92         WSH_DEBUG_SV.logmsg(l_module_name, 'exception name or delivery id is NULL');
93       END IF;
94       RAISE unexp_error;
95     END IF;
96 
97     IF (p_new_delivery_id IS NOT NULL) THEN
98       l_delivery_id := p_new_delivery_id;
99     ELSE
100       l_delivery_id := p_delivery_rec.entity_id;
101     END IF;
102 
103     IF (p_exception_message IS NOT NULL) THEN
104       l_exception_message := p_exception_message;
105     ELSE
106       IF (p_exception_name = 'WSH_OTM_DEL_OVERSIZED') THEN
107         FND_MESSAGE.SET_NAME('WSH', 'WSH_OTM_DEL_OVERSIZED');
108         FND_MESSAGE.SET_TOKEN('DELIVERY_NAME',
109                               p_delivery_rec.entity_name);
110         FND_MESSAGE.SET_TOKEN('GROSS_WEIGHT',
111                               p_delivery_rec.gross_weight);
112         FND_MESSAGE.SET_TOKEN('WEIGHT_LIMIT',
113                               p_weight_limit);
114         FND_MESSAGE.SET_TOKEN('DEL_DET_WEIGHT',
115                               p_content_weight);
116       ELSIF (p_exception_name = 'WSH_OTM_DEL_SPLIT_FAIL') THEN
117         FND_MESSAGE.SET_NAME('WSH', 'WSH_OTM_DEL_SPLIT_FAILED');
118         FND_MESSAGE.SET_TOKEN('DELIVERY_NAME',
119                               p_delivery_rec.entity_name);
120         FND_MESSAGE.SET_TOKEN('GROSS_WEIGHT',
121                               p_delivery_rec.gross_weight);
122         FND_MESSAGE.SET_TOKEN('WEIGHT_LIMIT',
123                               p_weight_limit);
124         FND_MESSAGE.SET_TOKEN('DEL_DET_WEIGHT',
125                               p_content_weight);
126       ELSIF (p_exception_name = 'WSH_OTM_DEL_SPLIT_CHILD') THEN
127         FND_MESSAGE.SET_NAME('WSH', 'WSH_OTM_DELIVERY_SPLIT_CHILD');
128         FND_MESSAGE.SET_TOKEN('CHILD_DELIVERY_NAME',
129                               p_new_delivery_name);
130         FND_MESSAGE.SET_TOKEN('PARENT_DELIVERY_NAME',
131                               p_delivery_rec.entity_name);
132       ELSIF (p_exception_name = 'WSH_OTM_DEL_LOCK_FAIL') THEN
133         FND_MESSAGE.SET_NAME('WSH', 'WSH_NO_LOCK');
134       ELSIF (p_exception_name IN ('WSH_OTM_DEL_SPLIT_LARGE', 'WSH_OTM_DEL_SPLIT')) THEN
135         --the caller API (which is in this file since this is internal api) should provide the
136         --message for these two exceptions due to complication, this is not expected
137         IF l_debug_on THEN
138           WSH_DEBUG_SV.logmsg(l_module_name, 'exception message is not provided for WSH_OTM_DEL_SPLIT_LARGE or WSH_OTM_DEL_SPLIT');
139         END IF;
140         RAISE unexp_error;
141       END IF;
142 
143       l_exception_message := FND_MESSAGE.Get;
144 
145     END IF;
146 
147     IF (l_exception_message IS NULL) THEN
148       IF l_debug_on THEN
149         WSH_DEBUG_SV.logmsg(l_module_name, 'exception message is NULL');
150       END IF;
151       RAISE unexp_error;
152     END IF;
153 
154     l_exception_id := NULL;
155 
156     IF l_debug_on THEN
157       WSH_DEBUG_SV.logmsg(l_module_name,
158                   'Calling program unit WSH_XC_UTIL.LOG_EXCEPTION',
159                   WSH_DEBUG_SV.C_PROC_LEVEL);
160     END IF;
161 
162     WSH_XC_UTIL.log_exception(
163       p_api_version           => 1.0,
164       x_return_status         => l_return_status,
165       x_msg_count             => l_msg_count,
166       x_msg_data              => l_msg_data,
167       x_exception_id          => l_exception_id,
168       p_exception_location_id => p_delivery_rec.init_pickup_loc_id,
169       p_logged_at_location_id => p_delivery_rec.init_pickup_loc_id,
170       p_logging_entity        => 'SHIPPER',
171       p_logging_entity_id     => FND_GLOBAL.USER_ID,
172       p_exception_name        => p_exception_name,
173       p_delivery_id           => l_delivery_id,
174       p_message	              => SUBSTRB(l_exception_message,1,2000));
175 
176     IF l_debug_on THEN
177       WSH_DEBUG_SV.logmsg(l_module_name, 'return status from WSH_XC_UTIL.log_exception: ' || l_return_status);
178     END IF;
179 
180     IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
181       l_num_error := l_num_error+1;
182     END IF;
183 
184     IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
185       l_num_warn := l_num_warn+1;
186     END IF;
187 
188     IF l_num_error > 0 THEN
189       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
190     ELSIF l_num_warn > 0 THEN
191       x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
192     ELSE
193       x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
194     END IF;
195 
196     IF l_debug_on THEN
197       WSH_DEBUG_SV.log(l_module_name, 'l_num_error', l_num_error);
198       WSH_DEBUG_SV.log(l_module_name, 'l_num_warn', l_num_warn);
199       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
200       WSH_DEBUG_SV.pop(l_module_name);
201     END IF;
202 
203   EXCEPTION
204     WHEN OTHERS THEN
205       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
206       --
207 
208       WSH_UTIL_CORE.default_handler(
209         'WSH_DELIVERY_SPLITTER_PKG.LOG_DEL_SPLITTER_EXCEPTION', l_module_name);
210       IF l_debug_on THEN
211         WSH_DEBUG_SV.logmsg(l_module_name,
212 		'Unexpected error has occured. Oracle error message is '||
213 		SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
214         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
215       END IF;
216 
217   END LOG_DEL_SPLITTER_EXCEPTION;
218 
219   ---------------------------------------------------------------------
220   -- PROCEDURE DELIVERY_SPLITTER
221   --
222   -- parameters: p_delivery_tab	    table of delivery information containing
223   --				    id, gross weight, weight uom,
224   --				    pickup loc, org id
225   --		 p_autosplit_flag   variable for the autosplit option,
226   --				    defaulted NULL, if Y then we will split
227   --				    delivery if size is too large
228   --		 x_accepted_del_id  table of delivery id that is accepted to
229   --				    be sent to GC3
230   --		 x_rejected_del_id  table of delivery id that is rejected
231   --				    because of oversize
232   --		 x_return_status    return status of the procedure
233   --
234   -- description: this procedure takes in a table of delivery information and
235   --		  split the deliveries if the gross weight exceeds limit.
236   --		  The splitting is done only if autosplit flag is Y, delivery
237   --		  is not assigned to a trip, delivery lines are not pick
238   --		  released,delivery's not content firm, delivery's each content
239   --		  is not larger than the limit, and the sum of delivery's content
240   --              matches the delivery weight total.
241   ---------------------------------------------------------------------
242   PROCEDURE Delivery_Splitter
243   (p_delivery_tab	IN WSH_ENTITY_INFO_TAB,
244    p_autosplit_flag	IN VARCHAR2 DEFAULT NULL,
245    x_accepted_del_id	OUT NOCOPY WSH_OTM_ID_TAB,
246    x_rejected_del_id	OUT NOCOPY WSH_OTM_ID_TAB,
247    x_return_status	OUT NOCOPY VARCHAR2) IS
248 
249   -- this will get top most delivery detail ID, gross weight,
250   -- and UOM, order by converted gross weight and ignoring null or 0
251   -- weight details
252   CURSOR c_get_delivery_line_and_cont(p_delivery_id IN NUMBER,
253                                       p_uom IN VARCHAR2) IS
254     SELECT decode(WDD.WEIGHT_UOM_CODE,
255                   p_uom, WDD.GROSS_WEIGHT,
256                   WSH_WV_UTILS.convert_uom(
257                                 wdd.weight_uom_code,
258                                 p_uom,
259                                 WDD.GROSS_WEIGHT)) gross_weight_converted,
260            WDA.DELIVERY_DETAIL_ID
261     FROM   WSH_DELIVERY_DETAILS WDD, WSH_DELIVERY_ASSIGNMENTS WDA
262     WHERE  WDA.DELIVERY_ID = p_delivery_id
263     AND    wda.delivery_detail_id = wdd.delivery_detail_id
264     AND    WDA.PARENT_DELIVERY_DETAIL_ID IS NULL
265     AND    WDD.WEIGHT_UOM_CODE IS NOT NULL
266     AND    WDD.GROSS_WEIGHT <> 0
267     ORDER BY gross_weight_converted ASC;
268 
269   -- this will get all delivery details' (non LPN) released status
270   CURSOR c_get_delivery_line(p_delivery_id IN NUMBER) IS
271     SELECT WDD.RELEASED_STATUS
272     FROM   WSH_DELIVERY_DETAILS WDD, WSH_DELIVERY_ASSIGNMENTS WDA
273     WHERE  WDA.DELIVERY_ID = p_delivery_id
274     AND    WDA.DELIVERY_DETAIL_ID = WDD.DELIVERY_DETAIL_ID
275     AND    WDD.CONTAINER_FLAG = 'N'
276     AND    WDD.RELEASED_STATUS NOT IN ('R', 'B', 'X');
277 
278   -- check if delivery is assigned to a trip
279   CURSOR c_is_delivery_assigned(p_delivery_id IN NUMBER) IS
280     SELECT 1
281     FROM WSH_DELIVERY_LEGS
282     WHERE delivery_id = p_delivery_id
283     AND rownum = 1;
284 
285   l_current_weight 		WSH_NEW_DELIVERIES.GROSS_WEIGHT%TYPE; -- variable used to track delivery weight
286   l_content_weight		WSH_NEW_DELIVERIES.GROSS_WEIGHT%TYPE; -- variable used to track total content weight
287 
288   -- variable used to track delivery weight for new delivery
289   l_new_weight 			WSH_NEW_DELIVERIES.GROSS_WEIGHT%TYPE;
290   l_line_and_container_id 	WSH_UTIL_CORE.ID_TAB_TYPE;
291   l_line_and_container_weight 	WSH_UTIL_CORE.ID_TAB_TYPE;
292   l_line_status	                WSH_UTIL_CORE.COLUMN_TAB_TYPE;
293 
294   -- used to keep the list of delivery ids for the splitted delivery
295   l_curr_del_split_list 	WSH_UTIL_CORE.ID_TAB_TYPE;
296   l_curr_del_split_name		WSH_UTIL_CORE.COLUMN_TAB_TYPE;
297   l_count 			NUMBER;
298   -- used to keep the list of delivery ids for the new delivery creation
299   l_current_ids 		WSH_UTIL_CORE.ID_TAB_TYPE;
300 
301   l_temp_ids			WSH_UTIL_CORE.ID_TAB_TYPE;
302   l_parameter_info		WSH_SHIPPING_PARAMS_PVT.PARAMETER_REC_TYP;
303   l_global_param_info		WSH_SHIPPING_PARAMS_PVT.GLOBAL_PARAMETERS_REC_TYP;
304   l_new_delivery_name		WSH_NEW_DELIVERIES.NAME%TYPE;  -- new delivery id
305   l_action_prms			WSH_GLBL_VAR_STRCT_GRP.dd_action_parameters_rec_type;
306   l_temp_num			NUMBER;
307 
308   l_num_error           	NUMBER;
309   l_num_warn            	NUMBER;
310   l_return_status       	VARCHAR2(1);
311   l_msg_count                   NUMBER;
312   l_msg_data                    VARCHAR2(32767);
313 
314   l_delivery_info		WSH_NEW_DELIVERIES_PVT.DELIVERY_REC_TYPE;
315   i  				NUMBER;
316   j				NUMBER;
317   k				NUMBER;
318   z            			NUMBER;
319   l_exception_name		WSH_EXCEPTIONS.EXCEPTION_NAME%TYPE;
320 
321   l_debug_on       BOOLEAN;
322   --
323   l_module_name    CONSTANT VARCHAR2(100) := 'wsh.plsql.' || g_pkg_name ||
324 					     '.' || 'DELIVERY_SPLITTER';
325   --
326   BEGIN
327 
328     --
329     l_debug_on := wsh_debug_interface.g_debug;
330     --
331     IF l_debug_on IS NULL THEN
332       l_debug_on := wsh_debug_sv.is_debug_enabled;
333     END IF;
334     --
335     IF l_debug_on THEN
336       wsh_debug_sv.push(l_module_name);
337       wsh_debug_sv.log(l_module_name, 'P_DELIVERY_TAB.COUNT:',
338 			p_delivery_tab.count);
339       wsh_debug_sv.log(l_module_name, 'p_autosplit_flag',
340 			p_autosplit_flag);
341     END IF;
342     --
343     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
344     --
345 
346     --intialize
347     l_temp_num 	:= 0;
348     l_num_error := 0;
349     l_num_warn 	:= 0;
350     l_count	:= 0;
351     l_new_delivery_name := NULL;
352     x_rejected_del_id := WSH_OTM_ID_TAB();
353     x_accepted_del_id := WSH_OTM_ID_TAB();
354     l_exception_name := NULL;
355 
356     IF (p_delivery_tab.COUNT = 0) THEN
357       IF l_debug_on THEN
358         WSH_DEBUG_SV.logmsg(l_module_name,'there is no delivery to split');
359         WSH_DEBUG_SV.pop(l_module_name);
360       END IF;
361       RETURN;
362     END IF;
363 
364     l_action_prms.caller := 'WSH_DELIVERY_SPLITTER';
365 
366     IF l_debug_on THEN
367         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_SHIPPING_PARAMS_PVT.Get_Global_Parameters',WSH_DEBUG_SV.C_PROC_LEVEL);
368     END IF;
369 
370     WSH_SHIPPING_PARAMS_PVT.get_global_parameters(
371 			x_param_info    => l_global_param_info,
372 			x_return_status => l_return_status);
373 
374     IF l_debug_on THEN
375       WSH_DEBUG_SV.logmsg(l_module_name, 'return status from WSH_SHIPPING_PARAMS_PVT.Get_Global_Parameters: ' || l_return_status);
376     END IF;
377 
378     IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
379       l_num_warn := l_num_warn + 1;
380     ELSIF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
381 			       WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
382       FND_MESSAGE.Set_Name('WSH', 'WSH_INVALID_GLOBAL_PARAMETER');
383       wsh_util_core.add_message(l_return_status,l_module_name);
384 
385       x_return_status := l_return_status;
386       --
387       IF l_debug_on THEN
388         WSH_DEBUG_SV.pop(l_module_name);
389       END IF;
390       RETURN;
391     END IF;
392 
393     i := p_delivery_tab.FIRST;
394 
395     --looping over all the deliveries to process each one for splitting
396     WHILE i IS NOT NULL LOOP
397 
398       IF l_debug_on THEN
399         wsh_debug_sv.log(l_module_name, 'P_DELIVERY_TAB.entity_id',
400                                          p_delivery_tab(i).entity_id);
401         wsh_debug_sv.log(l_module_name, 'p_delivery_tab.entity_name',
402                                          p_delivery_tab(i).entity_name);
403         wsh_debug_sv.log(l_module_name, 'p_delivery_tab.item_id',
404                                          p_delivery_tab(i).item_id);
405         wsh_debug_sv.log(l_module_name, 'p_delivery_tab.net_weight',
406                                          p_delivery_tab(i).net_weight);
407         wsh_debug_sv.log(l_module_name, 'p_delivery_tab.gross_weight',
408                                          p_delivery_tab(i).gross_weight);
409         wsh_debug_sv.log(l_module_name, 'p_delivery_tab.organization_id',
410                                          p_delivery_tab(i).organization_id);
411         wsh_debug_sv.log(l_module_name, 'p_delivery_tab.weight_uom',
412                                          p_delivery_tab(i).weight_uom);
413         wsh_debug_sv.log(l_module_name, 'p_delivery_tab.quantity',
414                                          p_delivery_tab(i).quantity);
415         wsh_debug_sv.log(l_module_name, 'p_delivery_tab.init_pickup_loc_id',
416                                          p_delivery_tab(i).init_pickup_loc_id);
417         wsh_debug_sv.log(l_module_name, 'p_delivery_tab.content_firm',
418                                          p_delivery_tab(i).content_firm);
419       END IF;
420 
421 
422       --the locking procedure fails when delivery does not have details, and only
423       --case the delivery has no details is when it is DELETE_REQUIRED.
424       --so adding this first query to bypass all the DELETE_REQUIRED deliveries
425 
426       --get delivery information
427       IF l_debug_on THEN
428         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_VALIDATIONS.get_delivery_information',WSH_DEBUG_SV.C_PROC_LEVEL);
429       END IF;
430 
431       WSH_DELIVERY_VALIDATIONS.get_delivery_information(p_delivery_id   => p_delivery_tab(i).entity_id,
432                                                         x_delivery_rec  => l_delivery_info,
433                                                         x_return_status => l_return_status);
434 
435       IF l_debug_on THEN
436         WSH_DEBUG_SV.logmsg(l_module_name, 'return status from WSH_DELIVERY_VALIDATIONS.get_delivery_information: ' || l_return_status);
437       END IF;
438 
439       IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
440           WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
441 
442         --reject failed delivery
443         IF l_debug_on THEN
444           wsh_debug_sv.logmsg(l_module_name, 'Error: cannot get delivery record');
445         END IF;
446 
447         l_num_error := l_num_error + 1;
448         x_rejected_del_id.EXTEND;
449         x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
450         GOTO loop_end;
451       ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
452         l_num_warn := l_num_warn + 1;
453       END IF;
454 
455       --accept all delete required or ignore for planning deliveries, no need to split
456       --Bug 7148914 added OR condition so that same flow is followed for delivery with tms_interface_flag 'DP'
457       IF (l_delivery_info.ignore_for_planning = 'Y' OR
458           l_delivery_info.tms_interface_flag = WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_REQUIRED OR
459           l_delivery_info.tms_interface_flag = WSH_NEW_DELIVERIES_PVT.C_TMS_DELETE_IN_PROCESS ) THEN
460 
461 
462         IF l_debug_on THEN
463           wsh_debug_sv.logmsg(l_module_name, 'accepted delivery ' || p_delivery_tab(i).entity_id || ' because ignore for planning, DR or DP status');
464         END IF;
465         x_accepted_del_id.EXTEND;
466         x_accepted_del_id(x_accepted_del_id.COUNT) := p_delivery_tab(i).entity_id;
467 
468         GOTO loop_end;
469 
470       END IF;
471 
472       --now proceed with the lock
473       SAVEPOINT delivery_record;
474 
475       --LOCK THE DELIVERY AND IT'S CONTENT
476       IF l_debug_on THEN
477         WSH_DEBUG_SV.logmsg(l_module_name,
478          'Calling program unit WSH_INTERFACE_COMMON_ACTIONS.LOCK_DELIVERY_AND_DETAILS',
479          WSH_DEBUG_SV.C_PROC_LEVEL);
480       END IF;
481 
482       WSH_INTERFACE_COMMON_ACTIONS.lock_delivery_and_details(
483                p_delivery_id   => p_delivery_tab(i).entity_id,
484                x_return_status => l_return_status);
485 
486       IF l_debug_on THEN
487         wsh_debug_sv.log (l_module_name,
488            'Return status from lock delivery and details',
489            l_return_status);
490       END IF;
491 
492       --only locking one delivery, should have no warning status for l_return_status
493       IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
494 
495         IF l_debug_on THEN
496           wsh_debug_sv.logmsg(l_module_name,
497              'Unable to lock the delivery');
498         END IF;
499 
500         l_num_error := l_num_error+1;
501 
502         IF l_debug_on THEN
503           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit log_del_splitter_exception',WSH_DEBUG_SV.C_PROC_LEVEL);
504         END IF;
505 
506         log_del_splitter_exception
507               (p_delivery_rec	        => p_delivery_tab(i),
508                p_content_weight	        => l_content_weight,
509                p_weight_limit		=> l_parameter_info.MAX_GROSS_WEIGHT,
510                p_exception_name	        => 'WSH_OTM_DEL_LOCK_FAIL',
511                x_return_status		=> l_return_status);
512 
513         IF l_debug_on THEN
514           WSH_DEBUG_SV.logmsg(l_module_name, 'return status from log_del_splitter_exception: ' || l_return_status);
515         END IF;
516 
517         x_rejected_del_id.EXTEND;
518         x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
519         GOTO loop_end;
520 
521       END IF;
522 
523       --get delivery information again to ensure it's latest
524       IF l_debug_on THEN
525         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_DELIVERY_VALIDATIONS.get_delivery_information',WSH_DEBUG_SV.C_PROC_LEVEL);
526       END IF;
527 
528       WSH_DELIVERY_VALIDATIONS.get_delivery_information(p_delivery_id   => p_delivery_tab(i).entity_id,
529                                                         x_delivery_rec  => l_delivery_info,
530                                                         x_return_status => l_return_status);
531 
532       IF l_debug_on THEN
533         WSH_DEBUG_SV.logmsg(l_module_name, 'return status from WSH_DELIVERY_VALIDATIONS.get_delivery_information: ' || l_return_status);
534       END IF;
535 
536       IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
537           WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
538 
539         ROLLBACK TO delivery_record;
540 
541         --reject failed delivery
542         IF l_debug_on THEN
543           wsh_debug_sv.logmsg(l_module_name, 'Error: cannot get delivery record');
544         END IF;
545 
546         l_num_error := l_num_error + 1;
547         x_rejected_del_id.EXTEND;
548         x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
549         GOTO loop_end;
550       ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
551         l_num_warn := l_num_warn + 1;
552       END IF;
553 
554       IF l_debug_on THEN
555         WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit WSH_SHIPPING_PARAMS_PVT.Get',WSH_DEBUG_SV.C_PROC_LEVEL);
556       END IF;
557 
558       --get shipping parameters
559       WSH_SHIPPING_PARAMS_PVT.get(
560 		p_organization_id => p_delivery_tab(i).organization_id,
561 		x_param_info      => l_parameter_info,
562 		x_return_status   => l_return_status);
563 
564       IF l_debug_on THEN
565         WSH_DEBUG_SV.logmsg(l_module_name, 'return status from WSH_SHIPPING_PARAMS_PVT.Get: ' || l_return_status);
566       END IF;
567 
568       IF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
569         l_num_warn := l_num_warn + 1;
570       ELSIF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR,
571 	  			 WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
572 
573         ROLLBACK TO delivery_record;
574         FND_MESSAGE.Set_Name('WSH', 'WSH_PARAM_NOT_DEFINED');
575         FND_MESSAGE.Set_Token('ORGANIZATION_CODE',
576              wsh_util_core.get_org_name(p_delivery_tab(i).organization_id));
577         wsh_util_core.add_message(l_return_status,l_module_name);
578         l_num_error := l_num_error+1;
579 
580         IF l_debug_on THEN
581           wsh_debug_sv.logmsg(l_module_name, 'Error: cannot get shipping parameter info');
582         END IF;
583 
584         x_rejected_del_id.EXTEND;
585         x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
586 
587         GOTO loop_end;
588       END IF;
589 
590       IF l_debug_on THEN
591         wsh_debug_sv.log(l_module_name,
592                          'Max Gross Weight',
593                          l_parameter_info.max_gross_weight);
594         wsh_debug_sv.log(l_module_name,
595                          'Global UOM',
596                          l_global_param_info.GU_WEIGHT_UOM);
597         wsh_debug_sv.log(l_module_name,
598                          'delivery gross weight',
599                          p_delivery_tab(i).gross_weight);
600       END IF;
601 
602       --if no limit specified in shipping parameter, accept it all
603       IF (l_parameter_info.MAX_GROSS_WEIGHT IS NULL) THEN
604 
605         IF l_debug_on THEN
606           wsh_debug_sv.logmsg(l_module_name,
607                               'Gross Weight IS NULL');
608         END IF;
609 
610         x_accepted_del_id.EXTEND;
611         x_accepted_del_id(x_accepted_del_id.COUNT) := p_delivery_tab(i).entity_id;
612         COMMIT;  --release lock
613 
614         GOTO loop_end;
615       END IF;
616 
617       --if delivery weight uom is not setup, then cannot proceed
618       IF (p_delivery_tab(i).weight_uom IS NULL OR l_global_param_info.GU_WEIGHT_UOM IS NULL) THEN
619         ROLLBACK TO delivery_record;
620 
621         IF l_debug_on THEN
622           wsh_debug_sv.logmsg(l_module_name,
623                               'Weight UOM IS NULL');
624         END IF;
625 
626         IF l_debug_on THEN
627           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit log_del_splitter_exception',WSH_DEBUG_SV.C_PROC_LEVEL);
628         END IF;
629 
630         log_del_splitter_exception
631             (p_delivery_rec	        => p_delivery_tab(i),
632              p_content_weight	        => 0, --passing 0 here because delivery UOM is NULL, dunno what weight would be.
633              p_weight_limit		=> l_parameter_info.MAX_GROSS_WEIGHT,
634              p_exception_name	        => 'WSH_OTM_DEL_SPLIT_FAIL',
635              x_return_status		=> l_return_status);
636 
637         IF l_debug_on THEN
638           WSH_DEBUG_SV.logmsg(l_module_name, 'return status from log_del_splitter_exception: ' || l_return_status);
639         END IF;
640 
641         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
642           l_num_error := l_num_error+1;
643         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
644           l_num_warn := l_num_warn+1;
645         END IF;
646 
647         x_rejected_del_id.EXTEND;
648         x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
649         GOTO loop_end;
650 
651       END IF;
652 
653       --convert the max gross weight to delivery's weight UOM
654       IF (l_global_param_info.GU_WEIGHT_UOM <> p_delivery_tab(i).weight_uom) THEN
655         l_parameter_info.MAX_GROSS_WEIGHT := WSH_WV_UTILS.convert_uom(
656 					     from_uom => l_global_param_info.GU_WEIGHT_UOM,
657  					     to_uom   => p_delivery_tab(i).weight_uom,
658 					     quantity => l_parameter_info.MAX_GROSS_WEIGHT);
659       END IF;
660 
661       l_content_weight := 0;
662 
663       --checking if the delivery content weight sum is over the limit
664       IF (NVL(l_delivery_info.wv_frozen_flag, 'N') = 'N') THEN
665         --if delivery is not frozen, then weight is same
666         l_content_weight := NVL(p_delivery_tab(i).gross_weight, 0);
667       END IF;
668 
669       --if frozen weight or delivery is oversized then need to get the detail weights
670       IF (NVL(p_delivery_tab(i).gross_weight, 0) > l_parameter_info.MAX_GROSS_WEIGHT
671           OR l_delivery_info.wv_frozen_flag = 'Y') THEN
672 
673         l_line_and_container_weight.DELETE;
674         l_line_and_container_id.DELETE;
675 
676         OPEN c_get_delivery_line_and_cont(p_delivery_tab(i).entity_id, p_delivery_tab(i).weight_uom);
677         FETCH c_get_delivery_line_and_cont
678           BULK COLLECT INTO l_line_and_container_weight,
679                             l_line_and_container_id;
680 
681         IF l_debug_on THEN
682           wsh_debug_sv.log(l_module_name,
683             'l_line_and_container_weight.count:',
684             l_line_and_container_weight.count);
685           wsh_debug_sv.log(l_module_name,
686             'l_line_and_container_id.count:',
687             l_line_and_container_id.count);
688           wsh_debug_sv.log(l_module_name,
689             'wv_frozen_flag:',
690             l_delivery_info.wv_frozen_flag);
691         END IF;
692 
693         --if delivery weight is frozen, need to sum up the content weight
694         IF (l_delivery_info.wv_frozen_flag = 'Y'
695             AND l_line_and_container_weight.COUNT > 0) THEN
696 
697           z := l_line_and_container_weight.FIRST;
698 
699           --looping over the detail weights to sum it up.
700           WHILE z IS NOT NULL LOOP
701 
702             l_content_weight := l_content_weight + l_line_and_container_weight(z);
703 
704             IF l_debug_on THEN
705               wsh_debug_sv.log(l_module_name, 'z', z);
706               wsh_debug_sv.log(l_module_name, 'l_content_weight', l_content_weight);
707             END IF;
708 
709             z:= l_line_and_container_weight.NEXT(z);
710 
711           END LOOP;
712         END IF;
713         CLOSE c_get_delivery_line_and_cont;
714 
715         IF l_debug_on THEN
716           wsh_debug_sv.log(l_module_name,
717                          'Converted Max Gross Weight',
718                          l_parameter_info.max_gross_weight);
719           wsh_debug_sv.log(l_module_name,
720                          'delivery content weight sum',
721                          l_content_weight);
722         END IF;
723       END IF;
724 
725       --accept all under sized deliveries
726       IF (NVL(p_delivery_tab(i).gross_weight, 0) <= l_parameter_info.MAX_GROSS_WEIGHT
727          AND l_content_weight <= l_parameter_info.MAX_GROSS_WEIGHT) THEN
728 
729         x_accepted_del_id.EXTEND;
730         x_accepted_del_id(x_accepted_del_id.COUNT) := p_delivery_tab(i).entity_id;
731         COMMIT;  --release lock
732         GOTO loop_end;
733       END IF;
734 
735       --if split flag is off but oversized, reject it.
736       IF (p_autosplit_flag IS NULL OR p_autosplit_flag = 'N') THEN
737 
738         ROLLBACK TO delivery_record;
739 
740         IF l_debug_on THEN
741           wsh_debug_sv.logmsg(l_module_name,
742                       'Autosplit flag is off but delivery weight or delivery detail weight sum is over the weight limits');
743         END IF;
744 
745         IF l_debug_on THEN
746           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit log_del_splitter_exception',WSH_DEBUG_SV.C_PROC_LEVEL);
747         END IF;
748 
749         log_del_splitter_exception
750               (p_delivery_rec	        => p_delivery_tab(i),
751                p_content_weight	        => l_content_weight,
752                p_weight_limit		=> l_parameter_info.MAX_GROSS_WEIGHT,
753                p_exception_name	        => 'WSH_OTM_DEL_OVERSIZED',
754                x_return_status		=> l_return_status);
755 
756         IF l_debug_on THEN
757           WSH_DEBUG_SV.logmsg(l_module_name, 'return status from log_del_splitter_exception: ' || l_return_status);
758         END IF;
759 
760         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
761           l_num_error := l_num_error+1;
762         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
763           l_num_warn := l_num_warn+1;
764         END IF;
765 
766         x_rejected_del_id.EXTEND;
767         x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
768 
769         GOTO loop_end;
770       END IF;
771 
772       --split flag Yes but delivery weight and detail weight sum doesn't match and either delivery weight or detail
773       --weight sum is over the limit, reject
774       IF ((NVL(p_delivery_tab(i).gross_weight, 0) <= l_parameter_info.MAX_GROSS_WEIGHT
775            AND l_content_weight > l_parameter_info.MAX_GROSS_WEIGHT)
776           OR (NVL(p_delivery_tab(i).gross_weight, 0) > l_parameter_info.MAX_GROSS_WEIGHT
777               AND l_content_weight <> NVL(p_delivery_tab(i).gross_weight, 0))) THEN
778 
779         ROLLBACK TO delivery_record;
780 
781         IF l_debug_on THEN
782           wsh_debug_sv.logmsg(l_module_name,
783               'Content Weight sum does not equal delivery gross weight');
784         END IF;
785 
786         IF l_debug_on THEN
787           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit log_del_splitter_exception',WSH_DEBUG_SV.C_PROC_LEVEL);
788         END IF;
789 
790         log_del_splitter_exception
791               (p_delivery_rec	        => p_delivery_tab(i),
792                p_content_weight	        => l_content_weight,
793                p_weight_limit		=> l_parameter_info.MAX_GROSS_WEIGHT,
794                p_exception_name	        => 'WSH_OTM_DEL_SPLIT_FAIL',
795                x_return_status		=> l_return_status);
796 
797         IF l_debug_on THEN
798           WSH_DEBUG_SV.logmsg(l_module_name, 'return status from log_del_splitter_exception: ' || l_return_status);
799         END IF;
800 
801         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
802           l_num_error := l_num_error+1;
803         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
804           l_num_warn := l_num_warn+1;
805         END IF;
806 
807         x_rejected_del_id.EXTEND;
808         x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
809         GOTO loop_end;
810       END IF;
811 
812       --if delivery is content firm, cannot split
813       IF (p_delivery_tab(i).content_firm IN ('F', 'Y')) THEN
814 
815         ROLLBACK TO delivery_record;
816 
817         IF l_debug_on THEN
818           wsh_debug_sv.logmsg(l_module_name,
819 			   'Delivery is content firm');
820         END IF;
821 
822         IF l_debug_on THEN
823           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit log_del_splitter_exception',WSH_DEBUG_SV.C_PROC_LEVEL);
824         END IF;
825 
826         log_del_splitter_exception
827               (p_delivery_rec	        => p_delivery_tab(i),
828                p_content_weight	        => l_content_weight,
829                p_weight_limit		=> l_parameter_info.MAX_GROSS_WEIGHT,
830                p_exception_name	        => 'WSH_OTM_DEL_SPLIT_FAIL',
831                x_return_status		=> l_return_status);
832 
833         IF l_debug_on THEN
834           WSH_DEBUG_SV.logmsg(l_module_name, 'return status from log_del_splitter_exception: ' || l_return_status);
835         END IF;
836 
837         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
838           l_num_error := l_num_error+1;
839         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
840           l_num_warn := l_num_warn+1;
841         END IF;
842 
843         x_rejected_del_id.EXTEND;
844         x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
845         GOTO loop_end;
846 
847       END IF;
848 
849       --if one detail/LPN (entity that has no parent but the delivery) is larger than the limit, can't split
850       IF l_line_and_container_weight(l_line_and_container_weight.LAST) > l_parameter_info.MAX_GROSS_WEIGHT THEN
851 
852         ROLLBACK TO delivery_record;
853 
854         IF l_debug_on THEN
855           wsh_debug_sv.logmsg(l_module_name,
856 			   'Delivery line weight greater than the gross weight limit');
857         END IF;
858 
859         IF l_debug_on THEN
860           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit log_del_splitter_exception',WSH_DEBUG_SV.C_PROC_LEVEL);
861         END IF;
862 
863         log_del_splitter_exception
864               (p_delivery_rec	        => p_delivery_tab(i),
865                p_content_weight	        => l_content_weight,
866                p_weight_limit		=> l_parameter_info.MAX_GROSS_WEIGHT,
867                p_exception_name	        => 'WSH_OTM_DEL_SPLIT_FAIL',
868                x_return_status		=> l_return_status);
869 
870         IF l_debug_on THEN
871           WSH_DEBUG_SV.logmsg(l_module_name, 'return status from log_del_splitter_exception: ' || l_return_status);
872         END IF;
873 
874         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
875           l_num_error := l_num_error+1;
876         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
877           l_num_warn := l_num_warn+1;
878         END IF;
879 
880         x_rejected_del_id.EXTEND;
881         x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
882         GOTO loop_end;
883 
884       END IF;
885 
886       OPEN c_is_delivery_assigned(p_delivery_tab(i).entity_id);
887       FETCH c_is_delivery_assigned INTO l_temp_num;
888       CLOSE c_is_delivery_assigned;
889 
890       --If delivery has trip, no split
891       IF (l_temp_num IS NOT NULL AND l_temp_num > 0) THEN
892 
893         ROLLBACK TO delivery_record;
894 
895         IF l_debug_on THEN
896           wsh_debug_sv.logmsg(l_module_name,
897 	            'Delivery is assigned to trip');
898         END IF;
899 
900         IF l_debug_on THEN
901           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit log_del_splitter_exception',WSH_DEBUG_SV.C_PROC_LEVEL);
902         END IF;
903 
904         log_del_splitter_exception
905               (p_delivery_rec	        => p_delivery_tab(i),
906                p_content_weight	        => l_content_weight,
907                p_weight_limit		=> l_parameter_info.MAX_GROSS_WEIGHT,
908                p_exception_name	        => 'WSH_OTM_DEL_SPLIT_FAIL',
909                x_return_status		=> l_return_status);
910 
911         IF l_debug_on THEN
912           WSH_DEBUG_SV.logmsg(l_module_name, 'return status from log_del_splitter_exception: ' || l_return_status);
913         END IF;
914 
915         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
916           l_num_error := l_num_error+1;
917         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
918           l_num_warn := l_num_warn+1;
919         END IF;
920 
921         x_rejected_del_id.EXTEND;
922         x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
923         GOTO loop_end;
924 
925       END IF;
926 
927       --delivery with pick released/pick confirmed delivery lines cannot be split
928       l_line_status.DELETE;
929       OPEN c_get_delivery_line(p_delivery_tab(i).entity_id);
930       FETCH c_get_delivery_line BULK COLLECT INTO l_line_status;
931       CLOSE c_get_delivery_line;
932 
933       IF l_debug_on THEN
934         wsh_debug_sv.log(l_module_name, 'l_line_status count', l_line_status.COUNT);
935       END IF;
936 
937       IF (l_line_status.COUNT > 0) THEN
938 
939         ROLLBACK TO delivery_record;
940 
941         IF l_debug_on THEN
942           wsh_debug_sv.logmsg(l_module_name,
943                 'Delivery line is pick released or pick confirmed.');
944         END IF;
945 
946         IF l_debug_on THEN
947           WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit log_del_splitter_exception',WSH_DEBUG_SV.C_PROC_LEVEL);
948         END IF;
949 
950         log_del_splitter_exception
951               (p_delivery_rec	        => p_delivery_tab(i),
952                p_content_weight	        => l_content_weight,
953                p_weight_limit		=> l_parameter_info.MAX_GROSS_WEIGHT,
954                p_exception_name	        => 'WSH_OTM_DEL_SPLIT_FAIL',
955                x_return_status		=> l_return_status);
956 
957         IF l_debug_on THEN
958           WSH_DEBUG_SV.logmsg(l_module_name, 'return status from log_del_splitter_exception: ' || l_return_status);
959         END IF;
960 
961         IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
962           l_num_error := l_num_error+1;
963         ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
964           l_num_warn := l_num_warn+1;
965         END IF;
966 
967         x_rejected_del_id.EXTEND;
968         x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
969         GOTO loop_end;
970 
971       END IF;
972 
973       l_current_weight := 0;
974 
975       --Splitting the delivery by delivery detail weights
976       --looping over all the top most detail/LPNs in the delivery
977       j := l_line_and_container_id.FIRST;
978       WHILE j IS NOT NULL LOOP
979 
980         --try to fill up as many detail/LPN as possible within the weight limit.
981         IF (l_current_weight + l_line_and_container_weight(j)) <= l_parameter_info.MAX_GROSS_WEIGHT THEN
982 
983           l_current_weight := l_current_weight + l_line_and_container_weight(j);
984 
985         ELSE
986 
987           --unassign all the delivery lines that's outside the limit
988           l_temp_ids.DELETE;
989 
990           --looping over all the top most detail/LPNs from z to the end of the list
991           --to create a list of ids to unassign from delivery
992           z := j;
993           WHILE z IS NOT NULL LOOP
994 
995             l_temp_ids(l_temp_ids.COUNT+1) := l_line_and_container_id(z);
996             z:= l_line_and_container_id.NEXT(z);
997 
998           END LOOP;
999 
1000           IF l_debug_on THEN
1001             WSH_DEBUG_SV.logmsg(l_module_name,
1002                   'Calling program unit WSH_DELIVERY_DETAILS_ACTIONS.Unassign_multiple_details',
1003                   WSH_DEBUG_SV.C_PROC_LEVEL);
1004           END IF;
1005 
1006           WSH_DELIVERY_DETAILS_ACTIONS.unassign_multiple_details(
1007 			       	  p_rec_of_detail_ids => l_temp_ids,
1008 			       	  p_from_delivery     => 'Y',
1009 			       	  p_from_container    => 'N',
1010 		       		  p_action_prms       => l_action_prms,
1011 			       	  x_return_status     => l_return_status);
1012 
1013           IF l_debug_on THEN
1014             WSH_DEBUG_SV.logmsg(l_module_name, 'return status from WSH_DELIVERY_DETAILS_ACTIONS.UNASSIGN_MULTIPLE_DETAILS: ' || l_return_status);
1015           END IF;
1016 
1017           IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
1018 
1019             ROLLBACK TO delivery_record;
1020 
1021             l_num_error := l_num_error+1;
1022 
1023             --reject failed delivery
1024             IF l_debug_on THEN
1025               wsh_debug_sv.logmsg(l_module_name, 'Error during unassign delivery details');
1026             END IF;
1027 
1028             IF l_debug_on THEN
1029               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit log_del_splitter_exception',WSH_DEBUG_SV.C_PROC_LEVEL);
1030             END IF;
1031 
1032             log_del_splitter_exception
1033                   (p_delivery_rec	        => p_delivery_tab(i),
1034                    p_content_weight	        => l_content_weight,
1035                    p_weight_limit		=> l_parameter_info.MAX_GROSS_WEIGHT,
1036                    p_exception_name	        => 'WSH_OTM_DEL_SPLIT_FAIL',
1037                    x_return_status		=> l_return_status);
1038 
1039             IF l_debug_on THEN
1040               WSH_DEBUG_SV.logmsg(l_module_name, 'return status from log_del_splitter_exception: ' || l_return_status);
1041             END IF;
1042 
1043             x_rejected_del_id.EXTEND;
1044             x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
1045             GOTO loop_end;
1046 
1047           ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
1048             l_num_warn := l_num_warn+1;
1049           END IF;
1050 
1051           l_new_weight := 0;
1052           l_curr_del_split_list(1) := p_delivery_tab(i).entity_id;
1053           l_curr_del_split_name(1) := p_delivery_tab(i).entity_name;
1054 
1055           l_current_ids.DELETE;
1056 
1057           --now loop through the list of top most details/LPNs from j to the end to figure out
1058           --which details/LPNs can be put into new deliveries
1059           k := j;
1060           WHILE k IS NOT NULL LOOP
1061 
1062             --assign as many details/LPNs as possible under the weight limit for the new delivery
1063             IF (l_new_weight + l_line_and_container_weight(k)) <= l_parameter_info.MAX_GROSS_WEIGHT THEN
1064 
1065               l_new_weight := l_new_weight + l_line_and_container_weight(k);
1066               l_current_ids(l_current_ids.COUNT+1) := l_line_and_container_id(k);
1067 
1068             ELSE
1069               --if no more can be added to the new delivery, create the delivery based on the list l_current_ids
1070 
1071               l_temp_ids.DELETE;
1072 
1073               IF l_debug_on THEN
1074                 WSH_DEBUG_SV.logmsg(l_module_name,
1075                        'Calling program unit WSH_DELIVERY_DETAILS_GRP.AUTOCREATE_DELIVERIES',
1076                         WSH_DEBUG_SV.C_PROC_LEVEL);
1077               END IF;
1078 
1079               WSH_DELIVERY_DETAILS_GRP.autocreate_deliveries(
1080                         	p_api_version_number   =>  1.0,
1081                         	p_init_msg_list        =>  FND_API.G_FALSE,
1082                         	p_commit               =>  FND_API.G_FALSE,
1083 				p_caller               =>  l_action_prms.caller,
1084                         	x_return_status        =>  l_return_status ,
1085                         	x_msg_count            =>  l_msg_count,
1086                         	x_msg_data             =>  l_msg_data,
1087                         	p_line_rows            =>  l_current_ids,
1088                         	p_group_by_header_flag =>  'N',
1089                         	x_del_rows             =>  l_temp_ids);
1090 
1091               IF l_debug_on THEN
1092                 WSH_DEBUG_SV.logmsg(l_module_name, 'return status from WSH_DELIVERY_DETAILS_GRP.AUTOCREATE_DELIVERIES: ' || l_return_status);
1093               END IF;
1094 
1095               IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
1096 
1097                 ROLLBACK TO delivery_record;
1098 
1099                 l_num_error := l_num_error+1;
1100                 --reject failed delivery
1101                 IF l_debug_on THEN
1102                   wsh_debug_sv.logmsg(l_module_name, 'Error during autocreate delivery');
1103                 END IF;
1104 
1105                 IF l_debug_on THEN
1106                   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit log_del_splitter_exception',WSH_DEBUG_SV.C_PROC_LEVEL);
1107                 END IF;
1108 
1109                 log_del_splitter_exception
1110                         (p_delivery_rec	        => p_delivery_tab(i),
1111                          p_content_weight       => l_content_weight,
1112                          p_weight_limit		=> l_parameter_info.MAX_GROSS_WEIGHT,
1113                          p_exception_name       => 'WSH_OTM_DEL_SPLIT_FAIL',
1114                          x_return_status	=> l_return_status);
1115 
1116                 IF l_debug_on THEN
1117                   WSH_DEBUG_SV.logmsg(l_module_name, 'return status from log_del_splitter_exception: ' || l_return_status);
1118                 END IF;
1119 
1120                 x_rejected_del_id.EXTEND;
1121                 x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
1122                 GOTO loop_end;
1123 
1124               ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
1125                 l_num_warn := l_num_warn+1;
1126               END IF;
1127 
1128               z := l_temp_ids.FIRST;
1129 
1130               WHILE z IS NOT NULL LOOP
1131 
1132                 l_new_delivery_name :=  WSH_NEW_DELIVERIES_PVT.get_name(l_temp_ids(z));  --newly created delivery
1133 
1134                 --logging tms exception for the new delivery
1135                 IF l_debug_on THEN
1136                   WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit log_del_splitter_exception',WSH_DEBUG_SV.C_PROC_LEVEL);
1137                 END IF;
1138 
1139                 log_del_splitter_exception
1140                      (p_delivery_rec		=> p_delivery_tab(i),
1141                       p_content_weight          => NULL,
1142                       p_weight_limit		=> NULL,
1143                       p_new_delivery_name	=> l_new_delivery_name,
1144                       p_new_delivery_id         => l_temp_ids(z),
1145                       p_exception_name          => 'WSH_OTM_DEL_SPLIT_CHILD',
1146                       x_return_status		=> l_return_status);
1147 
1148                 IF l_debug_on THEN
1149                   WSH_DEBUG_SV.logmsg(l_module_name, 'return status from log_del_splitter_exception: ' || l_return_status);
1150                 END IF;
1151 
1152                 IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
1153 
1154                   ROLLBACK TO delivery_record;
1155                   IF l_debug_on THEN
1156                     wsh_debug_sv.logmsg(l_module_name, 'Error during log delivery exception');
1157                   END IF;
1158 
1159                   l_num_error := l_num_error+1;
1160                   x_rejected_del_id.EXTEND;
1161                   x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
1162                   GOTO loop_end;
1163                 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
1164                   l_num_warn := l_num_warn+1;
1165                 END IF;
1166 
1167                 l_curr_del_split_list(l_curr_del_split_list.COUNT+1) := l_temp_ids(z);
1168                 l_curr_del_split_name(l_curr_del_split_name.COUNT+1) := l_new_delivery_name;
1169 
1170                 z := l_temp_ids.NEXT(z);
1171 
1172               END LOOP;  --l_temp_ids
1173 
1174               l_new_weight := l_line_and_container_weight(k);
1175               l_current_ids.DELETE;
1176               l_current_ids(l_current_ids.COUNT+1) := l_line_and_container_id(k);
1177 
1178             END IF;
1179             k:= l_line_and_container_id.NEXT(k);
1180 
1181           END LOOP; -- FOR k in j..l_line_and_container_id.last
1182 
1183           --create the last delivery after all the list gone over and new deliveries created, at least 1 more
1184           --line/LPN should be left under the limit.
1185           l_temp_ids.DELETE;
1186 
1187           IF l_debug_on THEN
1188             WSH_DEBUG_SV.logmsg(l_module_name,
1189                   'Calling program unit WSH_DELIVERY_DETAILS_GRP.AUTOCREATE_DELIVERIES',
1190                   WSH_DEBUG_SV.C_PROC_LEVEL);
1191           END IF;
1192 
1193           WSH_DELIVERY_DETAILS_GRP.autocreate_deliveries(
1194 	                          p_api_version_number   =>  1.0,
1195         	                  p_init_msg_list        =>  FND_API.G_FALSE,
1196                 	          p_commit               =>  FND_API.G_FALSE,
1197 				  p_caller               =>  l_action_prms.caller,
1198 	                          x_return_status        =>  l_return_status ,
1199         	                  x_msg_count            =>  l_msg_count,
1200                 	          x_msg_data             =>  l_msg_data,
1201                         	  p_line_rows            =>  l_current_ids,
1202 	                          p_group_by_header_flag =>  'N',
1203         	                  x_del_rows             =>  l_temp_ids);
1204 
1205           IF l_debug_on THEN
1206             WSH_DEBUG_SV.logmsg(l_module_name, 'return status from WSH_DELIVERY_DETAILS_GRP.AUTOCREATE_DELIVERIES: ' || l_return_status);
1207           END IF;
1208 
1209           IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
1210 
1211             ROLLBACK TO delivery_record;
1212 
1213             l_num_error := l_num_error+1;
1214 
1215             --reject failed delivery
1216             IF l_debug_on THEN
1217               wsh_debug_sv.logmsg(l_module_name, 'Error during autocreate delivery');
1218             END IF;
1219 
1220             IF l_debug_on THEN
1221               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit log_del_splitter_exception',WSH_DEBUG_SV.C_PROC_LEVEL);
1222             END IF;
1223 
1224             log_del_splitter_exception
1225                   (p_delivery_rec	        => p_delivery_tab(i),
1226                    p_content_weight	        => l_content_weight,
1227                    p_weight_limit		=> l_parameter_info.MAX_GROSS_WEIGHT,
1228                    p_exception_name	        => 'WSH_OTM_DEL_SPLIT_FAIL',
1229                    x_return_status		=> l_return_status);
1230 
1231             IF l_debug_on THEN
1232               WSH_DEBUG_SV.logmsg(l_module_name, 'return status from log_del_splitter_exception: ' || l_return_status);
1233             END IF;
1234 
1235             x_rejected_del_id.EXTEND;
1236             x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
1237             GOTO loop_end;
1238 
1239           ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
1240             l_num_warn := l_num_warn+1;
1241           END IF;
1242 
1243           z := l_temp_ids.FIRST;
1244 
1245           WHILE z IS NOT NULL LOOP
1246 
1247             l_new_delivery_name :=  WSH_NEW_DELIVERIES_PVT.get_name(l_temp_ids(z));  --newly created delivery
1248 
1249             --log tms exceptions for the new delivery
1250             IF l_debug_on THEN
1251               WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit log_del_splitter_exception',WSH_DEBUG_SV.C_PROC_LEVEL);
1252             END IF;
1253 
1254             log_del_splitter_exception
1255                      (p_delivery_rec		=> p_delivery_tab(i),
1256                       p_content_weight          => NULL,
1257                       p_weight_limit		=> NULL,
1258                       p_new_delivery_name	=> l_new_delivery_name,
1259                       p_new_delivery_id         => l_temp_ids(z),
1260                       p_exception_name          => 'WSH_OTM_DEL_SPLIT_CHILD',
1261                       x_return_status		=> l_return_status);
1262 
1263             IF l_debug_on THEN
1264               WSH_DEBUG_SV.logmsg(l_module_name, 'return status from log_del_splitter_exception: ' || l_return_status);
1265             END IF;
1266 
1267             IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
1268 
1269               ROLLBACK TO delivery_record;
1270 
1271               IF l_debug_on THEN
1272                 wsh_debug_sv.logmsg(l_module_name, 'Error during log delivery exception');
1273               END IF;
1274 
1275               l_num_error := l_num_error+1;
1276               x_rejected_del_id.EXTEND;
1277               x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
1278               GOTO loop_end;
1279             ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
1280               l_num_warn := l_num_warn+1;
1281             END IF;
1282 
1283             l_curr_del_split_list(l_curr_del_split_list.COUNT+1) := l_temp_ids(z);
1284             l_curr_del_split_name(l_curr_del_split_name.COUNT+1) := l_new_delivery_name;
1285 
1286             z := l_temp_ids.NEXT(z);
1287 
1288           END LOOP;  --l_temp_ids
1289 
1290           l_count := l_curr_del_split_list.COUNT;
1291 
1292           IF l_debug_on THEN
1293             WSH_DEBUG_SV.logmsg(l_module_name,
1294                   l_curr_del_split_name(1) || ' is split into '
1295                   || l_count || ' deliveries.');
1296 
1297             z := l_curr_del_split_list.FIRST;
1298 
1299             WHILE z IS NOT NULL LOOP
1300 
1301               WSH_DEBUG_SV.log(l_module_name, 'Delivery ' || z, l_curr_del_split_list(z));
1302               WSH_DEBUG_SV.log(l_module_name, 'Delivery Name ' || z, l_curr_del_split_name(z));
1303               z:= l_curr_del_split_list.NEXT(z);
1304 
1305             END LOOP;
1306           END IF;
1307 
1308           --after the delivery is split, need to log exception on delivery to inform the user
1309           --generating exception message based on number of deliveries split.
1310           IF (l_count > 6) THEN
1311             l_exception_name := 'WSH_OTM_DEL_SPLIT_LARGE';
1312             FND_MESSAGE.SET_NAME('WSH', 'WSH_OTM_DELIVERY_SPLIT_LARGE');
1313           ELSE
1314             l_exception_name := 'WSH_OTM_DEL_SPLIT';
1315             FND_MESSAGE.SET_NAME('WSH', 'WSH_OTM_DELIVERY_SPLIT');
1316           END IF;
1317 
1318           FND_MESSAGE.SET_TOKEN('PARENT_DELIVERY_NAME', l_curr_del_split_name(1));
1319 
1320           --setting child delivery name 1-5 in the message
1321           FOR z IN 2..6 LOOP
1322             IF (l_count >= z) THEN
1323               FND_MESSAGE.SET_TOKEN('CHILD_DELIVERY_NAME' || to_char(z-1), l_curr_del_split_name(z));
1324             ELSE
1325               FND_MESSAGE.SET_TOKEN('CHILD_DELIVERY_NAME' || to_char(z-1), NULL);
1326             END IF;
1327           END LOOP;
1328 
1329           IF l_debug_on THEN
1330             WSH_DEBUG_SV.logmsg(l_module_name,'Calling program unit log_del_splitter_exception',WSH_DEBUG_SV.C_PROC_LEVEL);
1331           END IF;
1332 
1333           log_del_splitter_exception
1334                 (p_delivery_rec         => p_delivery_tab(i),
1335                  p_content_weight	=> NULL,
1336                  p_weight_limit         => NULL,
1337                  p_exception_message	=> FND_MESSAGE.get,
1338                  p_exception_name	=> l_exception_name,
1339                  x_return_status	=> l_return_status);
1340 
1341           IF l_debug_on THEN
1342             WSH_DEBUG_SV.logmsg(l_module_name, 'return status from log_del_splitter_exception: ' || l_return_status);
1343           END IF;
1344 
1345           IF (l_return_status IN (WSH_UTIL_CORE.G_RET_STS_ERROR, WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR)) THEN
1346 
1347             ROLLBACK TO delivery_record;
1348 
1349             --reject failed delivery
1350             IF l_debug_on THEN
1351               wsh_debug_sv.logmsg(l_module_name, 'Error during log delivery exception');
1352             END IF;
1353 
1354             l_num_error := l_num_error+1;
1355             x_rejected_del_id.EXTEND;
1356             x_rejected_del_id(x_rejected_del_id.COUNT) := p_delivery_tab(i).entity_id;
1357             GOTO loop_end;
1358           ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING) THEN
1359             l_num_warn := l_num_warn+1;
1360           END IF;
1361 
1362           z := l_curr_del_split_list.FIRST;
1363 
1364           WHILE z IS NOT NULL LOOP
1365 
1366             x_accepted_del_id.EXTEND;
1367             x_accepted_del_id(x_accepted_del_id.COUNT) := l_curr_del_split_list(z);
1368 
1369             z:= l_curr_del_split_list.NEXT(z);
1370 
1371           END LOOP;
1372 
1373           l_curr_del_split_list.DELETE;
1374           l_curr_del_split_name.DELETE;
1375           l_current_ids.DELETE;  --remove current autocreate ids
1376 
1377           EXIT; --end current delivery loop;
1378 
1379         END IF;
1380         j:= l_line_and_container_id.NEXT(j);
1381 
1382       END LOOP; --FOR j
1383       COMMIT;  --release lock
1384       i:= p_delivery_tab.NEXT(i);
1385       GOTO next;
1386 
1387       <<loop_end>>
1388       i:= p_delivery_tab.NEXT(i);
1389 
1390       <<next>>
1391       NULL;
1392     END LOOP;
1393 
1394     IF (l_num_error > 0 AND l_num_error = p_delivery_tab.COUNT) THEN
1395       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1396     ELSIF (l_num_error > 0 OR l_num_warn > 0) THEN
1397       x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
1398     ELSE
1399       x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1400     END IF;
1401     --
1402     -- Debug Statements
1403     --
1404     IF l_debug_on THEN
1405       WSH_DEBUG_SV.log(l_module_name, 'l_num_error', l_num_error);
1406       WSH_DEBUG_SV.log(l_module_name, 'l_num_warn', l_num_warn);
1407       WSH_DEBUG_SV.log(l_module_name, 'x_return_status', x_return_status);
1408       WSH_DEBUG_SV.pop(l_module_name);
1409     END IF;
1410     --
1411   EXCEPTION
1412     --
1413     WHEN FND_API.G_EXC_ERROR THEN
1414 
1415       ROLLBACK TO delivery_record;
1416       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1417       --
1418       IF (c_get_delivery_line_and_cont%ISOPEN) THEN
1419 	CLOSE c_get_delivery_line_and_cont;
1420       END IF;
1421       --
1422       IF (c_is_delivery_assigned%ISOPEN) THEN
1423 	CLOSE c_is_delivery_assigned;
1424       END IF;
1425       --
1426       IF c_get_delivery_line%ISOPEN THEN
1427         CLOSE c_get_delivery_line;
1428       END IF;
1429       --
1430       IF l_debug_on THEN
1431         WSH_DEBUG_SV.logmsg(l_module_name,
1432 			    'FND_API.G_EXC_ERROR exception has occured ',
1433 			    WSH_DEBUG_SV.C_EXCEP_LEVEL);
1434         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:FND_API.G_EXC_ERROR');
1435       END IF;
1436       --
1437     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1438             --
1439       ROLLBACK TO delivery_record;
1440       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
1441       --
1442       IF (c_get_delivery_line_and_cont%ISOPEN) THEN
1443 	CLOSE c_get_delivery_line_and_cont;
1444       END IF;
1445       --
1446       IF (c_is_delivery_assigned%ISOPEN) THEN
1447 	CLOSE c_is_delivery_assigned;
1448       END IF;
1449       --
1450       IF c_get_delivery_line%ISOPEN THEN
1451         CLOSE c_get_delivery_line;
1452       END IF;
1453       --
1454       IF l_debug_on THEN
1455         WSH_DEBUG_SV.logmsg(l_module_name,
1456 			    'Unexpected error has occured. Oracle error message is '||
1457 			    SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
1458         WSH_DEBUG_SV.pop(l_module_name,
1459 			 'EXCEPTION:FND_API.G_EXC_UNEXPECTED_ERROR');
1460       END IF;
1461       --
1462 
1463     WHEN NO_DATA_FOUND THEN
1464 
1465       ROLLBACK TO delivery_record;
1466       FND_MESSAGE.Set_Name('WSH','WSH_DEL_NOT_FOUND');
1467       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1468       --
1469       IF (c_get_delivery_line_and_cont%ISOPEN) THEN
1470 	CLOSE c_get_delivery_line_and_cont;
1471       END IF;
1472       --
1473       IF (c_is_delivery_assigned%ISOPEN) THEN
1474 	CLOSE c_is_delivery_assigned;
1475       END IF;
1476       --
1477       IF c_get_delivery_line%ISOPEN THEN
1478         CLOSE c_get_delivery_line;
1479       END IF;
1480       --
1481       WSH_UTIL_CORE.ADD_MESSAGE(x_return_status,l_module_name);
1482       --
1483       IF l_debug_on THEN
1484         WSH_DEBUG_SV.logmsg(l_module_name,
1485 			'NO_DATA_FOUND exception has occured.',
1486 			WSH_DEBUG_SV.C_EXCEP_LEVEL);
1487         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:NO_DATA_FOUND');
1488       END IF;
1489       --
1490 
1491     WHEN OTHERS THEN
1492 
1493       ROLLBACK TO delivery_record;
1494       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1495       --
1496       IF (c_get_delivery_line_and_cont%ISOPEN) THEN
1497 	CLOSE c_get_delivery_line_and_cont;
1498       END IF;
1499       --
1500       IF (c_is_delivery_assigned%ISOPEN) THEN
1501 	CLOSE c_is_delivery_assigned;
1502       END IF;
1503       --
1504       IF c_get_delivery_line%ISOPEN THEN
1505         CLOSE c_get_delivery_line;
1506       END IF;
1507       --
1508       WSH_UTIL_CORE.DEFAULT_HANDLER(
1509 		'WSH_DELIVERY_SPLITTER_PKG.DELIVERY_SPLITTER', l_module_name);
1510       IF l_debug_on THEN
1511         WSH_DEBUG_SV.logmsg(l_module_name,
1512 		'Unexpected error has occured. Oracle error message is '||
1513 		SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
1514         WSH_DEBUG_SV.pop(l_module_name,'EXCEPTION:OTHERS');
1515       END IF;
1516 
1517   END DELIVERY_SPLITTER;
1518 
1519 
1520 END WSH_DELIVERY_SPLITTER_PKG;